https://acdongpgm.tistory.com/219?category=910966
앞서 설명했듯이 임베딩 이후에 포지셔널 인코딩을 통해서 포지션 정보를 가진 임베딩 벡터가 인코딩 블록으로 들어오게 된다.
논문의 핵심인 Multi-Head Attention의 동작하는 방식을 알아보고
그 이후에 정규화 방법(Residual connection & Normalization)도 같이 알아보자.
인코더 블록은 각각의 단어들의 포지션을 유지한 채로 진행된다.
자세히 설명하면.
첫 번째 인풋 벡터가 Self-Attention을 통과해서 나온 첫 번째 아웃풋이 첫 번째 인풋 토큰이다.
( X1 -> Z1 )
위의 그림에서는 레이어를 묶어서 표현했지만 사실 내부는 다르다.
Self-Attention에서는 인풋 토큰들끼리 서로 연관이 있다. ( dependency O )
Feed Forward에서는 인풋 토큰들끼리 서로 연관이 없다 ( dependency X )
첫 번째 인코더에서 나온 결과 값이 두 번째 인코더의 인풋이 된다.
Self-Attention
예문)
The animal did't cross the street because it was too tired |
문장이 있을 때 Self-Attention은 "it" 이 무엇을 가리키는지 모든 단어를 검사하면서 찾는 역할이다.
다시 말하면,
인풋 시퀀스들의 다른 단어들을 훑어가면서 나(it)랑 연관이 있는 단어가 뭔지 답을 구하는 과정이다.
현재 프로세싱하고 있는 단어들의 의미를 정확하게 알기 위해서 현재 동일한 인풋 시퀀스들의 단어들을 살펴보는 것.
그럼 Self-Attention 은 어떻게 동작되는가 ( 중요도를 어떻게 구하는가? )
Step 1 : 세 종류의 벡터를 생성한다.
- Query : 현재 내가 보고 있는(processing) 단어의 representation , 다른 단어들을 스코어링을 하기 위한 기준 값
- Key : 레이블과 같은 역할 ( 어떤 쿼리가 주어졌을 때 유의미한 단어를 찾을 때 사용 )
- Value : 실제 값 ( actual word representations )
생성 과정
Query , Key , Value는 input_embedding 값을 통해서 만들어진다.
각각의 해당하는 행렬(Matrix)이 3개(Wq , Wk , Wv)가 존재해서 Embedding 값에 곱해주게 되면
Query , Key , Value의 값을 얻게 되는 것입니다.
행렬 이름이 W 인 것은 학습을 통해 바뀌게 되는 weight 값이기도 하기 때문.
(우리가 찾아야 하는 값) , 저 행렬들을 조절하면서 학습을 하게 됨.
Step 2 : 현재 쿼리(Query) 값을 가지고 가장 관련성이 높은 value를 찾는다.
어떻게 관련성이 높은 value를 찾을까?
쿼리(Query) 값과 다른 모든 토큰들의 키(Key) 값을 곱하면 관련성 점수(Score)를 알 수 있다.
Score 값이 계산되면 차원의 루트 갯 수만큼 나눠준다. ( 64차원 -> 8 ) √dk
이렇게 하면 Gradients에 도움이 됨.
그다음 Softmax를 거치면 Attetion_weight 값이 도출된다.
Attention_weight : 현재 단어가 생각하는 다른 단어 각각의 중요도 값
최종적으로 Attention_weight와 단어들의 Value 값들과 곱해주고 더해주면
첫 번째 토큰(Thinking)에 Output이 됩니다.
이걸 옆으로 쭉 펼쳐보면
과정 요약
여기까지 셀프 어텐션의 과정이었습니다.
멀티 헤드 어텐션은 무엇일까?
Multi-head Attention
- Self Attention을 여러 개 사용하는 것
- 각각 Wq , Wk , Wv 가 다른 Self Attention 을 여러개 사용
- 일종의 앙상블 효과를 낼 수 있음.
만약 input / output 이 512 dim 일 경우
64 dim 인 self-Attention을 8개 만들어서
concat 하면 64 * 8 = 512 가 만들어져서 차원을 맞춰줄 수 있다(Multi-head : 8개)
자세히 설명하면,
먼저 각각의 Head에서 나온 결과를 합친다.(Concat)
여기서 합친(concat) 행렬(Matrix)과 와 원래 input_dim을 맞춰주기 위해서
input_dim의 해당되는 raw를 가지는 행렬(Wo)을 생성한다( Wq, Wk, Wv 생성과정과 동일 / 기능도 동일 )
이걸 곱해주게 되면 -> 처음 가지고 있었던 원래 input과 동일한 output을 만들어 낸다.
Multi-head Attention 과정 한눈에 보기
결론 : 아무리 계산 결과가 무지막지하게 복잡해도 차원의 크기를 유지하면서 계산함.
아직 끝이 아니다~
Add & Normalize
셀프 어텐션 모델을 거쳐서 나온 결과를 Residual 해주는 과정이 있다.
1. Add
- F(x) + x
입력에 아웃풋에 자기 자신을 더해주는 것
미분을 할 때 분모가 작아지는 것을 방지해줌.
2. Normalize
- Layer Normalization 사용
인코더 부분의 가장 중요한 self-Attention에 대해서 알아보았습니다.
다음엔 디코더 부분에 대해서 알아보겠습니다.
이미지 출처 : wikidocs.net/22893 , https://jalammar.github.io/
참고 영상 : https://www.youtube.com/watch?v=Yk1tV_cXMMU (고려대학교 산업경영공학과 강필성 교수님 강의)
'Machine learning > NLP' 카테고리의 다른 글
[NLP] . OOV 를 해결하는 방법 - 1. BPE(Byte Pair Encoding) (1) | 2021.08.22 |
---|---|
[NLP] Transformer : Masked Multi-Head Attention - part3 (0) | 2021.08.21 |
[NLP]. Transformer : Structure - part1 (0) | 2021.08.19 |
[NLP] Sequence to Sequence(시퀀스 투 시퀀스) 코드 (0) | 2021.08.19 |
[NLP] Sequence to Sequence (시퀀스 투 시퀀스), Attention(어텐션) 개념 (0) | 2021.08.18 |