본문 바로가기
코딩 독학/CS231n

[cs231n] 10강. Recurrent Neural Networks

by 효니루 2020. 12. 12.

✔ 본 포스팅은 20/10/10 ~ 20/12/26 동안 진행하는 가짜연구소 딥러닝기초이론스터디를 통해 학습한 내용입니다.

 

✔ 본 포스팅은 스탠포드 대학의 cs231n 강의를 정리한 내용입니다.


Review

2014년에는 Batch normalization 기술이 없었기 때문에 깊은 모델이 converge하기 위해서는 다른 방법이 필요했다. GoogLeNet에서 auxillary layer를 사용했던 것이 Batch norm을 대신하기 위한 장치같은 것이었다.

 

그리고 이 때까지는 하나의 input x를 넣으면 하나의 output y를 뽑아내는 구조인 CNN에 대해서 배웠다.

 

오늘은 input과 output이 여러개가 될 수 있는 Recurrent Neural Network에 대해서 배워본다.

 

RNN 개념

RNN의 가장 큰 특징은 데이터의 길이가 가변적이란 것이다. 계속해서 데이터의 길이가 변하는 것을 수용하고 반영할 수 있다.

1. One to many) Image Captioning : 이미지 안에 각각 다른 물체에 이름 붙이기

2. Many to one) Sentiment Classifaction : 여러 단어를 종합해 감정분석, 뉴스카테고리 분석 등 하나의 주제를 뽑아냄

3. Many to Many)

3-1) Machine Translation : 언어번역을 할 때에는 언어에 따라 같은 뜻의 문장도 다른 길이로 해석된다.

3-2) Video Classification : 영상분석. 영상은 여러장의 이미지(프레임)가 연속적으로 빠르게 들어오기 때문에 바로바로 해석이 필요하다.

 

이렇게 입출력 데이터의 길이가 가변적일 때 굉장히 강점을 갖는다.

 

RNN의 원리

오른쪽 그림과 같이 input x가 들어가면 RNN안의 hidden state를 수차례 거치면서 RNN이 업데이트 되고, 때에 따라 output y를 출력하게 된다.

 

왼쪽의 수식은 RNN을 간단하게 표현한 식이다. $x_t$를 RNN에 입력하면 직전의 hidden state인 $h_{t-1}$를 고려하여 파라미터 W를 가진 수식 $f_W$를 거쳐서 새로운 RNN의 hidden state $h_t$가 도출된다. 

 

 

Vanilla RNN

이 vanilla RNN이 가장 기초적인 구조라고 한다.

가중치 W는 계속해서 같은 것이 쓰이지만, 종류는 3가지 있다. $W_{hh}$, $W_{xh}$, $W_{hy}$ 이다.

하나는 이전 hidden state에서 오는 W, 하나는 input x에서 RNN으로 들어오는 W, 그리고 마지막은 RNN에서 y로 넘어갈때의 가중치 W를 의미한다.

 

1. Many to Many

그래프로 Vanilla RNN을 나타내면 이렇다. RNN의 고정된 공식 $f_W$ 안에는 hidden state가 있고 input x가 들어올 때마다 hidden state는 영향을 받게 된다. 그리고 위에서 말한 3종류의 W는 각자 변하지 않고 매 input이 들어올 때마다 함께 hidden state에 영향을 미치게 된다. 그리고 그렇게 나온 y는 각각 Loss를 계산하고 이들의 합이 최종 Loss가 된다. 

input x가 여러개 들어오고, output으로 여러개가 출력되는 many to many 구조이다.

 

2. many to one + one to many = sequence to sequence

왼쪽은 여러 input x를 넣으면 마지막 hidden state인 $h_T$에서 y를 출력하는 many to one 구조이고, 오른쪽은 input 1개를 넣으면 여러개의 output y가 출력되는 one to many구조이다. 이 둘을 결합하여 many to one 모델의 output 대신 input들이 모두 반영된 hidden state인 $h_T$를 one to many 모델로 전달하게 되면 마치 여러 input을 넣고 여러 output을 도출하는 것과 비슷해진다. 

이 때는 번역기나 비디오분석에 적용가능하다. 번역기로 여러 단어가 들어오면 이를 요약해 담은 $h_T$를 전달해주면, 뒤의 one to many구조는 새로운 언어로 암호를 해독해주는 역할을 하여 input과는 다른 개수의 output을 출력하게 된다.

 

 

Example 

RNN이 많이 쓰이는 자연어처리를 예시로 한번 이해해보자. (RNN는 정말 생전 처음이라서 신기함^_^)

어떻게 기계가 인간의 말을 이해할 수 있을까? character-level, 즉 문자수준에서 가장 흔하게 다음으로 올 문자를 예측해서 단어단위를 예측하게 된다.

 

hello라는 단어를 예측해보자. h, e, l, o라는 4개의 문자가 있고 순서대로 원-핫인코딩 벡터로 대입할 것이다.

 

 

h,e,l,l이라는 문자를 원-핫인코딩을 통해 벡터로 input으로 넣어준다. 가장 첫번째 input인 'h'에서 hidden layer를 거쳐 output에서 다음으로 각 h, e, l, o 중 어떤 문자가 올 지에 대한 스코어를 구했을 때, 사실 4번째인 o가 나올 확률이 가장 크게 나왔다. RNN이 잘못 예측한 것이지만, 나중에 softmax 등을 통해 교정해준다. 

 

