KT-Aivle School (AI)/딥러닝

[언어지능 딥러닝] Transformer

똔똔똔 2022. 10. 9. 01:39

Chapter 0. 요약

Transformer

=  attention seq2seq 모델에 이어, attention 을 활용한 또 다른 모델

= multi-head self-attention을 이용해 sequential computation 을 줄여 더 많은 부분을 병렬처리가 가능

= 동시에 더 많은 단어들 간 dependency를 모델링

 

self-attention

Transformer에게  현재 처리 중인 단어에 다른 연관 있는 단어들의 맥락을 불어 넣어주는 method

 

 

Chapter 1. Transformer

     Transformer : Motivation

Attention is All You Need!

 

Transformer 구조

RNN의 단점을 개선한 모델
= Long-term dependency 문제
    - RNN은 long-term dependency에 취약하다는 단점
    - Transformer에선 Attention을 통해서 해결


=  Parallelization
    - RNN은 학습 시, t번째 hidden state를 얻기 위해서
    - t-1번째 hidden state가 필요함
     즉, 순차적으로 계산해야 하므로 병렬처리를 할 수 없고 계산 속도가 느림

 

 

Transformer : 개괄적 설명

 

 

기계 번역의 경우를 생각해보면, 모델은 어떤 한 언어로 된 하나의 문장을 입력으로 받아 

다른 언어로 된 번역을 출력으로 내놓는다.

 

black box를 열어 보면 encoding 부분, decoding 부분, 그리고 그 사이를 이어주는 connection들을 볼 수 있다.

 

논문 기준, 인코더 6개, 디코더 6개

• 6 Encoders, 6 Decoders
• 모델d = 512 (인코더와 디코더의 입력과 출력의 크기)
• 임베딩 벡터의 차원 = 모델d
• num_heads = 8 (병렬 연산되는 어텐션 갯수) (어텐션 연산을 동시에 8군데에서 진행)
• d = 2048 (FFNN 은닉층의 크기, FFNN의 입력층과 출력층의 크기는 모델d)

 

 

인코딩 부분은 여러개의 인코더를 쌓아올려 만든 것 (여기서는 6개라고 가정)

디코딩 부분은 인코딩과 동일한 개수만큼 디코더를 쌓음

 

인코더들은 모두 똑같은 구조를 갖고 있으나 같은 가중치를 공유하지는 않음

 

하나의 encoder를 나눠보면 두개의 sub-layer로 구성되어 있다.

 

 

- 인코더에 들어온 입력은 먼저, self-attention layer을 지나가게 된다

(self-attention layer는 encoder가 하나의 특정한 단어를 encode 하기 위해서 입력 내의 모든 다른 단어들과의 관계를 살핌)

 

- 입력이 self-attention 층을 통과하여 나온 출력은 다시 feed-forward 신경망으로 들어간다.

(똑같은 feed-forward 신경망이 각 위치의 단어마다 독립적으로 적용되어 출력)

 

decoder에는 encoder-decoder attention 이 포함

 

 

- decoder 또한 encoder에 있는 두 layer 모두를 가지고 있다

- 두 층 사이에 encoder-decoder attention 이 포함

     decoder가 입력 문장 중에서 각 타임 스텝에서 가장 관련 있는 부분에 집중할 수 있도록 함

 

 

 

Transformer : 벡터 기준으로 보기

 

'I am a student' 의 프랑스어

- 각 단어들은 워드 임베딩을 통해 벡터로 변환

- 각 단어들은 크기 512의 벡터

 

 

- 워드 임베딩은 encoder에서 발생

- 모든 encoder는 크기 512의 벡터 리스트를 입력으로 받음 (벡터 리스트 사이즈는 하이퍼 파라미터)

(학습 데이터 셋에서 가장 긴 문장 길이로 설정 가능)

 

- 입력 문장들의 단어들을 임베딩한 후,

- 각 단어에 해당하는 벡터들은 encoder 내의 두 개의 서브 레이어로 들어감

 

- 이 리스트를 먼저 self-attention layer에, 그다음으로 feed-forward 신경망에 통과

- 그 결과물을 그다음 encoder에게 전달

 

각 위치의 단어들은 각각 다른 self-encoding 과정을 거친다

- Z들은 모두 context vector

 

 

* 참조 

Input Vector의 형태

여기서는 인풋 사이즈가 512

문장의 길이는 그렇게 길지 않기 때문에

