데이터 과학 유망주의 매일 글쓰기 — 스물 다섯 번째 주말
Transformer논문 읽어보기
# Transformer
오늘 한일:
오늘은 Transformer를 이용하여 챗봇을 만들기 위해, Transformer를 구조적으로 이해하려는 노력을 했다. 이를 위해서 Transformer가 처음 발표된 자료를 읽을 수 밖에 없었는데, 바로 Google에서 발표한 “Attention is all you need”이라는 논문이었다(1).
이 논문을 통해 Transformer라는 개념이 처음 등장했다. 당시 RNN(LSTM, GRU)보다 더 단순하면서도, RNN의 성능을 뛰어넘는 자연어 이해 능력을 보여주어 상당한 주목을 받았다고 한다. 그래서 이 논문을 반드시 읽어보고, 내가 Transformer를 이해해야겠다고 생각했다.
Transformer
Transformer는 Google Brain 인공지능 연구팀에서 발표한 “All you need is attention”이라는 논문을 통해 세상에 처음 모습을 드러냈다. RNN보다 구조적으로 더 단순하면서도, 영어-독일어 번역 및 영어-프랑스어 번역에서 더 좋은 성능을 보여주었다고한다. 또한 최소 8개의 P100 GPU로 12시간 정도만 훈련을 시켜도 RNN보다 더 좋은 성능이 나왔다고 하니, 자연어처리(NLP)학계에서도 상당히 좋은 기술로 인정할 수 밖에 없었다.
이 Transformer를 이해하는 가장 중요한 열쇠는 Attention 기법을 이해하는 것이다. 그렇다면 이 Attention은 도대체 무엇일까?
Attention
Self-Attention
Attention기법 중 잘 알려진 기법은 Self-Attention이다. 이는 시퀀스를 가진 데이터내 각 데이터들 간 서로 다른 위치를 관계짓는 Attention 기법으로써, 시퀀스를 표현하기 위한 계산기법이라고 할 수 있다. 이 Attention기법은 Transformer로 하여금 텍스트를 이해하고, 내용을 요약(abstractive summarization), 유사문장 인식(textual entailment), 독립적인 의미를 가진 문장(task-independent sentence representation)을 학습하는데 활용될 수 있다.
그러나 Attention 자체를 좀 더 잘 이해하기 위해서는 Transformer내 사용되는 Encoder 및 Decoder를 알아야한다.
Encoder
6개의 똑같은 성질을 가진 레이어로 이루어져 있으며, 각 레이어는 두 개의 서브 레이어를 가진다. 첫 레이어는 multi-head self-attention 기법이라하며, 두 번째 레이어는 단순한 위치 기반으로 완전히 연결된(fully-connected) feed-forward network라 할 수 있다. 두 서브 레이어 각각에는 residual connection이 있고, 레이어 표준화(layer normalization)이 적용된다. 각 레이어의 출력값은 LayerNorm(x + Sublayer(x))가 되고, Sublayer(x)는 서브 레이어 자체에 구현된 함수를 말한다. 이러한 Residual Connection 및 모델의 모든 서브 레이어, embedding 레이어의 활용을 위해 출력값의 차원은 dmodel = 512로 설정한다.
Decoder
역시 6개의 똑같은 성질을 가진 레이어로 이루어져 있으나, 인코더와는 다르게 각 레이어에 세 번째 서브 레이어가 존재한다. 이 세 번째 레이어는 인코더 스택(stack)의 출력값에 multi-head attention을 적용한다. 인코더처럼, 각 서브 레이어에 residual connection및 레이어 표준화를 적용한다. 디코더 스택의 self-attention을 보정해 현재 위치가 아닌 이후 위치에 attention이 분산되는 것을 막는다. 이 masking 결과와 output embedding값이 한 자리씩 offset 되어있다는 것을 고려하여, 위치 “i”에 대한 예측이 “i”보다 작은 위치의 출력에 의해서만 변할 수 있도록 한다.
Attention
Attention 함수는 query와 key-value 쌍을 출력값(output)에 맵핑하는 역할을 한다. 출력값은 value의 가중치(weight) 합으로 계산되며, 각 value에 지정된 가중치는 이에 해당하는 query 및 key를 서로 맵핑하는 함수를 통해 계산된다. 즉, Attention은 벡터화된 출력 value의 가중치 합을, 역시 벡터화된 query와 key에 맵핑하여 연결하는 과정이라 할 수 있다.
Scaled Dot Product Attention
Attention 함수 중 하나로써, 입력값은 dk의 차원 값을 가지는 query와 key, 그리고 dv의 차원을 가지는 value로 구성된다. 모든 Key와 query의 dot product를 계산하며, 각각을 sqrt(dk)로 나누어 표준화한다. 이후, softmax 활성화함수를 통해 value의 가중치를 구한다.
실제로 Attention 함수는 특정한 수의 query를 모두 동시에 활용하여 연산을한다. query는 Q라는 매트리스의 형태를 가지고 있고, Key역시 K라는 매트리스, 그리고 Value는 V라는 매트리스에 정의된다. 즉 아래와 같은 형태로 계산된다.
가장 널리 쓰이는 Attention 함수는 합산형 함수(additive function)과 곱하기 형인 dot-product 함수가 있다. Dot-product attention은 Q와 K(transpose)를 과적한 것이며 여기에, scaling factor인 1/sqrt(d_k)가 곱해진다. 합산형 함수는 하나의 Hidden Layer와 feed-forward network를 활용해 호환 함수(compatibility function)을 계산한다. 두 함수의 논리적 복잡도는 비슷하지만, dot-product attention 함수는 코드상으로도 상당히 최소화된 매트리스 과적 연산을 구현할 수 있어, 빠르고 공간 복잡도 면에서도 더 효율적이다.
작은 차원의 d_k값으로는, 두 가지 attention 기법의 성능은 별 차이가 없지만, 합산형 함수(additive function)는 d_k값으로 표준화하지 않아도 dot-product attention에 비해 더 좋은 성능을 낼 수 있다. 아마도 이는 차원 값인 d_k가 더 커질수록, dot-product의 크기(magnitude)가 비례해서 더 커지며, 이로 인해 softmax 활성화 함수가 매우 작은 경사(gradient)를 갖는 부분에서만 값을 출력하게되기 때문으로 추정된다. dot-product를 sqrt(d_k)로 나누는 것은 이를 상쇄하기 위한 장치라 할 수 있다.
Multi-head Attention
D_model 차원의 key, value, query들로 하나의 attention 함수 연산을 하기 보다는, query, key, value등을 “h” 만큼, 학습된 다른 d_k에 대한 선형 projection 및 d_k, d_v 차원을 순서대로 선형 project(linearly project)하는 것이더 효과적일 수 있다. 이들은 concatenated되고 또 한번 project되어, 그림 2에서 볼 수 있는 결과를 도출한다.
Multi-head Attention은 모델이 여러 다른 위치에 있는 표현에 동시적으로 집중(jointly attend)할 수 있도록 해 준다. 하나의 Attention head를 통해, 평균적으로 아래와 같이 나타낼 수 있다.
Projection은 변수 매트리스로써, 아래와 같이 표현할 수 있다.
이 논문에서는 h = 8 평행 attention layer 또는 head를 활용한다. 각각에 대해서 d_k = d_v = d_model/h = 64 값을 활용한다. 각 head의 축소된 차원 때문에, 총 연산 비용은 single-head attention을 모든 차원을 활용하여 연산하는 것과 큰 차이가 없다.
Transformer 모델에서의 Attention활용
Transformer는 multi-head attention을 아래 세 가지 방법으로 활용할 수 있다.
- “Encoder-Decoder Attention” 레이어에서는, query들이 바로 이전 decoder레이어에서 전달되며, 메모리 key와 value는 encoder의 출력으로부터 나온다. 이는 Decoder의 모든 위치에서, 입력 시퀀스의 모든 위치로 집중(attend)할 수 있게 해준다. 이는 sequence-to-sequence(seq2seq) 모델에서 전형적인 encoder-decoder attention 기법을 모방한 것이다.
- Encoder는 self-attention 레이어를 포함하며, self-attention 레이어에서는 모든 key, value, query들이 encoder의 이전 레이어에서 출력되는 값들이다. Encoder의 모든 위치에서는, encoder내 이전 레이어의 모든 위치로 집중(attend)할 수 있다.
- 비슷한 개념으로, decoder의 self-attention 레이어는 decoder의 각 위치에서, decoder내 해당 위치까지의 모든 위치로 집중(attend)할 수 있다. Decoder 내에서 왼쪽으로 흐르는 정보들을 막아, 자동회귀적인 속성(auto-regressive property)을 유지할 수 있어야한다. 이는 Scaled Dot Product Attention내에서도, softmax 활성화 함수의 모든 부정한 연결(illegal connection)에 해당하는 입력 value를 masking out(-inf로 설정)하여 구현된 방법이다.
위치기반(Position-wise) Feed Forward Networks
Encoder및 Decoder의 각 레이어 하위 Attention 서브 레이어에, 서로 똑같지만 각 위치에 별도로 적용된, 완전히 연결된(fully-connected) feed-forward network가 존재한다. 이들 사이에는 ReLU 활성화 함수가 존재하고, 2개의 선형 변환(linear transformation)으로 구성되어있다.
선형 변환은 각 위치마다 다르지만, 레이어간 다른 변수를 사용한다. 이를 다르게 표현하는 방법은, kernel size = 1을 사용해 2개의 Convolution으로써 표현이 가능하다. 입력과 출력의 차원은 d_model = 512이며, 내부 레이어는 d_ff = 2048의 차원을 가진다.
Embedding 및 Softmax
다른 시퀀스 전달 모델처럼, Transformer 역시 입력과 출력 토큰을 d_model 차원으로 벡터화한 embedding 값들을 학습했다. 또한 일반적으로 사용하는 학습된 선형 변환 및 softmax 함수로 decoder 출력을 다음 토큰의 예측 확률로 변환한다. Tranformer 모델에서는, 2개의 embedding 레이어와 softmax 함수에 넣기 전 선형 변환 사이에서 같은 가중치의 매트리스를 공유한다. Embedding 레이어에서는, 이 가중치를 sqrt(d_model)과 곱한다.
Positional Encoding
모델이 RNN 처럼 재귀(recurrence)와 CNN처럼 convolution을 활용하지 않기 때문에, 모델이 시퀀스를 잘 활용하게 하기 위해서는, 시퀀스내 토큰의 상대적 또는 절대적 위치 정보를 모델에 입력해 줄 필요가 있다.
- “n”: 시퀀스의 크기
- “d”: 차원
- “k”: convolution의 kernel size
- “r”: 제한된 self-attention에서의 이웃(neighborhood) 크기
마지막으로, “위치 인코딩(positional encoding)”을 encoder와 decoder의 가장 밑 stack의 입력 embedding값에 더한다. 위치 인코딩 값은 embedding값처럼 d_model의 차원을 가지게 되어, 두 값이 합산될 수 있다. 선택할 수 있는 위치 인코딩은 학습된(learned)값 또는 고정값(fixed)에 따라 다양할 수 있다.
이 논문에서는, 여러 주파수의 sine 및 cosine 함수를 사용한다.
위 수식에서, 각 위치(pos)의 인코딩 값에 대한 차원(i)은 sin 함수의 출력이다. Wavelength는 2pie 에서 10000*2pie 까지 geometric progression을 형성한다. 이 함수를 선택한 이유는, 그 어떤 offset “k”에 대해서도 PE_(pos+k)가 PE_pos의 선형 함수로 표현될 수 있으며, 이러한 sine/cosine 함수가 상대적 위치에 주의(attend)하여 쉽게 학습을 할 수 있게끔 해줄 수 있다고 가정했기 때문이다.
또한 학습된 위치 embedding을 활용하여 실험을 해 보았으나, 두 가지 버전이 거의 같은 결과를 출력한다는 것을 알아냈다. (테이블 3의 E열). sin 함수를 선택한 이유는 모델이 시퀀스 크기를 학습 중 만나게 되는 값들보다 더 큰 값을 추론할 수 있게 해 주기 때문이다.
Self-Attention을 사용한 이유
여기서는 self-attention 레이어와, 기존에 하나의 변수 길이만한 시퀀스(x1, … xn)를 같은 크기의 다른 시퀀스(z1, …, zn)에 맵핑하는데 보통활용하는 recurrent/convolution 레이어를 여러 면에서 비교한다. 여기서 전형적인 시퀀스 encoder/decoder내 hidden 레이어처럼, xi , zi는 xi , zi ∈ R d 이다. self-attention의 사용을 위해 다음 3가지 요구사항(desiderata)를 고려한다.
첫 째는 레이어당 총 계산 복잡도를 고려하는 것이다. 또하나는 필요한 최소한의 시퀀스 동작으로 측정되는 평행화(parallelize)가 가능한 연산량이다. 마지막으로는 네트워크 상의 long-range dependencies 사이에 있는 path 크기다. Long-range dependencies를 학습하는 것은 시퀀스 처리에서 가장 중요한 문제라고 할 수 있다. 이러한 dependencies를 학습할 수 있는 가장 중요한 요소 중 하나는 네트워크를 순회해야하는 순전향 및 역전향(forward/backward)신호의 path 크기다. 입력 및 출력 시퀀스의 위치 조합 사이에서 존재하는 길이 짧을수록, long-range dependencies를 학습하는 것이 더욱 쉬워진다. 그러므로, 서로 다른 레이어 타입으로 이루어진 네트워크 상에서, 두 입력 및 출력 위치값 사이의 최대 길이를 비교한다.
테이블 1에서 볼 수 있는 것처럼, self-attention 레이어는 모든 위치를 차례대로 실행되는 동작의 상수와 연결하며, 재귀 레이어는 O(n) 시퀀스 동작을 필요로한다. 연산복잡도면에서는, 시퀀스 크기 “n”이 차원 “d”보다 작다면, self-attention 레이어가 재귀 레이어 보다 더 빠르다. 이는 기계번역에서, 대부분의 최첨단 모델을 사용할 때 활용하는 문장 표현이나 단어 조각(word-piece) 및 byte-pair 표현 대부분에 해당한다. Self-attention은 이후에 나오는 출력 위치를 중심으로한 입력 시퀀스에서, 크기 “r”인 이웃만을 고려하여, 장문의 문장 등에 대한 연산 성능을 높일 수 있다. 또한 이는 최대 path의 크기를 O(n/r)까지 늘릴 수 있다. 구글에서는 이를 계속적으로 연구할 계획이다. 커널 너비 k < n를 가진 하나의 convolutional 레이어는, 모든 입력 및 출력 위치의 쌍들에 연결되지 않는다. 이는 convolutional 레이어에서 인접한 kernel에 O(n/k)만큼, 또는 팽창한 convolution에 O(logk(n))만큼의 stack을 필요로할 수 있어, network상의 2 위치 사이에 가장 긴 path의 크기를 증가시킬 수 있다. Convolutional 레이어는 일반적으로 recurrent 레이어보다 “k”의 배수 만큼 더 비싸다. 하지만 별도의 convolution은, 연산 복잡도를 O(k*n*d + n*d²)정도로 상당히 낮출 수 있다. k=n이더라도, 별도의 convolution 복잡도는 self-attention layer와 point-wise feed-forward layer의 합과 같다. Transformer 모델은 바로 이런 방식의 접근을 활용한다.
또한, 이러한 방식의 Self-attention은 더 해석하기 쉬운 모델을 만들 수 있게 한다. 모델의 attention 분산에 대한 탐구 및 해설은 부록(appendix)의 예제를 통해 정리되었다. 각 attention head가 여러 다른 task를 학습할 수 있도록 할 뿐만 아니라, 대부분은 문장의 syntax 및 의미 구조와 관련된 행위를 보인다.
모델의 훈련(Training)
Training Data and Batching
학습에 활용된 데이터는 WMT 2014 영어-독일어 데이터셋으로 약 4백5십만 문장의 쌍으로 이루어져있다. 문장은 byte-pair encoding을 통해 인코딩 되었으며, 소스(source)-타깃(target) 쌍의 3만 7천개의 용어(vocabulary) 토큰들로 이루어져있다. 또하나의 데이터는 WMT 2014 영어-불어 데이터셋으로써, 3천6백만 개의 문장과 3만 2천개의 독립적인 단어 토큰들로 이루어져있다. 문장 쌍은 비슷한 시퀀스 크기에 따라 batch로 묶였다. 각 훈련 batch는 2만 5천 여개의 소스 토큰 및 2만 5천여 개의 타깃 토큰을 포함한 문장의 쌍을 가진다.
Hardware and Schedule
Transformer 모델은 8 개의 NVIDIA P100 GPU를 포함한 하나의 컴퓨터를 통해 훈련되었다. 이 논문에서 언급된 하이퍼파라미터를 사용하는 베이스 모델을 만들기 위해, 각 훈련 step은 0.4초가 소요되었다. 베이스 모델은 12시간 동안 총 1십만 step으로 훈련되었다. 테이블 3에서 보여주는 대형 모델에서는 step 시간이 1초 걸렸다. 대형 모델은 3.5일 동안 3십만 step으로 훈련되었다.
Optimizer
Beta1 = 0.9, Beta2 = 0.98, epsilon = 10^-9의 하이퍼 파라미터를 활용한 Adam Optimizer를 사용하였다. 학습률(learning_rate)는 훈련 동안 아래의 수식을 통해 업데이트 되었다.
위 수식은 첫 warmup_steps 학습 step에 대해 선형으로 학습률이 증가하며, 이후 1/sqrt(stepnum) 만큼 비례해서 감소한다는 의미다. warmupsteps은 4000을 사용했다.
사용한 하이퍼파라미터:
- Beta1 = 0.9
- Beta2 = 0.98
- epsilon = 10^-9
- Warmupsteps = 4000
Regularization
아래 3가지의 가중치 제한(regularization) 기법이 활용되었다.
- Residual Dropout: Dropout을 서브 레이어의 입력값에 더하고 표준화하기 전, 각 서브 레이어 출력에 먼저 적용하였다. 또한, dropout을 embedding값의 합에 적용하고, Encoder 및 Decoder stack 모두에 있는 위치 인코딩(positional encoding) 값에 적용하였다. 베이스 모델을 위해 P_drop = 0.1의 dropout 비율을 적용하였다.
사용한 하이퍼 파라미터:
- P_drop = 0.1
2. Label Smoothing: 학습동안 epsilon_ls = 0.1를 활용해 label smoothing을 적용했다. 이는 모델의 perplexity를 낮추어 모델의 불확실성을 높이지만, 정확도를 높이고 BLEU 점수를 높여준다.
사용한 하이퍼 파라미터:
- epsilon_ls = 0.1
결과
기계 번역
WMT 2014 영어-독일어 번역 작업에서 대형(Big) Transformer 모델은 (테이블 2의 Transformer)는 이전까지 사용된 Ensemble 모델을 포함한 그 어떤 최첨단 모델과 비교해도 약 2.0 BLEU 스코어 더 높은 성능을 보인 것을 알 수 있다. 즉, 28.4 BLUE 스코어 정도로 더 나은 성능을 보이는 것을 알 수 있다. 이 모델의 설정(configuration) 정보는 테이블 3의 가장 밑부분에 나와있다. 학습은 8개의 P100 GPU를 사용하여 약 3.5 일 동안 진행되었다. 아주 단순한 형태의 베이스 Transformer 모델도 Ensemble 모델을 포함한 모든 이전의 모델들보다 더 나은 성능을 보였으며, 학습 비용(traning loss)역시 그 어떤 다른 모델보다도 적게 드러났다.
WMT 2014 영어-불어 번역 작업에서 대형 Transformer 모델은 41.0의 BLEU 스코어를 기록했으며, 이 역시 다른 그 어떤 형태의 모델보다도 더 뛰어난 성능이다. 학습 비용역시, 이전에 존재했던 최첨단 모델에 비교해 약 ¼ 수준이었다. 영어-불어 데이터를 학습한 대형 Transformer 모델은 하이퍼파라미터 P_drop은 0.1이 아닌 0.3을 사용하였다(P_drop = 0.3).
사용한 하이퍼파라미터:
- P_drop = 0.3
베이스 모델에는 마지막 5개 체크포인트의 평균값을 10분 간격으로 계산하여 얻어진 모델을 사용하였다. 대형 모델은 가장 최근의 20개 체크포인트 평균을 계산하였다. Beam size = 4 및 크기 penalty값인 alpha = 0.6을 사용하였다. 이 하이퍼파라미터는 모델 개발용 데이터 set을 실험하여 얻어졌다. 추론 중 최대 출력 크기는 입력 크기 + 50으로 설정하되, 가능하면 일찍 종료(terminate)시킨다.
사용한 하이퍼파라미터:
- Beam size = 4
- Alpha = 0.6
테이블 2는 Transformer의 모델링 결과, 번역 품질 및 훈련 비용을 다른 모델 구조과 비교한 내용을 보여준다. 훈련 시간, 사용한 GPU의 수, 각 GPU의 지속성 단일 정밀도 이동 소수점 용량(sustained single-precision floating-point capacity) 측정값을 곱하여 소수점 연산(floating-point operations)의 수를 측정한다.
모델 변이
각 Transformer 구성부의 중요성을 측정하기 위해, 베이스 모델을 다변화했다. 이는 개발용 데이터 셋인 “newstat2013”을 활용해 수행한 영어-독일어 번역의 성능 변화를 측정하기 위한 목적이다. 이전에 언급한 beam 검색을 사용하였으나, 체크포인트의 평균값을 계산하지는 않았다. 이 결과는 테이블 3에서 볼 수 있다.
테이블 3의 A열에서는, attention head 및 attention key, value 차원의 수를 다변화하여, 섹션 3.2.2에서 언급한대로 필요한 연산의 수를 일정하게 유지하였다. 단수(single) head attention은 가장 좋은 결과를 낸 모델보다 0.9 BLEU 정도 성능이 낮았으며, head가 너무 많은 경우에도 성능이 떨어졌다.
테이블 3의 B열에서는, attention key 크기인 d_k를 줄이는 것이 모델의 성능을 떨어뜨린다는 것을 확인할 수 있었다. 이는 모델의 호환성을 결정하기 어려우며, 이를 위해, dot product 방법보다 더 나은 방법이 필요하다는 의미가된다. C열과 D열에서는 예상대로 더 큰 모델이 더 좋은 성능을 보였으며, dropout이 과적합(overfitting) 문제를 해결하는데 있어 매우 효과적이라는 사실을 알 수 있다. E열에서는 sin 위치 인코딩을 학습된 위치 embedding값으로 대체하였으며, 여기서는 베이스 모델과 거의 비슷한 성능을 보인다는 것을 알 수 있다.
영어 구성어(Constituency) Parsing
Transformer가 다른 번역 작업에도 일반화 될 수 있는지 알아보기 위해, 영어 구성어(Constituency) Parsing을 실시했다. 이 작업은, 출력값이 구조상의 제한(structural constraints)에 영향을 받을 수 있고 입력값보다 상당히 크다는 문제를 안고있다. 또한, RNN seq2seq(sequence-to-sequence) 모델은 작은 규모의 데이터 영역에서는 그다지 좋은 결과를 내지 못했다.
4만 여개 문장으로 구성된 Penn Treebank의 Wall Street Journal(WSJ) 데이터에 레이어4개와 차원 d_model = 1024로 구성된 Transformer를 훈련시켰다. 또한, 1천 7백만 여개 문장으로 구성된, 더 높은 confidence값과 BerkleyParser corpora를 활용한 데이터를 이용해, 반지도학습 상황(semi-supervised)에도 학습을 시켜보았다. WSJ만을 이용하는 상황에서는 1만 6천개의 토큰으로 구성된 용어들을 사용했으며, 반지도학습 상황에서는 3만 2천 여개의 토큰으로 구성된 용어들을 활용했다.
Dropout값과 attention 및 residual값, 섹션 22의 개발 데이터 셋에서 언급된 learning rate 및 beam size 변수들을 선택하기 위해 매우 적은 수의 실험만을 실시했으며, 다른 모든 변수들은 영어-독일어 기반 기계 번역 모델과 같은 값을 유지했다. 추론시, 최대 출력 크기를 입력 크기 + 300으로 설정했으며, WSJ만을 사용한 상황과 반지도학습 상황에서는 beam size는 21, alpha는 0.3으로 설정했다.
사용한 하이퍼파라미터:
- Beam size = 21
- Alpha = 0.3
테이블 4은 비록 특정한 목적으로 tuning이 부족하더라도, 모델이 상당히 좋은 성능을 낼 수 있다는 것을 보여주며, 이전에 존재했던 그 어떤 최첨단 모델보다도 RNN 문법 작업을 제외한 모든 작업에서 더 나은 결과를 얻을 수 있다는 것을 보여준다.
RNN seq-2-seq모델과 비교하여, Transformer는 4만 여개 문장으로 이루어진 WSJ 데이터만을 학습하여도 BerkleyParser 보다 더 나은 성능을 보인다는 것을 알 수 있었다.
결론
이 논문에서는 Transformer라는 시퀀스 형질도입형(sequence transduction) 모델을 최초로 소개하였다. Transformer 모델은 Attention이라는 개념에 기반해서 만들어졌으며, Encoder-Decoder 구조에서 그동안 널리 쓰여왔던 Recurrent 레이어를 다수의 head(Multi-head)를 가진 self-attention으로 대체하였다.
기계 번역 업무에서 Transformer는 RNN 및 CNN 레이어에 기반한 구조보다 훨씬 더 빠르게 학습을 할 수 있다는 것을 알 수 있다. WMT 2014 영어-독일어 및 영어-불어 번역 작업 모두에서 더 나은 성능을 보였고, 이전에 존재했던 모든 Ensemble 모델보다도 더 뛰어난 성능을 보여줌으로써 새로운 최첨단 모델의 가능성을 제시했다.
앞으로 이러한 Attention기반 모델의 발전 가능성과 더욱 다양한 업무에 활용될 수 있는 가용성이 기대된다. 앞으로도 Transformer의 지역(local)적이고 제한된(restricted) attention 기법을 텍스트 뿐만 아니라 이미지, 비디오, 오디오 데이터 등 더 많은 양의 입력 및 출력 데이터들에 효과적으로 활용될 수 있도록 노력할 것이다. 또한, 모델이 처리할 시퀀스의 양을 줄이는 것 역시 앞으로의 도전과제다.
추가 자료
내일 할일:
오늘은 자연어 처리 모델인 Transformer가 세상에 나올 수 있었던 “Attention is all you need”라는 논문을 읽어보았다. Google에서 최초로 제시한 기술로써 “Attention”이라는 개념을 활용하여, 이전 RNN이나 CNN기반 자연어 처리 모델보다도 더 단순하고 효율적이면서도, 더 높은 성능을 보여주었다. 2016년 이 논문을 통해 Transformer는 자연어처리 분야에서 매우 큰 신드롬을 불러왔으며, 후에 BERT 및 GPT-3와 같은 획기적인 자연어처리 모델이 나오게된 결정적인 계기가 되었다.
결정적으로 Attention이라는 개념은, 문장을 통째로 입력받아 거기서 특정한 위치의 용어에 가중치를 주고, 문장안에서 서로 다른 가중치를 갖는 단어들의 위치를 시퀀스 정보로 삼아 문맥을 학습할 수 있는 방법이다. 한마디로, 문장 안에서 각 단어의 가중치는 모델이 문장의 어느 부분을 주의(Attention)해서 보는지 결정하는 것이다. 마치 인간이 특정한 문장이나 문단을 읽을 때 특정한 키워드에 집중하여 문맥을 파악하는 것과 같은 과정이라고 할 수 있다. 아마 이것이 이 기법을 Attention이라고 부르는 이유일 것이다. 한번에 시퀀스 데이터를 입력하고 처리할 수 있다는 점에서, 시퀀스 데이터를 한번에 하나씩 처리하는 기존 RNN/CNN 기반 자연어 처리보다 구조적으로 더 단순한 이유를 이해할 수 있었다.
그럼에도 불구하고, 영어-불어 번역의 정확도가 최고 50%도 나오지 않았다는 사실에 비추어 볼때, 이 분야가 그만큼 좋은 모델을 만들어내기 어렵다는 사실을 다시 한번 깨달았다. 어찌보면, 하나의 언어에서도 매우 많은 용어가 존재하고, 그 용어에서 파생된 동사, 형용사, 명사, 부사 등과 새롭게 창조되는 용어들을 고려한다면 기계 번역 같은 분야에서 정확도가 90%에 가까운 모델을 만든다는 것은 어찌보면 실현 불가능한 일이 아닐까라는 생각도 들었다. 그나마 영어에 가장 가까운 언어였기 때문에 50%에 가까운 정확도가 나온 것이 아닐까하는 생각이 든다. 영어-독일어 번역에서는 30% 미만의 정확도를 나타낸 것으로보아, 아무리 가까운 문화권의 언어라도, 하나의 언어에서 다른 언어로 넘어가면서 다루어야 할 데이터가 기하 급수적으로 늘어나면서 자연어처리 모델의 정확도는 매우 떨어질 수 있다는 생각이 들었다.
그렇기 때문에, 내가 이를 바탕으로 한국어 데이터를 처리하는 Transformer를 만든다고 해도, 그렇게 높은 정확도를 기대하기 힘들 수 있지 않을까라는 생각이들었다. 조금 기운이 빠지는 소식이기는 하지만, 어쨌든 이런 공신력이 높은 자료를 통해 내가 다루고자 하는 기술의 현황을 제대로 알 수 있었다는 점에서, 지난 일주일간 시간을 들여 논문을 읽었던 것이 어느정도 의미가 있었다고 생각한다.
논문을 많이 읽지 않았다보니, 논문에서 이야기하는 기술을 전부 이해하기 쉽지 않았다. 아마도, 이 논문을 설명하는 다른 자료를 같이 찾아보아야 이해하기 더 쉬울 것 같다. 이 논문에 있는 내용을 과연 내가 어느 정도 구현할 수 있을지 걱정이 되기는 하지만, 일단 주어진 시간을 최대한으로 활용하여 이번 기회에 논문을 이해하고, 이해한 내용을 바탕으로 직접 코드로 구현해 보는 작업을 하고 싶다. 쉽지는 않겠지만, 재미 있을 것 같다. 나를 최대한 어려운 상황에 몰아붙여야 내가 최대한 성장할 수 있다고 믿는다. 마치 드래곤볼의 초사이어인처럼, 매우 높은 수준의 지적 어려움에 몰렸을 때, 비로소 나의 잠재력을 최대한 터뜨릴 수 있는 기회가 있다고 보기 때문이다.
이번 만큼은 피하지 않고 어려운 것에 맞서, 나를 최대한 성장시키고 싶다. 성장과 발전을 원하는 모든 이들이, 최대한 어려운 상황을 맞게 되더라도 피하지 않고, 잠재력을 끌어올릴 수 있는 기회로 활용할 수 있기를.
참조:
(1) Attention Is All You Need — Arxiv.org
(2) 위 논문에서 Transformer 모델을 테스트 하기 위한 코드는 다음링크에서 찾을 수 있다: https://github.com/tensorflow/tensor2tensor