안녕, 세상!

(2)-5-1 순환 신경망(RNN) 본문

It공부/Deep learning

(2)-5-1 순환 신경망(RNN)

dev_Lumin 2021. 1. 21. 00:17

지금까지 살펴본 신경망은 피드 포워드(feed forward)라는 유형의 신경망입니다.

feed forward란 흐름이 단방향인 신경망을 말합니다.

feed forward 신경망은 구성이 단순하여 많은 문제에 응용할 수 있지만

시계열 데이터를 잘 다루지 못한다는 단점이 있습니다.

단순한 시계열 데이터의 성질을 단방향 신경망에서는 충분히 학습할 수 없습니다.

그래서 순환 신경망(Recurrent Neural Network)이 등장하게 됩니다.

 

(1) 확률과 언어 모델

이전의 CBOW 모델의 맥락은 타깃을 중심으로 좌우 대칭으로 생각해왔었습니다.

이번에는 맥락을 왼쪽 윈도우만으로 한정해보겠습니다.

왼쪽 두 단어만을 맥락으로 생각하면 출력 확률은 다음과 같습니다.

 

앞서 CBOW 모델의 학습으로 수행하는 일은

손실 함수(말뭉치 전체의 손실 함수의 총합)를 최소화하는 가중치 매개변수를 찾는 것입니다.

CBOW 모델을 학습시키는 본래 목적은 '맥락으로부터 타깃을 추측하는 것'입니다.

이러한 목적이 어디에 쓰일 수 있는지 보았더니

'언어 모델'에서 사용이 됩니다.

 

 

① 언어 모델

언어 모델(Language Model)은 단어 나열에 확률을 부여합니다.

특정한 단어의 시퀀스(순서)에 대해서, 그 시퀀스가 일어날 가능성이 어느 정도인지

(얼마나 자연스러운 단어 순서인지)를

확률로 평가합니다.

 

이러한 언어 모델은 단어 순서의 자연스러움을 확률적으로 평가할 수 있으므로

음성 인식 시스템이나 새로운 문장을 생성하는 용도로 이용할 수 있습니다.

 

언어 모델을 수식으로 설명하겠습니다.

w1, ..... , wm 이라는 m개의 단어로 된 문장이 있다고 가정합니다. (1 ~ m 순서 고려)

P(w1, ..... , wm) 은 해당 순서대로 출현할 확률입니다. (동시발생 확률)

이를 다음과 같이 분해해서 수식으로 나타낼 수 있습니다.

( w1~wm-1 다음에 wm이 올 확률 * w1~wm-2 다음에 wm-1이 올 확률 * ..............)

위의 식은 확률의 곱셈 정리로부터 유도된 것입니다.

 

P(A, B)는

B가 일어날 확률과

B가 일어난 후 A의 확률( P(A|B) )을 곱한 값과 같다는 것입니다.

 

이를 사용하여 다음과 같은 식의 과정을

반복하여 유도된 것입니다.

 

그리하여 동시 확률은 사후 확률의 총곱인 파이 기호로 위와 같이 나타낼 수 있으며

사후 확률은 타깃 단어보다 왼쪽에 있는 모든 단어를 맥락으로 했을 때의 확률이라는 것입니다.

 

이를 계산할 수 있다면 순서를 고려한 언어 모델의 동시 확률 P(w1, ..... , wm)을 구할 수 있습니다.

 

 

 

② CBOW 모델을 언어 모델로

CBWO모델을 언어 모델로 적용하려면 맥락의 크기를 특정 값으로 한정하여 근사적으로 나타냄으로써 실현이 가능합니다.

맥락을 왼쪽 2개의 단어로 한정합니다.

 

(마르코프 연쇄(Markov Chain)

: 미래의 상태가 현재 상태에만 의존해 결정되는 것을 뜻하며 

직전 N개의 사건에만 의존할 때, N층 마르코프 연쇄라고 합니다.

주로 머신러닝이나 통계학에서 쓰이는 어휘입니다.)

 

하지만 CBOW 모델의 문제가 있습니다.

왼쪽의 단어 개수는 임의로 설정 가능하지만 특정 길이로 고정됩니다.

즉 정한 왼쪽 단어 개수보다 더 왼쪽에 있는 단어의 정보는 무시되기 때문입니다.

 

