2024.09.09 - [[Deep daiv.]/[Deep daiv.] NLP] - [Deep daiv.] NLP, WIL - 9. ELMo and GPT (1)
에서 이어지는 글입니다.
Self-Attention
이 글의 앞 부분에서 단어 it을 처리하는 레이어에서 self-attention을 적용하는 것을 보여주기 위해 아래의 그림을 보여준 적이 있습니다.
이번 글에는 이것이 어떻게 동작하는지에 대해 살펴보겠습니다. 많은 단일 vector들에 대해서 설명할 것이지만, 실제 구현은 거대한 matrix를 서로 곲하여 수행됩니다. 하지만 여기서는 word수준에서 어떤 일이 일어나는지에 집중하겠습니다.
(Masking이 없는) Self-Attention
encoder block에서 계산된 최초의 self-attention을 살펴보는 것으로부터 시작해보면, 한 번에 4개의 token만 처리할 수 있는 toy transformer가 있다고 하겠습니다.
Self-attention은 3개의 주요 단계가 있습니다:
- 각 경로마다 Query, Key, Value 벡터를 생성합니다.
- 각 input token마다, query vector를 사용하여 모든 다른 key vector들에 대한 score를 계산합니다.
- value vector에 그 조합된 score를 곱한 뒤 합산합니다.
1. Query, Key, Value vector생성
첫 번째 단계를 보면, Query를 받아서, 모든 key들과 비교할 것입니다. 각 key 별로 score를 계산하는 것입니다. self-attention에서의 첫번째 단계는 각 token 경로 별로 3개의 vector를 계산하는 것입니다.각 input token마다, weight matrix
1) W^Q, W^K, W^V를 곱하여 query vector, key vector, value vector를 생성합니다.
2. Score 계산
이제 vector들을 갖게 되었고, 현재 #2번 단계에서는 query 및 key vector만을 사용합니다. 우리는 지금 첫번째 token을 집중해서 보고 있기 때문에, 그 token의 query를 모든 key vector들과 곱하여 4개의 token들 각각의 score를 얻습니다.
2) 현재의 query vector와 모든 key vector가 얼마나 잘 매칭되는지 score를 얻기 위해 곱셈 (dot product) 연산을 합니다.
3. 전체 합산
우리는 이제 score들과 value vector들을 곱할 수 있습니다. 높은 score의 value는 결과가 다 더해지고 난 뒤에 결과 vector에서 높은 비중을 차지하게 됩니다.
3) value vector들을 score들과 곱한 뒤 모두 합산합니다.
더 낮은 score일 수록 value vector가 더 투명하게 표시됩니다. 작은 수를 곱하는 것이 vector값을 희석하는 것을 표현합니다.
만약 각 경로마다 같은 동작을 수행한다면, 각 해당 token마다, 적합한 context를 포함하는 token의 vector representation을 얻게 됩니다. 그 값은 transformer block의 다음 하위 layer (feed-forward neural network, FFNN)에 제공됩니다.
Masked Self-Attention
우리는 지금까지 transformer의 self-attention 단계를 살펴보았고, 이제 masked self-attention에 대해 살펴보겠습니다. Masked self-attention은 self-attention과 같지만, #2 단계는 다릅니다.
모델이 2개의 token만을 input으로 가지고 있으며, 우리는 두 번째 token을 처리하는 상황이라 가정해보면,
마지막 2개의 token은 masking됩니다. 이렇게 masking된 입력을 받은 모델은 scoring 단계를 방해합니다. 즉, 기본적으로 앞으로 나올 token에 대한 score를 0으로 만들어서, 모델이 앞으로 나올 word를 반영할 수 없습니다:
이러한 masking은 attention mask라고 불리는 matrix로 구현됩니다. 4개의 단어 sequence (예를 들어 "robot must obey orders") 를 생각해봤을때, language modeling 시나리오에서, 이 sequence는 4단계에 걸쳐 입력됩니다; word당 하나씩 (모든 word는 token이라고 가정합니다). transformer 모델은 배치로 동작하기 때문에, 전체 sequence를 한 배치로 처리하는 이 toy model의 배치 사이즈를 4로 가정할 수 있습니다.
즉, 일반적인 language modeling에서는 앞에서부터 하나씩 하나씩 입력이 들어오기 때문에, 자동적으로 현재 집중하고 있는 token의 뒤에 부분은 무시되지만,
transformer에서는 하나의 배치로 들어오기 때문에 masking을 통해 현재 집중하고 있는 token의 뒤에 부분은 masking을 통해 의도적으로 무시해주는 것입니다.
matrix 형태에서, query matrix를 key matrix와 곱해서 score를 계산할 수 있습니다. 아래 그림의 각 셀에서 word대신 word와 관련된 query (또는 key) vector가 있다고 가정하고 다음과 같이 시각적으로 표현해보겠습니다:
곱셈 이후에, attention mask 삼각형을 적용합니다. masking 하고 싶은 셀들을 마이너스 무한대 또는 큰 음수로 설정합니다. (예. GPT2에서는 -10억):
각 행에 softmax를 취함으로써 self-attention에 사용하는 실제 score가 생성됩니다.
이 score 테이블이 의미하는 것은 다음과 같습니다:
- 모델이 dataset에서 첫번째 케이스 (1번 행)를 처리할 때, 단 하나의 단어 ("robot")만을 포함하며, 그 단어에 모든 (100%) attention을 갖습니다.
- 모델이 dataset에서 두번째 케이스 (2번 행)를 처리할 때, "robot must"라는 단어들을 포함하며, "robot"에 48%, "must"에 52%의 attention을 갖으면서 단어 "must"를 처리합니다.
- 기타 등등...
GPT-2의 Masked Self-Attention
평가 시, 생성 시: 한 번에 한 토큰씩 처리
GPT-2가 masked self-attention이 동작하는 것과 똑같이 동작하도록 만들 수 있습니다. 하지만 evaluation 할 때에, 우리 모델이 각 iteration이 끝날 때 마다 하나의 새로운 word만 추가할 때, 이미 처리된 token에 대해 이전 경로를 따라 self-attention을 다시 계산하는 것은 비효율적입니다.
이 경우에, 첫 번째 token을 처리합니다.
GPT-2는 a token의 key,value vector를 유지하고 있습니다. 모든 self-attention 레이어는 그 token에 대한 각각의 key, value vector를 유지합니다.
이제 다음 iteration에서, 모델이 단어 robot을 처리할 때, query, key, value를 검색할 필요가 없습니다. 첫 번째 iteration에서 저장한 것을 재사용합니다.
GPT-2의 self-attention: 1- querie, key, value 값들 생성
모델이 단어 it을 처리하고 있다고 가정해봅시다. 하단 block의 경우, 그 token에 대한 입력 값은 it의 embedding + 슬롯 #9에 대한 positional encoding이 됩니다.
Transformer에서 모든 block은 각자의 weight을 갖습니다. 우리가 가장 먼저 볼 것은 query, key, value를 생성하는 데 사용하는 weight matrix입니다.
Self-attention은 입력 weight matrix와 곱합니다. (그리고 여기서 표현하지는 않았지만, bias vector들 더해줍니다.)
이 곱셈 연산은 기본적으로 단어 it에 대한 query, key, value vector의 접합 (concat)된 vector를 생성합니다.
input vector에 attention weight vector를 곱함으로써 (그리고 나중에 bias vector를 더함으로써), 이 token에 대한 query, key, value vector를 생성합니다.
GPT-2의 self-attention: 1.5 - attention head로 분할하기
이전 예제에서 "multi-head"부분을 건너뛰고 self-attention을 바로 살펴봤습니다. 이제 그 개념에 대해 설명할 순서가 왔습니다. Self-attention은 Q,K,V vector의 다른 부분들에 대해 여러번 수행됩니다. attention heads의 "분할 (splitting)"은 긴 vector를 matrix로 단순히 재구성하는 것입니다. small GPT2는 12개의 attention head를 갖으며, 재구성된 matrix의 첫 번째 차원이 됩니다.
이전 예제에서, attention head안에서 어떤 일이 일어나는지 살펴보았습니다. 다수의 attention-head를 생각하는 방법은 아래와 같습니다 (만약 12개의 attention head의 3개만을 그림을 표현한다면):
GPT-2의 self-attention: 2 - score계산하기
우리는 이제 score를 계산하는 것을 처리합니다.
이제 token은 다른 token들의 key에 대해 score 값을 얻을 수 있습니다.
GPT-2의 self-attention: 3 - 합산하기
이전에 살펴본 것과 같이, 각 value를 각 score와 곱하고, 그 결과들을 합산해서, attention-head #1를 위한 self-attention 결과를 만듭니다.
GPT-2의 self-attention: 3.5 - attention head를 합치기
여러 attention head를 다루기 위한 방법은 먼저 이들을 하나의 vector로 접합 (concat)하는 것입니다.
하지만 이 vector는 아직 다음 순서의 layer로 전달될 준비가 되지 않았습니다. 먼저 hidden state의 이 결과물을 동질적(homogenous) 표현(representation)으로 바꿔야 합니다.
GPT-2의 self-attention: 4 - Projecting
우리는 모델이 연결된 self-attention 결과를, feed-forward neural network가 처리할 수 있는 하나의 vector로 잘 mapping시킬 수 있도록 학습하도록 만들 것입니다.
그리고 이렇게 다음 layer로 보낼 수 있는 vector를 생성했습니다.
GPT-2의 Fully-Connected Neural Network: #1번 레이어
fully-connected neural network는 self-attention이 representation에 적합한 context를 포함시킨 뒤, block이 입력 token을 처리하는 곳입니다. 이것은 두 개의 레이어로 구성되어 있습니다. 첫번째 레이어는 모델 사이즈의 4배입니다 (GPT2 small의 경우 768이므로, 이 network는 768*4 = 3072 unit입니다). 왜 4배 일까요? 그것은 단순히 최초의 transformer에서 사용한 값과 같습니다. 이것은 transformer 모델에 주어진 task들을 다루기에 충분한 representation 능력/용량을 주는 것으로 보입니다.
(bias vector 생략)
GPT-2의 Fully-Connected Neural Network: #2번 레이어 - 모델 차원으로 projection하기
두번째 레이어는 첫번째 레이어의 결과를 모델 차원으로 다시 projection합니다. 이 곱셈 연산의 결과는 이 token에 대한 transformer block의 결과입니다.
(bias vector 생략)
끝
요약하자면, 우리의 입력 vector는 이러한 weight matrix들을 만납니다.
그리고 각 block마다 이러한 weight들의 세트를 가지고 있습니다. 반면에, 모델은 하나의 token embedding matrix와 하나의 positional encoding matrix 만을 가지고 있습니다.
'[Deep daiv.] > [Deep daiv.] NLP' 카테고리의 다른 글
[Deep daiv.] NLP, 논문 리뷰 - Attention is all you need (Transformer) (1) | 2024.11.27 |
---|---|
[Deep Daiv.] NLP, 논문 리뷰 - Bahdanau Attention (1) | 2024.11.17 |
[Deep daiv.] NLP, WIL - 9. ELMo and GPT (1) (1) | 2024.09.09 |
[Deep daiv.] NLP, WIL - 7.1 Seq2seq 실습 (1) | 2024.09.06 |
[Deep daiv.] WIL, NLP - 8. 순환 신경망 실습 (6) | 2024.09.02 |