페이지

2022년 9월 28일 수요일

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

 1편에 이어서 2편에서는 Linear layer, Query, Key, Value 개념 그리고 multi-head self-attention 동작에 대해 살펴보고자 한다.

Linear Layer

 아래 그림 10의 ① 의 단일 위치를 인식하는 word embedding 이 Linear 층에 입력되기위해서는 transpose(전치행렬)하여 ② 와 같은 형식으로 입력된다. 5차원의 벡터 입력이 ③의 3개 노드와 연결된 완전연결층을 통과한다.  5개의 임베딩 벡터 입력을 3개 노드로 통과시켜 ④의 3개의 임베딩 벡터로 축소시켜 연산 비용을 절감하는 효과를 갖는다. ③의  3개 노드는 5개 입력 벡터와 각각의 weight 값들을 사용하여 연결 되어있다. 이  weight 들은 scaler 숫자들로 ⑤는 이 값들을 행렬로 표시한 것이다. 이 값들은 모델이 back propagation 을 통하여 최적화하면서 결정된다. 이 weight 값들은 모델에 ⑤와 같은 행렬로 주입된다.


<그림 10. Linear Layer>

  지금까지 Linear 층이 하는 일을 살펴보았다. 그런데 이전 1편의 그림 9의 ①을 보면 Linear layer 가 3개가 있다. 왜 일까?  각 Linear 층은 특별한 기능을 담당한다. 이 3개의 Linear 를 각각 Query, Key, Value Linear 층이라고 부른다.

Query, Key, Value 

 query, key, value 이 3가지 기능들은 전통적 자연어처리의 순차적 네트워크와 다르게transformers 가 attention 만을 가지고 자연어처리를 어떻게 하는가를 이해하는, 즉 self-attention 에 대한 중요한 부분이어서 비유적으로 좀 더 자세히 살펴보도록 하겠다. 
먼저 아래 그림 11과 같이 유튜브를 통해 기아 신차 ‘EV7’ 을 검색한다고 가정해보자. 검색창에 EV7 이라고 입력하는 것이 ①Query(Q) 라고 한다면, 이 질의에 해당하는 리스트로 나타난 붉은색 사각형이 Key인데 이 중 첫번째가 가장 유사한 것이니까 ②Key(K1), 이 Key1 에 해당하는 value 즉 동영상 콘텐츠는 ③Value(V1) 이라고 할 수 있다.


<그림 11. Query, Key, Value>

코사인 유사도(Cosine Similarity)

  위의 Query, 와 Key 는 질의 문장(‘EV7’)의 임베딩 벡터와 유사한 벡터를 유튜브 내부문장에서 검색하는데 이때 벡터 간의 유사도를 측정하는 것이 코사인 유사도이다. 아래 그림 12의 ①이 코사인 유사도 식이다. 코사인법칙은 고등학교 2학년 수학시간에 배운다. 이를 파이선 함수로 표현한 부분이 ④로 분자는 A, B 간의 벡터 곱이고 ⑤의 분모는 np.linalg.norm 즉 행렬 norm 들의 곱이다. 이것을 위의 그림 11의 Q(질의) 와 K(키) 간의 유사도 측정이라고 생각해본다면, 분자는 ②와 같이 Q 와 K 의 행렬 곱이 되고, 분모는 ③과 같이 크기의 정도로 대치될 수 있다. 이 식이 이후 설명할 3개의 Linear 와 self-attention 관계에 사용되니 잘 기억해두자.


<그림 12. 코사인 유사도>

self-attention

자 그럼 위에 살펴본 코사인 유사도는 attention 과 어떠한 연관이 있을까? 아래 그림 을 보면 Query, Key, Value 가 모두 다른 내용인데 왜 같은 Linear 층을 3개나 가지고 있을까?  
 아래 그림 13의 ①에 when you play the game of throne 이라는 문장이 positional embedding 벡터의 형태로 ②의 3개의 Linear 층에 각각 입력된다.


<그림 13. Linear 층>

이때 그림 14와 같이 transpose(행렬전치)된 ①의 위치 임베딩 벡터가 앞의 그림 10의



< 그림 14. Query, Key, Value 행렬 생성>

Linear 층의 ② 5 X 3 행렬과 행렬 곱의 연산이 일어나고 그 결과 ③과 같이 각각 7 X 3의 Query, Key, Value 행렬이 만들어진다. 

Query 와 Key Linear 행렬의 MatMul

이제 아래 그림 15의 ①의 Multi-head self-attention 층 내부의 MatMul(Matrix Multiplication)층을 통과하는 단계로 왔다. 이전 그림 11의 유튜브 비디오 검색 예에서 Query 와 Key 가 ‘EV7’ 과 유사한 비디오 컨텐츠를 검색하는 것에 착안하면서, 우선 Query 와 Key 에만 집중해보자.
Query 와 Key 행렬이 행렬 곱(MatMul)이 실행되기위해  ②의 7 X 3 Query 행렬이 ③의 Key 행렬의 Transpose 와 행렬 곱을 수행한다. 그 결과, ④의 7 X 7 크기의 Attention Filter 를 얻는다. 즉 아래 그림 왼쪽의 ①번 즉, Query 와 Key 의 MatMul  이 수행된 것이다.


