본문 바로가기
Research/Deep Learning & Application

RNN 학습 알고리즘, BPTT

by 곽동현 IMCOMKING 2014. 7. 8.

BPTT(Backpropagation Through Time) : RNN의 recurrent한 부분을 시간에 대해서 펼치면 2개의 feedforward neural network로 이루어진 구조로 생각할 수 있다. 이렇게 리커런트 노드를 time step에 대해 k 번만큼 펼친 다음, 그대로 백프로퍼게이션 알고리즘을 적용한다.

이 때 한가지 헷갈리는 점은, 시간에 대해 펼친 recurrent layer가 각 layer마다 동일한 weight를 가져야한다는 조건이다. 이부분이 조금 어려운데 사실은 하나의 리커런트 엣지를 인위적으로 시간에 대해 펼쳐서 해석한 것이기 때문에, 실제로 모든 layer는 같은 edge인 것이라 weight가 같아야 한다.

따라서 똑같이 forward pass로 activation값을 내고, target 값과의 차이인 error를 계산하고, 이 error를 각 node로 미분해서 에러를 백프로퍼게이트한다. 그다음 에러에 대해 weight업데이트를 하는데 이부분이 좀 다르다.

각 레이어마다의 weight는 실제론 동일한 웨이트여야 하므로 모든 업데이트도 동일하게 이루어져야 한다. 따라서 각 layer마다 동일한 위치의 weight에 해당하는 모든 derivative error를 다 더한다음(더하는 거나 평균 내는거나 사실상 같은 의미) weight를 1번 업데이트 해준다.(어차피 edge하나를 펼친거니까 k스텝으로 펼쳐서 k개의 에러를 구한다음, 에러를 하나로 합치고 이 edge에 대해 업데이트 해주면 끝) 사실상 이것이 BPTT의 핵심적인 부분이다. (아래 힌튼이 강의한 동영상이 매우 좋다.)

시간에 대해 펼친다는 의미가 굉장히 중요하며 이는 즉 현재 스텝에서 일어난 오류를 과거의 상태에까지 에러를 전파해서 학습하겠다는 의미이다. 그래서 5스텝 unfold의 경우 현재의 인풋벡터와 과거의 인풋벡터 4개로 총 5개의 최근 인스턴스를 메모리에 들고있어야한다. 5번전까지의 인풋과 연결된 엣지도 학습해야하기 때문이다.


이때 원래의 BPTT는 최초의 time step까지 펼쳐서 학습하는 것인데 이를 간단히 시간 k번 시간까지만 보는 것을 truncated-BPTT라고 한다. 보통 5번가지 본다고 한다.


https://www.youtube.com/watch?v=gPdbTIEMQwY
http://en.wikipedia.org/wiki/Backpropagation_through_time

http://minds.jacobs-university.de/sites/default/files/uploads/papers/ESNTutorialRev.pdf



BackPropagation Trough Time : 백프로퍼게이션을 자기자신으로 오는 weight에 대해서도 n번의 시간만큼 학습시키는 것.(MLP에서의 input weight는 당연히 학습하고, 추가로 타임에대해서도 누적시켜서 n번 에러를 전파함.)

-> 한 노드에는 input weight, output weight, self weight 가 존재한다. 이때 BPTT는 하나의 error에대해서 input weight와 self weight 에대해서 T시간 개수만큼 학습을 반복해서 1번째 시간까지 에러를 전파하는 것이다.
(왜 output weight는 학습을 안할까? -> 원래 뉴럴넷은 기본적으로 input weight는 학습을 하는 것임. self weight 도 input weight의 일종으로 볼 수 있을 듯.)

과정) input과 output을 보고 error를 계산하면, 먼저 현재의 T가 input 과 self weight 를 학습하고 다시 최초 error를 보고 학습을 해서 T-1을 학습한다. 이것을 T번 반복해서 첫번째 시간의 뉴런까지 하나의 에러를 적용시키는 것이다.
(이때 error를 그때그때 계속 주어진 output을 보고 다시 계산하지 않는 이유는, 현재 발견된 에러를 과거까지 전파시키는 것이 목표이기 때문. 만약 매 T 마다 error를 갱신한다면 과거의 기억이 현재의 output을 또학습하는 것이됨.)


이때 BackPropagation 은 계속해서 전파될수록 희미해져, 10차원이 넘어가게되면 학습이 무의미해짐. 이것을 해결하기위해 Hessian Optimization 이 개발됨. 이는 기울기벡터에서 weight 벡터로 미분을 한번더해, 곡률을 구하고 더 빠르게 로컬미니마를 벗어나고 10차원이 넘어서도 에러를 전파시킬 수 있게 해줌.


그러나 Hessian Optimization 은 계산량이 너무 큼.(해시안 매트릭스인, 크기 백터의 제곱만큼의 매트릭스가 필요) 그래서 Hessian Free Optimization 이 나왔다..

Hessian Free Optimization : http://andrew.gibiansky.com/blog/machine-learning/hessian-free-optimization/



BPTT : http://en.wikipedia.org/wiki/Backpropagation_through_time

RNN python_theano code: https://github.com/boulanni/theano-hf

'Research > Deep Learning & Application' 카테고리의 다른 글

CNN, Spectrogram 을 CNN으로 학습  (0) 2015.04.22
TDNN, RNN, LSTM, ESN  (0) 2015.04.15
RNN 학습 알고리즘, BPTT  (2) 2014.07.08
Perceptron, TLU  (0) 2014.06.17
Neural Network의 학습 방법, Gradient Descent, Back-Propagation  (2) 2014.06.17
Activation Function  (2) 2014.06.12

댓글2

  • 2017.06.06 23:27

    비밀댓글입니다
    답글

    • 아 넵 weight에 대한 미분값을 전부 더한다음, 그 weight의 개수만큼 나누어주면 평균이 되는데요.

      결국, gradient의 방향은 동일한데 다만 scale만 바뀌는 것이므로 이는 학습에서 큰 의미를 갖지 않습니다.

      그 이유는 뉴럴 넷의 learning rate에 의해 scale이 또 따로 조정되기 때문이지요 ㅎㅎ