1) NLP에서의 사전 훈련(Pre-training)
- 사전 훈련된 언어 모델
- 양방향 언어 모델
- 마스크드 언어모델
-버트 : 2018년에 구글이 공개한 사전 훈련된 모델
1. BERT의 개요
- 트랜스포머 사용
- 위키피디아(25억 단어)와 BooksCorpus(8억 단어)와 같은 레이블이 없는 텍스트 데이터로 사전 훈련된 언어 모델
- 레이블이 없는 방대한 데이터로 사전 훈련된 모델 + 레이블이 있는 다른 작업(Task)에서 추가 훈련과 함께 하이퍼파라미터를 재조정 (파인튜닝)
2. BERT의 크기
- BERT의 기본 구조 : 트랜스포머의 인코더를 쌓아올린 구조
- BERT-Base : L=12, D=768(d_model의 크기), A=12(셀프어텐션 헤드의 수) : 110M개의 파라미터
- BERT-Large : L=24, D=1024, A=16 : 340M개의 파라미터
- Base: 12개 Large : 24개
- Large 버전은 Base 버전보다 d_model의 크기나 셀프 어텐션 헤드(Self Attention Heads)의 수가 더 크다
- 초기 트랜스포머(L=6, D=512, A=8)에 비해 큰 네트워크
3. BERT의 문맥을 반영한 임베딩(Contextual Embedding)
- 문맥을 반영한 임베딩 (Contextual Embedding)
- 입력 : 768(d_model의 크기)차원의 임베딩 벡터
- 출력 : 768(d_model의 크기)차원의 임베딩 벡터
- BERT를 지나면 문장의 문맥을 모두 참고한 문맥을 반영한 임베딩이 된다
- 모든 단어에서 화살표 연결됨
- BERT의 12개 층에서 하나의 단어가 모든 단어를 참고하는 연산이 이루어지고
12개의 층을 지나면 최종적으로 출력 임베딩을 얻게 된다.
- 셀프 어텐션을 토해 문맥을 반영한 출력 임베딩을 얻게 된다
4. BERT의 서브워드 토크나이저 : WordPiece
- 서브워드 토크나이저 : 단어보다 더 작은 단위로 쪼갬
- : 자주 등장하는 단어는 그대로 단어 집합에 추가하지만 자주 등장하지 않는 단어는 더 작은 단위인 서브워드로 분리되어 서브워드들이 단어 집합에 추가된다
- : 단어집합이 완성되면 이를 기반으로 토큰화
- BERT 사용 토크나이저 : WordPiece
- 글자들로부터 서브워드들을 병합해가는 방식으로 최종 단어집합을 만든다
준비물 : 이미 훈련 데이터로부터 만들어진 단어 집합
1. 토큰이 단어 집합에 존재한다.
=> 해당 토큰을 분리하지 않는다.
2. 토큰이 단어 집합에 존재하지 않는다.
=> 해당 토큰을 서브워드로 분리한다.
=> 해당 토큰의 첫번째 서브워드를 제외한 나머지 서브워드들은 앞에 "##"를 붙인 것을 토큰으로 한다.
- ex. embeddings
-> 단어집합에 존재하지 않았으면 쪼갬
- em, ##bed, ##ding, #s 라는 서브워드들이 존재한다면 분리함
5. 포지션 임베딩(Position Embedding)
-
포지셔널 인코딩 : 사인 함수와 코사인 함수를 사용하여 위치에 따라 다른 값을 가지는 행렬을 만들어 이를 단어 벡터들과 더하는 방법
-
포지션 인코딩 : 학습을 통해서 얻는 포지션 임베딩(Position Embedding)이라는 방법
-
위치 정보에 대한 임베딩 층 하나를 더 사용하고 학습시킴, 임력에 포지션 임베딩 벡터를 더해줌
- 첫번째 단어의 임베딩 벡터 + 0번 포지션 임베딩 벡터
- 두번째 단어의 임베딩 벡터 + 1번 포지션 임베딩 벡터
- 세번째 단어의 임베딩 벡터 + 2번 포지션 임베딩 벡터
- 네번째 단어의 임베딩 벡터 + 3번 포지션 임베딩 벡터
-
BERT에서는 문장의 최대길이를 512로 설정하였으므로 총 512개의 포지션 임베딩 벡터가 학습됨
-
2개의 임베딩 벡터층
- 단어 집합의 크기가 30522인 단어 벡터를 위한 임베딩 층 + 512개의 포지션 벡터를 위한 임베딩 층
- 에다가 세그먼트 임베딩이라는 1개의 임베딩 층을 하나 더 사용한다
6. BERT의 사전 훈련(Pre-training)
- ELMo :정방향 LSTM과 역방향 LSTM을 각각 훈련시키는 방식의 양방향 언어 모델
- GPT-1 : 트랜스포머의 디코더를 이전 단어들로부터 다음 단어를 예측하는 방식, 단방향 언어 모델
- BERT 의 사전 훈련 방식
- 마스크드 언어 모델 : 양방향성
- 다음 문장 예측(Next sentence prediction, NSP)
1) 마스크드 언어 모델(Masked Language Model, MLM)
- 인공신경망의 입력으로 들어가는 입력 텍스트의 15%의 단어를 랜덤으로 마스킹하고 인공신경망에게 이 가려진 단어들을 예측하게 함 (15%정도)
- = 중간 단어를 구멍 뚫어 놓고 맞추기
- ex. '나는 [MASK]에 가서 그곳에서 빵과 [MASK]를 샀다' : 슈퍼 / 우유
- [MASK]만 사용할 경우 [MASK] 토큰이 파인튜닝 단계에서 나타나지 않아 사전학습단계와 파인튜닝 단계에서의 불일치가 일어날 수 있어 랜덤하게 선택된 15%는 [MASK]로 사용하지 않음
- 80%의 단어들은 [MASK]로 변경한다.
Ex) The man went to the store → The man went to the [MASK]
- 10%의 단어들은 랜덤으로 단어가 변경된다.
Ex) The man went to the store → The man went to the dog
- 10%의 단어들은 동일하게 둔다.
Ex) The man went to the store → The man went to the store
-
BERT의 손실 함수에서 다른 위치에서의 예측은 무시 : 출력층에 있는 다른 위치의 벡터들은 예측과 학습에 사용되지 않고, 오직 'dog' 위치의 출력층의 벡터만이 사용
-
출력층에서는 예측을 위해 단어 집합의 크기만큼의 밀집층(Dense layer)에 소프트맥스 함수가 사용된 1개의 층을 사용하여 원래 단어가 무엇인지를 맞추게 됨
- 'dog' 토큰은 [MASK]로 변경, 'he'는 랜덤 단어 'king'으로 변경, 'play'는 변경되진 않았지만 예측에 사용됩니다.
- 이런 경우 다음 문장 예측 이라는 태스크를 학습
2) 다음 문장 예측(Next Sentence Prediction, NSP)
- 두 개의 문장을 준 후 이 문장이 이어지는 문장인지 아닌지를 맞추는 방식으로 훈련시킨다
- 50 : 50으로 실제 이어지는 문장들 / 랜덤으로 이어지는 문장들을 주고 훈련
이어지는 문장의 경우
Sentence A : The man went to the store.
Sentence B : He bought a gallon of milk.
Label = IsNextSentence
이어지는 문장이 아닌 경우 경우
Sentence A : The man went to the store.
Sentence B : dogs are so cute.
Label = NotNextSentence
-
[SEP] : 첫번째 문장 끝, 두번째 문장 끝에 넣어 문장 구분
-
[CLS] : 이 토큰의 위치의 출력층에서 실제 이어지는지 아닌지에 대한 이진 분류 문제를 풀도록 함
-
마스크드 언어 모델과 다음 문장 예측은 따로 학습하는 것이 아닌 loss를 합하여 학습이 동시에 이루어진다.
-
BERT가 풀고자 하는 태스크에 QA(Question Answering)나 NLI(Natural Language Inference)와 같이 두 문장의 관계를 이해하는 것이 중요한 태스크들이 있기 때문에 이런 태스크를 학습함
7. 세그먼트 임베딩(Segment Embedding)
- 세그먼트 임베딩 : 문장 구분을 위해 사용하는 임베딩 층
- 첫문장 : sentence 0 임베딩 더해줌, 두번째문장 : sentence 1 임베딩 더해줌 ...
- 두개의 임베딩 벡터가 사용됨
- BERT의 임베딩 층
- WordPiece Embedding : 실질적인 입력이 되는 워드 임베딩. 임베딩 벡터의 종류는 단어 집합의 크기로 30,522개.
- Position Embedding : 위치 정보를 학습하기 위한 임베딩. 임베딩 벡터의 종류는 문장의 최대 길이인 512개.
- Segment Embedding : 두 개의 문장을 구분하기 위한 임베딩. 임베딩 벡터의 종류는 문장의 최대 개수인 2개.
- 두 문장을 입력한다고 했지만 실제로 표현만 그렇고 토큰과 임베딩으로 구분하는 문단, 문서, 텍스트 다 될 수 있음
- 두 문장 아니어도 됨. IMDB 분류 같은건 한 개의 문서에 대해서만 분류하기 때문에 sentence0만 더해주기도 함
8. BERT를 파인 튜닝(Fine-tuning)하기
- 파인튜닝 : 풀고자 하는 태스크의 데이터를 추가로 학습 시켜서 테스트
1) 하나의 텍스트에 대한 텍스트 분류 유형(Single Text Classification)
- 입력된 문서에 대해서 분류. 문서 시작에 [CLS] 토큰 넣음
- [CLS] 토큰 위치의 출력층에서 밀집층을 추가하여 분류에 대한 예측을 함
2) 하나의 텍스트에 대한 태깅 작업(Tagging)
- 태깅 작업
- 문장의 각 단어에 품사를 태깅하는 품사 태깅 작업, 개체를 태깅하는 개체명 인식 작업
- 입력층 각 토큰 위치의 출력층에서 밀집층을 추가하여 분류에 대한 예측을 함
3) 텍스트의 쌍에 대한 분류 또는 회귀 문제(Text Pair Classification or Regression)
-
텍스트의 쌍을 입력으로 받는 태스크
- 자연어 추론(Natural language inference) : 두 문장이 주어졌을 때, 하나의 문장이 다른 문장과 논리적으로 어떤 관계에 있는지를 분류하는 것
- 관계 추론 : 모순 관계(contradiction), 함의 관계(entailment), 중립 관계(neutral)
-
문서 구분
- [SEP] 토큰
- Sentence 0 임베딩과 Sentence 1 임베딩이라는 두 종류의 세그먼트 임베딩
4) 질의 응답(Question Answering) = QA
- 텍스트의 쌍을 입력으로 받는 태스크 (질문 - 본문)
- SQuAD(Stanford Question Answering Dataset) v1.1
- 질문과 본문을 입력으로 받으면 본문의 일부분을 추출해 질문에 답변한다
- ex. 질문(입력) : 강우가 떨어지도록 영향을 주는 것은?"
- 본문(입력) : "기상학에서 강우는 대기 수증기가 응결되어 중력의 영향을 받고 떨어지는 것을 의미합니다. 강우의 주요 형태는 이슬비, 비, 진눈깨비, 눈, 싸락눈 및 우박이 있습니다."
- 답변 (정답) : "중력"
9. 그 외 기타
10. 어텐션 마스크(Attention Mask)
- 어텐션 마스크 : BERT가 어텐션 연산을 할 때, 불필요하게 패딩 토큰에 대해서 어텐션을 하지 않도록 실제 단어와 패딩 토큰을 구분할 수 있도록 알려주는 입력
- 0 : 패딩 토큰이므로 마스킹을 한다
- 1 : 실제 단어이므로 마스킹을 하지 않는다