기본적인 구조는 다음과 같다.
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로 들어가야 한다.
Peeky를 이용하면 basic seq2seq에서 Decoder부분만 바뀐다.
이 Encoder에서 나와 모든 time의 LSTM와 Affine layer에 들어간다.
LSTM : Embedding을 거쳐 나온 tensor 과 를 duplicate & reshape 을 거쳐 를 만든 후 concatenate하여 가 되어 LSTM으로 들어간다.
Caution !
Train 할 때는 Decoder의 input또한 target으로 주어진다.(위 그림의 6,2가 input에도 있다.) 따라서 Embedding을 거쳐 나온 tensor가 이다.
Generate 할 때는 Decoding의 input이 이전 time의 출력된 단어 이므로 time 여러개를 tensor로 묶어 계산 불가능 하다.
Affine : LSTM에 들어간 와 LSTM에서 나온 를 cocatenate하여 가 Affine으로 들어간다.
여기서 Encoder의 input 문장의 길이와 상관없이 즉, 일정한 size로 전달된다.
만을 전달한다.
Peeky와 헷갈릴 수도 있는데 Peeky는 model을 그대로 두고 중간에 연산을 바꾸는 것이고 Attention은 그냥 새로운 layer인 Attention layer가(LSTM과 Affine 사이에) 추가 되는 것이다.
Attention Layer
LSTM에서 나온 hidden state를 라고 하자.
를 repeat하여 로 만든다.
와 를 inner product -> sum -> softmax 하여 가중치 를 만든다.
이때 가중치 의 의미는 Encoder의 어떤 단어와 Decoder의 어떤 단어가 유사한지 (Alignment)를 나타내는 vector이다.
가 의 각 단어 vetor와 얼마나 비슷한가 즉, 유사도를 나타내기 위해 inner product.
다음 가중치 를 repeat하여 한 후 와 ineer prouct -> sum 하면 맥락vetor
마지막으로 맥락vetor 과 LSTM에서 나온 hidden state를 를
concatenate 하여 Affine으로 들어간다.
Attention은 layer이므로 다양한 위치에 들어갈 수 있다.
Time 방향의 기울기 소실과 기울기 폭발에는 게이트와 Gradient Clipping으로 해결.
깊이 방향의 기울기 소실은 skip으로 해결.
Input을 output에 한번더 더해 주어 역전파시 기울기가 그대로 돌아온다.
( sum node는 기울기 그대로 )
https://arxiv.org/abs/1408.5882
Convolutional Neural Networks for Sentence Classification
* 일반적인 언어모델의 Embedding이후의 설명하는 form이 다름 주의.