📌 목차

1. Transfer Learning이란?
2. 기존 pre-train 방식

3. ELMo
4. BERT.  &.  Metric
5. GPT-2

😚 글을 마치며...

 

 

 


1. Transfer Learning

1.1 전이학습(Transfer Learning)
∙전이학습: 신경망의 일부or전체를 MLE를 통해 train하기 전, 다른 dataset이나 목적함수로 미리 훈련한 후, 본격적인 학습에서는 가중치를 더 쉽게 최적화하는 것이다.

이미 예전부터 Vision분야에서는 ImageNet같은 weight값을 다른 문제에 전이학습을 적용하는 접근방식이 흔하게 사용되었다.
하지만 NLP에서 여러 전이학습 방법들이 제시되면서 점차 주류로 잡아가고 있다.

더 넓은 범위의 목적(objective)을 갖는 Unsupervised Learning문제의 Global-minima는
더 작은 범위의 목적을 갖는 Supervised Learning의 Global-minima를 포함할 가능성이 높다.
따라서 비지도학습을 통해 local-minima를 찾으면,
지도학습에서 더 낮은 지점의 local-minima에 도달 할 가능성이 높다.

즉, random 초기값에서 시작하는 것은 dataset의 noise로 어려울 수 있지만
pretrained_weight에서 최적화를 시작하는 것은 앞선 문제를 다소 해결할 수 있고, 이는 좀 더 높은 성능을 기대할 수 있다.

 

 

 

 

 

 

 

 

 

 

 

 


2. 기존 Pre-train 방식

2.1 pretrain된 가중치로 사용.
word2vec의 등장 이후, 꾸준히 pretrained word embedding을 사용해 DNN개선을 하려 했지만, 이는 생각보다 큰 효과를 거둘 수 없었기에 pretrained word embedding를 활용한 방법을 transfer learning에 적용하는 방법을 먼저 알아보자.

아래 그림처럼 RNN을 사용한 간단한 text classification신경망을 가정해보자.
앞서 text classification관련 내용에서 다뤘듯이 신경망은 Softmax층과 RNN층들, embedding층으로 이뤄져있다.
One-Hot encoding vector들을 문장 내 단어 대신 입력 x로 넣고, 신경망 fθ를 통과시켜 클래스를 예측하는 분포 y_hat을 반환하도록 할 것이다.
이전에 다루었듯, One-Hot vector의 특징으로인해 1 위치의 값만 살아남을 것이다.
∴ embedding층의 가중치파라미터 W의 각 행(row) = 해당 단어의 embedding vector

 

신경망 가중치 초기값으로 사용
∙ 각 word embedding vector → pretrained word embedding vector로 치환해 사용할 수 있다.
이후 해당 embedding층의 가중치값과 기타 신경망의 random초기화 가중치값에 대해 BP와 최적화 등을 통해 학습을 수행한다.


 이때, 각 단어에 해당하는 word embedding vector는 위의 그림에서처럼 embedding층의 가중치의 해당 행(row)을 대체하여 초기값으로 설정할 수 있다.

신경망 가중치 초기값으로 고정
이 방법은 embedding층의 가중치는 최적화대상에서 제외된다.
embedding층을 제외한 신경망의 다른 가중치들만 학습하게 한다.

따라서 아래와 같이 optimizer를 설정할 수 있다.
# 기존
optimizer = optim.Adam(model.parameters())

# embedding층 제외 나머지 param 학습
optimizer = optim.Adam(model.softmax_layer.parameters() + model.rnn.parameters())


마찬가지로 0번 dataset을 통해 pretrained word embedding vector를 embedding층에 적용했으나, 이후 훈련에서 embedding층을 제외한 빨간점선안쪽부분의 신경망만 MLE를 통해 update가 된다.
신경망 가중치 초기값으로 사용 .&. Slow training
마지막으로 embedding층의 가중치를 최적화에서 제외하는 대신, 천천히 학습시키는 방법이다.
다만 이때, 또다른 Learning Rate가 hyper-parameter로 추가된다.
optimizer = optim.Adam(model.softmax_layer.parameters() + model.rnn.parameters())
optimizer_emb = optim.Adam(model.emb_layer.parameters(), lr=1e-6)


이전 방법들처럼 embedding층을 초기화했으나, 이번에는 2개의 다른 학습률을 사용, embedding층은 빨간 점선부분과 달리 천천히 update되게 한다.

 

 

2.2 pretrain된 word embedding vector를 사용하지 않는 이유
다만 이전에 말했듯, 이런 방식의 전이학습은 그다지 큰 효과를 거둘 수 없다.
[문맥반영못하는 기존 word embedding 알고리즘]
word2vec의 Skip-Gram이나 GloVe는 성공적으로 단어를 latent space에 embedding했지만, 이 알고리즘들은 문장에 함께 출현한 단어들(co-occurence words)을 예측하는데 기반한다. 따라서 embedding 정보(feature)가 매우 한정적이다.

