티스토리 뷰

트랜스포머 인공지능 분야 전반에 걸쳐 범용적으로 사용되고 있는 아키텍처입니다. 본 리뷰는 Attention Is All You Need 논문에서 제안하는 트랜스포머 아키텍처의 구조, 동작 원리, 구현 디테일에 포커스를 둡니다.

 

 

 

 

1.   Abstract & Introduction

본 논문이 발표되기 이전에는 복잡한 CNN 또는 RNN로 구성된 인코더-디코더 구조의 모델이 기계 번역 태스크에서 우위를 점하고 있었습니다. SOTA는 인코더-디코더에 어텐션 매커니즘을 적용한 모델이었다고 합니다. 본 논문은 CNN과 RNN을 사용하지 않고 오직 어텐션 매커니즘으로만 이루어진 트랜스포머라는 아키텍처를 제안합니다. 트랜스포머의 이러한 구성은 계산을 더욱 병렬적으로 처리할 수 있게 하여 모델의 학습 시간을 매우 많이 줄였다고 합니다. 뿐만 아니라 성능의 측면에서도 기존의 SOTA를 능가합니다.

 

 

자연어 처리 분야에선 RNN이 매우 많이 사용되었습니다. RNN은 입력 시퀀스를 순차적으로 처리하므로, 학습 데이터를 병렬적으로 처리할 수 없어 연산량이 큽니다. 이러한 연산량을 줄이려는 노력이 있었지만, 시퀀스를 순차적으로 처리한다는 근본적인 제약 때문에 한계가 있었습니다. 어텐션 매커니즘 또한 RNN에 접목되는 식으로 사용되어 왔다고 합니다. 트랜스포머는 오직 MLP와 어텐션 매커니즘만 사용하므로 RNN의 recurrence 속성을 갖지 않습니다.

 

 

 

 

2.   Model Architecture

인코더-디코더 구조는 기계번역 태스크에서 매우 경쟁력 있는 아키텍처입니다. 트랜스포머도 이러한 인코더-디코더 구조를 따릅니다.

  • 인코더는 입력 시퀀스의 각 단어의 임베딩 벡터 $(x_{1} , ..., x_{n})$를 받아서 $z=(z_{1}, ..., z_{n})$의 연속적인 표현으로 매핑합니다.
  • 디코더는 번역 결과 시퀀스인 $(y_{1}, ..., y_{m})$를 하나씩 순차적으로 출력합니다. 디코더가 $y_{i}$를 출력하는 각 스텝마다 모델은 auto-regressive하게 동작합니다. 즉, 디코더는 $y_{i}$를 출력하기 위해 자기 자신이 만들어낸 $y_{i-1}$를 입력값으로 사용합니다.

 

 

 

 

 

 

위의 그림에서  왼쪽이 인코더 레이어, 오른쪽이 디코더 레이어입니다.

 

 

 

 

2.1   Encoder and Decoder Stacks

인코더는 여러 개의 인코더 레이어로 구성됩니다. 인코더 레이어는 두 개의 서브 레이어로 구성됩니다. 첫 번째는 multi-head self-attention 레이어이고, 두 번째는 fully-connected 레이어 입니다. self-attention은 입력 문장의 각 단어들끼리의 연관성을 파악하여 문장의 전체적인 representation을 학습합니다.

 

 

디코더 또한 여러 개의 디코더 레이어로 구성됩니다. 디코더 레이어는 세 개의 서브 레이어로 구성됩니다. 첫 번째, 두 번째 서브 레이어는 multi-head attention 레이어 입니다. 첫 번째 서브 레이어는 출력 문장에 대해 self-attention을 수행합니다. 이때 현재 $i$번째 스텝이라면, 출력 문장의 $1 \sim i-1$번째 단어만을 이용하여 self-attention을 수행해야 합니다. $i$번째보다 뒤에 있는 단어들을 어텐션할 수 있다면 모델은 뒤에 나올 단어가 어떤 단어인지를 치팅하는 것과 마찬가지이므로, 학습이 제대로 되지 않는다고 합니다.

 

 

가령 "나는 한국어를 공부하고 있다"라는 문장이 있다고 합시다. 이는 영어로 "I am studying Korean"로 번역해야 하는데, 모델이 "studying"을 출력할 때 뒤 쪽에 등장하는 단어인 "Korean"을 어텐션할 수 있게 하면 안 된다는 뜻입니다. 모델은 "I", "am", "studying", "Korean"을 순차적으로 출력하기 때문입니다.

 

 

