Transformer
Transformer 분석
Transformer
2017년에 구글이 발표한 “Attention is all you need”라는 논문에서 제안된 모델
기존의 seq2seq 구조를 따르면서도 이름처럼 어텐션(Attention) 메커니즘만을 사용하여 구현
RNN을 사용하지 않고도 인코더-디코더 구조를 설계한 이 모델은 번역 성능에서 RNN보다 우수한 결과를 보임
기존의 seq2seq 모델은 인코더-디코더 구조로 이루어져 있었으며, 인코더는 입력 시퀀스를 하나의 벡터 표현으로 압축하고, 디코더는 이 벡터 표현을 기반으로 출력 시퀀스를 생성한다.
기존 seq2seq 모델
- RNN : Recurrent Neural Network
- LSTM : Long Short-Term Memory
-
GRU : Gated Recurrent Unit
문제점
- Gradient Exploding & Vanishing
- Long-term Dependency
- Attention RNN
- 중요한 부분이 어디인지 계산하여, 중요한 부분에 집중
- 사라져 가는 정보에 Attention 연산을 수행하는 문제점
Attention
기본 아이디어는 디코더가 출력 단어를 예측하는 각 시점(time step)마다 인코더에서의 전체 입력 문장을 다시 한 번 참고
모든 입력 단어를 동일한 비율로 고려하는 것이 아니라, 해당 시점에서 예측해야 할 단어와 관련 있는 입력 단어 부분에 더 집중(attention)
어텐션 함수
Attention(Q, K, V) = Attention Value
'쿼리(Query)'에 대한 모든 '키(Key)'와의 유사도를 개별적으로 계산하고, 이러한 유사도를 해당 키와 연결된 각 '값(Value)'에 반영
유사도가 반영된 '값(Value)'을 모두 합산하여 반환
Q: 모든 시점의 디코더 셀에서의 은닉 상태들
K: 모든 시점의 인코더 셀의 은닉 상태들
V: 모든 시점의 인코더 셀의 은닉 상태들
셀프 어텐션은 Q, K, V가 전부 동일한 것을 의미
Transformer에서는 Encoder Self-attention, Masked Decoder Self-attention, Encoder-Decoder Attention의 세 가지의 어텐션이 사용
두 self-attention은 자신의 동일한 Q, K, V를 가지지만 세번째 Encoder-Decoder Attention에서는 Query가 디코더의 벡터이고 Key와 Value는 인코더의 벡터이다.
Transformer에 대한 구글 AI 블로그 포스트에서 발취
The animal didn’t cross the street because it was too tired.에서 그것(it)에 해당하는 것은 길(street)일까? 동물(animal)일까?
우리는 피곤한 주체가 동물이라는 것을 아주 쉽게 알 수 있지만 기계는 그렇지 않다. 하지만 셀프 어텐션은 입력 문장 내의 단어들끼리 유사도를 구하므로서 그것(it)이 동물(animal)과 연관되었을 확률이 높다는 것을 찾아낸다.
Q, K, V 벡터 얻기
셀프 어텐션은 입력 문장의 단어 벡터를 기반으로 작동한다. 그러나 실제로는 셀프 어텐션을 수행하기 위해 인코더의 초기 입력인 단어 벡터들로부터 Q벡터, K벡터, V벡터를 얻는 과정이 필요하다.
이러한 Q벡터, K벡터, V벡터는 초기 입력의 차원과는 달리 더 낮은 차원을 가지며, Transformer에서는 초기 입력으로부터 512차원의 각 단어 벡터를 64차원의 Q벡터, K벡터, V벡터로 변환했다.
위의 64라는 값은 Transformer의 다른 Hyperparameter인 num_heads로 결정된다. Transformer에서는 num_heads 값을 8로 설정하였고, 이로인해 512/8=64차원의 Q벡터, K벡터, V벡터로 변환해야 한다.
student라는 단어의 512차원 임베딩 벡터에 512 X 64 차원의 크기를 가진 Q 가중치, K 가중치, V 가중치 행렬을 각각 곱하여 Q, K, V 벡터를 얻어낸다.
Q, K, V 벡터를 얻었다면 지금부터는 기존의 어텐션 메커니즘과 동일하다.
각 Q벡터는 모든 K벡터에 대해서 어텐션 스코어를 구하고, 어텐션 분포를 구한 뒤에 이를 사용하여 모든 V벡터를 가중합하여 어텐션 값 또는 컨텍스트 벡터를 구한다. 그리고 이를 모든 Q벡터에 대해서 반복한다.
Transformer 논문에서 사용된 주요 Hyperparameter
Transformer의 인코더와 디코더에서의 정해진 입력과 출력의 크기를 의미함. 임베딩 벡터의 차원 또한
Transformer에서 하나의 인코더와 디코더를 층으로 생각하였을 때, Transformer 모델에서 인코더와 디코더가 총 몇 층으로 구성되었는지를 의미. 논문에서는 인코더와 디코더를 각각 총 6개 쌓았다.
Transformer에서는 어텐션을 사용할 때, 한 번 하는 것 보다 여러 개로 분할해서 병렬로 어텐션을 수행하고 결과값을 다시 하나로 합치는 방식을 택했다. 이때 이 병렬의 개수를 의미함.
Transformer 내부에는 피드 포워드 신경망이 존재하며 해당 신경망의 은닉층의 크기를 의미. 피드 포워드 신경망의 입력층과 출력층의 크기는
Scaled dot-product Attention
Transformer에서는 어텐션 챕터에 사용했던 내적만을 사용하는 어텐션 함수
어텐션 스코어에 소프트맥스 함수를 사용하여 어텐션 분포(Attention Distribution)을 구하고, 각 V벡터와 가중합하여 어텐션 값(Attention Value)을 구한다.
이를 단어 I에 대한 어텐션 값 또는 단어 I에 대한 컨텍스트 벡터(context vector)라고도 할 수 있다. am에 대한 Q벡터, a에 대 Q벡터, student에 대한 Q벡터에 대해서도 모두 동일한 과정을 반복하여 각각에 대한 어텐션 값을 구한다.
행렬 연산으로 일괄 처리하기
각 단어 벡터마다 일일히 가중치 행렬을 곱하는 것이 아니라 문장 행렬에 가중치 행렬을 곱하여 Q행렬, K행렬, V행렬을 구한다.
행렬 연산을 통해 어텐션 스코어는 Q행렬을 K행렬을 전치한 행렬과 곱해준다. 이렇게 되면 각각의 단어의 Q벡터와 K벡터의 내적이 각 행렬의 원소가 되는 행렬이 결과로 나온다.
행렬의 값에 전체적으로
예를 들어 I 행과 student 열의 값은 I의 Q벡터와 student의 K벡터의 어텐션 스코어 값이 된다. 이걸 어텐션 스코어 행렬이라 하면. 어텐션 스코어 행렬을 구하였다면 남은 것은 어텐션 분포를 구하고, 이를 사용하여 모든 단어에 대한 어텐션 값을 구하는 일이다. 이는 간단하게 어텐션 스코어 행렬에 소프트맥스 함수를 사용하고, V행렬을 곱하는 것으로 해결된다.
Transformer 논문에 기재된 수식과 정확하게 일치하는 식
Multi-head Attention
Transformer 연구진은 한 번의 어텐션을 하는 것보다 여러번의 어텐션을 병렬로 사용하는 것이 더 효과적이라고 판단함.
어텐션이 8개로 병렬로 이루어지게 되는데, 이때 각각의 어텐션 값 행렬을 어텐션 헤드라고 부른다. 이때 가중치 행렬
병렬 어텐션으로 얻을 수 있는 효과는? 그리스로마신화에는 머리가 여러 개인 괴물 히드라나 케로베로스가 나온다. 이 괴물들의 특징은 머리가 여러 개이기 때문에 여러 시점에서 상대방을 볼 수 있다는 것이다. 이렇게 되면 시각에서 놓치는 게 별로 없을테니까 이런 괴물들에게 기습을 하는 것이 굉장히 힘이 들것이다. 멀티 헤드 어텐션도 똑같이 어텐션을 병렬로 수행하여 다른 시각으로 정보들을 수집하겠다는 것이다.
댓글남기기