(3강) BERT 언어 모델 소개

💡
BERT의 내부 구조와 이를 활용해 해결할 수 있는 자연어 처리 Task에 대해 알아본다.

BERT 모델 소개

BERT는 Seq2Seq로부터 Transformer를 지나, GPT-1 이후에 발표된 Model이다.

BERT는 Transformer의 구조를 기반으로 한 모델이라는 점에서 GPT-X 모델과 유사하지만, BERT만의 Task로 학습을 진행한다는 차이점이 존재한다. BERT는 언어모델의 Task를 두 개 수행하는데, 하나는 Text에 Mask를 씌워서 해당 Text를 맞추는 Task이고, 나머지 하나는 두 문장의 관계에 대해 예측하는 것이다. 특히, Text를 복원하는 Task는 난이도를 높이기 위해 Mask외에도 다른 단어로 치환하는 등의 변형도 추가되어 있다.

BERT는 문장의 시작에 [CLS] Token을 부착하고, 각 문장의 구분이나 끝에 [SEP] Token을 부착한다. 이 [CLS] Token은 문장 전체의 정보를 담은 Embedding의 역할을 수행한다. 모델의 구조도를 살펴보면 다음과 같다.

Tokenizing은 Word Piece로 수행하며, Subword에 대해선, ##기호를 사용해 표시한다. 위에서 보았듯, 두 개의 Token Sequence를 활용해 학습을 진행한다.

BERT의 응용

BERT 모델은 Fine Tuning을 통해서, Output을 다양하게 받을 수 있고 이를 활용하면 NLP의 모든 Task를 수행할 수 있다.

[CLS] Token만을 사용하는 '단일 문장 분류'의 형태로는 감정분석, 관계추출 등의 Task를 수행할 수 있고, '두 문장 관계 분류'의 형태로는 의미비교와 같은 Task를 수행할 수 있다.

각 Token으로부터 Output을 사용하는 '문장 토큰 분류'의 형태로는 개체명 분석의 Task 등을 수행할 수 있다.

몇 개의 Token의 Output을 활용하는 형태로는, 기계 독해나 질의응답 Task 등을 수행할 수 있다.

한국어 BERT 모델

ETRI KoBERT는 한국어에 적합하도록 형태소 기반 Tokenizing을 활용했고, 기존의 모델보다 월등히 좋은 성능을 보여주었다.

이외에도 Entity 정보를 추가하는 Embedding Layer를 추가한 Model은 더 높은 성능을 보여주고 있다.

실습 코드

Hugging Face

BERT 유사도 기반 챗봇


Reference

BERT Paper

BERT 톺아보기


Project

오늘의 목표 및 진척상황

  • 실습 자료 및 과제 학습
  • 각종 의문사항 확인
  • Baseline Code 기반 Notebook Code 설계
  • 성능 향상 Idea 정리
  • Validation Set 구성 및 Model 일반화 성능 확인
  • ENT Token 실험
  • UNK Token 제거 실험

