[CS231n] 10. Recurrent Neural Networks
📗강의노트/CS231n

[CS231n] 10. Recurrent Neural Networks

728x90
반응형
Train game 해보기. 




(1) One to many

단일 입력이지만 출력은 caption같은 가변 출력이다 ( image captioning )

(2)  many to One

입력이 가변 입력이다. 감정 분류에 쓰인다. 비디오를 읽을 때도 사용된다. (문장)   ( Sentiment Classification )

(3)  many to many 

입/출력 가변  (Machine Translation )
번역된 길이는 다를 것이다. 

(4)  many to many 

비디오 처럼 가변 입력이고 프레임마다 출력값이 나와야 하는 상황

( Video classification on frame level ) 




RNN 으로 input x가 들어감. RNN에는 ‘hidden state’가 있는데 이는 새로운 입력을 불러들일 때마다 매번 업데이트된다. 모델에 다시 피드백되고 이후에 다시 새로운 입력 x가 들어온다. 




이전 단계의 state + input x를 입력으로 받는 F(w)는 또 다시 새로운 state를 만든다. 




Whh는 이전 state와 곱해지는 값이다. 

그리고 non-linearity를 구현하기 위해 tanh를 적용한다. 

Hidden state인 h_t를 새로운 가중치 행렬 Why와 곱해준다. ( 출력을 얻기 위해서 )




다른 그림을 통해 이해를 해보자.

Initial hidden state인 h0이 존재한다. 보통 0으로 초기화 시켜준다. 그리고 h0과 x1이 fw의 입력으로 들어가게 된다.  

이 과정이 반복되는 것이다. 




W를 추가한 것이다. 여기서 주목할 점은 매번 동일한 W가 입력되는 것이다. 

Gradient를 구하려면 각 스텝에서 W에 대한 그레디언트를 전부 계산한 뒤에 이 값들을 모두 더하면 된다. 

ht가 다른 네트워크의 입력으로 들어가서 y_t를 만들어 낼 수도 있다. ( class score ) 

각 스텝마다 개별적으로 y_t에 대한 Loss를 계산할 수 있다. 각 Loss의 값의 총합이 전체 Loss이다. 




Many to one ( 감정분석 ) 같은 경우는 최종 hidden state에서만 결과 값이 나올 것이다. 




One to many 의 모델이다. 대개 고정 입력은 모델의 initial hidden state를 초기화시키는 용도로 사용한다. 




Sequence to sequence 모형( many to one + one to many )이다. 

encoder와 decoder로 나눠서 볼 수 있다. encoder는 가변입력을 받는다. 예를 들어 영어 문장이 될 수 있다. 

Encoder의 final hidden state를 통해 전체 sentence를 요약한다. 

Decoder에서는 one to many 형태로 볼 수 있다. 

입력은 하나의 벡터가 된다. decoder는 가변 출력을 내뱉는다. 다른 언어로 번역된 문장이 될 수 있다. 

가변 출력은 매 스텝 적절한 단어를 내뱉는다. 




문자열을 입력으로 받고 다음으로 올 문자열을 예측해야한다.  

문자를 One-hot encoding으로 표현한다. 




‘h’가 들어가면 output ‘e’를 예측한다. 




확률이 아주 낮지만 e가 예측이 되어 다음 입력으로 들어간다. 매 타임 스텝마다 확률 분포에서 샘플링하여문자를 하나씩 뽑아낸다.




truncated backpropagation을 이용한다. 입력 시퀀스가 엄청 길어도 train time에 한 스텝을 일정 단위로 자른다. 일부 스텝마 forward pass를 하고 이 서브 시퀀스의 Loss를 계산한다. 그리고 gradient step을 진행하는 것이다. 




이 과정을 반복하는 것이다. 이전 batch에서 계산한 hidden state는 계속 유지한다. 

Gradient step(backprop)은 현재 batch에서만 진행 




CNN은 요약된 이미지정보가 들어있는 Vector를 출력한다. 이 Vector는 RNN의 초기 Step의 입력으로 들어간다. 




image를 입력으로 넣고 , 마지막에 FC를 softmax하지 않고 4096 dim vector 그대로 출
력한다. 




하나는 현재 스텝의 입력이고 + 하나는 이전 스텝의 Hidden state였다. 이 둘을 조합하여 다음 hidden state를 얻었다. 

모델에 이미지 정보를 추가하는 방법 중 쉬운 것으로는 세 번째 가중치 행렬을 추가하는 것이다.  






문자열의 경우 sampling을 통해 다음 입력을 정한다. End token이 샘플링되면 모델은 더이상 단어를 생성하지 않으며 이미지에 대한 caption이 완성된다. 

