NLP 스터디 - BERT (수정중)

bee·2023년 1월 8일

NLP

목록 보기
1/1
post-thumbnail

2020년도 인공지능 기술활용 교육 한달짜리를 수료한 후, 교육에서 만났던 다양한 전공생분들과 함께 팀을 이루어 AI 분석/활용 경진대회에 참가했던 적이 있다. 열심히 한 것도 있지만, 좋은 팀원들을 만나 운이 좋게도 최우수상을 수상할 수 있었다. 그 때 당시, 자연어처리의 'ㅈ' 자도 모르던 .. 인공지능 햇병아리 시절, 닥치는대로 논문을 찾아보고, 유튜브에 나와있는 교수님들의 강의를 밤새워 공부하면서 공부한 내용을 노션에 정리했다. 노션에 메모했던 것들은 1차적으로 강의필기를 하는 용도로 사용했기 때문에, 체계적으로 정리되지는 않았다. 복습하는 차원으로 이곳에 차곡차곡 정리하고자 한다.

  • BERT = Bidirectional Encoder Representations from Transformer (transformer의 encoder를 사용하는데 bidirectional information만을 학습할 예정)

ELMo : 뒤에서 부터 정보를 받아 바로 앞단어를 예측하는 방식(forward, backward model 을 따로 학습한 후에 representation 결합)

GPT : transformer decoder의 후반부에 해당하는 단어를 모두 masking한 후에 예측하는 방식

BERT : 단어 학습을 위해 해당하는 단어의 쌍방향(사실상 방향성 X)으로 임의의 부분을 masking한 후에 예측하는 방식

  • BERT의 목적

    • 목적1 : Masked language model : 각각의 input이 들어왔을 때 앞에서 masking된 해당하는 토큰을 실제로 예측하는 학습(임의의 위치에 있는 단어들을 masking한 후에 그걸 예측하는 방식)
    • 목적2 : Next Sentence prediction : 특정한 두 쌍의 문장이 들어왔을 때 해당하는 문장이 copus에서 바로 다음에 등장했던 문장인지 아닌지 판별하는 학습(0/1 binary class classification)
  • BERT의 fine-tuning

    • 맨 위쪽에 layer(SQuAD, NER, MINLI등) 한층만 쌓아서 초기 버트 모델보다 성능을 높임
  • L : layer개수(transformer block)

  • H : hidden node크기

  • A : self-attention heads 개수

BERT base : L = 12, H=768, A=12, total parameters =110M, GPT랑 model size 같음

