Skip to main content

如何从零完成模型微调项目:从主题选择到数据构造到训练评测的完整方法论

· 22 min read

核心逻辑:本文采用「研究方法论结构」,以散文生成为案例,系统讲解如何完成一个具有学术价值的微调项目。问题驱动:为什么散文生成是一个有价值的研究问题?方法论:如何设计数据构造策略和训练流程?实验设计:如何设计消融实验证明方法有效性?可复现性:如何确保工作可复现、可对比?本文的目标不是让你照着做一遍,而是让你理解背后的方法论,能迁移到自己的研究课题中。


一、研究问题定义:从「能做」到「值得做」

1.1 什么是好的研究问题

在CCF ACL级别的研究中,问题定义是第一步也是最关键的一步。好的研究问题需要满足:

价值性(Significance):这个问题是否解决了真实需求?散文生成不是「为了微调而微调」,而是解决了普通人生散文写作困难的问题。

创新性(Novelty):现有方法有什么不足?通用大语言模型(如GPT-4)在散文生成上表现「套路化」,缺乏文学性,这是可量化的不足。

可解性(Solvability):我们提出的方法是否有可能解决这个问题?通过构造高质量数据和偏好优化,是可以提升散文质量的。

可验证性(Verifiability):我们如何证明方法有效?可以通过自动化指标和人工评测来量化改进。

1.2 散文生成为什么是一个好的研究问题

现状分析

通用大语言模型在散文生成上的主要问题:

问题表现影响
套路化用固定的模式和词汇缺乏新意
过于直白像说明文,不像散文缺乏文学性
情感缺失情感表达不真挚不能引起共鸣
结构松散段落之间缺乏连贯性阅读体验差

研究价值

散文生成涉及多个NLP核心问题:

  • 语言生成:如何生成流畅、自然的文本
  • 风格控制:如何保持特定的文学风格
  • 情感生成:如何表达真挚的情感
  • 长文本生成:如何保证长文本的连贯性

这些问题的解决方案可以迁移到其他生成任务中。

挑战与机遇

挑战在于散文质量难以量化评测,机遇在于散文有明确的评价维度(流畅性、文采、情感等),可以设计多维度评测体系。

1.3 研究问题的边界定义

明确研究范围

不要试图解决所有问题,明确你的研究边界。本文聚焦于:

  • 中文散文生成(不是英文,不是通用文本)
  • 短散文(200-800字,不是长篇小说)
  • 特定主题生成(不是自由创作)

定义评价标准

在开始之前就要定义「什么是好的散文」:

  • 流畅性:语句通顺,无语法错误
  • 文采:修辞丰富,语言优美
  • 情感:情感真挚,能引起共鸣
  • 主题:紧扣主题,不跑题
  • 连贯性:段落之间逻辑清晰

研究假设

提出明确的研究假设,后面用实验验证:

  • 假设1:构造高质量SFT数据能提升散文的基本质量
  • 假设2:偏好数据优化(GRPO)能提升文采和情感
  • 假设3:奖励函数设计是提升的关键

1.4 如何找到自己的研究问题

从日常需求出发

身边有什么写作困难?学生需要作文、文案需要广告词、创作者需要灵感。这些都是潜在的研究问题。

从现有方法的不足出发

尝试现有方法,记录不足之处。GPT-4写散文有什么问题?ChatGPT有什么局限?这些都是改进的方向。

从领域知识出发

你有什么专业背景?医疗、法律、金融,这些领域的文本生成有独特的挑战和专业要求。

练习方法

每周尝试定义3个研究问题,用上述四个标准评估:

  1. 这个问题有价值吗?
  2. 现有方法有什么不足?
  3. 我有什么方法可以改进?
  4. 如何证明改进有效?

二、数据构造方法论:数据决定上限

2.1 数据构造的核心原则

为什么数据比模型更重要

在微调任务中,数据质量直接决定模型上限。CCF ACL级别的研究都非常重视数据构造:

  • GPT-3的论文强调数据的质量和多样性
  • LLaMA的训练数据经过严格清洗
  • 优秀的开源数据集(如Alpaca)证明数据质量的重要性

数据构造的两个层面

  1. 数量(Scale):数据量要足够覆盖任务的多样性
  2. 质量(Quality):每条数据都要高质量,符合任务要求

对于散文生成:

  • SFT数据:1,000-10,000条高质量散文
  • 偏好-2,000对好/坏对比

数据:5002.2 SFT数据的构造策略

SFT数据的本质

