@ 10. Recurrent Neural Net(RNN)
@ 학습목표
1. 재현 신경망의 학습 원리를 이해할 수 있다.
1. 재현 신경망이 가진 그라디언트 손실 문제를 이해할 수 있다.
1. 언어 모델로써 재현 신경망이 어떻게 글을 생성하는지 이해할 수 있다.

@ 재현 신경망의 원리.
시계열 데이터 학습 모델
재현 신경망은 시계열 데이터를 확률적으로 모델링 하는 모델이다.
시계열 데이터는 연속된 데이터들의 집합으로 나타난다. 시계열 데이터 $X = (x_{1}, x_{2}, ..., x_{T})$
X가 나타날 확률
$p(X)=p(x_{1}, x_{2}, ..., x_{T})$ joint probability 로 계산하는 경우, joint probability는 conditional probability를 사용해서 아래와 같이 표현할 수 있다.
$p(X)=p(x_{T}|x_{1}, x_{2}, ..., x_{T-1})...p(x_{3}|x_{1}, x_{2})p(x_{2}|x_{1})p(x_{1})$
$p(X)=\prod\limits_{t=1}^{T} p(x_{t}|x_{until (t-1)})$
재현 신경망은 매시간 단위 T마다 이전 스텝의 정보를 포함한채 다음의 확률들을 계산해 준다.
$p(x_{T}|x_{until T})=g(h_{T-1})$
$h_{T-1}=\phi(x_{T-\nu}, h_{T-1})$ $\phi$ is non-linear activation function.
따라서 재현 신경망에서는 은닉층이 이전상태의 정보 즉 컨텍스트를 가지고 있다고 해서 다음과 같은 관계가 성립한다.
은닉층 = 컨텍스트 층 = 히스토리 층
역전파를 사용하여 모델 파라미터를 학습.

@ 재현 신경망에서 학습 가능한 파라미터는 주로 U, W, V 세가지이다.
$s_{t}=\tanh{(Ux_{t}+Ws_{t-1})}$
$y_{t}'=softmax(Vs_{t})$
6ebbce85-076e-41cb-99b0-1a5ae4e93931 재현신경망은 다층 퍼셉트론과 달리 은닉층들의 유닛끼리 모두 연결되어있다. 은닉층 사이 연결에서 있는 가중치가 W이다.
t 시점에서의 은닉층의 출력을 구하려면 $s_{t}=\tanh{(Ux_{t}+Ws_{t-1})}$ 으로서 t-1 시점의 은닉층 출력과 t시점에서 입력 x가 들어간다.
tanh(-1과 1을 점근)는 sigmoid(0과 1을 점근) 랑 비슷한 s자 모양 함수이다.
위에서 나온 $s_{t}$에 은닉층-출력층 사이 weight를 곱하여 softmax에 넣고 예측값을 생성한다.
$y_{t}'=softmax(Vs_{t})$

@ 이러한 은닉유닛들은 연속된 벡터공간에서 오래전 데이터 정보(이전 시간에서의 은닉유닛에서 저장되어있는 혹은 출력되는 정보)를 저장하고 있다. 때문에 이전 정보가 관여되어있어서 새로운 시점에서의 은닉유닛은 이전시점에서 계산된 은닉정보를 반영하고 있다는 의미이다. 쭉쭉 뒤로 가보면 가장 처음 시작의 은닉유닛의 정보도 가지고 있다. 즉, 은닉 유닛들은 연속된 벡터공간에서 오래전 데이터 정보를 저장한다.
위와같은 특성때문에, 많은 수의 뉴런과 시간이 주어진다면 재현 신경망은 어떠한 시계열 데이터도 학습할 수 있다.