직면했던 문제와 학습한 내용

  1. 실습 자료 및 과제 학습

    원래 수행했어야 했던 과제가 있었는데 기한 내에 완성하지 못했다. 오늘 오후까지 쉬다가, 다시 정신 차리고 학습을 시작했다. 실습용으로 주신 자료 Code를 이해하고, 주어진 과제를 수행했다. 확실히 참고할만한 Code가 있으니, 한결 공부하기가 수월해졌다.

  1. 각종 의문사항 확인

    오늘 강의를 듣기 전까지 엄청 막막했다. 도대체 내가 인식하고 싶은 '개체'가 무엇인지 어떻게 알려줄 것이며, 그 관계는 도대체 어떻게 구해지는 것인가에 대한 막막함이 있었다. Model에 어떻게 Input을 전달해야 하는 것인지, Output은 어떻게 되는 것이며, 어떤 Token의 Embedding을 활용하는 것인지 등 도저히 이해가 안됐다. 당장 Tokenizing도 헷갈리는데, transformers Library의 구조까지 이해하려니 너무 힘들었다.

    오늘 강의를 통해서 [CLS] Token의 Embedding만을 활용하는 Task라는 것을 알게 되자, 실마리가 잡혔다. 왜 Entity를 굳이 처리해서 Text에 먼저 전달하는지 등에 대한 감이 잡혔다.

    이외에도, transformers의 몇몇 객체들에 대해서 조금은 이해하면서 개인적인 Code를 구성할 수 있게 되었다. 대표적으로, BertConfig객체, Trainer객체, AutoClass 객체 등에 대해 이해할 수 있게 되었다.

  1. 개인 Code 설계

    우선, Baseline을 기반으로 Notebook Code를 설계했다. Baseline에는 포함되어 있지 않던, Resume Training이나 Compute Metric 등도 추가하여 구성했다. 필요 시 변경하며 사용할 수 있도록, 내가 보고 이해하기 쉽도록 설계한 상태이나, 추후에 어느정도 실험 목록이 정해지게 되면, Python IDLE 형태로 재구성할 예정이다.

  1. 성능 향상 Idea 정리

    이제 슬슬 성능을 올리기 위한 실험 계획을 세워야 할 것 같았다. 토론 게시판과 Peer Session, Team Meeting 등에서 나온 다양한 Idea를 정리해보았다. 당장 적용 가능한 Idea는 적용해서 확인해보았고, 추가로 진행 할 사항 등은 아래에 정리해두었다.

  1. Validation Set 구성

    Baseline에서 Default로 주어진 Train Option의 일반화 성능을 확인하기 위해 Validation Set을 구성했다. 당장 학습의 정도를 파악하기 위해 약 10%의 Data를 Random하게 선별했고 Validation Set으로 활용했다. Default Train Option 기준으로, 2000 step보다 오히려 1500 step이 일반화 성능이 좋다는 것을 알아냈고 실제로 Public Score가 상승했다.

    이를 Validation Set을 기반으로 실험을 진행했으나, 아직 Validation Set의 신용도가 낮다는 결론이 내려졌다. Validation Set의 신용도도 높일 필요가 있으며, 추후에는, OOF 등을 적용할 수 있도록 Code를 설계할 필요가 있다.

  1. [ENT], [/ENT] Token 추가

    오늘 강의에서 나왔던 것 처럼 위 Token을 추가해서 학습을 진행해보았다. 위 Token만 추가하고, 1개의 문장으로 학습을 시켰는데, 오히려 성능이 감소하게 됐다. 그 이유를 짐작해보자면 다음과 같다. 짧은 학습 간에 저 Special Token의 용도를 명확하게 이해하지 못했을 것같다. [SEP] Token은 각 문장을 구별하는데도 사용되기 때문에, Token화 된 Entity 각각의 의미에 더 집중했을 것 같다.

  1. Entity 내 [UNK] Token 제거

    Tokenizing 된 Entity를 살펴보니, [UNK] Token이 포함되는 경우가 약 100건 가량 존재했다. 이 Token을 제거하면 의미가 더 잘 이해되지 않을까 싶어서 이를 제거하는 Code를 구성했다. 처음에는, [UNK]가 존재하는 Entity를 통째로 Vocab에 추가했는데 이는 당연하게도 성능 저하로 이어졌다. 이후, Entity 내에서 [UNK]로 Tokenizing 되는 Subword만을 Vocab에 추가하는 형태로 구성했고, 미미하지만 성능 향상의 효과를 얻을 수 있었다.

추가로 진행 할 사항

  • UNK Token 관련 Data 수집 여부 확인
  • Koelectra Model 실험
  • Wandb Logging Code 구성
  • Validation Set 신용도 향상 방안 강구
  • 다른 언어로 번역하는 등의 Data Aug
  • Entity의 이름을 변경하는 등의 Data Aug

'네이버 부스트캠프 AI Tech' 카테고리의 다른 글

[P2] Day 55  (0) 2021.04.26
[P2] Day 54  (0) 2021.04.26
[P2] Day 52  (0) 2021.04.26
[P2] Day 51  (0) 2021.04.26
[P1] 이미지 분류 Wrap-up Report  (0) 2021.04.11

+ Recent posts