개발/AI

[Transformer] Attention, Self-Attention 설명

jykim23 2024. 3. 8. 19:29

출처: https://www.youtube.com/watch?v=kyIw0nHoG9w

출처: https://www.youtube.com/watch?v=6s69XY025MU

 

Attention 개요

RNN의 단점

Encoder의 마지막 Hidden state 벡터 정보만 넘어간다.

예를들어 '오늘은' '금요일' '입니다.'에서 마지막 '입니다.'의 hidden state vector가 넘어간다.

 

Attention 구조

여기서 Attention 제안됨

Encoder 부분에서 생성되는 각 단어에 대한 hidden state 정보를 모두 decoder로 전달

출처: 유튜브

 

각각의 hidden state가 5차원일 경우 3*5 행렬인 [h0, h1, h2] 로 decoder로 전달

Decoder에서 'Today is Friday.'의 단어 'Friday.'를 예측할 때 Encoder에서 전달된 hidden state vector에서 가장 관련이 높은 벡터에 높은 가중치를 할당한다. 더 신경 쓴다(Pay more Attention). (Transformer에서 Energy를 의미하나?)

 

1. 인코더에서 모든 단어를 행렬 형태로 디코더에 전달

2. 디코더에서 단어를 예측할 때 전달받은 행렬의 각 벡터와의 주의(Attention)를 기울여야하는 지를 가중치로 사용

 

출처: 유튜브

 

 

 

출처: 유튜브

 

 

 

 

Attention의 가중치 계산

그럼 어떻게 가중치를 계산하느냐?

> 내적 연산: 코사인 유사도, 유클리드 디스턴스 등 다른 방법보다 연산 속도가 빨라서

 

출처: 유튜브

 

 

Attention Score: softmax()

attention score 계산되면 softmax()를 적용하여 확률로 변환

decoder 과정에서 반복

 

출처: 유튜브

 

 

 

Self-Attention

인코더 설명 예시

입력된 텍스트 데이터 내에 존재하는 단어들간의 관계를 파악하기 위해 사용

출처: 유튜브

 

 

 

입력 예시

출처: 유튜브

 

 

attention score = 단어들간의 유사도

 

 

Self-Attention 의 Attention score

계산: 단어들의 embedding vector와 다른 단어들의 벡터들간의 내적 연산

SoftMax() 로 가중치 계산

 

출처: 유튜브

 

 

 

Transformer에서 Self-Attention

Query, Key, Value : vector

Key, Value : 단어의 id, 단어의 구체적인 정보(dictionary vector)

Query : 유사한 다른 단어를 찾을 때 사용되는 질의 벡터

 

출처: 유튜브

 

 

 

가중치를 구할 때

임베딩된 벡터의 내적을 구하는 것이 아닌 Q, K, V 벡터의 내적을 계산한다.

출처: 유튜브

 

 

Query, Key, Value 벡터 구하기

출처: 유튜브

 

 

 

벡터 계산 예시

출처: 유튜브

 

Key 가중치 행렬로 Attention score 구하기

 

출처: 유튜브

 

 

Value vector

출처: 유튜브

 

계산 결과

 

출처: 유튜브

 

 

 

 

 

수식으로 표현하기

각각의 단어로 계산하지 않고 수식으로 한번에 계산하기

QK^T: Q와 K의 내적

출처: 유튜브

 

예시

 

출처: 유튜브

 

 

 

 

출처: 유튜브

 

 

 

Attention: Query, Key 내적의 가중치 합(개별의 내적이므로 맥락, 위치(순서)정보가 없음)

Self-Attention: 맥락 정보(단어에 문장 전체를 포함한다.)

Positional-Encoder: 위치 정보(문장에서 단어의 순서를 추가한다.)

 

학습방법 특징

Masking: n번 째 단어를 예측할 때 n번 이후의 단어는 학습에 사용되면 안된다. Attention(내적을 구할 때)과정에 n번 이후의 단어의 내적의 값을 절대값이 큰 음수로 만든다. exp() 거치면 0이 되므로 마스킹 된다.

 

 

 

 

 

 

이제 논문을 읽어보자.

구글에서 검색

https://scholar.google.com

 

Transformer 논문

https://proceedings.neurips.cc/paper_files/paper/2017/file/3f5ee243547dee91fbd053c1c4a845aa-Paper.pdf