아무것도 모르는 나란인간.. BERT가 뭔지 알아보기로 했다..

BERT란?

  • Bidirectional Encoder Representations from Transformers
  • Transformer를 Bidirection한 Encoder
    • Bidirection : 양방향
    • Encoder : 입력 값을 숫자 형태로 바꾸는 모듈
  • BERT는 문맥을 양방향을 위해 숫자의 형태로 바꿔주는 딥러닝 모델
  • BERT는 Language Model
  • Pre-training 과 Fine-tuning 두 파트로 나뉘어짐
  • GPT1과 동일한 사이즈의 BERT는 GPT1 보다 높은 성능을 가짐

 

BERT Pre-Training

  • 입력 토큰들이 Position Embedding과 Segment Embedding과 더해짐
  • CLS : Classification, 분류 Task에 사용되기 위한 벡터, 문장 전체가 하나의 벡터로 표현된 스페셜 토큰
  • SEP : 두 문장으로 구성된 입력값의 경우에 사용되는 스페셜 토큰, 문장을 구분해줌 
    • WordPiece Embedding
      1. WordPiece Embedding을 사용해서 문장을 토큰 단위로 분리함
      2. WordPiece Embedding는 단순히 띄어쓰기로 토큰을 나누는 것보다 효과적으로 토큰을 분리함
    • Segment Embedding
      1. 두 개의 문장이 입력될 경우에 각각의 문장에 서로 다른 숫자를 더해주는 것
      2. 딥러닝 모델에게 두 개의 다른 문장이 있다는 것을 쉽게 알려주기 위해 사용하는 Embedding
    • Position Embedding
      1. 토큰들의 상대적 위치정보를 알려줌
      2. 딥러닝 모델은 Position Embedding으로 e1 다음에 e2, e2 다음에 e3 토큰이 위치함을 알 수 있음
      3. sin, cos 함수를 이용함
        • sin과 cos 출력 값은 입력 값에 따라 달라짐
        • 따라서 sin, cos 출력 값은 입력 값의 상대적인 위치를 알 수 있는 숫자로 사용 가능함
        • sin과 cos 출력 값은 규칙적으로 증가 또는 감소함
        • 따라서, 딥러닝 모델이 이 규칙을 사용해서 입력 값의 상대적 위치를 쉽게 계산 가능함
        • sin과 cos는 무한대 길이의 입력 값도 상대적인 위치를 출력할 수 있음
        • 어떤 위치의 입력 값이라도 -1 에서 1사이의 값을 출력하게 되어 있음
        • 상대적 위치를 사용하는 이유?
          1. 절대적 위치를 사용할 경우 최장 길이 문장을 세팅해야 함
          2. 따라서 최장 길이 문장보다 긴 학습 데이터는 사용할 수 없음

 

BERT Fine Tuning

  • 두 문장의 관계를 예측하기 위해 모델을 만드는 방법
    1. 두 개의 문장을 SEP 토큰으로 구분해서 BERT에 입력하여
    2. 력 값의 첫번째 CLS 토큰이 두 문장의 관계를 나타내도록 학습시킴

  • 문장을 분류하는 모델
    1. 문장 1개를 입력받고 CLS 토큰이 분류 값 중 하나가 되도록 학습시킴

  • QnA 예제(질의 및 응답 예제)
    1. 입력 값으로 질문과 정답이 포함된 장문을 SEP 토큰으로 구분해서 줌 
    2. BERT에 출력 값의 마지막 토큰들이 장문 속에 위치한 정답의 시작 인덱스와 마지막 인덱스를 출력하도록 학습시킴

  • 문장 속 단어를 태깅하는 예제 
    1. 각각의 입력 토큰에 대한 출력 값이 있기 때문에, 이 출력 값이 원하는 태깅으로 출력되도록 학습시킴

 

Transformer란?

  • 구글에서 공개한 Encoder, Decoder 구조를 지닌 딥러닝 모델
  • 기계번역에서 우수한 성능을 보여준 모델
  • Encoder는 입력 값을 양방향으로 처리하고
  • Decoder는 입력 값을 왼쪽에서 오른쪽으로 단방향으로 처리 함

 

