Recurrent Neural Network
RNN은 이미지나 벡터를 하나의 결과 (Classification이라면 Class)로 내놓던 기존의 Vanila NN에 비해 다양한 입출력을 다룰 수 있게 해준다.
입력과 출력을 가변적으로 다룰 수 있게 해준다.
•
One to many
Image Captioning등에 사용
•
many to one
Sentiment Classification
•
many to many (가변 입력 가변 출력)
Machine Translation
•
many to many (가변 입력 고정 출력)
Video classification on frame level
RNN의 학습 과정
RNN에는 Hidden State라는 값이 있어서 Input을 받을 때마다 값을 저장함.
1.
값이 입력되면
2.
Hidden State를 업데이트하고
3.
값을 출력함
이를 수식으로 나타내면, (는 Hidden State, 는 입력 변수) 와 같다.
는 매 Step에서 동일하다!
RNN의 출력값은 를 입력으로 받는 FC Layer가 있어야 함.
Vanila Recurrent Neural Network
→ ,
Many to Many Network
Many to One
One to Many Network
Sequence to Sequence Network
Many to one과 One to many 를 합친 형태
Backpropagation Through Time
Sequence가 엄청나게 크다면 학습이 엄청나게 느리고 메모리를 엄청나게 잡아먹을 것임.
Truncated Backpropagation Through Time
위와 같은 방법을 해결하기 위해서 사용하는 방법.
Train Time에 스텝을 일정 단위로 자른다. 자른 스텝만 Loss를 구하고 Backpropagation한다.
다음 Batch에서는 이전에 만들어두었던 Loss를 그대로 갖고오고 Backpropagate만 한다.
이를 계속 반복한다.
Multi Layer RNN
특정 layer의 hidden state를 다시 RNN의 input으로 사용하여 RNN을 쌓을 수 있음. 여러 층을 쌓으면 성능이 좋아지기 때문에 이렇게 사용하고 2~4개의 층을 주로 사용함.
Gradient Flow
Vanila RNN Gradient Flow
이고, 이를 backprop 하면 Transposed Weight Matrix의 일부를 곱하게 된다.
이를 다시 생각해보면, 의 gradient를 구하기 위해서 너무나도 많은 Weight matrix가 필요하다. Weight matrix를 계속 곱하게 될때, 값(Singular Value)들이 1보다 큰 값이면 곱하면 곱할수록 엄청나게 커질것이고, 1보다 작은 값이면 곱하면 곱할수록 0에 수렴할 것이다.
Gradient Clipping
Gradient의 L2 Norm이 지나치게 큰 경우 Gradient를 조정해줌. (Exploding Problem 해결)
하지만 Vanishing Problem은 해결하지 못한다.
LSTM: Long Short Term Memory (LSTM)
( : Input Gate, 에 대한 가중치 / : Forget Gate, 이전 정보를 얼마나 까먹을지 / : Output Gate, 를 얼마나 드러내 보일지 / : Gate Gate, Input Cell을 얼마나 입력받을지)
LSTM에는 두개의 Hidden State가 있다. 기존 RNN에 있던 와 LSTM내부에만 존재하는 변수인 Cell State가 존재한다.
1.
와 를 입력으로 받는다.
2.
4개의 Gate를 계산하기 위해 weight matrix를 곱해준다.
3.
Gate를 바탕으로 와 를 계산한다.
LSTM을 Backpropagate하면
Cell State는 Upstream Gradient에 Forget Gate를 Elementwise로 곱한것이다.
일반 LSTM에 비해서 Gradient를 계산함에 있어 여러가지 문제들(Explode, Vanishing)을 해결할 수 있다.
이해한 것만 적었는데 사실 이 렉쳐는 이해를 잘 못했다 ㅠㅠ 나중에 다시 들으면서 재정리해야지