문장 끝에 eos라는 문장의 끝을 알리는 스페셜 토큰 이후로는 모두 패딩 처리

 

 

 

 

Transformer – Architecture

Encoder 구조

- 동일한 구조를 갖는 N개 layer로 구성

- 각 layer는 두 개의 sub-layer로 구성

    ① Multi-Head Self-Attention

    ② Feed Forward Network

- Positional Encoding

    • 단어의 위치 정보를 인코딩

 

 

Decoder 구조

- 동일한 구조를 갖는 N개 layer로 구성

- 각 layer는 세 개의 sub-layer로 구성

    ① (Masked) Multi-Head Self-Attention masking을 통해, 현재 단어보다 이후에 있는 단어에 대해 attention 안 줌

    ② Encoder-Decoder Attention

    ③ Feed Forward Network

 

 

* Masked Multi-Head Attention
단어 a를 예측할 때는 a 이후에 있는 b, c에는 attention이 주어지지 않는다.
b를 예측할 때는 b 이전에 있는 a에만 attention이 주어지고, 이후에 있는 c에는 attention이 주어지지 않는다.
출처 : https://pozalabs.github.io/transformer/

 

 

 

Self-Attention

 

The animal didn't cross the street because it was too tired

 

위 문장을 번역하고자 한다. 

 

이때 위 문장에서 밑줄 친 'it'의 의미는 무엇일까? 

사람에게는 너무나도 간단한 질문이지만 신경망 모델에게는 간단한 문제가 아니다.

 

이때 모델은 self-attention을 이용하여 'it'과 'animal'을 연결지을 수 있다.

 

모델이 입력 문장 내의 각 단어를 처리해 나감에 따라,

self-attention은 입력 문장 내의 다른 위치에 있는 단어들을 보고

거기서 힌트를 받아 현재 타겟 위치의 단어를 더 잘 인코딩할 수 있다.

 

= Transformer에게는 이 self-attention이 현재 처리 중인 단어에 다른 연관 있는 단어들의 맥락을 불어 넣어주는 method

 


 

Scaled Dot-Product Attention


- 현재의 단어(Query)가 어떤 단어와 관련성이 있는지 알기 위해 한 문장 내 모든 단어(Key)들과 dot-product 연산을 한다.

(dot-product 연산 = 서로 벡터를 곱한다)

Transformer에서 Attention은 위 수식으로 계산


- query 단어와 key 단어를 dot-product한 뒤 softmax를 한다.
    • 하나의 query와 모든 key들 간의 연관성(유사성)을 계산한 뒤 그 값들을 softmax를 통해 확률 값으로 만든다.
    • 따라서 query 단어가 어떤 key 단어와 높은 연관성을 갖는지 알게 된다.
    • softmax를 거친 값을 value에 곱하면 query와 유사한 단어일수록, 즉 중요한 단어일수록 더 높은 값을 가지게 된다.


- Dimension의 루트 값으로 나눈다 (Scaled)
    • dimension이 커질수록 dot-product 값이 커지는 것을 방지하는 효과

 

두 단어간 유사도는 cosine similarity로 계산
= 현재 처리 중인 단어 (query)가 어떤 단어와 가장 관련성이 큰지 알 수 있다.


 

Self-Attention – Matrix Calculation (in detail)

 

행렬  X 의 각 행은 입력 문장의 각 단어에 해당, 우측은 행렬 형태로 표현한 self-attention 계산

행렬 X는 동일한 단어

- 가장 먼저, 입력 문장에 대해 Query, Key, Value 행렬들을 계산한다.

- 이를 위해 우리의 입력 벡터들 (혹은 embedding 벡터들)을 하나의 행렬 X로 쌓아 올리고

- 그것을 학습할 weight 행렬들인 WQWKWV 로 곱한다.

(W은 쿼리, 키, 밸류를 각각 만들어내는 가중치)

(이 가중치들이 학습의 대상이고, 학습을 하는 과정에서 이러한 가중치들이 옵티마이저를 통해 조정됨)

 

 

우측 그림에서 self-attention 계산 단계를 표현한 것을 볼 수 있음

 

 

Multi-Head Attention

self-attention layer에다 “multi-headed” attention이라는 메커니즘을 더해 더욱더 개선한다.

 

multi-headed attention의 효과

 

1. 모델이 다른 위치에 집중하는 능력을 확장.

2. attention layer 가 여러 개의 “representation 공간”을 가지게 해줌.

 

multi-headed attention을 이용함으로써 여러 개의 query / key / value weight 행렬들을 가지게 된다.

