학교 공부/기계학습개론
20. RNN
경북대학교컴퓨터학부
2022. 12. 14. 20:54
📌 Time series data
- dynamic data
- 가변 길이
- sequential data
📌 Recurrent Neurons
- MLP, CNN : Feedforward NN
- RNN : backward connection
- RNN은 input을 받으면 output을 만들어내고, 그 output을 다시 넣는다
📌 Recurrent Neurons
- 시간 $t$일 때, recurrent neuron은 2개의 input을 받는다
- $x(t)$
- $y(t-1)$ : 이전 시간의 output
- $y(t)=\theta(W_x^t x(t)+W_y^T y(t-1) +b) $. theta는 activation function
- 노드는 1개이지만, 이해하기 위해서 펼쳐놓은 것
- input, output의 개수는 여러 개가 될 수 있다
- MLP와 비슷하게 입력층, 은닉층, 출력층을 가진다
- 순환 에지는 t-1 순간에 발생한 정보를 t 순간으로 전달하는 역할이다(시간에 따라 weight는 변하지 않고, 동일하게 곱해진다)
📌 Memory cells
- recurrent neuron은 output이 input으로 들어가야 하므로 저장하고 있어야 한다.
- 시간 단계에 걸쳐 일부 상태를 보존하는 recurrent NN의 일부를 memory cell이라고 한다
- short pattern에 대한 학습만 가능한 neuron이다
📌 Recurrent Neural Network types
- TL : Sequence-to-sequence
- 주식 시장 예측
- TR : Sequence-to-vector
- 문장을 읽고 뜻을 파악할 때 활용
- BL : Vector-to-sequence
- 사진의 캡션(주석)을 만들 때 활용
- BR : Encoder-Decoder
- 문장을 번역할 때 활용
📌 Training RNNs
- unroll RNN이 필요하다
- Backpropagation through time(BPTT)
- unrolled net에 대해 forward pass를 진행한다
- cost function C()를 사용하여 output sequence를 평가한다
- gradient를 backward로 전파한다(실선)
- update model parameter
- weight, bias는 time step 상관없이 동일하다!
- RNN은 input shape에서 길이를 지정할 필요가 없다(애초에 data가 가변적이므로)
📌 Deep RNNS
- layer도 쌓아서 성능을 좋게 만든 것
📌 Problem in handling LONG sequences
- gradient vanish(weight가 1보다 작을 때) 또는 gradient 폭발(weight가 1보다 클 때) RNN은 DMLP, CNN보다 더 심각하다. (긴 샘플이 자주 발생하고, 가중치 공유 때문에 같은 값을 계속 곱하기 때문이다)
- 결과적으로 sequence의 first input을 잊어버리게 된다
📌 Unstable gradients problem
- Non-saturating activation function -> saturating
- ReLU는 해결책이 되지 않는다. 왜냐하면 같은 weight가 계속해서 곱해지게 될텐데, 그렇게 되다보면 output은 explode하게 된다. 그래서 nonsaturating activation function을 사용하는 것은 도와주지 못한다
- hyperbolic tangent와 같은 saturating activation function을 사용하자
- Batch Normalization -> Layer Normalization
- 가로방향(batch) Normalization을 통해 조정해봤자 다시 들어오는 input은 평균과 표준편차가 다르다. 즉, batch normalization은 의미가 없다.
- 따라서 세로방향(layer) Normalization을 하여 Feature demension 중심으로 normalization을 진행하는 것이 효율적이다
📌 LSTM cells
- converge faster, long-term dependency 탐지 가능
- $h(t)$ : short-term state
- $c(t-1)$ : long-term state
- x gate : output이 0이면 close, 1이면 open
- $f_{(t)}$ (forget gate) : long-term state을 살릴지, 죽일지 결정
- $i_{(t}}$ (input gate) : $g_{(t)}$의 어떤 부분을 long-term state에 추가해야 할지 결정
- $o_{(t)}$ (output gate) : output을 살릴 것 ? 버릴 것?
📌 GRU cell
- LSTM Cell에서의 두 상태 벡터 $C_t$와 $h_t$가 하나의 벡터 로 합쳐졌다.
- 삭제 게이트와 입력 게이트가 리셋 게이트와 업데이트 게이트로 변화되었다.
- 하나의 gate controller인 $z_t$가 forget과 input 게이트(gate)를 모두 제어한다. $z_t$가 1을 출력하면 forget 게이트가 열리고 input 게이트가 닫히며, $z_t$가 0일 경우 반대로 forget 게이트가 닫히고 input 게이트가 열린다. 즉, 이전($t-1$)의 기억이 저장 될때 마다 타임 스텝 $t$의 입력은 삭제된다.
- GRU 셀은 output 게이트가 없어 전체 상태 벡터 $h_t$가 타임 스텝마다 출력되며, 이전 상태 $h_{t-1}$의 어느 부분이 출력될지 제어하는 새로운 gate controller인 $r_t$가 있다.