JJJJust me

1. 드롭아웃 등 과대적합을 줄이는 기본 단계 

2. 과대적합 일어날때까지 네트워크 용량 늘리기

 

과대적합이 나오지 않으면 층을 더 늘려도 된다. 하지만 계산비용이 추가돼

층을 늘려도 효과가 나지 않으면 더이상 네트워크의 용량을 늘리는게 도움이 되지 않는다고 볼수있어!

 

return_sequences = True : 케라스에서 순환층을 차례대로 쌓으려면 모든 중간층은 마지막 타임스텝 출력만 아니고 전체 시퀀스(3D 텐서)를 출력해야돼. 

 

<양방향 RNN >

-자연어 처리할때 주로 사용(언어를 이해하는데 단어의 순서가 중요하지만 결정적이지 않다는 가정을 뒷받침한다) 

-GRU와 LSTM 같은 RNN 2개사용

-해야할일은 입력 시퀀스를 시간차원을 따라 거꾸로 생성하는 데이터 제너레이터를 만드는 것!

-케라스에서는 Bidirectional층을 사용

 

<온도 예측 문제>

-스태킹한(쌓은) 순환층 유닛수 조정

-RMSprop 옵티마이저

-GRU대신 LSTM층을 사용 (why??)

-순환층위에 용량이 큰 완전 연결회 회귀층을 사용. 유닛수가 많은 Dense층이나 Dense층을 스태킹한다. (???)

-최선의 모델을 테스트 세트에서 확인해야 한다. 검증 세트에 과대적합된 네트워크 구조를 만들게 된다(???)

 

순환 네트워크에 드롭아웃을 사용하려면? dropout, recurrent_dropout 매개변수 사용하면 돼

스캐닝 RNN : 기계 번역같은 복잡한 문제에서 도움이 되지만 작고 간단한 문제에서는 항상 그렇지 않아

---------------------------------------------------------------------------------------------------------------------

<합성곱 신경망(컨브넷)>

- 1D (시간, 특정 자연어 처리에 유용) : 2D와 비슷. Conv1D와 Maxpooling1D층을 쌓고 전역풀링층이나 Flatten층으로 마무리.

장점 : 빠르고 비용이 경제적이야.

-2D (시각 패턴에 유용)

-전역풀링층

GlobalAveragePooling1D (samples, features) 크기의 텐서를 출력. 즉, 시간축 전체에 풀링을 적용

GlobalAveragePooling2D (samples, channels) 크기의 텐서를 출력. 즉, 공간 차원 전체에 대한 풀링

* 풀링 : 입력의 길이를 줄이기 위해서 사용(서브샘플링)

 

************꿀팁*************

-1D 컨브넷(전처리 단계)과 RNN(순서 감지 능력) 결합하기 : 긴 시퀀스를 처리하기에 유용하면서 경제적이야

 

<요약>

1. 텍스트 토큰화

2. 단어 임베딩

3. 순환 네트워크

4. 강력한 시퀀스 : RNN층 스태킹, 양방향 RNN

5. 시퀀스 처리를 위한 1D 컨브넷 사용

6. 긴 시퀀스 처리를 위한 1D 컨브넷과 RNN 결합

7. 시계열 데이터를 사용한 회귀(미래 예측), 시계열 분류, 시계열 이상치 감지, 시퀀스 레이블링(문장에서 이름이나 날짜 식별하기 등)에 RNN 사용 가능

8. 기계 번역(시퀀스 투 시퀀스 합성곱 모델), 문서 분류, 맞춤법 정정 등에 1D 컨브넷 사용 가능

9. 시퀀스 데이터에서 전반적인 순서가 중요하다면 순환 네트워크 즉, 최근의 정보가 오래된 과거보다 더 중요

10, 전반적 순서가 의미가 없다면 1D컨브넷이 적어도 동일한 성능을 내면서 비용도 적을것. 텍스트 데이터가 종종 이에 해당됨. 문장 처음에 있는 키워드가 마지막에 있는 키워드와 같은 의미를 가짐

 

 

이 글을 공유합시다

facebook twitter googleplus kakaoTalk kakaostory naver band