이 각각의 query / key / value  set은 랜덤으로 초기화되어 학습된다.

학습이 된 후 각각의 세트는 입력 벡터들에 곱해져 벡터들을 각 목적에 맞게 투영시키게 되는데,

이러한 세트가 여러개 있다는 것은 각 벡터들을 각각 다른 representation 공간으로 나타낸 다는 것을 의미한다..

 

입력 벡터들의 모음인 행렬 X를 WQ/WK/WV 행렬들로 곱해 각 head에 대한 Q/K/V 행렬들을 생성

 

 

self-attention 계산 과정을 8개의 다른 weight 행렬들에 대해 8번 거치게 되면,  8개의 서로 다른 Z 행렬이 나온다.

= 8개의 서로 다른 가중치 행렬이 존재

 

서로 다른 8개의 연산과, 서로 다른 8개의 가중치 행렬

 

 

Multi-Head Attention –concatenate & multiply

단, 이때 이 8개의 행렬을 바로 feed-forward layer으로 보낼 수 없다

(feed-forward layer 은 한 위치에 대해 오직 한 개의 행렬만을 input으로 받을 수 있음)

 

     8개의 행렬을 하나의 행렬로 합쳐야 함

일단 모두 이어 붙여서 하나의 행렬로 만들어버리고, 그다음 하나의 또 다른 weight 행렬인 W0을 곱해버린다.

 

 

 

위에서 본 문장 "The animal didn't cross the street because it was too tired" 에서

it을 encode할 때, 주황색의 attention head 는 “그 동물”에 가장 집중하고, 초록색의 head는 “피곤”이라는 단어에 집중한다.

 

= 모델은 이 두 개의 attention head를 이용하여

“동물”과 “피곤” 두 단어 모두에 대한 representation 을 “it"의 representation에 포함시킬 수 있다.

 

 


Multi-Head Attention 총정리

multi-headed self-attention의 모든 과정 요약

 

1) 입력 문장이 들어옴 ("Thinking Machine")

2) 워드임베딩

3) 멀티헤드 

4) 연산결과, 쿼리 키 밸류 벡터가 나옴

5) 각각 가중치행렬 연산을 하여 나온 z행렬들을 모두 합침

= Z를 얻음


 

Positional Encoding

= 시퀀스의 순서 나타내기

 

Transfomer모델은 어떻게 입력 문장들의 순서를 파악할까

 

- Transformer 모델은 각각의 입력 embedding에 “positional encoding”이라고 불리는 하나의 벡터를 추가한다.

- 이 벡터들은 모델이 학습하는 특정한 패턴을 따르는데,

- 이러한 패턴은 모델이 각 단어의 위치와 시퀀스 내의 다른 단어 간의 위치 차이에 대한 정보를 알 수 있게 한다

 

 

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

 

= 같은 단어라도 단어가 위치한 자리에 따라 임베딩 값이 달라진다는 것이 핵심

 

 

 

Architecture - Residual Connection

각 encoder 내의 sub-layer 가 residual connection으로 연결되어 있으며, 그 후에는 layer-normalization과정을 거친다

positional encoding이 결합되어 들어간다.

Residual Connection
- 서브레이어의 결과값에 기존 입력값을 더해주는 방법 (Add)
- 레이어를 거칠수록 gradient가 소멸되는 vanishing gradient 문제를 완화하여 심층 신경망 학습에 도움


이어서 Layer Normalization을 수행
- gradient가 exploding하거나 vanishing하는 문제를 완화
- gradient가 안정적인 값을 가지게 되어 더 빨리 학습

 

 

이러한 구조는 디코더 내에 있는 sub-layer들에도 똑같이 적용되어 있다.

 

2개의 encoder과 decoder으로 이루어진 단순한 형태의 Transformer

 

 

 

Architecture - FFNN

= Fully-connected Feed Forward Neural Network

많은 정보를 학습할 수 있도록 레이어를 더욱 더 쌓는다

 

 

 

Architecture - Decoder

 

<작동과정 1>

- encoder가 먼저 입력 시퀀스를 처리하기 시작한다.

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

- 이들은 각 decoder의 “encoder-decoder attention” layer에서 decoder가 입력시퀀스에서 적절한 장소에 집중하게 한다.

디코더 작동과정.gif

- encoding 단계가 끝나면 이제 decoding 단계가 시작된다

- decoding 단계의 각 스텝은 출력 시퀀스의 한 element를 출력

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

