페이지

2022년 9월 28일 수요일

트랜스포머는 어떻게 동작할까? – 1편


 이번 호에서는  지난 10 년간 머신러닝 분야에서의 가장 큰 진보 중 하나로 꼽을 수 있는, 그 중에서도 특히 자연어처리 분야로부터 시작되어 비전을 포함하여 다른 분야에까지 커다란 파장을 미친  트랜스포머(Transformers)에 대해 다룰까 한다.  2017년 “Attention is all you need”라는 논문이 구글 브레인에서 발표되면서 소개된 Transformers 모델은 다수의 자연어처리 성능 최고 기록을 갈아치우며 당대의 SOTA(State of the Art)로 당당히 이름을 올렸다. 전통적으로 순차적 문제들을 해결해왔던 RNN, GRU, LSTM 등을 훨씬 뛰어넘어 독자들도 한번쯤 들어봤을BERT, GPT-3 같은 거대 언어모델의 근간이 된 기술. 트랜스포머는 현재 머신 러닝 분야에서 맹위를 떨치고 있는 기술임에는 틀림없다. 트랜스포머는 어떻게 동작할까?


전통적 sequence 모델의 한계

  그간 자연어처리에서 사용된 순차적모델 중 하나인 Recurrent Neural Network(RNN) 기반 인코더와 디코더로 구성된 기계번역의 예를 보자. 아래 그림 1의 ①과 같이 RNN 특성 상, Encorder 의 이전 시퀀스들을 context-vector 의 한 개 벡터에 담으려다 보니 이전 시퀀스들이 늘어나면, 입력 시퀀스의 정보가 일부 소실된다. 따라서 Encoder 의 시퀀스가 늘어날수록 여러 시간 스텝이 떨어진 gradient 가 전달되지 못하는 경사소멸(gradient vanishing)을 겪게 되어 멀리 떨어져 있는 이전 단어들을 참조할 수 없게 된다.

<그림 1. RNN 의 한계>

Self Attention

 트랜스포머를 이해하려면 논문 제목처럼 우선 attention mechanism 을 이해해야 한다. attention 은 인간 두뇌가 문장을 이해하는 방식을 차용한 것이다. 아래 그림 2와 같은 문장이 있다고 하자. 인간의 방식은 주목(attention)해야 할 첫번째  bank(붉은색) 를 account 와 함께 주목하고, 두번째 bank(파란색)는 옆의 river 와 함께 주목하여 문장을 이해한다. RNN 처럼 모든 문장을 처음부터 하나하나 분석하지 않는다. 이것이 어텐션 매카니즘이라고 할 수 있다. 

<그림 2. 문장 이해에서의 어텐션 메카니즘>

  특히 위 그림 2와 같이, transformers 가 문장내의 하나의 단어를 다른 단어들 간에 관계를 가지고 attention 점수를 산출하여 주목 할 단어를 이해하는 방법을 self-attention 이라고 한다.  아래 그림 3과 같이 “the train left the station on time” 이라는 입력 시퀀스가 있다고 할 때, ① 과 같이 토큰 벡터로 나누고 ②임베딩과 벡터간 연산을 통해 어텐션 점수가 있는 행렬을 얻게 된다. ‘station’ 경우에는 ③ 과 같은 벡터를 가지고 ④ 와 같이 토큰 벡터와 연산을 통해 가중치가 부여된 토큰 벡터가 되고, 이 벡터들이 모두 더해져서 ⑤ context-aware vector 가 된다. 이 점이 RNN 의 제한된 context vector 와 의 큰 차이이며 이 개념은 트랜스포머를 이해하는데 주요 요소가 된다. 지금 이해가 되지 않더라도 multi-head self-attention부분에서 내부 동작에 대해 보다 자세히 다룰 예정이다.




<그림 3. Self-attention 개념>

Transformers 모델 구조

 논문에서 선보인 Transformers 모델 구조는 아래 그림 4와 같다. 구조는 attention 에 기반한 인코더-디코더 형태의 구조다. 이 모델의 핵심은, multi-head self-attention을 이용해 RNN 과 같은 순차적 연산을 줄여 더 많은 부분을 병렬처리가 가능하게 만들면서 동시에 더 많은 단어들 간 의존도(dependency)를 모델링 한다는 것이다. 즉 문장이 RNN 과 달리 한꺼번에 입력되고 문장내의 단어들 간의 관계에서 attention  이 결정된다. 핵심인 multi-head self-attention 을 좀 더 자세히 살펴보기 위하여 왼쪽의 Encoder 부분에 집중해서 주로 ① inputs, ② input embedding, ③positional embedding, ④multi-head self-attention 에 초점을 두고 살펴보자.


<그림 4. Transformers 모델 구조>

Inputs

 위 모델과 같은 인코더-디코더 모델은 transformers 를 사용한GPT-3 와 같이 사람이 질문을 Encoder 에 입력하면, Decoder 가 응답하는 문장을 만들어내는 경우와 같이 사용된다고 생각하자. 이 경우 Encoder 는 입력되는 문장의 문맥을 이해하는 역할을 하며 Decoder 는 이러한 훈련을 통해 이해한 문맥의 법칙을 기반으로 문장을 생성한다고 각각의 역할을 생각하면 될 것 같다. 이전 뉴스레터 16호 에 Bert(Bidirectional Encoder Representation from Transformers) 언어모델에 대해 다루었는데, Bert 는 구글이 2020년 공개한 AI 언어모델로 Transformers 의 Encoder 부분만을 사용하여 한글 질의응답, 요약, 감성분석등의 여러 NLP 작업에서 이전 성능을 압도적으로 능가한 모델이다. 학습 방법이 첫째, 두개의 문장을 문장 순서대로 학습하여 두번째 이어서 오는 문장이 순서에 맞는 문장인지를 학습하고, 둘째 양방향으로 학습하여 가려진(mask 된)단어를 맞추는 방식으로 학습한다. 
 자 그럼 아래 그림 5와 같이 ①과 같은 문장이 입력된다고 가정해보자. ②의 vocabulary 는 어휘집으로 자주 등장하는 단어는 메모리에 가져다 놓고 사용하게 된다. Vocabulary indices 란 결국 ① 과 같은 문장을 전체 단어가 저장된 인덱스에 해당하는 코드로 변환한 것이다. 이것이 inputs으로 transformers 에 입력된다.