SFT(Supervised Fine-Tuning)本质上是「行为克隆」——让模型学习人类的写作方式。数据的质量直接决定模型的行为。

构造原则

  1. 代表性:数据要覆盖任务的主要场景
  2. 多样性:避免模型学习到单一的写作风格
  3. 高质量:每条数据都要符合任务要求
  4. 一致性:数据格式要统一

散文SFT数据的构造方法

方法1:网络数据收集+清洗

这是最常用的方法,成本低,效率高。

步骤:

  1. 收集:爬取散文网站、文学社区
  2. 清洗:去重、去噪、格式化
  3. 筛选:人工筛选高质量散文
  4. 构造输入:为主题添加prompt

清洗的具体标准:

def quality_filter(text):
# 长度检查
if len(text) < 200 or len(text) > 3000:
return False

# 段落检查
paragraphs = text.split('\n\n')
if len(paragraphs) < 2:
return False

# 标点检查
punctuation_ratio = len([c for c in text if c in ',。!?;:']) / len(text)
if punctuation_ratio < 0.05:
return False

# 乱码检查
if contains_garbled(text):
return False

# 内容检查(非广告、非垃圾)
if is_ad_or_spam(text):
return False

return True

方法2:模型生成+筛选

用GPT-4/Claude生成散文,然后人工筛选。

优势:

  • 可以精确控制主题和风格
  • 数据多样性高
  • 成本可控

步骤:

  1. 设计生成prompt,包含主题、风格、长度要求
  2. 生成大量候选数据
  3. 人工筛选高质量数据
  4. 构造输入格式

生成prompt示例:

essay_prompt = """
请根据以下主题写一篇散文,要求:
1. 字数500-800字
2. 使用丰富的修辞手法
3. 表达真挚的情感
4. 段落分明,结构完整

主题:{topic}
风格:{style}
"""

方法3:人工撰写

成本最高,但质量最有保障。

适用场景:

  • 小批量高质量数据
  • 特定领域数据
  • 作为其他方法的「黄金标准」

2.3 偏好数据的构造策略

偏好数据的本质

偏好数据用于强化学习,告诉模型「什么是好的」,「什么是差的」。构造质量直接影响偏好优化的效果。

构造原则

  1. 对比明显:好和差的差异要明显
  2. 维度可控:控制变量的对比(只改变一个维度)
  3. 数量适中:500-2,000对足够
  4. 标注一致:标注标准要统一

散文偏好数据的构造方法

方法1:同主题不同质量对比

同一主题,一篇高质量散文 vs 一篇低质量散文。

示例:

{
"prompt": "请写一段关于秋天的散文",
"chosen": "金黄的叶子像蝴蝶一样在空中飞舞,...", // 高质量
"rejected": "秋天到了,叶子都掉了。", // 低质量
"reason": "前者有比喻修辞,语言优美;后者过于直白"
}

方法2:维度可控对比

控制其他维度,只改变一个维度。

文采对比

  • 好的:使用比喻、拟人等修辞
  • 差的:平铺直叙,缺乏修辞

情感对比

  • 好的:情感真挚,能引起共鸣
  • 差的:情感空洞,缺乏感染力

连贯性对比

  • 好的:段落之间逻辑清晰
  • 差的:跳跃性强,逻辑混乱

方法3:模型生成+对比选择

用同一模型生成多个回答,人工选择最好的和最差的。

步骤:

  1. 设计多样化的prompt
  2. 每个prompt生成多个回答
  3. 人工排序,选出最好的和最差的
  4. 记录选择的理由

标注标准统一

为了保证标注一致性,需要制定详细的标注指南:

维度好的标准差的标准
流畅性语句通顺,无语法错误有卡顿、语病
文采修辞丰富,语言优美平淡无奇,缺乏修辞
情感真挚,能引起共鸣空洞,缺乏感情
主题紧扣主题,深入讨论跑题或蜻蜓点水

2.4 数据质量的评估方法

定量评估

  1. 多样性指标

    • 词汇多样性(TTR)
    • 主题多样性(主题分布)
    • 风格多样性(语言特征分布)
  2. 质量指标

    • 长度分布
    • 标点使用率
    • 语法正确率

定性评估

  1. 抽样检查:随机抽取100条,人工检查质量
  2. 边界测试:检查边界情况(长文本、特殊主题)
  3. 标注一致性:多个标注者的一致性检验

数据诊断

常见数据问题及解决方案:

