핵심 키워드
- Encoder-only
- Masked Language Modeling (MLM)
- Next Sentence Prediction(NSP)
BERT (Bidirectional Encoder Representations from Transformers)
- Transformer의 Encoder만으로 구성된 언어 모델
- 문장에서 무작위로 단어를 마스킹하여 양방향 단어 정보를 동시에 학습한 문맥 정보를 습득
- 위키피디아(25억 단어)와 BooksCorpus (8억 단어)와 같은 레이블이 없는 텍스트 데이터로 pre-training
- 사전 학습된 언어 모델을 downstream task에 적용하기 위해 fine-tuning 수행
- Bart-Base (1.1억 개의 파라미터에 해당하는 12개의 Encoder layer)
- Bart-Large (3.4억개의 파라미터에 해당하는 24개의 Encoder layer)
모델 구조
from transformers import BertModel
# bert-base 모델 불러오기
model = BertModel.from_pretrained("bert-base-uncased",
add_pooling_layer=False,
output_hidden_states=True,
output_attentions=True)
- 12개의 Encoder Layer로 구성되어 있고, BERT에 classifier layer를 추가하여 downstream task를 수행한다.
- 각 Encoder Layer는 768 hidden unit, 12개의 attention head를 가진다.
- Classifier는 Linear와 Softmax로 구성된다.
Input Embedding
- [CLS] 토큰
- 모든 문장의 첫 번째 토큰은 항상 [CLS] 토큰
- [CLS] 토큰은 Encoder layer를 거치면서 다른 토큰들의 정보를 바탕으로 Embedding 생성
- 결과적으로 나온 [CLS]토큰을 이용해 classification task 수행한다.
- [SEP] 토큰
- 서로 다른 문장으로 구별하기 위한 토큰
- 질의응답 task 같은 경우 입력으로 넣을 때, 질문과 답이 서로 독립적인 문장으로 인식하도록 해준다
- Token Embeddings
- BERT는 입력 문장을 WordPiece 토크나이저를 통해 단어를 작은 단위(토큰)로 분리한 후 각 토큰에 대해 768차원의 벡터로 표현된다. (BERT에서 vocab size는 30522개이다 - 모델구조 코드를 보면 알 수 있다.)
- Segment Embeddings
- BERT는 문장 쌍을 입력으로 받을 수 있기에 각 문장이 어떤 세크먼트에 속하는지 구분하기위해 사용된다.
- 예를 들어 문장 A와 문장 B가 주어졌을 때, [SEP] 기준으로 A 문장은 0이 할당되고, B 문장은 1이 할당된다.
- Position Embeddings
- 문자에서 각 토큰의 위치 정보를 학습하기 위한 Embeddings
- 모델 구조를 보면 -> (position_embeddings): Embedding(512, 768)로 되어있는데, 즉 BERT는 최대 512개의 토큰 길이까지 처리할 수 있다.
- 정리
- BERT의 입력은 단순히 단어 토큰들로만 이루어지는 것이 아니라, 세 가지 임베딩(Token, Segment, Position)이 더해진 상태로 입력된다. 이렇게 함으로써 BERT는 각 토큰의 의미, 문장 간의 관계, 그리고 문장 내에서의 위치 정보를 모두 학습할 수 있다.
BERT의 학습 방법
Pretraining
- Masked Language Modeling (MLM) - 단어 사이 관계 잘 학습하자
- BERT는 입력 문장에서 몇몇 단어를 마스킹하고, 마스킹된 단어들을 예측하는 task를 통해 학습된다.
- 이렇게 마스킹 하는 이유: 일반적으로 마스킹 없이 양방향으로 예측했을 때, 예측하려는 단어가 multi-layer 구조를 통해 간접적으로 참조되기 때문에(정답을 보고 예측) 올바른 학습이 이뤄지지 않기 때문이다.
- 각 문장마다 토큰의 15% 중 80%는 [MASK]로 치환, 10%는 무작위로 다른 단어로 치환, 나머지 10%는 그대로 둠,
- 마스킹된 토큰의 마지막 Encoder layer를 거친 결과를 FFNN+Softmax에 통과시켜 단어를 예측한다.
- 이를 통해 양방향 단어 정보를 동시에 학습 가능하다
- 이점: 대용량 코퍼스에서 문장을 가져와서 mask를 뚫고 그 문장의 원래 단어를 label로 주면 되기 때문에, 라벨링이 필요 없이 대용량 코퍼스로 학습 데이터로 사용가능하다.
- BERT는 입력 문장에서 몇몇 단어를 마스킹하고, 마스킹된 단어들을 예측하는 task를 통해 학습된다.
- Next Sentence Prediction(NSP) - 문장과 관련된 정보 파악
- 두 개의 문장을 제공하고 문장들이 이어지는 문장인지 예측하며 언어 모델 학습
- 두 문장이 서로 어떤 관계에 있는지를 추론하는 질의 응답, 자연어 추론 등의 문제를 잘 풀어낼 수 있다.
- 문장과 문장 사이에 [SEP] 토큰을 삽입하여 각 문장이 서로 다른 문장인 것을 알려준다. 가장 앞에 있는 [CLS] 토큰으로 두 문장이 이어지면 IsNext, 이어지지 않다면 NotNext를 예측하는 작업을 학습한다. 데이터를 구성할 때, 50%은 실제 문장(Corpus에서 연속된 문장 가져옴), 50%는 데이터에서 임의로 선택한 문장으로 구성한다.
- 정리
- BERT는 Pre-training단계에서 Masked Language Modeling (MLM)과 Next Sentence Prediction(NSP)를 동시에 수행하여, 단어사이의 관계, 문장 문서와 관련된 정보를 파악할 수 있는 모델이 된다.
Fine-tuning (Downstream Tasks)
Pre training된 BERT모델에 단순한 심층 심경망을 추가하여 downstream task 진행
- (a) Sentence Pair Classification Tasks:
- 두 문장을 하나의 입력으로 넣고 두 문장 간의 관계를 구하는 문제 - [CLS] 토큰을 classifier layer에 입력하여 예측
- (b) Single Sentence Classification Tasks:
- 문장을 입력으로 넣고 문장의 종류를 분류하는 문제 - [CLS] 토큰을 classifier layer에 입력하여 예측
- (c) Question Answering Tasks:
- 문단 내에서 원하는 정답 위치를 맞히는 문제 - 문단의 단어 벡터를 classifier에 입력하여 start, end 토큰 예측
- (d) Single Sentence Tagging Tasks:
- 입력 문장 토큰들의 개체명을 구하거나 품사를 구하는 문제 - 단어 벤터를 classifier에 입력하여 단어에 올바른 태그 예측
- BERT 단어 임베딩의 활용
- Feature Extraction: Pre training 된 BERT를 task에 맞게 개발된 모델의 단어 임베딩으로 활용할 수도 있다.
- pre training된 단어 임베딩만을 가져오고 그 위에 다른 모델을 사용하여 다른 task를 수행할 수 있다.
- Feature Extraction: Pre training 된 BERT를 task에 맞게 개발된 모델의 단어 임베딩으로 활용할 수도 있다.
'DL' 카테고리의 다른 글
Encoder-Decoder Model - BART (0) | 2024.09.24 |
---|---|
Decoder Model (GPT 1,2,3) (0) | 2024.09.24 |
Transformer 이해하기 (0) | 2024.09.23 |
Attention 이해하기 (1) | 2024.09.17 |
[Generation] Diffusion Model의 이해 (DDIM, with GAN) (0) | 2024.08.26 |