함께하는 데이터 분석

[NLP] Transformer② 본문

데이터분석 공부/NLP

[NLP] Transformer②

JEONGHEON 2023. 2. 5. 15:46

Positional Encoding

앞서 포스팅한 Transformer① 모델에서 한 가지 부족한 부분은 입력 문장에서 단어들의 순서를 고려하지 않았다는 것

 

이것을 추가하기 위해 Transformer 모델은 각각의 입력 임베딩에 "positional encoding"이라고 불리는 하나의 벡터를 추가

 

이 벡터들은 모델이 학습하는 특정한 패턴을 따르는데, 이 패턴은 모델이 각 단어의 위치와 시퀀스 내의 다른 단어 간의 위치 차이에 대한 정보를 알 수 있게 해 줌

 

이 벡터들을 추가하기로 한 배경에는 이 값들을 단어들의 임베딩에 추가하는 것이 query/key/value 벡터들로 나중에 투영되었을 때 단어들 간의 거리를 늘릴 수 있다는 점

 

모델에게 단어의 순서에 대한 정보를 주기 위해, 위치 별로 특정한 패턴을 따르는 positional encoding 벡터들을 추가

 

만약 임베딩의 사이즈가 4라고 가정하면, 실제로 각 위치에 따른 positional encoding은 아래와 같은 것

 

위는 크기가 4인 임베딩의 positional encoding에 대한 실제 예시

 

실제로는 이 패턴이 어떻게 될 것인가?

위의 그림에서 각 행은 하나의 벡터에 대한 positional encoding에 해당

 

첫 번째 행은 우리가 입력 문장의 첫 번째 단어의 임베딩 벡터에 더할 positional encoding 벡터.

 

각 행은 사이즈 512인 벡터이며 각 셀의 값은 1과 -1 사이를 가짐

 

위의 그림은 이 셀들의 값들에 대해 색깔을 다르게 나타내어 positional encoding 벡터들이 가지는 패턴을 볼 수 있도록 시각화한 것

 

이는 20개의 단어와 그의 크기 512인 임베딩에 대한 positional encoding의 실제 예시

 

그림에서 볼 수 있듯이 이 벡터들은 중간 부분이 반으로 나뉘어 있는데, 왼쪽 반은 사인함수에 의해 생성되었고, 오른쪽 반은 코사인 함수에 의해 생성되었기 때문

 

그 후 이 두 값들은 연결되어 하나의 positional encoding 벡터를 이루고 있음

 

 

The Residuals

인코더를 넘어가기 전, 구조에서 한 가지를 더 언급하고 넘어가야 하는 부분은 각 인코더 내의 sub-layer가 residual connection으로 연결되어 있으며, 그 후에는 layer-normalization 과정을 거친다는 것

이 벡터들과 layer-normalization 과정을 시각화하면 다음과 같음

 

이것은 디코더 내에 있는 sub-layer들에도 똑같이 적용되어 있음

 

만약 우리가 2개의 인코더와 디코더로 이루어진 단순한 형태의 Transformer를 생각해 본다면 다음과 같은 모양일 것

 

 

The Decoder Side

이때까지 인코더 쪽의 대부분의 개념들에 대해 이야기했기 때문에 사실 디코더의 각 부분이 어떻게 작동하는지에 대해 이미 알고 있다고 봐도 무방

 

하지만 이 부분들이 모여서 어떻게 같이 작동하는지에 대해서 알아보아야 함

 

인코더가 먼저 입력 시퀀스를 처리하기 시작

 

그다음 가장 윗단의 인코더의 출력은 attention 벡터들인 K와 V로 변형

 

이 벡터들은 이제 각 디코더의 "encoder-decoder attention" layer에서 디코더가 입력 시퀀스에서 적절한 장소에 집중할 수 있도록 도와줌

이 인코딩 단계가 끝나면 이제 디코딩 단계가 시작

 

디코딩 단계의 각 스텝은 출력 시퀀스의 한 element를 출력

 

디코딩 스텝은 디코더가 출력을 완료했다는 special 기호인 <end of sentence>를 출력할 때까지 반복

 

각 스텝마다의 출력된 단어는 다음 스텝의 가장 밑단의 디코더에 들어가고 인코더와 마찬가지로 여러 개의 디코더를 거쳐 올라감

 

인코더의 입력에 했던 것과 동일하게 임베드를 한 후 positional encoding을 추가하여 디코더에게 각 단어의 위치 정보를 더해줌

디코더 내에 있는 self-attention layer은 output sequence 내에서 현재 위치의 이전 위치들에 대해서만 attend 할 수 있음

 

