# data_preprocess.py
import pandas as pd
import json
# CSV 파일 불러오기
csv_file = "db/emotional_data/train/train.CSV"
df = pd.read_csv(csv_file)
# JSONL 변환을 위한 리스트
jsonl_data = []
for _, row in df.iterrows():
messages = [{"role": "system", "content": "당신은 감정을 공감해주는 챗봇입니다."}]
# 대화 쌍을 순서대로 추가
for i in range(1, 4): # 사람문장1~3, 시스템문장1~3
# NaN을 안전하게 문자열로 처리
user_text = str(row.get(f"사람문장{i}", "")).strip()
assistant_text = str(row.get(f"시스템문장{i}", "")).strip()
# 유효한 텍스트만 추가
if user_text and user_text != "nan": # 빈 문자열, 'nan' 제외
messages.append({"role": "user", "content": user_text})
if assistant_text and assistant_text != "nan": # 빈 문자열, 'nan' 제외
messages.append({"role": "assistant", "content": assistant_text})
# 메시지가 시스템 메시지만 있는 경우 제외
if len(messages) > 1:
jsonl_data.append({"messages": messages})
# JSONL 파일 저장
jsonl_file = "db/emotional_data/train/train.jsonl"
with open(jsonl_file, "w", encoding="utf-8") as f:
for entry in jsonl_data:
json.dump(entry, f, ensure_ascii=False)
f.write("\n")
print(f"✅ 변환 완료! {jsonl_file} 파일을 확인하세요. (총 {len(jsonl_data)}개 대화)")
# Output:
# ✅ 변환 완료! db/emotional_data/train/train.jsonl 파일을 확인하세요. (총 51630 개 대화)
🔬 Finetuning 과정
첫번째 시도 (로컬에서 돌리기)
로컬 GPU: RTX 3060 Ti (VRAM 8GB)
=> 학습시간이 약 21시간이 걸리고, GPU가 버티질 못해 Colab에서 자원을 할당받기로 결정했다.
그래프 분석: 손실 곡선(train/loss)은 0 스텝에서 약 1.6 이상으로 시작해 3227스텝(1epoch 완료)에서 약 1.41 으로 수렴했습니다. 초기에는 급격히 감소하다가 중반 이후에는 완만한 감소 추세를 보이며 안정화되었습니다.
의미: 손실이 감소했다는 것은 모델이 훈련 데이터를 점점 더 잘 학습하고 있음을 나타냅니다. 약 1.41 수준의 손실은 감정 대화 태스크에서 모델이 적절히 적응했음을 시사하지만, 실제 성능(예: 감정 공감 품질)은 검증 데이터로 평가해야 합니다.
해석: 손실 감소가 부드럽게 이루어졌으므로 과적합 없이 학습이 잘 진행된 것으로 보입니다. 그러나 더 낮은 손실(예: 1.3 이하)을 목표로 한다면 에포크를 추가하거나 학습률을 조정할 수 있습니다.
2. 토큰 정확도 (Mean Token Accuracy)
그래프 분석: 토큰 정확도(train/mean_token_accuracy)는 0 스텝에서 약 0.62로 시작해 3227 스텝에서 약 0.655로 증가했습니다. 초기에는 변동이 컸으나, 중반 이후에는 안정적인 상승세를 보이며 약 0.655 수준에서 수렴했습니다.
의미: 토큰 정확도는 모델이 예측한 토큰이 실제 레이블과 얼마나 일치하는지를 나타냅니다. 0.655는 모든 토큰의 65%를 정확히 예측했음을 의미하며, 감정 대화 데이터의 복잡성을 고려하면 괜찮은 수준입니다. 하지만 대화 생성 모델에서는 정확도만으로 성능을 판단하기 어렵습니다.
해석: 정확도가 0.65로 비교적 낮게 수렴한 것은 모델이 아직 학습 데이터에 완전히 적응하지 못했을 수 있음을 시사합니다.
3. 학습률 (Learning Rate)
그래프 분석: 학습률(train/learning_rate)은 0 스텝에서 약 2e-4(0.0002)로 시작해 3227 스텝에서 0으로 수렴했습니다. cosine 스케줄러에 따라 부드럽게 감소하는 곡선을 그리며, 중반 이후에는 급격히 줄어드는 경향을 보였습니다.
의미: 학습률이 점진적으로 감소하며 모델이 초기에는 크게 업데이트되고, 후반에는 미세 조정을 한다는 것을 나타냅니다. 이는 과적합을 방지하고 수렴을 돕는 일반적인 전략입니다.
해석: 학습률이 적절히 조정되어 손실 감소와 정확도 증가에 기여한 것으로 보입니다. 그러나 마지막 단계에서 너무 빠르게 0에 도달했다면, 더 긴 학습이나 다른 스케줄러(예: linear)를 고려할 수 있습니다.