이 게시글은 Language Understanding with BERT 아티클을 참고한 글이다! Thanks to Jinheon Baek~!
출국 전 NLP 공부 .. 일주일에 게시글 세개씩 올릴 것이다. 항상 겸손하기 ..
◆ BERT는 뭘까
BERT의 효용은 아래 두가지라고 저자는 주장한다.
- Self-supervised learning으로 raw textual data를 pre-training (즉, downstream task를 위한 encoder)
- 각 token에 대해 bidirectional feature representation을 학습
◆ Building Blocks of BERT
BERT의 구성요소는 1) Self-Attention 2) Transformer Encoders 3) Self-supervised Learning.
1) Self-attention

Self-attention은 크게 token의 sequence를 input으로 받고, non-linear transformation을 수행한다.
그럼 이 transformation은 뭘까? BERT의 self-attention은 각 token vector에 대해 아래와 같은 것을 한다.
- 특정 현재 token을 sequence내 다른 token들과 비교 후, 이들의 attention score 계산
- 다른 token들에 대한 현재 token의 representation을 attention score로 weighted 하고, adapt
-> 시퀀스 내 다른 토큰에 기반해 Context-aware representation을 생성한다.

이러한 self-attention 구조에는 두가지 특징이 있다. 1) Multi-head 2) Bidirectional.
일단 Multiple attention head 구조를 지닌다. 이는 각 다른 attention pattern을 배울 수 있게 한다.
또한, 중요한 것은 위 self-attention 형태가 Bidirectional 형태라는 것이다. Unidirection과의 차이는 무엇이냐구? 바로 아래이다.

- Unidirectional self-attention: 화살표의 방향에서 미루어보듯, 이는 각 토큰들이 precede (선행하는) 토큰에만 의존함을 보장한다. 나중에 오는 나머지 토큰들은 masking을 해준다. 이는 next world를 predict할 때 "look forward"를 하지 못하도록 한다. BERT 이전의 모델들은 이러한 방법을 이용했다. (이전 모델과 BERT의 가장 큰 차이점이다!)
- Bidirectional self-attention: 각 토큰 representation을 시퀀스 내 모든 토큰을 참고해 만든다. 따라서 forward, backward direction을 모두 고려한다.
2) Transformer encoder
Transformer는 기본적으로 인코더, 디코더로 이루어지지만 BERT는 이 중 encoder만을 이용한다. 왜냐하면 BERT는 기본적으로 pre-training을 위한 모델이기 때문이다!
이는 (Bidirectional, multi-headed) self-attention과 feed forward transformation으로 구성된다. (layer normalization과 residual connection도 함께!)

3) Self-supervised Learning
BERT의 우수한 성능 이유 중 하나는 self-supervised manner로 pre-training 되었기 때문이다. 이는 labeled dataset에 국한되지 않고 raw text에서 training 될 수 있다는 점에서 가치를 지닌다. 따라서 BERT는 web 상의 수많은 데이터로 training 될 수 있었다.

이러한 Self-supervised training 방법에는 ..
- Masked Language Modeling (MLM) : 문장 내 특정 단어를 masking하고 이를 predict 하기
- Next Sentence Prediction (NSP) : 두 쌍의 문장이 주어지면 이 문장들이 서로를 따르는지 체크
◆ BERT는 어떻게 작동하는가?
그렇다면 위 구조를 가진 BERT는 실질적으로 어떻게 작동하는걸까?
BERT's Architecture
두가지의 아키텍처를 지닌다. BERT Base / BERT Large.
-> 여기서 BERT Base는 GPT와 같은 사이즈라서, fair하게 비교될 수 있다고 한다.
BERT의 Input 만들기
Raw data에서 BERT의 Input을 만들어보자. 궁금하지 않은가? 아래와 같은 프로세스이다.
- Tokenization : Raw data를 토크나이저로 쪼갠다.
- "Special" token을 삽입 : Input 시퀀스를 [CLS] 토큰으로 시작하고, [SEP] 토큰으로 끝낸다.
- Embedding : WordPiece embedding vector로 각 토큰을 바꾼다. 이제 토큰은 벡터의 시퀀스가 된다.
- 부가적인 Embedding : 시퀀스 내 각 요소에 learnable embedding을 추가해서, 각 요소의 position을 나타내도록 한다.

이를 조금 더 자세히 도식화 하면 아래와 같다. 이해가 바로 갈 것이다.

BERT Training 하기
Input을 만들었으니 training 해보자. Pre-training과 fine-tuning으로 나누어 설명하겠다.

[1] Pretraining
앞서 설명한 것처럼, MLM과 NSP를 이용해 pretraining된다. BERT는 Bidirectional self-attention을 사용하기에, 이전 모델과 같이 반복적으로 next world를 예측하도록 설계된 모델이 아니기 때문에, 이전에 사용하던 pretraining 방법을 사용할 수 없다.
먼저 MLM의 경우, 다음에 올 단어를 예측하는 태스크라고 소개했다. 학습 과정을 살펴보자.
- 전체 토큰의 15% 정도를 랜덤하게 masking 하고 ( [MASK] 토큰 이용 )
- classification layer를 통과시켜 [MASK] 자리를 예측하도록 한다.

두 문장의 관계를 보는 NSP task의 경우
- 두번째 문장이 50% 확률로 랜덤 문장으로 바뀐다.
- [CLS] 토큰에 대한 final representation은 classification module 통과해 두 문장이 매치되는지 판단한다.

[2] Fine-tuning
Pre-training을 했으니 fine-tuning을 안할 수가 없겠죠? Fine-tuning 시에는 모든 파라미터가 end-to-end로 업데이트 된다고 보면 된다. Fine-tuning task의 종류는 아래와 같다.
- Token-level task : 각 토큰에 대한 prediction
- Sentence / Document-level task : [CLS] 토큰의 output representation을 separate module에 통과시켜 sequence-level prediction이 이루어지도록 함.
- Text pair task : 문장 A, B를 각각 인코딩하고, [CLS] 토큰의 output representation을 separate module에 통과시켜 text pair에 기반에 예측하도록 함.

이렇게 BERT를 알아보았다. 아주아주 재밌는 아티클이었다!