Transformer(Bert/GPT) - Self-Attention, Multi-head Attention 이해
Transformer 모델이란?
번역 모델 연구를 통해 나온 모델 (Seq2Seg 기반 모델 )
문장 속 단어와 같은 순차 데이터 내의 관계를 학습을 통해 파악해 순차 정보의 맥락과 의미를 학습하는 신경망 모델이라고 할 수 있다.
Attention을 가장 중요하게 보는 단어간의 관계를 학습하는 모델로써, Seq2Seq과 유사한 모델이라고 하였는데, Seq2Seq는 번역을 할때 가장 많이 지정되는 상대 언어의 단어와 점수 차이라고 한다면, Transformer는 Self-Attention은 같은 언어에서의 관계를 다루게 된다는 점이 매우 유사한 점이라고 할 수 있다.

위 내용을 구조를 보면, Multi-Head Attention 이라는 내용이 나오는데 이는 Self-Attention은 병렬로 진행하여 Head를 구성한 내용으로 Self-Attention을 이해하면 조금은 쉽게 이해가 가능하다.
Self-Attention 이란
어텐션(Attention) 또는 셀프 어텐션 (Self-Attention) 이라 불리는 방식을 활용하여 서로 떨어져 있는 데이터 요소들의 의미가 관계에 따라 미묘하게 달라지는 부분을 감지함, 즉 단어간 강하게 연결되는 단어를 강조하여 연결 관계를 형성하도록 만든게 Transformer 이다.

여기서 "self"란, 입력된 문장 내에서 단어들끼리 상호작용을 하는 것을 의미한다.
예를 들어 "I love to play game"라는 문장이 있다고 가정해보자.
이 문장에서 "love"라는 단어는 "I"와 "play"와 관련이 있을 수 있고, 이를 Transformer의 self-attention은 이런 관련성을 찾아내는 방법이다.
문장을 처리하는 과정을 요약해 보면 다음과 같다.
1. 임베딩(Embedding):
모델의 입력으로 들어온 단어들은 고정된 크기의 벡터로 변환한다.
예를 들어, "I", "love", "to", "play", "game"라는 단어들이 각각 벡터로 바꾼다.
2. Self-Attention 계산:
이제 모델은 각 단어 벡터를 사용하여 self-attention을 계산한다.
이 때, 각 단어 벡터는 Query, Key, Value라고 불리는 세 가지 다른 방법으로 선형 변환된다.
Query: 현재 단어 벡터에 대한 정보를 요청하는 역할
Key: 다른 단어 벡터들과의 관련성을 측정하는 역할
Value: 관련성을 기반으로 각 단어 벡터의 가중 평균을 구하는 역할
유사도 계산:
Query와 Key 벡터들 사이의 유사도를 계산하는데, 각 단어가 다른 단어들과 얼마나 관련되어 있는지를 나타내게 된다.
유사도는 일반적으로 내적(dot product)을 사용하여 계산된다.
소프트맥스 (Softmax):
Softmax는 유사도를 시그모이드 함수를 통해 0과 1 사이의 값으로 변환합니다. 소프트맥스 함수를 사용하여 유사도 값들을 정규화하여 각 단어의 중요도를 얻는다.
가중 평균 계산:
마지막으로, 소프트맥스 값을 사용하여 각 단어 벡터의 가중 평균을 계산한다. 이렇게 만들어진 가중 평균 벡터가 self-attention의 출력 결과가 된다.
예제을 통해 이해해보면 다음과 같다.
예제 문장: "I love play game."
"I"의 벡터 표현: [0.2, 0.5, -0.1, 0.8]
"love"의 벡터 표현: [-0.4, 0.9, 0.3, -0.6]
"play"의 벡터 표현: [0.7, 0.2, -0.5, 0.3]
"game"의 벡터 표현: [0.1, -0.3, 0.6, 0.4]
//임베딩 (Embedding)
각 단어의 벡터 표현은 모델의 입력
//Self-Attention 계산
이제 각 단어 벡터를 Query, Key, Value로 선형 변환
"I":
Query: [0.1, 0.2, 0.3, 0.4]
Key: [0.5, 0.6, 0.7, 0.8]
Value: [0.9, 1.0, 1.1, 1.2]
"love":
Query: [0.2, 0.3, 0.4, 0.5]
Key: [0.6, 0.7, 0.8, 0.9]
Value: [1.0, 1.1, 1.2, 1.3]
"play":
Query: [0.3, 0.4, 0.5, 0.6]
Key: [0.7, 0.8, 0.9, 1.0]
Value: [1.1, 1.2, 1.3, 1.4]
"game":
Query: [0.4, 0.5, 0.6, 0.7]
Key: [0.8, 0.9, 1.0, 1.1]
Value: [1.2, 1.3, 1.4, 1.5]
//유사도 계산
Query와 Key 벡터들 사이의 유사도를 내적으로 계산
"I"와 "I": 0.1 * 0.5 + 0.2 * 0.6 + 0.3 * 0.7 + 0.4 * 0.8 = 0.5
"I"와 "love": 0.1 * 0.6 + 0.2 * 0.7 + 0.3 * 0.8 + 0.4 * 0.9 = 0.53
"I"와 "play": 0.1 * 0.7 + 0.2 * 0.8 + 0.3 * 0.9 + 0.4 * 1.0 = 0.56
"I"와 "game": 0.1 * 0.8 + 0.2 * 0.9 + 0.3 * 1.0 + 0.4 * 1.1 = 0.59
(이하 생략)
//소프트맥스(Softmax)
유사도 값을 소프트맥스 함수를 사용하여 정규화
//가중 평균 계산은 소프트맥스 값들을 사용하여 각 단어 벡터의 가중 평균을 계산
가중 평균 계산 결과로 self-attention의 출력
아래 영문 자료를 보면 보다 이해하기 쉽게 묘사되어 있으므로 참고하면 좋을 것 같다.