问题表现解决
同质化所有数据风格相似增加数据来源
质量低有明显错误加强清洗
不均衡某些类型过多重采样或补充
标注不一致好坏标准不统一重新制定标准

2.5 构造可复现的数据集

CCF ACL级别的要求

可复现性是学术研究的基本要求。数据构造过程需要:

  1. 完整记录:记录数据来源、清洗规则、筛选标准
  2. 代码公开:数据处理代码开源
  3. 数据公开:在允许的情况下公开数据集
  4. 版本控制:记录数据集的版本变化

建议的数据集文档结构

# 数据集文档

## 1. 概述
- 任务:中文散文生成
- 数据量:X条SFT数据,Y对偏好数据
- 来源:公开数据集 + 网络爬取 + 模型生成

## 2. 数据格式
### SFT数据
```json
{
"instruction": "请以「X」为主题写散文",
"output": "散文内容..."
}

偏好数据

{
"prompt": "请以「X」为主题写散文",
"chosen": "好的散文",
"rejected": "差的散文"
}

3. 构造流程

  1. 原始数据收集(Day 1-2)
  2. 数据清洗(Day 3-4)
  3. 质量筛选(Day 5)
  4. 格式构造(Day 6-7)

4. 质量保证

  • 清洗规则:...
  • 筛选标准:...
  • 人工抽检:X%

5. 数据统计

  • 长度分布:...
  • 主题分布:...
  • 风格分布:...

---

## 三、SFT训练方法论:让模型学会基本能力

### 3.1 SFT的本质理解

**行为克隆视角**:

SFT(Supervised Fine-Tuning)本质上是行为克隆——让模型学习专家的行为。在这个视角下:

- 训练数据是专家演示
- 训练目标是让模型模仿专家
- 训练效果取决于数据质量

**理解SFT的作用**:

SFT的作用是将基座模型的能力「引导」到特定任务上:
- 基座模型有通用能力,但不知道怎么用在散文生成上
- SFT数据告诉模型「给定主题应该怎么写」
- SFT后模型有了基本的散文生成能力

**SFT的局限性**:

SFT只能学到数据中的模式,不能学到数据中没有的模式:
- 如果数据都是「抒情散文」,模型不会写「叙事散文」
- 如果数据质量参差不齐,模型学到的也是参差不齐的能力
- SFT后模型的能力上限就是数据的上限

### 3.2 训练策略选择

**全量微调 vs 参数高效微调**:

| 方法 | 优点 | 缺点 | 适用场景 |
|-----|------|------|---------|
| 全量微调 | 效果最好 | 显存需求大 | 数据量大、计算资源充足 |
| LoRA | 显存需求小,速度快 | 效果略差 | 数据量中、计算资源有限 |
| QLoRA | 更省显存 | 速度慢 | 数据量小、显存有限 |

**散文生成推荐**:

对于散文生成任务,LoRA通常是最佳选择:
- 散文生成需要模型保持语言能力
- LoRA可以保持基座能力,同时学习特定任务
- 显存需求合理,普通显卡可以训练

**LoRA的关键参数**:

```python
lora_config = {
"r": 16, # LoRA秩,越高越灵活,但过拟合风险越大
"alpha": 32, # 缩放因子,通常是r的2倍
"dropout": 0.05, # 防止过拟合
"target_modules": ["q_proj", "v_proj"], # 应用到的模块
}

参数选择原则

  • r=8-16:对于散文生成任务足够
  • r=32:如果你觉得模型学得不够
  • r=64:很少需要,除非任务非常复杂

3.3 训练配置优化

学习率选择

学习率是SFT中最重要的超参数。

原则

  • 初始学习率:1e-5 到 3e-5
  • 太大:模型学得快,但不稳定
  • 太小:模型学得慢,可能欠拟合

推荐策略

  • 从2e-5开始
  • 观察loss曲线,如果震荡就降低
  • 如果loss下降慢就稍微增大

Batch Size

原则

  • 越大越稳定,但显存需求越高
  • 总batch size = batch_size * gradient_accumulation_steps

推荐

  • batch_size = 4-8(根据显存调整)
  • gradient_accumulation_steps = 2-4
  • 总batch size = 8-32

训练轮数

原则

  • 太多:过拟合
  • 太少:欠拟合

推荐

  • 1-3个epoch通常足够
  • 观察验证集loss,不要只看训练集loss
  • 用early stopping防止过拟合

3.4 训练过程监控

关键指标

  1. 训练loss:应该稳定下降
  2. 验证loss:应该和训练loss同步下降
  3. 生成样本:定期抽样检查生成质量

