BERT: 양방향 문맥을 학습하는 방법

BERT — Jacob Devlin 외

목차

문서 분류나 개체 추출을 만드는 개발자라면 같은 단어도 주변 문장에 따라 다르게 읽혀야 한다는 문제를 만난다. BERT는 일부 단어를 가린 뒤 앞뒤 문맥으로 복원하도록 학습해 이 문제를 다룬다. 이 글에서는 그 학습 방식이 왜 필요한지, 사전 학습한 모델을 분류와 추출에 어떻게 옮기는지 살펴본다.

읽은 논문은 Jacob Devlin·Ming-Wei Chang·Kenton Lee·Kristina Toutanova의 BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding다. 리뷰는 2019년 5월 24일의 arXiv v2를 기준으로 한다.

빈칸의 양쪽을 읽어야 하는 이유

다음은 원리를 설명하려고 만든 영어 예문이다.

The bank approved the loan.
The bank was covered with sand.

첫 문장의 bank는 금융기관이고 둘째 문장에서는 강가로 읽힌다. The bank까지만 본 시점에는 구분할 단서가 부족하다. 뒤의 loan이나 sand까지 읽어야 각 토큰에 문맥을 반영한 표현을 만들기 쉽다.

왼쪽에서 오른쪽으로 읽는 언어 모델도 문장의 마지막에서는 앞 문맥을 모을 수 있다. 다만 중간 토큰의 표현에는 오른쪽 문맥이 없다. 개체의 경계를 찾거나 지문 속 답의 위치를 고를 때는 그 차이가 직접 영향을 준다.

BERT의 Transformer 인코더는 각 층에서 토큰들이 앞뒤를 함께 참조한다. 여기서 평범한 다음 단어 예측을 그대로 쓰면 예측할 정답이 입력에 드러나 너무 쉬운 문제가 된다. 학습할 토큰 일부를 가리고 그 원래 값을 맞히는 masked language model, MLM이 필요하다.

입력: The [MASK] approved the loan.
목표: 가려진 위치의 원래 토큰 bank를 예측

이 예에서는 approved와 loan도 빈칸을 해석하는 단서다. [MASK]는 입력 토큰을 바꾼 표시이고 오른쪽을 못 보게 하는 causal attention mask와는 역할이 다르다.

기여는 양쪽 문맥을 붙이는 위치에 있다

BERT 이전에도 양방향 문맥을 이용하는 표현은 있었다. ELMo 원문은 왼쪽에서 읽는 언어 모델과 오른쪽에서 읽는 언어 모델을 학습하고 각 층의 표현을 downstream 과제에 맞춰 섞는다. 따라서 BERT의 기여를 “처음으로 앞뒤를 읽었다”로 설명하면 선행 연구를 놓친다. BERT에서는 같은 층의 표현을 만드는 동안 양쪽 정보가 만나고 그 결과가 다음 층의 입력이 된다. 따로 읽은 두 표현을 마지막에 연결하는 구조와 정보가 결합되는 위치가 다르다.

이 차이를 가능하게 한 것이 MLM이다. 가린 위치의 정답을 잘 예측할수록 손실이 작아지므로 모델은 그 위치의 표현에 주변 단서를 모으도록 학습한다. 손실은 선택한 위치에만 있지만 그 표현을 만드는 데 다른 토큰과 attention 층이 참여하므로 학습 신호도 그 계산 경로로 전달된다. 일부 위치만 예측하는 것이 다른 위치의 표현을 전혀 학습하지 않는다는 뜻은 아니다. 이는 원문의 학습식에서 따라오는 설명이다. BERT 사전 학습

또 하나의 기여는 이 표현을 쓰기 위해 과제별 구조를 크게 바꾸지 않아도 되게 한 점이다. 질문과 지문을 하나의 입력에 넣으면 두 텍스트 사이의 관계도 같은 self-attention에서 계산된다. 사전 학습 때 문맥을 결합한 계산을 미세 조정에서도 유지하고 출력할 위치만 과제에 맞게 바꾼다. 이 통일된 사용 방식과 여러 과제의 실험을 함께 봐야 BERT가 단순한 빈칸 맞히기 모델 이상의 기여를 한 이유가 보인다.

