BERT 강의 필기 본문
BERT : Pre-training of Deep Bidirectional Transformers for Language Understanding
서정연 교수님 강의를 필기한 내용입니다
Introduction : word representation
1) local representation
단어라는 것을 one-hot vector 로 표현하는 것은 문제가 많았다 ( local representation )
ex) abc -> a ( 1, 0, 0 ) b ( 0, 1, 0 ) , c(0,0,1)
2) distributed word representation ( word2vec ) 을 가지고 전이학습
간단한 방법이지만, local representation보다 효과가 있는 방법이였음
ex) a -> ( 0.2, -0.54 ) vectors in a continuous vector space ( n개의 word -> n차원의 벡터로 표현 )
3) 단어간의 관계를 반영하도록 distribute ?
일종의 language model 학습한다고 생각, task 수행을 위해 network를 train
CBOW : 링크
Skip-gram : 링크
4)
a) traditional machine learning
-> 각각의 경우를 학습을 하고 각각 결과가 나왔다 ( task1 -> learning system1 , task2 -> learning system2 ..... )
-> MT 는 MT 용, QA는 QA용 ...
b) transfer learning
-> 방대한 양의 data를 가지고 (일반화된)학습시키고, target task에 pre-trained 된 knowledge를 가지고 (추가)학습 시키는 것
-> 보통 학습 기법에서 변화를 주거나, domain이 변경되는 경우이다 ( 요즘 고성능 모델들은 모두 이런 구조 )
b-1) training process
1) 결론적으로는 LM(language model 예를 들어, word2vec)을 만들어 새로운 학습을 시킨다는 것
2) fine-tuning( downstream task 해결이 goal로, pre-trained된 모델을 미세 조정하는 것 ) 을 하면 효과가 좋더라!!
방대한 text-corpus로 word representation을 pre-train할 수 있고 ,
* QA : question - answer
* MT : machine translation
* NLI : 문장관계
* NER : 고유명사 카테고리 등 개체 인식
word2vec 에서부터~ GPT, BERT 까지 굉장히 다양한 pretraining word representation 방법도 나왔다
text -> word2vec 은 unsupervised learning 이라고도 볼 수 있다
* word2vec은 동음이의어 구별이 불가능하다. 같은 차원의 벡터값에 할당되기 때문
-> ELMO, BERT, GPT ( Context 를 이해하기 때문에 )
* 사전학습에는 두가지 큰 갈래가 있다 ( BERT 논문 기준 )
1) Feature-based approach
2) Fine-tuning approach ( LM - fine tuning이 본체 공유 )
* Feature-based approach
대표적으로 ELMo ( biLMs - bidirectional LSTM layer들을 이용하여 방대한 corpus에서 트레이닝 , ELMo : task specific )
biLSTM pretraining part + ELMo part
1) GloVe, word2vec 에서는 polysemous words 는 context와 상관없이 same representation 으로 표현되기 때문에 구분이 안되었음 -> i am a big fan of Mozart , i need a fan for cooling -> fan 팬? 선풍기?
2) context에 따라서 다르게 word embedding을 한다 -> feature vector /// left - to - right , right to left ///
-> mozart - of - fan , fan - of - mozart 그리고 fan for cooling , fan - for - cooling
3) target text의 각 단어에 맞도록 ELMo에서 인코딩된 내용(feature)을 붙여주는 것 ( 그림 참고, 하단의 Github 주소 출처 )
-> target (feature + ELMo Embedded feature )
* 여러가지 task 에 대한 평가
SQuAD : 대표적인 QA task 중 하나 ( Stanford Question Answering Dataset )
SQuAD 2.0에 관한 블로그 글 https://dos-tacos.github.io/paper%20review/SQUAD-2.0/
* unanswerable question 이 있다는 것, 1.대 task에서 80%대 성능의 모델과 2.0이 f1 score 20%가 차이남
SNLI : Hypothesis -> text -> judgment ( 두 문장 H, t 의 관계에 대해서 contradiction, neutral , entailment )
( Natural Language Inference (NLI), also known as Recognizing Textual Entailment (RTE), is the task of determining the inference relation between two (short, ordered) texts: entailment, contradiction, or neutral (MacCartney and Manning 2008), https://nlp.stanford.edu/projects/snli/ )
SST-5 ( Stanford Sentiment Treebank , 5 클래스 미세 감정 분류 )
SRL (Semantic Role Labelling )
NER (Named Entity Recognition) ...
여러 task 와 벤치마크 테스트 셋 관련 정리
https://hryang06.github.io/nlp/NLP/#snlistanford-natural-language-interence-corpus
* Fine-tuning approach
굉장히 방대한 양의 pre-training으로 진행하나, target task자체는 상대적으로 간단하게 학습시킴
그렇지만 실제로 language model 만들기 복잡하기 때문에 feature-based보다 성능이 굉장히 좋다
> OpenAI GPT, BERT ( 거의 동일하다 )
> pre - training 내용 + target task(output)에 맞도록 input -> 짜잔!
** BERT , ELMO
https://jalammar.github.io/illustrated-bert/
** BERT ( Transformer - attention mechanism )
LSTM 처럼 sequential하게 봤을때 죽일건 죽이고 살릴건 살린다
-> 어떤 hidden layer를 중심적으로 학습할 것인지
Framework
1) target 과 source의 hidden states를 비교한다
2) 그 가중치의 평균 값을 계산하고 -> 이게 attention 임
3) 그것을 반영한 context_vector ( weighted average ) 를 생성하고
4) context-vector와 target vector가 같이 반영됨 ( 뒤의 벡터에 어떤것에 더 점수를 주어야 할지 ! -> 맥락이 고려됨 )
* attention ways 3가지
1) Encoder-Decoder attention
2) Encoder Self-attention ( 서로의 출력 layer의 출력값을 비교해서 bidirectional-attention )
Self-attention은 같은 문장끼리 비교에 대한 Query = Key = Value , sim = QK / sqrt(d)
** multihead attention
3) maskedDecoder self-attention ( decoder를 위한 attention, 뒤의 pivot을 기준으로 right to left )
self-attention 과정에서 동일한 단어(자신)의 유사도를 고려하지 않고 그 부분을 마스킹해서 맞추는 학습을 시키는 것
3') Next Sentence Prediction task
다음 문장의 적절함 / 부적절함 에 대해 classification 을 하여 의미적으로 비슷한지 안비슷한지 파악하는 방식의 아이디어로
LM에 대해 학습이 된다고 보기 때문
* Seq2Seq Model을 할때 attention mechanism 정의
더 주의 집중해야 할 곳으로 예측되는 부분에 더 놓은 가중치를 반영하는 것
* 적용 이유 ( 굉장히 DL에서 큰 의미를 가지는 이유 )
인코딩시 : 전체 source sentence를 요약하기 때문에 전체 정보를 가지나, 정보 병목 현상 문제로 정보 유실(LSTM)을 완화
디코딩시 : 매번 디코딩 수행시에 생성하고자 하는 단어가 source sentence 어느 부분과 관련이 높은지를 계산해서 생성과정을 수행
* BERT는 Google Transformer ( 목적은 기계번역 ) 에서 encoder 부분만 12layer 쌓음
* example )
BERT BASE Layer(L) = 12, Hidden size(H) = 768 , Self - Attention head ( A ) =12
BERT SMALL : L 6
BERT LARGE : L = 24 , H = 1024 , A = 16느림
* fine-tuning approach
> input construction
[CLS] + sentenceA + [SEP] + sentenceB
start token = CLS token
seperator = SEP token ( sequence 구분을 위한 , 문장 간 혹은 문장 내 분할 )
Input
[cls] + [my] + [dog] + [is] +[cute] + [sep] + [he] + [likes] + .....
Token Embeddings ->
E[cls] + E[my] + E[dog] + E[is] + E[cute] + E[sep] + E[he] + E[likes] + .....
Segment Embeddings -> Sequence Embedding
E[A] + E[A] +E[A] +E[A] + E[A] + E[A] + E[B] + E[B] + E[B] + .....
Position Embeddings -> 문장 내 단어 position
E[1] + E[2] + E[3] + E[4] + E[5] + E[6] + E[7] + E[8] ......
Elementwise 하게 계산이 된다, P.E(768) -> S.E(768) -> T.E(768) -> [CLS]
* WordPiece embeddings ( Wu et al. 2016)
- 단어 갯수를 줄여서 vocab을 구성하는 방법 ( 60만 -> 30,522 ) 정도로 커버 가능한 장점
등등
** Pre-train task#1 Masked Language Model ( MLM )
- input의 a% ( 보통 15 % -> 그중 80%은 마스크 시킴, 10%는 랜덤으로 대체 , 10% 원래 있던 단어 그대로 )
- 결과물은 예를들어 3만개 중의 ~로 softmax를 통과하고 나온 probability이며 -> back propagation 되며 학습
-> each batch에서 15% token 들만 predict 된다는 것? Left-to-right 보다 실제로 좋은것인가? -> 성능상으로 증명됨
** Pre-train task#2 Next Sentence Prediction(NSP)
- 마스킹하는것과 비슷하게 다음 문장으로 오는것과, 실제로 다음 문장이 아닌 것을 가지고 학습 시킴 ( 2차원 next seq? yes|no )
** Pre-train task#1 & #2 : joint training ( MLM + NSP )
* GPT는 language 생성에 효과가 좋고 , decoder 부분을 사용한다고 생각하면 된다
굉장히 모델이 방대해서 학교 실험실 장비로도 힘들다
< 출처 : "Attention is all you need", Vaswani et al., arxiv, 2017>
* positional encoding
*** transformer model에 관한 유원준님 설명 , 딥러닝을 이용한 자연어 처리 입문
**** Sembert ( semantics aware bert ) 번역된 블로그 https://jeonsworld.github.io/NLP/sembert/
'딥러닝 > 자연어처리' 카테고리의 다른 글
문법과 파싱 (0) | 2022.03.26 |
---|---|
Grammars and Parsing (0) | 2022.03.23 |
N-gram model과 등장 배경 (1) (0) | 2022.03.23 |
ML/DL NLP에서의 접근 방법 (0) | 2022.03.02 |
언어의 모호성과 해결 방법, NLP 기술의 발전사 (0) | 2022.03.02 |