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컨브넷이 적어도 동일한 성능을 내면서 비용도 적을것. 텍스트 데이터가 종종 이에 해당됨. 문장 처음에 있는 키워드가 마지막에 있는 키워드와 같은 의미를 가짐