[1810.04805] BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
We introduce a new language representation model called BERT, which stands for Bidirectional Encoder Representations from Transformers. Unlike recent language representation models, BERT is designed to pre-train deep bidirectional representations from unla
arxiv.org
1. Unsupervised Feature-based Approach와 Unsupervised Fine-tuning Approach
1.1 Unsupervised Feature-based
■ 자연어 처리(NLP)에서 단어를 표현하는 방법으로 사전 학습된 워드 임베딩은 필수적인 요소로 자리 잡았다. 이는 임베딩을 처음부터 학습하는 방식에 상당한 성능 개선을 보여주었기 때문이다.
■ 단어를 워드 임베딩 벡터로 나타내는 방법은 앞서 말한 것처럼 크게 두 가지로 나뉜다.
■ 첫 번째는 임베딩 계층(embedding layer)을 랜덤하게 초기화한 후, 학습 과정에서 임베딩을 함께 학습하는 방식으로, 위의 설명 중 후자에 해당된다.
■ 두 번째는 Word2Vec, FastText, GloVe와 같이 사전 훈련된 임베딩 벡터를 불러와 사용하는 방식으로 전자에 해당된다. 데이터가 부족한 경우, 사전 훈련된 임베딩을 사용하면 성능 향상을 기대할 수 있다.
■ 그러나 이 두 가지 방법은 모두, "하나의 단어 - 하나의 임베딩 벡터"로 매핑하기 때문에, 문맥에 따라 단어의 의미가 달라지는 다의어나, 동음이의어를 구분하지 못한다는 단점이 있었다.
■ 이러한 문제는 사전 훈련된 언어 모델을 사용하여 극복할 수 있으며, ELMo가 그 대표적인 예이다.
■ ELMo는 다음 그림과 같이 순방향 언어 모델과 역방향 언어 모델을 각각 따로 학습한 다음, 이렇게 사전 학습된 언어 모델로부터 임베딩 벡터 값을 얻는다는 아이디어였다.
■ 이러한 구조 덕분에 ELMo는 입력 시퀀스(문장)마다 임베딩 값이 문맥에 따라 달라질 수 있었다. 즉, 문맥을 반영한 특징 벡터를 추출할 수 있었기 때문에 기존 워드 임베딩에서 해결하지 못했던 문제(예: 다의어 구분 x)를 효과적으로 처리할 수 있었다."
- 예를 들어, "I went to the bank to deposit money." "The river bank was eroding."에서 "bank"는 서로 다른 문맥적 의미를 가지는데, ELMo는 이러한 문맥을 반영한 특징 벡터를 추출할 수 있다.
■ 또한, ELMo는 다음 그림과 같이 추출한 특징 벡터를 다른 nlp task를 위한 입력으로 사용할 수 있었다.
■ 그래서 ELMo는 단어에 대한 "표현(representation)" 또는 "특징(feature)" 벡터를 추출하는 '특징 추출기'의 역할을 한다고 볼 수 있다. 이렇게 추출된 특징 벡터들은 다른 작업(task)을 하기 위해 설계된 모델의 입력으로 활용된다.
■ 이렇게 "사전 학습된 모델로부터 특징(또는 표현)을 추출하고, 그 특징을 특정 태스크에 맞춘 모델(task-specific model)에 넣을 때, 추가적인 특징(feature)으로 사용하는" 접근 방식이 "feature-based"이다.
■ 이때, 위의 ELMo 그림처럼 이전 단어들로부터 다음 단어를 예측하는 언어 모델은 이전 단어들을 기반으로 다음 단어를 예측하도록 학습하기 때문에 레이블이 없는(unlabled) 텍스트 데이터로 학습이 가능하다.
■ 이러한 점에서 ELMo가 unsupervised feature-based의 전형적인 예이다.
■ 논문에서는 이러한 ELMo가 순방향(left to right) 모델에서 얻은 단어 표현(representation)과 역방향(right to left) 모델에서 얻은 표현을 얕은 깊이에서 연결하기 때문에 'not deeply bidirectional'하다는 한계가 있다고 한다. 즉, 두 모델을 통해 연결한 단어 표현이 양쪽 문맥을 깊이 있기 통합하지 못한다는 것이다. 이를 논문에서는 "shallow bidirectional"이라고 표현한다.
1.2 Unsupervised Fine-tuning
■ feature-based 방식과 마찬가지로, fine-tuning 방식의 초기 연구들도 레이블이 없는 텍스트로부터 단어 임베딩 파라미터를 사전 학습하는 것에서 시작했다.
■ 그리고 문장 또는 문서 인코더들은 입력 텍스트로부터 문맥을 반영하는 토큰 표현(contextual token representation)을 생성했다. 이러한 인코더들은 레이블이 없는 대규모의 텍스트를 사용하여 사전 학습(pre-trained)되었다.
■ 가장 중요한 차이점은, 이 사전 학습된 인코더의 학습된 파라미터를 특정 지도 학습 기반의 downstream task(예: 감성 분석)에 맞게 fine-tuned(추가 학습 또는 재학습)한다는 것이다.
■ Unsupervised Fine-tuning 핵심은 사전 학습된 모델의 가중치(parameters) 자체를 특정 작업(downstream task)에 맞게 미세 조정(fine-tuning)하는 것이다.
- 예를 들어 분류 문제라면, 사전 훈련된 모델에 분류를 수행하는 classifier layer만 추가하여 파인튜닝을 진행하면 된다.
■ 이러한 접근 방식의 장점은 처음부터 새로 학습해야 하는 파라미터가가 거의 없다는 것이다.
- 다만 이러한 모델들은 문장을 학습할 때 순방향(left to right)으로 읽을 수 밖에 없다는 한계점을 가지고 있다.
■ 이런 장점 덕분에 트랜스포머 디코더로 총 12개의 층을 쌓은 OpenAI GPT(2018)는 GLUE에서 soat(state-of-the-art) 결과를 달성했다.
■ 그러나 OpenAI GPT와 같은 모델은 순방향(left to right) 언어 모델이므로 '단방향성'이라는 한계가 있다. 이는 트랜스포머 디코더의 셀프 어텐션 메커니즘이 각 토큰이 이전 토큰만 참조할 수 있도록 제한되어 있기 때문이다. 이를 논문에서는 "unidirectional"하다고 표현한다.
■ 즉, 관련 연구인 Unsupervised Feature-based와 Unsupervised Fine-tuning을 통해 기존의 방법들이 "shallow bidirectional", "unidirectional" 하다는 한계가 있으며, 양방향 문맥 정보를 통합하는 것이 중요하다는 것을 강조한다.
1.3 Transfer Learning from Supervised Data
■ 자연어 추론 및 기계 번역과 같이 대규모 데이터셋을 사용하는 supervised tasks에서 효과적인 전이(transfer)를 보여주는 연구가 있었으며,
■ 컴퓨터 비전 연구에서도 대규모 사전 훈련된 모델로부터 전이 학습의 중요성을 입증했는데, 여기서 효과적인 방법은 ImageNet으로 사전 훈련된 모델을 미세 조정(fine-tuning)하는 것이다.
■ 컴퓨터 비전 예시처럼 대규모 데이터셋에서 이미 학습을 완료해 놓은 모델(pre-trained model)에 모델의 상단(top) 부분만 수행하고자 하는 task에 맞게 교체하고, 가지고 있는 데이터와 task에 맞게 fine-tuning으로 재학습시키는 방법을 전이 학습(transfer learning)이라고 한다.
■ 즉, 논문에서는 Transfer Learning from Supervised Data을 통해 대규모 데이터셋을 사용하여 학습한 모델에 파인튜닝을 하는 방법이 효과적인 패러다임이라는 것을 시사하고 있다.
2. BERT
■ BERT의 방법론은 Two Steps, "사전 훈련(pre-training)"과 "미세 조정(fine-tuning)" 두 가지 단계로 구성된다.
■ BERT는 아래의 Figure 1.처럼 레이블이 없는 데이터(unlabeled data)로 pre-training을 진행하고, 사전 훈련한 모델을 기반으로 특정 task(with labeled data)에 맞는 출력층을 연결(교체)한 다음, 최종 모델을 파인튜닝한다.
- Figure 1.을 보면, [CLS] 토큰과 문장 A에 해당하는 N 개의 토큰과 문장 B에 해당하는 M 개의 토큰이 BERT에 들어가는데,
- 이때, N 개의 토큰과 M 개의 토큰 각각 마스킹을 적용하며, 두 문장에 대한 토큰은 [SEP] 토큰으로 구분되는 것을 볼 수 있다.
-- 여기서 말하는 문장은 언어학적인 문장이 아니다.
■ 이를 통해, 각 downstream task은 동일한 파라미터(사전 훈련된 모델의 파라미터)로 초기화되더라도 각 taks에 맞춰 파인튜닝된 모델을 갖게 된다.
■ BERT의 특징은 이렇게 동일한 아키텍처를 여러 다른 task에 사용한다는 점이다.
■ 논문에 따르면, 사전 훈련된 아키텍처와 최종 다운스트림 아키텍처 사이에는 최소한의 차이만 존재한다고 한다.
■ 즉, BERT의 장점은 다양한 NLP 작업에 동일한 모델 구조를 사용할 수 있다는 것이다.
- 기존 연구에서도 이러한 기법을 사용한 연구가 있다.
- [1511.01432] Semi-supervised Sequence Learning에서 RNN 계열인 LSTM으로 언어 모델을 학습한 다음, 학습한 LSTM 모델을 텍스트 분류 문제에 파인튜닝한 경우, 랜덤 초기화된 LSTM 모델보다 더 좋은 성능을 얻을 수 있다는 가능성을 보여줬다.
2.1 Model Architecture
■ BERT의 모델 아키텍처는 트랜스포머 인코더를 기반으로 하는 "다층 양방향 트랜스포머 인코더(multi-layer bidirectional transformer encoder)"이다.
■ 트랜스포머 인코더의 블록(인코더 계층)의 수를 L, hidden size를 H, 셀프 어텐션 헤드의 수를 A라고 했을 때
■ GPT-1과 동일하게 L = 12, H = 768, A = 12인 \( BERT_{BASE} \)와 L = 24, H = 1024, A = 16인 \( BERT_{LARGE} \) 모델을 설정하여 실험을 수행했다
- GPT-1의 트랜스포머 블록은 디코더 블록
- \( BERT_{BASE} \)의 총 파라미터 개수는 110M(1억 1천만 개), \( BERT_{LARGE} \)의 총 파라미터 개수는 340M(3억 4천만 개)
■ 논문에 따르면, BERT와 OpenAI GPT의 차이점은,
■ BERT 트랜스포머는 양방향 셀프 어텐션(bidirectional self-attention)을 사용하는 반면, GPT 트랜스포머는 모든 토큰이 자신의 왼쪽에 있는 문맥만 참조할 수 있는 제한된 셀프 어텐션을 사용한다는 것이다.
■ 즉, BERT와 GPT 트랜스포머의 차이점은 "양방향성"이다. GPT는 기존의 언어 모델처럼 문장 내 각 단어의 표현을 학습할 때, 해당 단어(또는 토큰)의 왼쪽 문맥만 고려하지만(제한된 단방향 셀프 어텐션), BERT는 단어의 앞뒤 문맥을 모두 고려한다.(양방향 셀프 어텐션)
- BERT가 단방향성 제약을 완화한 방법은 논문의 3.1절 Pre-training BERT에 기술되어 있다.
2.2 Input/Output Representations
■ BERT가 다양한 downstream task을 처리할 수 있도록, 입력 표현으로 단일 문장, 문장 쌍(예: <Question, Answer>)을 하나의 시퀀스로 사용하였다. 이는 다양한 downstream task의 입력을 표준화한 것으로 볼 수 있다.
- 여기서 문장은 연속적인 텍스트의 임의의 범위일 수 있다.
■ 그래서 여기서 말하는 '시퀀스(sequence)'는 BERT에 입력되는 토큰 시퀀스를 의미하며, 단일 문장일 수도 있고 두 개의 문장이 함께 묶인 것일 수도 있다.
■ 논문에서는 아래 Figure 1.에서 볼 수 있듯이, 입력 임베딩을 \( E \), [CLS] 토큰의 최종 은닉 벡터를 \( C \in \mathbb{R}^H \)로, 그리고 \( i \) 번째 입력 토큰의 최종 은닉 벡터를 \( T_i \in \mathbb{R}^H \)로 표기하였다.
- \( BERT_{BASE} \)면 \( H = 768 \), \( BERT_{LARGE} \)면 \( H = 1024 \)
■ 저자들은 30,000개의 토큰 사전(vocabulary)을 가진 WordPiece 임베딩을 사용하였다.
■ 그리고 모든 시퀀스의 첫 번째 토큰은 항상 special classification token인 [CLS]를 사용하였다.
■ [CLS] 토큰에 해당하는 최종 은닉 상태(\( C \))는 "전체 시퀀스가 집약된 표현"으로, 분류 작업(classification task)을 위해 사용된다.
■ 앞서, 텍스트(문장) 쌍을 하나의 입력으로 사용한다고 하였다. 문장 쌍을 묶어서 하나의 시퀀스로 사용할 때, 문장들을 구분하는 두 가지 방식이 있다.
■ 첫 번째는 special token인 [SEP]으로 문장들을 분리하는 것이다.
■ 두 번째는 입력 시퀀스가 "sentence A, sentence B"라고 할 때, 각 토큰이 몇 번째 문장에 속하는지 구분하기 위해 임베딩을 추가한다. 이를 통해 모델이 두 문장을 구분할 수 있다고 한다.
- 앞서 말한 것처럼 여기서 말하는 문장은 언어학적인 문장이 아니다. 여기서의 문장은 연속적인 텍스트의 임의의 범위이기 때문에, [SEP]나 segment embedding이 구분하는 두 개의 문장은 두 종류의 텍스트일 수도, 두 개의 문서일 수도 있다.
■ 예를 들어, 앞의 문장에는 "sentence A embedding", 뒤의 문장에는 "sentence B embedding"을 더해준다. 이를 segment embedding이라고 부른다.
- 만약, 시퀀스에 문장 하나만 들어간다면, "sentence A embedding"만 사용한다.
■ 주어진 토큰에 대해 input 표현(input embedding)은 아래의 Figure 2.와 같이 해당 input의 토큰 임베딩, 세그먼트(segment) 임베딩, 위치 임베딩을 합산하여 구성된다.
■ 즉, "Input embedding = token embedding + segment embedding + position embedding"이다.
- 각각의 임베딩이 동일한 차원을 가지고 있으므로 단순하게 더하는 방식으로 Input embedding(Input representation)을 구성한다.
■ "I like cats"라는 텍스트와 "I like dogs"라는 텍스트가 텍스트 쌍(“I like cats”, “I like dogs”)으로 입력된다고 가정하자.
■ BERT에서는 시퀀스 시작을 알리는 스페셜 토큰 [CLS]와 문장을 구분하기 위해 사용하는 [SEP] 토큰을 사용한다. 이를 고려해서 두 문장에 대한 토큰이 다음과 같이 총 8개의 토큰으로 연결되었다고 하자.
■ 위의 그림처럼 8개의 토큰이 각각 어떤 문장에서 왔는지 구분하기 위해 다음과 같이 라벨(segment id)을 붙인다.
■ 첫 번째 문장은 시퀀스의 시작을 알리는 [CLS] 토큰부터 두 문장을 구분하는 [SEP] 토큰까지를 포함하고, 두 번째 문장은 나머지 토큰들이다.
■ 이렇게 하면 0으로 구분한 것들이 첫 번째 segment이고, 1로 구분한 것들이 두 번째 segment이다.
■ 포지션 임베딩(position embedding)도 이와 유사하다.
■ 트랜스포머에서는 사인 함수와 코사인 함수를 사용하여 위치에 따라 다른 값을 가지게 만드는 포지셔널 인코딩(positional embedding) 방법을 사용했었다.
■ 포지션 임베딩은 위치 정보를 사인/코사인 함수로 만드는 것이 아니라, 학습 가능한 임베딩 계층(embedding layer)을 사용한다.
■ 예를 들어 Figure 2.처럼 11개의 토큰이 있다면, 각각의 입력 벡터(토큰 임베딩 벡터)에 포지션 임베딩 벡터(\( E_0 \)부터 \( E_{10} \) 총 11개)를 각각 더해주면 된다.
2.2.1 전체 시퀀스의 정보가 집약되는 이유
■ 앞서, CLS] 토큰에 해당하는 최종 은닉 상태(\( C \))는 "전체 시퀀스가 집약된 표현"이라고 하였다.
■ BERT가 트랜스포머 인코더 블록을 쌓아서 만든 모델이라는 점을 생각했을 때, 전체 시퀀스의 정보가 집약되는 이유는 트랜스포머 인코더의 핵심 구성 요소인 셀프 어텐션에 있다.
■ 예를 들어 다음과 같은 입력 시퀀스가 모델의 입력으로 들어간다고 하자.
■ 트랜스포머 인코더 블록은 셀프 어텐션을 수행하고, 그 결과를 피드 포워드에 통과시켜 최종 결과를 산출한다. 그리고 이 최종 결과는 다시 다음 트랜스포머 인코더 블록에 전달된다.
■ 이 과정이 \( BERT_{BASE} \)면 총 12번, \( BERT_{LARGE} \)면 24번 반복된다. 이 과정 속에서 셀프 어텐션 메커니즘을 통해 [CLS] 토큰을 포함하여 모든 토큰이 서로의 정보를 참조하게 된다.
■ 그리고 모델 출력에서 다음과 같이 768차원의 벡터를 출력한다. (\( BERT_{BASE} \) 기준)
■ 위의 그림에서 파란색 벡터가 첫 번째 위치에서의 출력. 즉, 스페셜 토큰 [CLS]의 결과인 \( C \)이다.
■ 이 예에서는 [CLS], Help, Prince, Mayuko 토큰이 트랜스포머 인코더 스택의 입력으로 들어간다.
■ [CLS] 토큰은 다른 토큰들과 달리 토큰 시퀀스의 첫 번째 토큰으로 사용되는 토큰이므로, Help, Prince, Mayuko처럼 문법적 구조나 어떤 의미를 지니는 일반적인 토큰이 아니지만,
■ 각 인코더 블록에서 셀프 어텐션을 거치면서 [CLS] 토큰의 최종 벡터는 토큰 시퀀스 내의 다른 토큰들의 정보를 가중합 형태로 반영하게 되며, 결과적으로 토큰 시퀀스 내의 다른 토큰들의 의미를 잘 반영한 벡터 표현이 될 것으로 기대할 수 있다.
■ 이는 [CLS] 토큰 뿐만 아니라 다른 토큰들도 전부 마찬가지이다. 예를 들어, Prince도 셀프 어텐션을 통해 입력으로 들어간 모든 토큰들인 [CLS], Help, Prince, Mayuko를 참고하게 된다.
- 이 그림은 각 토큰이 모든 토큰을 참고하는 트랜스포머 인코더의 셀프 어텐션 과정을 화살표로 표현한 그림이다.
■ 이렇게 하나의 토큰이 모든 토큰을 참고하는 연산은 \( BERT_{BASE} \)면 12개의 층에서 전부 이루어지는 연산이며, 첫 번째 인코더 블록의 결과는 두 번째 인코더 블록의 입력으로 들어가고, 이런 방식으로 모든 인코더 블록을 지난 후에 최종적으로 출력 임베딩(또는 표현)을 얻게 되는 것이다.
■ 논문 3.2절 Fine-tuning BERT에서는 분류 작업 시, special classification token인 [CLS] 토큰의 최종 은닉 벡터 \( C \)에 output layer를 연결하여 분류를 수행한다고 설명한다.
cf) 아래의 주소에서 BERT, GPT-2, T5 등의 트랜스포머 언어 모델에서 어텐션 결과에 대한 시각화를 볼 수 있다.
위의 그림은 모든 레이어와 헤드에 대한 어텐션의 결과를 보여준다.
GitHub - jessevig/bertviz: BertViz: Visualize Attention in NLP Models (BERT, GPT2, BART, etc.)
GitHub - jessevig/bertviz: BertViz: Visualize Attention in NLP Models (BERT, GPT2, BART, etc.)
BertViz: Visualize Attention in NLP Models (BERT, GPT2, BART, etc.) - GitHub - jessevig/bertviz: BertViz: Visualize Attention in NLP Models (BERT, GPT2, BART, etc.)
github.com
2.3 Pre-training BERT
■ BERT를 사전 훈련하기 위해 전통적인 단뱡향(순방향(left to right) 또는 역방향(right to left))언어 모델을 사용하지 않고, 두 가지 비지도 학습의 task(MLM, NSP)를 사용하여 위의 Figure 1.처럼 BERT를 사전 훈련한다.
2.3.1 Task #1: Masked LM(MLM)
■ 입력-출력 방향으로 깊은 양방향(deep bidirectional) 모델을 생각하면, 직관적으로 단방향 모델(순방향 또는 역방향)이나 순방향과 역방향 모델의 얕은(shallow) 연결보다 더 성능이 좋을 것이라 기대할 수 있다.
■ 그러나 양방향 언어 모델을 구현하는 경우는 거의 없다. 일반적인 '조건부 언어 모델'은 순방향 또는 역방향으로만 훈련될 수 있다.
■ 왜냐하면, 양방향은 다음 그림처럼 다층 구조에서 정보가 양쪽으로 흐르기 때문에, 결국 자기 자신(현재 시점의 입력)과 예측하려는 단어의 정보를 미리 보게 되는 문제가 있기 때문이다.
■ 위의 우측 그림에 있는 양방향 언어 모델을 보면, <sos>를 입력받아 'I'를 예측하고, 다시 'I'로 'am'을 예측할 때, 'am'과 연결된 출력층(회색 박스)은 순방향 언어 모델의 정보(초록색 박스)외에 역방향 언어 모델의 정보(주황색 박스)도 함께 받는 것을 볼 수 있다.
■ 'am'을 예측하는 시점에서 순방향 언어 모델의 정보는 <sos>와 'I'이지만, 역방향 언어 모델은 'a', 'am', 'I'에 대한 정보를 가지고 있는 상태이다. 즉, 예측해야 하는 단어를 역방향 언어 모델이 미리 관측한 것이다. 이런 문제 때문에 언어 모델은 보통 양방향으로 구현하지 않는다.
■ 위의 왼쪽 그림에 있는 단방향 언어 모델은, 앞서 설명한 것처럼 단방향성이라는 한계가 있다.
■ 양방향성을 중요시하는 이유는 언어의 문맥은 양방향성을 띠고 있기 때문이다.
■ 문장은 단순히 단어들이 순서대로 나열되는 것을 넘어, 앞선 정보가 뒤따르는 정보를 이해하는 데 영향을 미치며, 동시에 뒤따르는 정보가 앞선 정보의 의미를 명확히 하는데 기여한다.
■ 예를 들어, "나는 과일을 좋아한다. 특히 배가 맛있다"라는 문장에서 '배'는 먹는 과일, 선박, 신체 부위 등의 의미를 지닌다.
■ 이때, 앞부분의 정보가 없으면 '배'가 '과일'을 의미하는지 알 수 없으며, 뒷부분의 정보가 없으면 어떤 종류의 과일을 좋아하는지 명확히 알 수 없다.
■ BERT는 "deep bidirectional representation"을 훈련하기 위해, 입력 토큰 중 일부 비율을 무작위로 마스킹한 다음, 그 마스크된 토큰들을 예측한다. 이를 "마스크드 언어 모델(Masked LM, MLM)이라고 부른다.
Input: the man went to the [MASK1] . he bought a [MASK2] of milk.
Labels: [MASK1] = store; [MASK2] = gallon
- 클로즈(Cloze) 작업이라고도 불린다.
- 이 아이디어는 영어 문장에 빈칸을 만들고, 그 빈칸을 들어갈 올바른 단어를 선택하는 문제를 생각하면 된다. 이 빈칸에 어떤 단어가 들어가야 적절한지 판단하려면 문장의 앞부분과 뒷부분을 모두 고려해야 한다.
■ 마스크 토큰의 최종 은닉 벡터들은 일반적인 언어 모델에서처럼 단어 집합(vocabulary)에 대한 소프트맥스 함수에 통과시켜 마스크 토큰이 무엇이었는지 예측한다.
■ 예를 들어, "the man went to the store. he bought a gallon of milk"라는 문장에서 store는 [MASK], gallon은 gas로 바꾸고, of는 of 그대로 유지한다고 하자.
■ 그러면 BERT는 [MASK] 토큰이 원래 단어가 무엇이었는지, 변경된 단어의 원래 단어가 무엇이었는지, 변경되지 않은 단어에 대해서도 원래 단어가 무엇인지를 예측한다.
- 'of'는 변경되지 않았지만, 모델 입장에서 이 단어가 변경된 단어인지 아닌지 모르기 때문이다.
■ BERT는 출력층에서 다른 위치에서의 예측은 무시하고, 이 3개의 위치에 대해서만 예측을 수행한다. 앞서 말한 것처럼 이 3개 위치에 대해 단어 집합에 대한 소프트맥스 함수를 사용하여, 원래 단어들이 무엇인지를 예측하게 된다.
2.3.1.1 Masking Procedure
■ 논문에 있는 모든 실험에서 각 시퀀스의 모든 WordPiece 토큰 중 15%를 무작위로 마스킹한다. 15%의 [MASK] 토큰을 만들 때, 무작위로 15%를 선택하는 것이다.
■ 이 방법의 한 가지 단점은 pre-training과 fine-tuning 사이에 불일치가 발생한다는 것이다. [MASK] 토큰을 pre-training에서만 사용하고 fine-tuning 시에는 사용하지 않기 때문이다.
■ 이 불일치를 완화하기 위해 단어를 항상 [MASK] 토큰으로 대체하지 않는다. 정확하게는 무작위로 선택된 토큰들에 대하여 다음과 같은 규칙이 적용된다.
- 만약 \( i \) 번째 토큰이 선택되었다면, \( i \) 번째 토큰을 다음과 같이 대체한다.
- (1) 80%의 경우(10번 중에 8번은) 단어를 [MASK]로 변경한다.
-- ex) my dog is hairy \( \rightarrow \) my dog is [MASK]
- (2) 10%의 경우(10번 중에 1번은) 단어를 무작위 단어로 변경한다.
-- ex) my dog is hairy \( \rightarrow \) my dog is apple
- (3) 10%의 경우(10번 중에 1번은) 단어를 원래대로 유지한다.
-- ex) my dog is hairy \( \rightarrow \) my dog is hairy
- 그리고 \( i \) 번째 토큰의 최종 은닉 벡터인 \( T_i \)는 cross entropy loss를 통해 원래 토큰을 예측하는 데 사용된다.
- 저자들은 이렇게 했을 때 pre-training과 fine-tuning 사이에 불일치가 해소된다고 주장한다.
■ 이렇게 BERT는 기존 LM처럼 타겟 시퀀스 전체. 즉, 문장 전체를 예측하는 방법이 아닌, 마스크 토큰만 예측하는 방법으로 사전 훈련(pre-training)한다.
■ 정리하면, BERT의 사전 학습 방식 중 하나인 MLM에서, 트랜스포머 인코더는 입력 문장의 일부 토큰이 [MASK]로 가려지거나 임의의 다른 단어로 변경된 상태의 문장을 받게 된다.
■ 이때 인코더는 어떤 위치의 단어가 가려졌는지, 또는 어떤 단어로 대체되었는지, 원래 토큰 그대로인지 처음에는 알 수가 없다. 그저 [MASK] 토큰 또는 변경된 토큰을 포함한 전체 문맥을 바탕으로, 원래 그 자리에 어떤 단어가 있었을지를 예측하는 과제를 수행하게 된다.
■ 이는 트랜스포머 디코더의 '마스크드 셀프 어텐션(masked self-attention)'과 중요한 차이점이다. 디코더는 다음 단어를 생성할 때 현재 예측하려는 위치의 왼쪽에 있는 토큰들만 참조하도록 제한되어 단방향으로 정보를 처리한다.
■ 이는 모델이 특정 토큰을 예측할 떄, 해당 토큰 자체를 보거나 미래의 토큰을 볼 수 없도록 제약하기 위함이다.
■ 이러한 단방향성은 문장 수준의 작업에는 어느 정도 효과가 있지만, 질문-응답(Question-Answering)처럼 양쪽 문맥이 모두 중요한 토큰 수준의 작업에서는 한계가 있다.
■ 하지만 BERT의 인코더(트랜스포머 인코더)는 다르다. 인코더의 셀프 어텐션(self-attention) 메커니즘은 기본적으로 시퀀스 내의 모든 토큰 위치에서 정보를 참조할 수 있다.
■ MLM 작업에서는 이 셀프 어텐션 메커니즘을 활용하므로, [MASK] 토큰의 원래 값을 예측하기 위해 해당 토큰의 왼쪽 문맥과 오른쪽 문맥을 모두 종합적으로 고려하게 된다.
■ 즉, [MASK] 토큰을 예측하는 것이 목표이고, 이를 위해 셀프 어텐션을 통해 문장 전체의 양방향 정보를 활용하는 것이다. 또한, 이 예측은 크로스 엔트로피 손실(cross entropy loss)을 최소화하는 방향으로 학습된다.
■ 이처럼 마스킹된 토큰([MASK])을 예측하기 위해 인코더의 셀프 어텐션 메커니즘으로 주변의 양쪽 문맥을 모두 활용하도록 학습되는 것이 BERT가 양방향 표현을 얻는 방식이다.
■ 또한, BERT는 다층의 트랜스포머 인코더 블록을 쌓았기 때문에 multi-layer로 볼 수 있다. 그러므로 MLM(사전 훈련 방식)과 다층 트랜스포머 인코더(모델 아키텍처)를 통해 "deep bidirectional representation"이 학습된다고 할 수 있다.
■ 아래의 그림은 masked LM(MLM)의 학습 과정을 보여준다.
■ 원래 단어 \( W_1, W_2, W_3, W_4, W_5 \) 중에 \( W_4 \)가 마스킹되어 모델의 입력으로 들어가며, 트랜스포머 인코더 블록들을 거치면서 \( O_4 \)라는 출력 결과를 얻게 된다.
■ 이 출력 결과가 fully-connected 계층과 GELU 활성화 함수, 정규화를 거쳐 나오게 되는 \( W'_4 \)이 실제 토큰인 \( W_4 \)가 되도록 학습을 시켜주는 것이다.
2.3.2 Task #2: Next Sentence Prediction(NSP)
■ 질문 응답(Question Answering, QA))이나 자연어 추론(Natural Language Inference, NLI)과 같은 downstream task은 두 문장 간의 "관계(relationship)"를 파악하는 것이 핵심이다.
■ 그러나 이 관계는 언어 모델링(language modeling)만으로는 바로 잡히지 않는다. Task #2인 Next Sentence Prediction (NSP)는 이러한 두 문장 간 관계 이해 능력을 사전 학습하기 위해 설계되었다.
- 언어 모델링은 이전 단어들이 주어졌을 때, 다음 단어를 예측하는 것
■ 저자들은 문장 관계를 이해하는 모델을 훈련하기 위해, 어떤 단일 언어 말뭉치(monolingual corpus)에서 "다음 문장 예측(next sentence prediction)" 작업을 사전 훈련하였다.
■ 구체적으로, 각 사전 훈련을 위한 예시(example)로 두 개의 문장. 문장 A와 문장 B를 선택할 때,
- 50%의 경우 문장 B는 문장 A 다음에 실제로 오는 문장(IsNext로 레이블링 되어 있음)을,
- 나머지 50%의 경우 문장 B는 말뭉치에서 랜덤으로 선택한 문장(NotNext로 레이블링 되어 있음)을 선택하였다.
Input = [CLS] the man went to [MASK] store [SEP] he bought a gallon [MASK] milk [SEP]
Label = IsNext
- Is Next는 실제로 오는 다음 문장
Input = [CLS] the man [MASK] to the store [SEP] penguin [MASK] are flight ##less birds [SEP]
Label = NotNext
- NotNext는 다음 문장이 아님
■ 이때, 위의 Figure 1.에서 볼 수 있듯이 \( C \) ([CLS] 토큰의 최종 은닉 상태)가 다음 문장 예측(NSP)에 사용된다.
- 논문에 따르면, 이러한 Binarized NSP가 downstream task 중, 두 문장의 관계를 이해해야지 풀 수 있는 질의-응답(QA) task와 자연어 추론(NLI) task에 도움이 많이 되었다고 한다.
■ 이러한 BERT의 비지도 사전 훈련 작업은 깊이 있는 양방향 문맥을 이해(MLM)할 뿐만 아니라, 문장 간의 관계성까지도 학습(NSP)한다.
■ 사전 훈련 과정에서 MLM과 NSP를 따로 학습하는 것이 아니라 MLM에서의 loss와 NSP에서의 loss를 합하여 학습이 동시에 이루어지기 때문이다.
■ 이렇게 사전 훈련된 모델의 모든 파라미터를 전이(transfer)하여 end task 모델의 파라미터를 초기화한다.
2.3.3 Pre-training data
■ pre-training의 기본적인 절차는 LM에서 수행하는 것과 같다.
■ 사전 훈련 말뭉치로 BooksCorpus(8억 개의 단어)와 영어 위키피디아(25억 개의 단어)를 사용한다.
- 위키피디아의 경우 텍스트 구절만 추출하여 사용
■ BERT 사전 학습 데이터의 중요한 특징은 문서 수준(document-level) 말뭉치를 사용했다는 점이다.
■ NSP를 위한 긴 연속 시퀀스를 추출할 때, Billion Word Benchmark처럼 문장 순서가 섞인 말뭉치 대신, 문장(sentence)들의 집합이라 할 수 있는 문서 수준의 말뭉치를 사용한다.
■ 그 이유는 문장들이 원래 순서대로 유지된 말뭉치 데이터를 학습에 사용해야 NSP같이 문장 간의 연속성을 학습할 수 있기 때문이다.
■ Billion Word Benchmark처럼 문장들이 섞여 있는 말뭉치는 "다음 문장(next sentence)"이라는 개념이 성립되지 않기 때문에 NSP 학습을 위한 데이터로는 부적절하다.
2.4 Fine-tuning BERT
■ 텍스트 쌍을 입력으로 다루는 문제에서 과거의 방식은 각 텍스트를 독립적으로 인코딩해야 했다. 그러나 BERT는 셀프 어텐션으로 기존 방식처럼 각각 인코딩해야 하는 단계를 통합한다.
■ 연결된 텍스트 쌍(예: 문장 A, 문장 B, 문장 A와 B는 서로 다른 문장)에 셀프 어텐션을 적용하는 것은 문장 간의 토큰들 사이의 관계를 얻기 위해, 마치 양방향 크로스 어텐션을 하는 것과 같다.
- 트랜스포머 디코더 크로스 어텐션은 인코더에서 생성된 표현과 디코더의 현재 입력 사이의 어텐션이었다.
- 즉, 크로스 어텐션은 입력의 출처가 서로 다른 시퀀스에 어텐션 연산을 하는 것을 의미한다.
■ 파인튜닝(fine-tuning) 방법은 매우 간단하다. 트랜스포머 인코더 구조를 기반으로 하는 BERT는 셀프 어텐션 메커니즘을 통해 비지도 학습의 사전 훈련(MLM, NSP) 작업으로 사전 훈련되기 때문에 단일 텍스트든 텍스트 쌍이든 입력과 출력을 바꿔주는 것만으로도 많은 downstream task을 모델링할 수 있다.
■ task별로 각 task에 적절한 입력과 출력을 BERT에 연결하고, 연결된 전체 모델의 모든 파라미터를 end-to-end로 파인튜닝하면 된다. 이러한 방식(사전 훈련된 모델을 연결) 덕분에 "처음부터 학습"해야 할 파라미터가 적다.
■ 정리하면, 셀프 어텐션 메커니즘으로 MLM 및 NSP와 같은 사전 학습 작업(task)을 수행하여 심층적인 양방향 표현을 학습했기 때문에 다양한 입력 구조를 처리할 수 있으므로, BERT 모델의 주요 아키텍처를 그대로 유지하면서, task의 특성에 따라 최소한의 구조만 변경하여 task별로 모델을 만들 수 있는 것이다.
■ 사전 훈련(pre-training)과 비교했을 때, 파인튜닝(fine-tuning)은 상대적으로 저렴하다. 사전 훈련된 모델을 다양한 NLP 다운스트림 태스크에 최소한의 태스크별 구조 변경만 하기 때문이다.
2.4.1 입력
■ task에 따라 파인튜닝 방식이 달라진다. 논문에서는 4가지의 입력 유형을 소개한다.
- (1) sentence pairs in paraphrasing
- (2) hypothesis-premise pairs in entailment
- (3) question-passage pairs in question answering
- (4) a degenerate text-∅ pair in text classification or sequence tagging
2.4.2 출력
■ 출력 레이어는 task 유형에 따라 달라진다. 시퀀스 태깅이나 질의-응답 같은 토큰 수준(token-level)의 task의 경우,
- 출력 부분에서 토큰 표현(token representation)은 token-level task를 위한 출력 레이어(output layer)에 입력(연결)되고,
- 추론(entailment)이나 감정 분석(sentiment analysis)같은 분류(classification) task의 경우, [CLS] 토큰에 해당하는 최종 은닉 표현(벡터)이 출력 레이어에 입력(연결)된다.
참고) https://seungseop.tistory.com/35
BERT의 [CLS]토큰은 어떻게 sentence의 정보를 담고 있을까?
BERT와 이로부터 파생된 다양한 언어 모델에서는 가장 첫 위치에 문장 공통 토큰인 [CLS]를 두어 해당 위치의 임베딩 결과를 대표 임베딩으로 사용한다. 예컨대, BERT-base 모델은 토큰의 길이가 512이
seungseop.tistory.com
'자연어처리' 카테고리의 다른 글
BERT(Bidirectional Encoder Representations from Transformers) (3) (0) | 2025.05.18 |
---|---|
BERT(Bidirectional Encoder Representations from Transformers) (2) (0) | 2025.05.17 |
트랜스포머(Transformer) (4) (0) | 2025.04.24 |
트랜스포머(Transformer) (3) (0) | 2025.04.21 |
트랜스포머(Transformer) (2) (0) | 2025.04.19 |