@ 재현 신경망의 loss function.
$y_{t}$ 는 클래스 정보를 갖고 있는 이진 벡터이다.
t 시점에서 loss function 은 정답 클래스의 마이너스 로그 확률 이다.
시계열 데이터 집합 $X=(x_{0}, x_{1}, x_{2}, x_{3}, x_{4})$ 의 손실 함수는 각 시점에서의 loss function의 총합이다.
예를들어 시점 2에서의 loss function $L_{2} = L_{0}+L_{1}+L_{2}$
어떤 모델에서 출력 유닛의 갯수만큼의 dimension을 가진 벡터로서의 출력이 있을것이다.
실제로모델이 출력해야할 출력벡터가 있을 것이다.
그런데 클래스 분류 문제이기 떄문에 실제 모델이 예측해야할 출력은 한 dimension만 1이고 나머지는 0 인 2진 벡터일 것이다.
즉, 1로 켜져있는 dimension만 해당하는 클래스 라는 뜻이고 나머지 0 으로 적여져 있는 dimension 은 해당 클래스가 아니라는 뜻이다. 각각의 dimension은 클래스를 의미한다.
출력벡터에서 각각의 dimension 들은 0에서 1 사이의 실수값을 가진다. 그럼 재현 신경망이 관심이 있는 것은 1로 켜져있는 이 dimension의 값이 얼마나 1에 가까운지 관심이 있다.
예를들어 어떤 모델이 출력한 벡터의 5번째 dimension 이 0.7 일때, 이 모델의 loss function은
$\log{(0.7)}$ 이다. -가 붙은 log 함수 그래프를 생각해보자.
모델의 출력값이 1이면 loss 가 0이다. 1보다 살짝 안되면 어떤 양수값을 가진다. 이렇게 마이너스 로그 확률을 계산 해주는데 이것을 negative log likelihood 라고 한다. 신경망에서는 cross entropy 라고 한다.
시점 t에서의 단편적 $E_{t}(y_{t},y_{t}')=-y\log{y_{t}'}$

@ 재현 신경망은 시계열 데이터에 대한 모델이기 떄문에 각 시점마다 $X=(x_{0}, x_{1}, x_{2}, x_{3}, x_{4})$ 각 모델들이 예측을 한다. 각각의 예측을 $y_{0}', y_{1}', y_{2}', y_{3}', y_{4}'$ 이라 하자.
실제로 모델이 예측해야하는 값은 $y_{0}, y_{1}, y_{2}, y_{3}, y_{4}$ 이라 하자.
그럼 loss 가 5개가 만들어진다. 이 loss의 총합이 전체 X라는 시계열 데이터의 loss 값이다.
시점 t에서의 총 $L(y_{t}, y_{t}')=L_{1}(y_{1},y_{1}') + L_{1}(y_{1},y_{1}') + ... + L_{1}(y_{1},y_{1}')$
$L(y, y')={\sum}L_{t}(y_{t},y_{t}')$
$L(y, y')=-{\sum}y_{t}\log{y_{t}'}$

@ 재현 신경망도 오류 역전파 과정을 통해 학습을 한다고 했다.
재현 신경망은 시간에 대한 오류 역전파 과정을 어떻게 하는지 알아보자.
각각의 파라미터가 에러에 얼마나 영향을 미치는지 계산을 한다.
Back Propagation Through Time(BPTT)
예를들어, t=3 에서 loss function에 대한 파라미터 W의 그라디언스 값을 계산해보자. 즉, 시점 3에서 에러 $E_{3}$이 발생했을 때 W에 대한 $E_{3}$의 미분, 기울기, 변화량, W가 $E_{3}$ 에 얼만큼 영향을 미치는지를 알아보자.
그런데 최적화 과정을 통해 W값이 변화할 때마다 에러값들이 변화할 것이다.
먼저 그 과정을 보면 먼저 은닉유닛을 계산한다.
$s_{t} = \tanh(Ux_{t}+Ws_{t-1})$
그다음 예측값을 계산한다.
$y_{t}'=softmax(Vs_{t})$
이 예측값에 따라서 에러값 $E_{t} = y_{t}-y_{t}'$ 가 결정이 된다.
이것의 의미는 hidden unit에서 weight W는 곧바로 에러에 영향을 미치는게 아니라 업데이트된 W가 처음에는 은닛유닛 $s_{t}$ 에 영향을 미칠것이고 이 은닉값이 예측값 $y_{t}'$ 에 영향을 미칠 것이다. 그리고 이 예측값이 에러값 $E_{t}$ 에 영향을 미칠 것이다. 이렇게 W에 의한 $E_{t}$ 의 영향, 변화량, 기울기를 구할 때 바로 구할수 있는게 아니라 체인룰을 사용하여 미분을 해서 구하게 된다.
$\frac{\partial{E_{3}}}{\partial{W}} = \frac{\partial{E_{3}}}{\partial{y_{3}'}} \frac{\partial{y_{3}'}}{\partial{s_{3}}} \frac{\partial{s_{3}}}{\partial{W}}$
$\frac{\partial{E_{3}}}{\partial{y_{3}'}}$ output vector 에 대한 값, $\frac{\partial{y_{3}'}}{\partial{s_{3}}}$ hidden vector 에 대한 값, $\frac{\partial{s_{3}}}{\partial{W}}$ hidden weight parameter 에 대한 값들을 곱해서 구할 수 있다는 의미이다.