이것은 self-attention 계산 과정에서 softmax를 취하기 전에 현재 스텝 이후의 위치들에 대해 masking(즉 그에 대해서 -inf로 치환하는 것)을 해줌으로써 가능해짐

 

"Encoder-Decoder Attention" layer은 multi-head self-attention과 한 가지를 제외하고는 똑같은 방법으로 작동

 

그 한 가지 차이점은 Query 행렬들을 그 밑의 layer에서 가져오고 Key와 Value 행렬들을 인코더의 출력에서 가져온다는 점

 

 

Linear Layer과 Softmax Layer

여러 개의 decoder를 거치고 난 후에는 소수로 이루어진 벡터 하나가 남게 됨

 

어떻게 이 하나의 벡터를 단어로 바꿀 수 있을까?

 

이것이 바로 마지막에 있는 Linear layer과 Softmax layer가 하는 역할

 

Linear layer은 fully-connected 신경망으로 디코더가 마지막으로 출력한 벡터를 그보다 훨씬 더 큰 사이즈의 벡터인 logits 벡터로 투영시킴

 

우리의 모델이 training 데이터에서 총 10,000개의 영어 단어를 학습하였다고 가정(이를 우리는 모델의 “output vocabulary”라고 부름)

 

그렇다면 이 경우에 logits vector의 크기는 10,000이 될 것

 

벡터의 각 셀은 그에 대응하는 각 단어에 대한 점수가 되고 우리는 Linear layer의 결과로써 나오는 출력에 대해서 해석을 할 수 있게 됨

 

그다음에 나오는 softmax layer는 이 점수들을 확률로 변환해 주는 역할을 함

 

셀들의 변환된 확률 값들은 모두 양수 값을 가지며 다 더하게 되면 1이 되고 가장 높은 확률 값을 가지는 셀에 해당하는 단어가 해당 스텝의 최종 결과물로서 출력되게 됨

위의 그림에 나타나 있는 것과 같이 디코더에서 나온 출력은 Linear layer와 softmax layer를 통과하여 최종 출력 단어로 변환됨

 

 

모델의 학습

지금까지는 학습된 Transformer의 전체 forward-pass 과정에 대해서 알아보았으므로 이제 모델을 학습하는 방법에 대해서 알아볼 것

 

학습 과정 동안, 학습이 되지 않은 모델은 정확히 같은 forward pass 과정을 거칠 것임

 

그러나 우리는 이것을 label 된 학습 데이터 셋에 대해 학습시키는 중이므로 우리는 모델의 결과를 실제 label 된 정답과 비교할 수 있음

 

이 학습 과정을 시각화하기 위해, 우리의 output vocabulary 가 “a”, “am”, “i”, “thanks”, “student”, “<eos>” (‘end of sentence’의 줄임말) 총 6개의 단어만 포함하고 있다고 가정

모델의 output vocabulary는 학습을 시작하기 전인 preprocessing 단계에서 완성

 

이 output vocabulary를 정의한 후에는, 우리는 이 vocabulary의 크기만 한 벡터를 이용하여 각 단어를 표현할 수 있음

 

이것은 one-hot encoding이라고 불리고 우리의 예제에서는 단어 “am”을 다음과 같은 벡터로 나타낼 수 있음

예제: 우리의 output vocabulary에 대한 one-hot encoding

 

이제 모델의 loss function에 대해서 설명할 것 – 이것은 학습 과정에서 최적화함으로써 인해 모델을 정확하게 학습시킬 수 있게 해주는 값

 

 

Loss Fuction

우리가 모델을 학습하는 상황에서 가장 첫 번째 단계라고 가정

 

그리고 우리는 학습을 위해 “merci”라는 불어를 “thanks”로 번역하는 간단한 예시라고 가정

 

이 말은 즉, 우리가 원하는 모델의 출력은 “thanks”라는 단어를 가리키는 확률 벡터란 것

 

하지만 우리의 모델은 아직 학습이 되지 않았기 때문에, 아직 모델의 출력이 그렇게 나올 확률은 매우 작음

학습이 시작될 때 모델의 parameter들 즉 weight들은 랜덤으로 값을 부여하기 때문에, 아직 학습이 되지 않은 모델은 그저 각 cell (word)에 대해서 임의의 값을 출력

 

이 출력된 임의의 값을 가지는 벡터와 데이터 내의 실제 출력값을 비교하여, 그 차이와 backpropagation 알고리즘을 이용해 현재 모델의 weight들을 조절해 원하는 출력값에 더 가까운 출력이 나오도록 만듦

 

