순환 신경망(RNN) - 순차 데이터의 이해

순차 데이터의 이해

  • 우리가 순환 신경망을 사용하는 이유입력을 순차데이터로 받거나 출력을 순차데이터으로 내기 위해서이다.

순차 데이터(Sequential Data)

  • 일정한 시간차를 갖는 Time Series라면, x축이 특정 시간을 의미하는 Temporal Sequence와는 다르게 하나하나의 Step으로 간주한다.

Resampling

  • 일반적으로는 위에서 보는 것과 같이 Temporal Sequence를 보간하여 Time Series로 변환해 준 뒤에 사용한다.

심층 신경망과 순차 데이터

다중 입력, 단일 출력

  • 개인 비서 서비스는 예를 들어, siri나 구글의 okay google 같은 서비스이다.

다중 입력, 다중 출력

단일 입력, 다중 출력

기본 적인 순환 신경망(Vanilla RNN)

순차 데이터의 처리

  • 앞서 말한 순차데이터를 입력받아 원하는 출력을 하려면, 기억시스템이 전제되어야 한다. CNN이나 Deep Neural Network, shallow NN은 Memoryless System이다.

기억 시스템(Memory System)

얕은 신경망(Shallow Neural Network)

  • 다음 그림에서 볼 수 있듯이, RNN은 이전의 Network 구조와는 다르게 입력층에 n-1번째 step의 hidden layer를 n번째 데이터와 concatenation을 하여 사용하는 것이다. 이렇게 함으로써 이전의 모든 입력에 영향을 받는다.

기본적인 순환 신경망(Vanilla Recurrent Network)

  • shallow Neural Network를 Deep Neural Network로 만들어 주었듯이, 동일하게 하여 Multi-Layer RNN을 만들 수 있다. 왼쪽의 노드들만 본다면 다음 Layer들의 이전 step의 hidden Layer를 가져온 것을 확인 할 수 있다. 하지만, 이런 구조는 Vanilla RNN과 다르게 Hidden Layer의 길이도 2배이상으로 늘어나기 때문에, 복잡도가 높아지게 되며, 현실적으로 학습이 잘 되지 않아 권장되지 않는다. 그 이유는 간단하게만 말하자면, 일반적인 Neural Network는 depth 방향으로만 gradient가 잘 학습되면 되지만, 이 구조는 input까지 Gradient의 영향을 주도록 해야하기 때문이다.

다중 계층 순환 신경망(Multi-Layer RNN)

심화 순환 신경망

  • 그렇다면 'Vanilla RNN이 왜 잘 쓰이지 않는가?'에 대한 가장 큰 이유를 앞서 언급했던 것과 같이 Gradient가 Input까지 타고 가서 학습을 잘 못하기 때문이라고 언급했다. 즉, Gradient Vanishing 문제라는 것이다.

기울기 소실 문제

LSTM(Long Short-Term Memory)

Cell State, Hidden State

Forget Gate

  • 검정색 선이 Input Gate이다. 빨간색 선은 Vanilla RNN에서의 Hidden State와 동일하다. 입력이 들어오고 이전 Hidden State를 받아서 같이 tanh activation function을 FC(Fully connected) Layer를 통과시켜 출력을 내주면 RNN의 Hidden Layer이기 때문이다.

Input Gate

  • 해당 Layer에서 필요한 정보만을 출력층으로 내주고, 필요하지 않은 정보는 계속 기억하게끔 다음 time step으로 넘겨주어서 이전에 어떤 출력을 내주었었나를 Cell State와는 별개로 또 넘겨주어 기억하게끔 한다. 아래 그림에서 출력을 내보내기 위해 Cell State에서 tanh를 거쳐 주는데 이 작업은 다른 activation function들이 존재하는 노드들과 달리 FC layer로 이루어져 있지 않고 그냥 activation function만 거치게 된다. 그 이유는 Cell State가 Forget gate를 지나면서는 0~1사이의 값이 곱해지므로 크게 문제가 없지만 Input Gate를 지나면서 Feature가 추가적으로 더해질때 tanh를 지나면 -1~1사이의 값이 되므로 범위 -2~2로 늘어나게 되어 추후에 Gradient Explode가 일어날 수 있어 예방차원에서 tanh을 사용하는 것이기 때문이다.

Output Gate

GRU(Gated Recurrent Unit)

GRU의 구조

  • 아래 그림에서 $1 - Forget Gate$를 Input Gate로 사용하는 것은 Forget Gate에서 잊어버린 만큼만 Input Gate를 통해 채워 주는 의미로 해석할 수 있다.