@ 분류과정.
재현 신경망에서 t=3 일때, 은닉유닛 $s_{3}$의 값을 계산하는 공식은
$s_{3} = \tanh{(Ux_{3}+Ws_{2})}$
위 수식에서 보다시피 $s_{3}$ 는 W에 영향을 받는 동시에 $s_{2}$ 에 의해 영향을 받는다.
그리고 $s_{2}=\tanh{(Ux_{2}+Ws_{1})}$ 이므로 $s_{2}$ 는 다시 W와 $s_{1}$ 에 의해 영향을 받는다고 유추할 수 있다.
그리고 또 $s_{1}=\tanh{(Ux_{1}+Ws_{0})}$ 이므로 $s_{1}$ 은 W와 $s_{0}$ 에 의해 영향을 받는다고 할 수 있다.
$s_{3}$는 $s_{2}$에 의해 영향을 받고, $s_{2}$는 $s_{1}$에 의해 영향을 받고, $s_{1}$는 $s_{0}$에 의해 영향을 받는 위와같은 특성때문에 $\frac{\partial{s_{3}}}{\partial{W}}$ 를 구할때, 한번에 구할 수 있는게 아니라 여러단계로 나뉘어야한다.
이말은 곧, $s_{3}$ 에 대한 $s_{2}, W, s_{1}$ 의 변화량을 계산해야 한다는 것이다.
하지만 $s_{2}$ 는 $s_{1}$ 과 W에 의해 영향을 받으므로 $s_{2}$ 를 상수로 볼 수 없다. 그래서 미분을 해줘야한다.
정리하자면,
$\frac{\partial{E_{3}}}{\partial{W}} = \frac{\partial{E_{3}}}{\partial{y_{3}'}} \frac{\partial{y_{3}'}}{\partial{s_{3}}} \frac{\partial{s_{3}}}{\partial{W}}$ 을 구하고자 했는데 이 수식에서 문제가 되는 부분은 $\frac{\partial{s_{3}}}{\partial{W}}$ 이 부분이다. 왜냐하면 $s_{3}$ 가 단순히 W에 대해 간단하게 영향을 받는게 아니라 $s_{2}$와 $s_{1}$ 에 대해서도 영향을 받기 때문이다. 우리가 계산하려고 했던 식이 앞의 식인데, W에 대한 $s_{3}$의 미분이 간단하게 계산이 이루어 지는게 아니므로, $s_{2}, s_{1}, s_{0}$ 와도 영향이 있기때문에 가중치 W가 $s_{2}, s_{2}, s_{2}$ 에 미치는 영향들을 구해서 다음과 같이 다 더해줘야한다.
$\frac{\partial{E_{3}}}{\partial{W}} = \frac{\partial{E_{3}}}{\partial{y_{3}'}} \frac{\partial{y_{3}'}}{\partial{s_{3}}} \frac{\partial{s_{3}}}{\partial{W}}$
$\frac{\partial{E_{3}}}{\partial{W}} = \frac{\partial{E_{3}}}{\partial{y_{3}'}} \frac{\partial{y_{3}'}}{\partial{s_{3}}} \frac{\partial{s_{3}}}{\partial{W}} + \frac{\partial{E_{3}}}{\partial{y_{3}'}} \frac{\partial{y_{3}'}}{\partial{s_{3}}} \frac{\partial{s_{3}}}{\partial{s_{2}}} \frac{\partial{s_{2}}}{\partial{W}} + \frac{\partial{E_{3}}}{\partial{y_{3}'}} \frac{\partial{y_{3}'}}{\partial{s_{3}}} \frac{\partial{s_{3}}}{\partial{s_{1}}} \frac{\partial{s_{1}}}{\partial{W}} + \frac{\partial{E_{3}}}{\partial{y_{3}'}} \frac{\partial{y_{3}'}}{\partial{s_{3}}} \frac{\partial{s_{3}}}{\partial{s_{0}}} \frac{\partial{s_{0}}}{\partial{W}} $ sum 을 사용해 나타내면,
$\frac{\partial{E_{3}}}{\partial{W}} = {\sum\limits_{k=0}^{3}} \frac{\partial{E_{3}}}{\partial{y_{3}'}} \frac{\partial{y_{3}'}}{\partial{s_{3}}} \frac{\partial{s_{3}}}{\partial{s_{k}}} \frac{\partial{s_{k}}}{\partial{W}}$
그런데 더 복잡해 진다는 안좋은 소식을 전하자면, $s_{0}$ 이 $s_{3}$ 에 미치는 영향 $\frac{\partial{s_{3}}}{\partial{s_{0}}}$ 을 보면 다시 다음의 과정을 거친다. $s_{0}$ 가 $s_{1}$ 에 영향을 미치고 $s_{1}$ 이 $s_{2}$ 에 영향을 미치고, $s_{2}$ 가 $s_{3}$에 미치는 영향이 곧 $s_{0}$ 가 $s_{3}$에 미치는 영향이다.
$\frac{\partial{s_{3}}}{\partial{s_{0}}} = \frac{\partial{s_{3}}}{\partial{s_{2}}} \frac{\partial{s_{2}}}{\partial{s_{1}}} \frac{\partial{s_{1}}}{\partial{s_{0}}}$ 위의 내용을 sum과 함께 product 를 사용해 나타낸다.
$\frac{\partial{E_{3}}}{\partial{W}} = {\sum\limits_{k=0}^{3}} \frac{\partial{E_{3}}}{\partial{y_{3}'}} \frac{\partial{y_{3}'}}{\partial{s_{3}}} \frac{\partial{s_{3}}}{\partial{s_{k}}} \frac{\partial{s_{k}}}{\partial{W}}$
$\frac{\partial{E_{3}}}{\partial{W}} = {\sum\limits_{k=0}^{3}} \frac{\partial{E_{3}}}{\partial{y_{3}'}} \frac{\partial{y_{3}'}}{\partial{s_{3}}} {\prod\limits_{j=k+1}^{3}} \frac{\partial{s_{j}}}{\partial{s_{j-1}}} \frac{\partial{s_{k}}}{\partial{W}} $

