비전딥러닝/cs231n

Lecture 10. Recurrent Neural Networks.

아무 말하는 감자 2022. 9. 18. 16:26

“Vanilla” Neural Network

이때껏 해봤던 one to one 구조(x가 들어가면 y가 나오는 구조)가 아닌, 다른 구조들이 나옴

    One to many

-       Image captioning(image-> sequence of words)에 많이 쓰이는 구조, 입력은 이미지와 같은 단일 입력이지만, 출력은 caption과 같은 가변 출력이다.

    Many to one

-       감정 분석, 뉴스 카테고리 분석 같은 경우에 쓰이는 것. 입력은 문장과 같은 가변 입력

    Many to many

-       기계 번역(seq of words -> seq of words) 같은 경우에 쓰이는 것. /출력 모두 가변

 

RNN은 고정 길이의 데이터 및 가변 길이의 데이터에 매우 유용하다.

일반적으로 RNN은 작은 “Recurrent core Cell”을 가지고 있고 내부에 “hidden state”(rnn이 새로운 입력을 불러들일 때마다 매번 업데이트)를 가지고 있음.

X는 입력값, y는 출력값

이전 상태의 hidden state와 입력값으로 현재 상태의 hidden state를 출력으로 하는 구조(과거의 데이터가 미래에 영향을 줄 수 있는 구조)를 가진 것이 RNN이다.

파라미터 W는 매 step 동일한 W가 쓰이게 된다. Fuctionsame한 것을 사용.

 

Vanilla RNN

< Vanilla RNN

 

Whhhidden에서 오는 W.

 

Wxhx에서 RNN으로 들어로는 weight

 

WyhRNN cell에서 y로 넘어가는 weight

 

Tanh는 활성함수로, systemnon-linearity를      구현하기 위해 적용.

 

Ytclass score이다.

 

RNNhidden state를 가지며 이를 재귀적으로 feed back한다는 점이 중요!

동일한 가중치 W가 매번 사용된다.

 

* backward pass, dLoss/dW를 계산하려면 행렬 Wgradient를 전부 더해준 이전과 달리, RNN 모델의 backprop을 위한 행렬 W의 그레디언트를 구하려면 각 스텝에서 W에 대한 로컬 그레디언트를 전부 계산한 뒤에 이 값들을 모두 더해주면 된다.

Loss softmaxSVM 방식으로 구한다.

 

 

 

 

 

< Many to One의 경우,

최종 hidden state(전체 시퀀스의 내용에 대한 일종의 요약으로 볼 수 있음)에서만 결과 값이 나옴.

 

 

 

 

 

 

 

 

 

 

 

< One to many의 경우,

고정 입력을 받지만, ‘가변 출력

대게 고정 입력은 모델의 initial hidden state를 초기화 시키는 용도로 사용.

 

 

 

 

 

가변 입력과 가변 출력의 구조.

Encoder는 가변 입력을 받고, 마지막 hideen state를 통해 전체 sentence를 요약함.

그리고 decoder로 감, decorder에서는 가변 출력을 해줌. 매 스텝마다 적절한 단어를 내주는 것.

 

 

 

 

 

 

Input 문자를 4D vector화를 하여 입력.  

Training tme에서는 training sequencehello의 각 단어를 넣어줌.

, hello = RNNx_t

 

 

 

 

 

 

 

 

 

 

 

 

Output layer에서의 vector score이며, 이를 softmax를 이용한 확률분포로 sampling하여 각각의 문자가 뽑힐 확률을 수치화한다.

 

 

 

 

 

 

 

모델의 다양성을 얻기 위해 이렇게 한다.

매번 출력 값들의 loss를 계산해 final loss를 얻는데 이를 backpropagation through time이라고 한다.

Forward pass의 경우, 전체 시퀀스가 끝날 때까지 출력 값이 생성되는데, backward pass에서도 전체 시퀀스를 가지고 loss를 계산함.

만약 시퀀스가 매우 길면, 최종 출력 값이 나올 때까지 기다렸다가, gradient를 계산하므로 비효율적이고, 느림.

그래서 실제로는 truncated backpropagation을 사용.

Train time에 한 스텝을 일정 단위로 자르는 방법.

Ex) 100 스텝만 forward pass를 하고, 이 서브 시퀀스의 loss를 계산한 후, gradient step 진행을 반복함.

 

 

 

 

image captioning

: 입력) 이미지, 출력) 자연어로 된 caption.

CNNRNN을 혼합한 대표적인 방법.

빨간박스가 입력 이미지를 받기 위한 CNN

여기서 이미지의 요약된 정보가 들어있는 vector를 출력-> RNN의 초기 step으로 들어가서 RNN이 문장을 만들어냄.

 

 

 

 

Function 2개의 가중치 행렬을 입력(현재 스텝의 입력 x_t, 이전 스텝의 hidden state)을 받았던 이전과는 달리, 모델에 이미지 정보를 추가하기 위해, 요약된 사진 정보 vector v를 가중치 행렬과 곱해 입력으로 넘긴다.

Train time에는 모든 caption의 종료지점에 <END> 토큰을 삽입. 학습하는 동안에 시퀀스 끝에 <END> 토큰을 넣어야 하는 것을 알려줘야 하기 때문.

 

Attention 기법: train 할 때 보지 못했던 것까지 예측하기 위함

Caption을 생성할 때 이미지의 다양한 부분을 집중(attention)해서 볼 수 있는 것.

 

 

    Vanilla RNN의 문제점

Backward pass에서 gradient를 계산하는 과정)

h_t에 대한 loss 미분 값을 얻은 다음, loss에 대한 h_t-1의 미분 값을 계산하게 된다.

Tanh gate를 타고 mul gate를 통과한다. Mul gate는 결국 transpose(가중치 행렬)을 곱하게 된다.

이는 매번 RNN cells를 통과할 때마다 가중치 행렬의 일부를 곱하게 되는 것이다. 결국 모든 RNN cell들을 거칠 때마다 각 cell의 행렬 w transpose 요소가 관려한다.

곱해지는 값이 1보다 큰 값이면 gradient clipping 등으로 점점 커지는 것을 막을 수 있지만, 1보다 작은 경우에는 0으로 수렴하는 것을 막을 수 없다.

 

따라서, LSTM 사용.

Vanilla RNN의 경우, 두 입력(이전 hidden stateh_t-1와 현재의 입력인 x_t를 입력으로 받아,두 입력을 concat하고 행렬 곱 연산으로 hidden state를 직접 구했다.

활성함수를 거친 ifog 4가지의 gate를 사용하여, 범위를 일정하게 정하고, (sigmoid(0~1), tanh(-1~1)) 이를 통해 최종적으로 h_t를 구한다.

 

! LSTM이 vanilla RNN에 비해 backward propagation에서 가지는 장점 !

 

     Forget gate와 곱해지는 연산이 element-wise multiplication이다.

    Element wise multiplication을 통해 매 스텝 다른 값의 forget gate와 곱해질 수 있다.

->  Exploding/vanishing gradient 문제를 쉽게 해결 가능.