[CS224n] Transformers: 셀프 어텐션, 멀티 헤드 어텐션, 포지셔널 임베딩 등

박수현·2022년 7월 5일
0

CS224n

목록 보기
1/5
post-thumbnail

From Recurrence (RNN) to Attention-based NLP Models

시퀀스-시퀀스 문제를 해결하는 seq2seq 모델은 RNN에 기반한 인코더-디코더 구조를 가지고 있으며, 입력 시퀀스의 정보 손실을 보정하기 위해 메모리에 유연하게 접근하는 어텐션 메커니즘이 사용된다.
RNN을 넘어서 인코더-디코더 구조에 더욱 적합한 하부 블록들을 설계하기 위해 많은 시행착오가 있었다.

Issues with recurrent models

1. Linear interaction distance

RNN은 왼쪽에서 오른쪽, 즉 토큰들을 순차적으로 처리한다. 이는 분산 표현의 특성상 이웃하는 단어들이 서로의 의미에 영향을 미친다는 linear locality를 인코딩하기 좋은 휴리스틱이었으나, 멀리 떨어져있는 단어쌍들 간의 상호작용을 인코딩하기 위해서는 O(sequence length)O(\mathrm{sequence\space length}) 번 연산이 요구된다는 문제가 있다. 기울기 소실 문제로 인해 기존 RNN 기반 seq2seq 모델은 장기 의존성을 학습하는 데 어려움이 있다.

2. Lack of parallelizability

위의 문제의 연장선상에서, 순전파와 역전파 과정에서 O(sequence length)O(\mathrm{sequence\space length}) 개의 연산이 병렬 처리가 불가능하다. 즉, GPU나 TPU와 같은 하드웨어 가속기로 개별 연산을 동시에 처리할 수 없는 것이다. 원인은 RNN의 은닉 상태들은 이전의 은닉 상태들이 모두 연산되고 난 후에야 구할 수 있다는 모델 구조에 있다. 이는 매우 큰 데이터셋을 훈련하는 데 장애가 되며, 시퀀스 길이가 늘어나면 메모리 제한으로 인해 하나의 배치에 많은 샘플들을 넣을 수도 없게 된다.

Self-attention instead of recurrence

어텐션 함수는 각 단어의 표현을 쿼리로 간주하고, 값들의 집합에서부터 정보를 가져온다.

  • seq2seq with attention: 디코더-인코더 어텐션
  • Self-attention: 인코더-인코더 (또는 디코더-디코더) 어텐션이며, 각 단어는 입력 (또는 출력) 시퀀스 내의 단어들에 주의를 기울인다.
    • 모든 단어끼리 상호작용하기 때문에 maximum interaction distance는 O(1)O(1)
    • 각 토큰에서 수행하는 계산은 다른 토큰의 계산과 독립적으로 이루어지기 때문에 순전파와 역전파를 병렬로 수행할 수 있다.

Understanding the Transformer Model

Ashish Vaswani, Noam Shazeer, Niki Parmar, Jakob Uszkoreit, Llion Jones, Aidan N Gomez, Lukasz
Kaiser, and Illia Polosukhin. 2017. Attention is all you need. In Advances in Neural Information Processing Systems, pages 6000–6010.

Vaswani et al.이 제안한 트랜스포머 모델은 6개의 인코더와 6개의 디코더로 이루어져있다.

(출처: Jay Alammar)

하나의 인코더와 디코더를 떼어놓고 보면 최종적으로 아래의 구조를 띠게 된다. 이와 같은 구조를 만들기 위한 과정은 인코더부터 순서대로 소개하고자 한다.

(출처: Vaswani et al.)

Encoder

+ Self-Attention

셀프 어텐션에서 쿼리는 각각의 키에 대해 주목하는 정도가 다르다. 여기서 어텐션 함수는 쿼리-키 쌍 간 '어텐션'을 가중치로 값들을 가중합하여 리턴한다.

