Notice
Recent Posts
Recent Comments
Link
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Tags
more
Archives
Today
Total
관리 메뉴

Zorba blog

버트(Bidirectional Encoder Representations from Transformers, BERT) 본문

자연어처리

버트(Bidirectional Encoder Representations from Transformers, BERT)

Zorba blog 2022. 6. 7. 13:20

- 다양한 자연어 처리 테스크에서 사용되었던 RNN 계열의 신경망인 LSTM, GRU는 트랜스포머로 대체되어가는 추세.

- 트랜스포머 계열의 BERT, GPT, T5 등 다양한 사전 훈련된 언어 모델들이 계속해서 등장하고 있음.


1. BERT의 개요

사진 첨부

- BERT는 2018년에 구글이 공개한 사전 훈련된 모델.

- 트랜스포머를 이용하여 구현되었으며, 위키피디아(25억 단어)와 BooksCorpus(8억 단어)와 같은 레이블이 없는 텍스트 데이터로 사전 훈련된 언어 모델.

- 레이블이 없는 방대한 데이터로 사전 훈련된 모델을 가지고, 레이블이 있는 다른 작업에서 추가 훈련과 함께 하이퍼파라미터를 재조정하면 성능이 높게 나옴.

- 다른 작업에 대해서 파라미터 재조정을 위한 추가 훈련 과정을 파인 튜닝(Fine-tuning) 이라고 함.


2. BERT의 크기

사진 첨부

- BERT의 기본 구조는 트랜스포머의 인코더를 쌓아올린 구조.

- Base 버전에서는 총 12개, Large 버전에서는 총 24개를 쌓음.

  • BERT-Base : L=12, D=768, A=12 : 110M개의 파라미터
  • BERT-Large : L=24, D=1024, A=16 : 340M개의 파라미터

(트랜스포머 인코더 층의 수 : L, d_model의 크기 : D. 셀프 어텐션 헤드의 수 : A)


3. BERT의 문맥을 반영한 임베딩(Contextual Embedding)

- BERT는 ELMo나 GPT-1과 마찬가지로 문맥을 반영한 임베딩(Contextual Embedding)을 사용.

- BERT의 입력은 임베딩 층을 지난 임베딩 벡터들.

- BERT의 연산을 거친 후의 출력 임베딩은 문장의 문맥을 모두 참고한 문맥을 반영한 임베딩이 됨.

- [CLS]라는 벡터는 BERT의 초기 입력으로 사용되었을 입력 임베딩 당시에는 단순히 임베딩 층을 지난 임베딩 벡터였지만, BERT를 지나고 나서는 [CLS], I, love, you라는 모든 단어 벡터들을 모두 참고한 후에 문맥 정보를 가진 벡터가 됨.

- 다른 벡터들도 전부 BERT의 입력이었던 모든 단어들을 참고. 

사진 첨부

 

- BERT는 '셀프 어텐션'을 활용하여 모든 단어들을 참고하여 문맥을 반영한 출력 임베딩을 얻음.


4. BERT의 서브워드 토크나이저 : WordPiece

- BERT는 단어보다 더 작은 단위로 쪼개는 서브워드 토크나이저를 사용.

- BERT가 사용한 토크나이저는 WordPiece 토크나이저로 바이트 페어 인코딩(Byte Pair Encoding, BPE)의 유사 알고리즘

- 동작 방식은 BPE와 조금 다르지만, 글자로부터 서브워드들을 병합해가는 방식으로 최종 단어 집합을 만드는 것은 유사.

 

- 서브워드 토크나이저는 자주 등장하는 단어는 그대로 단어 집합에 추가.

- 자주 등장하지 않는 단어의 경우에는 더 작은 단위인 서브워드로 분리되어 서브워드들이 단어 집합에 추가.

 

BERT 에서 토큰화를 수행하는 방식

1. 토큰이 단어 집합에 존재한다.
=> 해당 토큰을 분리하지 않는다.

2. 토큰이 단어 집합에 존재하지 않는다.
=> 해당 토큰을 서브워드로 분리한다.
=> 해당 토큰의 첫번째 서브워드를 제외한 나머지 서브워드들은 앞에
"##"를 붙인 것을 토큰으로 한다.

