이번에 소개할 모델은 Transformer로, 이 논문을 처음 제안한 "Attention Is All You Need"의 논문과 여러 자료를 참고하여 알게 된 내용들을 포스팅하겠습니다. 

 

Sequence Modeling 

Sequence Modeling이란, 시계열 데이터, 텍스트, 음성, 비디오 등의 연속적이고, 순차적인 데이터에서 패턴과 관계를 학습하여 해당 시점(Time point) 이후에 다음으로 나올 값을 예측하는 것을 의미합니다. Transformer가 등장하기 전에는 RNN, LSTM이 Sequence Modeling에서 가장 좋은 성능을 보이고 있었습니다. 하지만, 이런 모델들은 본인들이 예측한 결과가 다음 Time Step에서 입력으로 들어가야 하는 학습 구조에서 오는 문제가 발생하였습니다. 

 

  • Parallelization :
    이전 Time Step에서 결과가 도출되기 전까지는 이후의 Time Step에 대한 학습을 할 수가 없으므로, Computing 성능과는 별개로 학습에 시간이 오래 걸린다는 단점을 가지고 있습니다. 

  • Long-Term Dependency :
    서로 거리가 멀리 떨어져 있는 단어들에 대한 관계 정보들을 모델이 학습하는 데에 어려움을 가지고 있습니다. Sequence(문장)에서 앞 부분에 있는 단어에 대한 정보가 여러 Layer를 지나면서 점점 전달이 되지 못합니다. Back-propagation의 관점에서 보면, Time Step마다 가중치들이 곱해져, 큰 차수를 가지게 되는데 이로 인해 가중치가 1을 기준으로  1보다 작으면 Gradient가 0에 수렴해버리고(Gradient Vanishing), 1보다 크면 Gradient가 무한대로 발산해버리는(Gradient Explosion) 현상이 발생하게 됩니다. 이렇게 Gradient가 제대로 업데이트 되지 못하여 모델의 학습 성능이 떨어집니다. 

 

위의 문제들을 해결하기 위해서 나온 방법이 바로 "Attention Mechanism"입니다.

 

 

 

Word Embedding & Positional Encoding

 

Word Embedding

Text를 머신러닝, 혹은 딥러닝 모델에 입력으로 넣어주기 위해서는 단어들을 모델이 이해할 수 있는 벡터의 형식으로 표현하는 것을 의미하며, 이 과정에서 단어의 의미 정보와 관계들을 반영할 수 있습니다. 

각 언어마다 제공이 되는 말뭉치가 존재하며, 이 말뭉치에 있는 단어들의 인덱스와 Word Embedding 가중치 행렬의 곱으로 각 단어를 벡터로 표현하는 것이 가능해집니다. 또한, Transformer는 가중치 행렬의 각 요소들도 학습이 가능하도록 하여 최적의 성능을 낼 수 있는 단어 벡터를 생성합니다. 

이해를 돕기위한 예시를 들면, 영어 말뭉치에서 Apple, Block, Kiwi라는 세가지 단어에 대해서 생각을 했을 때, Word Embedding 가중치 행렬을 곱하여 Transformer 모델이 입력으로 받는 형식인 512 차원의 벡터를 단어마다 생성할 수 있습니다. 

"Apple"과 "Kiwi"의 관련성이 두 단어와 "Block"과의 관련성보다 높다는 것을 우리는 자연스럽게 알 수 있습니다. 세 단어에 대한 임베딩 된 벡터를 보면, 이 벡터들의 위치 관계를 파악한다고 했을 때, Apple과 Kiwi의 거리가 Block과의 거리보다는 짧도록 벡터가 생성이 됩니다.

이해를 돕기 위해 512차원의 벡터를 단순히 3차원의 좌표공간에 임의로 표현하였습니다.

모델에서는 이런 수치화 된 정보들을 학습하여, 단어나 문장의 의미를 학습할 수 있게 되고, 다음 단어를 예측할 수 있게 됩니다.

 