- 각 스텝마다의 출력된 단어는 다음 스텝의 가장 밑단의 decoder에 들어가고

encoder와 마찬가지로 여러 개의 decoder를 거쳐 올라간다.

 

- encoder의 입력에 했던 것과 동일하게 embed를 한다

 

- positional encoding을 추가하여 decoder에게 각 단어의 위치 정보를 더해준다.

<작동과정 2-5>

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

- 차이점은 Query행렬들을 그 밑의 layer에서 가져오고 Key와 Value 행렬들을 encoder의 출력에서 가져온다는 점

 

Key와 Value 행렬들을 encoder의 출력에서 가져온다

 

 

 


추가)

도대체 Query, Key, Value란 무엇인가?

 

Thinking과 Machine이라는 단어는 가중치 행렬들을 만나 각각의 쿼리, 키, 밸류 행렬을 생성한다.

 

Thinking이 쿼리일 때, 각각 단어들의 키들과 attention 연산을 수행한다

(이때, 임베딩된 단어가 직접 연산되는 것이 아닌, 분신과도 같은 쿼리와 키들이 연산이 된다)

 

연산결과, 값들이 너무 커지지 않도록 스케일링을 진행한다.

(ex. 8로 나눈다)

 

그 후 softmax 연산을 통해 확률 연산을 한다.

 

 

 

그리고 이전에 구해놓았던 밸류 벡터와 softmax 결과 나온 확률값을 연산한다.

그 결과 context vector가 나온다.

 

 


 

Linear Layer과 Softmax Layer

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

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

= Linear layer, Softmax layer

 

<Linear layer>

= fully-connected 신경망으로 decoder가 마지막으로 출력한 벡터를 훨씬 더 큰 사이즈의 벡터인 logits 벡터로 투영시킨다.

 

어떤 모델이 training 데이터에서 총 10,000개의 영어 단어를 학습하였다고 가정

(이를 모델의 “output vocabulary”라고 부른다).

그렇다면 이 경우에 logits vector의 크기는 10,000이 될 것이다 – 벡터의 각 셀은 그에 대응하는 각 단어에 대한 점수가 됨.이렇게 되면 Linear layer의 결과로서 나오는 출력에 대해서 해석을 할 수 있게 된다.

 

<softmax layer>

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

(셀들의 변환된 확률 값들은 모두 양수 값을 가지며 다 더하게 되면 1이 됨)

가장 높은 확률 값을 가지는 셀에 해당하는 단어가 해당 스텝의 최종 결과물로서 출력되게 됩니다.

 

 

decoder에서 나온 출력은 Linear layer 와 softmax layer를 통과하여 최종 출력 단어로 변환

 

 

 

 

학습 과정

• 기계번역을 위한 학습을 할 때, source language 문장과 target language 문장의 쌍이 학습데이터임

 

“오늘은 목요일입니다”,   “Today is Thursday”
“merci” ,  “thanks”
“Je suis étudiant” ,  “I am a student

 

 

one-hot encoding으로 단어 표현

output vocabulary 가 6개의 단어만

((“a”, “am”, “i”, “thanks”, “student”, and “<eos>” (‘end of sentence’의 줄임말))) 포함하고 있다고 가정

단어 ‘am’에 대한 one-hot encoding 벡터

 

 

정답 문장(번역문)을 벡터로 표현한 예시 

(각 단어에 대한 one-hot encoding)

 

모델을 큰 사이즈의 데이터 셋에서 충분히 학습을 시키고 나면, 

트랜스포머 모델로 학습한 결과로 생성되는 확률 분포들은 다음과 같다.

 

학습된 모델의 결과

여기서 특이한 점은, 학습의 목표로 하는 벡터들과는 달리,

모델의 출력값은 비록 다른 단어들이 최종 출력이 될 가능성이 거의 없다 해도

모든 단어가 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들이다.)

 

 

 

 

 

참조

http://jalammar.github.io/illustrated-transformer/

 

The Illustrated Transformer

Discussions: Hacker News (65 points, 4 comments), Reddit r/MachineLearning (29 points, 3 comments) Translations: Arabic, Chinese (Simplified) 1, Chinese (Simplified) 2, French 1, French 2, Japanese, Korean, Russian, Spanish, Vietnamese Watch: MIT’s Deep

jalammar.github.io

https://nlpinkorean.github.io/illustrated-transformer/

 

The Illustrated Transformer

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

nlpinkorean.github.io