트랜스포머(Transformer) 알고리즘이란?
트랜스포머(Transformer)는 구글이 자연어처리를 위해 2017년 발표한 모델로 현재 AI 분야의 혁신을 이끌고 있다. 우리가 웹이나 API를 통해 AI를 처음 활용하게 된 계기가 된 ChatGPT 역시 트랜스포머에 기반한 모델이며, 구글이나 페이스북 등이 이에 대항하기 위해 내놓은 언어모델들 역시 트랜스포머 기반이다. 최근 트랜스포머는 자연어처리 뿐만 아니라 컴퓨터 비전이나 음성 인식 등 다른 분야에도 적용되며 최고 수준의 성능을 기록할 것으로 기대되고 있다.
이번 글에서는 현재 AI 혁신을 이끌고 있는 트랜스포머 모델의 역사와 모델에 대한 직관적인 이해를 시도해 보도록 하자.
딥러닝의 시작은 인간의 뉴런에서 아이디어를 얻었다고 하는 퍼셉트론(Perceptron)으로 1950년대로 거슬러 올라갈 수 있지만 1990년~2000년대 들어서 딥러닝은 컴퓨터 연산 능력 부족과 무엇보다 분석할 데이터가 부족해 2010년 대 초까지 암흑기를 맞았다.
2010년 대 들어 스마트폰이나 소셜 미디어로 데이터가 폭발적으로 증가하고, 2012년 이미지넷 챌린지 대회에서 딥러닝을 사용한 Alexnet이 이미지 분류 정확도를 단번에 10% 이상 끌어 올리며 딥러닝 활용의 신호탄이 되었다. Alexnet은 5개 CNN (Convolution Neural Network) 신경망과 3개의 FC 레이어로 구성되는데 그 후 딥러닝 컴퓨터 비전 분야는 주로 CNN를 활용한 모델 개발이 이뤄져 2015년 등장한 Resnet은 이미지의 인식 오류율이 인간과 비슷한 3% 대를 기록했다.
이에 반해 자연어처리는 텍스트와 같은 순차 데이터 처리를 위한 인공 신경망인 RNN (Recurrent Neural Network)이 1980년 대 등장하고, 이를 개선한 LSTM이 1997년에 나왔지만 입력 문장이 길어질수록 이전 데이터를 기억하기 힘들다는 문제(Long-term Dependencies)를 한동안 해결하지 못했다. 당시 주목받던 CNN을 활용해 문장의 임베딩 벡터를 만들어 문장의 긍정과 부정을 분석하려는 시도가 나오기도 했다.
2014년 발표된 Sequence to Sequence 언어모델은 자연어처리 역사 상 가장 큰 발명 중의 하나로 꼽히는데, 이는 기존 문장을 수치로 바꾸는 것 뿐만 아니라 여기서 생성된 수치를 활용해 다시 인간의 문장을 생성할 수 있는 모델인 것이다. 기계번역(Machine Translation)을 대표적인 예로 들 수 있는데 말하자면 한국어 문장을 넣어 영어 문장을 생성하도록 하는 것이다.
하지만 Seq2Seq 모델 역시 입력 문장을 처리하는 인코더 부분과 이를 받아 다시 문장을 생성하는 디코더에 RNN을 사용함으로써 입력 문장이 길어질수록 이전 정보를 기억하기 힘들다는 RNN의 고질적인 문제를 가지고 있었다. 또한, 인코더의 마지막 타임스텝에서 나온 수치 정보만을 활용해 타깃 문장을 복원하려다 보니 정보 손실이 발생했다. 뒤에 어텐션(Attention)이라는 게 추가되면서 길이에 구애받지 않는 번역이 가능해지게 되었다.
어텐션의 기본 아이디어는 인코더의 마지막 타임스텝에서 나온 수치 정보만으로는 부족하니 디코더에서 출력 단어를 예측하는 매 시점(time step)마다 인코더의 전체 입력 문장을 다시 한 번 참고하자는 것이다. 단, 전체 입력 문장의 단어를 동일한 비율로 참고하는 것이 아니라 해당 시점에서 예측해야 할 단어와 가장 연관이 있는 단어를 좀 더 집중(attention)해서 보겠다는 것이다. 그리고 이는 수학적으로 디코더의 현재 타입스텝의 출력값(hidden state)에 가중치를 곱해 쿼리를 만들고 이를 인코더 전체의 타입스텝 출력값과 내적(dot product)해 예측해야 하는 단어를 잘 참조할 수 있도록 역전파를 통해 해당 가중치들을 학습시켜 해결한다.
어텐션이 추가됨으로써 문장 길이에 대한 제약은 어느 정도 없어졌지만 여전히 RNN 기반 Seq2Seq 모델은 인간의 번역보다 퀄리티가 떨어졌다. 하지만 트랜스포머의 등장으로 자연어처리는 아예 큰 변화를 맞이하게 된다.
구글은 2017년 Attention is all you need라는 논문을 통해 어텐션을 보정을 위해 사용하는 것 뿐만 아니라 인코더와 디코더를 모두 어텐션으로 구현한 트랜스포머 모델을 소개했다. 트랜스포머 모델은 문장의 길이에 대한 제약은 물론 인코더가 인풋 문장을 보다 잘 이해하고 디코더가 자신이 앞서 생성한 단어들에 대해서도 보다 더 잘 이해할 수 있는 모델이 되었다.
이후 유명한 사전학습 언어모델(PLM)들은 모두 트랜스포머 기반 언어들이다. BERT는 트랜스포머의 인코더 12개만으로 구성되어 자연어 이해에 강점을 보이는 모델이고, GPT-1는 트랜스포머 디코더 12개 만으로 구성되어 자연어 생성에 강점이 있다. 그 뒤 언어모델들은 모델 크기와 데이터셋을 키우며 발전해 왔는데 GPT-3는 디코더 96개에 1750억 개 파라미터를 가진 모델 버전이 가장 크다. ChatGPT는 이 GPT-3 모델을 기반으로 파인튜닝(fine-tuning)한 모델로 대화에 특화된 모델이다.
트랜스포머 모델은 자연어처리 뿐만 아니라 이미지 처리 분야에서도 좋은 결과를 내고 있다. 2020년 발표된 Vision Transformer(ViT)는 트랜스포머 모델을 비전 분야에 적용한 것으로, 입력 이미지를 패치로 분할해 트랜스포머의 인코더에 입력하고 어텐션을 사용해 입력 이미지의 다른 위치 간 상호의존성과 이미지의 글로벌 특징을 캡처할 수 있다고 한다.
또한, 최근 텍스트를 넣으면 이미지를 생성하는 모델로 주목받는 Dalle2나 Stable Diffusion에도 트랜스포머가 사용된다. 이들 모델들은 기본적으로 이미지에 노이즈를 가해 이를 복원하는 과정에서 이미지 생성을 위한 최적의 가중치를 학습하는데, 이 때 무작정 이미지를 복원하는 게 아니라 주어진 텍스트 정보를 조건으로 해당 이미지를 복원하기 위한 방향으로 찾아가는 것이다. 여기서 트랜스포머는 텍스트 간 정보를 이해하는 것은 물론 텍스트와 이미지 표현 간 상호작용을 모델링하는 데 사용된다.
그렇다면 트랜스포머의 구조와 원리에 대해 조금 더 자세히 이해해 보도록 하자. 앞서 잠깐 이야기했지만 트랜스포머는 입력문장을 이해하는 인코더와 타깃문장을 생성하는 디코더에 모두 어텐션을 사용한다.
트랜스포머의 어텐션에는 3가지 종류가 있다. 먼저 인코더가 입력 문장을 이해하기 위한 인코더 내 셀프 어텐션이 있고, 디코더가 자신이 생성하고 있는 문장을 잘 이해하기 위한 디코너 내 셀프 어텐션이 있다. 이는 디코더가 문장의 단어를 하나씩 생성하는 과정에서 현재 타임스텝 이후 정답 토큰을 보지 못하도록 마스크 처리한다고 해서 마스크드 어텐션이라고도 불린다. 그리고 원래 어텐션이 만들어진 목적으로 디코더가 문장을 생성하는 과정에서 부족한 정보를 인코더에서 참조하기 위한 인코더-디코더 간 어텐션이 있다.
단어가 인코더에 입력되는 부분부터 차례로 살펴보면 입력 문장을 토큰화해 사전을 만들고 토큰을 정수에 매핑시켜 임베딩 층에 통과시키면 학습을 위한 임베딩 값이 만들어 진다. 트랜스포머는 단어를 표현하는 임베딩 벡터와 모델 내 입출력 값이 모두 같은 512 차원이다.
첫 번째 인코딩 층에서는 입력된 문장의 토큰들끼리 유사도를 계산해 이를 반영한 문맥 표현을 생성하는데 512 차원을 가진 각 토큰들끼리 유사도를 한 번에 계산하는 것이 아니라 이를 n개 head로 나눠서 학습한다고해서 멀티헤드 어텐션(Multi-head Attention)이라 불린다.
논문에서는 head=8을 사용했는데, 가령 '나는, 학교, 에, 간다'라는 문장의 토큰들끼리 유사도를 계산한다고 하면 (4, 512).T x (4, 512) 크기의 행렬곱 연산이 이뤄지겠지만 임베딩 벡터에 곱해지는 가중치 벡터 사이즈를 512차원 나누기 8인 64차원으로 변경해 (4, 64).T x (4, 64) 크기의 행렬 연산이 동시에 8번 병렬적으로 이뤄지도록 처리한 것이다.
앞서 임베딩 레이어에서도 보았지만 트랜스포머는 입력값과 모델이 학습해야 할 가중치 간의 행렬곱(matrix multiplication)으로 연산이 이뤄지는 데 배치 단위로 행렬 연산을 처리하는 것은 물론 이렇게 어텐션 연산을 병렬적으로 처리하는 멀티헤드 어텐션 장치를 통해 연산을 효율적으로 수행하도록 했다.
다음 인코더 블록은 이전 인코더 블록에서 받은 출력값을 가지고 다시 셀프 어텐션 학습을 하는데 각 인코더 블록은 서로 다른 파라미터를 가지고 있어 층이 쌓일수록 모델의 표현력이 향상되는 구조이다.
디코더는 마지막 인코더 블록을 통과한 값을 가지고 마스크가 쓰여진 출력 문장의 토큰들과 인코더 디코더 간 어텐션을 수행하게 된다. 디코더에서 이뤄지는 셀프 어텐션과 인코더 디코더 어텐션 역시 모두 어텐션을 병렬 처리한 멀티헤드 어텐션이다.
요약해 보자면 트랜스포머는 어텐션을 통해 문장 길이에 대한 제약을 극복, 입력 문장과 생성 문장에 대한 이해를 넓혔다. 그리고 모든 연산 과정에서 입력값과 가중치간 어마어마한 행렬 연산이 이뤄지는 데 이것을 모두 병렬적으로 처리함으로써 효율적인 연산이 가능하게 되었다. 이로 인해 대규모 데이터셋을 사전에 학습해 뛰어난 성능을 보이는 GPT (Generative Pre-trained Transformer)와 같은 대규모 언어모델의 기반이 되었다고 할 수 있다.