셀프 어텐션에서는 쿼리, 키, 값이 모두 입력 시퀀스 내 모든 단어 벡터들이 된다. it과 같은 지시대명사가 가리키는 대상을 찾기 위해서는 입력 시퀀스 내 모든 단어와의 유사도를 계산함으로써 가장 높은 확률을 띠는 것을 리턴하면 된다.

(출처: Google AI Blog)

셀프 어텐션에서는 4단계의 연산이 수행된다.

  1. 쿼리, 키, 값 벡터 Q,K,VQ, K, V를 계산한다. 입력 시퀀스가 NN개의 단어로 이루어져있다고 하면, NN개의 dd차원 임베딩 벡터를 쌓은 행렬을 XRN×dX\in \mathbb{R}^{N\times d}라고 하자. 쿼리, 키, 값에 대한 세 가지 가중치 매개변수 행렬 WQ,WKRd×dkW^Q, W^K\in \mathbb{R}^{d\times d_k}, WVRd×dvW^V \in \mathbb{R}^{d\times d_v}이 있다. 이때 쿼리와 키의 가중치 매개변수 행렬은 내적 계산이 성립하도록 같은 차원이어야 한다.
    Q=XWQ,K=XWK,V=XWVQ=XW^Q, \quad K=XW^K, \quad V=XW^V

    (출처: Jay Alammar)

  2. 쿼리와 키를 내적하여 어텐션 스코어(attention score)를 계산한다. 어텐션 스코어를 계산하는 가장 기본적인 방법에 해당한다.
    E=QKTE=QK^T

  3. 소프트맥스 함수를 취하여 어텐션 스코어의 가중평균인 어텐션 가중치(attention weight)를 계산한다.
    A=softmax(E)A=softmax(E)

  4. 값들의 가중합을 구한다.
    Output=AV=softmax(QKT)Output=AV=softmax(QK^T)

    (출처: Jay Alammar)

+ Feed Forward

은닉층에서 데이터를 새로이 표상하는 효과를 부여하기 위해 은닉층의 활성화함수로 비선형함수를 사용하는데, 이를 위해 셀프 어텐션의 출력을 feed-forward 계층에 넣어준다.

+ Training Trick #1: Residual Connections

잔차 연결(Residual Connection)은 컴퓨터 비전 분야에서 모델을 더 잘 훈련시키기 위해 고안된 방법이다. 어떠한 계층 FF의 출력 전체가 바로 다음 계층의 출력이 되면 각 계층마다 학습을 진행해줘야 하는데, 그러면 수렴 난이도가 높아지게 된다.

이를 해소하기 위해 이전 단계의 입력 xl1x_{l-1}을 그대로 가져오면서 계층의 출력 F(xl1)F(x_{l-1})도 처리하게 되면 F(xl1)F(x_{l-1})는 "잔여" 정보가 된다. 잔여 정보만 새로이 학습하면 되기 때문에 모델의 학습 부담이 줄어든다.

xl=F(xl1)+xl1x_l=F(x_{l-1})+x_{l-1}

(출처: 위키독스)

  • 손실 함숫값들이 smoothing되어 최적값으로의 수렴이 용이해진다.

    (출처: Li et al.)

  • 여러 계층을 지나오면서 기존 입력값들에 있는 중요한 정보를 잊어버리거나 왜곡하는 현상을 방지한다.

+ Training Trick #2: Layer Normalization

계층 정규화(Layer Normalization)는 모델을 더 빠르게 훈련시키기 위해 고안된 훈련 기법이다. 하나의 배치 내에서 데이터 샘플 단위로 평균과 표준편차를 구해 정규화를 실행하는 것이다. 이는 하나의 배치 내에서 특성(feature) 단위로 정규화를 실행하는 배치 정규화(batch normalization)의 transpose로도 표현된다.

xx가 단어 벡터, μ\mu가 단어 벡터들의 평균, σ\sigma가 표준편차, γ\gamma가 'gain' 매개변수, β\beta가 편향이라고 하면 출력은 다음과 같다.

output=xμσ+ϵ×γ+βoutput = \dfrac{x-\mu}{\sigma+\epsilon}\times\gamma+\beta

+ Training Trick #3: Scaled Dot Product Attention