두 번째 multi-head attention 서브 레이어는 출력 문장의 각 단어와 입력 문장의 각 단어의 연관성을 학습하는 encoder-decoder attention을 담당합니다. 세 번째 레이어는 feed-forward 레이어입니다.

 

 

 

 

인코더 레이어, 디코더 레이어의 각 서브 레이어에는 학습의 최적화 난이도를 낮추기 위해 residual connection, 과적합 방지를 위해 layer normalization 기법이 적용됩니다. 더불어 residual connection을 용이하게 적용하기 위해서 인코더 레이어, 디코더 레이어의 입력 dimension과 출력 dimension을 동일하게 설정했다고 합니다. 아무래도 크기가 맞지 않을 때 residual connection을 적용하기 위해선 projection등의 연산이 필요하기 때문인듯 합니다.

 

 

 

 

 

 

 

 

위의 그림은 트랜스포머의 inference 과정을 도식화한 것입니다. 한국어 문장을 영어 문장으로 번역하는 모델을 예로 inference 과정을 살펴봅시다. "나는 학생이다"라는 문장을 번역하고 싶습니다. 이 문장은 여러 encoder layer로 구성된  encoder를 거칩니다. 그 결괏값은 decoder에 있는 모든 decoder layer에서 사용됩니다. 그 이유는 decoder layer에서 encoder-decoder attention을 수행해야 하기 때문입니다. 중요한 점은, decoder를 한 번 거칠 때마다 번역된 단어를 하나씩 얻을 수 있다는 것입니다(decoder layer가 아니라 decoder임을 주의합시다). 즉, 트랜스포머가 "I am a student"라는 번역 결과를 출력한다고 가정할 때 decoder 계산이 총 $4$번 일어날 것입니다. 각 encoder/decoder layer는 서로 다른 파라미터를 가지고 개별적으로 학습된다는 사실 또한 중요합니다. 즉, encoder를 구성하는 encoder-layer는 서로 가중치를 공유하지 않고, decoder도 마찬가지입니다.

 

 

 

 

 

 

2.2   Attention

트랜스포머가 어떻게 기계번역 태스크를 수행하는 지를 대략적으로 다루었습니다. 그렇다면, 그 안에서 일어나고 있는 중요한 연산인 어텐션 매커니즘이 정확히 무엇인지 알아볼 차례입니다. 논문에선 query, key, value 라는 벡터들의 쌍으로 어떤 결괏값을 만들어내는 것을 어텐션이라고 정의합니다. query, key, value는 단어에 해당하는 벡터입니다. 보통 NLP 분야에서 단어는 임베딩 벡터로 표현되어 모델에게 주어집니다. 임베딩 벡터의 차원은 사람이 직접 지정하는 하이퍼 파라미터입니다. 이를 $d_{model}$이라고 합시다. 그리고 query, key, value 벡터는 모두 $d_{k}$차원이라고 합시다. 단어의 임베딩 벡터를 query, key, value 벡터로 변환하기 위해 $({d_{model} \times d_{k})}$차원의 행렬이 필요합니다. 이를 $W_{Query}, W_{Key}, W_{Value}$라고 합시다. 임베딩 벡터에 선형 변환을 적용해서 query, key, value를 구합니다. 행렬 연산을 통해 문장에 있는 모든 단어에 각각에 해당하는 query, key, value를 한 번에 계산할 수 있습니다.

 

 

 

 

 

 

 

 

$d_{model}=4, d_{k}=2$인 상황에서 "I", "love", "you" 각각에 대한 query, key, value를 구했으니, 이들로 어텐션을 구해봅시다. 어텐션의 결과는 weighted sum of the values입니다. 여기서 각 단어의 value에 부여되는 weight는 query와 key로 계산됩니다.

 

 

 

 

2.2.1   Scaled Dot Product Attention

 

 

 

위의 그림은 어텐션 매커니즘의 계산 플로우를 나타냅니다. Q, K, V는 각각 query, key, value의 약자입니다. query와 key를 곱한 값에 스케일링을 적용하고 softmax function을 적용해 준 값이 weight임을 알 수 있습니다. weight에 value를 곱해주면 어텐션 결괏값을 얻을 수 있습니다. 어텐션 매커니즘을 구체화하여 수식으로 표현하면 아래와 같습니다.

 

 

$ Attention(Q, K, V) = {softmax({QK^{T} \over \sqrt{d_{k}}})V} $

 

 

