Gemma-4-E4B-it LoRA 微调 情绪分类 AMDev Datawhale
Gemma-4-E4B-it LoRA 微调实验笔记
1. 项目简介
本实验基于 Google Gemma-4-E4B-it 指令模型,在 ModelScope 平台提供的情绪分类数据集 AI-ModelScope/emotion 上进行 LoRA(Low-Rank Adaptation)微调。
目标是让通用大语言模型学习情绪分类任务,输入一段文本后,仅输出对应的情绪标签。
2. 实验目标
实现一个情绪识别模型:
输入:
I feel completely heartbroken and alone.
输出:
sadness
支持六类情绪:
| 标签ID | 情绪类别 |
|---|---|
| 0 | sadness |
| 1 | joy |
| 2 | love |
| 3 | anger |
| 4 | fear |
| 5 | surprise |
3. 技术路线
整体流程如下:
ModelScope下载模型
↓
下载Emotion数据集
↓
构造Prompt-Completion格式
↓
Gemma Tokenizer处理
↓
LoRA挂载
↓
SFTTrainer训练
↓
保存Adapter
↓
推理评估
4. 环境搭建
安装依赖
uv pip install -U \
vllm \
modelscope \
transformers \
accelerate \
datasets \
trl \
peft \
scikit-learn \
pandas \
tqdm \
torchvision
主要组件:
| 组件 | 作用 |
|---|---|
| transformers | 加载Gemma模型 |
| datasets | 数据集管理 |
| trl | SFTTrainer训练 |
| peft | LoRA微调 |
| modelscope | 下载模型和数据 |
| accelerate | 单卡/多卡训练 |
5. 模型下载
使用 ModelScope 下载官方 Gemma 模型:
MODELSCOPE_MODEL_ID = "google/gemma-4-E4B-it"
model_dir = snapshot_download(
MODELSCOPE_MODEL_ID,
cache_dir="./models"
)
特点:
- 不依赖 HuggingFace Token
- 全程使用国内 ModelScope 镜像
- 下载后离线训练
模型类型:
Gemma-4-E4B-it
6. 数据集下载
使用:
AI-ModelScope/emotion
该数据集是:
dair-ai/emotion
在 ModelScope 上的镜像版本。
数据规模:
| Split | 数量 |
|---|---|
| Train | 16000 |
| Validation | 2000 |
| Test | 2000 |
数据格式:
{
"text": "I am very happy today",
"label": 1
}
7. 数据格式转换
由于 Gemma 是聊天模型,因此需要把分类任务转换成指令微调格式。
System Prompt
You are an emotion classification assistant.
Return only one label:
sadness
joy
love
anger
fear
surprise
User Prompt
Classify the emotion of this text:
I feel very lonely today.
Assistant Answer
sadness
最终形成:
[
{
"role":"system",
"content":"..."
},
{
"role":"user",
"content":"..."
}
]
对应:
{
"completion":"sadness"
}
8. Tokenizer加载
tokenizer = AutoTokenizer.from_pretrained(
LOCAL_MODEL_DIR,
use_fast=True,
trust_remote_code=True
)
若模型未定义 pad token:
tokenizer.pad_token = tokenizer.eos_token
这样能够保证批量训练时正常填充。
9. 基础模型加载
base_model = AutoModelForCausalLM.from_pretrained(
LOCAL_MODEL_DIR,
torch_dtype=torch.bfloat16
)
训练配置:
BF16 = True
FP16 = False
优势:
- 节省显存
- 保持训练稳定性
10. LoRA微调配置
采用 PEFT 的 LoRA 方案。
配置如下:
LoraConfig(
r=16,
lora_alpha=32,
lora_dropout=0.05,
bias="none",
task_type="CAUSAL_LM",
target_modules="all-linear"
)
参数说明:
| 参数 | 作用 |
|---|---|
| r=16 | LoRA秩 |
| alpha=32 | 缩放系数 |
| dropout=0.05 | 防过拟合 |
| all-linear | 对全部线性层注入LoRA |
11. 训练参数
使用:
SFTTrainer
进行监督微调。
核心参数:
per_device_train_batch_size = 4
gradient_accumulation_steps = 4
等效Batch:
4 × 4 = 16
学习率:
1e-4
训练轮数:
num_train_epochs = 1
最大长度:
max_length = 256
梯度检查点:
gradient_checkpointing = True
作用:
- 降低显存占用
- 允许更大模型训练
12. 开始训练
创建 Trainer:
trainer = SFTTrainer(
model=base_model,
train_dataset=sft_dataset["train"],
eval_dataset=sft_dataset["validation"],
peft_config=lora_config,
args=training_args,
processing_class=tokenizer
)
训练:
train_result = trainer.train()
训练过程中:
- 每5步记录日志
- 每25步验证一次
- 每25步保存Checkpoint
13. 训练前评估
先评估原始 Gemma:
pre_metrics = evaluate_model(...)
评估指标:
Accuracy
正确预测数量 / 总样本数
Macro F1
各类别F1平均
Classification Report
输出:
precision
recall
f1-score
support
Confusion Matrix
观察:
- 哪些情绪容易混淆
- 微调前后的变化
14. 训练后评估
使用:
post_metrics = evaluate_model(...)
对比:
comparison_df
内容:
| 指标 | 微调前 | 微调后 |
|---|---|---|
| Accuracy | xx | xx |
| Macro F1 | xx | xx |
| Invalid Rate | xx | xx |
用于验证 LoRA 是否真正提升了分类能力。
15. 模型保存
保存 Adapter:
trainer.model.save_pretrained(
OUTPUT_DIR
)
保存 Tokenizer:
tokenizer.save_pretrained(
OUTPUT_DIR
)
输出目录:
OUTPUT_DIR/
├── adapter_model.safetensors
├── adapter_config.json
├── tokenizer.json
├── tokenizer_config.json
└── train_metrics.json
注意:
这里只保存 LoRA Adapter。
不保存完整 Gemma 权重。
16. 推理测试
定义:
predict_emotion_ft()
测试样例:
I feel completely heartbroken and alone.
输出:
sadness
This is the best day of my life!
输出:
joy
I am really scared about what might happen tomorrow.
输出:
fear
17. 重新加载LoRA
后续无需重新训练。
加载基础模型:
reload_base_model = AutoModelForCausalLM.from_pretrained(
LOCAL_MODEL_DIR
)
加载Adapter:
reload_model = PeftModel.from_pretrained(
reload_base_model,
OUTPUT_DIR
)
即可直接推理。
18. 实验总结
本实验完成了基于 Gemma-4-E4B-it 的情绪分类 LoRA 微调。
主要特点:
- 使用 ModelScope 全流程下载模型与数据
- 单卡 BF16 训练
- PEFT LoRA 参数高效微调
- SFTTrainer 指令微调
- 六分类情绪识别任务
- 保存 Adapter 便于后续部署
最终实现:
通用Gemma模型
↓
LoRA微调
↓
专用情绪分类模型
这种方案后续也可以迁移到:
- 新闻分类
- 垃圾邮件识别
- 意图识别
- 客服工单分类
- 情感分析
- 医疗文本分类
等文本分类任务。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)