What is Pre-training
사전 훈련은 자연어 처리나 컴퓨터 비전 등 다양한 분야에서 사용되는 기계 학습 기술입니다. 이는 큰 데이터셋에서 모델을 훈련하여 데이터의 기반 구조를 포착하는 일반적인 패턴과 표현을 학습하는 과정입니다. 사전 훈련된 모델은 입력 데이터로부터 의미 있는 특징이나 임베딩을 추출하는 방법을 배우며, 이후 이를 작은 작업 특화 데이터셋에 맞게 미세 조정하거나 적용할 수 있습니다. 사전 훈련은 모델이 유용한 지식을 습득하고 작은 데이터셋에 대한 훈련을 줄여줌으로써, 하위 작업에서 더 나은 성능과 빠른 수렴을 이끌어냅니다.
따라서 대규모 데이터를 통해 언어에 대한 사전 지식을 쌓는 과정으로 BERT에선 Unsupervised Task인 Masked Language model(MLM)과 Next Sentence Prediction(NSP)를 수행하게 된다. (흔히 풀고자하는 분류나 회귀문제가 아니라는 뜻이다.)
Why Pre-training?
- 데이터 희소성 보완
작은 데이터셋에서는 모델을 충분히 훈련시키기 어려운 경우가 많습니다. 사전 훈련을 통해 모델이 데이터 희소성 문제를 극복하고 효과적인 표현을 습득할 수 있습니다. - 자원 절약
사전 훈련을 통해 모델의 초기 학습을 단축시키고 성능을 향상시킬 수 있으므로, 시간과 자원을 절약할 수 있습니다. - 전이 학습
사전 훈련된 모델을 다른 작업에 적용하는 것을 전이 학습이라고 합니다. 이는 초기 훈련 단계에서도 빠르게 수렴하게 하며, 새로운 작업에 적합한 표현을 만들어 줍니다. (ex. 리뷰 긍/부정 분류) - 일반적인 특징 학습
사전 훈련은 모델이 대규모 데이터에서 일반적인 언어 또는 패턴의 특징을 학습하도록 도와줍니다. 이는 다양한 작업에 유용한 범용 표현을 제공합니다.
How Pre-training?
- MLM (Masked Language model)
기존의 RNN같은 방식들은 Unidirectional하게 훈련을 했으므로 Bidirectional하게 훈련하고자 하는 의미에서 수행되는 Task이다. Input이 주어지면 해당 문장의 일부분을 $[MASK]$ 토큰으로 바꾸고, 다른 단어들을 보며 해당 Mask토큰이 무엇일지 마지막 hidden vector를 거쳐 softmax로 들어가 어떤 단어를 출력하는 방식입니다(전체 단어들의 15%이며 이중 80%는 $[MASK]$토큰이며 10%는 랜덤한 단어 그리고 10%는 원본). 이때, Label은 원본 Token이지만 여느 Downstram Task처럼 Label data가 따로 필요없기 때문에 Unsupervised training이다. - NSP (Next Sentence Prediction)
NLP의 Question Answering (QA) and Natural Language Inference(NLI)와 같은 task에서 두 문장 간의 relationship을 파악하는 것이 매우 중요합니다. BERT는 두 문장이 연결되어 있던 문장인지 예측하는 next sentence prediction을 학습하여 문장 간의 relationship을 파악할 수 있도록 pre-training합니다. 학습을 위해 50%는 연결된 문장, 50%는 랜덤하게 뽑힌 문장으로 학습합니다.
Which point relate to Init_weight?
Hugging Face의 Transformer 라이브러리를 사용하게 되면 사람들의 다양한 사전훈련 모델을 불러올 수 있다. 하지만 우리는 NN(Neural Network)를 훈련하다 보면 모든 파라미터를 Initialize 해야한다. transformers.AutoModel.from_pretrained("bert-base-uncased")
를 불러오게 되면 자동으로 init을 해주는데 (말도안되는 의문일지 모르겟지만?) "사전 학습이 된 Weight를 불러오는데 Init을 하게되면 무슨의미가 있나?"라는 생각이 들었다.
결론부터 말하면, 원하는 모델 구조를 만들어 두고 weight init을 한 후에 사전학습 weight를 맞는 각 레이어에 overwrite(?)합니다. 예를 들어 분류모델을 하고 싶을 때 transformers.AutoModelForClassfication.from_pretrained("bert-base-uncased")
로 모델을 불러온다 하면 BERT Model(output dim = 768) + Pooler Layer (output = 분류 갯수)이 될 것입니다. 따라서 BERT Model에는 사전학습 가중치가 덮어씌워지고 Pooler Layer에는 init_weight에 의한 모델 가중치 초기화가 이루어져 있습니다.
Reference
- https://github.com/huggingface/transformers/issues/4701
- https://stackoverflow.com/questions/62040309/why-we-need-the-init-weight-function-in-bert-pretrained-model-in-huggingface-tra/62053791#62053791
- https://stats.stackexchange.com/questions/517802/how-pre-trained-weights-in-the-bert-can-help-the-fine-tuning-task
- https://www.deeplearning.ai/ai-notes/initialization/index.html
'AI > Models' 카테고리의 다른 글
HuggingFace 모델 A to Z (2) - Tokenizer (2) | 2023.01.19 |
---|---|
HuggingFace 모델 A to Z (1) - 기본 구조와 흐름 (0) | 2022.11.29 |
[NLP] Transformer - self-Attention (1) | 2022.10.06 |