Skip to content

AD-Styles/kogpt2-korean-finetuning

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

133 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

🚀 KoGPT2 Fine-Tuning & Fixing Tokenizer Errors

KoGPT2 도메인 특화 파인튜닝 및 토크나이저(Tokenizer) 최적화

Python PyTorch HuggingFace Transformers


📌 프로젝트 요약 (Project Overview)

본 프로젝트는 단순 범용 텍스트 생성 혹은 어색한 직역체 문장을 내뱉던 영문 생성에 치중된 GPT-2 모델의 한계를 넘어, KoGPT2를 기반으로 한국어 영화 리뷰 도메인 특화 모델을 구축한 사례입니다. NSMC 데이터 파인튜닝을 통해 구어체 표현력을 극대화했으며, 추가로 학습 과정에서 발생한 토크나이저 인덱스 어긋남(한글 인코딩 깨짐) 문제를 구조적으로 해결한 트러블슈팅 과정을 담았습니다.


🎯 핵심 목표 (Motivation)

구분             세부 내용
성능 극대화 범용 지식만 가진 GPT-2 모델의 어색한 직역체를 극복하고, 영화 리뷰 분야에서 자연스러운 구어체 생성을 구사하도록 모델 최적화
도메인 특화
파인튜닝
KoGPT2 모델에 NSMC(네이버 영화 리뷰) 데이터를 주입하여 구어체 중심의 문맥을 생성하도록 Causal LM 재학습
Tokenizer
안정화
한국어 자연어 처리 모델에서 빈번히 발생하는 토큰 인덱스 불일치 및 한글 깨짐 문제를 디버깅하고 정상
구동 환경 설계

📂 프로젝트 구조 (Project Structure)

📂 kogpt2-korean-finetuning
├── 📄 .gitignore               # 로그 및 모델 가중치 업로드 방지
├── 📄 LICENSE                  # MIT License (AD-Styles)
├── 📄 README.md                # 프로젝트 기술 보고서 및 트러블슈팅
├── 📄 app.py                   # Gradio 기반 인터랙티브 웹 데모 스크립트
├── 📄 main_finetuning.py       # KoGPT2 파인튜닝 핵심 로직
└── 📄 requirements.txt         # 의존성 패키지 리스트 (gradio 포함)

🛠️ 기술적 구현 및 최적화 (Technical Implementation)

분류          구현 내용
데이터 및 토큰화
(Data & Tokenization)
datasets 활용 병렬 처리. AutoTokenizer 대신 PreTrainedTokenizerFast를 명시하여
라이브러리 범용 로직에 의한 사전(Vocabulary) 임의 변형 차단
도메인 적응
(Domain Adaptation)
뉴스/위키백과 위주의 기존 가중치를 영화 리뷰 특유의 감성과 인터넷 구어체 텍스트로 재배치
학습 효율성
(Training Efficiency)
데이터 샘플링(Train 3만, Eval 3천), gradient_accumulation_steps=2, fp16=True 적용으로
로컬 GPU 학습 효율 극대화
디코딩 전략
(Decoding Strategy)
Repetition Penalty(1.2), Top-P(0.92), Temperature(0.8) 조합으로 텍스트 반복 제어 및 감성적
표현력 확보

🚀 결정적 트러블슈팅: 토크나이저 안정화 (Fixing Tokenizer Errors)

구분               상세 내용
문제 현상 한글 인코딩 붕괴 및 CUDA Error
파인튜닝 중 CUDA 메모리 참조 에러 발생 및 간헐적으로 출력이 외계어로 깨지는 현상 확인
원인 분석 AutoTokenizer가 모델 초기화 시, 기본 어휘 사전(51,200)을 넘어 패딩용 새 토큰을 암시적으로 추가해
임베딩 크기를 51,201로 변형시킴...전체 인덱스 맵핑이 1칸씩 밀리며 올바른 벡터가 출력되어도 잘못된
글자로 강제 디코딩됨...
해결 방안 PreTrainedTokenizerFast를 선언하고 bos, eos, pad 토큰을 KoGPT2 체계에 맞게 하드코딩 불필요한 model.resize_token_embeddings()를 해제하여 원래 모델 구조(Vocab Size 51,200)에 완벽히 종속되도록
제어하여 인코딩 정상화

