포스코 청년 AI·BigData 아카데미에서 콩글리시를 자연스러운 원어민 표현으로 바꿔 주는 시스템을 팀으로 만들었습니다. 예를 들어 "I'm very exciting to meet you" 같은 문장을 "I'm really excited to meet you"처럼 고쳐 주는 것이 목표였습니다. 문법 교정기는 문법은 맞지만 어색한 표현을 잘 잡지 못해서, 생성 모델로 접근했습니다.
저는 교정 데이터 구축과 모델 실험을 맡았습니다. 이 글은 그중 학습 전략을 비교하다 겪은 일입니다.
데이터를 두 종류로 만들었다
교정 데이터를 두 단위로 구축했습니다.
- 단어 단위: 콩글리시 단어·표현 → 원어민 표현 쌍 (예: eye shopping → window shopping 같은 유형)
- 문맥 단위: 어색한 문장 전체 → 자연스러운 문장 쌍
모델은 FLAN-T5에 LoRA를 붙여 파인튜닝했습니다. 전체 가중치 대신 작은 어댑터만 학습해 제한된 GPU에서도 여러 번 실험할 수 있었습니다.
가설: 쉬운 것부터 차례로 배우면 더 잘할 것이다
사람이 단어를 먼저 익히고 문장을 배우듯, 단어 단위로 먼저 학습하고 이어서 문맥 단위로 학습하면 더 좋을 거라고 생각했습니다. 그래서 세 가지 전략을 같은 조건에서 비교했습니다.
| 전략 | 방법 |
|---|---|
| A. 단어 → 문맥 순차 | 단어 데이터로 학습한 모델을 이어서 문맥 데이터로 학습 |
| B. 문맥 → 단어 순차 | 순서를 반대로 |
| C. 통합 학습 | 두 데이터를 섞어 한 번에 학습 |
평가는 BERTScore F1로 했습니다. 교정 결과는 정답이 하나가 아니라서, 단어가 정확히 일치하는지보다 의미가 얼마나 가까운지를 보는 지표가 적합하다고 판단했습니다.
결과: 순차 학습에서 앞 단계 성능이 무너졌다
순차 학습에서 이상한 현상이 보였습니다. 앞 단계 학습으로 얻은 성능이, 다음 단계를 학습하고 나니 BERTScore F1 0.47에서 0.32로 떨어진 것입니다.
두 번째 데이터를 배우면서 먼저 배운 것을 잊어버린 셈입니다. 신경망이 새 작업에 맞춰 가중치를 갱신하면서 이전 작업에 필요한 정보를 덮어쓰는 현상으로, catastrophic forgetting이라고 부릅니다. 개념으로만 알던 현상을 직접 실험 결과로 확인한 셈입니다.
순서를 바꾼 경우까지 포함해 순차 학습 결과는 0.32~0.47에 머물렀습니다. 순서를 잘 고르는 문제가 아니라, "나눠서 차례로 학습한다"는 방식 자체를 다시 봐야 했습니다.
통합 학습으로 전환
두 데이터를 섞어 한 번에 학습한 C에서 검증 BERTScore F1이 약 0.74가 나왔습니다. 순차 학습(0.32~0.47)보다 확실히 높았습니다.
여기에 팀에서 만든 RAG를 결합했습니다. 다국어 문장 임베딩과 FAISS로 입력과 비슷한 교정 예문 5개를 찾아 모델 입력에 함께 넣어, 모델이 비슷한 사례를 참고해 교정하도록 했습니다. 프로젝트는 아카데미에서 장려상을 받았습니다.
배운 것
- 직관은 가설일 뿐입니다. "쉬운 것부터"는 그럴듯했지만, 같은 조건에서 비교해 보니 틀렸습니다. 전략을 하나만 정해 밀고 나갔다면 원인도 모른 채 낮은 성능을 받아들였을 겁니다.
- 각 단계 직후의 성능을 따로 기록해 둔 덕분에 원인을 찾을 수 있었습니다. 마지막 점수만 봤다면 "그냥 성능이 낮다"로 끝났을 것입니다.
- 순차 학습이 꼭 필요하다면 이전 데이터를 일부 섞는 replay, 가중치 변화를 제한하는 정규화(EWC 등)를 검토해야 합니다. 이번에는 데이터가 크지 않아 통합 학습이 가장 단순하고 효과적인 답이었습니다.