@ 위에서 얘기된 과정이 BPTT(시간에 대한 오류 역전파 과정) 이라고 불린다.
이 과정은 $\frac{\partial{E_{3}}}{\partial{W}} = {\sum\limits_{k=0}^{3}} \frac{\partial{E_{3}}}{\partial{y_{3}'}} \frac{\partial{y_{3}'}}{\partial{s_{3}}} {\prod\limits_{j=k+1}^{3}} \frac{\partial{s_{j}}}{\partial{s_{j-1}}} \frac{\partial{s_{k}}}{\partial{W}} $ 와 같이 그라디언트 계산 과정에서 다수의 곱셈이 필요하다.
시간에 따른 오류 역전파 과정이 생기는 이유는 업데이트된 같은 파라미터 W를 매시간 단위 마다 모든 hidden layer's units 에서 반복해서 사용하기 때문이다.
시점 3에서의 에러 $E_{3}$ 가 단지 입력으로만 역전파 되는 것이 아니라 시간을 거슬러서도 전파가 된다. 이게 바로 시간에 대한 오류의 역전파 BPTT 이다. 도표. 16 28

@ 이 BPTT 를 계산할 때 그라디언트 손실 이라는 문제가 발생 할 수 있다.
다음과 같이 그라디언트를 연속적으로 계산해줘야하는 term이 있었다. $s_{0}$ 가 $s_{1}$ 에 미치는 영향, $s_{1}$ 이 $s_{2}$ 에 미치는 영향, $s_{2}$ 가 $s_{3}$ 에 미치는 영향을 나타내는
$\frac{\partial{s_{3}}}{\partial{s_{2}}} \frac{\partial{s_{2}}}{\partial{s_{1}}} \frac{\partial{s_{1}}}{\partial{s_{0}}}$ 은 다음과 같이 함수의 미분형태로 표현할 수 있다.
$\frac{\partial{s_{3}}}{\partial{s_{2}}} \frac{\partial{s_{2}}}{\partial{s_{1}}} \frac{\partial{s_{1}}}{\partial{s_{0}}} = Ws'(z_{3}) Ws'(z_{2}) Ws'(z_{1}) $ 단, $z_{t} = \tanh{(Ux_{t}+Ws_{t-1})}$ 이다.
활성함수를 미분한 값을 연속적으로 곱해는 모양이다.

