비슷한 문맥에 비슷한 단어는 모여있다를 극복하기 위한 방법 ( 꼭 그런 것은 아니지만서도 기본적인...~~)
즉, 순서(Sequence)를 파악하고 가중치를 그에 따라 조정하여 자연어를 처리하기 위한 메커니즘
S2S를 모르면 읽고 가야함.
Sequence to Sequence (S2S) 시퀀스 투 시퀀스란?
Word Attention이란 무엇인가?
딥러넹 모델이 특정 벡터에 주목(attetion)하게 만들어 모델의 성능을 높이는 기법임.
그렇다면 왜 특정 벡터에 주목하게 만드는 것이 성능을 높여주느냐??
이를 알려면 어텐션이 나온 배경부터 이해해야 한다.
기계 번역을 위한 S2S(Seq 2 Seq) 모델부터 시작되었는데
Sequence to Sequence (S2S) 시퀀스 투 시퀀스란?
위는 A,B,C를 입력으로 받아서 W,X,Y,Z를 출력하는 그림이다.
+앞부분을 인코더(Encoder) 뒷부분을 (Decoder)라고 한다.
여기서 문제가 뭐냐? 하면은 입력데이터 길이가 길어질수록 성능이 떨어진다는 것이 문제다.
**RNN이라고는 하지만 점점 loss 가 발생한다. -> S2S에서 마지막 HS만 사용하기 때문에 문제가 생김
다시 말하자면 W는 A,B,C 모두 관련되어 있는 단어가 아님에도
우리는 입력이 A,B,C 니까 같은 비중으로 W 생각해봐야지? 하고 수행하다가
좋지 않은 결과를 가져오는 것을 말한다.
그래서 어떻게 어텐션으로 이 부분을 해결하느냐??
"어텐션은 Encoder가 입력받아서 벡터로 만든 결과는 디코더가 출력할 때 쓰는 벡터와 유사할 것이다." 라는 가정 하 수행하는 것이다.
?? 무슨소리냐고?
즉 인코더가 만든 모든 HS가 디코더가 Prediction 할 때 도움이 된다는 가정 하에 진행하는 것이다.
다시 말하면 매 시점(time step)마다 인코더(Encoder)의 HS를 쭉 훑어보는 것이다.
이 비율을 조정하는 것이 Attetion Score이며 어텐션 메커니즘의 핵심
어떻게 작동하는건데??
-
인코더 계산
라고 ratsgo님의 블로그에서 설명하는데.. 나는 저런 그림 못알아듣겠다..ㅠ
-
디코더 계산
디코더 또한 설명이 쉽진 않다.
-디코더 예시
위의 그림과 설명을 잘 알아듣는다면 여기는 안봐도 되고
내가 다시 나만의 방법으로 설명해보자면..?
**닷-프로덕트 어텐션(Dot-Product Attention)이라고 가장 쉽게 어텐션을 정의하는 메커니즘이다.
++어차피 어텐션의 큰 테두리는 같음
여기를 보면 지금 Sooftware에 대해 디코더가 계산하기 위에 인코더의 HS들을 참고하는 그림이다.
즉, 단어를 Prediction 할 때 어떻게 어텐션 메커니즘이 사용되는지를 보여준다.
근데 여기서 softmax 함수가 사용된다
**softmax 함수는 단어 각각이 출력 단어를 예측할 때 얼마나 도움이 되는지 정도(weight)를 수치화하는 역할이다. (+정규화도 진행함. 입력받는 값들의 합을 1로만듬)
소프트맥스가 적용된 이후의 도움의 되는 정도 하나의 정보로 담아서 디코더로 전송하는 것이다.
하나로 어떻게 만드느냐?? 를 알기 전에 그 전에 어텐션 스코어를 어떻게 구하는지 알고 넘어가자...이거 먼저 설명할 걸 ㅎ
위에서 소프트맥스를 통해 얻은 값들은 어텐션 분포(Attention distribution)이라고 한다. Attention score 이후 단계다.
어텐션 스코어가 정확히 뭔지 알고 구해보자어텐션 스코어는 디코더가 단어를 예측하려고 할 때 앞선 인코더의 HS들이 지금 디코더의 HS와 얼마나 유사한지 판단하는 수치 값이다.
그것이 바로 위에서 녹색 점이다.
**(Dot-product Attention 이기 때문에)
**일반적으로 어텐션 스코어는 디코더의 HS를 전치(transpose)해서 인코더의 HS와 내적(dot product)를 수행한다.
다시 돌아와서
어텐션 스코어를 구할 줄 알고 그를 통해 어텐션 분포를 얻었다.이 후 각 인코더의 어텐션 가중치를 정할 수 있다
( 어텐션 분포를 통해)
하나로 뭉치기 위해서 각 인코더의 HS와 어텐션 가중치를 곱해서 모두 더해준다.++위에선 4개겠지??
그 값을 가중치를 곱해서 더한 값이라 해서 Weighted Sum이라고도 부른다. (가중합)
우리는 이 어텐션 값을 Context Vector라고 부르고 Context라고 짧게 부른다.
** Seq to Seq 의 Context를 이걸로 대체해서 성능을 향상시킬 수 있다.
하나로 뭉친 것은 좋다. 어떻게 쓴다고??
context vector를 구했으니 디코더의 HS와 결합시켜서 하나의 벡터로 만든다.
이걸 Concatenation이라고 한다. 접합이라는 건데 그냥 진짜 이어붙인다.
만든 이 벡터를 예측하는 디코더의 입력으로 사용해
인코더의 정보를 활용하여 예측을 할 수 있게 되는 것이다.
(왜 Concatenation을 하는지는 ..? 정확히는 모르겠다.)
끗!! ~~ 여기까지만 알고 더 알고싶다면...?
마지막으로 어텐션의 종류들~
구하는 방법은 비슷하나 약간씩 차이가 있다.
그리고 수학적 표현 방식도 알아가자 ㅎ
Attention(Q, K, V) = Attention Value
어텐션 함수는 주어진 '쿼리(Query)'에 대해서 모든 '키(Key)'와의 유사도를 각각 구한다.
그리고 구해낸 이 유사도를 키와 맵핑되어있는 각각의 '값(Value)'에 반영하고
유사도가 반영된 '값(Value)'을 모두 더해서 반환시켜줌
여기서는 이 값을 어텐션 값(Attention Value)이라고 함
ratsgo.github.io/from%20frequency%20to%20semantics/2017/10/06/attention/
https://arxiv.org/pdf/1409.0473.pdf
위 링크를 참고했습니다.
'데이터 사이언스(Data Science) > 자연어 처리 ,NLP' 카테고리의 다른 글
딥러닝 챗봇 만들기 - 3 (파이썬 이용하기) (0) | 2021.01.10 |
---|---|
Trnasformer Network, 트랜스포머 네트워크란? (0) | 2021.01.08 |
자연어 처리에서의 용어 (0) | 2021.01.07 |
Sequence to Sequence (S2S) 시퀀스 투 시퀀스란? (0) | 2021.01.07 |
딥러닝 챗봇 만들기 - 2 (파이썬 IDE, 개발환경만들기) (0) | 2020.12.19 |