또르르's 개발 Story

[14-1] Transformer 이해하기 (1) 본문

부스트캠프 AI 테크 U stage/이론

[14-1] Transformer 이해하기 (1)

또르르21 2021. 2. 4. 23:52

Sequential model에서 중간중간에 값이 빠져있거나, 순서가 뒤바뀐 값이 있으면 모델링하기 어렵다는 단점이 있습니다.

이런 문제를 해결하고 하는 것이 Transformer입니다.

Transformer는 RNN과 같이 재귀적인 구조를 사용하는 것이 아닌 attention이라는 구조를 가지고있습니다.

 

https://arxiv.org/abs/1706.03762

 

(Transformer는 이미지 분류, 이미지 detection 등에도 사용합니다.)

 

 

1️⃣ Transformer

 

Transformer는 sequence가 주어지면 다른 sequence로 바꿔주는 역할을 수행합니다.

예를 들어, 입력이 3개의 단어(프랑스어)로 되어있고 출력이 4개의 단어(영어)로 되어있는 경우와 같이, 입력 sequence와 출력 sequence는 개수가 다를 수 있습니다. (즉, 입력 sequence의 도메인과 출력 sequence의 도메인이 다를 수 있음)

 

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

 

RNN의 경우 3개의 단어가 있으면 3번 neural network가 돌아가게 됩니다.

하지만 transformer의 encoder는 3개의 단어가 들어가던 100번의 단어가 들어가던 100번 재귀적으로 돌지 않습니다. 다만, 한 번에 100개의 단어를 찍어냅니다.

 

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

 

물론 decoder에서 generation 할 때는 한 단어씩 만들긴 합니다. 그렇지만 encoder는 N개의 단어를 한 번에 처리할 수 있는 구조입니다.

 

Transformer는 각 6개씩의 encoder와 decoder가 동일한 구조는 갖지만 네트워크 parameter가 다르게 학습됩니다.

6개의 encoder와 6개의 decoder가 stack 되어 있습니다.

 

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

 

그렇다면 Transformer에서 궁금한 점은 3가지입니다.

 

  • 어떻게 encoder에서 n개의 단어가 한 번에 처리되는지?
  • Encoder와 decoder가 둘 사이에 어떤 정보를 주고받는지?
  • Decoder가 어떻게 generation을 할 수 있는지? (여기서 다루지 않음)

이 3가지 중 2가지에 대해 정리해보겠습니다.

 

 

2️⃣ Encoder

 

일단, Encoder의 형태에 대해서 알아봅시다.

Encoder에서는 n개의 입력을 넣으면 self-attention, feed forward neural network를 거치고 나온 n개의 출력이 다음 encoder로 넘어가는 형태입니다.

 

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

 

이때, Self-attention는 기존 딥러닝에서 새롭게 생긴 부분이며, Transformer의 핵심 부분인데요. 

Feed forward neural network 구조기존 Multi Neural Perceptron 하고 비슷한 모형이라고 생각하면 됩니다.

 

 

Encoder에 입력이 들어갈 때는 각 단어마다 특정 숫자의 벡터로 표현이 되게 됩니다. (Input vector)

 

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

 

만약, encoder에 입력에 3개가 주어지면 출력이 3개가 나오고 입력이 4개가 주어지면 출력은 4개가 나옵니다.

이때, self-attention에서 x1 벡터를 z1으로 넘겨줄 때, x1 벡터의 정보만 확인하는 것이 아니라 x2,x3의 정보를 같이 확인합니다.

 

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

 

하지만 feed forward는 no dependencies, 즉, 각각의 벡터가 다른 벡터에 영향을 주는 것이 아닌 벡터 자체만 변형해주는 것에 불과합니다.

 

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

 

 

1) Self-Attention

 

그렇다면 Self-Attention은 어떤 방식으로 동작하는 것일까요?

 

예시로 아래와 같은 문장이 있습니다.

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

여기서 it이 어떤 것을 나타내는 말일까요?

 

하나의 문장을 이해하려고 하면, 중요한 점은 뒤에 나오는 it이 어떤 단어에 dependent 하는지 알아야 합니다.