문제가 되는 예시는 다음과 같습니다.

Tom was watching TV in his room. Mary came into the room. Mary said hi to ( ? )

다음 문장의 괄호에는 (Tom)이 와야 합니다.

 

만약 CBOW 모델의 맥락이 10개까지였다면 이 문제에 제대로 답할 수 없을 것입니다.

이를 단순히 해결하기 위해 맥락을 크기를 20~30으로 키울 수 있지만 키운다고 해도

CBOW의 본질적인 특징, 즉 'bag-of-words : 가방 안의 순서는 무시됨' 때문에

맥락 안의 단어 순서가 무시된다는 한계가 있습니다.

('you' , 'say')와 ('say', 'you')가 같게 취급됩니다. (입력층들이 가중치를 거친 값들의 합 즉 평균이기 때문)

 

 

그래서 CBOW에서 순서를 고려하여 맥락의 단어 벡터를 은닉층에 연결(concatenate)하는 방식을 다음과 같이 구현했습니다.

 

하지만 이 방법은 맥락의 크기에 비례하여 은닉층의 가중치 매개변수가 늘어나므로 문제가 됩니다.

 

이를 해결하기 위해 RNN이 사용됩니다.

RNN은 아무리 맥락이 긴 시계열 데이터라도 대응할 수 있습니다.

 

 

 

(2) RNN(Recurent Nueral Network)

Recurent는 라틴어에서 온 말로 '몇 번이나 반복해서 일어나는 일'을 뜻합니다.

반복, 재발, 순환의 의미로 우리말로는 결국 '순환하는 신경망'이 됩니다.

 

① 순환하는 신경망

'순환한다'라는 것은 반복해서 되돌아감을 의미합니다.

순환하기 위해서는 '닫힌 경로'가 필요합니다.

즉 과거로부터 현재로 끊임없이 '갱신'되는 경로가 필요합니다.

 

RNN의 이러한 특성 덕분에 과거의 정보를 기억하는 동시에 최신 데이터로 갱신될 수 있습니다.

그림으로 다음과 같이 그려집니다.

그림의 출력 부분에 2개로 분기가 되어 출력 중 하나는 자기 자신에 입력되는 것을 볼 수 있습니다.

 

모델의 입출력 부분의 t는 시간을 뜻하며 시계열 데이터의 입출력을 표현해 줄 수 있습니다.

각 시간에 입력되는 Xt는 벡터라고 가정할 때 

문장을 다루는 경우를 예로 든다면 각 단어의 분산 표현이 Xt가 되며

이 분산 표현이 순서대로 하나씩 RNN 계층에 입력되는 것입니다.

 

위의 순환구조의 그림을 반시계 90도로 회전시킨 후 펼치면 다음과 같이 나타낼 수 있습니다.

 전에 보았던 feed forward와 같은 양상을 띄지만 위의 다수의 RNN 계층이 모두가 실제로는 '같은 계층'인 것이 지금까지의 신경망과는 다릅니다.

 

각 시각의 RNN계층은 

그 계층으로의 입력과 1개 전의 RNN 계층으로부터 출력을 받습니다.

이 정보를 바탕으로 현 시각의 출력을 다음과 같이 나타냅니다.

이 식의 ht-1과 Xt는 행 벡터입니다.

또한 b(편향)도 있습니다.

그림과 식을 보면 tanh 함수(hyperbolic tangent) 내부의 식은 이해가 될 것입니다.

 

ht는 다른 계층을 향해 위쪽으로 출력되는 동시에 다음 시각의 RNN 계층(자기 자신)을 향해 오른쪽으로 출력됩니다.

현재의 ht는 한 시각 이전 출력(ht-1)에 기초해 계산됨을 알 수 있는데

이를 다른 관점으로 보면 RNN은 h라는 '상태'를 가지고 있으며,

위의 수식 형태로 갱신된다고 해석할 수 있으므로

RNN 계층을 '메모리(기억력)가 있는 계층'이라고 합니다.

 

RNN의 출력 ht를 hidden state(은닉 상태) 혹은 hidden state vector(은닉 상태 벡터)라고 합니다.

 

RNN 계층 그리는 방식 참고

RNN 계층 그리는 방식 참고

 

② BPTT

BPTT(Backpropagation Through Time)은 '시간 방향으로 펼친 신경망의 오차 역전파법'이라는 뜻입니다.

