[NLP] Attention
🧑🏻💻용어 정리
Neural Networks
RNN
LSTM
Attention
Attention을 쓰는 이유?
굉장히 긴 문장이 들어왔다고 봅시다.
100개의 hidden state가 있어서, 맨 마지막의 sentense embedding이 output 생성할 때, 모든 단어의 정보를 다 포함하고 있을까요?
output을 생성할 때, 각각의 단어를 다 보면서, 현재 hidden state와 각 100개의 hidden state간의 관계를 구하며 가장 attention score가 높은 것을 선택을 합니다.
결국, encoder가 source sentence를 하나의 vector로 encoding하기 어렵습니다.
그래서 이러한 seq2seq task 에서는 길이가 길 때, 성능이 떨어지는 문제가 있습니다.
그래서 Attention이 등장하였습니다.
Seq2Seq model은 encoder와 decoder로 이루어진, input도 sequence, output도 sequence로 만들어진 model입니다.
그럼 아래 내용을 살펴봅시다.
Attention
the bottleneck problem
*(Sentence embedding == context embedding == context vecctor)
이러한 Sequence Model에서 encoder의 마지막 단어의 embedding이자, 전체 문장의 embedding인 sentence embedding이라고도 하고, context embedding이라고도 하는 값을 가지고 output을 형성합니다.
또 히나의 decoder RNN에 집어 넣습니다.
encoder는 앞에 아무것도 없지만, decoder는 앞에 initials 값인 전체 문장의 embedding을 넣어주고 이를 input으로 시작합니다.
이는 전체 input의 context를 반영한 embedding입니다. 즉, initial hddien state.
앞 encoder RNN은 input을 embedding하는 RNN 이고, 뒤 decoder RNN은 Language model이라고 보면 됩니다.
그런데 !
지금 이 Seq2Seq model에 문제가 존재합니다.
단어가 matching 될 만한 단어들이 보이지 않으신가요 ?
아래와 같은 예시가 있습니다.
"나는 학교에 간다" -> "I go to the school"
나는 - I
가다 - go
학교 - school
이렇게, matching 될 만한 구조가 보이게 됩니다.
그러나, 이 Seq2Seq model은 mapping 없이 통채로 봅니다.
input 문장이 하나의 embedding으로 바뀌어 예측이 이루어집니다.
이를 bottleneck problem 이라 합니다.
그래서, 하나의 문장에 대해, 하나의 context vector로, 즉 동일한 embedding으로 하기 때문에 ,한계가 있다고 합니다.
그래서, 하나의 단어에 대해 더 관련 있는 것을 쓰면 되는데 왜 이렇게하지에서 시작하는 것입니다.
So, 우리의 Attention이 시작됩니다.
자, 그럼 이제 Attention 시작합니다.
Attention이니 집중해서 들어주기 바랍니다.
Attention
- Attention provides a solution to the bottleneck problem
- Core idea : on each step of the decoder, use direct connection to the encoder to focus on a particular part of the source sequence.
다시 말하자면,
Seq2Seq는 Decoder에서 Context vector를 사용하는데, 항상 동일한 값이 들어갔습니다.
그래서 이제는 관련된 것을 사용한다는 것입니다.
다음과 같이 RNN의 모든 hidden state가 아래와 같이 있습니다.
여기서 hidden state는 각 단어의 hidden state입니다.
그리고 우리는 여기서, Decoder에 있는 hidden state를 다시 구한다고 생각하면 됩니다.
그 과정이 무엇일까요?
위 그림과 같이 "dot product" 과정을 합니다.
그렇다면, 비슷한 vector일 수록 값이 더 커지게 나오겠죠?
반대로, 전혀 다른 값이면 값이 마이너스(-)에 가까워집니다.
결국, Decoder와 Encoder 각각의 hidden state 끼리의 연산으로 Attention을 만드는 것입니다.
그리고, 이 값들을 softmax function을 씌워서, 합이 1이 되도록 만듭니다.
그리고 해당 값들을, 원래의 hidden state에 곱해서 모두 합하여 최종적인 context vector를 만듭니다.
아래와 같이, 0.8, .0.1, 0.1, ...값을 각각 밑에 곱하여 새로운 context vector를 만듭니다.
결국,
Seq2Seq에서 마지막 단어가 Context vector라고 하는 것이 마음에 들지 않아서,
모든 hidden state에 attention score를 곱하여 다시 계산하는 것입니다.
이 현재 hidden state와 관련 있는 값은, 현재 0번째와 가장 관련 있는 context vector 라고 한다.
결국, 우리는 전체 문장의 context vector를, 현재 hidden state와 관련있는 것으로 구하겠다는 것입니다.
Attention distribution을 구하여, Weighted Sum을 hidden state에 더 높은 attention을 갖는 hidden state를 더 많이 반영하기 위해서, Attention을 사용합니다.
그랴서 관련 있는 것을 낸다고 볼 수 있습니다.
그래서 위에서 아래와 같이 과정이 이어집니다.
그래서,
이러한 결과가 나옵니다.
수식으로 살펴볼까요?
위 수식과 같이 encoder hidden state가 있고,
decoder에서 t번째 step이 s t를 나타냅니다.
그리고, h1 ~ h N까지 모두 s t 와 dot product합니다.
vector를 모두 곱한 값들이 현재 t번째 state와 연관 되는 단어 간의 값, 관계 이를 e, energy라고 합니다.
아직 dot product까지 한 것은 Attention이 아닙니다.
이 값을 가지고 softmax까지 해야 Attention입니다.
결국 Attention score는 합이 1이라고 생각해주시면 됩니다.
이 e 값을 softmax를 쓰면, 위와 같이 모든 합이 1이 되도록 나오게 됩니다.
이것을 Weighted Sum을 한 것이 Attention입니다.
a ^ t는 context vector가 됩니다.
정리하자면,
Decoder와 Encoder의 모둔 부분이랑 dot product를 한 값이 e t, 이것을 softmax 씌운 것이 attention score,
이 attention score에다가 encoder에 있는 hidden state들과 곱하여 Weighted sum한 값이 context vector입니다.
결국 최종적으로 구해진 context vector와 현재 decoder에 있는 hidden state를 concatenate 시켜서 단어를 예측하겠다.
입니다.
그래서, Attention이 나온 이후로 모든 Sequence model의 성능이 엄청나게 올랐습니다.
그리고 아래와 같은 관련 있는 단어의 Attention score를 보여주는 Attention Map도 살펴볼 수 있습니다.
정리하면 다음과 같은 절차를 따릅니다.
아래와 같은 그림도 살펴봅시다.
어딜 가나 그림이 다 다르게 나오기 때문에 잘 살펴보셔야 합니다.
그리고, 수식이나 그림을 외우는 것이 아닌 전체적인 맥락을 이해하시길 바랍니다.
Decoder의 hidden state와 x1 ~ xn을 dot product하여, 나온 m1 (e1 == energy), m2, ... , ~ m n을 가지고 다시 softmax function을 거칩니다.
그리고, 구해진 attention score로 s1 ~ s n embedding을 곱해서 새로운 z 값을 구한다는 것입니다.
이렇게 Weighted Sum 구해서 h t와 z를 이용해서 output 단어를 구하겠다는 것입니다.
여기까지,
Bidirectional LSTM
다음과 같은 구조도 봅시다.
왜 RNN은 전체 문장을 왼쪽에서 오른쪽으로만 가야하나.
왼쪽에서 오른쪽으로, 오른쪽에서 왼쪽으로 각각 2개의 RNN이 있습니다.
이 두 개를 같이 쓰면, 양쪽 방향으로 context를 반영하는 RNN
그래서 각 단어당 hidden state를 두 개 구해서, 두 가지를 결합해서 사용합니다.
결국, 왼쪽 오른쪽 방향의 정보를 모두 반영한 hidden state를 구하는 것입니다.
그래서, 이것을 가지고 Encoder를 구성합니다.
이 bidirectional LSTM은 transformer 나오기 전에 정말 많이 사용되었습니다.
다음은 Attention Model 입니다.
아래와 같이 Seq2Seq model과 Attention을 비교합니다.
이것도, image cpaptioning을 전체 embedding을 가지고 하는 것이 아닌, 각 값에다 Attention을 구하여 사용합니다.
이러한 새로운 embedding이 현재 state에서 사용하고자하는 context vector인 것입니다.
이러한 부분에 대해서 Attention을 줄 수 있습니다.
아래 그림과 같이 Attention을 확인할 수 있습니다.
그래서 Attention이 나온 이후로 모든 것에 대해 성능이 많이 좋아졌습니다.
'Artificial Intelligence > Natural Language Processing' 카테고리의 다른 글
[NLP] Transformer (0) | 2023.05.21 |
---|---|
[NLP] Sequential Data Modeling (0) | 2023.04.10 |
[NLP] RNN - LSTM, GRU (0) | 2023.04.04 |
[NLP] RNN (0) | 2023.04.04 |
[NLP] Word Embedding - GloVe [practice] (0) | 2023.03.31 |