바꿔서 말하면 , 우리가 하나의 문장에 있는 단어에 대해서 설명할 때는 그 단어를 그 자체로만 이해하면 되는 것이 아닌, 문장 속에서 다른 단어들과 어떻게 interaction 하는지가 중요합니다.

 

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

 

여기서 itanimal을 선택한다고 볼 수 있습니다.

Transformer는 it이라는 단어로 encoding을 할 때, 다른 단어 간의 관계성을 보게 되고, 위 그림과 같이 학습된 결과를 보면 it이 animal과 굉장히 높은 관계(진한 색깔)가 있다고 학습이 된 것을 알 수 있습니다.

 

이런 식으로 기계는 더 잘 단어를 표현할 수 있고, 문장을 더 잘 이해할 수 있게 만들어줍니다.

 

 

이번에는 아래와 같은 문장이 주어졌다고 가정합니다.

Thinking Machines

단어 Thinking과 Machine이 주어졌을 때, 기본적으로 self-attention 구조는 3가지 벡터를 만들어냅니다. (3가지 벡터가 있다는 뜻은 3개의 neural network가 있다고 보면 됩니다.)

 

그 벡터는 Queries, Keys, Values

 

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

 

문장의 단어 하나하나마다 3개의 vector를 만들게 되고, embedding 된 X1 벡터를 새로운 vector로 변환시킬 것입니다.

 

첫 번째 해주는 것은 Score vector를 만드는 일입니다.

Score vector는 i번째(여기서는 첫번째 단어 : Thinking)에 대한 Score vector을 계산할 때,

encoding 하고자 하는 vector(Thinking)의 queries vector와 나머지 모든 n개 단어에 대한 key vector(자기 자신 포함)를 내적 합니다.

 

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

 

이 score vector의 의미는 i번째 단어(여기서는 첫 번째 단어 : Thinking)가 나머지 n개의 단어와 얼마나 유사도(관계;interection)가 있는지를 보는 것을 뜻합니다.

즉, Thinking이라는 단어를 encoding을 하고 싶은데 그때 어떤 나머지 단어들과 더 많이 interrection이 일어나야 하는지를 query vector와 나머지 vector들의 key vector의 내적으로 표현했다고 볼 수 있습니다.

 

따라서 이 i번째 단어와 나머지 n개의 단어가 얼마나 유사도가 있는지를 스스로 학습하게 하는 것입니다.

이것이 attention입니다.

Attention어떤 특정 task를 수행할 때 특정 timestep에 어떤 입력들을 더 주의 깊게 볼지를 뜻하는 것을 말합니다.

 

 

이후, score vector가 나오면 이 값을 normalize 해줍니다.

normalize는 dk로 나눠주는데 여기서 dkkey vector의 dimension 값(=query vector의 dimension)을 뜻합니다. 즉, key vector가 몇 차원으로 만들지에 대한 hyper parameter입니다.

 

여기서는 64개의 vector을 만들었고, 64=8 나눠준 값입니다.

normalize를 시켜주는 이유는 Score 값 자체가 너무 커지지 않게 만들어주려는 의미라고 합니다.

 

그러고 나서 normalize를 취한 score vector를 전체 값이 1이 되는 softmax함수에 넣어서 사용합니다.

이렇게 attention weight가 나오게 됩니다.

 

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

 

위의 빨간색 네모칸이 attention weight입니다.

Attention weight은 각각의 단어가 다른 단어 또는 자기 자신과 얼마나 interaction을 해야 하는가를 나타내고, scalar로 나옵니다.

 

 

마지막으로 계산된 Softmax값(scalar 값)과 각각의 단어에서 나오는 value vector들과의 weighted sum을 수행합니다.

즉, value vector들의 weight를 구하는 과정이 각 단어에서 나오는 attention(query vector * key vector -> normalize -> softmax)을 value vector와 weighted sum을 한 것을 뜻하고, 최종적으로 나오는 Thinking 단어(또는 Thinking이라는 단어 해당하는 embedding 된 vector)의 encoding 된 vector가 나옵니다.

위 과정을 다 거치게 되면 하나의 단어에 대한 encoding된 vector가 나오게 됩니다.

 

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

 

여기서 주의할 점은