모든 단어를 가리지는 않는다

원 논문은 WordPiece 토큰 위치의 15%를 예측 대상으로 고른다. 선택된 위치만 놓고 보면 80%는 [MASK], 10%는 임의 토큰, 나머지 10%는 원래 토큰을 유지한다. 손실은 이 선택된 위치에서 계산한다.

15%와 80%의 분모가 다르다. 아래는 토큰 100개를 대상으로 비율을 풀어 쓴 기대 개수다. 실제 무작위 선택의 결과가 매번 이 개수로 고정된다는 뜻은 아니다.

선택된 위치의 처리선택된 15% 안의 비율전체 토큰 100개에서 기대 개수
[MASK]로 변경80%12개
임의 토큰으로 변경10%1.5개
원래 토큰 유지10%1.5개

원래 토큰도 남기는 이유는 학습과 실제 사용의 입력 차이를 줄이려는 것이다. 분류나 질문 응답에 쓸 문장에는 보통 [MASK]가 없다. 학습 중 가려진 입력만 만나면 정상 문장을 읽을 때와 조건이 달라진다. 임의 토큰과 원래 토큰을 섞는 처리는 그 차이를 완화한다(BERT의 학습 방식).

원래 BERT는 다음 문장 예측인 NSP도 함께 학습했다. 문장 A 뒤의 B가 실제 다음 문장인 경우와 무작위 문장인 경우를 각각 절반씩 구성한다. 이를 모든 후속 인코더가 따라야 할 규칙으로 읽기보다는, 이 논문의 학습 설계로 이해하는 편이 정확하다.

같은 인코더를 분류와 추출에 옮긴다

사전 학습은 문맥을 읽는 출발점을 만든다. 실제 과제에는 정답 라벨을 붙인 데이터로 미세 조정하는 단계가 이어진다. BERT는 과제마다 사전 학습된 파라미터에서 출발하고 출력층과 인코더를 함께 학습한다. 하나의 미세 조정된 모델이 모든 과제를 동시에 푸는 구성은 아니다.

과제표현을 읽을 위치출력의 의미
문장 분류문장 앞의 [CLS]문장 전체의 라벨
토큰 단위 분류각 토큰의 표현각 위치의 개체 유형 등
지문 기반 질문 응답지문 토큰들의 표현답 구간의 시작·끝 위치

예를 들어 Mina works at Acme.에서 인물과 조직을 추출하려면 문장 전체가 “업무 관련”인지 분류하는 것만으로는 부족하다. Mina와 Acme가 어디 있는지 출력해야 한다. 반대로 고객 문의를 결제·배송으로 나눌 때는 모든 개체 구간을 찾을 필요가 없다. 출력 단위를 먼저 고르면 어떤 표현에 출력층을 붙일지도 정해진다.

원 논문은 [CLS]를 미세 조정 없이 좋은 범용 문장 임베딩으로 간주하지 말라는 단서도 둔다. NSP를 학습한 표현과 검색에 필요한 문장 간 유사도를 잘 나타내는 표현은 같은 요구가 아니다.

양방향 문맥의 효과는 같은 조건에서 읽는다

크게 알려진 GLUE 종합 점수만 보면 모델 크기와 학습 방식의 효과가 섞이기 쉽다. 여기서는 저자가 BERT_BASE 구조, 사전 학습 데이터, 미세 조정 방식과 하이퍼파라미터를 맞춘 학습 목적 소거 실험을 읽는다. 다음 값은 직접 재현한 결과가 아니라 원 논문이 보고한 개발 세트 점수다.

