일상생활에서 대화는 항상 이루어지고 있습니다. 대화를 하는 도중에 이를 요약하게 되면 대화에 집중할 수 없으며, 대화 이후에 기억에 의존해 요약하게 되면 오해나 누락이 추가되어 주관이 많이 개입되게 됩니다. 이를 돕기 위해, 우리는 이번 대회에서 "일상 대화를 바탕으로 요약문을 생성하는 모델을 제작"합니다. 최소 2명에서 최대 7명의 화자가 등장하며, 최소 2턴에서 최대 60턴으로 구성된 대화문 12457개가 문제해결을 위한 데이터셋으로 제공됩니다.
Timeline
24.03.08 ~ 24.03.20 19:00
gantt chart
Description of the work
Hugging Face의 pretrain된 Kobart-summarization 모델을 finetuning 함.
Kobart의 데이터 input에 맞도록 Data 전처리와 Dataset클래스를 정의함.
여러 가지 Hugging Face 모델을 finetuning 해보고, hyperparameter 수정을 통해 모델의 성능을 향상 시킴.
NLP 데이터를 Augmentation함.
Noise 추가 (KoAEDA)
형태소 분석기로 유의어 교체 (KWN - Korean Word Net / KoEDA)
RI - 임의 단어 삽입, RS - 두 단어 위치 변경, RD - 임의 단어 삭제 (KoEDA)
Solar API 및 Openai API로 Prompt Engineering을 하여 데이터 증강.
Back Translation 기법을 활용하여 Augmentation을 진행함. (google translate)
Train Dialogue, Summary EDA
Train의 "Dialogue, Summary" feature의 글자수를 한 번 Box plot과 Histogram으로 표현해보았다. 우리는 Dialogue를 전달 받으면 Summary를 생성하는 모델을 제작 중이다. Train Summary의 Word Count 이상으로 Test의 Summary를 생성하게 되는 것이 의미가 없다고 생각해서 다음 EDA를 진행하였다.
Train Dialogue의 Unigram과 Bigram, Trigram 상위 14개의 Heatmap을 표현
Train Summary의 Unigram과 Bigram, Trigram 상위 14개의 Heatmap을 표현 Evaluation Metric은 ROUGE이다. 모델 요약본과 참조 요약본 간에 겹치는 unigram과 bigram, n-gram의 수를 비교하며 스코어를 낸다. 이에 따라서 향후 Data preprocessing 시, 이와 같은 관점들을 적용시켜 모델의 성능 향상에 도움이 되지 않을까 싶어서 다음과 같은 Train Dialogue, Summary 의 n-gram Heatmap을 그려보았다.
Test Dialogue EDA
Test Dialogue의 Unigram과 Bigram, Trigram 상위 14개의 Heatmap을 표현
Train과 Test의 양상을 비교해보기 위해서 다음과 같은 EDA를 진행해보았다.
KoEDA : RI - 임의 단어 삽입, RS - 두 단어 위치 변경, RD - 임의 단어 삭제
Solar API 및 Openai API로 Prompt Engineering을 하여 데이터 증강.
google translate API, papago API로 한국어 -> 영어 -> 한국어 번역 후, 기존 데이터와 merge. ※ 위 이미지에서 Best 라고 되어있는 것은 Private 기준 입니다. ※
Augmentation을 결정한 이유 원본 dataset으로 훈련시키게 될 경우, val set에 대해서 모델의 rouge-1, rouge-2, rouge-l 스코어는 점차 상승하였다. 허나 평균적으로 6epoch이 지나고 나면 loss 값이 조금씩 올라가기 시작했다. 학습된 모델의 best score와 학습되었던 것들 중 loss가 가장 작은 것으로 train의 일부를 inference시켜보았는데, 모델이 잘 추론하지 못하였다. 이는 모델이 학습하기에는데이터의 양이 작았고, 이에 따라underfitting이 일어난다는 사고로 이어져 데이터를 증강하기로 결정했다.
실험 : 몇 개의 데이터 개수가 훈련하기에 적합한가? (증강 기법 : 기존 데이터 + KWN 유의어 대체 데이터) 데이터 증강에 앞서서 몇 개의 데이터 개수가 적합한지 실험을 하고자 했다. 따라서 기존 12457개에서 데이터를 30000개 / 50000개 / 70000개 / 100000개 / 150000개로 증강하고 데이터 개수에 따른 모델마다 rouge-1 / rouge-2 / rouge-l 을 가장 조화롭게 좋게 보이고 있는 모델로 inference를 하여 final score를 비교하여 데이터 개수를 정하는 방법을 생각해보았다. 기존 data 및 증강된 데이터로 훈련시켜 나온 best score. score와 best score가 나온 epoch, 해당 모델로 inference를 하여 나온 Final score 실험 결과에 따라 데이터 증강의 가장 적절한 값은 50000~70000개 정도라고 생각하였다.
50000~70000개로 정한 이유 이 대회에서 public과 private data의 비율은 5:5 였다. 따라서 위에서 보이는 final score의 결과가 public에 대해서만 좋은 결과를 보일 수 있다. 하지만 데이터의 수가 12457개, 30000개일 경우와 50000개의 데이터로 훈련시킨 경우의 final score가 1점 이상 차이가 난다. 갑작스럽게 스코어가 많이 차이나기에 이러한 결정을 하게 되었다.
로스 값이 상승함에도 불구하고 50000~70000개를 훈련 데이터 셋의 증강 기준으로 정한이유 wandb에서 보여준 위 그래프를 확인해보시면, loss 최저값을 찍고 1epoch에서 모델들이 가장 좋은 rouge 값을 보여주고 모든 값이 하락합니다. loss 값이 오르더라도 이는 모델이 훈련 데이터에 과적합되지 않고, 검증 데이터에서 일반화되고 있는 경우이기에 로스 값이 증가하였다고 생각했습니다.
Back translation (최종 선택 방법. 2번)
한국어에서 영어로 번역하고 잘 학습된 영어 생성 모델로 문장을 생성. 생성된 문장을 한국어로 다시 번역하여 결과를 도출하는 방식. 이와 같은 방식을 택한 이유 : 대다수 NLP 모델의 경우, 질이 좋고 양이 많은 영어 데이터로 잘 학습되어져 있기 때문. 결론 : Base Line score와 비슷하거나 0.3 정도 낮아짐. Translater를 google translate와 papago translate를 사용해봤는데 둘의 성적 차이가 0.05 정도로 translater의 machine learning 기법의 차이 때문인 것 같음. 서로 사용되는 형태소 분석기가 다르기 때문이라고 생각됨. 하지만 대회에서는 이와 같은 방법으로 학습 및 추론을 더이상 사용하지 않기로 결정함. 한국어를 학습해서 한국어로 생성된 문장과, 영어를 학습해서 생성된 영어를 번역하여 만들어진 한국어의 문장이 읽어보았을 때 현저히 차이가 있어보였음. 더불어 google translate로 성적이 미세하게 좋게 나와서 이후 google translate을 사용하기로 결정.
학습 데이터를 영어로 번역 후, 다시 한국어로 번역하는 형태로 Data Augmentation에 사용함. ※ papago API와 DeepL API는 사용량의 제한되어있음. 사용하다가 사용량 초과로 사용 불가. 이후 Solar API 와 google translate API로 back translation을 진행함. 실제로 Back translation 기법을 통해서 데이터를 증강하자 기존 final_result에서 0.8 이상 증가하였다.
Mix : Backtranslation + KWN + KoEDA + AEDA + hyperparameter tuning 최종 Best score는 42.5474의 기법을 활용한 것이었다. LLM Model의 훈련 데이터에 Noise를 주면 좋다는 reference가 많았다. 따라서 train data에 noise를 추가할 수 있는 기법들을 많이 검색하고 찾아서, 기존에 잘 학습된 방식에 augmentation 기법을 추가하는 방식으로 진행했다. 다행히 기존 41점대만 유지하다가, 42점을 최초로 돌파하며 LLM fine tuning에 자신감을 얻었다.
3. Process : Issues
- GPU 메모리가 부족해서 Kobart보다 큰 모델들을 훈련시켜서 결과를 얻을 수 없었던 점이 아쉬웠다. (현재 사용하고 있는 GPU는 RTX 3090 VRAM, 24GB 였다.)
- NLP task를 진행하기에는 14일이라는 시간이 너무 짧아서, 학습 후 나오는 inference들 속에서 차이점을 발견하고 개선해보는 연구를 진행하지 못한 점들이 아쉬웠다.
- 데이터를 증강하기 위한 기법인 Pororo 를 설치하는데 약 2일 정도의 시간을 잡아먹었음에도 불구하고 해당 모듈로 데이터를 증강한 결과가 좋지 못해서 아쉬웠다.
- T5 모델로 학습해보지 못한 것이 아쉬웠다. T5의 경우 task를 꼭 추가해줘야한다. 그래서 prefix로 "summarize: "를 추가해줬다. 하지만 당시 나왔던 결과들이 다음과 같았다.
T5 훈련 결과
train epoch가 지날수록, eval loss는 떨어지는데 ROUGE score는 하락한다. 처음에 코드를 정확하게 파악하지 않고 Kobart보다 더 큰 모델인 T5에게 훈련시키는 데이터가 적었기 때문에 underfitting이 난다고 판단을 했었다. 그래서 T5 모델을 사용해보지 못하고, Kobart를 fine tuning해서 대회를 마무리 했었다. 대회가 마무리 된 후에 더 research를 해보니 T5 모델의 경우 decoder에 input을 넣어주지 않는 점이었다. Kobart와 mbart 등 다른 여러 가지 모델들을 fine tuning하면서, 해당 부분을 점검하지 못해서 발생한 일이었다. 앞으로 모델을 변경할 때, 코드 하나하나를 잘 뜯어봐야겠다.
- Model 자체에 noise를 주는 기법들을 활용해보았는데, 오히려 score가 떨어지는 경향이 있었다. 대회 기간이 적어서 해당 기법들을 통한 연구를 해보지 못했다. Token Dropout, Token Substitution, Token Masking 등 기법들을 통해 모델을 학습시켜서 성능을 높혀보고 싶다.
4. Role
팀원으로써 다음과 같은 역할을 담당했었다.
1. train data EDA
2. KWN(Korean Wordnet) pickle을 활용한 SR 증강 기법 코딩
3. Summarization task에 걸맞는 Hugging Face pretrain model research 및 기록
4. wandb 구현 및 설명
5. 증강 기법(Back translation, KWN SR, KoEDA, AEDA)을 활용한 연구 방향성 제시
train data를 EDA 할 때는 2가지 관점으로 진행하였다.
1. train data 속에서 빈도 수가 많은 n-gram이 어떻게 구성되어있나?
2. train data 속에 있는 noise는 무엇이 있나?
1의 관점을 위해서 "2.Process : Competition Model" 의 EDA를 진행하였다. 2의 관점을 위해서는 먼저 함수로 특수 기호가 어떠한 것들이 있는지를 코딩으로 발견하였다. 그 결과 "2.Process : Competition Model" 의 Data preprocessing의 표를 만들 수 있었고, 그 과정으로 데이터를 handling 하였었다.
최종 전략 Train Data EDA 및 여러 가지 Data Augmentation 기법을 조합하여 fine tuning 하기
Self-Evaluation
WanDB를 활용하여 모델의 score들을 서로 비교해봄
NLP data의 여러 가지 증강 기법들을 찾아서 직접 진행해봄
나만의 논리를 구축하여 LLM 모델을 fine tuning 하며 모델의 score를 높여봄.
Open API와 Solar API로 prompt engineering을 통해 데이터를 증강해봄.
Kobart 및 T5 모델의 구조에 대해서 알게됨
Hugging Face를 활용하여 모델을 fine tuning 해봄.
좋은 변화
논리를 구축하지 않고 스코어에 집착하던 습관을 고침
Research를 통해서 알게 된 방법들을 구현해봄
NLP task에 익숙해짐
NLP task에 대한 깊고 다양한 관점에 대한 시야가 열림
나쁜 변화
가지고 있는 제한된 Computing 환경에서 Lora tuning을 해보지 못함.
T5 모델에 대한 더 깊은 research를 통해서 T5 모델을 훈련시킬 수 있었는데 그렇지 못함. 이 과정을 통해서 내게 가지고 있는 좋지 못한 습관을 발견하였다. 따라서 어떻게 더 꼼꼼하게 paper와 code를 읽을 지에 대한 방향성을 잡게 되었다.
7. End of the Project
작년 10월에 시작한 Upstage AI Lab이 이번 대회를 끝으로 딱 하나의 대회만을 남두고 있다. "2주" 라는 시간은 정말 길다면 길고 짧다면 짧다. 그렇기 때문에 오늘 하루의 1시간이 더 소중해지고, 어떻게 하면 더 효율적으로 잘 활용하여 밀도 깊은 시간을 보낼 수 있을지 고민하게 되는 것 같다.
이러한 이야기를 하는 이유가 뭔지 다들 궁금할 것 같다. "대회" 라는 단어로 어떠한 시간을 시작하기로 마음 먹기 시작하면 나는 몰입하기 시작한다. 이 짧은 시간 내에 주어진 환경에서 내가 할 수 있는게 뭘까? 할 수 있는 것들이 보이기 시작하면 해당 문제들을 해결하기 위해서 정보를 수집한다. 정말 많은 정보들이 수집된다. 그 중에는 정말 쓸 수 있는 정보도 있고, 쓸모 없는 정보들도 있다. 그러한 것들을 정리해서 잘 가공하면 벌써 3일 정도가 지나가 있다. 해당 정보들을 이해하고 활용하다보면 3일 정도가 또 지나있다. 그러면 대회는 7일이 남아있다.
이제부터 연구를 하기 시작한다. 내가 찾아온 정보들을 하나씩 적용해보면서, 무엇이 장점이고 무엇이 단점인지 비교한다. 단점은 보완하고 장점을 살린다. 그렇게 대회 마지막 날 오후 7시까지 정말 해볼 수 있는 것들을 최대한 다 해보려한다.
중요한 건 그럼에도 불구하고 내가 생각한 것들을 다 해볼 수가 없다. 인 것 같다.
매번 아쉽다. 다해보지 못해서, 뭔가 역량을 다 발휘하지 못한 것 같아서. 더 성장하고 싶다. 그러면 내가 하고 싶었던 연구들을 전보다 더 해볼 수 있을 것 같다.
이번 대회도 정말 아쉬운 대회였다. 함께 열심히 여러 Task를 고민하고 연구해준 팀원들에게 너무 고맙다.