우리가 실제수행하려는 문제해결을 위한 목적함수와 위의 알고리즘의 목적함수는 상당히 상이할 것이고, 우리에게 필요한 정보를 반영하기는 어려울 것이다.

추가적으로 기존 word embedding 알고리즘들의 결과는 context를 고려한 단어의 의미를 embedding하기엔 지나치게 단순한데, 같은 단어라 할지라도 문장의 문맥에 따라 그 의미가 확연히 달라진다.
또한, 문장 내 단어의 위치에 따라서 쓰임새 및 의미도 달라진다.
이런 정보들이 embedding층의 상위층에서 제대로 추출 및 반영되더라도 word embedding 시 고려되어 입력으로 주어지는 것에 비해 불리하다.
[신경망 입력층의 가중치에만 적용]
위의 적용방법의 설명에서 보았듯, 대부분의 기존 적용방법들은 embedding층에 국한된다.
embedding층의 가중치만 한정해 본다면 Global minima에 더 가까울지라도, 신경망 전체 가중치를 고려한다면 최적화에 유리할지는 알 수 없다.

따라서 "신경망 전체에 대해 사전훈련하는 방법"사용하는 편이 더 낫다.

 

2.3 NLP에서 pretrain의 효과
Vision에서 ImageNet을 이용해 pretrain하는 것처럼 NLP에서도 수많은 문장을 수집해 학습한 신경망으로 다른 문제에 성공적으로 적용하고 성능을 개선하는 방법이 마련되었다.

[NLP분야에서의 Transfer-Learning 분류]
NLP에서의 pretrain은 다른 분야의 pretrain보다 유리한 점을 몇가지 갖는다.
① 일반 문장들에 대해 단순 LM훈련하는 것만으로도 매우 큰 전이학습으로 인한 성능향상이 가능
② 특히, 수집에 비용이 들어가는 parallel corpus, labeled text와 달리 일반적 문장들의 수집은 매우 쉽고 값싸다.
즉, 기존 dataset수집에 비해 일반 corpus수집은 거의 비용이 들지 않기에 매우 큰 성과를 위험부담없이 얻을 수 있다.

 

 

 

 

 

 

 

 

 

 

 

 

 


3.  ELMo 

3.1 ELMo (Embedding from Language Model)
ELMo논문에서는 앞서 제기한 기존 pretrain훈련방식의 문제점을 해결하는 방법을 제시했다.

∙ 입력으로 주어진 문장을 단방향 LSTM(Uni-Directional LSTM)에 넣고, 정방향과 역방향 LM을 각각 훈련한다.
이때, LM은 AR(자기회귀)모델이다.(= 양방향 LSTM으로 훈련불가)
이때, LSTM은 여러 층으로 구성이 가능하며, 각 층이 주어진 문장 내의 token수만큼 정방향과 역방향에 대해 훈련된다.
각 time-step의 입력과 출력에 따른 내부 LSTM의 정방향 및 역방향 hidden_state

❗️embedding층과 softmax층은 정방향과 역방향에 대해 공유되며, 이전층의 각 방향별 출력값이 같은 방향의 다음 층으로 전달된다.

이때, 정방향과 역방향 LSTM은 따로 구성되지만 LSTM의 입력을 위한 embedding층과 출력을 받아 단어를 예측하는 softmax층의 경우, weight_parameter를 공유한다.

이를 통해 word_embedding_vector는 물론, LSTM의 층별 hidden_state를 time-step별로 얻을 수 있고
이들에 대한 가중합을 구해 해당 단어나 토큰에 대한 문장 내에서의 embedding representation인 ELMoktask를 구할 수 있다.
ELMoktask는 각 time-step별 L개의 LSTM_hidden state들을 가중치 sjtask에 따라 가중합을 구한다.
이때, j=0일 때, 단어의 embedding vector를 가리키며
j > 0일 때, 정방향과 역방향의 LSTM의 hidden_state인 hj,kLM ; hk,jLM가 연계되어 구성된다.
이 ELMoktask(= representation)들은 풀고자하는 문제에 따라 달라지기에 task라 표현한다.

이렇게 얻어진 ELMo표현은 실제 문제수행을 위한 신경망의 입력벡터에 연계되어 사용된다.
이때, ELMo표현을 위한 신경망가중치파라미터는 update되지 않는다.


ELMo는 이런 방법들로 전이학습을 수행함으로써 SQuAD(Stanford Question Answering Dataset)와 같은 고난도 종합독해(Reading Comprehension)문제에서 SRL(Semantic Role Labeling), NER(Named Entity Recognition)등의 NLP처리문제까지 큰 성능개선을 이룩했다.

 

 

 

 

 

 

 

 

 

 

 

 

 


4. BERT (Bidirectional Encoder Representations from Transformer)