🕵️‍♂️ [Deep Dive] 토크나이저 인덱스 밀림 현상 디버깅 과정: 단순히 에러 코드를 검색하여 해결한 것이 아니라, 데이터의 흐름을 직접 추적하여 근본적인 원인을 파악하고 제어

문제 해결 단계                   디버깅 상세 내용 엔지니어링 접근 방식
1. 가설 수립
(문제 정의)
간헐적으로 한글이 깨지거나 CUDA 에러가 발생할 때, 모델 자체의 문제보다 문자를 숫자로 바꾸는 과정(인코딩/디코딩)에 논리적
결함
이 있을 것으로 판단
로그에만 의존하지 않고, 데이터 파이프라인 전체를 의심하며 문제의 범위를 논리적으로 좁힘
2. 데이터 추적
(원인 분석)
logger로 확인한 결과, 토크나이저가 모델 원래 크기(51,200)보다 1개 더 많은 51,201개의 숫자를 다루고 있음을 발견.
숫자 배열을 하나씩 직접 글자로 복원해 보며, 모든 글자가 한 칸씩 옆으로 밀려 출력되는 현상을 확인.
모델을 블랙박스로 두지 않고, 내부 숫자 데이터와 실제 복원되는 글자를 하나하나 대조하며 추적함
3. 해결 및 검증
(최종 최적화)
범용 도구가 임의로 추가한 '패딩 토큰'이 원인임을 파악.
토크나이저를 수동으로 설정해 규격(51,200)을 강제로 맞추고, 불필요한 크기 조정 로직을 제거하여 글자가 100% 일치하게 출력되도록 안정화함.
라이브러리가 알아서 해주겠지라는 생각 대신, 숫자가 들어가는 인덱스 로직을 직접 통제하여 근본 원인을 해결함


🤗 허깅페이스 라이브 데모 (Live Demo)



🤖 파인튜닝 모델 추론 결과 (Inference Results)

프롬프트 예시 (Prompt Examples)      생성된 텍스트 (Generated Review) 결과 분석 (Results Analysis)
"오늘 본 영화는" "오늘 본 영화는 다들 재밌는 영화라고 생각합니다. ..!~ ;; 이거보니까 어색함만 보시면 됩니다. ᄏᄏᄏ재밋고 좋네요. 진짜 평점보고나서 아련한 기분일것 같습니다..ᅲᅮᅳ 강추!!!..." 구어체, 초성체(ᄏᄏ), 이모티콘 등 특유의 감성을 성공적으로 재현
"이 영화의 결말은" "이 영화의 결말은 ᄏᄏᄏ!정말 재밌음~ ***-_***;;;ᅲ.^0^xns;;///->//;;,; 근데 이건 정말 졸리네요.. ;;; 그냥 영화라고만 하셨는데 평점이 너무 높아서 넘 짜증남ᄒᄏᄏ..." 긍정/부정 텍스트가 혼재되나, 날것의 인터넷 속어가 모델에 강력하게 학습됨을 확인
"배우들의 연기가" "배우들의 연기가 정말 좋았다!! 명장면 연기도 참 잘 어울렸어요~ ;; 근데 막판에 봤으면 진짜 대실망했을 뻔한 결말이...정말 지루했음..이 영화도 스토리가 너무 허술함..ᅲ.ᅮ..." 연출 칭찬과 스토리 비판이 교차하며 리뷰어의 다양한 감정선 표현

⚠️ 한계점 및 개선 방향 (Limitations & Future Work)