계층 정규화 이후 벡터값들은 평균 0, 표준편차 1로 정규화되지만, 쿼리와 키의 차원 dkd_k가 커질수록 쿼리와 키의 내적값이 매우 커지게 된다. 소프트맥스 함수에 매우 큰 입력값이 들어가므로 오버플로가 발생하거나, 모든 값들이 1에 가까워지면서 기울기가 0에 매우 가까워지는 기울기 소실 문제가 발생한다.
이를 해결하기 위해 표준편차가 1이 되도록 내적값을 dk\sqrt{d_k}로 나누어준다. 변경된 셀프 어텐션 출력식은 다음과 같다.

Output=softmax(QKTdk)VOutput=softmax(\dfrac{QK^T}{\sqrt{d_k}})V

여기까지의 방법들을 녹여낸 트랜스포머의 인코더는 다음과 같다. 아직 최종 형태에 도달하기 위해서는 두 가지 사항을 더 반영해야 한다.

+ Positional Encoding

RNN은 단어의 위치에 따라 단어를 순차적으로 입력받아 처리하기 때문에 각 단어의 위치 정보를 모델에 산입할 수 있다. 그러나 트랜스포머는 단어 입력을 순차적으로 받지 않기 때문에, 단어어의 위치 정보를 얻기 위해 각 단어의 임베딩 벡터에 위치 정보 벡터 pip_i를 더하여 모델의 입력으로 사용하는 방식을 취한다. 이를 포지셔널 인코딩(positional encoding)이라고 한다. 각 임베딩 벡터에 포지셔널 인코딩 값을 더하면 같은 단어여도 문장 내의 위치에 따라 트랜스포머의 입력으로 들어가는 임베딩 벡터의 값이 달라진다.

(출처: 위키독스)

트랜스포머 연구진은 임베딩 벡터 내 각 차원의 인덱스가 짝수인 경우에는 사인 함수의 값, 홀수인 경우에는 코사인 함수의 값을 포지셔널 인코딩에 사용한다. 함수의 주기성을 사용하기 때문에 시퀀스의 절대 위치에 구애받지 않는다는 장점이 있다.
더 높은 유연성을 위해서는 포지셔널 인코딩을 매개변수로 간주하여 훈련가능하도록 구현할 수도 있다. 매개변수 행렬 pp를 학습하고, pip_i가 그 행렬의 열이 되도록 하는 방식이다. 이럴 경우 데이터에 적합하게 포지셔널 인코딩을 수행할 수 있으나, 시퀀스가 늘어날 경우 extrapolate할 수 없다는 단점도 존재한다.

+ Multi-Headed Self-Attention

트랜스포머 연구진은 한 번의 어텐션을 하는 것보다 여러 번의 어텐션을 병렬로 사용하는 멀티 헤드 어텐션(Multi-Head Attention)이 효과적이라고 말한다. 입력 시퀀스를 여러 각도에서 주목함으로써 통사, 의미, 담화 관계 등 다양한 속성을 골고루 포착할 수 있다는 장점이 있기 때문이다.
hh개의 어텐션 헤드가 있으며, 각 어텐션 헤드는 위에서 이야기한 scaled self-attention을 독립적으로 수행한다. 각 헤드의 결과물은 결합되고 새로운 가중치 매개변수 행렬 WOW^O와 곱해져 최종 출력이 된다. 이때 각 어텐션 헤드에서 입력받는 Q,K,VQ,K,V 벡터는 d×dhd\times\dfrac{d}{h} 차원이어서 수행하는 연산의 총량은 이전과 같다.

MultiHead(Q,K,V)=Concat(head1,...,headh)WOwhere headi=Attention(QWiQ,KWiK,VWiV)\begin{aligned} \mathrm{MultiHead}(Q,K,V)&=\mathrm{Concat}(\mathrm{head}_1,...,\mathrm{head}_h)W^O\\\mathrm{where} \space \mathrm{head}_i&=\mathrm{Attention}(QW^Q_i,KW^K_i,VW^V_i) \end{aligned}

(출처: Jay Alammar)

최종 encoder 모양은 아래와 같다.

