NLP(7) BERT(Bidirectional Encoder Representations from Transformers)

gmlwlswldbs·2021년 11월 25일
0

스터디

목록 보기
17/19

1) NLP에서의 사전 훈련(Pre-training)

  1. 사전 훈련된 언어 모델
  2. 양방향 언어 모델
  3. 마스크드 언어모델

2) 버트(Bidirectional Encoder Representations from Transformers, BERT)

-버트 : 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 의 사전 훈련 방식
      1. 마스크드 언어 모델 : 양방향성
      1. 다음 문장 예측(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
  • ex. 'My dog is cute. he likes playing'

    • 토큰화 : ['my', 'dog', 'is' 'cute', 'he', 'likes', 'play', '##ing']

    • dog 토큰이 [MASK]로 변경되었다고 가정

  • 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 : 실제 단어이므로 마스킹을 하지 않는다

0개의 댓글