Closed nonegom closed 2 years ago
이번 실험에서는 MRC모델에 KorQuAD데이터를 활용해 Finetuning을 2번 진행해서 성능을 올리고자 했다. 비교한 모델은 우리 조에서 SOTA를 달성한 모델( KLUE/Roberta-large: 리더보드 EM: 60, F1: 70.42)을 기준으로 진행했다.
1차 finetuning은 KLUE/Roberta-large모델을 korquad데이터를 통해 1차 Fine tuning을 진행했다. learning_rate=3e-5, batch_size=16, Epoch=1로 설정해서 학습을 진행했다. 다음과 같이 세팅을 한 이유는 OOM문제와 데이터 양이 많아지다보니 학습 시간이 길어졌기 때문이고 (실제 1Epoch에 2시간 30분 정도 소요됐다)
(SOTA/fintuneKorquad_train_epoch3, lr3e-5) 1차 Finetuning만을 진행한 모델의 evalatuon 그래프가 괜찮았기에 inference(top_k_retrieval 40)했을 때 성능이 괜찮을 것이라고 생각해서 제출해봤는데, 실제 리더보드 성능은 [EM:53.75 F1: 66.5600]이 나왔다.
(SOTA/fintuneKorquad_train_epoch3, lr1e-5) 이에 따라 2차 Finetuning을 진행했고, batch_8, lr_3e-5 (기존 SOTA 세팅 값)으로 학습해서 제출을 했다. 실제 동일한 파라미터 세팅값으로 제출했을 때 큰 성능향상이 있을 것이라고 기대했지만, [EM:55.4200 / F1: 66.6400]의 결과가 나왔다. 실제 1차 Finetuning모델과 비교했을 때 F1에서는 정말 큰 차이가 없었고, 대신 EM해서 1.7정도 상승한 것을 확인할 수 있었다.
그래프를 확인한 결과 2차 Finetuning 당시 오버피팅 되었을 것으로 판단, lr을 1e-5까지 낮춰서 학습을 진행했다. 그리고 해당 모델을 제출했을 때 [EM:59.5800/F1:71.1600]으로 크게 상승한 것을 확인할 수 있었다. 해당 F1 score는 기존 SOTA모델과 비교했을 때 0.8 정도 상승한 점수였다.
앞선 1차 Finetuning의 결과가 괜찮게 나왔기에, 좀 더 발전시킬 수 있을 것이라고 생각해 Epoch 3으로 해서 1차 Fine-tuning을 진행했다. 하지만 결과는 좋지 않게 나왔다.
해당 결과를 봤을 때, learning_rate 스케줄링이 다르게 되면서, Epoch 1을 지난 이후부터 Overfitting이 된 것 같았다. 따라서 1차 Fine-tuning을 할 때, Epoch를 1로 둔 모델을 대상으로 하는 게 좋다는 생각을 했다.
추가적으로 이전 1차 Finetuning한 모델의 체크포인트를 보면서 그래프 상에서 오버피팅 된 것 같은 지점에서 lr을 더 작게 (3e-6)줌으로써 학습을 진행해보기도 했는데, 실제 그래프 상으로 유의미한 성적 변화는 없었다. 참고 링크
오버피팅임을 예상하시고 학습률을 낮추셨는데 거기에 대한 의문이 2개 정도 드는데요
아마 오버피팅이라는 부분에서 해당 질문을 주신 것 같은데, 성능이 저하되는 이유를 찾다보니 '오버피팅이지 않았을까' 라는 생각을 했던 것이라서 정확한 표현이 아닐 수도 있을 것 같네요.
lr을 줄여야겠다고 생각한 이유는 2차 Finetuning을 진행할 때, 초기 모델(보라색)보다 2차 finetuning을 진행한 모델들의 training loss가 더 낮은 상태에서 시작되었습니다. 그래서 이전 모델의 학습(1차 파인튜닝)이 2차 파인튜닝 모델에도 어느정도 영향을 주고 있다는 생각을 했습니다. (근거가 부족해 합리적이지 않을 수 있습니다만, 여기서 이전 학습의 연장으로써 오버피팅이라는 느낌으로 적었습니다) 그래서 1차 fine-tuning을 진행했을 때의 3e-5보다 조금 낮춘 1e-5의 lr로 진행하고자 했습니다.
설명의 비약이 있어서 전달이 잘 안 된 것 같네요. 아 그리고 1번 질문에 대해서 '오버피팅이 예상이 되었었다면 체크포인트를 인퍼런스'하는게 맞기는 한데 이전 모델과 유사한 eval 분포를 보이지만 점수는 낮았기 때문에 제출하지 않았습니다.
앞선 실험의 결과로 1차 Finetuining을 진행한 이후 2차 Finetuning을 할 때, learning_rate을 작게 주면 성능이 더 증가하는 것을 확인할 수 있었다. 그래서 이번에는 learning_rate을 9e-6으로 해서 실험을 진행했다. learning_rate이외의 조건은 동일하게 주고 실험을 진행했고, 실험 결과 그래프는 다음과 같았다.
기존 SOTA 모델(보라색) 보다 새로운 모델(핑크색)이 EM, F1, loss 모두에서 더 좋은 결과를 보여줬다. 따라서 tf-idf, top_k_retrieval 40으로 inference를 진행했고 EM 61.67 / F1 71.30으로 이전 SOTA 대비 증가한 모습을 보여줬다. 따라서 이번에는 태일님께서 새로 구현해주신, BM-25를 통해 임베딩을 해서 Inference를 진행했고, EM 64.58 / F1 75.0200으로 새로 SOTA를 갱신할 수 있었다. 아래는 추가적으로 진행한 실험의 결과이다.
실험(Inference) | EM | F1 |
---|---|---|
기존 SOTA | 60.0000 | 70.4200 |
기존 SOTA(BM-25 okapi) | 62.9200 | 72.9200 |
TF-IDF(top_k:40) | 61.6700 | 71.3000 |
BM-25(okapi) | 64.5800 | 75.0200 |
BM-25(plus) | 63.7500 | 74.0400 |
BM-25 okapi로 인베딩했을 때 현재까지는 성능이 제일 좋게 나오기 때문에 이후 Inference도 BM-25로 하는게 괜찮을 것 같다. 추가적으로 2차 Finetuning에 대해 파라미터 튜닝을 해보는 것도 괜찮을 것 같다는 생각이 든다.
Task 수행이유: 이번에 pretrained된 모델을 찾던 다른 팀원분께서 다음 이미지를 공유해주셨다. SDS에서 korquad 데이터에 대해 성능을 높이기 위해서 총 2번의 Fine-tuning을 진행해서 성능을 올렸다고 한다. 이번 프로젝트에서 다른 데이터를 사용해도 되기에, 이와 같은 형태로 학습을 진행해보고자 한다.
목표: 위의 학습을 벤치마킹해서 1차 Fine-Tuning을 KorQuAD로 해보고, 2차 Fine-tuning을 현재 Training데이터로 해보고자 한다.