test time을 보자. 사실 h 다음으로 o가 올 확률이 파란 네모박스를 보면 4.1로 가장 크지만, 이러한 오류를 교정하기 위해 softmax를 이용해 확률분포를 구한다. 무조건 가장 높은 스코어인 문자가 다음으로 오게 된다면 오류 교정이 불가능하지만, 확률을 통해 다음 문자를 정한다면, 스코어가 낮아도 우연히 선택될 확률이 존재하고 이를 통해 우리가 원했던 단어를 얻을 수도 있게 된다.

 

 

 

Backpropagation through time

그런데 위와 같은 경우 RNN은 순차적으로 한단계씩 진행해야 한다. 모든 sequence를 다 진행하고 난 후 각 단계의 loss를 더해 최종 Loss를 구한 뒤 backpropagation을 진행하는데 이것을  Backpropagation through time이라고 한다. 이 때는 forward pass도 한단계씩 RNN hidden layer를 업데이트하고 loss를 구하게 되고, backward pass 또한 한단계씩 가야 한다. 만약 sequence의 길이가 엄청나게 길다면 시간이 굉장히 오래 걸리는 단점이 있다. 

 

Truncated Backpropagation through time

이를 해결하기 위해, Truncated Backpropagation through time을 사용한다. CNN의 mini batch와 비슷한 개념이다. 긴 길이의 sequence를 일정 개수단위로 잘라서 forward pass를 진행후 단위마다 backpropagation을 진행한다. 

매 단계 hidden state의 업데이트는 누적되지만, backpropagation은 조금씩 단위마다 시행하게 된다.

 

이 RNN에 수학책, 소설, 리눅스 커널 등의 글을 넣게 되면 의미는 맞지 않아도 구조상 그럴듯한 비슷한 글들이 나온다고 한다.

 

 

 

Image Captioning

CNN과 RNN이 결합된 대표적인 기술이 Image Captioning이다. CNN으로 사진을 넣으면 RNN에서 다양한 단어가 output으로 나오게 된다.

 

기본 원리는 이렇다. 이미지와 함께 처음엔 문장을 만들어달라는 start signal을 함께 넣어준다. 그리고 softmax layer 직전의 FC layer에서 이미지가 요약된 vector를 RNN으로 보내게 된다.

그리고 RNN의 hidden state 하나를 거칠 때마다 captioning된 단어 하나씩 출력되고

반복되다가 더 이상 captioning 할 단어가 없으면 <END> token을 샘플링하게 되어 끝나게 된다.

 

결과를 보면 이런식으로 사진을 설명하는 짧은 문장을 만들게 된다.

 

Image Captioning with Attention

위의 image captioning을 조금 더 자세히 할 수 있는 모델로 with Attention 모델이 있다.

input으로 넣어준 Image에서 특정 부분을 더 자세히 뜯어본다?라는 의미 같은데, 조금 더 부연설명을 해보자면 다음과 같다. 

Image Captioning은 Top down approach와 Bottom up approach 두 가지가 있는데, Top down의 경우 이미지를 처음에 전체적으로 인식하여 요점을 언어로 변환하게 되고, Bottom up의 경우 사진의 부분 부분을 인식하여 이를 결합하여 언어로 변환하게 된다. Top down과 RNN을 결합한 방식이 성능이 좋아서 많이 쓰이고 있지만 디테일한 부분을 놓칠 수 있다고 한다. 그래서 이 2가지 접근방식을 합친 것을 Image Captioning with Attention이라고 할 수 있다.

위 그림처럼 이미지를 넣으면 CNN에서 피처벡터를 뽑고, RNN을 반복해서 거치면서 기존 이미지에서 바라볼 피처벡터의 위치를 조금씩 변경해가면서 단어를 뽑아내고, 이를 통해 추출한 단어를 조합하여 문장을 만들어낸다.

먼저 이미지를 CNN을 거쳐 특정 부분의 피처벡터를 뽑아낸다. 이 때 CNN은 특별히 만드는 게 아니라 GoogLeNet같이 이미 만들어져 있는 CNN을 사용한다고 한다. 

그리고 RNN에 피처벡터를 넣게되면, 이 위치의 중요도에 대한 분포를 계산한 a1벡터가 나온다. 이를 기존 피처벡터에 연산을 더해 다음 RNN층의 input으로(z1) 넣고 첫 hidden state에서 출력된 단어인 y1도 함께 들어가게 된다.

이 과정을 반복하게 된다.

 

이렇게 특정 중요한 부분에 점점 집중하여 이미지를 분석하게 되고, soft attention은 위치에, hard attention은 특정 물체에 더 집중하여 분석하게 된다고 한다.

 

 

 

그리고 마지막 LSTM . It's too difficult OMG 

gonna take time to understand it deeply. 🤣

이부분에 대해서는 몇 일동안 brunch.co.kr/@chris-song/9이 블로그를 보고 이해하고 정리해야겠다.

 

LSTM(RNN) 소개

Recurrent Neural Network의 대표적인 LSTM 알고리즘 | 안녕하세요. 송호연입니다. 요즘.. 딥러닝에 푹 빠져있어서.. 퇴근후 RNN 공부할겸 아래 블로그 글을 한글로 번역하였습니다. 원 저작자, Google Brain

brunch.co.kr

 


출처

www.youtube.com/watch?v=6niqTuYFZLQ&list=PLC1qU-LWwrF64f4QKQT-Vg5Wr4qEE1Zxk&index=10

댓글