Positional Encoding

Transformer에서는 RNN, LSTM과 달리 문장을 구성하고 있는 모든 단어들에 대한 Word Vector가 Matrix의 형식으로 한번에 입력이 됩니다. 이로 인해서 Transformer에는 단어들의 위치 정보를 반영하는 Positional Encoding이 필요하게 됩니다. 단어들의 위치 정보를 반영하기 위해서 동일한 차원(512차원)의 Positional Encoding Vector를 생성하여 Word Embedding 과정을 거친 단어 벡터에 Element-wise Sum을 하게 됩니다. 이런 계산 과정은 2가지 조건이 지켜져야 합니다. 

 

  1. 모든 위치에 대한 값들은 문장의 길이와 상관 없이 동일한 값을 가져야 한다. 
    문장 길이의 길고 짧음과 상관없이 문장들의 첫번째 단어는 동일한 Positional Encoding Vector를 가져야 합니다. 
  2. Positional Encoding Vector들의 요소 값들의 크기는 일정한 범위를 유지해야 한다. 
    위치 값이 너무 작다면, 위치에 대한 정보가 제대로 반영이 되지 않을 것이고,
    위치 값이 너무 크다면, 상대적으로 단어 벡터에 대한 값들이 작아져 단어의 의미 정보가 제대로 전달이 되지 않게 됩니다. 


이 조건을 만족하는 함수로는 Sin, Cos 함수가 있습니다. 

  1. 문장이 길어지더라도 함수 값이 존재하여, 길이에 따라 상대적인 위치를 계산해야 할 필요가 없습니다.
  2. 함수 값들은 x에 상관없이 전부 -1 ~ 1 사이의 값을 가지게 됩니다. 

 

하지만, 두 함수는 주기함수이기 때문에, 주기가 끝나게 되어 다른 주기로 넘어가게 되면, 값들이 중복될 수도 있다는 문제가 발생하게 됩니다. 따라서 Transformer에서는 단어 벡터의 차원에 따라서 Sin, Cos 함수를 정의하고, 주기를 변경합니다. 

 

Positional Encoding Vector의 각 요소들을 계산하는 함수들은 다음과 같습니다. 

단어의 위치, 단어 벡터의 차원에 따른 Positional Encoding Vector의 값

여기에서 pos는 단어가 문장에서 몇번째 단어인지를 의미하는 변수이며, i는 단어 벡터의 차원을 의미합니다.

 

위 수식에서 함수 값들에 주목하기 보다는 Positional Encoding Vector에서 중복 값을 피하고 위의 2가지 조건을 지키기 위해서 서로 다른 주기의 Sin, Cos 함수를 사용하여 해결했다는 점에 초점을 두면 될 것 같습니다. 

 

 

Attention Mechanism

 

Transformer에서 가장 핵심 개념인 Attention에 대해서 알아보겠습니다. 
Attention에서는 Query, Key, Value라는 용어를 사용하게 됩니다. Query, Key, Value에 대한 의미를 간단하게 정리를 해보자면,

  • Query : 분석의 대상이 되는 단어에 대한 가중치 벡터
  • Key  : 단어가 Query와의 유사도를 계산하는 데에 있어 사용되는 가중치 벡터
  • Value : 단어의 의미를 나타내는 가중치 벡터


Query, Key, Value는 Word Embedding과 Positional Encoding을 거쳐 생성된 Input Matrix(한 문장의 모든 단어들에 대한 단어 Vector를 Concat해서 생성된 단어 Matrix)에 각각의 가중치 행렬(W^Q, W^K, Q^V)을 곱해서 Query, Key, Value에 대한 Matrix를 계산하게 됩니다. 이때, 각각의 가중치 행렬 또한 학습이 될 수 있도록 하여, Transformer의 학습이 진행되면서 Query, Key, Value가 더욱 적절하게 생성될 수 있도록 합니다. 

