(6강) BERT 기반 두 문장 관계 분류 모델 학습
두 문장 분류 Task 소개
두 문장 분류는, 주어진 2개의 문장에 대해 의미론적 유사성이나 추론을 수행하는 Task이다.
한 문장 분류와 같이 [CLS]
Token을 활용한다.
두 문장 분류에는 NLI와 같은 세부 Task가 있다.
이외에도 두 문장의 의미를 비교하는 Semantic Classification과 같은 Task도 있다.
두 문장 관계 분류 모델 학습
BERT를 활용해 IRQA 챗봇을 구현 할 수 있다.
실습 코드
Project
오늘의 목표 및 진척상황
- PORORO Data 및 외부 Data 활용 방안 강구
- Bucketing 적용
- Team Idea 갈무리 및 적용
- Text Pair 실험
- Entity Token 실험
- Metric, Batch Size, Epoch 실험
- Truncation 실험
- Random Masking 실험
- OOF Pipeline 구성
직면했던 문제와 학습한 내용
- 외부 Data 및 Bucketing
원래 계획은 증강한 Data와 외부 Data에 대한 실험을 진행하고, Bucketing Code를 구성하려고 했다. 뾰족한 Idea가 없던 것도 있고, Bucketing과 관련된 Code를 보다가 완전 지친 상태였다. 현재 Code 상태가 더 나은 실험을 하기에 제한적이었고, Native Pytorch Code를 구성해야하나 계속 고민했다.
- Team Idea 갈무리
정말 유익하고 재밌었던 Team Meeting이었다. 이틀밖에 지나지 않았는데 다들 다양한 실험을 진행했고, 실제로 성능 향상과 밀접해보이는 Idea를 공유해줬다. 위 Idea 중에서 당장 적용하기 좋은 것들과, 재실험이 필요한 사항들을 오늘 실험하기로 결정했다.
- 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를 사용해 학습을 진행시켜봤다. 너무 기분 좋게도, 처음에 얻었던 그 성능을 다시 돌려받을 수 있었다.
- ENT Token 실험
위 실험을 바탕으로, Text에 Entity임을 명시하는 Idea를 재실험했다. 이번에는
[ENT]
와 같이 각 Entity에 동일한 Token을 주는 것이 아니라,<sbj>, <obj>
와 같이 입력했다. 결과적으로는 큰 차이가 없었다. 추가하나, 안하나 성능이 거의 동일하게 나왔다. 나중에 재희님 얘기를 들어보니, 이와 같이 Special Token을 추가했을 때 성능이 떨어졌다는 소식을 들었다. 앞으로 실험은 Entity에 다른 Token이나 표시를 하지 않고, 진행할 예정이다.
- 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을 사용하기로 결정했다.
- Truncation 실험
태양님이 제시해주셨고, 공유해주신 Code를 기반으로 실험을 진행했다. 제출 기회가 부족해서 실제 제출까지 수행하지는 못했지만, 사용하지 않았을 때 보다 약간이라도 성능이 오를 것으로 예상된다. 이후 Baseline 구성 이후에도 실험해보았는데, 마찬가지의 효과를 볼 수 있었다.
- Random Masking 실험
종헌님과 익효님이 공유해주신 Idea와 Code를 기반으로 실험을 진행했다. Idea가 정말 획기적이고 성능에 직결될 것 같은 느낌이 들었다. 마치 Image Task에서 Cutout과 같은 효과가 예상됐다. 예상했던 만큼 드라마틱한 효과는 볼 수 없었지만, 실제 성능 향상으로 이어졌다.
- OOF Pipeline 및 익효님 Recipe 적용
기존 Code가 더 나은 실험을 진행하기에 제한적이라고 판단됐고, 청소를 좀 해야겠다고 생각이 들었다. 추후에 KFold나 Ensemble을 진행할 것까지 고려하면, 얼른 만들어둬야겠다는 생각이 들었다.
오늘 실험들은 사실 더 좋은 성능을 내거나, 뾰족하게 좋은 Baseline을 고를 수 없었다. 그래서 아예 익효님 Recipe를 따라해보자는 생각이 들었다. 익효님이 공유해주신 Parameter Option 등을 적용해서 Baseline을 구성했고, 실험을 진행했다. Validation 기준으로는 사실 엄청난 성능향상이 보이지는 않았다. 제출까지 진행해봐야 Score를 알 수 있을 것 같다.
- 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 |
Uploaded by Notion2Tistory v1.1.0