ELMo에 이어 해당년도인 2018년 말에 출시된 BERT논문은 매우 뛰어나 현재도 많이 사용 및 응용이 가장 많이되는 모델이다.

 

BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

We introduce a new language representation model called BERT, which stands for Bidirectional Encoder Representations from Transformers. Unlike recent language representation models, BERT is designed to pre-train deep bidirectional representations from unla

arxiv.org

기존의 ELMo와 달리 BERT는 Fine-Tuning을 통해 접근한다. 자세히 설명해보자면,

∙ELMo: pretrained LM의 층별 hidden_state들을 가중합해 해당 time-step의 embedding vector로 사용

  - 즉, ELMo + task전용 신경망이 필요했었음

 

∙BERT: 훈련된 LM에 단순히 아주 약간의 층을 추가해 학습, 특정 task에 맞는 신경망을 생성

  - Fine-Tuning으로 task해결을 위한 또다른 신경망 구현등의 추가적 노력요소가 적음

  - 또한, MLM을 통해 기존의 AR속성으로 인한 단방향의 제약을 뛰어 넘어 양방향시퀀셜모델링을 성공적으로 이룩했다.

  - 마지막으로, 한개의 문장만을 모델링하는 대신, 2개의 문장을 동시에 학습하도록 하여 질의응답같은 2개이상의 문장이 주어지는 문제에도 성공적 예측을 가능케한다.

 

4.1 MLM (Masked Language Model)
LM또한 AR모델이기에 양방향 RNN으로 훈련할 수 없는게 일반적이었다.

하지만, BERT는 Masked LM기법으로 LM훈련을 단순히 다음 단어를 훈련하는 기존방식에서 벗어나 "입력으로 들어가는 단어 token 일부를 masking, 모델이 문맥을 통해 원래 단어를 예측해 빈칸을 채우는 형태의 문제로 바꿈"으로써 Bi-Directional Encoding을 적용할 수 있게 하였다.

[MASK] token을 임의의 단어와 치환(보통 masking시, 15% 단어만 masking.)한 후, 신경망이 기존 단어를 맞추게 학습하는데 이는 마치 Denoising Auto-Encoder와 비슷한 맥락으로 원리를 이해할 수 잇따.

다만 MLM은 학습수렴속도가 늦어지는 문제가 발생하지만, 훨씬 더 큰 성능의 개선을 이룩하기에 현재도 유용히 사용된다.

 

4.2 NSP (Next Sentence Prediction)
사실 질의응답과 같은 문제는 입력으로 여러개의 문장이 주어진다.
이 여러 문장사이의 관계가 매우 중요하기에 단순 LM으로는 문장간의 관계를 모델링하기 어렵다.
이때, BERT는 문장의 쌍을 입력으로 삼아 사전훈련을 수행하여 사후 fine-tuning단계에서 여러 문장이 입력으로 주어지는 문제에 효과적 대처가 가능하다.

NSP는 "2개의 문장을 주고 이 문장들이 이어진 문장인지 맞추도록 학습, 문장마다 문장끝에 [SEP]라는 token을 붙여 문장을 구분하는 방법"이다.


아래 그림과 같이 문장순서를 나타내는 정보를 추가로 embedding,
기존의 word embedding 및 position embedding의 합에 더해준다.

[CLS]라는 특별 token을 추가로 도입해 현재 분류작업이 진행중임을 알리고,
[SEP]라는 특별 token을 추가로 도입해 문장사이 경계를 신경망에 알려준다.

 corpus에서 실제 앞뒤 두 문장을 추출해 학습하기도하고
임의의 관계없는 두 문장을 추출해 학습하기도 한다.
예를들어 아래와 같다.
[CLS] the man went to [MASK] stor [SEP] he bought a gallon [MASK] milk [SEP]
[CLS] the man [MASK] to the store [SEP] penguin [MASK] are flight less birds [SEP]

 

4.3 문장 쌍 분류문제
대표적인 NLP Metric GLUE(General Langauge Understanding)는 다양한 자연어 이해문제에 대한 성능평가를 제공한다.
예를들어, QNLI test(Question Natural Language Inference)는 SQuAD에서 추출되어 변형된 문제들로 입력으로 주어진 질문과 이어지는 문장이 올바른 Q-A관계인지 맞추는 이진분류문제이다.


이런 분류문제에 적용하기 위해 transformer encoder의 가장 첫 time-step 입력은 [CLS]라는 특별 token을 입력으로 받는다.
해당 time-step의 출력벡터에 softmax층을 추가해 Fine-tuning을 함으로써 주어진 문제에 대한 분류신경망을 얻을 수 있다.
[CLS]에 해당하는 transformer encoder의 출력벡터를 C ∈ ℝH라 하자. (이때, H는 vector의 차원이다.)
이때, softmax층의 가중치파라미터 W ∈ ℝK×H를 추가한다. (이때, K는 후보클래스의 개수이다.)
이제, 각 클래스에 속할 확률분포 P ∈ ℝK를 구해보자.