BERT large : L = 24, H=1024, A=16, total parameter=340M

  • Input/Output representation

    • (BERT에서 정의하는)Sentence : 일련의 연속한 단어들의 집합( 완전한 문장이 아니어도 된다(
    • (BERT에서 정의하는)Sequence : Sentence로 이루어진 연속적인 1개 또는 2개의 문장
  • 'Masking되었다'의 의미 : sentence가 갖고있는 각각의 N개의 token들 중에 일정 비율로 실제 토큰이 아닌 지워서(masking) 입력으로 집어넣겠다.

  • CLS : 모든 시퀀스의 시작을 알리는 토큰

  • SEP : 두개의 문장을 구분하는 토큰(중간에 있음. 문장이 2개일때 들어간다.)

  • BERT는 토큰 자체를 'WordPiece'라는 개념을 사용해서 입력

  • 다른 모델들과의 차이점

    • ELMo : 똑같은 sequence들에 대해서 (정방향)forward LSTM과 backward LSTM을 여러단계로 학습 시킨 후에, 해당하는 hidden state들을 전부 선형결합 시켜서 최종적인 token을 만들어냄
    • OpenAI GPT : transformer의 decoder block만을 사용했기 때문에 마스킹이 단일 방향(뒷쪽 노드를 향하는 방향. 랜덤X)으로 연결되어서 최종 token만들어냄(masking과정이 필요 없는 이유 : 정방향으로만 transformer 의decoder를 사용하기 때문에 특정 token이 들어왔을 때 다음 단어를 예측하는 task만 수행하면 됨)
    • BERT : 똑같은 sequence에 대해서 양쪽 방향으로 동시에 transformer의 encoder를 사용하여 학습. 그 과정에서 일정 수준의 비율로 입력token들에 대해 masking을 해서 학습시킨다.
  • Input representation

    • 3가지 임베딩 벡터의 합으로 표현된다(3가지 모두 동일한 차원을 갖고 있음 ⇒ 단순하게 '더해서' 최종적인 input representation을 구성)
      • 1) Token embedding : WordPiece중 30000개에 해당하는 것 (각각의 토큰에 해당하는 임베딩 벡터)
      • 2) Segment embedding : sequence가 2개가 들어갔을 때 첫번째인지 2번째인지를 알려주는 정보
      • 3) Position embedding : 각각의 위치에 대한 임베딩 벡터
  • BERT의 WordPiece tokeninzing(=Byte Pair Encoding BPE알고리즘)

    • (정의) 빈도수에 기반해서 단어를 의미있는 패턴(Subword)로 잘라서 tokeninzing
    • 빈도수가 높은 단어들은 (ex. ##경찰) 앞에 ##을 붙여서 vocabs를 생성
    • BPE 순서
      1. 학습 데이터(sentences)를 먼저 어절단위로, 이후character단위로tokenize(with ##)

      2. //* character단위로 tokenize된 각 sentence에서 중복되는 character 제거 ⇒ vocab 후보1

      3. vocab 후보1 로 tokenize를 한번 더해서 Bi-gram pairs를 생성(앞뒤 character를 2개씩 묶음) ⇒ 각pair의 빈도수 조사

      4. 가장 높은 빈도수를 갖는 Bi-gram pair를 하나로 합친다 : Best pair (ex ##창 ##살⇒##창살) *//iteration=1

      5. 과정 반복 ⇒vocab 후보 갱신 (빈도수가 같다면 가장 첫번째로 나온 것을 기준으로 선

      6. 이런식으로 만들어진 vocab후보로 최종 vocab저장

        https://s3-us-west-2.amazonaws.com/secure.notion-static.com/caeee7ea-d91d-4fad-802e-424dab1de31b/Untitled.png

    • BPE를 활용하여 subword로 분리했음에도 불구하고 vocab에 존재하지 않는 단어는 [UNK]토큰(unknown토큰)으로 변환하기도 함.
  • BERT의 input

    https://s3-us-west-2.amazonaws.com/secure.notion-static.com/536d79e4-a06d-47c1-8882-a3587467d8af/Untitled.png

  • BERT의 Methods

    1. Sentence pair classification
      • 두가지 sentence를 넣고, 서로 어떤 관계를 갖고 있는지 분류
    2. Single sentence pair classification
      • single sentence를 넣고 각각 분류
    3. Question and Answering(SQuAD v1.1)
      • 질문을 넣고 질문에 대한 답을 포함하는 paragraph가 들어감으로써 답변을 찾아냄
      • 출력값은 paragraph의 index값
    4. Single sentence tagging
      • 각각의 token에 대한 정보값(ex.개체명)을 출력으로 만들어냄
  • Pre-training BERT의 Tasks(unsupervised방식으로 copus를 통해서 BERT의 MLM을 학습시킴)

    • Task1 : MLM
      • 쌍방향적인 biDirectional transformer encoder를 쓰되(여기까지는 ELMo와 같음), 실제 input으로 들어가는 단어들 중 임의의 비율로 가리고(mask) 모델의 학습을 통해서 실제 가려진(masked) 단어들을 잘 학습시키도록(예측하도록)하는 것
      • masking은 pre-training과정에서만 일어나고, 다음 단계인 downstream task에 대한 fine-tuning단계에서는 일어나지 X ⇒ (문제점)이 사이에서 미스매치가 발생할 수 있음(어떻게 해결해야 할까?)
      • (제시된 해결법) 만약 실제 fine-tuning과정에서 i번째 토큰이 masking이 될 것 이라고 선택이 된다면,
        • 그 중에 80%만 실제로 masking을 함.
        • 10%는 랜덤한 토큰으로 치환.
        • 나머지 10%는 실제로 마스킹을 하지 않고 원래의 오리지널 토큰을 그대로 사용.
    • Task2 : NSP
      • Binarized next sentence prediction : 50대50으로 나누었을때, 실제 copus에서 연속된 문장이라면 label =1, 아니라면 label = 0으로 부여
      • QA task와 NLI task에 도움이 많이 되었다.
    • 필요한 Hyper-parameter settings
      • 토큰의 최대 길이 : 512개(한 sequence에 대해서 2개의 sentences이기 때문에 2문장 합쳐서 512개)
      • Batch size : 256
      • Optimizer : Adam
      • learning rate : 10^-4
      • beta1 : 0.9/ beta2 : 0.999
      • L2 weight decay 사용
      • learning rate는 10000step 이후부터는 linear하게 줄어든다
      • 모든 layer에 대해서 Dropout을 0.1의 확률로 잡음
      • 활성화 함수 : GeLU
      • 16개의 TPU를 사용해서 BERT(BASE)는 4일 걸림/ 64개의 TPU를 사용해서 BERT(LARGE)는 4일 걸림
      • 사전 훈련을 하는데 있어서 거의 90%에 해당하는 step들은 원래 '최대 토큰 길이'가 512였지만 128개만 사용/ 나머지 10%에 해당하는 step들에 대해서만 512개를 사용함
  • Fine-tuning BERT

profile
벌집처럼 밀도있게 차곡차곡 쌓아나가는중

0개의 댓글