이 모델은 완전한 Supervised learning 으로 학습시킨다. 따라서 이 모델을 학습시키기 위해서는 natural language caption이 있는 이미지를 가지고 있어야 한다. 
Microsoft COCO dataset

Train data와 유사한 이미지를 던져주면 꽤 잘 동작한다.  




더 발전된 것인 “Attention”이라는 것이 있다. 이 모델은 caption을 생성할 때 이미지의 다양한 부분을 집중해서 볼 수 있다. 




CNN으로 벡터 하나를 만드는게 아니라 각 벡터가 공간정보를 가지고 있는 grid of vector를 만들어 낸다 (LXD) 




이미지의 각 위치에 대한 분포는 Train time에 모델이 어느 위치를 봐야하는지에 대한 attention이라 할 수 있다. 





위와 같은 과정이 계속 반복된다.

H0이 이미지의 위치에 대한 분포를 계산하고, 이 분포를 다시 벡터집합(LXD)와 연산하여 이미지 attention (z1)을 생성한다. 이 요약된 벡터는 다름 입력으로 들어간다. 결과로는 vocabulary의 각 단어들의 분포(d1), 그리고 다른 하나 (a2)는 이미지 위치에 대한 분포이다. 




train이 끝나면 모델이 caption을 생성하기 위해서 이미지의 attention을 이동시키는 모습을 볼 수 있다. 

Soft attention의 경우는 ‘모든 특징’ + ‘모든 이미지 위치’간의 Weighted combination을 취하는 경우이다. 

Hard attention은 모델이 각 타임 스텝마다 단 한곳만 보도록 강제한 경우이다. 




질문을 주고 그림을 보고 답을 낼 수 있다.  VQA




Many to one

이미지에 대한 attention을 만들어내는 것을 볼 수 있다. 




더 자주 보게될 모델들은 Multi-layer RNN이다. ( hidden state가 여러개인 )

Hidden state를 또 다른 입력으로 넣어 RNN layer가 만들어내는 또 다른 hidden states 시퀀스가 생겨서 탑을 쌓게 된다. 모델이 깊어질수록 다양한 문제에 더 좋은 성능을 낸다. 
2,3,4 layer RNN이 적절하다. 




두 입력을 stack하고 가중치 행렬 W와 곱 연산을 하고 tanh를 씌워서 다음 H를 만든다.




backward시에 h_t에 대한 loss의 미분값을 얻는다. 그리고 loss에 대한 h_t-1의 미분값을 구한다. 

Matrix multiplication gate의 backprop은 결국 transpose를 곱해주는 것과 같다. 

RNN cells를 통과할때 마다 매번 가중치 행렬의 일부를 곱하게 된다는 것이다. 




backward시 gradient 계산시에 W의 transpose가 매번 곱해지기 때문에 좋지 않다. 

Exploding gradients : 행렬의 특이값이 1보다 클 때, backprop시 레이어가 깊어질수록 그레디언트가 기하급수적으로 증가하는 현상이다. 

Vanishing gradients : 행렬의 특이값이 1보다 작은 경우 정반대로, 기하급수적으로 그레디언트가 작아진다. 

그럴 때 Gradient clipping을 이용한다. 그레디언트를 먼저 계산하고, 그레디언트의 L2 norm이 임곗값보다 클 때 그레디언트가 최대 임계값을 넘지 못하도록 조정해준다. 




LSTM은 Exploding gradients & Vanishing gradients 문제를 완화시키기 위해서 디자인 되었다. Gradient clipping을 쓰지 말고, 그레디언트가 잘 전달 되도록 아키텍쳐 자체를 디자인 한 경우이다.

하나의 셀에 2개의 hidden state가 존재한다. ( h_t, c_t )

C_t는 LSTM 내부에만 존재하며 밖에 노출되지 않는 변수이다. 
 




Hidden state를 stack 해두고 네 개의 gates의 값을 계산하기 위한 커다란 가중치 행렬을 곱해준다.

ifog를 기억해야한다.

i는 input gate : cell에서의 입력 x_t에 대한 가중치이다. 
F는 forget gate : 이전 스텝의 cell의 정보를 얼마나 망각할지에 대한 가중치이다. 
O는 Output gate : c_t를 얼마나 밖에 드러내 보일지에 대한 가중치
G는 gate gate : input cell을 얼마나 포함시킬지 결정하는 가중치 ( -1, 1 )







backprop의 모양도 괜찮아졌다.




ResNet과 같은 원리. 그레디언트를 위한 고속도로 역할을 한다. 




GRU

Original LSTM이 제일 좋다!

















728x90
반응형