Bert란
bert란 구글에서 발표한 임베딩 모델로 문맥을 고려한 임베딩을 제공하기 때문에 여러 nlp task에서 좋은 성능을 보여줬다.
워드투벡과 같은 단어 임베딩 모델에서는 문맥이 달라도 동음이의어를 구분하지 못하고 동일한 임베딩을 제공하는 반면, 버트는 문장의 문맥을 이햐 한 다음 문맥에 따라 단어 임베딩을 생성한다.
Bert의 동작
Bert는 트랜스포머 모델의 인코더만 사용한다. Bert의 Bidirectional은 양방향 이란 뜻으로, 디코더는 문장을 순차적으로 생성해야 해서 단방향으로만 읽게되지만 인코더는 원래 양방향으로 문장을 읽을 수 있기 때문에 붙은 이름이다. 인코더에 문장을 입력하면 멀티 헤드 어텐션 메커니즘을 사용해 문장의 각 단어의 문맥을 이해해 문장에 있는 각 단어의 문맥 표현을 출력한다.
Bert의 구조
Bert-base : 12개의 인코더 레이어가 스택처럼 쌓인 형태로 구성, 모든 인코더는 12개의 어텐션 헤드 사용, 피드포워드 네트워크는 768개차원의 은닉 유닛으로 구성된다. 따라서 base에서 얻은 표현의 크기는 768이다. 총 변수의 수는 1억 1천만개이다.
Bert-large : 24개의 인코더 레이어, 16개의 어텐션 헤드 사용, 피드포워드 네트워크는 1,024개의 은닉 유닛으로 구성되며 얻게되는 표현의 크기 1,024이다. 총 변수의 수는 3억 4천만개 이다.
Bert 사전학습
Bert의 사전학습은 크게 Masked Language Model(MLM), Next Sentence Prediction(NSP) 두가지 task가 있다. 두가지 task를 이용해 거대한 말뭉치를 기반으로 사전학습되며 이를 바탕으로 새로운 태스크에 맞춰 fine tuning을 한다. 각 태스크에 대해 알아보기 전에 먼저 버트의 입력단계부터 알아보자.
Bert Input Embeddings
- Token Embeddings : 문장을 모두 토큰화해서 토큰들의 임베딩
- [CLS] : 문장 맨 앞에 붙는, classification을 위한 토큰.
- [SEP] : 모든 문장의 끝에 붙는 토큰.
- Segment Embeddings : 두 문장의 구역을 나누는 임베딩. 0 또는 1
- Position Embeddings : 입력 위치에 따라 차례대로 값이 부여되는 임베딩. 0~문장 길이
Wordpiece Tokenizer
subword(하위단어) 알고리즘을 기반으로 동작하는 토크나이저이다. 가장 빈도수가 많은 bigram을 unigram으로 통합하는 형태로 진행한다. 예를 들어 다음 문장이 주어졌다고 하자.
Let us start pretraining the model.
tokens = [let, us, start, pre, ##trian, ##ing, the, model]
워드피스 토크나이저를 사용해 문장을 토큰화 하면 ##trian, ##ing 같이 하위 단어로 분할이 된다. 단어가 어휘사전에 있으면 그 단어를 토큰으로 사용하고 어휘사전에 없으면 단어를 다시 하위단어로 분할해 하위단어가 어휘사전에 있으면 토큰으로 사용하는 식으로 분할하면서 어휘사전을 확인한다. 이런 방식으로 OOV 문제를 해결하는 것이다. 위의 문장에서 pretraining 이라는 단어가 어휘사전에 없었기 때문에 pre, ##trian, ##ing 의 subword로 분할이 되어 토큰화가 된 것을 알 수 있다. 이후 문장 시작에 CLS와 끝에 SEP를 추가하면 최종적으로 얻는 토큰은 다음과 같게 된다.
tokens = [[CLS], let, us, start, pre, ##trian, ##ing, the, model, [SEP]]
이제 이 입력 토큰을 토큰, 세그먼트, 위치 임베딩 레이어에 입력해 임베딩을 얻어 Bert에 입력한다.
사전학습
앞서 말한 것처럼 버트는 마스크 언어 모델링(MLM), 다음문장 예측(NSP) 두 가지 태스크에 사전학습 된다.
마스크 언어 모델링(MLM)
- 문장의 임의의 단어에 Masking을 하고 그 단어를 맞추도록 하는 task
- 전체 단어의 15%를 무작위로 마스킹
I like to play video game > I like to [Mask] video game
파인튜닝에는 Mask 토큰이 없기 때문에 사전학습과 파인튜닝 방식에 불일치를 줄이기 위해 15%의 마스크 토큰에 대해 80-10-10% 규칙을 적용한다.
1) [MASK] 토큰으로 대체 (80%) > I like to [Mask] video game
2) 임의의 다른 단어로 대체 (10%) > I like to live video game
3) 원본 단어보존 (10%) > I like to play video game
다음 문장 예측(NSP)
- 두 문장을 입력하고 서로 이어지는 문장인지 아닌지 예측하는 이진분류 task.
Sentence A : She cooked pasta
Sentence B : It was deicious
Label : IsNext
Sentence A : Turn the radio on
Sentence B : She bought the hat
Label : NotNext
NSP 태스크를 통해 두 문장 사이의 관계를 파악 할 수있고 질문-응답, 유사문장탐지 같은 다운스트림 태스크에 유용하다.
분류를 수행하기 위해 [CLS] 토큰을 사져와 소프트맥스 함수를 사용해 피드포워드 네트워크에 입력한다. 그러면 문장 쌍이 isNext 인지 notNext인지 확률값이 반환된다. [CLS]는 기본적으로 모든 토큰의 집계 표현을 보유하고 있으므로 문장 전체에 대한 표현을 담고 있기 때문에 CLS토큰을 사용한다.
Bert 실험 조건
Datasets
|
BooksCorpus (800M words), English Wikipedia (2,500M words)
|
Batch size
|
256 sequences (128,000 tokens)
|
Iterations
|
1,000,000 steps (40 epochs)
|
Optimizer
|
Adam (lr = 1e-4, β1=0.9, β1=0.999, L2 decay = 0.01)
|
LR schedule
|
Linear warm-up for the first 10,000 steps, then linear decay
|
Activation
|
GeLU function
|
- 매우 큰 데이터셋, 매우 큰 모델 (Base : 110M, Large : 340M)
- 딥러닝 모델 및 데이터셋의 대형화의 시작을 알리는 연구
모델 평가 - Glue task
1) CoLA : 특정 문장이 말이 되는지, 되지 않는지 판단
2) SST : 단일 문장의 감정 분류
3) MRPC : 다르게 쓰여진 두 문장이 같은 뜻을 담고 있는지 판단
4) STS : 두 문장이 얼마나 유사한지 측정
5) QQP : 서로 다른 두개의 질문이 같은 것을 물어보고 있는지 판단
6) MNLI : 서로 다른 두개의 문장이 합치되는지 상반되는지 중립적인지 판단
7) Question NLS : 문단과 질문이 주어지면 그에 대한 답을 문단내에서 찾는 task (SQuAD)
8) RTE : 두개의 문장이 주어지면 이것이 합치되는 문장인지 아닌지 판단.
9) Winograd NLI : 사람이라면 쉽게 풀 수 있게 설계된 두 개의 문장의 합치 여부 판단
모든 GLUE task에서 SOTA를 달성.
구글 BERT의 정석 책을 참고 하여 정리하였습니다.
'머신러닝 > 딥러닝' 카테고리의 다른 글
Sentence-BERT (0) | 2022.07.07 |
---|---|
텍스트 요약을 위한 BERTSUM (0) | 2022.07.07 |
seq2seq과 Attention (0) | 2022.07.04 |
FastText, Glove (0) | 2022.07.04 |
가중치 초기화 (0) | 2022.07.03 |