1. RNN

- 어떤 sequence data가 입력 또는 출력으로 들어오는 상황에서 각 타임스텝에서 들어오는 입력 Xt와 이전 타임스텝의 RNN 모듈에서 계산한 hidden state vector ht−1을 받아서 현재 타임스텝의 hidden state vector를 출력하는 형태를 가지고 있다. 매 타임스텝마다 동일한 파라미터를 가진 모듈을 사용하므로, '재귀적인 호출'의 특성을 보여주어 'Recurrent Neural Network'라는 이름을 가지게 되었다.
- 왼쪽 그림 : rolled version diagram
- 오른쪽 그림 : unrolled version diagram
1) RNN 계산 과정

- t : 현재 타임스텝(time step)
- W : RNN 모듈에서 필요한 linear transformation을 정의하는 파라미터. weight.
- ht−1 : old hidden state vector
- xt : input vector at some time step
- ht : new hidden state vector
- fW : RNN function with parameters W
- yt : output vector at time step t (ht를 바탕으로 예측)
- yt는 매 타임스텝마다 예측해야 할 수도 있고(ex. 각 단어의 품사 예측) 마지막 타임스텝에만 예측(문장의 긍정/부정 여부)해야 할 수도 있다.
- hidden state vector의 차원 수는 사용자가 설정하는 하이퍼파라미터이다.
ex) 아래와 같이 xt는 3차원, ht는 2차원이고, FC layer로 구성된 RNN(fW)을 생각해보자.

이 RNN 모듈의 행렬 연산을 살펴보면 다음과 같다.

- ht의 첫 번째 원소 : W의 1행의 앞의 세 원소는 xt와 곱해지고 뒤의 두 원소는 ht−1과 곱해진다. W는 2x5 행렬이다.

- W의 앞쪽을 Wxh라 하고 뒤쪽을 Whh라고 하면 위와 같이 곱해지는 것으로 생각할 수 있다.
- Wxh : xt를 ht로 바꿔주는 역할.
- Whh : ht−1을 ht로 바꿔주는 역할.

- 현재 타임스텝 t에서 예측값이 필요한 경우에는 추가적인 output layer를 만들고 그 output layer에서는 linear transformation matrix인 Why에 ht를 곱함으로써 output인 yt를 구할 수 있다.
- binary classification : yt의 차원은 1차원인 scalar 값. 여기에 추가로 sigmoid를 적용해서 확률 값을 예측한다.
- multiclass 인 경우 : yt는 class 개수만큼의 dimension을 가지는 벡터이다. 추가로 softmax를 통과해서 확률분포를 얻을 수 있게 된다.
2) Types of RNN
(1) One-to-one

- 입력과 출력의 타임스텝이 단 하나. 즉 sequence data가 아닌 일반적인 경우의 구조.
- ex) [키, 몸무게, 나이]의 3-d 벡터 -> 2-d hidden state vector -> 혈압이 저/정상/고혈압 중 어떤 상태인지를 나타내는 3-d 벡터
(2) One-to-many

- 입력은 하나의 타임스텝, 출력은 여러 타임스텝
- 대표적 예시 : Image Captioning
- 입력으로는 이미지 하나. (단일 입력. 타임스텝이 하나)
- 각 타임스텝별로 순차적으로 단어를 생성.
- RNN 구조에서는 매 타임스텝마다 입력이 주어진다. One-to-many와 같이 추가적으로 넣어줄 입력이 따로 없는 경우에는 동일한 RNN 모듈의 입력으로는 사이즈는 같고 값은 모두 0인 벡터/행렬/텐서를 준다.
(3) Many-to-one

- 시퀀스를 입력으로 받은 후에, 최종 값을 마지막 타임스텝에서 비로소 출력으로 내놓는 형태이다.
- ex) sentiment classification
(4) Many-to-many
ex1) machine translation

- 위 예시의 경우 타임스텝이 총 5개이다. 세 번째 타임스텝까지는 주어진 입력 문장을 끝까지 읽고, 다 읽은 다음부터 비로소 번역 단어를 생성한다.
ex2) 입력이 주어질 때마다 예측을 수행하는, delay가 전혀 없는 형태

- PoS tagging, video classification on frame level 등
2. Character-level Language Model
- language model : 주어진 문자열이나 단어의 순서를 바탕으로 다음 단어를 예측하는 태스크. word 레벨, 캐릭터 레벨 모두 수행 가능.

- hello가 주어지면 가장 먼저 할 일 : character-level의 사전 구축.
- 각각의 character는 사전 크기만큼의 one-hot vector로 나타나게 된다.

- output vector를 계산하기 위해 Why와 곱하고 bias를 더해주어 logit을 구한다.
- 예측을 해야하므로 output vector의 차원은 사전의 차원과 같다.
- logit 값으로서의 벡터를 softmax에 통과시켜주어 얻은 확률값이 제일 큰 character를 답으로 예측한다.
- softmax 벡터와 ground truth 벡터가 최대한 가깝게끔 학습을 진행한다.