qeury vector와 key vector는 항상 차원(dimension)이 같아야 합니다.하지만 value vector는 차원이 달라도 됩니다. (어쨌든 value vector는 weighted sum만 하면 되니까요. 하지만 대부분 같은 dimension을 사용합니다.) 

여기서 Thinking의 encoding 된 vector의 차원 z1은 value vector의 차원과 같습니다. (value vector를 weighted sum 한 값이기 때문)

 

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

 

Vector들의 형태에 대해서 다시 한번 살펴보면,

X vector(Input vector)단어의 개수, 단어의 embedding dimension을 뜻합니다.

K vector(Key vector)Attention dimension을 뜻합니다.

 

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

 

Transformer는 하나의 input이 고정되어있다고 하더라도, 옆에 있는 단어들에 따라서 encoding 된 값이 달라지게 됩니다.

그래서 Multi Layer Perceptron보다 조금 더 flex 한 모델이며, 더 많은 것을 표현할 수 있습니다. 바꿔 말하면 더 많은 것을 표현할 수 있기 때문에 더 많은 연산이 필요하다는 점이죠.

따라서 attention에서는 n개의 단어가 주어지면 n x n짜리 attention map을 만들어야 합니다. RNN과 비교했을 때 attention은 n x n의 입력을 넣기 때문에 처리할 수 있는 한계가 존재합니다.

 

 

Multi-headed attention은 앞에서 설명한 attention을 여러 번 반복하는 것을 말합니다.

n개의 attention을 반복하게 되면 n개의 encoding 된 vector가 나오게 됩니다.

 

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

 

Self-Attention의 입력과 출력의 차원을 맞춰주는 것이 중요합니다.

enbedding 된 vector의 dimensionencoding 되어서 self-attention으로 출력되는 vector의 dimension이 항상 같은 차원이어야 합니다.

 

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

 

그래서 위의 사진을 보면 8개의 attention head가 나오게 됩니다.

만약, 한 vector의 dimension이 10 dimension이었다면 8개의 head를 가지고 있기 때문에 concat 해서 8*10 = 80 dimension짜리 encoding vector가 나오게 됩니다.

 

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

 

그러면 concat 한 Z0...Z7에다가 다시 80 x 10짜리 vector WO (renewal map: 원래 X dimension 크기로 줄여주는)를 곱해서 10 dimensions으로 줄여버립니다.

 

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

 

하지만 실제로 구현체를 보면 이렇게 구현되어있지 않습니다.

구현체에서는 head와 dimension을 concat한 값이 아닌, dimension을 head로 각각 나눈 값을 사용하게 됩니다.

즉, 실제로 query, key, value vector를 만드는 것은 dimension/head 입력만 가지고 돌아가기 때문입니다.

 

 

이후 Postional encoding을 수행하는데 postional encoding은 bias의 값이라고 보면 됩니다.

 

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

 

그렇다면 postional encoding은 왜 필요할까요?

 

transformer 구조를 잘 생각해보면 n개의 단어를 sequencial 하게 넣어줬다고 하지만 sequencial 하다는 정보가 단어 안에 포함되어 있지 않습니다.

 

예를 들어,

a, b, c, d라는 단어를 넣거나,

b, c, d, a라는 단어를 넣거나,

d, a, c, b라는 단어를 넣거나,

 

a단어, b단어, c단어, d단어가 encoding 되는 값은 달라지지 않습니다.

self-attention이 동작하는 방법은 order(순서)에 independent(독립적임) 하기 때문이죠.

 

그렇지만 문장을 만들 때는 어떤 단어가 먼저 나오고 뒤에 나오는지가 중요합니다.

텍스트뿐 아니라 이미지도 어떤 위치에 먼저 나오는지가 중요합니다.

 

그래서 positional encoding이 필요하게 되고, positional encoding은 주어진 입력에 어떤 값을 더해주는 것입니다.

 

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

 

Positional encoding은 dimension 위치 값을 더해주는 것(i번째면 i번째 offset 값을 더해줌)입니다.

 

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

 

이후, Add & Normalize는 LayerNorm을 수행하게 됩니다.

 

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

 

2) Feed Forward

 

