본문 바로가기

papers

Attention is all you need - 2 (모델 아키텍쳐1)

이번 글에서는 Transformer 구조에 대해 알아보자. 

Model Architecture

신경망 시퀀스 생성 모델은 인코더-디코더 구조가 대세였다. 인코더는 입력 시퀀스를 continuous representations(z)으로 매핑한다. z가 주어지면 디코더는 한번에 하나의 출력 시퀀스를 생성한다. 각 시점 별로 모델은 자동 회귀적인(auto-regressive) 성질이 있는데, 이전 시점에 생성한 symbol(representation)을 추가적인 입력으로 포함시킨다.

Transformer는 인코더와 디코더에서 self-attention, point-wise fully connected layer를 사용한다.

Transformer 모델 구조

Encoder and Decoder Stacks

Encoder

인코더는 동일한 N개의 층을 쌓는다. 논문에서는 6개를 쌓았다. 각 층은 두개의 하부 계층이 있다. 첫 계층은 multi-head self-attention mechanism이다. 두번째는 position-wise fully connected feed-forward network이다. 각 하부 계층에 residual connection과 layer normalization을 적용하였다. 이 결과 512차원의 임베딩 벡터를 출력한다.

Decoder

디코더 역시 N개(논문에선 6)의 층을 쌓는다. 디코더에는 인코더와 같은 두 하부 계층에 더해 인코더 스택에 multi-head attention을 수행하는 하부 계층이 있다. 디코더에도 residual connection, layer normalization이 적용되었다. 디코더는 self-attention을 변형하였는데, 특정시점(i시점) 이후의 시퀀스들이 i시점 출력 학습에 영향을 끼치는 것을 막기위해 시점 별로 하나씩 masking을 제거하는 방식을 사용했다.

Transformer 모델은 병렬처리를 효율적으로 하기 위해 행렬을 합쳐서(concat) 학습하는데, 각 시점을 나타내는 행렬 부분은 하나씩 마스킹된다고 생각하면 될 듯하다. 예를들어 4차원 벡터를 하나씩 마스킹하여 (3개 마스킹 벡터, 2개 마스킹 벡터, 1개 마스킹) 마스킹한 벡터들을 하나로 합치면 4x4 행렬을 만들수 있고 한번의 행렬 계산으로 출력을 구할 수 있다.
(고수 분들의 추가 댓글 설명 부탁드립니다 ^^..)

Attention

Attention은 벡터를 단위로 query와 key-value 쌍을 출력으로 매핑하는 함수이다. 출력은 value들의 가중합으로 계산하고 각 value는 query와 연결되는 key를 이용해 계산한다.

Scaled Dot-Product Attention과 병렬로 구성된 Multi-Head Attention

Scaled Dot-Product Attention

위 그림 왼쪽에 표현된 scaled dot-product attention은 k차원의 query와 key, v차원의 value로 구성되었다. 이 부분에서는 query에 대한 모든 key들의 내적을 구하고 k차원의 제곱근으로 스케일링한다. 이 값을 소프트맥스 함수에 입력하여 value의 weight으로 사용한다. 실제 학습에서는 여러 query들을 동시에 계산한다. key와 value들도 K, V의 행렬로 합쳐진다.

수식은 다음과 같다.

Attention 수식

Scaled Dot-Product Attention에서는 왜 내적을 계산할까? 결론적으로는 query와 key들의 유사한 정도를 측정해 query와 비슷한 특징을 가진 key를 계산해 학습에 선택 집중하기 위함이다. 두 벡터의 내적 값(scalar)의 비교를 통해 유사도를 계산할 수 있는데, query를 하나의 행렬로 만들고 key를 하나의 행렬로 만들면 모든 query에 대한 모든 key의 유사도를 구할 수 있다.

softmax를 거치면 query와 key의 계산으로 각 요소에 대한 가중치(q-k의 유사한 정도)가 나오는데, 가중치에 value를 곱해 query와 key의 유사성이 높다면 더 중요하게 그렇지 않다면 덜 중요하게 attention 하는 것이다.

attention 함수로 additive(합), dot-product(곱) 방식이 있다. Transformer에서는 곱방식에 스케일링하는데, 단일 hidden layer를 사용하는 합방식에 비해 곱방식의 attention은 GPU를 이용하여 행렬곱 계산에 이점이 있어 더 빠르고 실제 학습에서 효율적이다. 이 연구에서는 스케일링하는 k의 값이 큰 경우에는 softmax함수의 극단에 값이 위치해 기울기가 낮아져 학습에 불리해짐으로 스케일링 값에 제곱근을 취하였다.

Multi-Head Attention

keys, values, querys를 단일 attention으로 계산하는 것보다 qkv를 각각 linear projection하여 h번 학습하는 것이 긍정적인 효과를 낸다. qkv을 병렬적으로 학습하고 나뉘어 학습한 결과를 행렬합하여 v차원의 최종 벡터를 출력한다. Multi-head attention은 h층을 학습하는 qkv 가중치가 서로 다르기 때문에 qkv의 다양한 정보를 학습할 수 있다(확인 필요). Single attention은 평균을 내기 때문에 다양한 표현에 대한 장점이 없다.

본 연구에서는 8개의 attention layers를 병렬로 학습하였고 dk = dv = dmodel/h = 64로 설정하였다. Multi-head attention 벡터의 차원은 크기를 줄여 single-head, multi-head의 총 계산 비용이 같다. 즉, 동일한 비용으로 더 많은 정보를 담는 이점이 있다.

Applications of Attention in our Model

Transformer 구조에서는 multi-head attention을 세가지 목적으로 사용한다.

첫째로, 인코더-디코더 attention 구조에서 query는 디코더에서 오고 key와 value는 인코더의 출력이다. 이러한 구조로 인해 디코더의 각 시점에서 인코더의 출력결과인 입력시퀀스의 모든 정보를 활용할 수 있다.
둘째로, 인코더에 있는 self-attention의 qkv는 인코더의 이전 layer의 출력에서 온다. 인코더의 각 시점은 이전에 학습된 인코더의 모든 정보를 사용할 수 있다.
셋째로, 디코더의 self-attention 층은 특별한 장치가 없다면 모든 위치의 정보를 활용할 수도 있다. 이러한 특성으로 인한 부작용(leftward information flow)을 방지하기 위해 softmax에 입력하기 전에 scaled dot-product attention에 마스킹(masking out to -infinity)하여 auto-regressive한 특성을 보존하였다. 디코더의 query 값에 마스킹 하지 않으면 디코더 학습에 필요한 정답을 모두 알고 학습하는 것과 마찬가지이다.

(인코더 qkv: from source docs, 디코더 kv: from source docs, q: from target docs)

다음 글에서는 Transformer 모델 구조 설명에 필요한 Position-wise Feed-Forward Networks, Embeddings and softmax, Positional Encoding에 대해 공부하자.

Reference
https://arxiv.org/abs/1706.03762
https://www.aitimes.kr/news/articleView.html?idxno=17314
https://stats.stackexchange.com/questions/387114/on-masked-multi-head-attention-and-layer-normalization-in-transformer-model