Input Matrix로부터 Query, Key, Value Matrix가 생성되는 과정

Key와 Value의 관계는 Python Dictionary에서 {Key : Value}의 쌍과 비슷하다고 생각을 하면 조금 더 수월하게 이해할 수 있습니다. Dictionary 자료형은 Key를 통해서 Value를 얻는 형식으로 되어 있습니다. 여기에서도 Key와 Value는 한 쌍으로 구성됩니다. Query가 Key와의 계산을 통해 각 단어에 대한 가중치를 생성하게 되면, 이 가중치들과 각 단어들에 대한 Value가 가중합을 하여 최종적인 Attention Output이 생성됩니다. 


조금 더 세부적으로 살펴보겠습니다. 


Transformer에서 사용하는 Attention 함수는 "Scaled Dot-product Attention"이며, 수식은 다음과 같습니다. 

Q, K, V는 각각 Query, Key, Value에 대한 Matrix를 의미하는 것이며, d_k는 Key Matrix의 차원을 의미합니다.
(d_k는 Key Matrix의 차원으로, 결국 Query와 Value의 Matrix의 차원과도 동일합니다.)

이 수식이 어떻게 연산이 되는지에 대해서 알아보겠습니다. 

Scaled Dot-Product Attention


한 단어에 대한 Query Vector가 비교할 문장에 있는 모든 단어의 Key Vector과의 유사도를 구합니다. 이 때, Query와 Key 벡터의 유사도를 구할 수 있는 방법에 따라서 Attention 함수의 종류가 달라지게 되는데, 여기에서는 내적(Dot-product)를 통해서 유사도를 구해 Attention Score를 계산하게 됩니다. 여기까지의 부분이 (QK^T)라고 볼 수 있습니다.

(Query가 Vector로 표현이 되는 것이 아니라 Matrix로 표현이 된 것은 모든 Query에 대해서 동일한 연산을 수행하기 때문에, 문장 내의 모든 단어들에 대한 Query를 Matrix로 만들어 병렬 계산하기 때문입니다.)


내적을 통해 유사도를 구한 이후 Key Matrix의 차원의 제곱근으로(sqrt(d_k)) Attention Score들을 나눠주게 됩니다. 이는 Query, Key, Value가 차원이 증가할수록 더 많은 수가 더해지게 될 것이고, 그에 따라서 분산은 증가하는 경향을 보이게 됩니다. 이 연산 과정에서 분산이 증가하게 된다면, Attention Score에서 소수의 값들만 매우 큰 값을 가지게 될 것이고, 이 외의 나머지 값들은 거의 0에 수렴하는 값들을 가지게 되어, 결과적으로 모델이 학습에 어려움을 겪게 되는 문제를 발생시킵니다.


따라서,  Query, Key, Value의 차원의 수에 영향을 받지 않도록 하기 위해서 Key(Query, Value 모두 동일한 차원) Matrix의 차원의 제곱근으로 Attention Score를 나눠줍니다. 이 부분으로 인해서 해당 연산의 명칭이 Scaled Dot-product Attention이 된 것입니다. 


분산의 영향력까지 통제를 한 이후에는 Attention Score의 값들이 Soft-max 함수의 입력으로 들어가 확률 형태의 값들로 변환됩니다. 여기에서 확률 형태의 값이라는 것은 값들이 모두 0 ~ 1 사이의 값을 가지게 되고, 모든 값들을 더하게 되면 1의 값을 갖게 되는 조건을 만족하는 형태를 의미합니다. 이렇게 Key-Query 쌍의 각 단어마다의 가중치가 설정됩니다. 가중치들은 Key와 대응되는 Value와 각각 곱해져 Attention 연산의 최종 Output이 생성됩니다.

Attention 연산에 대해서 다시 한번 정리를 하자면,

Query가 Key와의 유사도를 계산하여 어떤 Value에 더 주목해야 하는지에 대한 연산이라고 볼 수 있습니다.

 