그 이후에는 feed forward가 수행됩니다.

각각의 encoding 된 vector들을 independent(독립적)으로 변환을 시켜줍니다.

 

 

3️⃣ Decoder

 

Encoder는 주어진 단어를 Vector로 표현하는 것이고, Decoder는 그 Vector 정보를 가지고 단어를 생성해내는 역할입니다. 그렇다면 encoder와 decoder가 둘 사이에 어떤 정보를 주고받을까요?

 

결론적으로 말하면 Encoder는 Decoder에 key vector와 value vector를 보내게 됩니다.

왜 key와 value vector를 보내냐면..

Encoder에서 i번째 단어를 encoding 할 때, i번째 단어의 query vector와 나머지 단어들의 key vector들을 곱해서 attention을 만들고 value vector를 weighted sum을 해서 만들었습니다.

그래서 decoder에서는 "input에 있는(encoder에 있는) 단어들""출력하고자 하는(decoder에 있는) 단어"들에 대해서 attention을 만들려면 "input에 해당하는 단어들의 key vector와 value vector"가 필요하고 encoder의 가장 상위 레이어(encoder는 multi-head로 되어있어서)에 있는 key vector와 value vector을 가지고 decoder에서 단어들을 만들게 됩니다.

 

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

 

따라서 "Decoder에 들어가는 단어들로 만들어진 query vector""Encoder에서 입력으로 주어지는 단어들로 얻어지는 key, value vector"를 가지고 최종 값이 나오게 됩니다.

그리고 최종 출력은 Autoregressive(자기 회귀: decoder에서 지금까지 나온 결과를 보고 그 결과를 다시 입력으로 넣어서 예측)하게 하나의 단어씩 만들게 됩니다.

(<end of sentence>를 사용해서 문장이 끝났다는 것을 알려줌)

 

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

 

1) Self-Attention Layer

 

Decoder의 self-attention layer에서는 학습할 때 이미 입력과 출력 정답을 알고 있습니다. 따라서 i번째 단어를 생성하는데 이미 모든 단어를 알고 있으면 학습하는데 의미가 없기 때문에 학습단계에서 masking이라는 것을 수행합니다.

 

masking이전 단어(과거)들만 depentdent 하고, 뒤에 있는 단어(미래)들은 depentdent하지 않게 만드는 것을 말합니다. Masking을 함으로써 미래에 있는 정보를 활용하지 않겠다는 뜻을 가집니다.

 

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

 

2) Encdoer-Decoder Attention layer

 

Encoder-Decoder Attention은 Encoder와 decoder사이의 관계를 뜻합니다.

Encoder-Decoder Attention layer는 multi-headed self-attention과 똑같습니다.

다만 다른 점은, query vector를 decoder의 selft-attention에서 가지고 오고, key, value vector를 encoder stack에서 가지고 옵니다.

 

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

 

3) Linear & Softmax layer

 

마지막 layer에서는 decoder의 출력 값들을 단어들의 분포로 만듭니다.

 

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

 

 

4️⃣ Vision Transformer

 

Transformer는 2017년도 논문이고 번역 문제에서만 사용이 되어왔지만, self-attention이라는 구조를 이미지 detection에서도 많이 사용하게 되었습니다.

 

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

 

Vision Transormer는 이미지 분류를 할 때 encoder만 활용하게 되고, encoder에서 나오는 output을 classification에 집어넣는 방식을 사용합니다.

 

 

DALL-E는 OpenAI에서 나온 네트워크인데 문장이 주어지면 문장에 대한 이미지를 만들어내는 방법입니다.

Transformer의 decoder만 활용을 했다고 알려져 있습니다.

 

https://openai.com/blog/dall-e/

 

 

5️⃣ 추가 내용

 

추가 내용은 Transformer 이해하기 (2)에서 정리하겠습니다.

 

[19] Transformer 이해하기 (2)

queries : 주어진 vector들 중에 어느 vector를 가져올지 기준이 되는 vector keys : 유사도가 계산되는 (내적이 되는) vector values : keys (유사도)와 매칭되는 vector 하지만 keys와 values는 dimension이 꼭..

dororo21.tistory.com

 

Comments