RNN (Recurrent Neural Networks)
- One to One : 기본 Neural Networks, 하나의 입력이 하나의 출력을 내보낸다.
- One to Many : 단일 입력, 가변 출력
Ex) Image Captioning – 하나의 image에 여러 가지 단어들
- Many to One : 가변 입력, 단일 출력
Ex) Sentiment classification – 많은 단어들로부터 감정을 추론
- Many to Many : 가변 입력, 가변 출력, 문맥을 학습
Ex) Machine Translation – 한글 문장을 입력으로 받아 영어문장으로 출력
- Many to Many : 가변 입력, 가변 출력, 프레임 별로 1대1 학습
Ex) Video classification on frames level - 비디오를 입력으로 받아서, 비디오에 나타나는 action을 분류
- 입력을 받는다.
- “hidden state”를 업데이트를 한다.
- 출력 값을 내보낸다.
> RNN block은 “재귀적인 관계”를 연산할 수 있도록 설계되어있다.
> 이전 “hidden state”와 “현재 입력”을 받아서 다음 hidden state를 출력한다.
> Old hidden state가 New hidden state에 영향을 끼친다. (sequential 데이터 용이)
> Y를 출력하기 위해서는 h_t와 W_hy를 곱해준다.
> x, h는 매번 다른 값을 사용하지만 동일한 가중치 W를 사용하는 모습을 보이고 있다.
> CNN의 경우 필터를 통과할 때마다 학습되어 구해지는 W는 다르지만. RNN은 동일한 가중치를 사용한다는 것을 잊지 말자.
> 전체 Loss는 각 단계에서 Loss가 발생한 Loss를 더한 값이다.
> 최종 hidden state가 전체 시퀀스의 내용에 대한 요약으로 볼 수 있다.
> input은 모델의 initial hidden state를 초기화시키는 용도로 사용
> 현재 문맥에서 다음 문맥을 예측하는 Language Model를 예를 들어보자
> Hello라는 input sequence를 4-D one hot vector형태로 표현해주었다. [h, e, l, o]
> 두 번째 output layer는 “L” 을 예측해야 되는데 그 다음 단어로 “o” 가 나올 것으로 잘못 예측하였다. (Loss가 매우 크다.) – 잘못된 값을 계속해서 학습할 가능성이 높다.
> Softmax 함수를 이용하여 output layer의 score를 확률분포로 사용한다. 확률분포로 나타낸 값을 sampling을 한다. ‘e’가 뽑힐 확률이 엄청 낮았음에도 운 좋게 ‘e’가 샘플링 되었다. (Test Time)
> 높은 값만을 뽑았다면 문장을 잘 만들지 못하였을 것이다. 그러나 확률 분포에서 sampling하는 방법을 사용하여 모델에서의 다양성을 얻을 수 있게 되었다. (Test Time)
- Truncated Backpropagation
> sequence가 아주 긴 경우에는 전체 출력 값들을 이용해서 backprop으로 loss을 구하기에는 어렵다.
> Train time에서 한 스텝을 일정 단위로 자른다. Sub – sequence의 loss를 계산 후 현재 Batch에서만 gradient update를 한다.
- Image captioning
> input을 image로 받는다.
> CNN을 통해 나온 Caption을 RNN의 인풋으로 사용한다. Caption마다 다양한 시퀀스를 가지고 있다.
> 기존의 CNN이였다면 flatten해서 softmax값을 도출해야 한다. 그러나 FC-4096를 flatten하지않고 RNN 인풋으로 사용한다.
> 이미지 정보(분홍색 가중치)가 추가된 hidden state를 update 시켜준다.
> Train시 caption의 종료시점에 <END> token을 삽입하여 Sequence의 끝을 알려준다. <END> token이 나오는 순간 더 이상 단어를 생성하지 않으며 이미지에 대한 caption이 완성이 된다.
> Unseen data에 대해서 굉장히 취약하다. Train data와 유사한 이미지를 던져주면 잘 동작한다.
> Caption을 생성할 때 이미지의 다양한 부분을 집중(attention)해서 본다.
> CNN으로 공간 정보를 가지고 있는 grid of vector를 만들어 낸다.
> 이미지의 위치에 대한 분포(a1)를 계산한 후에 vector 집합(LxD)과 연산하여 attention(z1)을 생성한다. Z1은 h1의 입력으로 들어가게 되고 Vocabulary의 단어들의 분포(d1)와 이미지 위치에 대한 분포(a2)을 생성한다. 추후 이 과정을 반복한다.
> caption을 만들 때 마다 이미지 내에 다양한 곳들에 attention을 주는 것으로 볼 수 있다.
- Visual Question Answering(VQA)
> 입력은 두 가지 - 이미지, 이미지에 관련된 질문
> RNN으로 이미지에 관련된 질문을 vector로 요약, CNN으로 이미지를 vector로 요약
> 두 vector들을 조합하여 질문에 대한 답을 한다. (조합 방법 : concat을 하여 FC-Layer의 입력으로 만든다.)
LSTM
> 기존 RNN은 gradient를 구할 때, 모든 RNN셀을 통과하기 때문에 같은 가중치 W가 계속 개입하게 된다.
> W값이 1보다 큰 경우는 Exploding gradients가 일어나게 되고 W값이 1보다 작은 경우는 Vanishing gradients가 일어나게 된다.
> Exploding gradients의 경우, gradient clipping을 사용하여 문제를 해결한다. (gradient의 L2 norm이 최대 임계 값을 넘지 못하도록 조절)
> Vanishing gradients의 경우, RNN 아키텍쳐 모델을 바꾸어 문제를 해결한다. (LSTM의 등장)
> RNN은 하나의 hidden state를 가지는 반면 LSTM은 두 개의 hidden state를 가진다. (h_t, c_t)
> LSTM은 4개의 gate를 가진다. Gate를 cell states를 업데이트 하는데 이용하며, cell state는 다음 스텝의 hidden state를 업데이트 한다.
> input gate : 입력 x_t의 가중치 (0 ~ 1)
> Forget gate : 이전 cell state 정보를 얼마나 사용할 지 정하는 것 (0 ~ 1)
> Gate gate : input을 얼마나 포함시킬지 결정하는 가중치 (-1 ~ 1)
> Output gate : c_t를 얼마나 노출시킬지 정하는 것 (0 ~ 1)
> cell state의 backprob은 upstream gradient * forget gate
> LSTM의 장점 :
- backprob을 할 때 matrix multiplication이 아닌 element-wise multiplication을 한다.
- 매 스텝 다른 forget gate와 cell state(c_t)곱해져 vanishing gradient 문제가 발생하지 않는다. forget gate에서 나온 값은 0 ~ 1 사이의 값으로 좋은 수치적 특성을 보인다.(값이 튀는 것을 잘 잡아준다는 의미이다 그러나 0 ~ 1으로 존재하기에 vanishing gradient에 대한 문제가 여전히 존재 -> forget gate의 bias를 양수로 초기화하여 문제를 완화)
> cell state의 경우 곱해지고 더해지는 것 외에 활성화 함수를 통과하지 않기 때문에 정보는 큰 변함이 없다.
> Vanilla RNN의 backward에서는 매번 Step tanh를 거쳤다. LSTM에서는 한번만 tanh를 거치면 된다.
> gradient 고속도로 구조가 Resnet 유사하다
GRU
> LSTM과 달리 cell state와 hidden state가 하나의 hidden state로 합쳐졌다.
> Output gate가 없다.
스터디 질문 모음
1) RNN에서 Tanh가 쓰이는 이유?
> Vanishing gradient에 민감하기 때문에 Gradient을 최대한 오래 유지시킬 수 있는 activation function을 사용하는 것이 좋다.
- sigmoid
> sigmoid의 미분의 최대값은 0.25, gradient vanishing이 발생할 것이다.
- Tanh
> 반면에 Tanh의 미분값의 최대는 1이다. Sigmoid에 비해서 gradient vanishing에 강할 것이다.
<참고 자료>
[1] https://curt-park.github.io/2017-04-03/why-is-lstm-strong-on-gradient-vanishing/
[2] https://excelsior-cjh.tistory.com/185