전반적인 Transformer에 대해서 이야기 하겠다.
불어가 입력으로 주어지면 번역하여 영어로 출력하는 모델을 만들려고 한다.즉, 입력 문장이 주어지면 출력 문장으로 생성. sequence to sequence모델이라고 한다.
여기서 몇 가지를 알 수 있다.
- 입력 sequence와 출력 sequence의 숫자가 다를 수 있다(입력은 3개, 출력은 4개)
- 입력의 도메인과 출력의 도메인도 다를 수 있다는 것(입력은 불어, 출력은 영어)
동일한 구조를 갖지만 네트워크 파라미터가 다르게 학습되는 encoder와 decoder가 쌓여져 있다.
여기서 이해해야 할 3가지가 있다.
- encoder에서 N개의 단어가 어떻게 한번에 처리하는지
- encoder와 decoder에서는 어떤 정보를 주고받는지
- decoder가 어떻게 generataion할 수 있는지
encoder에는 N개의 단어가 들어간다. encoder 한 단은 Self-Attention → Feed Forward Neural Network를 거쳐서 다음 encoder에 값을 전달하는 구조이다. Self-Attention은 encoder와 decoder모두에 존재한다. 여기서 중요한건 Self-Attention이다. Feed Forward Neural Network는 MLP와 동일한 구조이다.
✅ 이 부분을 좀더 자세히 살펴보자
우리는 먼저 3개의 단어가 들어온다고 가정하자. 이때 각각의 단어는 embedding vector로 나타낸 각각의 단어들이다.
3개의 단어(X)가 주어지면 3개의 벡터(Z)를 찾아 준다. $X_{1}$이 $Z_{1}$으로 넘어 갈때 단순히 $X_{1}$의 정보만 활용하는 것이 아니라 $X_{2}$와 $X_{3}$의 정보도 같이 활용한다. 바꿔 말하면 N개의 단어가 주어지고 N개의 Z벡터를 찾는데 각각의 $X_{i}$벡터를 $Z_{i}$로 바꿀때 나머지 N-1개의 X벡터를 같이 고려하는게 Self-Attention의 가장 큰 특징이다.
📌 문제를 조금 더 단순하게 보기 위해서 2개의 단어만 주어졌다고 가정해 보자
Self-Attention 관점에서 자세히 보게 되면
"The animal didn't cross the street because it was too tired."라는 문장이 있다고 생각해 보자. 그럼 여기서 "it"은 무엇을 가르키는가? 이걸 알려면 다른 단어와 상호 작용을 봐야한다.
"it"이라는 단어를 우리가 encoding을 할때, 다른 단어들과의 관계성을 보게 되고 특별히 학습된 결과를 보게 되면 'it'이 'animal'과 굉장히 높은 관계가 있다고 알아서 학습이 된다. 이런식으로 학습이 되었기 때문에 더 잘 단어를 표현할 수 있고 기계가 문장 구조 속에서 더 잘 이해할 수 있다.
Self-Attention구조는 기본적으로 3가지 벡터를 만들게 된다. 이건 3개의 NN이 있다고 보면 된고 그 3개의 벡터는 Query, Key, Value이다. 각 단어마다 3개의 벡터를 만드는 것이다.
처음 embedding 벡터 $X_{1}$을 바꿔줄 것이다.
가장 먼저 Score벡터를 구하게 된다. Score벡터를 구하는 과정을 보게 되면
- 먼저 해당 벡터의 Query 벡터 $q_{i}$를 사용한다.
- 다른 단어들의 Key벡터를 내적하여 Score 벡터를 계산한다. 이 과정은 i번째 단어와 나머지 단어들 사이에 얼마나 상호작용을 해야하는지를 알아서 학습하게 하는 것이다. 이게 Attention이다.
이렇게 해서 우리는 Score값을 구할 수 있다.
그 다음으로
이렇게 Score가 나온값을 Normalize를 해준다. 이때의 방법은 여기서는 8로 나눠주게 되는데 이 값은 $d_{k}$(키 벡터)의 dimension에 의존적이다. 다시 말해 key 벡터를 몇 차원인지는 우리의 hyper parameter이다. 여기 같은 경우는 64개의 벡터를 만들었고 64의 제곱근을 구해서 나눠주게 된다. 이 값을 이용해서 Softmax를 취해 준다. 이 값은 Attention weights가 된다.
마지막으로 softmax값과 value값의 곱의 합이 출력 값 $Z_{i}$가 되게 된다.
✅여기서 주의할 점
- Query벡터와 Key벡터는 항상 차원이 같아야 한다. 둘이 내적을 해야하기 때문에
- 하지만 Value벡터의 차원은 달라도 된다.
- 최종적으로 나오는 Z벡터의 차원은 V벡터의 차원과 동일하게 된다.
위 계산과정을 그림으로 보자
각각의 Q,K,V는 X벡터에 $W^{Q}$,$W^{K}$,$W^{V}$ 행렬곱을 통해서 한번에 구할 수 있다.
그리고 위 그림 하나로 바로 Z벡터가 나오는 것을 볼 수 있다.
Multi-headed attention(MHA)¶
Multi-headed attention은 Attention을 N번 하게 된다. Query, Key, Value를 하나가 아니라 여러게 만들게 된다.
N번 Attention을 반복하게 되면 N개의 encoding된 벡터가 나오게 된다. 위 그림은 8개의 HEAD를 사용한 그림이다.
다음 layer에 들어갈 차원을 맞춰 주기 위해서 linear map을 통해서 8개의 Z벡터를 붙이고 여기에 W벡터를 곱해서 차원을 줄여준다.
이를 요약하 그림이 아래와 같다
그리고 아래 그림과 같이 입력의 embedding벡터에 추가로 positional encoding벡터를 더해준다.
🤔 왜 이렇게 할까?
우리는 N개의 단어를 sequential하게 넣었지만 사실은 이 안에 sequntial한 정보가 포함 되어 있지 않다. 그래서 이 정보를 추가해 주는 작업이다.
위 예시는 4차원 encoding의 경우이다.
그래서 전체적인 과정을 순서대로 보게 되면,
이렇게 encoder을 여러개 쌓을 수 있다. encoder에서 decoder로 어떤 정보가 주어질까?
Transformer는 encoder의 key(K)와 value(V)를 decoder로 보낸다. 이 값을 통해서 결과 값이 출력되기 때문에
결과는 다음 그림과 같이 나온다.
출력 시퀀스는 자기 회귀 방식으로 생성된다.
학습 할때는 입력과 출력의 정답을 알고 있기 때문에 내가 i번째 단어를 만드는데 이미 모든 문장을 알고 있으면 사실은 학습하는 의미가 없기 때문에 학습단계에서는 마스킹을 하게 된다. 마스킹은 이전 단어들만 dependent하고 뒤에 있는 단어들에 대해서는 dependent하지 않게 만드는 방법이다. softmax step이전에 위치한다.
Encoder-Decoder Attention은 그 아래 layer에서 Queries matix를 생성하는걸 제외하고는 multi-headed self attention이랑 같은 작업을 한다. encoder에서 부터 Key와 Value값을 가지고 온다.
마지막으로
마지막 층에서는 단어의 분포로 부터 decoder 결과를 출력해낸다.
'AI > 이론' 카테고리의 다른 글
RNN and Language modeling (0) | 2021.02.16 |
---|---|
Bag of Words (0) | 2021.02.15 |
Word Embedding (0) | 2021.02.15 |
Generative Model (0) | 2021.02.05 |
RNN - Sequential Models (0) | 2021.02.04 |
RNN 맛보기 (0) | 2021.02.04 |
Computer Vision Applications (0) | 2021.02.03 |
CNN - 1x1 Convolution (0) | 2021.02.03 |