순환 구조를 펼친 후의 RNN에는 일반적인 오차 역전파법을 적용할 수 있습니다.

 

RNN이 역전파로 학습을 하는 과정을 좀 더 자세히 서술해보겠습니다.

우선 RNN은 원래는 loop형태로 시간의 길이만큼 반복되는 것인데 시간을 쭉 가로로 펼친 것이므로 각 RNN의 Wx, Wh, b 값은 모두 동일 합니다.

하지만 역전파의 과정에서 각 (위의 사진에서)RNN 부분의 gradient 즉 기울기는 모두 다를 것입니다.

그 이유는 각 RNN마다 입력 받은 단어에 대한 벡터가 모두 다르기 때문입니다.

그렇다면 가중치는 모두 같은데 각각의 기울기가 다르므로 다음과 같이 학습이 되는 것입니다.

 

RNN 내부의 자세한 역전파 과정은 다음과 같습니다. ( 다음 글에서 역전파에 대해 좀 더 세부적으로 다룸)

위 사진에서는 위에서 내려오는 hnext와 미래에서 들어오는 hnext가 같은 것 처럼 그려졌는데 RNN이 쭉 연결되었다면 다른 놈임

위의 그림은 RNN 한 개에 대해서만 표현된 것이고

대표적으로 Wx에 대해서 학습되는 것은 다음과 같습니다.

l은 학습률 N은 시간

그러므로 각 RNN의 Wx에 대한 미분을 모두 더하고 경사하강법식으로 하면 되는 것입니다.

마찬가지로 Wh, b도 다음 과정을 거쳐서 학습이 되는 것입니다.

 

 

BPTT를 하기 전에 긴 시계열 데이터를 학습할 때의 문제를 해결해야 합니다.

시계열 데이터의 시간 길이가 길어지는 것에 비례하여 BPTT가 소비하는 컴퓨팅 자원도 증가하기 때문입니다.

BPTT를 이용해 기울기를 구하려면,

매 시각 RNN 계층에 중간 데이터를 메모리에 유지해두지 않으면 안됩니다. (이는 뒤에서 설명 예정)

따라서 시계열 데이터가 길어짐에 따라 메모리 사용량도 증가합니다.

또한 계층이 길어짐에 따라 신경망을 하나 통과할 때마다 기울기 값이 조금씩 작아져서,

이전 시간 t까지 역전파되기 전에 0으로 소멸할 수도 있습니다.

 

 

③ Truncated BPTT

위의 큰 시계열 데이터에 대한 일반적인 역전파에 문제가 있기 때문에

큰 시계열 데이터를 취급할 때는 길어진 신경망을 적당한 지점에서 잘라내어 작은 신경망 여러 개로 만든다는 아이디어를 냅니다.

그리고 이 작은 신경망에서 오차 역전파법을 수행합니다.

이것이 Truncated BPTT입니다.

 

역전파의 연결을 적당한 지점에서 끊고 

역전파가 연결되는 일련의 RNN 계층을 '블록'이라고 합니다.

 

이처럼 역전파의 연결을 잘라버리면 그보다 미래의 데이터에 대해서 생각할 필요가 없습니다.

각각의 블록 단위로, 미래의 블록과는 독립적으로 오차역전파법을 완결시킬 수 있습니다.

 

신경망의 연결을 끊되, 제대로 구현하려면 '역전파'의 연결만 끊어야 합니다.

그 잘라낸 신경망 단위로 역전파를 통해 학습을 수행합니다.

순전파의 흐름은 끊어지지 않고 전파해야하기 때문에 순전파의 연결은 반드시 그대로 유지해야 합니다.

그러므로 데이터를 'sequential'하게(순서대로) 입력해야 합니다. 

 

전까지 봤던 신경망에서 미니 배치 학습을 수행할 때 데이터를 무작위로 선택해 입력했지만,

RNN에서 Truncated BPTT를 수행할 때는 데이터를 '순서대로' 입력해야 합니다.

 

Truncated BPTT을 수행하는데 RNN 계층을 길이 10개 단위로 학습할 수 있도록 역전파의 연결을 끊었을 경우의 전체적인 그림은 다음과 같습니다.

빨강색과정 : 역전파과정 ( 10개씩 분리된 것을 확인 가능)