[특징기반 전이학습방법인 ELMo와 가장 큰 차이점]

해당 문제에 대한 train dataset에 MLE를 수행하면서, 새롭게 추가된 W뿐만아니라 기존 BERT의 가중치까지 한꺼번에 학습시키는 것.

 

4.4 단일문장 분류문제
Text Classification이 가장 대표적인 이 유형에 속하는 문제이다.
마찬가지로 [CLS]토큰의 transformer출력에 대해 softmax층을 추가해 Fine-tuning으로 신경망을 훈련한다.
인터넷 등으로 수집한 corpus에 대해 LM을 훈련한 결과를 통해 task에 대한 dataset만으로 얻어낼 수 있는 성능을 훨씬 상회하는 성능을 발휘할 수 있게 되었다.

것처럼 분절이 완료된 파일을 데이터로 사용한다.
이후

 

4.5 질의응답 문제
BERT는 마찬가지로 종합독해문제에도 매우 강력한 성능을 발휘했다.
SQuAD에서도 훌륭한 결과를 얻었고, 한국어 dataset인 KorSQuAD에서도 매우 뛰어난 성능을 거뒀다.

SQuAD와 같은 문제는 질문과 문장이 주어졌을 때, 문장 내에서 질문에 해당하는 답을 예측하도록 학습한다.
따라서 정답단어나 구절이 위치한 time-step의 시작과 끝을 출력학 반환한다.
즉, 여럭 time-step의 입력을 받아 여러 time-step의 출력값을 내도록 한다.
SQuAD문제는 BERT를 이용한 주류가 대부분을 차지하였으며(KorSQuAD), 이미 해당 task에서 사람의 능력치를 뛰어넘었다.

 

4.6 단일문장 Tagging문제
이외에도 BERT는 NER, SRL같은 문장 내 정보 tagging문제 등에도 적용되어 뛰어난 성능을 발휘한다.
하나의 고정된 architecture에서 단순히 수많은 corpus를 훈련한 결과로 NLP전반에 걸쳐 뛰어난 성능을 거두었는데,
이 경우, 입력으로 들어온 각 단어나 토큰에 대한 tagging정보 등을 출력으로 반환하도록 추가적 훈련을 진행한다.

 

 

 

 

 

 

 

 

 


5. GPT-2

5.1 Architecture
GPT-2논문에서도 BERT와 같이 Transformer Decoder구조를 활용, LM을 비지도학습으로 사전학습 후 추가적인 지도학습으로 성능향상을 얻는다.
GPT-2이전, GPT-1논문이 발표되었었는데, 사실 GPT-1과의 차이점은 Decoder를 더 크게 사용하고, 몇가지 수정사항만 제외하면 거의 없다.

GPT-2는 기존의 Transformer에서 활용된 MHA블록을 굉장히 넓고 깊게 쌓아 parameter개수를 크게 늘려 수용력을 극대화 했는데, 이는 역전파의 전달을 용이하게 하는 skip-connection과 같은 방법으로 인해 가능하다.

다만, 논문에 따르면 이렇게 큰 모델구조를 활용했음에도 여전히 LM-비지도 사전학습에 사용된 dataset에 대해 underfitting이 될 만큼 큰 dataset을 사용했음을 알 수 있다.

 

5.2 pretrained Dataset 예시
∙ 기존의 다양하지 않은 도메인들
  ex) 뉴스기사, Wikipedia, 소설 등의 corpus

∙ WebText: 직접 crawling을 통해 최대한 많은 corpus를 모은 dataset

 

5.3 전처리 및 LM-Unsupervised pretraining
이 논문에서는 수집된 웹페이지로부터 텍스트들을 추출하기 위해 'Dragnet'과 'Newspaper'라는 라이브러리를 활용했다.
결과적으로 총 800만개의 문서로 구성된 40GB에 이르는 dataset을 수집하는 결과를 얻었고 이를 활용해 LM을 pretrain시켜 최고성능 LM을 얻을 수 있었다.

이후 subword과정에서 BPE만을 활용하며, 이때 BPE train과정에서 merge가 같은 wordset 내에서만 일어나게 제약을 둠으로써 BPE 분절의 성능을 단순한 방법으로 극대화 하였다.
이때, subword의 효율을 높이기 위해 같은 그룹의 character끼리만 merge과정을 수행한다.

ex) "입니다."와 같은 마침표(.)가 알파벳이나 한글과 붙어 나타난다면, 마침표와 앞서 나타난 문자들은 다른 그룹에 속하기 때문에 빈도가 아무리 높더라도 BPE 훈련 및 적용과정에서 결합이 수행되지 않는다. (= 여전히 떨어져 있는 상태가 될 것)

따라서 BPE를 통해 GPT-2는 추가적인 큰 노력없이 준수한 성능의 전처리 결과를 얻을 수 있었다.

 