<그림 5. inputs 의 코드 변환>

Input Embedding

 그 다음 이전 그림 4의 ②에 표시된 Input Embedding layer를 통과하게 된다. 아래 그림 6의 ①과 같이 해당 단어의 vocabulary index에 해당하는 벡터가 첨가된다. 초기에는 임의의 숫자로 초기화되나 훈련이 진행될 수록 특성을 구별할 수 있는 값으로 변화한다.  아래 그림 ②에서는 임베딩 크기를 5로 예시를 들었으나 논문에서는 512를 사용했다. 

<그림 6. input embedding>

 play 라는 단어에 해당하는 임베딩은 무엇일까? 그림 6의 ①과 같이 5개 차원을 가진 벡터 묘사(representation)다. 훈련이 진행되면서 각 차원은 언어적 특성을 획득하게 되는데 각 차원이 내포하는 특성이 play 라는 단어의 특성을 묘사한다. 아래 그림 7과같이 play, game, orange 라는 3개의 임베딩 벡터를 5차원상의 공간에 위치시켜본다면 훈련이 진행될 수록 play와 game 은 언어학적 특성이 비슷해서 점차 가까운 거리에 모이고 orange는 관련성이 적어서 멀리 떨어지게 된다. 일반적으로 두 벡터 간의 유사도는 코사인 각도로 산출한다. 두 벡터의 방향이 완전히 동일한 경우는 1 이며 반대의 방향을 가지면 -1의 값을 갖는다. 즉, 값이 1에 가까울수록 유사도가 높다고 판단할 수 있다.


<그림 7.  5차원 공간 상의 임베딩 벡터>

Positional Embedding

 임베딩 벡터들은 이제 그림 4의 ③ 의 positional embedding 층을 거친다. 아래 그림 8의 ①은 임베딩 벡터 에 추가될 positional embedding 이다. 이전 그림 6의 input embedding 을 각각 e0, e1, e2, e3, e4, e5, e6, e7 이라고 하면 이전의 RNN 과 같은 순차적 구조에서는 하나씩 순서대로 입력되어 각각의 위치가 명확하였다. 반면 트랜스포머에서는 이 7개의 e0 ~ e7 임베딩이 한꺼번에 병렬로 입력된다. 이것이 장점이기도 하지만 각 임베딩의 위치가 파악되지 않는다. 이를 위하여 논문 에서는 아래 그림 8과 같은 방식의 positional embedding 을 부과하는 방법을 사용한다. 아래 그림 ①이 position=0 벡터라고 할 때, 위치가 홀수 일 경우에는 ②의 sine wave 를, 짝수 일 경우에는 ⑤ 의 cosine wave 값을 사용한다. ③ 의 하늘색 wave 는 i=4 일 경우의 sine wave 이다. 이 wave 를 이용하여 p0 부터 p5 를 순서대로 구별할 수 있지만 문제는 p0와 p6 가 같은 값을 가진다. 이때 다행히도 i=0 일 경우에 ④ 와 같이 p0와 p6 가 다른 값을 갖는다. 이렇게 wave 를 사용하는 이유는 임베딩의 갯수가 늘어나도 일정하게 위치를 보장하는 방법으로 논문에서 사용하고 있다.


<그림 8. Positional Embedding>

Multi-head self-attention

 이제 그림 4의 ④ multi-head self-attention 층에 대해 설명할 차례다.  그 전에 먼저 일반적인 attention 과 self-attention 의 차이를 짚고 넘어가자. 처음 소개된 attention 개념은 외부 질의에 따라 중요한 단어는 질의에 따른 답의 관계에서 선택적으로 집중할 단어가 결정되는 반면, self-attention 은 이와는 다르게 같은 문장 안에서 단어와 단어들 사이의 관계에서 집중할 단어가 결정되는 점이 다르다고 볼 수 있다. 우선 먼저 그림 4의 ④ multi-head self-attention 층을 확대해 보면 아래 그림 9와 같다. 
 첫번째 층은 아래 그림 9의 ①과 같이3개의 Linear 층으로 구성되었다. 이 Linear 층의 내부는 활성화(activation)함수가 없는 다수의 완전연결(fully connected, FC)층으로 이루어져 있다.  앞에서 살펴본 positional embedding 이 통과할Linear 층의 역할은 2가지이다. 첫째, 입력을 출력과 매핑하고, 둘째, 행렬/벡터의 차원을 변화하는 역할이다.


<그림 9. Multi-head self_attention 층의 구조>

 지금까지 전통적 sequence 모델의 한계, self-attention, Transformers 모델 구조 중 inputs, input embedding, positional embedding 을 살펴보고 multi-head self_attention 층 중에 Linear 층에 대해 다루어 보았다. 
2편에서는 Linear Layer 에 대하여 좀 더 살펴보고 Query, Key, Value 개념과 self_attention 층을 거치는 연산을 통하여 attention filter를 획득하는 방법과 multi-head self-attention 층의 출력을 얻는 방법을 살펴본다

댓글 없음:

댓글 쓰기