Forget Gate & Input Gate

  • Input Gate를 통해 새로운 Feature가 추가되기에 앞서서 이전 Hidden State 정보를 얼마나 잊게 하느냐의 의미인데, 예를 들어 앞의 문장이 .을 통해 마쳐졌다면, 그 뒤의 문장은 다른 문장 구조를 띄게 되므로 0에 가깝게 하여 Reset을 시켜줄 것이다.

Reset Gate

시간펼침 역전파 학습법(BPTT: Back Propagation Through Time)

  • 순환신경망은 기존의 기본적인 역전파 학습법으로는 학습할 수 없다. 그렇다면, 어떻게 해야할까?

순차 데이터 셋의 구조

다중 입력, 단일 출력의 학습

  • 물론, 모델이 학습할때 언제 입력이 끝날지 모르기에 마지막 입력 같은 경우는 EOS(End Of Sequence)라는 특별한 미리정해준 하나의 토큰을 날려주는 경우가 많다.

순환 신경망의 순방향 추론

  • 아래의 그림은 Input의 시점에 따라 펼쳐져있다는 것을 이해하기 쉽게 펼쳐 놓은 것인데, 여기서 주의할 점은 아래의 RNN안의 Hyper parameter들은 모두 동일하다는 것이다. 즉 아래의 그림은 재귀적형태를 시간의 흐름상으로 나열해 놓은 것이라고 생각하면 된다.

시간 펼침 역전파(Back Propagation Trough Time)

  • 위에서 언급했던 것과 같이 출력(또는 입력)의 길이가 정해져있지 않은 RNN의 경우, 아래는 마지막 출력에 EOS 출력을 내게끔 학습시켜야 모든 출력이 나왔다는 것을 알 수가 있다. 또한, Back propagation도 마찬가지로 각각의 출력에 대한 Loss값 부터 시작해서 Input지점까지 해주면 된다. 단일 입력, 다중 출력의 실제 모델에서는 입력이 없는 다른 층에서는 0을 입력하거나 미리 정해놓은 입력을 넣어주어 학습을 시키는 것이 일반적이다.

단일 입력, 다중 출력

  • 다중 입력에 대해서 다중 출력이 나오려면 2가지 상황이 있을 수 있다. 하나는 아래 그림에서와 같이 입력에 대해서 출력이 나오고 입력이 끝나면 출력도 끝나는 것이 있을 수 있다.
    이런 경우는 대표적으로, 동영상의 프레임 분류가 있다. 예를 들면, CF의 한 프레임이 입력으로 들어와 각 장면이 어떤 장면인지 서술하는 식으로의 분류를 들 수 있을 것이다.

다중 입력, 다중 출력 - 01

  • 또 다른 한 상황은 모든 입력을 받고 그 다음에 출력이 나오는 경우가 있다. 이 경우도 마찬가지로 입력의 길이가 언제 끝날지 모르므로 마지막 입력에 EOS를 날려 주어야 한다.

다중 입력, 다중 출력 - 02

심화 순환 신경망의 수식적 이해

  • Vanilla RNN의 수식은 이전에 간단히 다루었다. 이제 LSTM과 GRU도 수식으로 접근해 보자.

LSTM 수식

  • 특징이 여러차원으로 되어있는데, 이 Forget gate 또한 여러 차원으로 되어있어 특징별로 기억할지 말지를 결정할 수 있다.

Forget gate

Input gate

Cell state

Output gate

Hidden state

GRU

  • Reset gate는 Hidden state에서 바로 잊는 Forget gate와는 다르게 현재 Feature를 뽑을 때 얼만큼 잊어줄 것인가를 결정하는 부분이다. 큰 맥락에서는 기억하고 있어야 하지만, 현재 Feature를 뽑을 때는 방해가 될 수 있는 정보를 잊게하는 역할이다.

Reset gate

  • 예를 들어 아래와 같은 상황일때, 마지막 박 아무개의 답을 추론하고자 한다면, 먼저 “나는 사과가 좋다.”, “너는 과일을 싫어한다.”라는 문장 2개는 분리가 된 문장이지만 “나는 사과가 좋다” 내에서는 ‘나’하고 ‘사과’는 잘 기억이 되어야 하지만 “너는 과일을 싫어한다”라는 문장은 다른 문장이므로 기억이 안되어야 할 것이다. 하지만, “나는 어떤 과일이 먹고 싶을까?”에 답을 하려면, 최근에 문장인 “너는 과일을 싫어한다”에서는 추론할 때 필요한 정보가 없기 때문에 그 이전 문장인 “나는 사과가 좋다.”는 context를 계속해서 가지고 있어야한다. 이 정보가 Hidden state를 타고 움직여야 하는 정보이고, 여기서 “나는 사과가 좋다.”와 “너는 과일을 싫어한다.”라는 문장을 구분하여 단계적으로 활용하지 않기 위한 작업이 Reset gate를 통한 작업이다.