常见问题及诊断

问题可能原因解决
loss不下降学习率太低增大lr
loss震荡学习率太高减小lr
loss下降但生成差过拟合增加数据、增强
loss太平模型容量不够增大模型或r

训练日志模板

# 训练日志

## Day 1
- 训练数据:1000条
- 配置:lr=2e-5, batch=4, epoch=2
- 初始loss:2.5
- 最终loss:1.2
- 观察:loss下降正常,生成样本质量逐步提升
- 问题:无

## Day 2
- 训练数据:2000条(增加了数据)
- 配置:lr=1e-5, batch=4, epoch=2
- 初始loss:1.1
- 最终loss:0.8
- 观察:loss继续下降,生成样本更流畅
- 问题:偶有重复内容

3.5 SFT模型的评测

评测指标

  1. 困惑度(PPL):越低越好,但不能作为唯一标准
  2. 多样性:生成内容的多样性
  3. 人工评测:流畅性、文采、情感等维度

基线对比

SFT模型必须和基座模型对比,证明SFT有效:

指标基座模型SFT模型提升
困惑度15.212.1+20%
流畅性(1-5)3.03.8+27%
文采(1-5)2.53.2+28%

消融实验设计

如果你尝试了不同的数据构造方法,可以做消融实验:

实验数据构造方法效果
基线原始数据3.2
消融1+严格清洗3.5
消融2+多样主题3.7
消融3+质量筛选3.8

这样可以证明每个数据构造步骤的有效性。


四、强化学习优化:从「能做」到「做得好」

4.1 强化学习在微调中的作用

为什么需要强化学习

SFT后模型有了基本的生成能力,但可能不够「好」:

  • SFT只能学到数据中的模式
  • 偏好数据可以教会模型「更好」是什么样的
  • 强化学习可以优化难以直接监督的维度(如文采、情感)

GRPO的优势

GRPO(Group Relative Policy Optimization)是最近流行的偏好优化方法:

  1. 不需要奖励模型:直接从对比中学习
  2. 训练稳定:相对奖励更稳定
  3. 样本效率高:每组生成多个,对比学习

4.2 奖励函数设计方法论

奖励函数的设计原则

奖励函数是强化学习的核心,直接决定优化的方向。

原则1:奖励要反映真实目标

我们要优化的是「散文质量」,而不是「某些表面的特征」。

原则2:奖励要稳定可导

奖励函数要能提供稳定的梯度,不能有太多局部最优。

原则3:奖励要平衡多个维度

散文质量是多维的,需要平衡各个维度。

奖励函数的设计方法

维度分解法

将「散文质量」分解为可测量的维度:

维度可测量指标权重
流畅性困惑度、语法正确率0.2
长度字数是否在范围内0.1
主题相关性关键词覆盖率0.2
文采修辞数量、词汇丰富度0.3
格式段落结构0.2

逐个维度设计奖励函数

长度奖励

def length_reward(text, min_len=200, max_len=800):
length = len(text)
if min_len <= length <= max_len:
return 1.0
elif length < min_len:
return length / min_len # 线性递减
else:
return max(0, 1 - (length - max_len) / 400)

关键词奖励

def keyword_reward(prompt, text):
keywords = extract_keywords(prompt)
matched = sum(1 for kw in keywords if kw in text)
return min(1.0, matched / len(keywords))

文采奖励(难点):

def literary_reward(text):
score = 0.0

# 修辞手法检测
metaphors = count_patterns(text, ['像', '如', '仿佛'])
score += min(0.3, metaphors * 0.1)

# 词汇丰富度
unique_ratio = len(set(text)) / len(text)
score += unique_ratio * 0.3

# 句式多样性
sentences = text.split('。')
length_std = std([len(s) for s in sentences])
score += min(0.2, length_std / 20)

# 成语使用
idioms = count_idioms(text)
score += min(0.2, idioms * 0.1)

return min(1.0, score)

奖励函数的组合

def compute_reward(prompt, text):
r_length = length_reward(text)
r_keyword = keyword_reward(prompt, text)
r_literary = literary_reward(text)

total = r_length * 0.1 + r_keyword * 0.2 + r_literary * 0.3 + r_format * 0.2 + r_coherence * 0.2
return total

4.3 奖励模型的替代方案

不用奖励模型的方法

对于文采这种抽象概念,可以不用奖励模型:

方案1:规则+模型混合

  • 简单维度(长度、格式)用规则
  • 复杂维度(文采)用模型打分