간단히 말하면, self-attention은 문장의 단어들이 서로 얼마나 관련되어 있는지를 파악하는 방법으로, Q, K, V에 동일한 값을 넣은뒤 W(Weight) 값을 통해 최종값이 변화 한다 정도로 이해해도 괜찮다.
Multi-head attention은 무엇일까?
방금 본 Self-Attention은 한 번의 선형 변환으로 Query, Key, Value 벡터를 얻어 유사도를 계산하고 가중 평균 구한 단일 헤드(Single Head)인데, 이 단일 헤드를 여러 개 사용하는 것이 Multi-head attention 이다.
Multi-head attention은 입력된 단어의 정보를 여러 개의 서로 다른 선형 헤드로 유사도로 나누어 각 헤드가 서로 다른 부분에 집중하도록 구성한 것이다.
결론적으로
- Transformer 모델 구조는 Encoder-Decoder 구조의 Seq2Seq 모델과 유사함
- Decoder(출력): Mask를 통해 다음 단어를 볼 수 없도록 구성 하여 다음 단어를 생성하도록 함(GPT 모델로 발전됨)
- Encoder(입력): 입력된 단어의 관계를 봐야하기 때문에 Mask를 적용하지 않음 (BERT 모델로 발전됨)
- Position Embedding 을 이용하여 시퀀스의 순서를 유지할 수 있도록 함
- CNN(Convolutional Neural Network), RNN(Recurrent Neural Network) 보다 발전된 모델로써, 단어간의 관계를 보다 직관적으로 이해할 수 있도록 만들 구조
이렇게 기본적인 Transformer에 대해 이해해 보았다.
이제 Transformer 를 활용하여 개선된 Bert와 GPT로 발전하게 되는데, 이에 대해서도 차근차근 다음 글을 통해서 알아보도록 하겠다.