@ 활성함수의 미분값 :
tanh를 미분하면 0에서 1사이의 값을 가진다.
sigmoid를 미분하면 0에서 0.25사이의 값을 가진다.
활성함수의 미분값을 여러번 곱해줄 경우 운이 안좋으면 그라디언트의 값이 0으로 수렴할 수 있다. 왜냐하면 각각의 미분값이 0으로 가까워지는 경우에서는 곱해서 0으로 수렴하기 때문이다.
0으로 수렴할 경우 이 의미는 시간에 대한 길이가 깊어질 수록 학습이 잘 되지 않는다는 의미이다. DNN 에서 발생하는 전형적인 문제이다.

@ 그라디언트 손실뿐만아니라 그라디언트 폭발 문제도 발생 할 수 있다.
만약 파라미터 값이 예를들어 W가 100이상으로매우 클 경우.
$Ws'(z_{3}) Ws'(z_{2}) Ws'(z_{1})$ 의 식에서 그라디언트값이 매우 큰 값을 가지게 된다.
그라디언트 값이 매우 커지면 값이 NaN이 되거나 프로그램이 강제 종료된다.
이때 프로그래머는 그라디언트 폭발 문제가 발생했음을 알게된다.
해결책:
그라디언트 클리핑 : 그라디언트값이 너무 큰값을 갖지 못하도록 일정한 임계치 이상을 넘어가면 그 이상은 잘라버린다.
그라디언트 폭발문제보다 그라디언트 손실이 더 큰 문제라고 볼수있다.
그라디언트 폭발은 프로그램 종료에 의해 알아채기 쉽고 해결책이 분명하지만, 그라디언트 손실은 발생 사실을 알기 어렵고 해결책이 불분명하기 때문이다.

@ 재현 신경망의 한계를 넘기위해 그라디언트손실문제를 막기 위해서 제안된 모델이 GRU, LSTM 이다.
GRU(Gated Recurrent Units)
일반적인 재현 신경망은 매시간마다 t 시점에서의 은닉층을 다음과 같은 수식으로 직접계산한다.
$h_{t} = f(Ux_{t}+Wh_{t-1})$
GRU에서는 먼저 현재 입력 데이터와 은닉층을 기반으로 업데이트 게이트(Update Gate)를 계산한다.
$z_{t}={\sigma}(U^{(z)}x_{t}+W^{(z)}h_{t-1})$
그 뒤 리셋 게이트도 계산한다. 수식은 같지만 다른 파라미터를 사용한다.
$r_{t}={\sigma}(U^{(r)}x_{t}+W^{(r)}h_{t-1})$

@ GRU는 이렇게 업데이트 게이트와 리셋 게이트를 계산해준다. 그리고 잠재적인 은닉 유닛을 계산해준다.
일반적인 RNN에서는 은닛 유닛을 $h=\tanh{(Ux+Wh)}$ 로 바로 계산해줬었는데, GRU에서는 은닉 유닛을 바로 계산하지 않고 리셋게이트 $r_{t}$ 와 업데이트 게이트 $z_{t}$ 를 사용하여 은닉유닛을 계산한다.
그런데 잠재적 은닉 유닛은 일반적인 은닉 유닛 계산 방법에 리셋게이트를 적용해준 결과이다.
리셋 게이트는 하나의 벡터인데 각각의 dimension이 0에서 1사이의 값을 가지고 있다. 리셋 게이트 벡터의 각각의 dimension 들은 이전 시점의 히든 유닛에 게이트를 적용해 준것과 같은 역할을 한다.
그래서 만약 리셋 게이트가 0으로 설정되면, 이전 단계까지 계산한 은닉 유닛을 고려하지 않는다.
리셋게이트 벡터가 0벡터이므로 이것을 element wise product $\circ$ 해주므로 이전 시점까지 계산한 은닉 유닛을 고려하지 않는 것이다.
그리고 현재 시점 단계에서만 계산한 정보만 반영을 하는 것이다.
그래서 리셋 게이트는 얼마만큼 내가 이전 시점까지 계산한 은닉 유닛을 잊어버릴지 관여를 해주는 역할을 하게 된다.
업데이트 게이트는 잠재적 은닉 유닛을 계산 한 뒤에 이 잠재적 은닉 유닛을 얼만큼 반영을 해 줄지를 결정한다.
잠재적 은닉 유닛 $h_{t}' = \tanh{(Ux_{t}+r_{t}{\circ}Wh_{t-1})}$
최종 사용할 은닉 유닛은 현재 시점의 잠재적 은닉 유닛과 이전 시점 단계까지 계산한 은닉 유닛을 업데이트 게이트를 사용하여 조합한다.
$h_{t} = z_{t}{\circ}h_{t-1}+(1-z_{t}){\circ}h_{t}'$

