Contents

[CS231n] 10. Recurrent Neural Networks

개요

  1. CS231n의 10강에 대한 내용을 정리 할 것이다.

Recurrent Neural Networks

  1. 이번 강의에서는 Recurrent Neural Networks에 대해서 설명을 한다.
  1. 지금까지의 networks는 one-to-one의 구조를 띈 모델이지만 위 그림과 같이 여러 구조를 띌 수 있게 된다.

  1. 따라서 각 구조 별로 다양한 task로 활용할 수 있다.
  • one-to-many
    • image captioning
  • many-to-one
    • sentiment classification
  • many-to-many
    • machine translation
    • videio classification on frame level

$$h_t = f_W(h_\text{t-1},x_t)$$

  1. 다음은 RNN의 기본 수식이다. 이전 상태($h_\text{t-1}$, hidden state)와 입력 값($x_t$)을 계산하여 new state로 나오게 된다.

  1. 더 자세한 수식은 위 그림과 같다.

  1. 위의 수식을 기반으로 RNN의 Computational Graph로 표현을 하게 된다면 위 그림과 같다.

  1. 보면 각 스텝에서 다 같은 W를 사용하는 것을 확인할 수 있게 된다.

  1. 위 그림RNN에서 Many-to-Many일 때 Loss 계산 까지 표현되는 그림인데 각각의 time-step마다 local gradient를 계산하게 되고 그것이 합쳐진 L까지 가서 upstream gradient로 내려오게 된다.

  1. 다음은 Many-to-One일 때 인데 최종 output인 y가 summarize context를 모든 time-step에 따른 하나의 결과를 담고 있다.

  1. 다음은 One-to-Many인데 이것은 fix size 형태로 입력이 되고 variable sizeoutput을 출력하는 형태이다.

  1. 이러한 Many-to-One구조와 One-to-Many를 섞은 구조인 Seq2Seq구조도 있다.

  1. Encoder에서 다양한 크기의 input이 들어오고 그것의 전체를 요약하는 $h_t$가 있게 된다.

  1. Encoder에서 나온 vector를 Decoder로 넘겨 다양하게 출력을 할 수 있게 한다.
  • 이때 입력, 출력의 크기를 조절하기 위하여 입력 토큰, 출력 토큰을 지정하여 모델이 처음과 끝을 알 수 있게 한다.
  • 이 구조는 번역을 하는 task에서 사용할 수 있게 된다. (영어 -> franch)

  1. 이제는 하나의 문자를 입력 받고 다음으로 올 문자를 예측하는 모델을 설명할 것이다.

  1. 문자를 모델에 입력하기 위하여 하나의 벡터로 넣기 위하여 embedding 작업을 거치는데 embedding 방법 중 one-hot-encoding의 방법을 사용하였다.

  1. 그 후 그것에 가중치 행렬($W_\text{xh}$)을 곱하여 hidden layer로 들어가고 또 그게 다시 output layer로 출력이 된다.

  1. 여기서 hello라는 결과를 보여야 하기 때문에 맨 처음에 e라는 출력값을 가진다. 하지만 이 경우 잘못 예측을 하여 o로 예측을 한 경우이다.

  1. 다음으로 e가 input으로 들어가고 새로운 hidden state를 만든다. 이러한 과정을 계속 거치면 이 모델은 이전의 문장들의 문맥을 참고하여 다음 문자가 무엇일지 예측을 할 수 있게 되는 것이다.

  1. 그렇다면 이 모델의 Test time에서는 어떻게 작동을 하고 있는지 보여준다. 이 모델을 잘 활용을 하기 위해서는 sampling이라는 샘플링 기법을 활용하는 것이다.

  1. 위 그림은 모델이 output layer를 거쳐 softmax를 취하여 확률 분포를 사용하여 sampling을 한 과정을 나타낸다.
  • 해당 경우에 e는 뽑힐 확률이 굉장히 작았음에도 불구하고 운이 좋게 e가 샘플링 되었다.

  1. 또한 이 샘플링으로 나온 e를 다음 input으로 넣어주고 반복 과정을 거쳐 test를 하게 된다.

  1. 가장 높은 스코어를 선택하지 않고 샘플링을 하는 이유는 모델에서 다양성을 얻을 수 있게되기 때문이다.
  • 항상 h를 첫 input으로 놓는다고 할 때, 확률분포로 샘플링을 하게 된다면 그럴듯한 다양한 문장들을 출력할 수 있어 이것이 출력의 다양성으로 이어진다.

  1. 다음은 RNN에서 역전파를 사용했을 때를 나타낸다. 각 스텝마다의 loss를 계산해서 최종적인 output을 나타내게 되는데 시퀀스가 너무 길게 되면 문제가 생길수도 있다고 한다.
  • 길면 메모리 사용량도 많고 학습이 너무 느릴 것이다.
  • data point의 모든 요소에 대한 기울기를 계산하는 것은 엄청난 비용을 초래한다.

  1. 따라서 이러한 문제를 해결하기 위하여 나온 방법은 truncated backpropagation이다.

  1. 입력이 너무 길다고 하더라도 train할 때 한 스텝을 일정 단위로 자르고 단계를 진행하기 때문에 위의 문제를 해결할 수 있다.
  • 이전에 계산한 hidden state는 계속 유지하고 반복해야 한다.
  • backpropagation은 현재 배치만큼만 진행해야 한다.