5.4 실험 결과
GPT-2는 매우 방대한 양의 crawling data를 구축하고, transformer모델의 구조를 매우 깊고 넓게 가져갔다.
이를 통해 GPT-2는 매우 그럴싸한 느낌이 들 정도로 수준높은 LM임을 자랑한다.
parameter # LAMBADA WikiText-2 PTB WikiText-103 1B Words
previous SOTA 99.8 39.14 46.54 18.3 21.8
117M 35.13 29.41 65.85 37.50 75.20
345M 15.60 22.76 47.33 26.37 55.72
762M 10.87 19.93 40.31 22.05 44.58
1542M 8.63 18.34 35.76 17.48 42.16

위의 표는 GPT-2의 각 dataset에 대한 PPL(perplexity)성능으로
표에서 알 수 있듯, 대부분의 datsaset에서 S.O.T.A를 보여줬다.
특히나 LAMBADA datatset의 경우, parameter수가 늘어날수록 매우 큰 폭의 PPL의 감소를 확인할 수 있다.

 

Conclusion
GPT-2는 매우 방대한 양의 corpus를 수집해 training과정에 사용한 것이 큰 특징이다.
덕분에 매우 깊고 넓은 모델구조를 가지며 훌륭한 LM을 갖는다.
즉, 비지도학습에서 좀 더 Global-minima에 접근가능하다.
→ 추가적 지도학습으로 다른 문제들에서도 큰 성능향상을 가질 수 있게 되었다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


마치며...

이번시간에는 전이학습(transfer learning)을 활용해 NLP성능을 끌어올리는 방법을 알아보았다.
기존의 word2vec과 같은 사전훈련법과 달리 이번에 소개한
∙ELMo처럼 "문맥을 반영한 word embedding vector"를 구하거나
∙BERT처럼 "신경망 전체에 대해 사전학습된 가중치"를 제공한다.


특히 기존 Vision분야에서는 이미 ImageNet을 pretrain_weight_parameter로 두고 다른 dataset의 training에 사용을 진행해 왔었다.
이 효과를 NLP에서도 얻을 수 있게 되었기에 BERT는 매우 효과적이다. (by MLM. &. NSP)
BERT는 손쉽게 수집가능한 일반적인 문장들을 바탕으로 양방향 언어모델을 학습한 후, 이를 다른 문제해결에 사용한다.

기계번역과 같이 parallel corpus가 필요하거나
text classification과 같이 labeling된 corpus가 필요한 경우
제한적으로 dataset을 수집해야한다.

하지만 전이학습을 통해 훨씬 더 많은 양의 corpus로부터 문장의 특징을 추출하는 방법을 신경망이 배울 수 있게 되는 것이다.
BERT의 활용은 질의응답문제에 대해 사람보다 뛰어난 해결능력을 갖는 신경망을 손쉽게 얻을 수 있었다.

[Transformer] : with new attention "Self-Attention"