Reset gate 예시

  • Reset gate와 다르게 Hidden state에 직접적으로 곱해져서 이전 time step Hidden State에서 기억을 잊어버리게 하는 역할을 한다. 잊어버린 부분만큼을 다시 새로운 정보로 보충하기 위해 1에서 뺀 만큼을 새로운 입력의 결과에 곱해준다.

Forget gate

  • 이전 time step의 Hidden state가 들어왔을 때 reset gate를 통해 제어가 된 것을 가지고 현재 Feature들을 뽑아주게 되고, Forget gate에서 의해서 제어가 된 만큼 넘어오고 Forget gate에 의해서 상보적인 만큼 다시 새로 뽑은 Feature를 입력을 받아서 다음 출력으로 나가게 된다. 그렇기에 값이 -1~1로 bound되어있어 LSTM과 다르게 tanh함수가 필요하지 않다.

Hidden state

순차 신경망에서 Tensor의 이해

순차 데이터셋

전결합 계층의 입출력 텐서

  • 데이터가 Feature같은 경우에는 항상 꽉차게 되는데, 순차데이터 같은 경우에는 길이가 L보다 짧을 수 있다. 그런 경우에는 앞을 0으로 채워준다.(pre-padding)

RNN의 입력 텐서 - 01

RNN의 입력 텐서 - 02

RNN의 출력 텐서 - 01

  • 출력이 나오는 시점은 고정되므로 일관되게 앞쪽으로 정렬된 출력이 나올 수 있게 하기 위해서 뒷부분을 0으로 채운다.

RNN의 출력 텐서 - 02

순환 신경망의 학습법

BPTT

BPTT 데이터 입력

  • 시간에 대해서 펼쳐있고, 추가적으로 Batch로도 펼쳐 주어야 하는데, 즉, 아래와 같은 구조가 Batch size만큼 더 있어주어야 한다는 의미이다. 그래서 시간적으로 펼칠 때 역전파를 위한 추가적인 메모리가 필요하다. 일반적인 CNN이나 DNN은 시간적으로 펼치는 것이 없기 때문에 Batch에 대해서 크게 엄격하지 않다. 하지만 RNN은 아래와 같이 시간적으로 펼치기 때문에 Batch size를 늘리는데 엄격하다.

BPTT의 배치 학습법

  • 순차 데이터의 길이 L이 매우 클 경우, 시간 펼침이 늘어나면서 필요 메모리가 L배 증가한다. 그 이유는 길이가 1개 씩 늘어날 때마다 펼침을 하나씩 더 해야하기 때문이다. 이 때 B(Batch)를 한번에 계산하므로, 얕은 신경망에 비해 훨씬 큰 메모리가 필요.

BPTT의 문제점

다중 입력, 다중 출력

Truncated BPTT 데이터 입력

  • 길이 L의 입력을 길이 T로 쪼개어 순서대로 학습한다.
    Truncated BPTT

  • 즉, Time step이 T 이상 떨어진 입-출력 관계는 학습되지 않는다. Hidden state와 Cell state를 통해 Forward propagation에서는 잘 추론 할 수 있도록 넘겨 주지만, Back propagation에서는 그 관계를 서로 넘겨주지 못한다. 만약 전부다 연결시킨 관계를 학습시켜야 한다면 Truncated BPTT가 아닌 길이가 L인 모든 데이터를 학습시켜야 한다. 그러므로 Truncated BPTT를 사용할 시 반드시 영향을 주는 데이터 사이의 관계를 침해하지 않게 T로 적절하게 나누어졌는지, 우리가 학습하고자 하는 것이 어느 정도의 시간차이까지 우리가 연관성을 봐야 하는지를 염두해 두고 학습을 시켜야 한다.

  • 만약 연관성이 있는 데이터의 주기(데이터간의 시점 차이)가 크고 Gradient가 끊기지 않고 연결되어 업데이트가 이루어져야 한다면, 최대한 Batch Size를 극단적 낮추고, 최대한 Memory가 큰 GPU를 사용해서 최대한 긴 길이를 학습해 주는 방법을 사용해야 할 것이다.
    Truncated BPTT의 역전파 흐름