왜 RNN이 필요한가?

순서가 의미를 부여하는 데이터를 Sequence 라고 부른다. 다시 말하면 하나의 input이 하나의 output을 만들어 내기보다는 input 하나하나가 쌓여 output을 만들게 된다.

특히, 이렇게 순서가 중요한 데이터들 중 시간에 따른 의미가 존재하는 데이터를 시계열 (time series)이라 부른다. (예: 주식 가격 데이터)

예: 다음 스펠링 예측

예를 들어 사용자가 triangle이라는 단어를 입력하고 싶다고 해보자. 그러면 사용자는 차례대로 키보드를 통해 t, r i, a, n, g, l, e라는 글자를 타이핑할 것이다. 그리고 결국에 우리가 하고 싶은 것은 사용자가 전부 스펠링을 치기 전에 triangle이라는 단어를 예측하고 차례대로 출력해야 한다.

그러기 위해서는 사용자가 n을 치고 있을 때, 그전에 차례대로 입력한 t,r,i,a를 알고 있어야 한다.

이렇듯 언어 처리는 전반적으로 이전의 데이터들이 context가 되기 때문에 비슷한 방식으로 처리 해야한다. (단어 자동 완성, 다음 단어 예측)

즉, 순서가 중요한 데이터들을 처리하기 위해서는 기존의 Neural Network와는 다르게 메모리를 가지고 있어 이전 입력값이 현재의 출력에 영향을 주어야 한다.

RNN의 구조

정말 간단한 구조의 MLP(Multi layer Perception)과 RNN을 비교해 보자.

MLP
RNN

가장 큰 차이점은 새로 그려진 hidden layer 자기 자신으로 다시 들어가는 화살표이다. 이 화살표들은 이전에 hidden layer에서 계산된 결과값들이 다음 버너 hidden layer의 결과값 계산에 쓰인다는 이야기이다. 즉, MLP와는 다르게 hidden layer의 결과값(t=n)을 계산하기 위해서는 새로운 input(t=n)과 더불어 hidden layer의 이전 결과값(t=n-1)이 필요하다.

예: 'name'이라는 단어의 스펠링 예측하기

 

우리는 RNN을 통해 name이라는 단어의 스펠링을 예측하도록 만들것이다.name이라는 스펠링을 예측한 다는 것은 n을 타이핑 했을 때, a를 예측해야 하고, a를 타이핑 했을 때는 m, m을 타이핑 했을 때는 e를 예측해야 한다.

위의 그림은 hidden layer가 2개인 RNN의 구조이다. 보이다시피 파란색 화살표를 통해 이전 시점의 값을 현재 시점의 값을 계산하는데 사용하게 된다.

위의 RNN을 식으로 풀어 써보면 다음과 같다. (w는 weight, b는 bias이고 activation functino으로 tanh를 사용하였다.)

 

위의 RNN 구조를 시점 별로 풀어서 나타내면 다음과 같다. (여기서 또한 이전의 값을 사용하게 되는 걸 파란색 화살표로 표시하였다.)

output을 처음 계산할 때에는(t=0) hidden layer들의 이전 값들이 없기 때문에 적당한 값을 initial value로 지정해준다. (h1(-1), h2(-1))

RNN의 트레이닝 과정

기본적으로 트레이닝 과정은 MLP의 트레이닝 과정과 비슷하다.

특정 input에 대해 기대하는 정답 output(Label)이 정해져 있다. (n→a, a→m, m→e) 즉, 3개의 input에 대해 3개의 label이 있고, label과 output의 차이를 가지고 loss function을 만들어 gradient descent를 이용하여 weight와 bias들을 업데이트하게 된다.

다만 큰 차이점이라고 한다면 특정 시점의 output을 계산할 때, 그 이전 시점예 계산됐던 값이 필요하다는 점이다. 예를 들어 w22를 업데이트 하고 싶다고 하면 우리는 다음을 구해야 한다.

 

예를 들어 w22를 구하기 위해서는 h2의 이전 값(h2(t-1))을 알아야 하고, 또 h2(t-1)을 구하기 위해서는 h2(t-2)를 구해야 할 것이다. 이처럼 back propagation이 layer의 앞쪽 방향으로만 가는게 아니라 시점도 앞으로 가게 된다. 이를 Back Propagation Through Time (BPTT)라고 한다. 화살표가 좌에서 우로 가는 것뿐만 아니라 위에서 아래로도 내려온다는 것을 생각하면 된다.

RNN의 한계

time sequence가 늘어나면 back prop시에 미분값이 0과 1 사이의 값이 여러번 곱해져서 기울기가 소멸한다. 따라서 트레이닝이 되질 않는다. (gradient vanishing)

⇒ LSTM이나 GRU를 사용한다.

+ Recent posts