(ex. embeddings 라는 단어가 입력으로 들어왔는데, 단어 집합에 해당 단어가 존재하지 않는다면, 그리고 만약 BERT의 단어 집합에 em, ##bed, ##ding, #s 라는 서브 워드들이 존재한다면, embeddings는 em, ##bed, ##ding, #s 로 분리.)


5. 포지션 임베딩(Position Embedding)

- 트랜스포머에서는 포지셔널 인코딩(Positional Encoding)이라는 방법을 통해서 단어의 위치 정보를 표현.

- BERT에서는 이와 유사하지만 위치 정보를 사인 함수와 코사인 함수로 만드는 것이 아닌 학습을 통해서 얻음.

- 위치 정보를 위한 임베딩 층(Embedding layer)을 하나 더 사용.

- 문장의 길이가 4라면 4개의 포지션 임베딩 벡터를 학습 시킴.

- BERT의 입력마다 다음과 같이 포지션 임베딩 벡터를 더해줌.

  • 첫번째 단어의 임베딩 벡터 + 0번 포지션 임베딩 벡터
  • 두번째 단어의 임베딩 벡터 + 1번 포지션 임베딩 벡터
  • 세번째 단어의 임베딩 벡터 + 2번 포지션 임베딩 벡터
  • 네번째 단어의 임베딩 벡터 + 3번 포지션 임베딩 벡터

- BERT에서는 문장의 최대 길이를 512로 하고 있으므로, 총 512개의 포지션 임베딩 벡터가 학습.

- 결론적으로 BERT에서는 총 두 개의 임베딩 층이 사용됨. (단어 집합의 크기가 30,522개인 단어 벡터를 위한 임베딩 층과 문장의 최대 길이가 512이므로 512개의 포지션 벡터를 위한 임베딩 층)


6. 포지션 임베딩(Position Embedding)

사진첨부

- 가장 우측, ELMo는 정방향 LSTM과 역방향 LSTM을 각각 훈련시기는 방식으로 양방향 언어 모델을 구현.

- GPT-1은 트랜스포머의 디코더를 이전 단어들로부터 다음 단어를 예측하는 방식으로 단방향 언어 모델을 구현.

- BERT는 화살표가 양방향으로 뻗어나가는 모습을 보여줌.

- 이는 마스크드 언어 모델(Masked Language Model)을 통해 양방향성을 얻었기 때문.

- BERT의 사전 훈련 방법은 크게 두 가지로 나뉨. 1) 마스크드 언어 모델 2) 다음 문장 예측

1) 마스크드 언어 모델(Masked Language Model, MLM)

- BERT는 사전 훈련을 위해 입력으로 들어가는 입력 텍스트의 15%의 단어를 랜덤으로 마스킹(Masking)

- 그리고 이 가려진 단어들을 예측하도록 함.

- 정확히는 전부 [MASK]로 변경하지는 않고, 랜덤으로 선택된 15%의 단어들은 다시 다음과 같은 비율로 규칙이 적용.

  • 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

사진 첨부

 

- 전체 단어의 85%는 마스크드 언어 모델의 학습에 사용되지 않음.

- 여기서 출력층에 있는 다른 위치의 벡터들은 예측과 학습에 사용되지 않고, 오직 'dog' 위치의 출력층의 벡터만이 사용.

- BERT의 손실 함수에서 다른 위치에서의 예측은 무시.

- dog만 변경된 것이 아니라 위와 같이 변경되었다면?

- 랜덤 단어 'king' 으로 변경된 토큰에 대해서도 원래 단어가 무엇인지, 변경되지 않은 단어 'play'에 대해서도 원래 단어가 무엇인지를 예측 해야 함.

2) 다음 문장 예측(Next Sentence Prediction, NSP)

- BERT는 두 개의 문장을 준 후에 이 문장이 이어지는 문장인지 아닌지를 맞추는 방식으로 훈련.

- 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

- BERT의 입력으로 넣을 때, [SEP] 이라는 특별 토큰을 사용해서 문장을 구분.

- 첫번째 문장의 끝에 [SEP] 토큰을 넣고, 두번째 문장이 끝나면 역시 [SEP] 토큰을 붙여줌.