Self-Attention vs. Cross-Attention

Attention이라는 단어만큼, Self-Attention이라는 단어에 대해서도 자주 들어보았을 것입니다. Self-Attention을 검색하다 보면, 다음과 같은 식이 나오는 것을 확인할 수 있습니다. 

이렇게 등호(=)를 사용하여 Self-Attention은 Query, Key, Value가 동일하다는 표현을 하고, 반대로 Cross-Attention에서는 Query와 Key-Value의 쌍이 서로 다르다는 표현을 합니다. 이를 이해하기 위해서는 등호의 의미를 정확하게 파악해야 하는데, 등호의 의미는 절대적인 값들이 동일하다는 것이 아니라, Query, Key, Value가 추출된 문장이 동일한지 여부를 나타내는 표현입니다.

따라서, Self-Attention의 경우에는 Query, Key, Value가 모두 동일한 하나의 문장에서 계산된 Matrix들이라는 것을 의미하며, Cross-Attention의 경우에는 Query가 추출된 문장과, Key-Value 쌍이 추출된 문장이 서로 다르다는 것을 의미합니다. 

Self-Attention은 한 문장 내에서 서로 다른 단어들끼리 어떤 관계를 가지고 있는지를 파악하기 위해 수행하며
Cross-Attention은 언어를 변환하는 과정에서 동일한 의미를 가진 서로 다른 언어 문장에서 단어들 간의 관계를 파악하기 위해 수행됩니다. 

Transformer 모델에서는 두가지 Attention이 모두 사용됩니다. 

Transformer 구조 내에서 Self-Attention 연산(좌), Cross-Attention 연산(우)

 

 

 

Transformer 모델 구조

 

'Attention Is All You Need'에서 제안된 Transformer의 구조도
Transformer 모델 구조

Transformer 모델 역시도 Sequence Modeling에서 자주 사용되는 구조인 Encoder-Decoder 구조를 사용하고 있습니다. 여기에서 회색 점선은 Inference 시에 동작하는 것을 의미하는 것으로, 실제 학습 과정에서는 해당 동작이 포함되지 않습니다. 

Encoder는 동일한 Encoder Block 6개로 구성되어 있으며, Decoder 역시 동일한 Decoder 구조 6개로 구성되어 있습니다. 6개의 Encoder Block을 거쳐 나온 Input Vector로 부터 연산된 Context Vector가 각 Decoder Block의 입력으로 들어가 모델의 학습이 진행됩니다. Decoder에서는 현재 Time Step에서 알고있는 결과들과 Encoder에서 계산된 Context Vector를 통해서 다음 단어가 어떤 것이 올지에 대한 예측을 진행하게 됩니다.

통상적으로 하나의 Encoder Block과 Decoder Block을 layer라고 칭하며, 그 안에 들어있는 여러 단계 혹은 함수들을 Sub-layer라고 부릅니다. 

 

Encoder Block

Ebcoder 내에는 총 4개의 Sub-layer로 Multi-Head Attention, Position-wise Feed Forward, Add & Norm으로 구성되어 있습니다. 가장 먼저 확인해볼 것은 Add&Norm sub layer로 Feed Forward와 Attention 연산 이후에는 항상 Add & Normalization을 진행하는 것을 확인할 수 있습니다. 

Encoder Block 구조

  • Add(=Residual Connection) : 
    해당 Sub-layer에서 입력으로 들어오는 데이터와 해당 Sub-layer에서의 연산의 결과를 더해주는 것으로 Gradient Vanishing을 방지하여 학습 성능을 올려주는 역할을 하게 됩니다. 이를 위해서는 각 연산의 입력 데이터와 결과가 동일한 차원을 가져야 한다는 조건을 가지게 됩니다. 
  • Normalization(= Layer Normalization) : 
    문장마다 길이가 가변적이라는 점으로 인해서 Batch Normalization을 수행할 수 없게 되고, 이를 해결하기 위해 Sequence Modeling에서 자주 사용되는 기법 중 하나입니다. Layer Normalization은 배치 내의 Sample 별로 평균과 표준편차를 계산하여 정규화를 진행합니다.

 