- 학습이 끝난 뒤 test-time에서는 예측값을 다음 타임스텝의 입력값으로 넣어줌으로써 무한한 길이의 character sequence를 생성할 수 있다.
RNN에서 필요로 하는 정보를 저장하는 공간은 매 타임스텝마다 업데이트를 수행하는 ht이다. ht가 타임스텝에 따라 진행되면서 어떻게 변화하는지 분석함으로써 RNN의 특성을 분석할 수 있다.
3. Backpropagation Through Time and Vanishing/Exploding Gradient Problem in RNN

- gradient를 두 타임스텝 이전까지 혹은 그보다 더 이전까지 전달해주는 경우에는 gradient 값이 타임스텝을 거슬러 갈수록 기하급수적으로 커지거나 소실(영향력 감소)된다.
- 이 계산과정을 통해 Gradient Vanishing/Exploding 문제가 발생하고 이것이 Long-Term-Dependency 문제를 일으키게 된다.
4. Long Short-Term Memory (LSTM)
- RNN의 Long-Term-Dependency 문제를 해결하기 위해 등장한 모델.
- RNN의 ht는 단기 기억을 저장하는 소자라고 볼 수 있는데 LSTM은 시퀀스가 타임스텝에 의해 진행됨에 따라서 이 단기 기억을 보다 길게 기억할 수 있도록 개선했다는 의미를 이름에 담고 있다.

- ct : cell state vector
- ht : ct를 한번 더 가공하여 그 타임스텝에서 노출할 필요가 있는 정보만 남긴 필터링된 정보. 현재 타임스텝에서의 예측값을 계산해주는 다음 output layer의 입력으로 사용한다.
- ct와 ht 중 더 핵심 정보는? : ct가 좀더 완성된, 그래서 우리가 필요로 하는 정보를 여러 가지 담고 있는 보다 완전한 정보이다.

- LSTM은 xt, ct−1, ht−1을 입력으로 받아 ct와 ht를 출력한다.

- input gate(i), forget gate(f), output gate(o), gate gate(g) : ct, ht를 계산하기까지 필요한 중간 결과물.
- x와 h 모두 차원이 h라고 한다면 w는 4h x 2h 행렬이다.
- sigmoid 의 특성상 i, f, o는 0 ~ 1 사이의 값을 갖는다. g는 tanh를 통과시켰으므로 –1 ~ 1 사이의 값을 갖게 된다. g를 현재 타임스텝에서 LSTM에서 계산되는 유의미한 정보라고 생각할 수 있다.
1) LSTM 계산 과정

- sigmoid를 통과시켜 구한 ft와 ct−1을 element-wise로 곱해 벡터를 얻는다. 예를 들어 ft = [0.7 0.4 0.8] 이라 한다면 ct−1의 첫 번째 요소에 대해서는 70%만 기억하겠다는 의미가 된다. 즉 ft는 ct−1의 각 dimension에 대해 얼만큼씩 기억할지를 결정한다.

- 위 그림에서의 ct~는 gt를 의미한다.
- 현재 타입스텝의 cell state Ct : Ct−1에서 일부 정보를 지운 ft Ct−1에 it Ct~를 더하여 구한다.
- 왜 Ct~를 바로 더해주지 않고 it를 곱하는가? : 한번의 선형변환으로 Ct−1에 더해줄 정보를 만들기 어려운 경우에는 정해주고자 하는 값보다 좀 더 큰 값들로 구성된 정보를 gate gate 의 형태로 만들어준 후, 각 dimension별로 또 특정 비율을 덜어내서 두 단계에 걸쳐 Ct−1에 더해줄 정보를 만드는 것이다.

- 이제 ht를 위와 같이 output gate와 tanh(Ct)를 곱하여 구한다.
- ht는 다음 RNN에 input으로 전해짐과 동시에 위로 올라가는 path를 가지고 있는데 이 경로가 바로 예측을 위해 output layer의 입력으로 주어지는 의미한다.

2) LSTM에서의 backpropagation

- 계속 동일한 Whh를 곱해주는 것이 아니라 매 타임스텝에서 Ct를 구할 때 그때그때 다른 forget gate를 곱하고, 필요로 하는 정보를 곱셈이 아닌 덧셈으로 만들어준다는 점에서 gradient vanishing을 해결한다. 덧셈은 backpropagation을 수행할 때 gradient를 복사해주는 연산이어서 멀리 있는 타임스텝까지 gradient를 큰 변형 없이 전달해줄 수 있다. 그래서 긴 타임스텝 간에 존재하는 long-term-dependency 문제를 해결할 수 있다.
5. Gated Recurrent Unit (GRU)
- LSTM의 모듈 구조를 정량화해서 보다 적은 메모리 사용량과 빠른 계산이 가능하게끔 만든 모델.
- 특징 1) LSTM에 존재하던 cell state vector와 hidden state vector를 일원화하여 hidden state vecotr만이 존재한다.
GRU에서 ht는 LSTM의 cell state vector Ct와 조금 더 비슷한 역할을 한다고 볼 수 있다.

- 특징 2) GRU에서는 input gate 만 사용한다. 위 식의 zt가 input gate에 해당한다. forget gate 자리에는 (1-zt)를 사용한다. 즉 두 개의 게이트를 사용하는 LSTM과 달리 한 개의 게이트만 사용한다. 그래서 ht는 ht−1과 현재 만들어진 정보인 ht~의 가중평균인 것으로 생각할 수 있다.