1. Basic architecture
기본적인 구조는 다음과 같다.

LSTM으로 예를 들어보자.
1. Encoder

- Encoder는 입력 시계열 데이터로부터 각 time마다 hidden state와 cell state를 만들어 다음 time으로 전달한다.
- Encoder에서는 각각의 time에 대해서는 출력이 필요 없고 최종 출력은 마지막 time의 hidden state이다.
마지막 time의 hidden state에는 이전 time들의 input정보가 모두 담겨있다.
단, 이때 Encoder의 input size ( = time size )에 관계없이 항상 같은 길이로 encoding된다.
- minibatch 학습시 문장의 길이는 padding을 이용해 맞춰준다.
2. Decoder

- Encoder의 출력을 첫번째 time의 LSTM에서 input hidden으로 받는다.
- 첫번째 time의 output은 다음 time의 input이 된다.
- Train과 Generate의 과정의 차이점을 주의하자.
Generate일때는 "I"가 나오면 그 다음 time으로 "I"를 집어넣는다.
Train일때는 "I"가 아니여도 "I"를 집어 넣는다.
즉, Trian일때는 output에 상관없이 Decoder의 input이 target처럼 작용하고 그래서 time별 학습 후 tensor로 묶을 수 있다.
반면 Generate일때는 time별로 순차적인 과정이 필요하다.
- 또한 Emdebbing의 matrix(projection)은 사전 학습된 모델의 것을 사용하면 빠르다.
2. Improvements
- Dropout같은 기본적으로 사용하는 개선법은 생략.
1. Reverse -> Bi-LSTM
https://arxiv.org/abs/1409.3215
'Sequence to Sequence Learningwith Neural Networks'
-
단순하게 data을 반전 시키는 것만으로도 학습 속도가 빨라지고 정확도도 높아진다.
이때 data의 반전은 input data에서만 일으킨다.
-
이러한 사실을 이용하여 순방향과 역방향을 합쳐 양뱡향 LSTM.

-
마지막에는 concatenate, sum, mean
-
이방법을 사용하려면 마지막 h가 아닌 다 모아놓은 tensor hs가 Decoder로 들어가야 한다.
2. Peeky
- 위의 Basic architecture에서는 Encoder에서 Decoder로 hidden state를 넘겨줄때, Encoder의 마지막 time의 hidden state가 Decoder의 첫번째 time의 input hidden state가 되었다.
- 우선 LSTM의 hidden state에 대해 자세하게 보자.
- form을 먼저 보면 다음과 같다.
[N×T×1]⟶Embedding⟶[N×T×D]⟶LSTM⟶[N×T×H]
- 이때 [N×T×H]에서 마지막 T인 [N×−1×H]만이 Decoder로 전달된다.
- 여기서 Encoder의 input 문장의 길이( padding을 고려한다면 정확한 표현은 아니지만 T라고 이해해도 된다. )와 상관없이 H−vector 즉, 일정한 size로 전달된다.
- 다음 그림은 Peeky에서는 [N×−1×H]를 Decoder의 처음에만 전달하는 것이 아니라 모든 time에 전달하는 것을 표현한 그래프이다.

3. 출력 확률 조정
- Train이 끝난 seq to seq 모델에서 단어를 생성하는 방법은 두가지가 있다.
- Greedy sampling - output score로 가장 높은 단어를 선택한다.
- Stocahstic sampling - output probability를 이용한다.
위 두 방법의 가장 큰 차이는 같은 문장을 넣었을때, 항상 같은 결과 Vs 확률에따른 결과 이다.
- Stocahstic sampling을 사용하고 temperature를 추가한다.

위와같이 기존의 Softmax function에 T : temperature를 추가한 것이다.
이렇게 하면 t가 작을 수록 큰 확률은 더 크게 작은 확률은 더 작게 즉, 결정적으로 나타나게 된다.
4. Attention
- seq to seq model의 문제점
-
여기서 Encoder의 input 문장의 길이와 상관없이 H−vector 즉, 일정한 size로 전달된다.
-
[N×−1×H]만을 전달한다.
- [N×−1×H]에는 첫번째 time부터의 정보가 모두 저장되기는 하지만, 해당 ( 마지막 ) time의 정보가 더 많이 남아있다.
- 문장을 생성할때를 생각해보면, 이것이 큰 문제는 되지 않을수 있지만, 번역일때는 문제가 된다.
- 예를들어 사람이 문장을 해석할때는 보통 Alignment개념을 이용한다. 즉, 단어와 단어를 match하여 번역을 한다. 따라서 Encoder에서 Decoder로 넘어올때 마지막의 정보가 조금 더 들어가있는 hidden state [N×−1×H]가 아닌 모든 time에 대한 [N×T×H]을 넘겨주면 성능 개선에 효과가 있을것이다.
(추가 적으로 위의 내용이 맞다면, 문장생성 Vs 번역 모델을 non-peeky와 peeky를 비교했을때 개선율에서 차이를 보일것이다.)
- 따라서 Attention을 사용하여 Encoder에서 [N×−1×H] 대신 [N×T×H]을 Decoder로 넘긴다.


- Encoder에서 hs=[N×T×H] ( Encoder의 모든 time에 대한 hidden state )가 출력되어
Decoder로 들어온다.
이때 Encoder의 마지막 hidden state [N×−1×H] 가 Decoder의 첫번째 LSTM으로 들어간다. (이는 Basic model과 같다.)

5. Skip-연결
5. 1D-Convolution
https://arxiv.org/abs/1408.5882
Convolutional Neural Networks for Sentence Classification
- Image에서의 2D-convolution과 유사하다.

* 일반적인 언어모델의 Embedding이후의 설명하는 form이 다름 주의.
- Embedding을 거친 [N×T×H]가 filter [1×F(=2,3)×H(embedding과 같음)]와 convolution연산을 하여 [N×T×FN]가 된다.