Paper:
Abstract
논문 발표 당시 주도하던 *sequence transduction 모델은 encoder와 decoder를 포함한 복잡한 recurrent (RNN) 혹은 convolution (CNN) 구조에 기반을 두고 있고, 가장 성능을 잘 내는 모델의 경우 encoder와 decoder를 attention 메커니즘으로 연결하고있다. 논문에서는 새롭고, 심플한 네트워크 구조인 Transformer를 제안하는데, recurrent 와 convolution 방식을 사용하지 않고 attention 메커니즘에만 기반을 두었다.
*sequence transduction : 일반적인 규칙을 찾기보다는 input 데이터로부터 output 데이터 자체를 추론하는 방식
ex: 기계번역
Transformer는 두 개의 기계번역 테스크에 대한 실험에서 이러한 모델이 성능의 측면에서도 우수할 뿐만 아니라 이전 모델보다 연산을 병렬로 진행하여 학습 시간을 획기적으로 단축시켰음을 보였다. Transformer 는 WMT 2014 English-to-German 번역 task에서 ensemble을 포함했던 당시 최고 모델보다 2점 더 상승 시킨 28.4 BLEU (n-gram 기반 기계번역 성능 확인 지표)를 달성하며 리더보드를 갱신했고, WMT 2014 English-to-French 번역 task에서는 8개의 GPU로 3.5일 만에 학습하여, 41.8 BLEU score로 SOTA를 달성했고, 이는 과거 모델들에 비해 학습속도가 매우 개선되었음을 의미한다. 논문에서는 많은 양 혹은 한정된 양의 데이터 모두에서 이 모델이 이 외에도 영어 구문 분석과 같은 작업에 일반적으로 좋은 성능을 보여줌을 보여주었다.
Introduction
RNN과 long short-term memory (lstm) 그리고 gated RNN은 언어 모델링 (language modeling) 이나 기계 번역과 같은 sequence 모델링, transduction (변환) 문제들에 대해서 최고의 접근 방식이라고 정립되어 왔고, 이후 RNN 언어 모델과 encoder-decoder 아키텍쳐의 한계선을 허물기 위해 수많은 노력들이 지속되었다.
Recurrent 모델은 input 과 output의 sequence 위치를 따라 계산이 수행된다. 따라서 모델에서는 위치(time step)와 연산 단계를 맞춰가며, 이전 hidden state인 [h(t-1)]와 position [t]의 새로운 인풋을 받아 hidden state [ht]를 만들어 낸다.
이러한 구조는 이전 과정의 연산 [h(t-1)]이 종료되어야 이를 참조하여 다음 연산 [ht]를 만들어 낼 수 있다는 점에서, 병렬적으로 학습을 수행하기 어렵고, 이는 sequence (ex: I am a boy) 의 길이가 길어지면 길어질 수록 example들의 batching을 진행하는데 메모리적 한계가 존재한다는 단점을 지니고 있다. 최근의 연구에서는 factorization trick (기존 LSTM의 W를 두개의 작은 행렬로 쪼개어 빠르게 학습 + 더 적은 파라미터 수가 가능하게 만듦) 과 conditional computation 등을 이용해 획기적인 성능 향상을 이뤄내었으나, 근본적인 sequence 연산의 한계는 아직 남아있었다.
Attention 방식은 input 과 output 사이의 거리와는 상관없이 그 사이의 의존도 (dependencies)를 알아낼 수 있다는 점에서 시퀀스 모델이나 transduction 모델 등에서 중요한 역할을 하게 되었다. 하지만 논문 당시 몇 가지 케이스를 제외하고는 이러한 attention 메커니즘은 아직 recurrent 네트워크와 결합되어 사용되고 있었다.
이 논문에서는 Transformer라는 모델 아키텍쳐를 제안하는데, 이는 RNN을 사용하지 않고 attention 방식만을 사용하여 입력값과 출력값 사이의 전역 의존도(상관관계)를 얻어낸다. 이러한 방식은 더 많은 병렬 연산을 가능하게 하였고, 8개의 P100GPU 상에서 12시간 만에 번역 부분에서 SOTA의 성능을 얻어내었다.
Background
시퀀스 모델의 연산량 (sequential computation) 을 감소시키겠다는 목표는 Extended Neural GPU나 ByteNet, ConvS2S (이전 기계번역 SOTA 모델) 와 같이 합성곱신경망을 기반으로 모든 입력과 출력 위치에 대해 은닉층을 병렬적으로 계산해내는 방법들의 기반이 되었다. 이러한 모델들에서는 상이한 입력과 출력 시그널을 연관시키기 위한 많은 수의 연산이 필요했고, 이는 입출력 사이의 위치가 멀어질 수록 의존도 연산을 더 어렵게 만들었다. Transformer 에서는 effective resolution (scaling 이후의 해상도) 을 감소시킨다는 단점은 존재했지만, 그 대가로 constant (상수) 수준의 연산만으로 시퀀스 모델 연산량을 감소시켰으며, 이는 이후에 설명할 Multi-Head Attention을 통해 가능했다.
Self-attention은 하나의 시퀀스의 서로 다른 위치를 연결하는 메커니즘으로 시퀀스의 문장표현을 알아내는데 사용되는데, 독해나, 추상적 요약 (원문에 없던 문장이라도 핵심 문맥을 반영한 새로운 문장을 생성해 원문을 요약하는 방법) 혹은 텍스트 함축 및 문장 표현 학습 등에서 성공적으로 사용되었다.
End-to-end 메모리 신경망은 sequence-aligned recurrence 대신 recurrent attention 방식에 기반해, 간단한 문답문제나, 언어 모델링 과제 등에서 성공적으로 사용되었다.
논문에서는 Transformer 모델이 상기에 등장한 sequence-aligned recurrence (position 학습을 위해 순차적으로 연산)방식이나 CNN등을 사용하지 않고, self-attention을 통해 input과 output의 representations를 계산한 첫 모델이라고 한다.
Model Architecture
대부분의 neural sequence transduction 모델들은 encoder와 decoder의 구조를 가지고 있다.
인코더 파트에서는 sequence 벡터 x (x1, x2, ... xn)를 입력받은 뒤, 입력값의 정보를 압축한 벡터 z (z1, z2, ... zn) 으로 매핑하고, 다시 주어진 z를 사용해 디코더 파트에서 output y (y1,y2, ... yn)을 만들어 낸다. 각 단계에서 모델은 auto-regressive (자기 회귀적)이다. 즉 과거에 만들어낸 symbol들을 다음 단계를 생성해 내는 데에 추가적인 input으로 사용한다.
트렌스포머 역시 위 구조의 전반적인 형태를 따르되, stacked self-attention 그리고 point-wise fully conneceted layers를 인코더 파트와 디코더 파트에서 사용한다. 아래 그림을 통해 조금더 자세히 알아보자.
Encoder and Decoder Stacks
인코더: 인코더 부분은 N = 6 개 (그림의 왼쪽 절반부의 사각형 블럭의 반복 개수 Nx 번 반복) 의 레이어 블럭을 쌓은 구조로 구성되어 있고, 각 레이어는 두개의 서브-레이어로 구성되어있다.
첫 번째는 Multi-head self-attention mechanism이고, 두 번째는 position-wise fully connected feed-forward network이다. 각 레이어에는 resnet에서 사용된 방식과 같은 residual connection이 적용되고, 이후에 레이어 정규화 과정이 수행되었다. 이를 수식으로 표현하면 아래와 같다.
이러한 residual connection을 쉽게 하기 위해 (합 연산 시 dimension이 같아야 구조 변경의 필요가 없음) 모델의 sub-layer들과 embedding layer (그림 하단부) 로 부터 나온 output은 모두 같은 dimension인 512 차원을 갖도록 설계되었다.
디코더: 디코더도 역시 N = 6개의 레이어 블럭을 쌓았고, 인코더 레이어에서의 두개의 sub-layer와 별개로 추가적인 서브레이어를 삽입하였는데, 여기에서는 multi-head attention 연산을 encoder stack에서 나온 출력값을 입력값으로 사용한다. (그림 오른쪽 절반부의 블럭 정 가운데 주황색 레이어) 또한 *디코더의 경우 다음 지점에 대한 정보를 참조해서는 안되므로 self-attention 파트(그림의 masked multi-head attention 주황색 박스) 에 masking을 적용한다.
*기계 번역 등을 수행할 때, I am (a) (boy)에서 (a)를 예측할 때 (a)나 (boy)를 참조하는 것은 cheating과 다름 없음
인코더, 디코더 블럭이 N=6 번 반복되는 것은 아래 그림을 통해 조금 더 쉽게 이해할 수 있다.
Attention
어텐션 함수는 query 와 key-value 쌍을 output으로 매핑하는 과정으로 설명될 수 있다. 이 때, query, key, value는 모두 벡터이다. Output은 value벡터와의 가중합으로 계산되며, 각 value값에 할당되는 가중치는 query의 compatibility function과 상응하는 key값으로 계산된다.
Scaled Dot-Product Attention
논문에서는 그림 왼쪽과 같은 구조를 Scaled Dot-Product Attention이라고 부른다. 먼저 인풋값으로 query (I am a boy에서 I)와, 모든 key 값 (I, am, a, boy) 과의 내적을 구한 뒤, 얻어진 벡터에 대해 key의 dimension dk(이 경우 I, am, a, boy 이므로 dk = 4)의 1/2승값인 sqrt(dk)로 나누어 Scaling 해 준다. 그런 뒤, 이 값을 softmax 함수를 거쳐 value 벡터에 적용될 가중치 값을 얻어낸다.
query 설명에서 I am a boy 에서 I를 입력값으로 사용한다고 설명하였으나, 정확히 말하면 단어(I) 자체를 input으로 사용하는 것이 아닌, (임베딩 + positional encoding) x linear projection 연산이 지난 벡터를 집어넣는 것. key, value의 경우도 마찬가지.
실제 사용시에는 이러한 attention function을 하나의 query 벡터 단위로 연산하는 것이 아닌, 여러 query들을 통합한 행렬 Q를 사용해서 연산을 진행한다. 마찬가지로 key와 value도 벡터 단위가 아닌, 행렬 단위인 K와 V단위로 사용된다. 이러한 연산을 행렬식으로 정리하면 아래와 같다.
왜 dot-product attention을 사용하였는가?
가장 자주 사용되는 attetion 함수로는 additive attention과 dot-product attention [QxK(transpose)]이 있다.
논문에서는 Dot-product attention이 scaling factor인 /sqrt(dk) 부분을 제외하고는 적합하다고 생각했다. Additive attention의 경우 compatibility function을 하나의 hidden layer를 사용해서 계산한다. 두 방식이 모두 이론적 복잡성 측면에서 유사하나, *실제 사용시에 dot-product attention이 훨씬 빠르고, 공간을 효율적으로 사용하므로 행렬곱 연산 코드 상에서 최적으로 사용될 수 있다.
*additive attention의 경우 feedforward 네트워크 연산이 필요한 반면, dot-product attention은 highly optimized 코드 상에서 2개의 weight matrix만으로 matrix multiplication이 가능해 훨씬 효율적이라고 한다.
dk (key의 dimension)의 경우, 두 메커니즘에서 비슷하게 작동하나, additive attention에서는 큰 dk 값에 대해서도 dot-product 에 비해서 잘 수행된다. 논문에서는 dot-product attention에서는 dk가 큰 값을 갖게 되면, 내적값이 치솟으면서 작은 gradient를 갖는 영역으로 softmax 함수를 밀어 넣는다고 말한다.
예를 들어, q벡터와 k벡터의 각각의 값이 평균 0과 분산 1을 갖는 독립확률변수라고 가정하자, 그럼 그들의 내적은 위 수식이 되고, 평균은 0 분산은 dk를 갖게된다. 즉 scaling factor sqrt(dk)는 이를 보완하고자 사용되었다.
이를 조금 더 자세히 알고싶다면 아래 블로그를 참조하면 좋을 것이다.
Multi-Head Attention
논문에서는 d-model (논문기준 512) 차원의 key, value, query를 하나의 어텐션 함수로 투영하는 것보다, 각각 dk, dk, dv차원을 갖는 학습된 선형함수를 이용해 h번 projection 하는 것이 효과적이라고 한다. 각각의 사영된 query, key, value는 이어서 attention function을 거친 뒤 dv 차원의 output value를 갖게 된다. 이들은 concatenated된 뒤, 한 번 더 linear 함수를 지나면서 최종 값을 생성하게 된다.
Multi-head attention은 모델이 다른 다른 위치에 존재하는 다른 subspace에서의 representations에 대한 정보를 참조할 수 있게 해주는 효과가 있다. Single 어텐션을 진행하면 값이 평균화 되면서 이런 효과가 사라진다. (이 부분에 대한 graphical 한 설명은 논문의 Appendix에서 등장하는데, 이 리뷰 글의 마지막 쪽에 그림과 함께 설명을 덧붙여 놓았다.)
모델에서는 h(head) = 8개를, 그리고 dk와 dv는 d-model/h = 64를 사용하였다. 각 head에서 차원이 축소되면서, 전체 연산량은 single-head attention을 full dimension (d-model)에서 진행한 것과 같아진다.
이러한 multi-head attention개념을 잘 설명해준 Jay alamar 님의 깃허브 블로그 그림을 한번 살펴보자.
- Input sentense : "Thinking Machines" 를 먼저 embedding 을 통해 벡터로 변경한다. (이때 임베딩된 벡터의 차원은 d-model이 되고, 남는 부분은 <pad> 로 패딩 진행)
- 임베딩된 벡터를 Q, K, V 세개로 복사한 뒤(이는 self-attention 부분에서만 해당됨), 다시 3개를 각각 8번 복사한다 (head 개수만큼).
- 각각을 가중치 행렬 WQ, WK, WV와 행렬곱을 진행한다. Q x W0Q = Q0 (숫자는 head index 0~7)
- 계산된 Q0, K0, V0 행렬에 대해 Scaled-dot product를 진행한다. -> Z0
- Z0~Z7을 이어붙인다(concatenation).
- 이어붙인 Z를 Wo matrix와 행렬곱해 최종 output Z값을 얻어낸다.
- 인코더의 남은 과정을 진행한 뒤, 다음 인코더블럭에서는 이전 인코더에서 나온 R값을 임베딩 절차 없이 WQ,WK,WV에 행렬곱을 통해 위 과정을 반복한다.
여기서 다시 각 과정의 matrix 사이즈가 어떻게 변하는지 살펴보자.
- "Thinking Machines" 임베딩으로 q 벡터 크기는 단어 하나당 1x512, 따라서 Q,K,V 행렬 크기는 ["Thinking" , "Machines"] 이므로 2 x 512
- WQ의 사이즈는 행렬 연산을 위해 512 x 64 사이즈 - 하이퍼 파라미터
- Q x W0Q 진행시 2x64사이즈의 Q0얻음
- Scaled-dot product에서 QxK-transpose 연산시 (2 x 64) x (64 x 2) = 2 x 2사이즈
- Softmax 함수 및 Scaling진행 후 V와 메트릭스연산 (2x2) x (2x64) = (2x64)사이즈의 Z0 얻음
- 2x64사이즈의 z0~z7 concatenation -> (2x512)
- Wo : 사이즈 맞춰주기 위해 (512 x 512) - 하이퍼 파라미터
- (2 x 512) x (512 x 512) -> (2 x 512) 즉 input 차원과 같아진다.
Applications of Attention in our Model
트랜스포머에서는 multi-head attention을 세가지 다른 방법으로 사용한다.
- Encoder-Decoder attention 레이어에서는 queries는 이전 decoder layer에서, memory key와 value는 encoder의 output에서 가져온다. 이런 방식으로, decoder의 모든 위치가 input sequence의 모든 위치를 참조할 수 있도록 해준다. 이는 기존의 seq2seq 모델에서의 encoder-decoder attention 메커니즘을 모방한 것과 같다.
- 인코더 파트의 self-attention 레이어서는 query, key, value가 모두 같은 곳 즉 이전 encoder 레이어의 결과값으로 부터 가져온다. 각 인코더 레이어의 위치는 이전 인코더 레이어의 위치를 참조할 수 있게 된다.
- 디코더 파트의 self-attention 레이어에서는 위와 비슷하게 이전 디코더 레이어의 결과값을 인풋 값으로 사용하여, 이전 레이어의 위치를 참조할 수 있도록 해준다. 다만 Decoder에서는 auto-regressive property (자기 자신만을 보는 것)을 보존하기 위해서, scaled dot-product attention 과정에 Masking을 추가한다.
- 즉 QK 연산 이후에 softmax에 들어가기 전에 지금까지 관측한 부분은 1, 관측하지 않은 부분은 -inf 로 설정을 진행해 softmax 연산 이후에 그 값이 모두 0이 되도록 설정한다. ex) i am a boy 에서 a는 boy를 참조해서는 안됨. [I, am, a, boy] x [I, am, a, boy] 행렬에서 I는 I만 참조할 수 있게, am 은 I와 am만 참조할 수 있게, a는 I, am, a까지 참조할 수 있게 a 와 boy가 만나는 index의 경우 -무한대를 설정한 matrix를 구성한 뒤 softmax 이전에 곱해준다.
Position-wise Feed-Forward Networks
sub-layer의 attention 과정 이후에 인코더와 디코더의 각 레이어는 Fully connected feed-forward network를 지니고 있다.
이는 두개의 선형 변환과 그 사이의 ReLU 활성화 함수로 구성되어있다.
Linear 변환의 경우 다른 위치에도 동일하게 적용되나, layer단 위로 보았을 때에는 다른 weight parameter를 사용한다. 이를 다르게 설명하자면 kernel size = 1인 두 개의 convolution 연산을 진행하되, input과 output 차원은 d-model = 512, 중간 레이어의 경우 dff=2048인 경우와 같다.
Embeddings and Softmax
다른 sequence transduction 모델처럼, transformer에서도 input 과 output token에 대해 d-model 차원의 벡터가 되도록 임베딩을 학습시켰다. 또한, 디코더에서 나온 output에 대해 Linear transformation과 softmax를 이용해 다음 토큰에 대한 예측된 확률값을 뽑아내었다 (트렌스포머 모델 디코더 윗부분의 Linear, Softmax 부분). 모델에서는 두개의 embedding layer와 softmax 이전의 linear transformation에서 동일한 가중치 행렬을 공유하였고, 임베딩 레이어에서는 weight에
sqrt(d-model)를 곱해주었다.
Positional Encoding
Transformer에서 RNN이나 CNN을 포함하지 않고 임베딩된 행렬을 한번에 넣기 때문에, 순차적인 구조를 고려하게 만드리 위해서는 각 토큰의 순서에 대한 상대적인 혹은 절대적인 정보를 알려줄 필요가 있다. 이에, "트렌스포머 모델 구조" 그림에서 보이듯, "positional encodings"를 임베딩 이후 encoder와 decoder stack 밑단에 삽입하였다. "positional encodings"에서는 임베딩과 같은 d-model의 차원을 가지게 셋팅되었고, 이에 두개가 더해질 수 있다. "positional encodings"에는 여러가지의 방법이 존재하나, 논문에서는 다른 frequency를 갖는 sine과 cosine 함수를 사용하였다.
pos 의 경우 위치, i는 차원을 의미한다. 즉 positional encoding의 각 차원이 sine파에 상응하게 되는 것이다. 파장은 2pi 부터 10000 x 2pi까지 (i 에 따라) 달라지게된다. 논문에서는 차원을 k로 고정하게 되면, PEpos+k가 PEpos에 대한 linear function으로 표현될 수 있기 때문에, 모델이 상대적인 위치를 쉽게 학습할 수 있다고 가정했기 때문에, 이 함수를 사용했다고 한다.
또한 positional encoding 대신에 positional embedding을 학습하는 방법에 대한 실험을 진행했는데, 위의 함수를 사용한 것과 거의 동일한 결과를 낳았다고 한다. 아래 테이블의 (E)를 살펴보면, positional embedding을 사용하였을 때, 가장 위쪽 row인 base 와 비교하였을 때, 성능에 큰 차이가 없음을 보여준다. 이에, 논문에서는 sine파 버전을 선택했는데, 학습 때 보지 못한 더 긴 시퀀스를 넣었을 때도, 적용될 수 있다고 생각하였기 때문이다.
Why Self-Attention
논문에서는 self attention을 사용한 것과, recurrent 와 convolution과 같은 다른 방식을 비교하면서, 왜 self-attention이 유리한지 3가지 측면에서 말한다.
- layer당 연산 복잡도
- sequential operation을 최소 필요량으로 둔 상태에서 병렬 연산될 수 있는 양
- 네트워크상에서 long-range dependencies 에 대한 path length
세 번째 부분은, 많은 sequence transduction task에서 가장 중요한 도전과제라고 할 수 있는데, 이러한 long-range dependencies를 학습하는 능력에 영향을 미치는 핵심 요소가, 네트워크에서 forward, backward 신호가 통과해야하는 경로의 길이(path length)가 되기 때문이다.
*Long-range(term) dependencies:
The clouds are in the sky
I grew up in France, I love to play games and I speak fluent French
첫 번째 문장의 sky를 예측하는 경우, The clouds are in the 즉 앞부분을 보고 뒷단에 sky가 올 것이라는 점을 예측하는 것은 네트워크가 sky 그리고 cloud에 대한 의존도를 파악하고 예측하기 쉽다.
반면 두 번째 문장의 French를 예측하는 경우에는 네트워크 구조상 다소 먼 France에 대한 의존도가 적용되어야 예측이 가능한데, 이는 위의 경우보다 훨씬 어려워진다.
즉 input과 output의 시퀀스의 조합에서의 길이가 짧아질 수록 더 쉽게 long-range dependencies를 학습할 수 있으므로, 논문에서는 네트워크 안의 서로 다른 layer 타입으로 구성된 두 개의 input과 output 위치에 대한 maximum path length를 비교할 수 있는 factor로 책정하였다.
테이블을 통해 볼 수 있듯, self-attention 레이어는 모든 위치를 연결하는데 있어 sequential operation에 대해 상수만큼의 시간 복잡도를 필요로하지만, RNN의 경우 O(n) 즉 시퀀스 길이 만큼의 시간 복잡도를 갖는다. 연산 복잡도의 측면에서 보았을 때, Self-attention은 n<d인 경우 RNN보다 빠르게 동작하는데 (Table의 Complexity per Layer 참조), word-piece나 byte-pair representations와 같은 대부분의 SOTA 모델이 기계번역에서 사용하는 문장표현의 형태가 대부분 n<d 라는 점이 Self-attention이 유리하다는 점을 보여준다. 시퀀스가 아주 긴 경우 (n>d인 case) self-attention의 연산 성능을 좋아지게 하기 위해서, output 위치를 중심으로 참조하는 input 시퀀스의 범위를 output 시퀀스 위치 기준 r개의 주변 neighbor로 제한을 걸 수 있는데, 이러한 방법을 사용하면, maximum path length를 O(n/r)로 증가시키게 된다 (즉 Path Length가 길어지는 bad case). 논문에서는 이러한 문제를 향후 연구에서 다루겠다고 한다.
커널 k < n을 가지는 하나의 convolutional 레이어는 input과 output 위치의 모든 쌍을 연결시켜주지 못한다. 이에 모든 쌍을 연결하려면 contiguous kernels를 사용하는 경우 O(n/k) 의 레이어를 쌓거나, dilated convolution 을 사용하는 경우 O(logk(n))이 되는데, 둘 모두 path length가 길어지게 된다.
Convolutional 레이어는 RNN보다 k배만큼 더 연산량이 많다. Seperable convolution의 경우 이러한 연산 복잡도를 낮추기는 하지만, 이는 논문에서 사용한 self-attention 레이어와 point-wise feed-forward layer를 조합한 경우의 연산량과 같다.
추가적인 장점으로는 self-attention이 더 이해 가능한 모델을 만든다는 것이다. 아래 그림을 살펴보면, 각각의 attention헤드가 다른 Task에 대해서 수행하는 방법을 배울 뿐 만 아니라, 많은 경우 문장의 의미론적, 문법적인 구조를 반영하는 것을 보인다.
Training
Training Data and Batching
논문에서는 WMT 2014 English-German 데이터셋을 사용해 4.5 백만개의 문장 쌍으로 학습을 진행했고, 문장은 *byte-pair encoding으로 인코딩 되었다. 결과로는 shared source-target vocabulary를 37000 tokens 을 가지게 된다.
English-French 번역에 대해서는 WMT 2014 English-French 데이터셋의 36백만 문장을 32000 word-piece vocabulary로 변환하였다. 문장 쌍은 적절한 시퀀스 길이에 따라 batching되었고, 각 학습 batch는 거의 25000 source token들과 25000 target token들로 구성되었다.
Hardware and Schedule
논문에서는 이 모델을 8개의 NVIDIA P100 GPU를 사용해 학습을 진행했고, 논문에서 사용한 hyperparameter 상으로, 각 training step이 0.4초가 걸렸다. 이러한 과정을 100,000 번 총 12시간 동안 학습을 진행했고, Big model의 경우 각 step time은 1.0초, 300,000 step으로 3.5일이 걸렸다.
Optimizer
옵티마이저로는 아래 하이파 파라미터와 함께 Adam optimizer를 사용하였다.
learning rate (학습률)의 경우 아래와 같은 수식을 따라 변화시켰다.
Regularization
Residual Dropout: 각 residual sum이 이뤄지고 normalized 되기 전에, sub-layer마다 dropout을 사용하였다. 추가로,인코더와 디코더 파트 모두에서 embedding 의 sum과 positional encoding에도 dropout을 적용하였다. 파라미터 Pdrop = 0.1로 설정하였다.
Label Smoothing: 학습과정에서 label smoothing을 하이퍼파라미터 입실론 = 0.1을 사용하였다. 이런 방식은 모델이 학습하는 데에 uncertainty를 부여하나, accuracy와 BLEU score에서는 더 우위에 있어 사용하였다.
Results
Machine Translation
WMT 2014 English-to-German 번역 task에서 big transformer 모델 (테이블 가장 아래)는 기존의 모델들에 비해 가장 높은 성능을 보여주었고, 28.4의 BLEU score로 SOTA를 달성했다. 위에서 설명했듯 8개의 P100 GPU 로 3.5일이 소요되었으며, 기본 모델 (base 모델) 역시 기존 모델들에 비해 training cost는 낮고, BLEU Score의 경우 가장 높은 것을 확인할 수 있다.
English-to-French의 경우 big model이 41.0으로 BLEU 스코어를 달성했고, training cost 역시 기존 SOTA모델에 비해 1/4만큼의 감축을 이루어냈다. big model의 경우 drop out rate 를 0.3이 아닌 0.1을 사용했다고 한다. (이하 생략)
Model Variation
English Contituency Parsing
Reference:
https://towardsdatascience.com/what-is-an-encoder-decoder-model-86b3d57c5e1a
'데이터 과학 스터디 > 논문 리뷰' 카테고리의 다른 글
[NEURAL MACHINE TRANSLATION BY JOINTLY LEARNING TO ALIGN AND TRANSLATE] Attention 논문 리뷰 (0) | 2023.02.16 |
---|---|
[Word2Vec] CBOW, Skip-gram 논문 리뷰 (0) | 2023.01.31 |
[Generative Adversarial Nets] 논문 리뷰 (1) | 2022.09.28 |
[Fully Convolutional Networks for Semantic Segmentation] 논문 리뷰 (1) | 2022.09.22 |
[Faster R-CNN]논문 리뷰 (1) | 2022.09.11 |