위 수식을 통해 파악할 수 있는 사실이 몇 가지 있습니다. $Q$와 $K$를 곱해야 하므로 두 벡터의 차원이 같아야 합니다. 또한 스케일 값이 $1 \over \sqrt{d_{k}}$인 것을 알 수 있습니다. $d_{k}$는 벡터 $K$의 차원입니다. 스케일링을 하는 이유는 softmax function의 개형 때문입니다. softmax function은 $x=0$ 부근에선 상대적으로 큰 기울기를 갖지만, $x$가 작아지거나 커짐에 따라 기울기가 대폭 작아지는 개형을 갖습니다. 그러므로 $QK^{T}$ 값을 $0$에 가까운 값으로 스케일링함으로써 그라디언트를 살려 원활한 학습을 유도할 수 있습니다.

 

 

 

 

 

 

 

 

 

 

 

수식을 그대로 따라서 query와 key를 곱했습니다. 모든 단어의 query, key, value를 한 번에 구했듯이, 모든 query와 key의 쌍을 곱하는 것도 행렬을 통해 한 번에 처리한 것입니다. 그 결과를 어텐션 에너지라고 부릅니다. 여기까지가 $QK^T$이므로, 이를 스케일링하고 softmax function을 적용한 뒤 value와 곱해주면 어텐션을 얻을 수 있습니다.

 

 

 

 

 

 

 

 

 

 

 

2.2.2   Multi-Head Attention

어텐션 매커니즘 자체는 그저 행렬곱과 가중합 등으로 구성된 간단한 연산임을 알 수 있습니다. 논문에선 어텐션 매커니즘을 더욱 효과적으로 사용하기 위해 multi-head attention이라는 기법을 도입합니다. 바로 위에서 설명한 기본적인 어텐션 매커니즘은 one-head attention이라고 볼 수 있습니다. 즉, 각 단어에 대응되는 query, key, value가 정확히 $1$개씩 있습니다. 논문에선 multi-head의 개수를 $h$라고 할 때, 각 head에 대응되는 query, key, value의 차원을 $d_{model}/h$로 설정한 뒤 얻은 서로 다른 $h$개의 어텐션을 이용함으로써 모델의 성능을 향상시킵니다.

 

 

즉, 각 단어에 해당하는 (query, key, value) 쌍이 $h$개 있는 것입니다. 이들로 서로 다른(다양한) $h$개의 관점에서 어텐션을 수행하는 것으로 해석할 수 있습니다. 각 어텐션 매커니즘에 사용되는 query, key, value 차원을 그만큼씩 줄였으므로 multi-head attention의 연산량은 single-head attention과 별반 다르지 않습니다. 그저 고차원의 query, key, value로 수행한 single-head attention보다는 저차원의 (query, key, value) 집합들로 수행한 각각의 어텐션을 이용하는 것이 더 좋다는 것입니다. multi-head attention은 정확히 아래 수식으로 표현됩니다.

 

 

 

\begin{align*} MultiHead(Q, K, V) &= Concat(head_{1}, ..., head_{h}) \\ where \, head_{i} &= Attention(QW_{i}^Q, KW_{i}^K, VW_{i}^V) \end{align*}

 

 

 

$QW_{i}^Q, KW_{i}^K, VW_{i}^V$는 query, key, value를 $d_{model}/h$차원으로 프로젝션하기 위한 선형 변환 행렬입니다. 각 어텐션의 차원은 $(seq \_ num \times d_{model}/h)$이므로, $h$개의 어텐션을 모두 이어붙이면 $(seq \_ num \times d_{model})$ 차원의 행렬을 얻을 수 있습니다. $seq \_ num$은 단어의 개수입니다. 여기에 $(d_{model} \times d_{model})$차원의 프로젝션 행렬을 취하여 최종 결과를 얻습니다.

 

 

 

 

 

 

 

multi-head attention는 위의 figure처럼 시각화될 수 있습니다. 구현에선 모든 $i$에 대해 $QW_{i}^Q, KW_{i}^K, VW_{i}^V$ 행렬 각각이 존재하여 학습되진 않습니다. 실제 구현은 아래와 같습니다.

 

 

 

 

 

 

 

 

 

예를들어 $head$의 개수가 $2$개이고, $d_{model}=4$라고 합시다. 그렇다면 헤드 하나당 query의 차원은 $2$입니다. 이때 그냥 $W_{Query}$라는 $(d_{model} \times d_{model})$ 차원의 행렬 하나를 학습하면 됩니다. 이 행렬의 열을 $2$개 단위로 나눈 뒤, 각 부분이 $W_{i}^Q$에 해당한다고 생각하면 됩니다. 그렇다면 결과 행렬도 동일한 방식으로 각각의 $head$에 해당하는 query들이 concat된 형태라고 취급하면 됩니다.

 

 

 

 

 

