(7강) BERT 기반 문장 토큰 분류 모델 학습

💡
각 토큰에 대한 라벨을 예측하는 Task에 대해 알아본다

문장 토큰 분류 Task 소개

주어진 문장의 각 Token이 어떤 범주에 속하는지 분류하는 Task를 의미하고, 이 Task는 이전 Task와는 다르게 모든 Token로부터의 Output을 활용한다.

대표적인 세부 Task로는 NER과 POS Tagging이 있다.

NER을 수행하기 위해선 각 Token의 Label 정보가 필요한다. 이를 제공하는 kor_ner과 같은 Dataset이 존재한다.

문장 토큰 분류 모델 학습

이 Task를 수행하기 위해서는 형태소 단위의 토큰을 음절 단위로 분해하는 작업이 필요하다.

전체 학습과정을 도식화하면 다음과 같다.

실습 코드

문장 토큰 단위 학습

기계 독해 학습


Reference

개체명 인식

QA 1

QA 2


Project

오늘의 목표 및 진척상황

  • PORORO Data 실험 Code 설계
  • PORORO Data와 기존 Idea 실험
  • K Fold Ensemble 수행 및 Add Weight 실험
  • LR관련 Hyper-parameter 실험
  • Batch Size 실험

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

  1. PORORO Data 실험 Code 설계

    PORORO로 증강했던 Data는 결국 못쓰겠다고 생각하고 있었는데, 예상 외의 곳에서 아이디어를 얻었다. Team Meeting 때 종헌님께서 Random Masking을 Augmentation처럼 매 추출마다 다르게 적용하는 것을 목적으로 한다고 하셨다. 여기서 아이디어를 얻어서, PORORO Data도 이렇게 활용하고자 Code를 구성했다.

    먼저, Dataset 객체에 모든 전처리가 완료된 PORORO Dataset이 전달 되어야 했다. 얼른 실험해보고 싶어서 대충 list형태로 넘겨줬다. (추후 매우 큰 고통이 잇따랐다.)

    전처리에서도 처리해줘야 할 사항이 많았다. Data 생성 당시에 쉽게 처리하려고 Entity가 없어진 문장은 NaN으로 저장해뒀는데, Index 정보를 남겨두기 위해 drop_na()를 할 수가 없었다. 그래서 매 전처리 단계마다 NaN인지 아닌지를 Check해야 했고, 누더기 Code가 됐다.

    기존 코드가 각종 Option의 여부에 따라 적용되는 전처리가 다르게 되어있는데, 모든 Option 속에서 에러가 발생하지 않도록 구성하는 것도 꽤나 오랜 시간이 걸렸다.

  1. PORORO Data와 기존 Idea 실험

    기존의 Baseline과 비교했을 때, 확실히 PORORO Data를 추가하는 게 더 좋은 성능을 보였다. 앞으로 PORORO Data를 쓰는것을 Base로 삼기로 결정했다.

    문득 실제로 Data가 어떤 Text로 학습했는지 궁금했다. DataLoader로 부터 출력되는 Data를 확인해보니, 난이도가 살벌했다. Truncation에 의해 앞뒤도 잘려있고, Random Masking으로 마스킹되고, 번역체 말투인 Text를 학습하고 있었다. 그래서, 다른 Option의 적용 여부를 바꿔가며 재실험을 진행했다.

    결론은, PORORO Data 활용 및 Truncation과 Random Masking을 모두 적용하는 것이 가장 좋은 성능을 보였다.

  1. K-Fold Ensemble 수행 및 Add Weight 실험

    여태 Ensemble 없이 단일 모델로 실험을 계속 수행했으나, 이제는 Ensemble Code 검증 및 최종 Submit을 위해 준비해야겠다고 생각했다. 위 실험 조건에서 K-Fold Ensemble을 수행했는데, Code의 문제로 또 한참을 고생했다. 확실히 누더기처럼 코드를 짜면 안되겠다는 것을 다시 한 번 느꼈다.

    Trouble Shooting 후에는, Add Weight에 대한 실험을 했다. 이는 LB로 체크를 했다. 위 모델 기준 결론은, No Add = Weight 0.2 ≤ Weight 0.1이었다.

  1. LR 관련 실험

    익효님과 매우 유사한 구조로 구성을 했는데, 내가 생각한 최적 LR과 익효님이 사용한 LR이 꽤 큰차이를 보이고 있어서 확인이 필요했다. LR 자체의 값과, Scheduler의 값, Weight Decay와 Warm up 등의 Option을 바꿔가며 실험했는데 결국 이전에 찾아놨던 Option이 최적의 성능을 보였다.

  1. Batch Size 실험

    사실 이전에도 했던 실험이지만, Office Hour 때 다시 언급돼서 실험을 진행했다. 기존의 Option은 32였고, 64에 대해서 K-Fold 학습을 돌렸다. Validation 상으로는 32가 더 좋아보였는데, 실제 제출은 조금 달랐다. 제출 시간 문제로 64 Batch는 4개의 Model만 Ensemble을 했는데, 32보다 높은 Score가 나왔다. 이게 4개만 사용해서인지도 재실험이 필요하겠다. 최종적으로는 64 Batch Model 4개와, 32 Batch Model 5개를 Ensemble하여, 80.4의 Score를 갱신했다.

추가로 진행 할 사항

  • Stratified K-Fold 적용
  • R-BERT Model 실험

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

[P2] Day 59  (0) 2021.04.26
[P2] Day 58  (0) 2021.04.26
[P2] Day 56  (0) 2021.04.26
[P2] Sunday 18 April  (0) 2021.04.26
[P2] Saturday 17 April  (0) 2021.04.26

+ Recent posts