Layer Normalization

  • Multi-Head Attention : 
    Head는 Attention 연산의 주체를 의미합니다.
    Transformer에서는 기존 하나의 Query, Key, Value input에 대해서 한번의 Attention 연산을 수행하는 One-Head Attention보다는 Head를 여러개로 하는 Multi-Head Attention을 통해서 여러 관점에서 해당 Query가 주목해야 할 Key-Value 쌍이 무엇인지를 확인하여 모델의 학습 성능을 높이는 방식을 택하고 있습니다.

    이후에 조금 더 알아보겠지만, Transformer 모델 내에서 연산 중에 Input Vector의 차원과 Output Vector의 차원이 동일해야 하므로, Head의 수와 Key의 차원이 다음과 같은 관계를 가지도록 설정합니다. 

    d_k는 이전에도 보았듯이 Key의 차원을 의미하며, h는 Attention Head의 개수, d_model은 Input vector의 차원을 의미합니다. 이렇게 Head마다 Query, Key, Value를 나눠 Attention 연산을 진행하여 결과들을 Concatenation하고, 선형 변환을 이용하여 여러 Attention 함수의 연산 결과들을 하나로 통합하는 과정을 진행합니다. 

다음의 이미지는 처음 Transformer를 제안한 논문에서 제공한 Figure로 학습한 모델의 5번째 Encoder 학습된 Transformer의 5번째 Encoder Block에서 서로 다른 2개의 Head가 Attention 연산을 한 결과를 시각화 한 자료입니다. 

분명히 동일한 문장의 단어들이 입력으로 들어가 연산이 되었지만, Head 별로 주목하는 부분에 차이가 있다는 것을 한눈에 볼 수 있습니다.

 

  • Position-wise Feed Forward : 
    Position-wise Feed Forward 는 우리가 일반적으로 알고 있는 Fully-Connected Layer입니다. 2개의 층으로 이루어져 있으며, 512차원의 vector를 2048 차원으로 증가시킨뒤 ReLU 함수를 거쳐 다시 512차원으로 선형 변환을 하는 과정입니다. 

    Position-wise라는 것은 어떤 의미를 가지고 있을까요? 
    Position-wise는 문장에서 각 단어마다 동일한 Layer에서는 동일한 가중치를 가진 Feed-Forwrad network가 적용됨으로써, 단어들을 Concat하여 병렬 연산이 가능할 수 있도록 하였습니다. 

    Position-wise Feed Forward는 입력으로 들어오는 벡터에 비선형성을 증가시킴으로써, Self-Attention을 통해서 학습할 수 있는 능력을 추가적으로 제공하는 역할을 하게 됩니다. 

 

 

Decoder Block

Decoder Block에서도 Encoder에서 설명한 연산들이 동일하게 수행되었습니다. Encoder Block과의 차이점은 Attention 연산이 2번 수행된다는 점과 두번째 Attention 연산에서 들어가는 화살표(Query, Key, Value) 중 2가지는 Encoder를 거친 Context Vector에서 들어온다는 점입니다. 

Decoder Block

 

Masked Multi-head Attention

Masked Multi-Head Attention은 Transformer가 학습하는 특징으로 인해서 가지게 된 구조입니다. Transformer는 학습시에 예측해야 할 문장의 전체 단어에 대한 Embedding Matrix가 Labeld로 입력이 됩니다. 현재 Time Step의 단어들이 어떤 단어에 주목할지 연산하는 과정에서 특정 시점에 예측을 해야 하는 단어가 해당 단어보다 뒤에 예측이 되는 단어에 집중을 하게 된다면, Inference 시에 제대로 된 성능을 낼 수 없게 됩니다. 

이를 위해서 Query와 Key의 내적 연산의 결과 값이 Soft-max함수에 들어가기 전에 각 단어마다 그 단어 뒤에 예측이 되어야 하는 단어들의 Attention Score를 전부 음의 무한대로 설정을 하게 됩니다. 이것을 Look ahead mask라고 부릅니다. 

Look-ahead Mask

이미지를 보면 행렬의 대각선을 기준으로 오른쪽 위의 요소들이 전부 음의 무한대로 마스킹 된 것을 확인할 수 있습니다. 이 상태에서 Soft-max 함수에 들어가게 되면, 마스킹이 된 값들은 거의 0에 가까운 확률 값을 가지게 됩니다.

 

 

Decoder의 2번째 Multi-Head Attention 연산

Decoder Block에서 설명할 마지막 부분은 Decoder Block의 가운데에 위치하고 있는 Multi-head attention입니다. 이는 Encoder Block에서 봤었던 연산과는 조금 차이가 있습니다. 바로 Self-Attention이 아닌 Cross-Attention이라는 점 때문입니다. Label 문장에서 연산된 값이 Query로 들어가게 되고, 외부에서 들어오는 두 화살표는 6개의 Encoder Layer를 거쳐 생성된 Context Vector로부터 계산되어 나온 Key Value 쌍입니다. Attention에서는 Key-Value가 쌍으로 움직인다는 사실을 기억하면 3가지 화살표 각각이 어떤 것을 의미하는 지 혼동하지 않을 수 있습니다. 이 연산을 통해서 Label 문장에서의 각 단어들이 Input 문장으로 들어온 단어들 중 어느 단어에 주목을 해야하는 지에 대해서 모델이 학습을 할 수 있게 됩니다. 

Key-Value는 Encoder로부터, Query는 Label 문장으로부터 생성된 값이다.

Decoder Block에서 설명하지 않은 Feed-Forward와 Add & Norm 은 Encoder Block에서와 동일하게 작용하므로, 설명은 생략하겠습니다.

 

 

After Decoder (= Dense Soft-max Layer)

Dense Soft-max Layer

Decoder를 전부 거친 후에 나오게 된 값은 512차원을 가지는 벡터가 나오게 됩니다(각 단어를 기준으로 보았을 때). 정보를 포함하고 있는 이 결과 벡터를 최종적으로는 변환하려는 언어의 말뭉치에 포함된 단어의 개수만큼의 차원으로 변경을 해주어야 합니다. 그리고 이것을 각 단어에 대한 확률 값으로 변경하여, 최종적으로 해당 위치에 들어갈 확률이 가장 높은 단어로 에측을 진행하게 됩니다.

 

이 과정에서 512차원의 벡터를 말뭉치의 단어 개수만큼의 차원으로 변경하기 위해서 선형 변환(Fully Connected Layer, 구조도에서는 Decoder Block 바로 위의 Linear 블록)을 수행하고, 이를 확률 값으로 변경하기 위해서 가장 마지막에 Soft-max 함수를 거쳐 Final Output이 생성됩니다. 

 


Ref.

https://velog.io/@yjinheon/Attention-is-All-You-Need-%ED%95%B5%EC%8B%AC

https://www.pinecone.io/learn/batch-layer-normalization/#what-is-layer-normalization

https://heekangpark.github.io/nlp/attention

https://cpm0722.github.io/pytorch-implementation/transformer

https://wikidocs.net/22893

https://www.blossominkyung.com/deeplearning/transfomer-positional-encoding

 

728x90
반응형

'딥러닝 > 자연어처리' 카테고리의 다른 글

[NLP] GPT-2 논문리뷰  (0) 2023.01.16
[NLP] GPT 논문 리뷰  (0) 2023.01.13
[NLP] Bert 논문 리뷰  (0) 2023.01.13
[NLP] Transformer 논문 리뷰  (0) 2023.01.03
[NLP] seq2seq Learning  (0) 2023.01.03
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기