@ GRU의 은닉 유닉 계산 과정.
600de53c-c1a5-4d72-8eb7-35729d8add70
인풋 $x_{t}$ 이 먼저 존재하고, 최종적으로 있는 final memory $h_{t}$ 가 은닉유닛이다.
input 서부터 final memory 까지 계산을 해 줘야 하는데
input 이 리셋게이트, 업데이트 게이트를 만드는데 사용이 된다. memory(reset) $\tilde{h}_{t}$ 의 잠재적 은닉 유닛의 후보이다. 이 후보 은닉 유닛을 얼만큼 반영해줄 지를 업데이트게이트와 리셋게이트가 반영을 해 주는 것이다.
리셋게이트는 내가 이전 까지 계산한 은닉 유닛 $h_{t-1}$ 을 새로운 잠재적 은닉유닛 $\tilde{h}_{t}$ 를 계산할 때 얼만큼 잊어버릴지 계산해주고 , 업데이트 게이트는 새로운 잠재적 은닉유닛 $\tilde{h}_{t}$ 를 최종 은닉 유닛 $h_{t}$ 에 얼만큼 반영해 줄지 관여해준다.

@ 정리해보자.
GRU 의 은닉 유닛 계산 과정.
만약 t 시점에서의 리셋 게이트 $r_{t}$ 를 0으로 설정하면 잠재적 은닉 유닛 $\tilde{h}_{t}$ 계산 시 이전 시간 단계의 정보 $h_{t-1}$ 를 고려하지 않는 다는 의미이다.
업데이트 게이트 $z_{t}$ 는 최종 은닉 유닛 $h_{t}$ 을 계산 할 때, 이전 시간의 정보 $h_{t-1}$ 를 얼만큼 조화롭게 반영할지 결정한다.
만약 업데이트 게이트 $z_[t]$ 가 1에 가까울 경우, 이전 시간의 정보 $h_{t-1}$ 를 거의 그대로 복사한다는 의미이다. 이말은 그라디언트 손실이 적어진다는 뜻이다.
만약 리셋 게이트를 모두 1로 설정하고, 업데이트 게이트를 0으로 설정하면 일반적인 RNN 이 되는 것과 거의 같다.
위에서 논의된 수식들
업데이트 게이트 $z_{t}={\sigma}(U^{(z)}+W^{(z)}h_{t-1})$
리셋 게이트 $r_{t}={\sigma}(U^{(r)}+W^{(r)}h_{t-1})$
새로운 잠재적 은닉 유닉 $h_{t}'=\tanh{(Ux_{t}+r{\circ}Wh_{t-1})}$
새로운 은닉 유닛 $h_{t}=z_{t}{\circ}h_{t-1}+(1-z_{t}){\circ}h_{t}'$

@ LSTM(Long Short Term Memory)
LSTM은 GRU보다 게이트(출력게이트)가 하나 더 많다.
최종 은닉 유닛을 계산하는 과정에서 한단계가 더 추가되었다.
두 가지 보조 메모리가 존재한다(잠재 은닉 유닛 $g_{t}$, 셀 메모리 $c_{t}$)
데이터의 갯수가 더 많을 경우 LSTM 을 사용하면 더 좋은 성능을 낼 수 있다.
GRU를 계산할 때 쓰이는 수식들
업데이트 게이트 $z_{t}={\sigma}(U^{(z)}+W^{(z)}h_{t-1})$
리셋 게이트 $r_{t}={\sigma}(U^{(r)}+W^{(r)}h_{t-1})$
새로운 잠재적 은닉 유닉 $h_{t}'=\tanh{(Ux_{t}+r{\circ}Wh_{t-1})}$
새로운 최종 은닉 유닛 $h_{t}=z_{t}{\circ}h_{t-1}+(1-z_{t}){\circ}h_{t}'$
LSTM을 계산할 때 쓰이는 수식들
input gate $i_{t}={\sigma}(U^{(i)}x_{t}+W^{(i)}h_{t-1})$
forget gate $f_{t}={\sigma}(U^{(f)}x_{t}+W^{(f)}h_{t-1})$
output gate $o_{t}={\sigma}(U^{(o)}x_{t}+W^{(o)}h_{t-1})$
candidate hidden state $g_{t}=\tanh{(U^{(g)}x_{t}+W^{(g)}h_{t-1})}$
$c_{t}=c_{t-1}{\circ}f_{t}+g_{t}{\circ}i_{t}$
$s_{t}=\tanh(c_{t}){\circ}o_{t}$
LSTM 에서는 최종출력 유닛 $o_{t}$ 를 계산하는데
@ ESN(Echo State Network) 모델.
재밌는 모델이다.
파라미터 U(h-x), W(h-h)는 학습하지 않는다.
많은 수의 은닉 유닛 개수가 필요하고 유닛들 사이는 매우 sparse 해야한다. W는 거의 다 0이고 일부분만 실수값을 갖는다.
위와같이 했을 때, 길이가 긴 시계열 데이터를 효율적으로 학습할 수 있다.

