트랜스포머 (기계 학습)

트랜스포머(영어: Transformer)는 인공신경망 아키텍처의 한 종류로, 자연어 처리 분야에서 많이 쓰인다. 2017년 구글에서 나온 논문 Attention Is All You Need에서 처음 소개되었다.

배경[편집 | 원본 편집]

자연어와 같은 시퀀스 데이터를 처리하기 위해 기존에는 Recurrent Neural Network (RNN)이 많이 사용되었는데, 이 모델은 재귀적, 순차적인 구조로 되어 있어 GPU 활용이 나빠 학습 및 추론에 많은 시간이 소모되며 long-term dependency를 잘 학습하지 못한다는 단점이 있었다. 즉 RNN으로 학습한 언어 모델의 경우 문법 등의, 비교적 짧은 거리의 의존 관계는 잘 학습하지만 내용적인 일관성이 떨어지는 편이다. 이런 long-term dependency 문제를 해결하기 위해 LSTM 등의 Gated RNN이 많이 사용되었지만 결국 문제가 완전히 해결된 것은 아니었으며, 역시 순차적인 계산으로 인해 발생하는 병렬처리의 어려움은 해결할 수 없었다.

Long-term dependency 문제의 해결을 위해 attention이라는 기법이 개발되었다. 이 메커니즘은 RNN 모델이 지금 단계에서 어디를 봐야 하는지 결정하고 그 부분의 encoding을 직접 가져와 참조한다. 예를 들어 어떤 프랑스어 문장을 영어로 번역하는 모델의 경우, 영어의 주어를 생성할 때 프랑스어의 주어 부분에 높은 attention 점수가 부여되어 그 부분을 직접적으로 참조하게 된다. 기존의 sequence-to-sequence (seq2seq) 구조는 입력 문장을 하나의 벡터로 인코딩해 사용했지만, attention을 통해 입력 문장의 각 단어를 직접 연결하게 되면서 long-term dependency 문제가 많이 해결되었고, 상당한 성능 향상을 보였다.

Attention이 long-term dependency를 해결해주었지만, 아직 병렬 처리 문제가 남았다. 이 문제는 RNN의 순차적인 구조에서 발생하는데, 트랜스포머는 여기서 RNN을 없애고, attention만으로 시퀀스 데이터를 처리하도록 만들어 효과적인 병렬처리가 가능하도록 만들었다. 2010년대 후반 자연어처리 분야에서 놀라운 성능향상이 계속해서 보고되고 있는데, 그중 가장 큰 이유는 트랜스포머를 통해 효율적인 계산이 가능해지면서 모델의 매개변수 개수를 늘리면서도 어마어마한 양의 데이터를 때려넣어 학습할 수 있게 되었기 때문이다.

구조[편집 | 원본 편집]

트랜스포머 구조

원래 논문에서 제안된 구조는 기존의 seq2seq 모델과 같은 인코더-디코더 구조이다. 이후 나온 모델인 BERT나 GPT는 여기서 각각 인코더, 디코더만 떼어 사용하는데, 주어진 태스크에 맞게 응용하면 된다.

Attention이 이 모델의 가장 핵심적인 부분이라고 할 수 있다. 인코더의 attention 레이어는 입력 시퀀스의 모든 토큰의 임베딩에 대해 attention 스코어를 계산한다. Scaled dot-product attention이라는 attention 메커니즘을 활용하는데, 간단하게 설명하면 자신의 입력(Query)과, attention 할 다른 토큰의 입력(Key)을 내적(dot-product)한 값을 attention 스코어로 활용하는 방식이다. 이렇게 내적한 값을 Key의 차원([math]\displaystyle{ d_k }[/math])의 제곱근으로 나누어 쓰기 때문에 scaled가 붙었다. 이 결과를 softmax 함수를 거쳐 0에서 1 사이의 값으로 만들고, 대상 토큰 값(Value)에 곱해 출력한다. 행렬 표기를 이용해 식으로 쓰면 다음과 같다. 여기서 Q, K, V는 동일한 행렬로, 단어 수만큼의 행, 입력 차원([math]\displaystyle{ d_k }[/math])만큼의 열을 가진다.

[math]\displaystyle{ \operatorname{Attention}(Q,K,V) = \operatorname{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V }[/math]

다만 이 attention을 하나만 사용하면 모델이 너무 단순해지기 때문에, 입력을 복수의 linear projection을 통해 여러 개로 늘려 각각에 대해 scaled dot-product attention을 수행하고 그 결과를 합치는데, 이를 multi-head attention이라고 부른다. 이를 통해 다양한 관계를 학습할 수 있게 된다.

디코더 부분에선 인코더와 유사하게 우선 self-attention을 통해 현재 decoding중인 문장의 attention 결과를 계산한다. 다만 아직 디코딩이 되지 않은, 자기 뒷부분을 가리고(masking) 앞부분에만 attention할 수 있게 만들기 때문에 masked multi-head attention이라고 부른다. 여기서 나온 결과를 다시 multi-head attention 레이어에 통과시키는데, 이전과 다른 점은 Key와 Value가 인코더의 출력이라는 점이다.

Positional encoding도 중요한 요소인데, 각 위치의 사인이나 코사인 값을 토큰 임베딩에 더해주는 것이다. 이를 통해 RNN과 같은 순차적 구조 없이도 각 토큰의 순서나 위치 정보를 활용할 수 있게 된다.