- 출처
- 되도록이면 책의 내용과 코드를 그대로 옮기기 보다는 요약과 보충설명!
읽기전에
개념 정리
padding='causal'
: 시계열에서는, 또는 인과적인 추론을 할 때는!! 뒷부분을 학습하면 안되니까..!
15장. RNN과 CNN을 사용해 시퀀스 처리하기
1. 순환 뉴런과 순환 층
- feedforward 신경망 vs 순환 신경망
: 입력층 -> 출력층 한 방향으로만 흐름 vs 순환
- 하나의 샘플에 대한 순환층의 출력
: 활성화 함수 * (x의 가중치 * t타임의 입력x + y의가중치 * t-1타임의 출력y + 편향)
1) 메모리 셀
- t 타임의 출력에는 t-1 타임 까지의 모든 입력에 대한 함수가 포함됨 = 즉 일종의 메모리
- 타임 t-1에서 t로 넘어가는(즉 t-1의 출력이 t로 입력되는) 부분에는 메모리 셀 h가 존재
2) 입력과 출력 시퀀스
sequence-to-sequence network
: 입력 -> 출력
sequence-to-vector network
: 입력 -> 마지막만 출력
vector-to-sequence network
: 첫번째만 입력 -> 출력
encoder-decoder 모델
: encoder(sequence-to-vector network) 뒤에 decoder(vector-to-sequence network) 연결
2. RNN 훈련하기
- 역전파를 이용 = BPTT(Backpropagation through time)
- 절차
1 정방향 패스가 펼쳐진 네트워크를 통과
2 비용함수를 사용하여 출력 시퀀스 평가
3 비용 함수의 gradient가 펼쳐진 네트워크를 따라 역방향으로 전파
4 모델 파라미터 업데이트
3. 시계열 예측하기
- 시계열로 예측(forecasting)과 값 대체(imputation)
- 시계열의 입력 특성: [배치 크기, 타임 스텝 수, 차원 수]
기준 성능
- 각 시계열의 마지막 값을 그대로 예측하기 -> ?? 질문
간단한 RNN 구현하기
- 순환 신경망은 입력 시퀀스의 길이 지정이 불필요 <- 타임 스텝의 길이 제한이 없음
* 트렌드와 계절성
- 트렌드와 계절성을 삭제한 후 마지막에 더해준다
심층 RNN
: 셀을 여러 층으로 쌓음
SimpleRNN
주의할 점
- 모든 순환 층에서
return_sequences=True
로 설정해야함
: 타임 스텝마다 출력을 반환
: 그래야 그 다음 순환층이 3D 형태로 시퀀스를 받음
acivation
을 다른 활성화 함수로 지정할 수는 있지만(기본은 tanh), 잘 동작하지 않음
-> 그래서 출력층을 Dense
로 사용하는 경우가 많음
여러 타임 스텝 앞을 예측하기
- 바로 다음 값 예측 -> 다시 입력으로 -> 다시 예측..반복
- RNN 훈련하여 한꺼번에 여러 타임 예측하기
- 개선: 시퀀스-투-시퀀스로, 각 타임스텝마다 최종 예측값의 개수를 예측하도록 하자.
return_sequences=True
로 설정
TimeDistributed
layer
4. 긴 시퀀스 다루기
- 문제점: 기울기 소실과 폭주, 긴 훈련시간, 불안정한 훈련, long-term dependency 문제
불안정한 그레이디언트 문제와 싸우기
- DNN(심층 신경망)에서 사용한 좋은 가중치 초기화, 빠른 옵티마이저, 드롭아웃 등 사용하기
- 수렴하지 않는 활성화 함수(ex. ReLU)는 오히려 RNN을 불안정하게 만든다
- 이유: 활성화 함수가 수렴하지 않을 경우 경사 하강법이 폭주할 경우를 막지 못한다.
- 배치 정규화(BatchNormalization)는 효과가 미미하다.
- 순환층 안보다 순환층 사이에 적용했을 때 쪼금 낫긴 하지만..그다지?
- 대신 층 정규화(layer normalization) 사용하기
: 배치 차원이 아닌 특성 차원에 대해 정규화
단기 기억 문제 해결하기
LSTM(Long Short-Term Memory) 셀
- forget gate(필요없는건 버리고), input gate(중요한 입력을 인식), output gate
: 잊을건 잊고, 기억할건 기억하자
- RNN의 hidden state에 cell state를 추가
핍홀 연결
: LSTM의 변종
- 이전 장기 기억 상태가 forget gate와 input gate의 제어기에 입력으로 추가됨
- 현재의 장기 기억 상태는 output gate의 제어기에 입력으로 추가됨
GRU(Gated Recurrent Unit) 셀
: LSTM의 간소화 버전
- 두 상태 벡터 -> 한개로 합쳐짐
- 하나의 게이트 제어기가 forget과 input gate를 모두 제어
- output gate가 없음
1D 합성곱 층(CNN)을 사용해 시퀀스 처리하기
-> 이해가 잘 안됨 ㅠ
WAVENET
- 층마다 (각 뉴런의 입력이 떨어져 있는 간격인) 팽창 비율(dilation rate)를 두배로 늘리는 1D 합성곱(CNN) 층을 쌓음
- 층이 높아질수록 보는 타임 스텝의 개수를 늘려가면서 하위 층은 단기 패턴을, 상위 층은 장기 패턴을 학습
-> 뒷부분은 잘 이해 못함 ㅠ 다시보자
궁금증
-
606쪽. 기준 성능의 가장 간단한 예시로 각 시계열의 마지막 값을 그대로 예측하기를 들었는데, 일종의 validation 처럼 쓴다는 걸까요?
:
-
607쪽. 트렌드와 계절성을 삭제한 후 마지막에 더해준다의 의미는 무엇인가요?
-
609쪽. 4번째 줄 "이 RNN은 한 타임 스텝에서 다음 타임 스텝으로 필요한 모든 정보를 나르기 위해 다른 순환 층의 은닉 상태를 주로 사용" 문장에서 '다른 순환 층의 은닉 상태'란 타임 스텝간의 메모리 셀을 의미하는걸까요?
: 맞음
-
612쪽. TimeDistributed
layer의 작동과정이 잘 이해되지 않습니다.
4-2. 그냥 역전파랑 뭐가 다른거지??⭐
- 615쪽. 층 정규화와 배치 정규화의 차이점을 설명하고 있습니다. 배치 정규화는 훈련과 테스트 셋에서 동일한 방식으로 작동하지 않는건가요? 그렇다면 어떤 문제가 생기는걸까요?
- 배치 정규화든 층 정규화든 훈련과 테스트셋에서 동일하게 작동. 다만 층 정규화는 독립적으로 샘플의 타임스텝마다 통계 계산이 가능, 배치 정규화는 배치 사이즈마다 정규화.
- 층 정규화는 '특성' 차원에 대해 정규화하니까..좋은데...?
- RNN에 배치 정규화를 사용하는 것은 어려움. 왜냐면, RNN은 각 시점(time step)마다 다른 통계치를 가집니다.
https://daje0601.tistory.com/306
-
622쪽. '1D 합성곱 층(CNN)을 사용해 시퀀스 처리하기' 이해하기.
-
624쪽. 'WAVENET' 이해하기.