그렇다면 두 확률 벡터를 어떻게 비교할 수 있을까?

 

간단하게 하나의 벡터에서 다른 하나의 벡터를 빼버림

 

하지만 여기서 하나 주의할 것은 우리가 고려하고 있는 예제가 지나치게 단순화된 경우란 것

 

조금 더 현실적인 예제에서는 한 단어보다는 긴 문장을 이용할 것임

 

예를 들어 입력은 불어 문장 “je suis étudiant”이며 바라는 출력은 “i am a student”일 것

 

이 말은 즉, 우리가 우리의 모델이 출력할 확률 분포에 대해서 바라는 것은 다음과 같음

  • 각 단어에 대한 확률 분포는 output vocabulary 크기를 가지는 벡터에 의해서 나타내짐(우리의 간단한 예제에서는 6이지만 실제 실험에서는 3,000 혹은 10,000과 같은 숫자일 것)
  • 디코더가 첫 번째로 출력하는 확률 분포는 “i”라는 단어와 연관이 있는 cell에 가장 높은 확률을 줘야 함
  • 두 번째로 출력하는 확률 분포는 “am”라는 단어와 연관이 있는 cell에 가장 높은 확률을 줘야 함
  • 이와 동일하게 마지막 ‘<end of sentence>‘를 나타내는 다섯 번째 출력까지 이 과정은 반복됨(‘<eos>’ 또한 그에 해당하는 cell을 벡터에서 가짐)

위의 그림은 학습에서 목표로 하는 확률 분포를 나타낸 것 

 

모델을 큰 사이즈의 데이터 셋에서 충분히 학습을 시키고 나면, 그 결과로 생성되는 확률 분포들은 다음과 같아질 것임

학습 과정 후, 모델은 정확한 번역을 출력할 것임

 

물론, 우리가 예제로 쓴 문장이 학습 데이터로 써졌다는 보장은 없음

 

그리고 한 가지 여기서 특이한 점은, 학습의 목표로 하는 벡터들과는 달리, 모델의 출력값은 비록 다른 단어들이 최종 출력이 될 가능성이 거의 없다 해도 모든 단어가 0보다는 조금씩 더 큰 확률을 가진다는 점 – 이것은 학습 과정을 도와주는 softmax layer의 매우 유용한 성질

 

모델은 한 타임 스텝 당 하나의 벡터를 출력하기 때문에 우리는 모델이 가장 높은 확률을 가지는 하나의 단어만 저장하고 나머지는 버린다고 생각하기 쉬움

 

그러나 그것은 greedy decoding이라고 부르는 한 가지 방법일 뿐이며 다른 방법들도 존재

 

예를 들어 가장 확률이 높은 두 개의 단어를 저장할 수 있음(위의 예시에서는 ‘I’와 ‘student’)

 

그렇다면 우리는 모델을 두 번 돌리게 되고, 한 번은 첫 번째 출력이 ‘I’이라고 가정하고 다른 한 번은 ‘student’라고 가정하고 두 번째 출력을 생성해 보는 것

 

이렇게 나온 결과에서 첫 번째와 두 번째 출력 단어를 동시에 고려했을 때 더 낮은 에러를 보이는 결과의 첫 번째 단어가 실제 출력으로 선택됨

 

이 과정을 두 번째, 세 번째, 그리고 마지막 타임 스텝까지 반복해 나가고 이렇게 출력을 결정하는 방법을 우리는 “beam search”라고 부르며, 고려하는 단어의 수를 beam size, 고려하는 미래 출력 개수를 top_beams라고 부름

 

우리의 예제에서는 두 개의 단어를 저장했으므로 beam size가 2이며, 첫 번째 출력을 위해 두 번째 스텝의 출력까지 고려했으므로 top_beams 또한 2인 beam search를 한 것

 

이 beam size와 top_beams는 모두 우리가 학습 전에 미리 정하고 실험해 볼 수 있는 hyperparameter임


The Illustrated Transformer – NLP in Korean – Anything about NLP in Korean

 

The Illustrated Transformer

저번 글에서 다뤘던 attention seq2seq 모델에 이어, attention 을 활용한 또 다른 모델인 Transformer 모델에 대해 얘기해보려 합니다. 2017 NIPS에서 Google이 소개했던 Transformer는 NLP 학계에서 정말 큰 주목을

nlpinkorean.github.io

 

'데이터분석 공부 > NLP' 카테고리의 다른 글

[NLP] Transformer①  (1) 2023.02.03