Transformer 작동방식

  1. 입력 값은 먼저 Encoder에 입력됨
  2. 입력 값이 Encoder에 입력되면 각 토큰들은 포지셔널 인코딩과 더해지고
  3. 인코더는 이 값들을 행렬 계산을 통해서 한방에 Attention 벡터를 생성함
    • 벡터는 토큰의 의미를 구하기 위해서 사용됨
    • 단어하나만 보면 그 단어의 의미가 상당히 모호할 때가 많음
    • 예를 들어, 문장 전체를 보지 않고 단순히 '텍스트'라는 단어만 보면 텍스트가 신문지 속에 있는 문장들을 의미하는지, 문자메세지를 보내는 행위를 말하는 지 알기 어려움
    • 마찬가지로 메세지라는 단어만 봤을 경우 누가 말로 전하는 소식인지, 문자인지 헷갈림
  4. Attention  벡터는 fully connected layer로 전송됨
  5. 이와 동일한 과정이 6번 진행되어 그 최종 출력 값을 Transformer Decoder로 입력 값으로 사용함
    • Encoder는 모든 토큰을 한방에 계산함
    • 왼쪽에서 오른쪽으로 하나씩 읽어가는 과정이 없음
  6. Decoder는 Encoder의 출력 값과 최초 스타트 스페셜 토큰으로 작업 시작함
  7. Decoder는 왼쪽부터 오른쪽으로 순차적으로 출력 값을 생성함
  8. Decoder는 이전에 생성된 Decoder의 출력 값과 Encoder의 출력 값을 사용해서 현재의 출력 값을 생성함
  9. Decoder 역시 Attention 벡터를 만들고 fully connected layer로 전송하는 작업을 6번 진행함
  10. Decoder는 end토큰이라는 스페셜 토큰을 출력할 때까지 반복함

 

BERT가 양방향 Encoder를 취하게 된 이유?

  • GPT1으로부터 시작됨
    • GPT1이란?
    • 2018년에 openAI 에서 Transformer Decoder 구조를 사용해서 만든 자연어 처리 모델
    • GPT1은 Generative training으로 학습된 Language 모델이 얼마나 자연어 처리 능력이 우수한지 보여준 우수한 모델
    • 기본적으로 문장을 데이터로 사용함
    • 단어를 하나씩 읽어가면서 다음 단어를 예측하는 방법으로 학습됨
    • 이런 학습 방식은 별도의 라벨링 작업이 필요하지 않아 비지도 학습임
    • 한 문장만 가지고도 여러 학습 데이터를 만드는 것이 가능함
    • 현재 위치의 단어 다음에 위치한 단어를 예측하는 방식으로 학습됨
  • 구글은 질의 및 응답 영역은 문맥이해 능력이 상당히 중요한데, 단순히 왼쪽에서 오른쪽으로 읽어나가는 방식으로는 문맥이해의 약점이 있을 수 있다고 지적함
  • 이에 단순히 왼쪽에서 오른쪽으로 읽어나가는 Decoder보다 양방향으로 문맥을 이해할 수 있는 Encoder를 활용한 Language 모델을 BERT라는 이름으로 발표함

 

BERT vs GPT

  • BERT
    1. 양방향 LM
    2. Fine Tuning을 하도록 만들어짐
  •  GPT
    1. 단방향 LM
    2. Fine Tuning을 하지 않도록 만들어짐

 

글에 문제가 있으면 댓글로 알려주시면 감사하겠습니다!

그럼 이만.!

출처

1. https://www.youtube.com/watch?v=30SvdoA6ApE (허민석님의 [딥러닝 자연어처리]BERT이해하기)

2. Jacob Devlin, Ming-Wei Chang, Kenton Lee, Kristina Toutanova, "BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding"(https://arxiv.org/pdf/1810.04805.pdf)

'Study' 카테고리의 다른 글

multiprocessing 겅부..  (0) 2022.09.18
local에서 ssh 서버에 띄운 jupyter notebook 붙기  (0) 2022.02.06
Neural Search 관련 공부  (2) 2021.07.07
머신러닝 개념 정리  (0) 2021.05.22

+ Recent posts