Decoder

+ Masked Multi-Head Self-Attention

인코더는 당연히 모든 입력 시퀀스에 대한 정보를 입력받아야 하므로 입력 시퀀스 내 모든 단어에 대해 셀프 어텐션을 적용했다. 그러나 디코더는 출력 시퀀스를 입력으로 한 번에 받기 때문에, 현재 시점의 단어를 예측하고자 할 때 입력 시퀀스 행렬로부터 미래 시점의 단어까지도 참고할 수 있는 현상이 발생한다. 이를 방지하기 위해 디코더는 예측해야 하는 것의 정답을 알면 안 되도록 설계해야 한다. 예를 들어, 트랜스포머를 가지고 기계번역을 할 때, 번역된 다음 단어가 무엇인지 모델이 미리 보면 안 되는 것이다.
디코더의 어텐션에서는 현재 보고 있는 단어 이후의 단어는 제외하기 위해 마스킹을 사용한다. 어텐션 스코어를 아주 작은 음수값으로 만들어 쿼리와 키의 내적에 소프트맥스함수를 취할 때 0이 되도록 만든다.

+ Multi-Head Cross-Attention

디코더의 첫번째 셀프 어텐션층을 통과한 뒤에는 다시 멀티 헤드 어텐션을 수행한다. 이때의 쿼리와 키는 인코더의 출력 벡터, 값은 마스킹된 디코더의 입력 벡터로서 서로 출처가 다르다. 즉 셀프 어텐션이 아니다.

+ Feed-Forward, Residual Connection, Layer Normalization

+ Linear

디코더가 출력한 임베딩 벡터는 모델이 훈련 데이터로부터 학습한 전체 어휘 집합의 크기에 맞춰 확장되어야 한다. 이 벡터는 Linear 계층을 통과한 뒤, 각 단어에 대한 logit을 담는 아주 큰 차원의 벡터로 재탄생한다.

+ Softmax

각 단어의 점수들을 확률로 변환하기 위해 소프트맥스 계층에 통과시키고, 가장 높은 확률을 갖는 단어를 최종 출력값으로 리턴한다.

최종 트랜스포머 구조를 보면 여기까지의 여정이 모두 담겨있는 것을 확인할 수 있다.

(출처: Vaswani et al.)

기계번역 태스크를 예시로 든 아래 gif로 트랜스포머 모델의 추론 과정을 확인해보자.

(출처: Jay Alammar)

Drawbacks of Transformers

트랜스포머는 기계번역 과제에서 낮은 훈련 비용으로 높은 BLEU 점수수를 보이고, 문서생성 과제에서도 낮은 복잡도로 높은 ROUGE-L 점수를 보일 정도로 매우 향상된 성능을 보여주었다. 또한, 트랜스포머의 셀프 어텐션이 도입한 병렬 연산의 가능성은 사전 학습(pre-trainin)의 효율성도 보장해줘 높은 GLUE 점수를 가지는 모델들의 기반이 되었다.

그렇지만 트랜스포머에서는 시퀀스가 길어질수록 셀프 어텐션에서 계산해야 하는 단어쌍들이 제곱수의 비율로 증가한다. 즉 연산이 2차 복잡도(quadratic complexity)를 가진다는 단점이 있다. 이를 해결하기 위해 트랜스포머에 변형을 가한 다양한 형태가 제안되었으나, 대부분 성능을 유의미하게 향상시키지는 못했다는 지적도 나왔다.


출처:
1. Stanford CS224N NLP with Deep Learning | Winter 2021 | Lecture 9 - Self- Attention and Transformers: slides, lecture video. 출처가 표기되지 않은 그림은 모두 강의 슬라이드에서 캡쳐해온 것이다.
2. 서울대학교 언어학과 108.413A 컴퓨터언어학 강의 | 2022 봄학기
3. 위키독스 | 딥러닝을 이용한 자연어 처리 입문 | 16. 트랜스포머(Transformer) | 1) 트랜스포머(Transformer)
4. The Illustrated Transformer | Jay Alammar

profile
SNU AI

0개의 댓글