RNN & LSTM
RNN
일반적인 neural network는 위 그림 맨 왼쪽처럼 input이 있고 그에 따른 hidden layer, output이 있어서
one to one 관계로 표시될 수 있다.
맨 왼쪽을 제외한 나머지를 RNN의 형태라고 볼 수 있는데
one to many : Image captioning , 즉 이미지를 설명하기 위한 단어의 조합을 만들어낸다거나.
many to one : Sentiment Classification, 단어들의 시퀀스로 어떤 하나의 class로 표현되는 감정의 상태를 표현한다든가.
many to many : Machine Translation, 번역, 한국어로 된 단어를 영어로 번역한다든가.
many to many : Video classification on frame level, 비디오에서 프레임은 현재 프레임 뿐만 아니라, 지나간 프레임에 대한 함수로 만들어진다.
one to one 도 RNN을 이용해 분석할 수가 있는데 그 예로,
어떤 숫자 이미지를 sequential 하게 CNN등으로 분석을하는 것,
또는 위와 같이 어떤 fixed outputs을 sequential하게 처리하여 분석하는 것을 볼 수 있다. (위의 그림은 사실 동영상인데 뒤에서부터 숫자가 그려짐.)
RNN을 수식으로 표현해보자.
RNN은 매 타임마다 어떤 특정한 state를 가지는데, state와 input vector x의 함수로 나타낼 수가 있다.
Notice : 매 time step 마다 동일한 function 동일한 parameter 가 사용되어야함.
참고) “Vanilla” refers to the name given to the standard backpropagation algorithm.
위의 state function을 이용하여 single hidden vector h 를 가지는 vanilla RNN의 formula를 살펴보면,
h_t 는 위와 같이 표현된다. W_hh는 hidden -> hidden으로 가는 Weight vector를 의미하고 W_xh는 x에서 h로 가는 vector를 의미. 즉, 현재의 state는 현재의 상태와 이전 상태값으로 표현됨을 알 수있다.
따라서, y_t = W_hy * h_t 의 형태로 표현된다.
왜 tanh (하이퍼볼릭 탄젠트)를 쓸까?
Sigmoid와 비교하여 tanh와는 출력 범위가 더 넓고 경사면이 큰 범위가 더 크기 때문에 더 빠르게 수렴하여 학습하는 특성이 있어서 사용함.
RNN 예시
위는 다음에 나올 알파벳을 예측하는 모델을 만드는 것인데, 예로 “hello”라는 단어를 학습시킨 것이다.
들어가는 단어는 총 4개이므로 input을 one hot encoding해서 위와 같이 표현하였다.
hidden layer는 초기에 일반적으로 “0”으로 초기화 하고,
output layer에서는 character가 4개니까 4개 4*1 행렬로 표현하였고, 여기에 softmax classfier를 돌려서 결과값을 예측한다.
예측한 결과 값과 target char를 최소화 하는 방향으로 학습이 진행되는데
cost function으로 cross-entropy cost function이 사용된다.
LSTM
LSTM은 RNN에서 보던 초록색 네모(hidden layer)아래 노란색 네모가 겹쳐 보이는데, 이것을 cell state라고 부른다. 이것이 RNN과의 차이이다. 그래서 LSTM은 hidden layer에 cell state vector와 hidden state vector가 동시에 존재한다.
각각의 cell에는 gate라는게 있는데,
i : input gate,
f : forget gate
o : output gate
g : cell state에 input을 얼마나 더 더해줄거냐, (g는 tanh 므로 [-1,1])
그래서 c_t의 수식에서
$$
ct^l = f \odot c{t-1}^l + i \odot g
$$
앞의 term은 이전 cell을 얼마나 잊어버릴것이냐, f가 0이면 다 잊고 f가 1이면 다 기억,
뒤의 term은 g가 tanh고, 이것은 -1에서 1사이 값을 가기 때문에, input에 대해 얼마나 더 더해줄것이냐를 결정
그리고 h_t의 수식은 아래와 같은데,
$$
h_t^l = o \odot tanh(c_t^l)
$$
현재의 cell state에서 output vector를 곱해서 hidden state를 얼마로 할것인것인가를 결정.
다시 한번 살펴보면 cell state가 계속 다음 에도 영향을 주게 되고,
hidden state vector값은 higher layer로 가거나 최종단계인 prediction으로 가게됨.
RNN과 LSTM을 많이 비교하는데,
RNN을 실전에서 많이 안쓰는 이유가 y 값이 팍팍 변하기 때문이다. - hidden state vector가 매 time step 마다 변하기때문에
LSTM은 hidden state외에 cell state를 가지고 있고, 이것이 끝까지 흘러가는 형태 이기 때문에, 변화가 점진적이다.
ResNet에 는 위와같이 skip connection을 하는 부분이 있는데 LSTM도 같은 기능을 하는 forget gate라는 term이 있다.
위의 Whh가 반복해서 곱해지기 때문에 vanishing gradient 문제가 생길수 있는데
그래서 일반적으로 이것을 해결하기 위해서는 LSTM을 사용한다. (eigenvalue < 1)
(Whh가 반복적으로 곱해져서 발산할수도 있는데 이럴땐 gradient clipping이라는 방법을 쓴다.)
Gradient Clipping (그래디언트 클리핑)
다양한 방법이 존재하지만 흔히 쓰이는 방법은 gradient의 L2 norm이 기준값을 초과할 때 (threshold / L2 norm)을 곱해주는 것입니다.
norm에 관한 설명
LSTM은 위의 + 연산때문에 gradient를 그대로 전달하기 때문에 vanishing gradient 문제가 없다.