이런 식으로 순전파의 연결을 유지하면서 블록 단위로 오차 역전파법을 적용할 수 있습니다.

 

이렇게 역전파가 끊어짐에도 불구하고 학습이 잘 되는 이유를 알려면 가중치들이 갱신되는 원리와 학습 과정 일부를 이해한다면 알 수 있습니다.

 

위의 RNN 계층 그림도 사실 하나의 계층에 대해서 시간적으로 나타낸 것이기 때문에

본질이 하나이므로

가중치들(Wx, Wh, b)은 모두 같아야 합니다.

하지만 Truncated 기법을 도입하면서 역전파가 끊어지게 되므로 가중치 조건에서 어느 정도 변화가 생깁니다.

그 변화는 같은 블럭 내부의 계층들 마다의 가중치 조건은 모두 같지만

서로 다른 블럭들의 가중치 조건은 다르다는 것입니다.

(여기서 가중치 조건이랑 가중치 값 그 자체를 말함)

가중치 갱신이 다음과 같이 일어나기 때문입니다.

 

가중치 갱신은 첫 번째 블록이 블록 내부에서 순전파를 실행하고 

역전파 과정을 거쳐서 기울기를 바탕으로 갱신 된 가중치 조건들이

두 번째 블록의 가중치 초기 조건으로 사용됩니다.

마찬가지로 두 번째 블록의 계층들이 해당 초기 가중치 조건으로 순전파를 진행한 후

다시 끝에서 처음까지(블록 안 기준) 역전파를 해서 갱신된 가중치 조건들이 

세 번째 블록의 가중치 초기 조건으로 사용됩니다.

이런식으로 반복이되고 이를 통해

기존 블록의 갱신된 가중치가 다음 블록으로 넘어가서 실행되고 갱신되므로

역전파를 끊어서 사용해도 학습에 크게 지장이 없다는 것을 알 수 있습니다. 

 

그래서 Truncated BPTT는 일반 BPTT에서 역전파 부분을 끊어주어서 계산비용을 줄여주고,

과거에 대한 정보를 기억하기 위해서 순전파는 유지를 시켜주는 형태로 구성된 것입니다.

 

④ Truncated BPTT의 미니 배치 학습

지금까지의 설명은 미니배치 수가 1일 때를 설명한 것입니다.

미니 배치를 사용하는 것이 좋은 측면이 있기 때문에 

미니 배치를 하려면 데이터를 주는 시작 위치를 각 미니 배치의 시작 위치로 '옮겨줘야' 합니다.

 

'옮긴다'라는 뜻을 길이가 1000인 시계열 데이터에 대해서 시각의 길이를 10개 단위로 잘라 Truncated BPTT로 학습하는 경우를 예로 설명하겠습니다.

 

이때 미니 배치의 수를 2개로 구성한다고 하면,

첫 번째 미니 배치 때는 처음(0번)부터 순서대로 499번 까지 10개씩 묶을 것이고

두 번째 미니배치 때는 500번째 데이터를 시작 위치로 정하고 999번까지 10개씩 묶어서

첫 번째 배치와 두 번째 미니 배치를 합쳐서 비로소 배치의 수가 2개인 데이터가 되는 것입니다.

그리고 미니 배치별로 데이터를 제공하는 시작위치를 옮겨줍니다.

위의 그림대로 하면 배치가 2이므로 총 500개의 데이터가 나올 것임

이처럼 미니배치 학습을 수행할 때는 각 미니 배치의 시작 위치를 오프셋으로 옮겨준 후 순서대로 제공하면 됩니다.

또한 데이터를 순서대로 입력하다가 끝에 도달하면 다시 처음부터 입력하도록 합니다.

 

 

(위의 내용은 밑바닥부터 시작하는 딥러닝 2 (한빛미디어)를 바탕으로 글을 작성하였습니다)

'It공부 > Deep learning' 카테고리의 다른 글

(2)-5-3 RnnLM 구현  (0) 2021.02.10
(2)-5-2 RNN 구현  (0) 2021.01.22
(2)-4-2 개선된 word2vec 학습  (0) 2021.01.20
(2)-4-1 word2vec 속도 개선  (0) 2021.01.19
(2)-3-2 word2vec 보충  (0) 2021.01.18
Comments