seq2seq의 문제점
seq2seq의 Encoder의 출력을 Decoder로 보낼 때 이 출력은 "고정 길이의 벡터"였습니다. 이 고정 길이의 벡터에 문제가 있습니다. Encoder에 입력된 데이터의 길이에 상관없이 항상 같은 길이의 벡터로 변환하기 때문입니다. 이제 이 seq2seq의 문제점들을 하나씩 개선시키며 어텐션 구조를 완성시켜보겠습니다.
Encoder 개선
앞에서 얘기했던 문제를 개선하기 위해 입력 데이터의 길이에 따라 Encoder의 출력의 길이를 바꿔줍니다.
hs에는 입력 문장(데이터)의 길이 만큼의 벡터들이 담기게 되었습니다. hs의 각 행벡터에는 해당 층에 입력된 데이터의 정보가 담겨있다고 볼 수 있습니다.
Decoder 개선
1. 맥락 벡터
Encoder의 출력이 더 이상 고정 길이 벡터가 아니기 때문에 여러 개의 벡터를 Decoder에 적용을 시킵니다. 이 때, "어떤 계산"을 하는 층이 추가됩니다. 어떤 계산을 하는 층에서는, hs가 나타내는 데이터 중 Decoder에 입력된 데이터에 대응 관계인 것을 골라내는 역할을 합니다.(이렇게 단어의 대응 정보를 나타내는 것을 얼라인먼트(alignment)함)
그런데 이렇게 선택하는 부분은 역전파에서의 미분이 불가능합니다. 그래서 이 문제를 해결하기위해 모든 벡터를 고르고, 각 벡터에 중요도를 나타내는 가중치를 별도로 계산하도록 합니다.
위 그림의 결과로 나온 c를 맥락 벡터라고합니다. 위 그림에서 가중치가 0.8인 "나"벡터의 성분이 c에 많이 포함되어 있습니다.
2. 맥락벡터를 위한 가중치
맥락 벡터를 위한 가중치 a벡터를 구하려면 Decoder에 입력되는 hs의 각 행벡터들과 Decoder의 각 LSTM계층의 출력 h와의 유사도를 구합니다. 여기서는 벡터 간의 내적을 통해 유사도를 구합니다.
hs의 각 행벡터들과 h를 내적해 벡터 유사도를 구한 뒤 위의 S층에 있는 값들을 softmax함수에 넣어 0~1사이의 값을 만들고, 총합이 1이 되는 맥락벡터를 위한 가중치를 만들어냅니다.(이 과정에서 broadcast나 repeat에 관한 개념이 나오지만 이는 생략하겠습니다.)
3. Attention 계층
맥락 벡터를 구하기 위한 가중치를 구하고, 그 가중치에 hs를 곱해 Decoder의 각 층에 정보를 흘려줍니다. 여기까지 개선된 점을 그림으로 보면 다음과 같습니다.
Attention 계층에 들어가는 h는 가중치를 구하기 위해 들어가는 것이고, Attention계층의 실질적인 출력값은 hs*가중치가 됩니다.
더 나아가서
1. 양방향 RNN
처음 RNN에 대해서 공부했을 때, 오른쪽에 있는 값일 수록 h로부터 받아들이는 정보가 더 많아 왼쪽에 있을 수록 불리한 것이 아닌가...?라는 생각과 주변 맥락을 왼쪽에서만 가져온다는 점이 더 개선될 수 있지 않을까 생각했는데 역시 이미 있었습니다.
위 그림에서는 원래의 LSTM계층과 역방향으로 처리하는 LSTM으로 이루어진 Encoder입니다. 각 은닉 상태 벡터는 양쪽 방향으로부터 정보를 집약할 수 있습니다.
2. Attention 계층 사용 방법
이 글에서 Attention계층을 Affine변환 직전에 위치시켰는데, Attention계층의 출력을 다음 시각의 LSTM층에 연결시키는 등 다양한 계층 사용 방법을 생각해볼 수 있습니다.
3. skip연결(숏컷, 잔차연결)
RNN에서 단순 RNN 또는 LSTM계층을 깊게 쌓는 방법으로 표현력을 높이려할 수 있는데, 이 때 RNN 또는 LSTM 계층 간에 skip연결, 즉 층을 건너뛰어 값을 그대로 전달하는 방법이 있습니다. 이 방법은 역전파 시 기울기를 그대로 흘려보내 층이 깊어져도 기울기가 소실될 확률이 적어 좋은 학습을 기대할 수 있습니다.
'AI_basic > Deeplearning' 카테고리의 다른 글
[Deeplearning Part.8-4] GRU (0) | 2022.01.25 |
---|---|
[Deeplearning Part.8-3] seq2seq (0) | 2022.01.25 |
[Deeplearning Part. 8-2] LSTM (0) | 2022.01.25 |
[Deeplearning Part.8-1] RNN 기본구조 (0) | 2022.01.24 |
[Deeplearning Part.7-1] 자연어 처리와 Word Embedding (0) | 2022.01.22 |