2.2.3  Applications of Attention in our Model

이러한 multi-head attention 매커니즘을 트랜스포머 아키텍처에서 세 가지 방식으로 이용됩니다.

  • 인코더-디코더 어텐션 : 디코더 레이어가 출력한 결과에서 query를, 인코더의 최종 출력에서 key, value를 뽑아내어 어텐션을 수행합니다. 즉, 번역 결과 문장의 각 단어가 입력 문장의 모든 단어를 대상으로 어텐션합니다.
  • 인코더 셀프 어텐션 : 인코더 레이어가 출력한 결과에서 query, key, value를 뽑아내어 어텐션을 수행합니다. 즉, 입력 문장을 구성하는 단어끼리의 어텐션 및 문장 전체에 대한 representation을 학습합니다.
  • 디코더 셀프 어텐션 :  디코더 레이어가 출력한 결과에서 query, key, value를 뽑아내어 어텐션을 수행합니다. 즉, 출력 문장을 구성하는 단어끼리 어텐션합니다. 현재 $i$번째 단어를 출력해야 한다면 $1 \sim i-1$번째 단어만으로 어텐션해야 합니다. 트랜스포머는 auto-regressive하게 동작하기 때문에 $i$번째 단어가 $i$번째 이상의 단어를 어텐션하는 정보의 흐름을 막아야 하기 때문입니다.

 

 

 

2.3   Position-wise Feed-Forward Networks

multi-head attention 레이어 뒤에 오는 feed-forward layer는 두 개의 MLP로 구성되며, 정확한 구조는

 

 

$FFN(x) = \max (0, xW_{1}+b_{1})W_{2}+b_{2}$

 

 

입니다. multi-head attention의 출력 차원은 입력 차원과 같은 $(seq \_ num \times d_{model})$임을 설명했습니다. $FFN(x)$의 첫 번째 MLP는 $d_{model}$ 차원을 $d_{ff}$차원의 공간으로 매핑합니다. 논문에선 $d_{ff}=2048$이라고 명시했습니다. 일반적으로 고차원으로 지정해야 하는 것 같습니다. 두 번째 MLP는 $d_{ff}$차원을 다시 $d_{model}$차원으로 매핑합니다. 그러므로 $FFN(x)$의 출력 차원은 입력 차원과 같은 $(seq \_ num \times d_{model})$입니다.

 

 

 

 

2.4   Embeddings and Softmax

이번에는 임베딩 벡터를 생성하는 방법에 대해 알아보겠습니다. 일반적인 기계 번역 모델과 마찬가지로, 트랜스포머는 각 단어 토큰을 $d_{model}$ 차원으로 매핑한 임베딩을 학습합니다. 단어 토큰을 임베딩 벡터로 변환하기 위해 일반적으로 이미 학습된 선형 변환을 사용했다고 합니다. 즉, 단어 토큰을 잘 임베딩하는 잘 알려진 선형 변환기를 그냥 가져다가 썼다는 뜻 같습니다. 최종적으로는 임베딩 벡터의 값을 $\sqrt{d_{model}}$로 나누어 스케일링을 했다고 합니다.

 

 

또한, 트랜스포머는 디코더의 결괏값에 선형 변환과 softmax를 취함으로써 다음으로 나올 단어의 확률값을 도출합니다. 논문에서는 디코더의 결괏값에 취하는 선형 변환은 타겟 언어(target langauge)를 임베딩 벡터로 변환하는 선형 변환을 그대로 가져다가 사용함으로써 가중치를 공유했다고 언급합니다.

 

 

 

 

2.5   Positional Encoding

트랜스포머 모델는 입력 문장을 순차적으로 받아들이지 않으므로, RNN이 가지는 recurrent 속성을 가지지 않습니다. 이는 모델이 입력 문장을 구성하는 각 단어의 순서를 인식하지 못한다는 뜻입니다. 저자들은 이러한 문제점을 해결하기 위해 각 단어 토큰에 해당 단어의 절대적이거나 상대적인 순서 정보를 주입(inject)해주었다고 합니다. 저자들은 positional encoding이라는 벡터를 임베딩 벡터에 더해줌으로써 이를 실현시킵니다. 어떠한 두 벡터를 element-wise하게 더하려면 두 벡터의 차원이 같아야하므로, positional encoding 벡터의 차원은 임베딩 벡터와 같은 $d_{model}$입니다. 저자들은 서로다른 frequency를 갖는 sine, cosine 함수를 사용함으로써 positional encoding 벡터를 생성합니다.

 

 

 

 

 

 

 

 

 