@ 언어 모델링 문제.
문제의 목표는 문장 W가 나타날 확률 P(W)를 계산하는 것이다.
문장 W는 단어들로 이루어져 있다. 예를들어, M개의 단어들로 이루어져 있을떄, 이 문장을 시계열 데이터로 본 것이다.
P(W) 는 체인룰을 사용하여 단어들의 조건부 확률들의 곱으로 나타낼 수 있다.
$P(W) = P(w(1), w(2), w(3), ..., w(M))$
$P(W) = {\prod\limits}_{k=1}^{M+1}P(w(k)|w(1), ..., w(k-1))$
예를들어, 언어모델은 다음 문장이 나타날 확률을 계산할 수 있다.
W = He went to buy some chocolate.
chocolate 이라는 단어는 He went to buy some 과 연관이 되어있다.
some 이라는 단어는 He went to buy 와 연관이 되어있다.
마지막에 있는 단어들이 그냥 나오는게 아니라 이전 단어들과 연관이 되어잇어서 나온다고 보는 것이다.
그러니까 조건부확률을 본다면 아래와 같다. $P(W) = P(chocolate|He \; went \; to \; buy \; some)*P(some|He \; went \; to \; buy)*P(He \; went \; to \; buy)...$
RNN을 사용하면 매시간 단위마다 단어를 생성할 수 있다.
예를들어, t 시점에서 생성된 단어는 t+1 시점에서의 입력이 된다.
He went to buy some chocolate 이 있을때 처음에 He를 생성하고 He를 바탕으로 went를 생성한다. 마지막에 생성된 단어가 이전에 생성된 단어들에 영향을 받기 때문에 RNN은 언어 모델링 문제를 푸는 좋은 알고리즘이 된다. 매시점 단위마다 은닉유닛은 이전 시간까지 생성한 단어들의 정보를 가지고 있다.
그런데 RNN 은 그라디언트 손실 문제가 있기 때문에 길이가 매우 긴 문장의 경우, 의미 있는 문장을 생성하기 어렵다.
The girl whom I met yesterday is very pretty.
very pretty 가 관련이 있는 단어는 the girl 이다. 가까운 단어들은 연관이 별로 없는 I met yesterday is 이다.
메모리가 필요한 RNN
RNN은 이전 시점에서의 정보를 작은 최종 은닛 유닛 $h_{t}$ 안에 모두 포함해야한다는 문제가 있다.
예를들어, 시계열 데이터 $X=(x_{1}, x_{2}, ...,x_{n})$ 가 있을때, n의 갯수가 매우 크다면 RNN의 최종은닉유닛 $h_{t}$ 은 매우 큰 숫자 n개의 데이터를 모두 가지고 있어야 한다는 문제가 있다. U, W, V
$s_{t}=\tanh{(Ux_{t}+Ws_{t-1})}$
$y_{t}'=softmax(Vs_{t})$
은닉 유닛들은 연속된 벡터공간에서 오래전 데이터 정보를 저장.
길이가 매우 긴 입력 데이터가 주어진다면 은닉 유닛 벡터는 제한된 저장 공간에 많은 입력 정보를 저장해야 함.