方案2:奖励模型

  • 训练一个专门的奖励模型
  • 用偏好数据训练
  • 优势:更准确,但需要额外训练

方案3:对比学习

  • 不定义「什么是文采」
  • 只比较「A比B更有文采」
  • GRPO自动学会区分

选择建议

入门:规则奖励(长度、关键词、格式) 进阶:规则+模型混合(文采用GPT-4打分) 专业:训练奖励模型

4.4 奖励函数的问题诊断

奖励黑客攻击

模型可能找到奖励函数的漏洞:

问题表现解决
重复关键词重复出现主题词增加多样性惩罚
堆砌修辞强行使用成语增加自然度奖励
凑长度重复相同内容增加原创性奖励

奖励函数调试

  1. 打印每个维度的奖励,看哪个维度有问题
  2. 抽样检查生成样本,看是否符合预期
  3. 调整权重,平衡各个维度

4.5 GRPO训练配置

关键参数

grpo_config = {
"learning_rate": 1e-5, # 比SFT小
"num_generations": 4, # 每组生成数量
"beta": 0.1, # KL惩罚系数
"max_prompt_length": 256,
"max_completion_length": 512,
}

参数选择原则

  • num_generations:4-8,越多越稳定
  • beta:0.01-0.1,越大越保守
  • learning_rate:1e-6到5e-6,比SFT小

训练监控

  1. 奖励曲线:应该上升
  2. KL散度:应该稳定,不要太大
  3. 生成长度:应该稳定在目标范围内

五、评测方法论:证明方法有效

5.1 评测设计的基本原则

CCF ACL级别的评测要求

  1. 多维度:不能只看一个指标
  2. 自动化+人工:自动化快速筛选,人工精准评测
  3. 基线对比:必须和基座模型对比
  4. 消融实验:证明每个组件的有效性
  5. 统计分析:结果要有统计显著性

5.2 自动化评测设计

自动化指标

指标测量内容局限性
困惑度流畅性不能反映内容质量
长度分布长度控制不能反映内容质量
关键词覆盖主题相关性关键词可能不准确
多样性(TTR)多样性不能反映质量

推荐指标组合

  1. 困惑度:基础流畅性指标
  2. Format合规率:长度、结构是否正确
  3. 关键词覆盖率:主题是否相关

5.3 人工评测设计

评测维度

维度定义1分标准5分标准
流畅性语句通顺程度很多语病如行云流水
文采语言优美程度平淡无奇文采斐然
情感情感真挚程度空洞虚假真挚动人
主题紧扣主题程度完全跑题深入主题
连贯性段落衔接程度跳跃混乱逻辑清晰
创意新颖独特程度非常套路独特新颖

评测流程

  1. 准备测试集:固定100个prompt,覆盖不同主题和难度
  2. 生成回答:用不同模型生成回答
  3. 随机打乱:隐藏模型身份,防止偏见
  4. 独立评测:每个样本由多个评测员独立打分
  5. 一致性检验:计算评测员之间的一致性

样本量计算

要证明模型有提升,需要多少样本?

公式:n = 2 * (z * σ / δ)²

其中:

  • z = 1.96(95%置信度)
  • σ = 分数的标准差(假设为0.5)
  • δ = 想检测的最小差异(假设为0.2)

计算结果:n ≈ 100

所以每个评测维度需要约100个样本。

5.4 Benchmark构建

测试集设计

测试集要覆盖任务的主要场景:

类别数量说明
自然类30秋天、落叶、雨后等
情感类30思念、离别、成长等
生活类25家乡、美食、旅行等
抽象类15时间、梦想、自由等

难度分级

难度特点示例
简单具体主题「写秋天」
中等抽象概念「写时间」
困难复杂要求「写离别,要有景有情」

Benchmark文档

# 散文生成Benchmark

## 测试集统计
- 总数:100
- 类别分布:自然30、情感30、生活25、抽象15
- 难度分布:简单40、中等40、困难20

## 评测维度
1. 流畅性(1-5分)
2. 文采(1-5分)
3. 情感(1-5分)
4. 主题(1-5分)
5. 连贯性(1-5分)
6. 创意(1-5分)

## 评测流程
1. 固定随机种子,生成测试回答
2. 隐藏模型身份,随机打乱
3. 3个独立评测员打分
4. 计算平均分和标准差

## 基线模型
- 基座模型:Qwen-7B
- SFT模型:本文SFT后的模型
- GRPO模型:本文GRPO后的模型

