(6강) BERT 기반 두 문장 관계 분류 모델 학습

💡
두 개의 문장을 입력받아 관계에 해당하는 라벨을 예측하는 Task에 대해 알아본다.

두 문장 분류 Task 소개

두 문장 분류는, 주어진 2개의 문장에 대해 의미론적 유사성이나 추론을 수행하는 Task이다. 한 문장 분류와 같이 [CLS] Token을 활용한다.

두 문장 분류에는 NLI와 같은 세부 Task가 있다.

이외에도 두 문장의 의미를 비교하는 Semantic Classification과 같은 Task도 있다.

두 문장 관계 분류 모델 학습

BERT를 활용해 IRQA 챗봇을 구현 할 수 있다.

실습 코드

학습 데이터 구축

두 문장 관계 분류 학습

BERT IRQA 챗봇


Project

오늘의 목표 및 진척상황

  • PORORO Data 및 외부 Data 활용 방안 강구
  • Bucketing 적용
  • Team Idea 갈무리 및 적용
  • Text Pair 실험
  • Entity Token 실험
  • Metric, Batch Size, Epoch 실험
  • Truncation 실험
  • Random Masking 실험
  • OOF Pipeline 구성

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

  1. 외부 Data 및 Bucketing

    원래 계획은 증강한 Data와 외부 Data에 대한 실험을 진행하고, Bucketing Code를 구성하려고 했다. 뾰족한 Idea가 없던 것도 있고, Bucketing과 관련된 Code를 보다가 완전 지친 상태였다. 현재 Code 상태가 더 나은 실험을 하기에 제한적이었고, Native Pytorch Code를 구성해야하나 계속 고민했다.

  1. Team Idea 갈무리

    정말 유익하고 재밌었던 Team Meeting이었다. 이틀밖에 지나지 않았는데 다들 다양한 실험을 진행했고, 실제로 성능 향상과 밀접해보이는 Idea를 공유해줬다. 위 Idea 중에서 당장 적용하기 좋은 것들과, 재실험이 필요한 사항들을 오늘 실험하기로 결정했다.

  1. Text Pair 실험

    Peer들과의 정보 공유를 통해 Single Sentence보다는 Multi Sentence의 Input이 확실히 더 좋은 성능을 낸다는 것을 확정 지을 수 있었다. 이제 관건은 Text Pair를 어떻게 전달하느냐이다. 회의를 시작할 당시에는 생각하지 못했는데, 회의가 진행되다보니 다음과 같은 생각이 들었다. 'ENT1과 ENT2의 관계는 무엇인가?'와 같은 문장이나, 'ENT1 and ENT2'와 같은 문장이 이번 Task 내에선 큰 차이가 없다는 것이다. 오히려 더 짧은 형태로 입력하는 것이 유리한 것으로 생각 되었다. 위 아이디어를 기반으로 생각해보니, [SEP]를 구분자로 하여 입력으로 넣었을 때 성능이 좋았던 것이 설명됐다. 즉, Text Pair는 Plain Text와 같은 형태로 Entity를 구분해서 넣어주는 것이 더 유리하다는 것이다. 이를 기반으로 RELATION과 같은 Plain Text를 사용해 학습을 진행시켜봤다. 너무 기분 좋게도, 처음에 얻었던 그 성능을 다시 돌려받을 수 있었다.

  1. ENT Token 실험

    위 실험을 바탕으로, Text에 Entity임을 명시하는 Idea를 재실험했다. 이번에는 [ENT]와 같이 각 Entity에 동일한 Token을 주는 것이 아니라, <sbj>, <obj>와 같이 입력했다. 결과적으로는 큰 차이가 없었다. 추가하나, 안하나 성능이 거의 동일하게 나왔다. 나중에 재희님 얘기를 들어보니, 이와 같이 Special Token을 추가했을 때 성능이 떨어졌다는 소식을 들었다. 앞으로 실험은 Entity에 다른 Token이나 표시를 하지 않고, 진행할 예정이다.

  1. Metric, Batch Size, Epoch 실험

    굉장히 당연한 실험인데, 이제서야 하게 됐다. Metric은, Model의 선택 기준을 Loss로 할 것인지 Accuracy로 할 것인지의 실험이었다. 한 모델에서 각 기준의 최고 Model을 각각 제출해봤으나, 결과과 완전히 동일했다. 현재 Task 상에서, Accuracy를 Score로 제시하는 만큼 Accuracy를 Model의 선택 기준으로 설정했다.

    Batch Size에 따라 성능이 달라질 수 있다는 것을 당연히 알았지만, 먼저 실험해보지는 않고 있던 것 같다. 팀원들의 소식을 들어보니, 32나 64를 썼을 때 더 높아진다는 정보를 얻게 되었다. 실제로 익효님은 32를 사용하고 있다고 하여 즉각 실험을 진행해봤다. 실험 결과 32가 더 안정적이지만, 64가 특정 지점에서 loss가 더 낮아졌었다. 그래서 이후 실험에서는 64를 기준으로 사용했으나, 너무 불안정하다고 판단되어 32를 사용하기로 결정했다.

    Step을 기준으로 Scheduling을 하고 있었기 때문에 Batch Size가 바뀐 만큼, Epoch도 조정할 필요가 생겼다. 각 Batch Size에 적합한 Epoch를 실험했고, 최종적으로는 Batch Size 32와 Epoch 10을 사용하기로 결정했다.

  1. Truncation 실험

    태양님이 제시해주셨고, 공유해주신 Code를 기반으로 실험을 진행했다. 제출 기회가 부족해서 실제 제출까지 수행하지는 못했지만, 사용하지 않았을 때 보다 약간이라도 성능이 오를 것으로 예상된다. 이후 Baseline 구성 이후에도 실험해보았는데, 마찬가지의 효과를 볼 수 있었다.

  1. Random Masking 실험

    종헌님과 익효님이 공유해주신 Idea와 Code를 기반으로 실험을 진행했다. Idea가 정말 획기적이고 성능에 직결될 것 같은 느낌이 들었다. 마치 Image Task에서 Cutout과 같은 효과가 예상됐다. 예상했던 만큼 드라마틱한 효과는 볼 수 없었지만, 실제 성능 향상으로 이어졌다.

  1. OOF Pipeline 및 익효님 Recipe 적용

    기존 Code가 더 나은 실험을 진행하기에 제한적이라고 판단됐고, 청소를 좀 해야겠다고 생각이 들었다. 추후에 KFold나 Ensemble을 진행할 것까지 고려하면, 얼른 만들어둬야겠다는 생각이 들었다.

    오늘 실험들은 사실 더 좋은 성능을 내거나, 뾰족하게 좋은 Baseline을 고를 수 없었다. 그래서 아예 익효님 Recipe를 따라해보자는 생각이 들었다. 익효님이 공유해주신 Parameter Option 등을 적용해서 Baseline을 구성했고, 실험을 진행했다. Validation 기준으로는 사실 엄청난 성능향상이 보이지는 않았다. 제출까지 진행해봐야 Score를 알 수 있을 것 같다.

  1. Classifier Dropout Layer 재실험

    미련의 끈을 놓지 못하고 또 실험해봤다. 이번에는 익효님 Recipe의 Baseline을 기준으로 0.1에서 0.2로 소심하게 올려봤다. Accuracy는 거의 유사하게 나왔지만, Loss는 아주 조금 더 높게 나왔다. 일반화 성능이 조금이라도 더 낫지 않을까라는 생각을 해본다.

추가로 진행 할 사항

  • Word Random Swap 실험
  • Hyper Parameter Search
  • Entity의 Vector를 활용하는 Model 및 Task 구성

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

[P2] Day 58  (0) 2021.04.26
[P2] Day 57  (0) 2021.04.26
[P2] Sunday 18 April  (0) 2021.04.26
[P2] Saturday 17 April  (0) 2021.04.26
[P2] Day 55  (0) 2021.04.26

+ Recent posts