Computer Science/CS231n

[CS231n] Lecture 10

  • -
728x90
반응형

Recurrent Neural Networks

input과 output 사이의 관계를 표현해보면 총 5가지의 구조로 다양하다. 

 

one to many의 대표적인 예시는 Image Captioning이다. 하나의 이미지를 넣으면 여러개의 단어를 출력해야하는 상황이라고 할 수 있다. many to one의 대표적인 예시는 Sentiment Classification이다. 여러 개의 단어를 주고 감정을 출력하는 상황이라고 할 수 있다. many to many의 대표적인 예시는 Machine Translation이다. 대표적으로 여러 개의 단어를 여러 개의 단어로 변환시키는 상황으로, 다른 언어로 변환하는 상황을 들 수 있다. 

0

위 사진은 맨 마지막 분류에 해당하는 것으로, frame level에서 video classification을 하는 과정을 나타낸 것이다.

 

one to one의 경우는 기존에 학습했던 신경망 구조로 표현이 가능하지만, 나머지의 경우는 불가능하다. RNN을 활용하면 이러한 구조를 표현할 수 있다는 장점이 존재한다.

 

RNN

RNN은 다음과 같은 공식으로 이해하면 된다. 과거 상태와 현재의 input값을 parameter로 가지는 함수를 처리한 결과를 현재의 상태로 가지는 것이다. 

이를 수식으로 나타내면 다음과 같은데, 주의할 점은 old state에 곱해지는 weight와 input에 곱해지는 weight는 state가 변경되어도 일정하다. (물론 두 가중치는 다르다.)

출력의 경우는 current state에 가중치를 곱해준 값으로 정의한다. 마찬가지로 해당 값은 t가 변경되어도 일정하다는 점을 주의해야 한다.

이를 모식화하면 다음과 같다. 위 사진에서 볼 수 있는 것처럼 이전의 state와 input이 각자에 해당하는 weight와 곱해진 뒤 tanh에 처리한 값이 현재의 state가 된다. 앞서 언급한 것처럼 가중치는 진행됨에 따라서 변경되지 않으므로 모든 $f_w$에 연결되어 있는 것이다.

총 Loss의 경우는 각 ouput에 해당하는 출력값과 label를 비교하고 손실함수를 통해 계산한 값을 더해주면 구할 수 있다.

예상한 것처럼 backpropagation의 경우, $\frac{\partial L}{\partial W}$의 경우 각 gradient를 더해주면 구할 수 있다.

위 사진처럼 해당 글자 뒤에 무슨 글자가 나와야하는지 훈련하는 상황이라고 가정해보자. input값은 one hot encoded방식으로 표현했다고 가정했을 때, 이전 상태와 input값에 가중치를 곱한 뒤 tanh를 통과시키고 이 값을 다시 출력 가중치와 곱해서 output layer를 도출한다. label과 출력값을 통해 loss를 구하고 이를 통해 backpropagation을 수행한다.

Test data의 경우, train과 거의 비슷하나 output layer에 softmax를 처리하고 해당 값을 바탕으로 확률적으로 output값을 출력하고 이를 다시 다음 layer에 input값으로 넣는다. 이를 통해 모델의 다양성을 얻을 수 있게 된다.

Truncated Backpropagation

층이 깊어지면 깊어질수록, 모든 layer에서 loss를 계산하고 backpropagation을 처리해야하는 문제때문에 매우 오래걸리고 메모리를 많이 잡아먹는 문제점이 발생하게 된다.

따라서 Chunk단위로 자르고 해당 chunk에 backpropagation을 처리해 주면 된다. 느낌 자체는 SGD에서 mini batch를 잡아서 처리하는 느낌과 매우 유사하다. 즉 전체의 Gradient를 구하는 것이 아니라 해당 chunk 단위만 gradient를 구해서 backpropagation을 처리하는 것이다.

Image Captioning

Computer Vision에서 RNN을 활용하는 대표적인 예시는 Image Captioning이다.

이미지를 CNN을 통해 학습시킨 결과를 통해 RNN을 적용시켜서 Image Caption 작업을 수행하게 된다.

 

앞서 배운 CNN에서 맨 마지막 FC layer와 softmax층을 제외한 결과를 가중치와 곱해서 각 layer의 status를 계산하는데 반영해주면 된다.

앞서 확인한 NLP의 사례처럼 ouput값이 다시 input값으로 들어오는 방식을 반복해준다. 만약 End token이 들어오게 되면 해당 작업은 끝나게 된다.

LSTM

예를 들어 다음과 같은 구조를 가진 RNN layer를 backpropagation 처리한다고 가정해보자.

$\frac{\partial L}{\partial h_0}$의 경우, upstream gradient와 local gradient가 반복되어 처리되는 과정에서 $W^T$가 계속 곱해지게 된다. 따라서 만약 W가 1보다 크면 Exploding gradient 문제가 발생하고 반대의 경우는 Vanishing gradient 문제가 발생하게 된다. 물론 Exploding gradient의 경우 Gradient clipping을 활용하여 지정한 threshold를 넘는 값에 대해서 처리해주면 되지만, Vanishing gradient 문제의 경우 RNN 구조를 바꿔야 해결할 수 있다.

 

LSTM의 경우 다음과 같은 구조로 만들어진다.

기존의 RNN과 다른 점은, Cell state가 존재한다는 점이다.

수식에서 볼 수 있는 것처럼, 과거 cell state와 f를 곱해서 어느 정도로 반영할 것인지를 결정하게 된다. f는 sigmoid를 통과한 값으로 0~1까지의 값을 가지므로 어느 정도로 반영할지 여부에 부합한다고 할 수 있겠다.

 

추가적으로 i와 g를 곱하는데, input 값 중 어느정도의 가중치를 가지고 반영할 것인지를 결정하는 느낌으로 이해하면 된다.

g는 tanh를 통과한 값으로 -1 ~ 1까지의 값을 가질 수 있는데, 부호가 상관관계가 음수인지 양수인지를 결정하고 그 크기가 반영 정도를 반영하는 느낌으로 이해해주면 된다.

 

따라서 해당 값을 바탕으로 output값과 곱해져서 출력정도를 컨트롤 한다고 이해해주면 된다.

따라서 Backpropabation을 하는 과정에서 계속 동일한 W의 transpose가 곱해지는 것이 아니라, f라는 scalar 값과 곱하는 것이므로 훨씬 해당 문제를 쉽게 해결할 수 있게 된다. (추가적으로 f는 각 layer마다 다르므로 더 유리하다.)

 

추가적으로 기존의 RNN의 경우는 hidden layer를 구하기 위해서 non linearity function을 처리하므로, backpropagation을 저리하는 과정에서 모두 다 해당 과정을 고려해야한다는 단점이 있었다. 근데 이 모델에서는 1번만 고려해도 된다는 장점을 가지고 있다.

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.