<그림 15. Attention Filter 생성>

Scaled Attention Filter

  위 그림 15 ①의 MatMul 수행 결과로 탄생한 Attention Filter 는 아주 중요한 출력으로 좀 더 자세히 살펴보자. 아래 그림 16의 ①은 Q와 K 행렬 곱의 출력 attention filter 다. 이 7 X 7 행렬의 값들은 초기에는 임의의 수로 채워지지만, 이전 그림 10의 ⑤와 같은 Linear 층의 weight 값들이 훈련을 통해 변경되어 문맥을 이해하는데 최적화되도록 훈련이 끝나고 나면 아래 그림 16과 같이 단어 간의 attention score 를 표시하게 된다.  ②에서 가장 attention 점수가 높을 관계는 당연하게도 자기 자신들끼리 의 관계로 game 열과 game 행이 98로 가장 높다. 다음으론 ③의 play 열과 game 행인 90 이다. game 열과 play 행도 마찬가지로 90 으로 이 두 단어의 유사도는 가장 높다고 할 수 있다. 이렇게 단어들 간의 유사도를 유추하는  Filter 다.
 이제 ④의 Scale 층의 연산을 통과하게 된다. 


<그림 16. Scale 로 나눈 Attention Filter>

Q 와 K 간 유사도를 측정하는 것은, 결국 아래 그림 17과 같은 연산을 수행한 것이다. ③의 scaling 을 Key 행렬 차원의 크기의 제곱근 즉 우리의 경우는 attention filter 가 7 X 7 행렬 차원이므로,  으로 나눈 값이 된다. 


< 그림 17. Q 와 K 간 유사도 함수>

  논문에서는 아래 그림 18의 ①과 같은 layer 들의 구조를 Scaled Dot-Product Attention 이라는 이름으로 설명하고 있다. 즉, 이 부분을 식으로 표현한다면 ②와 같은 Q, K, V 행렬을 통한 attention 함수로써, 빨간색 박스 안의 수식으로 표시할 수 있다. 이 중에 ③의 파란색 네모안에 부분이 지금 Scale layer 를 통과한 시점까지의 연산을 표시한다. 코사인 유사도함수의 분모인 scaling 부분을  로 나누고 있는데 이 부분을 논문은 이렇게 설명하고 있다. 만약 dk 즉 Key 의 차원이 커지면 분자 즉, Q * K T 의 크기가 커지고, 여기에 softmax 함수가 적용되면 각 차원의 값이 매우 작은 경사도(gradient) 영역으로 이루어진 값을 갖게 한다. 이를 방지하기위해  로 나눈다.


<그림 18. Scaled Dot-Product Attention 구조>

결국 위 그림 18의 ③의 파란색 박스는 앞의 유튜브 검색에서 보았던 Query 와 Key 행렬 간에 유사도를 산출하는 식이다. 여기에 softmax layer 를 통과하면 아래 그림 19와 같이 0과 1사이의 값으로 변환된 Attention Filter 가 출력된다.


<그림 19. Softmax 함수 적용 후의 attention filter>

  아래 그림 20을 보면, Scaled Dot-Product Attention 의 마지막 단계로 ①과 같이 Attention Filter 와 처음 그대로의 Original Value 행렬의 MatMul(행렬 곱)이 수행되어 최종적으로 Filtered Value 를 출력한다. 이는 위 그림 18의 ②의 Q, K, V 행렬 간의 attention 산출의 최종 출력이다. 다시 앞의 유튜브 검색에서의 Q, K, V 를 예로 들어 설명하면, Key1에 해당하는 동영상 컨텐츠Value1, 즉 문장 안에 주목해야할 단어만을 걸러낼 필터 값을 가진 것이다. 여기 까지가 Scaled Dot-Product Attention 이고 아직 하나가 더 있다.


<그림 20. 최종 filtered value 산출>

Multi-Head Attention

 아래 그림 21의 ①과 같이 Scaled Dot-Product Attention 을 여러 개 덧붙임으로써(multi-head) 각각 다른 위치의 부분공간들의 묘사(representation)들을 연합하여 정보를 취득하게 하는 것이 단일 Scaled Dot-Product Attention 배치보다 유효하였다고 설명하고 있다. 이렇게 아래 ①을 여러 개 Concatenate(결합)하여 Linear 층을 통과시켜 Multi-Head Self-Attention 이 완성된다.


<그림 21. Multi-Head Attention>

결언

1편에 이어 Transformers 를 이해하는데 중요한 Linear layer, Query, Key, Value 개념 그리고 multi-head self-attention 동작에 대해 살펴보았다. 

트랜스포머는 어떻게 동작할까? – 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 층의 출력을 얻는 방법을 살펴본다