위 그림처럼, 입력 문장의 각 단어 토큰을 임베딩한 벡터에 positional encoding벡터를 element-wise하게 더해줍니다. 이때 각 임베딩 벡터의 원소는 $(pos, i)$로 특정할 수 있습니다. $pos$는 해당 단어 토큰이 입력 문장의 몇 번째 단어인지를 나타내며, $i$는 그 단어 토큰을 임베딩 벡터로 변환했을 때, 임베딩 벡터의 dimension 위치를 나타냅니다. $(pos, i)$에 따른 positional encoding 값은 아래의 수식으로 계산됩니다.

 

 

 

\begin{align*} PE_{(pos, 2i)} &= sin(pos/10000^{2i/d_{model}}) \\ \, PE_{(pos, 2i+1)} &= cos(pos/10000^{2i/d_{model}}) \end{align*}

 

 

 

저자들은 이러한 주기 함수를 사용함으로써 모델이 각 단어간의 상대적인 순서 차이를 쉽게 학습할 수 있을 것이라고 합니다. 그 이유는, 어떠한 고정된 $k$에 대해 $PE_{pos+k}$는 $PE_{pos}$의 선형 변환 함수로 표현되기 때문입니다.

 

 

또한 이미 잘 학습된 positional embedding 벡터와 저자들이 고안한 사인파동 기반의 positional encoding 벡터를 비교한 결과, 거의 비슷한 모델 성능을 얻을 수 있었다고 합니다. 하지만 사인파동 기반의 positional encoding의 경우 모델이 학습시 마주한 가장 긴 문장보다 더 긴 문장에 대해서도 positional encoding을 원활하게 만들어낸다는 장점이 있다고 주장합니다.

 

 

각 단어의 위치 정보를 다루고 있는데 갑자기 사인 파동 함수가 왜 등장하는지 의문이듭니다. 이러한 의문을 해결하기 위해 positional encoding에 대해 더 자세히 알아봅시다. positional encoding 벡터가 가져야 할 이상적인 조건은 아래와 같습니다.

 

 

 

 

positional encoding 벡터는,

 

 

  • 문장의 길이나 문장을 이루는 단어에 관계없이 동일해야 합니다. 즉, 문장이 변경되더라도 위치 임베딩은 동일하게 유지되어 문장의 각 단어에 대한 순서 정보를 유지할 수 있어야 합니다.
  • 임베딩 벡터의 값에 비해 너무 크면 안됩니다. 위치 임베딩 값이 너무 커져버리면 단어 임베딩이 가지는 의미값이 왜곡되기 때문입니다.
  • 값이 빠르게 증가되면 안됩니다. 값이 너무 빨리 커지게 되면 weight의 영향에 따라 gradient vanishing 또는 gradient explosiong 현상이 발생하여 학습이 불안정해질 수 있습니다.
  • 값의 차이는 실제 단어가 떨어진 거리의 차이와 비슷해야 합니다. 예를 들어 0번째, 1번째 positional encoding 값의 차이가 1번째, 2번째 positional encoding값의 차이와 유사해야 합니다. 따라서 등간격으로 배열된 부드러운 곡선 형태를 사용합니다.
  • 위치에 따라 서로 다른 값을 가져야 합니다. 위치 정보를 나타내는 만큼 서로 다른 값을 나타내어야 학습할 때 의미 있게 사용할 수 있습니다.

출처 : https://gaussian37.github.io/dl-concept-positional_encoding/

 

 

 

 

 

 

 

 

가장 간단하게 생각해볼 수 있는 것은, 그저 0부터 시작하여 각 위치에 해당하는 positional encoding 값을 1씩 증가시키는 방법입니다. 하지만 값이 1씩 증가한다는 것은 단어 토큰 임베딩 벡터의 일반적인 스케일에 비해 매우 큰 값일 수 있습니다. 더불어 값이 빠르게 증가합니다.

 

 

 

 

 

 

 

그러한 단점을 보완하기 위해, 모든 값을 0 ~ 1사이의 값으로 정규화하는 아이디어는 어떨까요? 이 방법은 아쉽게도 입력 문장의 길이에 따라 각 위치에 따른 positional encoding 값이 매번 달라지기 때문에 입력 문장의 최대 길이가 서로 다른 데이터 세트에 대해선 동일한 모델을 사용할 수 없다는 단점이 있습니다.

 

 

 

 

 

 

 

 