Attention is all you need[Vaswani2017; https://arxiv.org/abs/1706.03762]

 

Attention Is All You Need

The dominant sequence transduction models are based on complex recurrent or convolutional neural networks in an encoder-decoder configuration. The best performing models also connect the encoder and decoder through an attention mechanism. We propose a new

arxiv.org

위의 논문에서는 Convolution, Recurrent 등의 신경망의 구성요소를 모두 제거하고

"오로지 Attention만으로 신경망을 구현한다."

 

cf. 문맥 고려 임베딩(Contextualized Embedding)은 transformer가 개발되기 전, ELMo같은 언어모델에서 모든 토큰 임베딩을 비율을 달리해 통합하여 문맥을 내포하도록 하는 방법이다.

 

transformer가 한번에 처리하기에 이로 인해 순환신경망이 갖는 bottleneck문제를 해결할 수 있다.

🧐  기본적인 Architecture

<Encoder>
단어는 embedding을 통해 d차원의 embedding벡터로 표현된다. (논문에서는d= 512를 사용)
Inputs
라는 부분에 입력이 되며, 이때 Sequential 구조가 아님을 알 수 있다.
즉, transformer는 모든 단어를 "한번에 입력"한다.
이렇게 "한번에 입력"받는 방식은 "Self-Attention"을 가능하게 한다.

{Positional Encoding}
단어의 위치정보를 보완하기 위해 positional encoding을 통해 "embedding벡터에 위치정보를 더한다".

{MHA : Multi-head Attention}
Encoder에 MHA(Multi-Head Attention)층 FF(Feed Foward)층이 존재.
이때, MHA층 "Self-Attention"을 수행한다!
- multi-head라는 말처럼 h개 head가 독립적으로 self-attention을 수행, 결과를 결합한다.
- MHA층의 출력은 FF층의 입력이 된다. (MHA->FF)
- 또한, FF(Feed Forward)층은 FC(Fully-Connected) layer로 이루어진다.

MHA층과 FF층 모두 Add&Norm을 적용한다.
- AddShortcut Connection
- Normlayer Normalization을 의미한다.
- Nx는 Encoder block이 N개 연결되었다는 것을 의미한다. (논문에서는 N=6을 사용)



<Decoder>
Encoder처럼 단어 embedding과 Positional Encoding을 통해 변환된 단어들이 "한번에 입력"된다.
예를들어, 한국어문장은 Inputs에, 영어문장은 Outputs에 입력된다.

- Decoder에는 ~에 표시된 2개의 MHA층 FF층이 존재하며 출력에 Add&Norm을 적용한다.
- 이후 출력층은 "softmax"를 통해 확률벡터를 출력하며, 이런 Decoder block이 N개 연결되어 있다.

~은 3개의 MHA층으로 Attention을 담당하는 핵심요소이다.
-  Encoder에서 입력문장을 구성하는 단어간의 Attention을 처리한다.
같은 문장을 구성하는 단어간의 Attention이기에 이를 "Self-Attention"이라 부른다.

- ② Masked MHA의 의미는 다음과 같다.
Decoder는 i일 때, 1, 2, ..., i-1까지만 관찰해야한다.
그렇기에 Mask를 사용해 i+1, i+2, ... 등을 감추어야(masked) 한다.


-  Encoder가 처리한 입력과 Decoder가 처리하고있는 출력사이의 Attention을 다룬다.
따라서  "Self-Attention이 아니다!!"
이때, Encoder의 state벡터는 key와 value이고
Decoder의 state는 query로 작용하며 Encoder와 Decoder는 의 MHA를 통해 정보를 교환한다.


 로 표시한 MHA(Multi-Head Attention)층의 "Self-Attention"은 transformer의 main idea이다.

이제 전반적인 Transformer의 Architecture를 보았으니 좀 더 세부적으로 Encoder와 Decoder의 동작에 대해 설명하겠다.

 

 

 

 

 

 

 

[Encoder의 동작과정]

🧐  Input Embedding. &. Positional Encoding
encoder는 입력문장의 단어를 임베딩 후 d_model차원의 벡터로 변환한다. (논문에서는 d=512로 설정)
또한, 모든 단어를 "한번에 입력"하기 위해 문장을 T×d_model 크기의 S 행렬로 표현한다. (이때, T는 단어의 개수이다.)

행렬 S의 모든 행이 동시에 처리되서 순서정보를 신경망이 얻지 못할 가능성을 배제하기 위해 위치정보를 표현한 행렬 P S행렬에 더해 X행렬을 만들고 X를 신경망에 입력한다. 이때, 3가지 행렬 모두 같은 size를 갖는다.
이 과정을 "Positional Encoding"이라 한다.
위치행렬 P를 생성하는 여러 방법 중, 아래 식과 같은 sin, cos함수를 사용한다.




🧐  Self-Attention
X행렬에 대해 의 MHA로 "Self-Attention"을 수행한다.


Self-Attention을 구현하는 여러 방법 중 transformer architecture를 소개한 "Attention is All You Need"논문에서 다룬 "Scaled dot-product Attention"이 가장 일반적이며 이 메커니즘은 4단계로 구현된다.

 - 각 token embedding을 Q, K, V 3개의 벡터로 투영

 - Attention Score 계산: similarity function를 사용해 Q와 K가 얼마나 관련되는지 계산
   이때, QK의 dot곱 값이 커지면 비슷하다는 것을 의미한다.
   또한, n개의 input token이 있는 sequence일때, 크기가 n×n인 attention matrix가 생성된다.

 - Attention weight를 계산: 일반적으로 dot곱은 임의의 큰 수를 생성→ 훈련과정이 불안정해진다.
  이를 처리하기 위해 Attention score에 scaling factor(인자)를 곱해 분산을 정규화하고 softmax를 적용해 모든 열 합이 1이 되게 한다.
  이를 통해 만들어진 n×n행렬에는 attention weight wij가 넣어진다.

  - token embedding update, attention weight가 계산되면 벡터 v를 곱한다. 




"Self-Attention의 본질"
이때, query는 확장이 필요한데, 하나의 벡터 q로 표현하는 Bahdanau attention과 달리 Self-Attention에서는 query가 T개의 행을 갖는 행렬 Q가 되기에 확장된 query행렬은 다음과 같이 나타내며, 이때 Q, K, V는 모두 T×d_model크기의 행렬이고 이 식의 결과인 C도 T×d_model행렬이다.
"Self-Attention 구현의 가장 단순한 방법"은 바로 Q, K, V를 모두 X로 설정하고 위의 식을 적용하는 것이다.
하지만 transformer는 이런 단순한 방법이 아닌 query, key, value를 가중치 행렬 WQ, WK, WV를 이용해 X를 변환해 사용하며, 이때, QKT는 √d_key로 나누어 정규화를 거친다. 
이를 식으로 나타내면 아래와 같다.
X:  T × d_model 행렬
WQ:  d_model × d_key 행렬
WV:  d_model × d_value 행렬
Q, K: T × d_key 행렬
V:  T × d_value 행렬
(보통 d_model > d_value, d_key 로 설정한다.)
🧐  Multi-Head Attention

Architecture에서 로 표시한 MHA에는 여러 head가 있으며 각 head는 고유한 transform matrix WQ, WK, WV를 갖고 softmax식을 이용해 "Self-Attention"을 독립적으로 수행해 상호보완한다.
즉, 여러 head로 self-attention을 진행, 결과를 결합해 성능향상을 진행시킨다.

따라서 MHA의 동작을 아래와 같은 식으로 정의한다.


예를 들어보자.


이후 MHA를 통과한 C행렬은 Add&Norm층을 통과하는데, Skip connection과 Layer Normalization을 진행한다.
- Skip-connection: MHA층의 출력특징맵 C와 입력특징맵 X를 더하는 연산
- Layer Normalization: mini-batch를 구성하는 sample별로 특징맵의 분포가 N(0,1)이 되게하는 방법이다.
🧐 position-wise FeedForward layer
MHA에서 사용된 아래 식에 따라 출력한 X'을 입력으로 받아 X''을 출력한다.
아래 X''을 구하는 식을 보면 MLP를 구하는 방법처럼 linear transformation을 사용하는 것을 알 수 있다.
X X''은 모두 encoder의 최초 입력 X와 같이 Txd의 행렬이다.
이는 transformer가 신경망을 흐르는 tensor의 모양이 유지시켜 행렬연산이 원활히 이루어짐을 알 수 있다.


position-wise FF라 부르는 이유??

 

 

 

[Decoder의 동작과정]

encoder와 거의 비슷하게 동작하기에 다른 부분에 주안점을 두어 설명을 진행한다.



🧐  Masked Multi-Head Attention 층

Decoder에 로 표시된 Masked MHA층은 행렬일부를 마스크로 가린다는 점을 제외하면 의 MHA층과 같다. 
i = 1일 때, <SOS>를 입력하면 모델은 'That'을 예측하고
i = 2일 때, 'That'을 보고 'can't'를 예측하는 이런 방식을 재귀적으로 수행하는 자귀회귀방식을 적용해 언어번역을 진행한다.

다만, 학습단계는 추론단계와 상황이 다른데,
- 예측단계는 출력문장을 모른채 동작하지만
- 학습단계는 입출력문장이 모두 주어지고 자귀회귀방식을 사용가능하다.
(다만 교사강요; teacher forcing방식을 주로 사용한다.)
이는 잘못 예측했을 경우, 이후 단어는 계속 틀릴 가능성이 높기 때문이다.
교사강요에서는 '<SOS> That can't turn red by itself <EOS>'를 decoder에 한꺼번에 입력한다.


transformer도 교사강요로 학습을 수행하는데, 예측단계의 자기회귀를 모사한 "Masking"을 사용한다.


Masked MHA층은 이 행렬의 대각윗행렬의 모든 원소를 무한대에 가까운 음수로 설정하면, 이전에 나온 단어들에만 주목할 수 있게 되는데, 예를 들어보면 아래와 같다.





🧐 Encoder와 연결된 Multi-Head Attention 층 (Not Self-Attention)
위의 그림에서 으로 표시된 MHA층은 encoder와 decoder가 상호작용한다.
①: 이 MHA층은 입력문장내의 단어간의 Attention을 처리하는 "Self-Attention"이다.
②: 이 MHA층은 출력문장내의 단어간의 Attention을 처리하는 "Self-Attention"이다.
③: 이 MHA층은 Decoder로 입력된 문장의 단어가 Encoder로 입력된 문장의 단어에 주목할 정보를 처리한다.
"Self-Attention"이라는 점만 제외하고 모든 연산은  의 MHA층과 동일하다.

에서의 식은 "Self-Attention"을 처리하기에 같은 문장에서 구한 행렬 X만 존재한다.
∴ query와 key, value 계산 시 모두 X를 사용한다.

하지만 의 MHA층은 encoder의 X와 decoder의 X가 존재한다.
이를 구별하기 위해 X_enc, X_dec라 할 때,  key와 value는 X_enc를 사용하고 query는 X_dec를 사용한다.
이를 통해 query가 key와 value에 주목하는 정도를 계산할 수 있으며 아래와 같이 나타낼 수 있다.
여기서 MHA층의 출력 행렬은 Architecture에서 볼 수 있듯 Add&Norm층, FC층, Add&Norm층을 거친 후 Linear와 softmax로 구성된 출력층으로 전달된다.

 

 

 

[Transformer의 주요 도전과제]

언어
 - pretrain이 대부분 영어로 되어 data가 소량이거나 거의 없을 때


Data 가용성
- labeling된 data가 없거나 소량인 경우


긴 문서 처리
- Self-Attention의 경우, text길이가 문단정도될 때, 잘 동작
- 문서와 같이 긴 text는 cost가 많이 든다.


불투명성
- 다른 Deep Learning모델과 마찬가지로 Black-Box모델이다.
- 즉, 모델의 예측이유를 설명하기 어렵거나 불가하다.


편향
- 인터넷의 text data로 pretrain을 진행하기에 data에 있는 편향이 모델에 그대로 전이될 수 있다.

 

 

[구현을 통한 예시 증명과정]

import scipy.special as sp

# Self-Attention(single_head)
def self_attention(X, Wq, Wk, Wv, d_key):
    Q = np.matmul(X, Wq)
    K = np.matmul(X, Wk)
    V = np.matmul(X, Wv)
    
    QK = np.matmul(Q, np.transpose(K))
    a = sp.softmax(QK / np.sqrt(d_key), axis=1) # attention vector
    c = np.matmul(a, V) # context vector
    
    return Q, K, V, a, c
    
    
    X = [[0.0, 0.6, 0.3, 0.0],
     [0.1, 0.9, 0.0, 0.0],
     [0.0, 0.1, 0.8, 0.1],
     [0.3, 0.0, 0.6, 0.0],
     [0.0, 0.1, 0.0, 0.9]]
     

d_key = 2

Wq_1 = [[1,0],
      [1,0],
      [0,1],
      [0,3]]

Wk_1 = [[0,1],
      [1,0],
      [1,0],
      [0,2]]

Wv_1 = [[1,2],
      [0,1],
      [1,0],
      [0,0]]
      
Wq_2 = [[0,1],
      [0,3],
      [1,0],
      [1,0]]

Wk_2 = [[1,0],
      [1,2],
      [1,0],
      [0,1]]

Wv_2 = [[1,1],
      [0,0],
      [1,1],
      [1,0]]
Q1,K1,V1,A1,C1 = self_attention(X, Wq_1, Wk_1, Wv_1, d_key)
Q2,K2,V2,A2,C2 = self_attention(X, Wq_2, Wk_2, Wv_2, d_key)
C_concat = np.concatenate([C1, C2], axis=1)
Wo = [[0.1, 0.3, 0.5, 0.2],
      [0.1, 0.1, 0.0, 0.2],
      [0.2, 0.1, 0.6, 0.3],
      [0.5, 0.3, 0.1, 0.0]]
      
      
C = np.round(np.matmul(C_concat, Wo), 4)
C
array([[0.2738, 0.2756, 0.452 , 0.2934],
       [0.2362, 0.2629, 0.4152, 0.2847],
       [0.3769, 0.3007, 0.5142, 0.295 ],
       [0.3909, 0.3305, 0.5584, 0.3299],
       [0.3374, 0.2203, 0.412 , 0.216 ]])

 

 

 

 

 

 

가장 유명한 transformer architecture 모델로 다음 3가지를 꼽을 수 있다.

[GPT  &  BERT  &  BART] 

[GPT] - Decoder유형_(autoregressive attention)

- Thanks for lunch, I had a ... 같은 "시작 text가 주어지면 가장 가능성 있는 다음단어를 예측"하는 식으로 시퀀스를 자동완성

- transformer architecture의 decoder부분만 사용하고 ULMFiT같은 언어 모델링 방법을 사용

- GPT가 pretrain한 BookCorpus dataset은 도서 약 7000권으로 구성

 

[BERT] - Encoder유형_(bidirectional attention)

- text classification, 개체명 인식과 같은 "text sequence input을 풍부한 수치적 표현으로 변환"하는 task에 잘 맞는다.

- transformer architecture의 encoder부분을 사용하고 masked language modeling이라는 특별한 언어 모델링 방법을 사용하며 GPT와 달리 BookCorpus는 물론, Wikipedia로도 pretrain을 진행하였다.

ex) I looked at my [MASK] and saw that [MASK] was late

- 변종: RoBERTa, DistilBERT, ...

 

 

[BART,  T5] - Encoder-Decoder유형

- 한 text sequence를 다른 sequence로 mapping하는 복잡한 모델링에 사용하는 유형으로 기계번역요약작업에 적합하다.

 

 

 

 

 

 

 

 

[Hugging Face Transformers] 

서로 호환되지 않는 framework(e.g Tensorflow, Pytorch)를 사용해 model을 배포하면 자신의 application에 포킹하기 쉽지 않았고, Hugging Face(🤗)의 트랜스포머로 단일화된 API를 구축하였다.

 허깅페이스 라이브러리는 다음 3가지 Deep Learning framework를 지원한다. 추가적으로 프레임워크 전환이 용이하다.

 - Pytorch

 - Tensorflow

 - JAX

+ Recent posts