사전 학습·추가 구조MNLI-m 정확도 (%)QNLI 정확도 (%)MRPC 정확도 (%)SQuAD 1.1 F1
BERT_BASE: MLM + NSP84.488.486.788.5
MLM, NSP 제거83.984.986.587.9
왼쪽 문맥 LM, NSP 제거82.184.377.577.8
바로 위 모델에 BiLSTM 추가82.184.175.784.9

출처는 BERT의 학습 목적 비교다. 원 표의 SST-2 열만 생략했다. SQuAD의 F1과 분류 정확도는 서로 다른 지표이므로 열을 가로질러 평균 내지 않는다.

둘째·셋째 행은 NSP가 모두 없는 조건이다. SQuAD F1은 87.9에서 77.8로 내려간다. 왼쪽 문맥 모델 위에 양방향 LSTM을 붙이면 84.9로 회복되지만 처음부터 양방향 문맥으로 사전 학습한 모델에는 못 미친다. 오른쪽 문맥을 출력 직전에 더하는 방법과 인코더의 여러 층에서 함께 학습하는 방법이 같은 결과를 내지 않았다는 비교다.

첫째·둘째 행에서는 QNLI 정확도가 88.4%에서 84.9%로 내려간다. 이는 해당 조건에서 NSP의 기여를 뒷받침한다. 다른 데이터와 학습 설계에서도 NSP가 반드시 유리하다는 증명까지 제공하지는 않는다.

이 표에서 가장 강한 결론은 토큰의 답 위치를 찾는 과제에서는 양방향 사전 학습이 출력 단계의 보완만으로 대체되지 않았다는 것이다. 다만 둘째·셋째 행은 문맥 방향뿐 아니라 예측 목적도 MLM과 다음 토큰 예측으로 달라진다. 같은 손실 아래 오른쪽 문맥만 제거한 실험이 아니므로 F1 차이 전부를 방향 하나의 효과로 분해할 수는 없다. 방향과 그 방향으로 학습할 수 있게 한 목적을 함께 평가한 비교다.

NSP에서도 실제 다음 문장과 무작위 문장을 구분하는 능력이 논리적 함의나 담화 순서의 이해와 같지는 않다. 무작위 문장이 다른 주제라면 주제 차이도 예측 단서가 될 수 있다. 원문의 downstream 개선은 유효한 결과지만 그것만으로 모델이 어떤 문장 관계를 배웠는지 확정할 수 없다. 학습 목표의 이름보다 평가에서 어떤 관계를 실제로 확인했는지 읽어야 한다.

표현을 배웠다고 모든 입력을 이해하는 것은 아니다

원 BERT는 영어 BooksCorpus와 Wikipedia로 사전 학습했고 입력 길이는 최대 512 토큰이다. 이 리뷰의 영어 예문에서 원리를 이해했더라도 한국어 문서나 길이가 긴 계약서에 원 모델을 그대로 적용할 때의 품질은 별도로 확인해야 한다. 문서를 잘라 넣으면 토큰 수는 줄지만 잘린 구간 바깥의 문맥은 사라진다.

양방향으로 읽을 때도 토큰 사이의 관계를 이용한다. 문장이 사실인지 외부 자료와 대조하는 기능은 아니다. 모델에 들어간 문맥, 사전 학습의 언어·도메인, 미세 조정 라벨이 각각 결과를 제한한다.

실무에서 이 논문을 다시 꺼낼 때는 “어떤 BERT를 쓸까”보다 출력할 단위가 문장인가, 토큰인가, 구간인가를 먼저 정해 보자. 같은 문의에서 회사 이름을 찾는 일과 문의 유형을 분류하는 일은 입력이 같아도 다른 과제다. 라벨 20개로 문의를 분류하는 모델의 성공이, 그 안의 인물 이름을 정확히 찾는 성공까지 뜻하지는 않는다.

원문

  • Jacob Devlin, Ming-Wei Chang, Kenton Lee, Kristina Toutanova. BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding. arXiv v2, 2019년 5월 24일, PDF.