지금까지의 방법은 각 positional encoding 값을 스칼라로 가정했습니다. 하지만 각 단어 토큰은 $d_{model}$ 차원의 벡터로 임베딩되므로, positional encoding 벡터 또한 $d_{model}$ 차원의 벡터입니다. 이 점을 활용하여, 이진수로 각 위치에 따른 값을 배정해봅시다. 각 포지션에 이진수 형태로 값을 매겨준다면, $2^{d_{model}}$개의 단어를 임베딩할 수 있습니다. 또한, 입력 문장의 길이가 달라도 동일한 position에 동일한 위치 임베딩 값이 할당됩니다. 0과 1만으로 구성되므로 스케일도 크지 않아 학습에 안정적일 것으로 추측됩니다.

 

 

하지만 0과 1의 이산적인 값만을 출력하므로 파생되는 단점이 존재합니다.

 

 

 

 

 

 

 

 

위 그래프의 검정색 데이터 포인트는 각각 $(0, 0), (0, 1), (1, 0), (1, 1)$의 이진수 포지셔널 인코딩 벡터를 시각화한 것입니다. 해당 벡터는 각각 첫 번째, 두 번째, 세 번째, 네 번재 단어의 포지셔널 인코딩 값이므로 위치 차이에 따른 값이 동일합니다. 하지만 $(0, 0)$과 $(0, 1)$간의 거리 차이는 $1$이며, $(0, 1)$과 $(1, 0)$의 거리 차이는 $\sqrt{2}$입니다. 또 다시 $(1, 0)$과 $(1, 1)$의 거리 차이는 $1$이므로, 포지셔널 인코딩 값의 거리 차이가 동일하지 않습니다.

 

 

 

 

이쯤에서 사인 함수를 생각해봅시다. 사인 함수는 -1 ~ 1 사이에서 부드럽게 진동하며 그에 따라 주기성을 가집니다.

 

 

$Asin(Nx)$

 

 

사인 함수의 진폭을 조절하는 인자인 $A$는 1로 설정해야 하는 게 좋을듯합니다. 진폭을 더 크게 설정하면 값의 범위가 커져 모델 학습에 악영향을 끼칠 수 있습니다. $N$을 바꾸어 주기를 조절할 수 있습니다. 주기가 짧다면 각 포지션에 따른 인코딩 값이 겹치는 문제가 발생합니다. 그러므로 입력 문장의 현실적인 최대 길이를 설정하고, 이를 기반으로 사인 함수의 주기를 크게 설정해야 할 것 같습니다. 이러한 이유 때문에, 논문의 저자들도 $N=1/10000$으로 작게 설정합니다.

 

 

 

마지막으로, 두 포지션의 거리에 차이에 따른 positional encoding 값의 차이가 일정해야 함을 만족해야 합니다. 각 포지션에 따른 positional encoding의 값의 차이를 선형 변환으로 정확하게 계산할 수 있다면, 포지션의 차이가 등간격임이 보장됩니다. 즉, 선형 변환을 $T$라고 할때 $PE_{x+\Delta} = PE_{x} \cdot T(\Delta x)$로 표현하는 것이 목적입니다.

 

 

 

 

 

 

 

 

삼각함수에서 각의 회전 변환에 이용할 수 있는 rotation matrix가 있습니다. 위 수식에서 각의 변화량에 따른 결괏값이 선형 변환으로 표현됨을 확인할 수 있습니다. 해당 수식을 이용하기 위해, 그저 사인 함수만 쓰는 것이 아니라 사인 함수와 코사인 함수를 한 쌍으로 사용하여 positional encoding 벡터를 구성해봅시다.

 

즉, $PE_{i} = [sin(w_{0}x_{i}) \ cos(w_{0}x_{i}) \ , ... , \ sin(w_{n-1}x_{i}) \ cos(w_{n-1}x_{i})]$의 구성을 가집니다.

 

 

 

 

 

 

 

 

 

그렇다면 $PE_{x+\Delta} = PE_{x} \cdot T(\Delta x)$에서의 $T(\Delta x)$ 선형 변환을 위의 수식으로 표현할 수 있습니다. 즉, 사인 계열의 함수를 사용함으로써 이상적인 positional encoding 벡터의 조건을 모두 만족시킬 수 있습니다.

 

 

 

 

 

 

 

