티스토리 뷰

RNN (Recurrent Neural Networks)

image

  • 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을 분류

image

  1. 입력을 받는다.
  2. “hidden state”를 업데이트를 한다.
  3. 출력 값을 내보낸다.

> RNN block은 “재귀적인 관계”를 연산할 수 있도록 설계되어있다.


image

> 이전 “hidden state”와 “현재 입력”을 받아서 다음 hidden state를 출력한다.

> Old hidden state가 New hidden state에 영향을 끼친다. (sequential 데이터 용이)

> Y를 출력하기 위해서는 h_t와 W_hy를 곱해준다.


image

> x, h는 매번 다른 값을 사용하지만 동일한 가중치 W를 사용하는 모습을 보이고 있다.

> CNN의 경우 필터를 통과할 때마다 학습되어 구해지는 W는 다르지만. RNN은 동일한 가중치를 사용한다는 것을 잊지 말자.


image

> 전체 Loss는 각 단계에서 Loss가 발생한 Loss를 더한 값이다.

> 최종 hidden state가 전체 시퀀스의 내용에 대한 요약으로 볼 수 있다.


image

> input은 모델의 initial hidden state를 초기화시키는 용도로 사용


image


image

> 현재 문맥에서 다음 문맥을 예측하는 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


  • Image captioning

> input을 image로 받는다.

> CNN을 통해 나온 Caption을 RNN의 인풋으로 사용한다. Caption마다 다양한 시퀀스를 가지고 있다.


image

> 기존의 CNN이였다면 flatten해서 softmax값을 도출해야 한다. 그러나 FC-4096를 flatten하지않고 RNN 인풋으로 사용한다.

> 이미지 정보(분홍색 가중치)가 추가된 hidden state를 update 시켜준다.


image

> Train시 caption의 종료시점에 <END> token을 삽입하여 Sequence의 끝을 알려준다. <END> token이 나오는 순간 더 이상 단어를 생성하지 않으며 이미지에 대한 caption이 완성이 된다.

> Unseen data에 대해서 굉장히 취약하다. Train data와 유사한 이미지를 던져주면 잘 동작한다.


image

> Caption을 생성할 때 이미지의 다양한 부분을 집중(attention)해서 본다.


image

> CNN으로 공간 정보를 가지고 있는 grid of vector를 만들어 낸다.

> 이미지의 위치에 대한 분포(a1)를 계산한 후에 vector 집합(LxD)과 연산하여 attention(z1)을 생성한다. Z1은 h1의 입력으로 들어가게 되고 Vocabulary의 단어들의 분포(d1)와 이미지 위치에 대한 분포(a2)을 생성한다. 추후 이 과정을 반복한다.


image

> caption을 만들 때 마다 이미지 내에 다양한 곳들에 attention을 주는 것으로 볼 수 있다.


  • Visual Question Answering(VQA)

image

> 입력은 두 가지 - 이미지, 이미지에 관련된 질문

> RNN으로 이미지에 관련된 질문을 vector로 요약, CNN으로 이미지를 vector로 요약

> 두 vector들을 조합하여 질문에 대한 답을 한다. (조합 방법 : concat을 하여 FC-Layer의 입력으로 만든다.)


LSTM

image

> 기존 RNN은 gradient를 구할 때, 모든 RNN셀을 통과하기 때문에 같은 가중치 W가 계속 개입하게 된다.

> W값이 1보다 큰 경우는 Exploding gradients가 일어나게 되고 W값이 1보다 작은 경우는 Vanishing gradients가 일어나게 된다.

> Exploding gradients의 경우, gradient clipping을 사용하여 문제를 해결한다. (gradient의 L2 norm이 최대 임계 값을 넘지 못하도록 조절)

> Vanishing gradients의 경우, RNN 아키텍쳐 모델을 바꾸어 문제를 해결한다. (LSTM의 등장)


image

> RNN은 하나의 hidden state를 가지는 반면 LSTM은 두 개의 hidden state를 가진다. (h_t, c_t)

> LSTM은 4개의 gate를 가진다. Gate를 cell states를 업데이트 하는데 이용하며, cell state는 다음 스텝의 hidden state를 업데이트 한다.


image

> input gate : 입력 x_t의 가중치 (0 ~ 1)

> Forget gate : 이전 cell state 정보를 얼마나 사용할 지 정하는 것 (0 ~ 1)

> Gate gate : input을 얼마나 포함시킬지 결정하는 가중치 (-1 ~ 1)

> Output gate : c_t를 얼마나 노출시킬지 정하는 것 (0 ~ 1)


image

> cell state의 backprob은 upstream gradient * forget gate

> LSTM의 장점 :

  1. backprob을 할 때 matrix multiplication이 아닌 element-wise multiplication을 한다.
  1. 매 스텝 다른 forget gate와 cell state(c_t)곱해져 vanishing gradient 문제가 발생하지 않는다. forget gate에서 나온 값은 0 ~ 1 사이의 값으로 좋은 수치적 특성을 보인다.(값이 튀는 것을 잘 잡아준다는 의미이다 그러나 0 ~ 1으로 존재하기에 vanishing gradient에 대한 문제가 여전히 존재 -> forget gate의 bias를 양수로 초기화하여 문제를 완화)

> cell state의 경우 곱해지고 더해지는 것 외에 활성화 함수를 통과하지 않기 때문에 정보는 큰 변함이 없다.


image

> Vanilla RNN의 backward에서는 매번 Step tanh를 거쳤다. LSTM에서는 한번만 tanh를 거치면 된다.

> gradient 고속도로 구조가 Resnet 유사하다


GRU

image

> LSTM과 달리 cell state와 hidden state가 하나의 hidden state로 합쳐졌다.

> Output gate가 없다.


스터디 질문 모음


1) RNN에서 Tanh가 쓰이는 이유?

> Vanishing gradient에 민감하기 때문에 Gradient을 최대한 오래 유지시킬 수 있는 activation function을 사용하는 것이 좋다.

  • sigmoid

image

> sigmoid의 미분의 최대값은 0.25, gradient vanishing이 발생할 것이다.

  • Tanh

image

> 반면에 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

 

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함