@ RNN으로 QA모델을 만든다면 어떻게 할 수 있을까? 굉장히 많은 단어로 이루어진 시계열 데이터인 뉴스데이터를 예로 들어보자. 이 단어들이 순차적으로 시계열 데이터이므로 시간 순서대로 모델의 입력에 들어간다. 각각의 단어들은 어느정도의 연관성을 가지고 있다. 이때 모델에게 질문을 준다. 그러면 모델이 뉴스데이터의 스토리 정보를 바탕으로 답변을 해야한다.
이럴때 RNN은 각각의 단어들을 입력으로 받아서 스토리 정보를 하나의 히든 레이어에서 벡터로 나타내야한다. 그리고 질의 정보를 나타내는 벡터와 함께 조합을 해서 적절한 답변을 생성해야한다.
c7d5fa68-78aa-48bd-8b61-80d594ce674f
@ 길이가 긴 입력데이터를 인코딩 하기 위해서 해결책1은 양방향 RNN을 사용한다. 양방향 RNN은 RNN을 앞방향, 뒷방향으로 2번 돌리는 것이다.
앞방향 RNN : 기존 RNN처럼 원본 문장의 가장 앞의 단어부터 인코딩을 한다.
뒷방향 RNN : 원본 문장의 가장 뒤의 단어부터 인코딩을 한다.
앞방향 RNN을 해서 hidden layer 에서 각각의 unit들은 값을 가지고 있는 상태가 된다.
뒷방향 RNN을 해서 시계열 데이터의 뒷부분부터 인코딩을 해서 역시 hidden layer unit 에 인코딩 된 정보를 갖고있는다.
그리고, 앞방향 RNN으로부터 계산된 은닛 유닛과 뒷방향 RNN으로 부터 계산된 은닉 유닛을 이어붙이면 이 벡터는, 이 은닉유닛은 뒤앞정보부터 앞뒤정보까지 모두다 포함을 하고 있다. 그리고 각각의 처음과 끝말고도 중간에 있는 입력 데이터에 대해서도 은닉유닛에 값을 저장하기때문에 이어붙인 은닉유닛은 뒤의정보와 앞의 정보를 모두 가지고 있다.
0a4b12d4-4194-484a-8057-3de92d4328bf
@ 길이가 긴 입력데이터를 인코딩 하기 위해서 해결책2: 각 시점마다의 히든 유닛 벡터를 RAM에 저장하는 방법이다.
그러면 입력 문장이 들어왔을 때, 각 은닉 유닛의 벡터들을 램에 저장한다. 그리고 질의 정보를 담은 벡터가 들어왔을때 이 질의에 관련된 벡터를 램에서 선택한다. 그 선택된 은닉유닛 벡터와 질의정보를 바탕으로 답변을 생성할 수 있다.

@ 메모리 네트워크의 질의 응답 모듈에서는 크게 스토리 선택 모듈, 답변 선택 모듈 두가지 서브 모듈이 존재하게 된다.
스토리(문장 또는 단어)선택 모듈 : 질의 q에 대해 가장 적절한 답변을 포함하고 있는 스토리(문장 또는 단어) $s^{*}$을 탐색한다.
적절성 평가를 통해 가장 높은 점수를 받은 스토리가 선택된다.
$s^{*} = \underset{s_{t}}{arg\;max}\;G(q, s_{t})$ 뉴스데이터가 있을때, 이것을 램에 저장할 수 있는 방법의 가짓수를 생각해보자.
각각의 문장을 인코딩한다음에 이 인코딩된 문장을 램에 저장할 수도 있고, 아니면 단어를 저장할 수도 있다.
우선 문장별로 저장하는 경우를 생각해보자.
질의에 적절한 답변을 포함하는 문장하나를 램에서 선택할수있다. 선택하는 방식은 적절성 평가함수를 통해서 가장 높은 점수를 갖고있는 문장이 선택되는 것이다. 선택한다음에 질의와 같이 결합을 한다.
결합된 문장이 답변선택모듈의 입력으로 주어진다. 그게 바로 $s_{a}$ 이고 $a_{r}$ 은 답변의 가짓수이다. 메모리 네트워크가 가질수 있는 답변들이 있을 텐데 대게는 하나의 단어로 표현한다. 모델은 뉴스데이터를 보면서 단어집을 만든다. 가능한 단어집에 있는 모든 단어들이 가능한 답이 될수있고 이 단어들과 아까 선택된 문장 $s_{a}$ 와 다시 결합해서 적절성평가 함수 $a^{*} = \underset{a_{r}}{arg\;max}\;H(s_{a}, a_{r})$ 에 넣어 가장 스코어가 높은 단어를 선택한다.