한계점 (Limitations) 개선 방향 (Action Plans)
감정의 일관성 부족
한 리뷰 안에서 칭찬과 비판이 뒤섞여 모델의 태도가 모호해지는 현상
감정 제어(Conditioning) 도입
문장 앞에 [긍정] 또는 [부정] 태그를 붙여 모델이 처음부터 끝까지
정해진 감정선을 유지하며 글을 쓰도록 유도
의미 없는 기호 남발
특수문자나 자음/모음(***, ;;;)이 과하게 반복되어 가독성을 해치는 현상
데이터 정제 과정 강화
학습 데이터 단계에서 불필요한 중복 표현을 걸러내고, 정규표현식을 통해 노이즈가 섞이지 않도록 필터링 시스템 구축
문장이 중간에 툭 끊기는 현상
할 말이 다 끝나지 않았는데 문장이 갑자기
종료되어 흐름이 깨지는 경우
생성 후처리 로직 최적화
문장이 마침표나 물음표로 끝날 때까지 생성을 보장하고, 마지막 구두점 이후의 불완전한 텍스트는 자동으로 다듬는 로직을 적용

💡 회고록 (Retrospective)

제가 AI를 공부하며 가장 많이 들었던 말이 "데이터가 중요하다"와 "모델이 똑똑해야 한다"는 것이었습니다. 하지만 이번 실습은 저에게 그보다 훨씬 근본적인 깨달음을 주었습니다. 모델과 데이터를 유기적으로 잇는 '토크나이저' 라는 톱니바퀴의 정밀함, 그리고 모델의 체질을 완전히 바꾸어놓는 '파인튜닝' 의 압도적인 파괴력입니다.

처음 모델이 외계어를 뱉어내고 CUDA 에러를 일으켰을 때의 막막함이 기억납니다. 구글링으로 얻은 짧은 코드들을 붙여넣어 봐도 해결되지 않는 갈증 속에서, 제가 선택한 방법은 직접 '엔진'을 뜯어보는 것이었습니다. 51,200과 51,201이라는 단 하나의 인덱스 차이가 전체 시스템을 붕괴시킬 수 있음을 발견했고, Token ID가 한 칸씩 밀려 모든 문맥이 어긋나는 과정을 직접 출력해 보며 문제의 본질을 파고들었습니다. 이 과정은 단순히 API를 호출하는 '사용자'에서, 모델의 인덱스 로직을 통제하는 '엔지니어'로 한 발짝 성장하는 순간이었으며, AI가 결코 마법 상자가 아닌 정교한 수학적 설계 위에서 움직이는 기계임을 확신하는 계기가 되었습니다.

이 프로젝트의 진정한 정점은 '파인튜닝'을 통해 모델이 완전히 다른 존재로 탈바꿈하는 순간이었습니다. 영어에 치중되어 한국어 문맥을 이해하지 못하던 'Base 모델'에 NSMC라는 도메인 특화 데이터를 주입하는 과정은, 마치 모델에게 새로운 언어와 영화 평론가라는 '영혼'을 이식하는 작업과 같았습니다. 단순히 통계적으로 가장 유력한 단어를 찾는 기계에서 벗어나, 실제 사람이 직접 영화 리뷰를 쓰는 듯한 리듬감과 감성을 재현할 수 있게 만드는 결정적인 "조미료" 역할을 한다는것을 직접 확인하였습니다. 최종적으로는 엉뚱한 뉴스 문맥을 읊던 거대 모델이, 파인튜닝 후 날것의 인터넷 구어체와 초성체(ㅋㅋ)를 섞어가며 제법 그럴듯한 한국어 리뷰를 뱉어내는 것을 확인하며 '양질의 도메인 특화 데이터가 파인튜닝을 만났을 때 발생하는 압도적 폭발력' 을 시각적으로 증명해 낼 수 있었습니다. 완벽한 토크나이저라는 그릇 위에 세밀한 파인튜닝이라는 조각이 더해졌을 때 비로소 도메인 전문가가 탄생한다는 것을 깨달으며 저의 뜻깊은 성장의 기록을 이곳에 남깁니다.

About

"Optimizing Korean Text Generation via KoGPT-2 Fine-tuning and Decoding Strategy Analysis" / "KoGPT-2 한국어 파인튜닝과 디코딩 전략 분석을 통한 문장 생성 최적화"

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages