국문과 유목민

[일일리포트] Day 73 (Level2_MRC_4) 본문

IT 견문록/2022_부스트캠프 AITech 3기(100일)

[일일리포트] Day 73 (Level2_MRC_4)

논곰 2022. 5. 3. 22:27

해당 일일리포트에서는 네이버 커넥트에서 진행하는 '부스트캠프 AI Tech 3기'에서 배운 내용을 다루고 있습니다. 저작권 이슈 때문에 관련 자료를 올릴 수는 없기에 핵심 이론과 코드를 요약해서 올리고 있기에 내용이 부족할 수 있습니다.

▶ Today I Learned (핵심 요약 정리)

Korquad Fine-tuning

SDS KorQuAD 1.0 성능 개선 발표자료

 팀원 분들께서 QA단계에서 KorQuAD관련 모델에 대한 정보(ODQA 중 QA에 활용할 모델을 찾고자)를 찾으시다가 다음과 같은 자료[Techtonic 2020] Track 1. AI의 한국어 이해, 어디까지 왔나?(KorQuAD 1.0성능개선 Know-how)

를 발견하셨다고 하셨다. KorQuAD학습을 진행하기 전 유사 한글 데이터를 통해 1차 Fine-tuning을 진행하고, KorQuAD데이터를 가지고 2차 Fine-tuning하는 방법을 통해 성능을 올릴 수 있었다고 해서 우리 Task에 적용시켜보고자 했다. 

 이전까지 좋은 성능을 보여줬던 Roberta-large모델에 KorQuAD데이터를 통해 1차 Fine-tuning을 진행하고, 주어진 Train data로 2차 Fine-tuning을 진행하고자 했다. 1차 Fine-tuning 때는 batch-size 16에 1epoch으로만 학습을 진행했다(시간 문제). 2차 Fine-tuning을 진행할 때, lr을3e-5로 두고 학습을 진행했는데 오히려 eval 그래프가 안 좋았고, lr을 1e-5로 뒀을 때는 오히려 성능이 더 증가하는 것을 확인할 수 있었다. 현재 리더보드 성능 비교는 실험 중에 있다. 

 아무튼 지금까지 결과로 봤을 때 2차 Fine-tuning을 할 때의 learning-rate을 고려해야할 필요가 있다고 생각하며, 1차 Fine-tuning을 할 때도 좀 더 epoch을 크게 줘서 학습시키고 이를 활용해서 다시 한 번 2차 Fine-tuning을 해봐야겠다. 한가지 궁금한 점은 Fine-tuning을 진행할 때 어느정도의 batch와 epoch을 줘야하냐는 것인데, 이는 팀원들과 조금 더 얘기를 해봐야할 부분인 것 같다.

멘토링

 오늘 대회 관련 피드백과 관련된 멘토링을 진행하면서 다양한 질문을 주고받을 수 있었다. 멘토링을 통해 답변받았던 것과 알게된 것 몇 가지를 정리하고자 한다.

 

Q1. 체크포인트 파일 생성 시 optimizer.pt나 scheduler.pt, trainer_state.json의 역할

A1. 체크포인트를 불러올 때, 학습이 진행되던 단계를 그대로 가져오기 위해서 lr_scheduler나 optimizer, trainer의 상태에 대한 정보가 필요하다. 그리고 저 파일들이 그러한 상태에 대한 정보를 담고 있는 파일들이다. 추가적으로 테스트를 해봤는데, 저 파일들을 지우지 않고 체크포인트를 불러오면 기존 학습이나 step에 이어서 학습이 진행되는 것을 확인할 수 있었다. (2000step까지 학습을 진행했으면, 2000step부터 시작됨)

 

Q2. Lr Shceduler의 역할이 무엇인가? -> Batch Size가 어떤 역할을 하는지 아는가? (어쩌다보니 해당 질문이 나왔음)

A2. 실험 속도와 관련되어 있다. 배치 사이즈가 커지면 속도가 빨라지는 것 이외에 장점이 없다. 하지만 배치 사이즈가 작아지면 일반화 성능이 올라가게 된다. 하지만, 배치사이즈가 크더라도 lr을 높게 줌으로써 일반화 성능을 높일 수 있다. 그리고 높은 lr을 주기 위해 lr Scheduler를 사용한다.

 (배치 사이즈가 커지면 속도 빠른 것 이외에 장점이 없는 게 사실일까? 이에 대해 좀 더 생각해볼 필요가 있어보인다.)

▶ Review (생각)

 오늘 팀원분들께서 좋은 자료를 공유해주셔서 새로운 실험을 할 수 있어서 좋았다. 1차 Fine-tuning을 진행함에 있어서 Epoch을 1만 돌렸는데도 꽤 괜찮은 그래프를 확인한 것 같아서 오늘 자기 전에 Epoch을 3정도로 돌려놓고 1차 Fin-tuning을 하고 내일 오전 중에 2차 Fine-tuning을 할 계획이다.

 근데 요즘 뭔가 내가 다른 팀원분들의 일을 뺏어서 하나라는 생각이 든다. 이번에도 팀원분들께서 공유해주신 정보를 통해서 하게 된 실험인데 다른 분들께서 하실 수 있는 일을 내가 뺏어서 한 걸까라는 생각이 들었다. 이 부분에 대해서 팀원 분들과 얘기를 나눌 필요가 있을 것 같다. 조심히 얘기를 꺼내봐야 할 것 같다.

 추가적으로 오늘 멘토링 시간에 멘토님께 질문을 하던 도중 갑자가 역으로 질문을 받게 되었다. 멘토님께 개인적으로 이력서 피드백을 부탁드렸었기에 겸사겸사 면접 질문처럼 물어보셨었다. 그런데 내가 안다고 생각했던 개념들이었는데 막상 얘기하려고 하니 잘 대답을 못했었다. 면접처럼 질문을 하실 줄 몰랐기 때문에 준비가 안 되었다는 핑계를 댈 수는 있겠지만 뭔가 기본적인 부분이었던 것 같아서 대답을 제대로 못한 게 실망스러웠다. 머리로는 이해했다고 생각했는데 말로 설명을 하지 못한 것 같은 느낌이 있어서 여러모로 아쉬웠다.

 그래서 블로그 정리한 내용들을 다시 한 번 보면서 틈틈이 이론을 정리해야할 필요가 있겠다는 생각을 했다. 어차피 면접을 보게 되면 멘토님이 말씀하셨던 것처럼 해당 내용들에 대해서 충분히 질문이 들어올 수 있다. 특히 프로젝트에서 맡았던 부분들이 새로운 모델들을 적용시키거나, 하이퍼파라미터 튜닝을 구현하고 적용시키면서 변화시키고 학습시키는 부분에서 성능 향상을 맡기도 했었다. 그러다보니 이러한 부분에 대해 질문이 들어왔을 때 어떤 근거를 가지고 얘기할 지에 대해서 간단하게라도 생각해둘 필요가 있다. 이번 멘토링을 계기로 부족한 부분을 깨달을 수 있었다.

 마지막으로 최종 프로젝트와 관련해서 생각해 볼 문제가 많이 있는 것 같은데, 이에 대해서는 내일 팀원들과 같이 얘기를 나눌 필요가 있어 보인다.