임베딩 벡터에 따른 positional encoding 벡터를 만들어서 시각화 해보면 위와 같습니다. 하나의 행이 하나의 단어에 따른 positional encoding 벡터에 해당합니다. 모든 행에 대해 positional encoding 벡터가 다른 것을 확인할 수 있으며 값이 부드럽게 변함을 확인할 수 있습니다.

 

 

 

 

 

 

 

위 그래프는 256개의 단어로 구성된 문장에 positional encoding을 적용한 후, 128번 째 단어에 대한 positional encoding 벡터와 1 ~ 256번째 단어에 대한 positional encoding 벡터를 내적한 값을 보여줍니다. 128번 째에서 멀리 떨어진 단어일수록 positional encoding 간의 내적 값이 작아지는 경향을 확인할 수 있습니다. 이러한 속성은 트랜스포머 모델이 포지션 간의 간격에 따른 패턴을 쉽게 학습할 수 있도록 하는 보너스적인 특징이라고 합니다.

 

 

 

 

 

3.   Why Self-Attention

저자들은 self-attention 레이어와 convolution, recurrent 레이어를 세 가지 측면에서 비교하며 self-attention 레이어의 장점을 강조합니다.

 

 

 

 

 

 

첫 번째 측면은 레이어의 총 계산 복잡도, 두 번재 측면은 병렬적으로 계산할 수 있는 계산량이며, 이는 순차적으로 처리해야만 하는 최소 연산의 횟수로 측정됩니다. 세 번째 측면은 모델의 long-range dependencies 간의 path length입니다. long-range dependencies를 학습하는 것은 번역과 같은 sequence trunduction 태스크에서 핵심적인 요소입니다. 이를 학습하는 능력에 영향을 미치는 한 가지 핵심 요소는 순방향 및 역방향 시그널이 모델을 통과해야 하는 경로의 길이입니다. 소스 및 타겟 문장의 임의의 포지션 조합 사이에 대해 이러한 경로가 짧을수록 long-range dependencies을 더 쉽게 학습할 수 있다고 알려져 있습니다. 따라서 저자들은 임의의 두 포지션에 대해 경로의 최대 길이를 비교함으로써 long-range dependencies를 얼마나 쉽게 학습할 수 있는지를 평가합니다.

 

 

 

위의 table을 보고 알 수 있듯이, self-attention layer는 세 측면 모두에서 convolution, recurrent layer와 같거나 더 나은 퍼포먼스를 보여줍니다. 또 다른 측면에서, self-attention의 결괏값은 해석하기 용이합니다. 어텐션의 분포를 시각화함으로써 multi-head의 각각의 어텐션이 서로 다른 기능을 수행하고 있음이 명확히 드러나며, 이러한 어텐션들은 문장의 문법적이고 의미적인 구조와 관련된 행동을 보인다고 합니다.

 

 

 

 

 

4.   Training

저자들이 트랜스포머 모델을 WMT 2014 영어-독일어 번역 데이터와 WMT 2014 영어-프랑스어 번역 데이터로 학습시켰습니다. 영어-독일어 번역 데이터의 경우 약 450만개의 문장 쌍을 가지며, 영어-프랑스어 데이터의 경우 약 3600만 개의 문장 쌍을 가집니다. 학습의 용이성을 위해 위해 길이가 비슷한 문장들을 하나의 배치로 묶어 모델에 입력했다고 합니다. 각 배치는 약 25000개의 소스 토큰과 25000개의 타겟 토큰이 포함된 문장 쌍으로 구성했습니다.

 


저자들은 기본 모델을 총 10만 스텝(12시간 소요)으로, 큰 모델의 경우 큰 모델은 30만 스텝(3.5일)으로 학습했다고 합니다.

 

 

학습에는 adam optimizer를 사용하였으며, $\beta_{1} = 0.9, \beta_{2} = 0.98, \epsilon = 10^{-9}$로 설정했다고 합니다.

 

 

learning rate는 $d_{model}^{-0.5}\cdot \min(step \_ num^{-0.5}, step\_num \cdot warmup\_step^{-1.5})$로 조정했다고 합니다. 이는 학습 시작 후 $warmup\_steps$ 스텝만큼 학습률을 선형적으로 증가시키고, 그 후 스텝의 inverse quare root에 비례하도록 학습률을 감소시킨다는 뜻입니다. 저자들은 $warm_up\_steps = 4000$으로 설정했습니다.

 

 

 