- 이 두 문장이 실제 이어지는 문장인지 아닌지를 [CLS] 토큰의 위치의 출력층에서 이진 분류 문제를 해결.

   ([CLS] 토큰은 BERT가 분류 문제를 풀기 위해 추가된 특별 토큰)

- 마스크트 언어 모델과 다음 문장 예측은 따로 학습하는 것이 아닌 loss를 합하여 학습이 동시에 이루어짐.

   * BERT가 언어 모델 외에도 다음 문장 예측이라는 테스크를 학습하는 이유는 QA(Question Answering)나 NLI(Natural Language Inference)와 같이 두 문장의 관계를 이해하는 테스크들이 있기 때문.


7. 세그먼트 임베딩(Segment Embedding)

- BERT는 QA들과 같은 두 개의 문장이 입력이 필요한 테스크를 풀기도 함.

- 문장 구분을 위해서 BERT는 세그먼트 임베딩이라는 또 다른 임베딩 층을 사용.

- 첫번째 문장에는 Sentence 0 임베딩, 두번째 문장에는 Sentence 1 임베딩을 더해주는 방식.

 

결론적으로 BERT는 총 3개의 임베딩 층 사용.

  • WordPiece Embedding : 실질적인 입력이 되는 워드 임베딩. 임베딩 벡터의 종류는 단어 집합의 크기로 30,522개.
  • Position Embedding : 위치 정보를 학습하기 위한 임베딩. 임베딩 벡터의 종류는 문장의 최대 길이인 512개.
  • Segment Embedding : 두 개의 문장을 구분하기 위한 임베딩. 임베딩 벡터의 종류는 문장의 최대 개수인 2개.

- BERT가 두 개의 문장을 입력받을 필요가 없는 경우도 있음. (ex. 네이버 영화 리뷰 분류 or IMDB 리뷰 분류 테스크에서는 한 개의 문서에 대해서만 분류를 하는 것이므로, 이 경우에는 BERT의 전체 입력에 Sentence 0 임베딩만을 더해줌.)


8. BERT를 파인 튜닝(Fine-tuning) 하기

- 사전 학습 된 BERT에 풀고자 하는 테스크의 데이터를 추가로 학습 시켜서 테스트하는 단계인 파인 튜닝 단계.

1) 하나의 텍스트에 대한 텍스트 분류 유형(Single text Classification)

- BERT를 사용하는 첫번째 유형은 하나의 문서에 대한 텍스트 분류 유형.

- 텍스트 분류 문제를 풀기 위해서 [CLS] 토큰 위치의 출력층에서 완전 연결층(fully-connected layer)이라고 불리는 층들을 추가하여 분류에 대한 예측 진행.

2) 하나의 텍스트에 대한 태깅 작업(Tagging)

- BERT를 사용하는 두번째 유형은 태깅 작업.

- 문장의 각 단어에 품사를 태깅하는 품사 태깅 작업과, 개체를 태깅하는 개체명 인식 작업.

3) 텍스트의 쌍에 대한 분류 또는 회귀 문제(Text Pair Classification or Regression)

- 두 문장이 주어졌을 때, 하나의 문장이 다른 문장과 논리적으로 어떤 관계에 있는지를 분류하는 것.

- 유형으로는 모순 관계, 함의 관계, 중립 관계가 있음.

4) 질의 응답(Question Answering)

- BERT로 QA를 풀기 위해서 질문과 본문이라는 두 개의 텍스트의 쌍을 입력.

- 질문과 본문을 입력으로 받으면, 본문의 일부분을 추출해서 질문에 답변하는 것.


9. 어텐션 마스크(Attention Mask)

- BERT를 실제로 실습하게 되면 어텐션 마스크라는 시퀀스 입력이 추가로 필요.

- 어텐션 마스크는 BERT가 어텐션 연산을 할 때, 불필요하게 패딩 토큰에 대해서 어텐션을 하지 않도록 실제 단어와 패딩 토큰을 구분할 수 있도록 알려주는 입력.

- 값은 0과 1 두 가지 값을 가지는데, 숫자 1은 해당 토큰은 실제 단어이므로 마스킹을 하지 않는다라는 의미.

- 숫자 0은 해당 토큰은 패딩 토큰이므로 마스킹을 한다는 의미.

Comments