BERT란 무엇인가?
🚀 BERT란 무엇인가 ?
BERT, Bidirectional Encoder Representations from Transformers는
Transformers로 부터의 양방향(Bidirectional) Encoder 표현(Representations)으로
2018년 11월 Google이 공개한 사전 훈련된(Pre-trained) 언어 모델이다.
트랜스포머를 이용해 구현되었으며 위키피디아 (25억 단어)와 BooksCorpus(8억 단어)와 같은 레이블(label)이 없는 텍스트 데이터로 훈련되었다.
BERT가 높은 성능을 얻을 수 있었던 것은, 레이블이 없는 방대한 데이터로 사전 훈련된 모델을 가지고, 레이블이 있는 다른 작업(Task)에서 추가 훈련과 함께 하이퍼파라미터를 재조정하여 이 모델을 사용하면 성능이 높게 나오는기존의 사례들을 참고하였기 때문이다.
🚀 Transformers란 ?
Transformers는 2017년 Google이 발표한 Attention is All You Need라는 논문에서 사용된 딥러딩 모델이다.
Encoder-Decoder 구조로 설계되었다.
기존의 seq2seq의 구조인 Encoder-Decoder를 따르면서도, Attention 만으로 구현한 모델이다.
Transformers에서 Encoder는 입력값을 양방향으로 처리하고, Decoder는 입력값을 왼쪽에서 오른쪽으로
단방향으로 처리한다는 큰 차이점을 가지고 있다.
Attention이란 ?
간단하게 "어떠한 기능을 하는 함수" 정도로 이해하면 된다.
기본 아이디어는 디코더에서 출력된 단어를 예측하는 매 시점(time step)마다,
인코더에서의 전체 입력 문장을 다시 한번 참고한다는 점이다.
단, 전체 입력 문장을 전부 다 동일한 비율로 참고하는 것이 아니라,
해당 시점에서 예측해야 할 단어와 연관이 있는 입력 단어 부분을 좀 더 집중(Attention)해서 보게 된다.
제대로 이해하려면 이 글을 참고하자
Attention is All You Need 논문에서 사용된 Transformers라는 모델의 Encoder를 사용하여 만든 것이 BERT이다.
🚀 Self-Attention 알고리즘
Transformer에서 BERT로 가져온 중요한 구조는 Self-Attention 알고리즘이다.
BERT의 Encoder Layer는 Feed Forward Neural Network와 Self-Attention 두가지로 나뉜다.
Feed Forward 부분은 그저 Dense Layer를 각각의 토큰에 대해서 취한 결과를 내놓는 것이다.
따라서 Encoder의 핵심은 Self-Attention 부분에 있다.
Self-Attention은 Bidirectional한 학습을 위해서
한쪽 방향에서 다른쪽 방향으로 토큰을 처리하는 부분이 없이
한번에 Contextual한 정보를 얻는 방식으로
BERT 모델이 성공적으로 자연어 처리를 할 수 있게 도와주는 핵심 구조이다.
Self-Attention은 한 단어와 나머지 다른 단어의 관계정보를 처리할 수 있도록 하기 위해 존재한다.
🚀 Encoder란 ?
그렇다면 BERT에는 Encoder가 어떻게 사용되었는가 ?
BERT는 N개의 인코더 블럭을 지니고 있다.
BERT의 기본 구조는 트랜스포머의 인코더를 쌓아올린 구조이다.
Base 버전에서는 총 12개를 쌓았으며, Large 버전에서는 총 24개를 쌓았다.
이는 입력 시퀀스 전체의 의미를 N번 만큼 반복적으로 구축하는 것을 의미한다.
당연히 인코더 블럭의 수가 많을수록 단어 사이에 보다 복잡한 관계를 더 잘 포착할 수 있을 것이다.
인코더 블럭은 이전 출력값을 현재의 입력값으로 하는 RNN과 유사한 특징을 지니고 있다.
따라서 이 부분은 병렬 처리가 아닌 Base 모델은 12번, Large 모델은 24번,
전체가 Recursive하게 반복 처리되는 형태로 구성되며
블럭내에서 각각의 입력과 처리 결과는 도식에서 보는 바와 같이
매번 Residual connections로 처리하여 이미지 분야의 ResNet이 보여준 것 처럼
그래디언트가 non-linear activations를 거치지 않고 네트워크를 직접 흐르게 하여
Exploding 또는 Vanishing Gradients 문제를 최소화 하고자 했다.
🚀 Bidirectional ?
그렇다면 BERT의 Bidirectional의 의미는 무엇인가 ?
지금까지의 NLP 관련 모델들은 학습시킬 때 좌 → 우 또는 우 → 좌 방향으로 데이터를 학습시켰다.
쉬운 이해를 위해 좌 → 우 방향으로 학습시키는 상황을 가정해보자
좌 → 우 방향으로 데이터를 학습시킨다 라는 말은
모델의 입력 데이터로 들어가는 문장이 있을 때
문장 앞의 N개의 단어를 이용해 그 뒤에 나올 단어를 예측하는 것이다.
즉, "나는 헬스를 좋아하고 그중에서도 3대 운동을 좋아한다" 라는 입력 문장이 있을 때,
"헬스", "좋아하고", "3대 운동"을 통해 뒤에 올 "좋아한다"를 예측하는 것이다.
하지만 BERT에서는 이러한 좌 → 우 혹은 우 → 좌 의 Undirectional(단방향)한 방법 대신
Bidirectional(양방향)하게 학습을 시키는 방식을 택한다.
그렇다면 어떻게 학습 시켜야 Bidirectional 하게 될까 ?
Bidirectional 학습 방법을 알아보기 앞서 딥러닝 모델 학습 방식에 대해 알아보고 가자
딥러닝 모델 학습 방식은 크게 두가지 단계를 거친다. Pre-training과 Fine-training
(Feature-based라는 추가적인 학습 방식이 존재하지만 가장 널리 쓰이는 방식만 알아본다.)
🚀 Pre-training
위 Transformer 파트에서모델에 관한 개념을 설명하며
"마치 우리가 어렸을 때, 한국어를 듣고 말하고 쓰고 읽으며 익히는 것처럼 말이다."
라는 언급을 했었다.
이것에 대해 좀 더 자세히 들여다보면 Pre-training이라는 개념에 대해서도 알 수 있다.
인간은 백지와도 같은 뇌로 태어나 한국이면 한국어, 미국이면 영어, 중국이면 중국어와 같은 언어를 배우게 된다.
한국어로 예를 들면, 아기 때부터 주위 사람들이 발음하는 것을 따라 하기도 하고
부모님이 사주시는 책도 읽으면서 한국어를 "훈련"하게 된다.
이것이 바로 사람이 언어를 배우는 과정에서의 Pre-training이라고 할 수 있으며,
모델이 언어를 배우는 과정도 이와 유사하다.
아무것도 모르는 백지와도 같은 모델에게는
많은 양의 언어 데이터를 입력 데이터로 Pre-training 시킨다.
(보통 Pre-training을 하기 위해서는 대량의 데이터가 필요하다)
이러한 Pre-training 과정을 거쳐 사람과 모델은 한국어를 어설프게나마 알아듣고 말할 수 있는 능력이 생긴다.
🚀 Fine-training
위 Pre-training 파트에서 들었던 예시를 다시 사용하자.
사람은 한국어를 배운 후, 다양한 곳에서 사용한다.
예를 들어, 수능 국어 영역을 생각해보자.
평소 사람들과 대화할 정도로만 한국어를 알던 학생이 고등학교에 진학하여 수능을 준비하게 되었고,
매일 읽고 쓰고 말하고 듣던 한국어지만,
마치 외계어처럼 느껴지는 수능 국어의 비문학, 문학 등을 공부하게 된다.
이 단계가 바로 언어를 배운 사람이 그 언어를 이용하여 다른 task(일)를 할 수 있도록
다시 한번 배우게 되는 Fine-tuning이다.
이제 다시 딥러닝 모델의 경우를 생각해보자.
사람처럼 언어를 배운 모델도 다양한 곳에서 사용하게 될 것이다.
예를 들면, 모델에게 어떠한 질문을 했을 때 답을 하거나(QA),
입력한 수많은 문장들을 카테고리 별로 나눈다거나(Classification),
어떠한 글과 그 글에서 답변을 찾을 수 있는 질문을 입력했을 때
올바르게 답을 하는지(MRC) 등이 존재한다.
(Fine-tuning을 할 때는 Pre-training을 할 때처럼 많은 양의 데이터가 필요하지 않다)
🚀 BERT의 Bidirectional 한 훈련 방법
모델의 훈련 방법들에 대해 배웠으니 다시 원래의 목적으로 돌아와,
"어떻게 학습을 시켜야 Bidirectional 하게 될 것인가"하는 궁금증을 해결해보자.
사실 BERT는 이미 Pre-training이 수행되어 나온 모델이다.
구글이 대량의 Wikipedia 데이터를 이용하여 BERT를 Pre-training 했고,
사람들은 그러한 BERT 모델을 각자의 목적에 맞게 더욱 Pre-training 시키거나 Fine-tuning을 한다.
여기서 우리의 궁금증을 해결할 수 있는데, 기존의 좌 → 우, 우 → 좌 방식이 아닌
아래의 구글이 만든 Next Sentence Prediction(NSP) 방식과
Masked Language Model(MLM) 방식으로 Bidirectional 하게 학습시킬 수 있다.
🚀 Next Sentence Prediction(NSP)
NSP는 두 개의 문장을 입력 데이터로 넣고 해당 문장들이 이어지는 문장인지 맞추도록 훈련시키는 것이다.
실제로 잘 이어지는 두 문장을 넣거나
랜덤 하게 추출된 두 문장을 50:50의 비율로 넣어 BERT가 맞추게 시킨다.
예를 들면,
"나는 헬스를 좋아한다."와 "당신은 고양이를 싫어하시는군요."라는
랜덤하게 추출된 두 문장이 있을 때,
BERT는 "두 문장은 이어지지 않는다!"라고
예측해야 되는 것이다.
🚀 Masked Language Model(MLM)
MLM은 입력 데이터 문장 중 일부분을 "<MASK>"라는 것으로 바꿔버려 학습시키는 방법이다.
예를 들어,
"나는 운동을 좋아한다. 특히 헬스를 좋아하는데 몸이 커질 수 있고 3대 운동도 재밌기 때문이다."
라는 문장을 가정하자.
여기서 "헬스"라는 단어를 <MASK>로 바꾸어 입력 데이터를 만들고,
모델은 <MASK>에 어떤 단어가 들어갈 것인지 유추해내는 것이다.
이러한 MLM 학습 방식에서 모델은 기존의 방법처럼
단지 앞의 N개의 단어를 통해 유추하는 것이 아니라,
입력 문장 전체를 둘러보며 알아낸다.
위와 같은 방식을 통해 BERT는 Bidirectional 하게 학습을 진행하여 표현해낸다는 것을 알 수 있다.
참고