저자들은 모델 학습에 몇 가지 정규화 테크닉을 사용합니다.

 

  • Residual Dropout : 각 sub-layer의 결괏값에 dropout을 적용한 후 skip connection과 normalize를 수행시켰습니다. 또한, 인코더와 디코더에서의 단어 임베딩 벡터와 positional encoding 벡터를 더한 값에도 dropout을 적용했습니다. 기본 모델에서 $P_{drop} = 0.1$입니다.
  • Label Smoothing : 모델의 perplexity를 떨어뜨렸지만, 정확도(accuracy)와 BLEU score를 향상시켰다고 합니다.

 

 

 

 

 

5.   Results

5.1   Machine Translation

 

WMT 2014 영어-독일어 번역 태스크에 대해서 big transformer model이 앙상블을 포함한 기존의 SOTA보다 2.0 BLEU score 높은 결과를 기록했습니다(BLEU score of 28.4). 그럼에도 training cost는 기존의 모델들보다 현저히 낮습니다.

 

 

WMT 2014 영어-프랑스어 번역 태스크에 대해서도 big transformer model이 기존의 SOTA의 $1/4$ 정도의 training cost만을 사용함에도 더 높은 BLEU score를 기록했습니다.

 

 

 

 

5.2   Model Variations

 

트랜스포머의 각 컴포넌트의 세팅을 바꿔보며 성능 평가 지표가 어떻게 변하는 지에 대한 실험도 진행했습니다. 실험에는 newstest2013 영어-독일어 번역 데이터를 사용했습니다.

 

 

$(A)$에서 attention-head의 개수를 바꿈에 따라 모델의 성능이 어떻게 변하고 있는지 확인할 수 있습니다. 이 실험을 통해 큰 차원을 갖는 single-head attention 보다 작은 차원을 갖는 multi-head attention을 사용하는 것이 성능 면에서 더욱 좋다는 사실을 알 수 있습니다. 하지만 head의 개수가 많을수록 성능이 비례하여 오르는 것은 아님을 확인할 수 있습니다.

 

 

$(B)$에서, Key 벡터의 차원을 줄이는 것은 모델의 성능에 악영향을 끼침을 확인할 수 있습니다. $(C), (D)$에서 큰 트랜스포머 모델일수록 더 높은 성능을 보여줌을 확인할 수 있습니다. 또한 dropout은 모델의 과적합 방지에 큰 도움이 되었습니다.

 

 

$(E)$는 논문의 positional encoding 대신 이미 잘 알려진 다른 positional embedding을 수행하고 모델을 학습시켰을 때의 성능을 보여줍니다. 어떤 기법을 사용하든 모델 성능 면에서 큰 차이는 없습니다.

 

 

 

 

 

5.3   English Constituency Parsing

 

다른 태스크에 대한 트랜스포머의 일반화 능력을 평가하기 위해, 저자들은 영어 구문 분석 태스크로 실험을 진행했습니다. 해당 태스크는 출력 시퀀스가 입력 시퀀스보다 훨씬 길다는 구조적인 특징을 가집니다.

 

저자들은 4개의 레이어로 구성된 $d_{model} = 1024$ 트랜스포머로 약 4만 개의 Wall Street Journal(WSJ) 데이터 문장을 학습시켰습니다. 또한, BerkleyParser 코퍼스와 약 1700만개의 대규모 고신뢰도 문장 데이터로 준지도 학습을 수행한 트랜스포머 모델도 준비합니다. dropout, learning rate와 같은 하이퍼 파라미터 튜닝에는 소수의 실험만을 진행했다고 합니다.

 


Table 4의 결과를 보듯이, 트랜스포머 모델은 정밀한 튜닝을 수행하지 않더라도 해당 태스크에 대한 높은 일반화 성능을 보여줍니다.

 

 

 

 

 

6.   Conclusion

본 논문은 오직 attention만을 이용한 최초의 기계 번역 아키텍처인 트랜스포머를 제안합니다. 트랜스포머는 convolution 또는 recurrence 기반의 모델보다 훨씬 더 빠른 속도로 학습됩니다. 트랜스포머는 WMT 2014 영어-독일어 및 영어-프랑스어 번역 태스크에서 SOTA를 갱신했습니다.

 

 

저자들은 attention 기반의 아키텍처의 전망을 흥미롭게 바라보고 있으며, 텍스크 뿐만 아니라 이미지, 오디오, 비디오와 같은 다양한 유형의 입력값을 잘 처리할 수 있는 트랜스포머 아키텍처에 대한 후속 연구를 계획 중이라고 합니다.

'논문 리뷰' 카테고리의 다른 글

word2vec 핵심만 요약  (0) 2024.03.01
파이토치로 트랜스포머 구현하기  (0) 2023.09.04
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31