docs: 한국어 7감정 분류 모델 학습 가이드 추가
- AI Hub 표준 7개 감정 (Ekman 기반) 학습 방법 - 단일/멀티 GPU 학습 명령어 - 온도 보정 및 ONNX 자동 변환 - 예상 학습 시간 (RTX 3060 기준) - 51124 서버 연동 방법
This commit is contained in:
parent
e97b3e614c
commit
2827cd1fb7
176
guides/250808_7감정_학습_가이드.md
Normal file
176
guides/250808_7감정_학습_가이드.md
Normal file
@ -0,0 +1,176 @@
|
|||||||
|
# 한국어 7감정 분류 모델 학습 가이드
|
||||||
|
|
||||||
|
작성일: 2025년 8월 8일
|
||||||
|
작성자: happybell80 & Claude
|
||||||
|
|
||||||
|
## 개요
|
||||||
|
|
||||||
|
AI Hub 표준 7개 감정(Ekman 기반) 분류 모델 학습을 위한 가이드입니다.
|
||||||
|
|
||||||
|
## 7개 감정 카테고리
|
||||||
|
|
||||||
|
```
|
||||||
|
fear, surprise, anger, sadness, neutral, happiness, disgust
|
||||||
|
```
|
||||||
|
|
||||||
|
## 데이터 준비
|
||||||
|
|
||||||
|
### CSV 형식
|
||||||
|
```csv
|
||||||
|
text,label
|
||||||
|
"오늘 정말 기분이 좋아요!",happiness
|
||||||
|
"갑자기 놀랐어요",surprise
|
||||||
|
"너무 화가 나요",anger
|
||||||
|
```
|
||||||
|
|
||||||
|
### 파일 구조
|
||||||
|
```
|
||||||
|
data/
|
||||||
|
├── train.csv # 학습 데이터
|
||||||
|
├── val.csv # 검증 데이터
|
||||||
|
└── test.csv # 테스트 데이터
|
||||||
|
```
|
||||||
|
|
||||||
|
## 학습 명령어
|
||||||
|
|
||||||
|
### 단일 GPU (RTX 3060)
|
||||||
|
```bash
|
||||||
|
python train_korean_emotion.py \
|
||||||
|
--model_name klue/bert-base \
|
||||||
|
--train_csv data/train.csv \
|
||||||
|
--val_csv data/val.csv \
|
||||||
|
--test_csv data/test.csv \
|
||||||
|
--output_dir outputs/kemo-bert-base \
|
||||||
|
--epochs 4 \
|
||||||
|
--batch_size 32 \
|
||||||
|
--max_len 128 \
|
||||||
|
--lr 2e-5 \
|
||||||
|
--fp16
|
||||||
|
```
|
||||||
|
|
||||||
|
### 멀티 GPU (2×RTX 3060)
|
||||||
|
```bash
|
||||||
|
accelerate launch train_korean_emotion.py \
|
||||||
|
--model_name klue/bert-base \
|
||||||
|
--train_csv data/train.csv \
|
||||||
|
--val_csv data/val.csv \
|
||||||
|
--test_csv data/test.csv \
|
||||||
|
--output_dir outputs/kemo-bert-base \
|
||||||
|
--epochs 4 \
|
||||||
|
--batch_size 32 \
|
||||||
|
--max_len 128 \
|
||||||
|
--lr 2e-5 \
|
||||||
|
--fp16
|
||||||
|
```
|
||||||
|
|
||||||
|
## 예상 학습 시간
|
||||||
|
|
||||||
|
### 하드웨어: i9 + 32GB RAM + RTX 3060 12GB × 2
|
||||||
|
- **단일 GPU**: 3 epochs 25-45분, 5 epochs 45-75분
|
||||||
|
- **듀얼 GPU**: 3 epochs 15-30분, 5 epochs 30-50분
|
||||||
|
|
||||||
|
## 주요 옵션
|
||||||
|
|
||||||
|
- `--use_class_weights`: 클래스 불균형 완화
|
||||||
|
- `--export_onnx`: ONNX 변환만 실행
|
||||||
|
- `--fp16`: 혼합 정밀도 학습 (메모리 절약)
|
||||||
|
|
||||||
|
## 산출물
|
||||||
|
|
||||||
|
```
|
||||||
|
outputs/kemo-bert-base/
|
||||||
|
├── pytorch_model.bin # 학습된 모델
|
||||||
|
├── config.json # 모델 설정
|
||||||
|
├── tokenizer_config.json # 토크나이저 설정
|
||||||
|
├── calibration.json # 온도 보정값
|
||||||
|
├── metrics.json # 성능 지표
|
||||||
|
└── model.onnx # ONNX 변환 (자동)
|
||||||
|
```
|
||||||
|
|
||||||
|
## 핵심 특징
|
||||||
|
|
||||||
|
### 1. 온도 보정 (Temperature Scaling)
|
||||||
|
- 검증 데이터로 자동 캘리브레이션
|
||||||
|
- 과신뢰 문제 해결
|
||||||
|
- `calibration.json`에 최적 온도 저장
|
||||||
|
|
||||||
|
### 2. 평가 지표
|
||||||
|
- **Macro F1**: 클래스별 균형 성능
|
||||||
|
- **ECE**: 신뢰도 캘리브레이션 오차
|
||||||
|
- **Brier Score**: 확률 예측 정확도
|
||||||
|
|
||||||
|
### 3. ONNX 자동 변환
|
||||||
|
- 학습 완료 후 자동 변환 시도
|
||||||
|
- 실패 시 `--export_onnx`로 재실행
|
||||||
|
|
||||||
|
## 51124 서버 연동
|
||||||
|
|
||||||
|
### 1. 로컬에서 학습 완료 후
|
||||||
|
```bash
|
||||||
|
# 모델 파일 압축
|
||||||
|
tar -czf kemo-bert-base.tar.gz outputs/kemo-bert-base/
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. 51124 서버로 전송
|
||||||
|
```bash
|
||||||
|
scp kemo-bert-base.tar.gz admin@51124:/home/admin/ivada_project/
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. 서버에서 ONNX 검증
|
||||||
|
```python
|
||||||
|
# 이미 .onnx 파일이 있으면 바로 사용
|
||||||
|
# 없으면 서버에서 변환
|
||||||
|
python convert_to_onnx.py --model_dir outputs/kemo-bert-base
|
||||||
|
```
|
||||||
|
|
||||||
|
## 추론 시 온도 보정 적용
|
||||||
|
|
||||||
|
```python
|
||||||
|
import json
|
||||||
|
import torch
|
||||||
|
|
||||||
|
# 캘리브레이션 로드
|
||||||
|
with open("calibration.json") as f:
|
||||||
|
T = json.load(f)["temperature"]
|
||||||
|
|
||||||
|
# 추론
|
||||||
|
logits = model(inputs)
|
||||||
|
calibrated_logits = logits / T
|
||||||
|
probs = torch.softmax(calibrated_logits, dim=-1)
|
||||||
|
```
|
||||||
|
|
||||||
|
## AI Hub 데이터 변환 예시
|
||||||
|
|
||||||
|
```python
|
||||||
|
import pandas as pd
|
||||||
|
|
||||||
|
# AI Hub 형식 → 학습 형식
|
||||||
|
df = pd.read_csv("aihub_emotion.csv")
|
||||||
|
df_train = pd.DataFrame({
|
||||||
|
"text": df["sentence"],
|
||||||
|
"label": df["emotion"].str.lower() # 소문자 변환
|
||||||
|
})
|
||||||
|
df_train.to_csv("data/train.csv", index=False)
|
||||||
|
```
|
||||||
|
|
||||||
|
## 문제 해결
|
||||||
|
|
||||||
|
### CUDA Out of Memory
|
||||||
|
- `--batch_size` 줄이기 (32 → 16)
|
||||||
|
- `--max_len` 줄이기 (128 → 64)
|
||||||
|
- `--fp16` 추가
|
||||||
|
|
||||||
|
### ONNX 변환 실패
|
||||||
|
```bash
|
||||||
|
# 별도 실행
|
||||||
|
python train_korean_emotion.py \
|
||||||
|
--export_onnx \
|
||||||
|
--output_dir outputs/kemo-bert-base
|
||||||
|
```
|
||||||
|
|
||||||
|
## 참고사항
|
||||||
|
|
||||||
|
- **모델 선택**: `klue/bert-base` 권장 (한국어 특화)
|
||||||
|
- **데이터 크기**: 39,000 문장 기준
|
||||||
|
- **최적 epochs**: 3-5 (과적합 주의)
|
||||||
|
- **학습률**: 2e-5 (BERT 계열 표준)
|
||||||
Loading…
x
Reference in New Issue
Block a user