5.5 实验设计模板

主实验

模型流畅性文采情感主题总分
基座3.22.52.83.52.87
SFT4.13.53.64.23.72
SFT+GRPO4.34.03.94.44.05

消融实验

数据构造消融

实验SFT数据偏好数据文采得分
基线原始2.5
消融1+清洗3.2
消融2+清洗3.5
消融3+清洗+高质量4.0

奖励函数消融

实验长度奖励关键词奖励文采奖励文采得分
基线3.5
消融1+规则3.8
消融2+模型4.0

统计显著性检验

使用t检验或Wilcoxon检验证明提升显著:

from scipy import stats

# SFT vs 基座
t_stat, p_value = stats.ttest_ind(sft_scores, base_scores)
print(f"SFT vs 基座: t={t_stat:.3f}, p={p_value:.4f}")

# GRPO vs SFT
t_stat, p_value = stats.ttest_ind(grpo_scores, sft_scores)
print(f"GRPO vs SFT: t={t_stat:.3f}, p={p_value:.4f}")

5.6 结果分析与讨论

结果展示

  1. 雷达图:直观展示各维度能力
  2. 柱状图:展示各模型对比
  3. 案例分析:具体示例说明

讨论要点

  1. 主要发现:SFT提升基础能力,GRPO提升文采和情感
  2. 为什么有效:数据质量、奖励函数设计
  3. 局限性:抽象主题表现有限、可能存在套路化
  4. 未来方向:增加抽象主题数据、增加多样性奖励

六、可复现性与论文写作

6.1 可复现性要求

CCF ACL级别的可复现性

  1. 代码开源:训练代码、评测代码、数据处理代码
  2. 数据公开:在允许的情况下公开数据
  3. 环境说明:Python版本、依赖库版本
  4. 参数记录:所有超参数设置
  5. 随机种子:保证可复现

建议的代码结构

essay-llm/
├── README.md
├── requirements.txt
├── data/
│ ├── raw/
│ ├── processed/
│ └── benchmark.json
├── src/
│ ├── data/
│ │ ├── cleaner.py
│ │ └── builder.py
│ ├── training/
│ │ ├── sft.py
│ │ └── grpo.py
│ └── evaluation/
│ ├── auto_eval.py
│ └── human_eval.py
├── scripts/
│ ├── train_sft.sh
│ └── evaluate.sh
└── configs/
├── sft_config.yaml
└── grpo_config.yaml

6.2 论文结构建议

标题

  • 要包含创新点
  • 不要太泛泛
  • 示例:「面向散文生成的偏好优化方法研究」

摘要

  • 问题:散文生成质量不足
  • 方法:构造高质量数据+GRPO优化
  • 结果:文采提升X%,情感提升Y%
  • 结论:方法有效

引言

  • 问题背景:散文写作需求大,但通用模型生成质量不足
  • 研究现状:现有方法的不足
  • 研究动机:为什么要这样做
  • 主要贡献:列出3-4个贡献

方法

  • 问题定义:明确输入输出
  • 数据构造:详细说明数据来源和处理
  • 模型训练:SFT和GRPO的具体方法
  • 评测方法:自动化和人工评测

实验

  • 实验设置:数据集、基线模型、评测指标
  • 主实验:和基线对比
  • 消融实验:验证各组件有效性
  • 分析:结果分析、案例分析

结论

  • 总结工作
  • 局限性
  • 未来方向

6.3 常见问题和解决方案

问题1:效果不明显

可能原因:

  • 数据质量不够高
  • 奖励函数设计不合理
  • 训练参数不合适

解决:

  • 检查数据质量
  • 调整奖励函数
  • 调参

问题2:训练不稳定

可能原因:

  • 学习率太大
  • batch size太小
  • 奖励函数方差太大

解决:

  • 减小学习率
  • 增大batch size
  • 平滑奖励函数

问题3:过拟合

可能原因:

  • 数据量太小
  • 训练轮数太多

解决:

  • 增加数据
  • 使用early stopping

附录:常用工具和资源

数据处理

  • jieba:中文分词
  • pandas:数据处理
  • numpy:数值计算

模型训练

  • transformers:模型加载
  • peft:LoRA微调
  • trl:RL训练

评测工具

  • langchain:评测框架
  • bert-score:文本相似度
  • rouge:文本生成评测

论文写作

  • Overleaf:LaTeX写作
  • Draw.io:画图
  • Matplotlib/Seaborn:数据可视化