Image Captioning

  1. 다음은 Image captioning에 관한 설명이다. Image captioning을 하기 위해선 CNNImage를 넣고 CNN의 result vector를 다시 RNN에 넣어서 caption에 사용 될 문자를 하나씩 생성해가는 방식이다.

  1. 위 그림을 보면 CNN에서 마지막 출력(softmax) 전에 값들을 RNN의 모델의 input으로 <start> 토큰과 함께 넣고 이미지 정보를 추가하기 위하여 세번째 가중치 행렬을 추가한다.

  1. 그 후 sampling을 통하여 output을 뽑고 그 단어를 다시 다음 스텝의 입력으로 넣는 과정을 <END> 토큰이 나올 때 까지 반복하게 된다.
  • Image captioningsupervised learning이기 때문에 label이 있어야 한다.

Image Captioning with Attention

  1. Image captioningattetion mechanism과 함께 사용하는 예시를 설명할 것이다.

  1. Image를 CNN으로 먼저 Feature map vector를 뽑고 이 벡터는 각각의 벡터가 공간 정보를 가지고 있는 것이다.

  1. 이 벡터를 사용해서 RNN을 활용을 하는데 $h_\text{0}$은 이미지의 위치에 대한 분포를 계산하고, 그것의 결과인 $a_\text{0}$이 다시 feature map과 계산을 하여 이미지에서 살펴보고자 하는 위치에 대한 분포를 나타내는 $z_1$ 도 함께 생성하게 된다.

  1. 이때 계산된 $z_1$은 다음 번 단계일 때 input으로 들어가고 그 후 위 그림과 같이 두개의 출력으로 나타내게 된다.
  • 이것이 계속 끝날 때 까지 반복이 된다.

  1. 따라서 위 그림은 모델이 caption을 만들기 위하여 attention하는 것을 시각화 하는 그림이다.

  1. 따라서 모델이 caption을 만들기 위하여 실제로 의미 있는 부분을 집중하고 있는 것을 확인 할 수 있게 된다.

  1. 이러한 방법으로 Visual Question Answering Task도 가능하다.

MultiLayer RNNs

  1. 지금까지는 hidden state가 하나인 RNN을 배웠지만 hidden state가 여러개인 multilayer rnn도 가능하다는 슬라이드이다.

  1. RNN을 한 번 돌리고 hidden state가 생기고 이것이 바로 다른 RNN cellinput으로 들어가는 것을 확인 할 수 있게 된다.
  • 모델이 깊어질수록 성능이 더 좋아진다.
  • 보통 layer를 2~3개를 쌓는다.

LSTM

  1. 이러한 RNN에도 문제점이 있다. 바로 RNN의 gradient update 과정에서 발생하는 문제점이다.

  1. 위 그림RNN에서 backward pass일 때의 모습이다. 이때 $h_t$에 대한 미분 값을 얻게 되고 loss에 대한 $h_\text{t-1}$의 미분값을 계산을 하게 된다.

  1. 위 그림은 해당 과정을 여러 셀일 때 나오게 되는 그림이다. 이때 보면 $h_0$의 gradient를 구하려고 하면 각 셀의 같은 값을 가지는W가 개입하게 된다.

  1. 이 때 계속 곱해지는 W의 값을 1보다 크면 결국 exploding 될 것이고 1보다 작으면 gradient가 사라지는 vanishing gradient현상이 일어날 것이다.

  1. 따라서 이러한 문제를 해결하기 위하여 LSTM이 나오게 되었다. LSTM은 한 셀에 두개의 hidden state를 가지고 있다. $c_t, h_t (cell state, hidden state)$

  1. 위 그림은 LSTM의 구조를 나타낸다. LSTM은 각각 다른 4개의 weight 행렬이전 상태에서 온 xh를 합쳐 행렬 곱을 하여 4개의 gate로 output을 내게 된다.

  1. f gate이전 스텝의 cell 정보를 얼마나 지울지에 대한 망각 게이트 이고 이것이 가능한 이유는 sigmoid를 activation으로 하기 때문에 0,1사이의 값으로 조절 할 수 있게 된다.

  1. i gate는 input gate이고 $x_t$에 대한 가중치이고 g gate는 gate gate이고 input cell을 얼마나 포함시킬지 결정하는 가중치 행렬이다. 또한 o gate는 output gate로 cell을 얼마나 드러낼 것인지에 대한 가중치 행렬이다.

  1. 이런 LSTM cell 구조를 더욱 명확히 나타내기 위한 그림이다. 이전 cell statehidden state를 입력으로 받고 $h_\text{t-1}$와 $x_t$를 stack하여 가중치 행렬과 계산하고 각각 $c_t$와 $h_t$를 계산 하는 것을 확인 할 수 있다.

  1. 다음은 LSTM cell의 gradient 과정을 나타낸 것이다. LSTM은 역전파를 수행할 때 $c_t$에 대한 역전파만 수행하여 forget gate에 upstream gradient가 곱해지는 것을 확인이 된다.
  • 왜냐하면 $c_\text{t-1} * fgate$ 이므로 행렬 곱이므로 gradient update 입장에서 봤을 때 $fgate$만 업데이트 시 사용이 된다.

  1. 따라서 같은 W의 값이 계속 곱해지는 vanilla rnn과 달리 forget gate의 값이 스텝마다 달라지기 때문에 이러한 문제를 해결할 수 있게 되었다.
  • 그렇다고 vanishing gradient의 문제가 완전히 해결된 것은 아니지만 vanilla rnn보다는 심하지는 않다.
    • 매 스텝마다 f의 값이 달라지기 때문이다.
  • forget gate의 sigmoid 값으로 bias를 1에 가깝게 만들어주면 vanishing gradient를 많이 약화시킬 수 있습니다.
  • W 값이 곱해지지 않아되기 때문에 마치 고속도로 처럼 gradient를 위한 빠른 처리

Reference