기존에 GPT나 앞의 모델에서는 다 한방향으로만 움직이는(왼→우)로 예측하는 모델을 만들었었음
하지만 얘네들은 결국 예측할 때는 단방향으로만 읽어서 예측해야 하기에 이전 토큰만 참조할 수 있다는 단점이 존재 ⇒ 다음 문장에 대한 예측이나 문장 빈칸에 대한 예측의 경우 치명적임.
그래서 bERT를 통해 양방향 모델을 사용하려고 하는 것임.
2. Overall architecture
특정 과제를 하기 전 사전 훈련 임베딩(embedding)을 통해 성능을 좋게 할 수 있는 언어모델
사전 훈련 언어 모델임(pre-training)
unlabeled data로부터 pre-train 진행 한 후에, labeled data를 가지고 fine-tuning 진행하는 모델
encoder 모델만 가져다 씀
BERT가 높은 성능을 얻을 수 있었던 것은, 레이블이 없는 방대한 데이터로 사전 훈련된 모델 을 만든 후, 레이블이 있는 다른 작업(Task)에서 추가 훈련과 함께 하이퍼파라미터를 재조정하여 이 모델을 사용하기 때문!
BERT를 사용하지 않은 일반 모델과정은,
: 분류를 원하는 데이터 → LSTM, CNN 등의 머신러닝 모델 → 분류
BERT를 사용한 모델링 과정,
: 관련 대량 코퍼스(문장) → BERT → 분류를 원하는 데이터 → LSTM, CNN 등의 머신러닝 모델 → 분류
대량의 코퍼스를 Encoder가 임베딩하고(언어 모델링), 이를 전이하여 파인튜닝하고 Task를 수행.(NLP Task)
input 데이터를 넣음
이때, embedding이 3개가 있음 (token, segment, position)⇒ token의 경우 토큰 단위로 나눠주는 ( bert의 경우는 ing 단위까지로도 나눔)⇒ position은 마찬가지로 위치 정보 줌
⇒ 얘네들을 다 더해준 값이 input으로 들어가게 됨
⇒그 다음 segment를 사용하는데, 문장 구분을 위해 해줌(얘는 A문장에 해당하는 토큰이고, 얘는 B문장에 해당하는 토큰이다!)
pre-training을 진행하는데 두 가지의 학습을 동시에 진행함
1) MLM⇒ input의 일정 비율을 마스킹하고 마스킹 된 토큰을 예측함⇒ 얘는 문장과 문장 간의 관계가 성립되는지 아닌지의 여부를 알기 위해 진행함
2) NSP
Fine-tuning을 해준다. 이때 BERT의 pre-trained 된 모델을 그냥 그대로 가져옴(초기 파라미터 같음) 얘는 labeled 데이터 사용함. 다 모델 자체는 같지만, 마지막 출력 layer가 뭐냐에 따라서 output이 달라지게 됨
모델 학습시켜서 결과값 도출!
3. Input Representations
Token embeddings⇒ 우리가 아는 워드 임베딩
⇒ 토큰 단위로 나눠준다
Segment Embeddings⇒ 두 개의 문장을 구분해주기 위한 임베딩 ⇒ 얜 A문장에 해당, 얘는 B문장에 해당
Position Embeddings⇒ 위치 정보 학습
⇒ 다 더해줌
4. Pre-training
Task 1 : (첫번째 비지도 학습) Masked LM
트랜스포머의 경우 단어를 input으로 넣으면 그 다음 단어가 output으로 나오도록 예측했지만, BERT의 경우 해당 단어를 mask 처리하고 그 단어가 무엇인지를 예측.
Masked LM을 사용하는 이유:⇒ 양방향으로 학습을 진행시키는데 양방향성을 추구하게 되면 결국 간접적으로 예측하려는 단어를 참조할 수 밖에 없게 됨. (앞뒤 왔다 갔다 하기 때문에)⇒ 전체 토큰의 15%를 무작위로 mask 처리함.⇒ 따라서, pre-train 과정에서는 효율적일지 몰라도 fine-tuning 중에는 mask 토큰이 없음. (mask의 경우, pre-trained model을 만들기 위해서 사용) 그래서 pre-training과 fine-tuning 사이에 불일치 만들어냄
⇒ 이렇게 하면 단순 mask로만 처리해서 pre-trained 된 모델을 사용하는 것보다 다른 예제도 넣고, 원래 값도 넣고 이렇게 처리를 하면 당연히 더 잘 예측하게 될 것임.
NSP를 사용하는 이유:⇒ 질문에 대한 답(QA) or 문맥있는 문장들(일반적인 흐름의 문장) 의 task들은 두 문장(앞뒤) 사이의 관계를 이해 해야 함.⇒ 두 문장 A,B를 입력으로 넣고, B문장의 50%은 A문장 다음으로 넣고, 나머지 50% 부분은 B랑 관련없는 임의의 문장을 넣음. 이때 B가 다음문장인 경우 (ISNEXT), 관련없는 문장의 경우 (NOTNEXT)라고 분류함.
⇒ 이 경우, LM을 통해서 학습하기 쉽지 않아서 NSP(다음 문장 예측)에 대해서도 함께 학습시킴.
5. Fine-tuning
이 친구의 경우, 사전학습모델(pre-trained model인 버트 모델)은 같음.
모델 파라미터의 초깃값이 같다고 말할 수 있음
마지막 출력에 대한 layer에 따라서 달라짐
ex) 분류 문제의 경우, 분류하고 싶은 갯수(K)에 따라 classification layer을 붙여줌
두 개 문장에 대한 관계 분류(Sentence Pair Classification)ex) 상품 문의 같은 글들을 묶어주는 데에 쓰임⇒ 서로의 주장을 보완하는지 상충하는지 중립인지도 예측할 수 있
의역 예측 ⇒ 예시에 나온 두 문장과 같이 다른 단어가 쓰였지만 같은 뜻을 가지고 있는지 아닌지를 예측할 수 있음
문장 하나에 대한 분류(Single Sentence Classification)ex) 악플을 분류하는 테스크 ⇒ 해당 텍스트가 악플인가 아닌가를 분류함
묻고 답하기 (Question & Answering) 질문에 대한 답 출력ex) 질문과 본문이 주어졌을 때 본문 속에 답이 있는 부분을 예측함
⇒ "박지성이 뛴 EPL 클럽은?"이 주어졌을 때, 본문 중에 "... PSV 에인트호번과 잉글랜드 프리미어리그의 맨체스터 유나이티드, 퀸스 파크 레인저스에서 활동하였다...." ⇒ 밑줄이 그어진 부분을 예측함.
문장 내 단어 라벨링(Single Sentence Tagging Task) - 토큰 taggingex) 이 단어가 명사인지 형용사인지,,(형태소분석) 각 토큰에 대해 분류하는 것.ex) 김 ⇒ 시작 , 지 ⇒ 중간, 은 ⇒ 끝
⇒ 또는 개체명 인식 (named entity recognition) ⇒ 이름의 시작, 중간, 끝을 라벨로 예측
5. BERT에 쓰이는 Transfer Learning
BERT를 써먹는다의 의미:⇒ 많은 데이터를 통해 학습해서 만든 BERT라는 모델에 축약된 지식을 적은 양의 데이터에다가 적용하는 것!
1. 피처 뽑기 (Feature Extraction)⇒ Bag of word vector 마냥 그냥 순서에 관련없이 BERT에서 나온 vector 값들을 다른 머신러닝 모델의 input으로 사용하는 경우