老生常谈的一句话:有没有技术含量取决于这个工作你怎么做,尤其是方向。上手门槛相比传统机器学习变得更低了,但这并不意味着没有深度。
我举一些例子,针对大模型微调的几个重要环节,列举的每一种做法大概率都能完成最终目标,甚至说训出来的模型效果都没什么差别。但对个人能力成长的帮助就大不相同。
数据工作
做法 1 : 继承实验室或者同事的训练数据,拿到之后也不 check 一下数据质量,直接放进去训。 这种做法效率最高,但风险最大。如果原始数据存在标注错误、格式混乱或分布偏差,模型很容易学到错误的模式,导致训练后的模型表现不稳定。此外,缺乏对数据分布的理解,后续无法针对性优化。
做法 2 : 下载一个开源数据集,构建'system + query + answer'集合。 这是基础操作。关键在于理解指令微调(SFT)的数据结构。System 部分定义角色和约束,Query 是用户输入,Answer 是期望输出。简单的拼接虽然能跑通,但如果缺乏多样性,模型泛化能力会受限。
做法 3 : 利用 GPT-4 生成数据,学会用 GPT-4 喜好的 prompt 去请求。并且意识到数据 prompt 多样性,想尽各种办法去扩充 prompt 的任务多样性和表达方式多样性,甚至去刻意加一些 noisy prompt 去提升抗噪性。同时,愿意放下身架,一条一条去 check 数据质量,去和标注同学对齐标注标准。 这种方法能显著提升数据质量。通过精心设计的 Prompt Engineering,可以让大模型生成高质量的对齐数据。引入噪声样本可以增强模型的鲁棒性,使其在面对真实场景中的模糊指令时表现更好。人工校验则是保证数据一致性的关键步骤。
做法 4 : 利用用户的交互日志来驱动数据构造过程,收集用户的真实 prompt,用规则或者分析用户的 feedback,进而获得高质量的 answer 数据。 这是最贴近业务场景的做法。真实日志反映了用户的实际需求和痛点。通过分析反馈(如点赞、点踩、修改记录),可以挖掘出模型回答不佳的具体原因,从而构造针对性的训练数据。这种闭环迭代能持续提升模型在特定领域的表现。
做法 5 : 借鉴 RAG、Function Call、Agent 等思路,把复杂的模型无法胜任的任务在数据层面就进行拆解,比如'模型写不出长篇小说' --> '模型写小说大纲,模型基于小说大纲写长篇小说'。 这属于高级的数据策略。当单一模型能力受限时,通过数据层面的任务分解,引导模型学习分步推理。这不仅提升了数据的有效性,也教会了模型如何规划复杂任务,为后续 Agent 开发打下基础。
训练代码
做法 1 : 继承实验室或者同事的训练代码,修改 data_path,然后 bash train.sh。 这是入门阶段最常见的做法。虽然能快速产出结果,但对底层原理一无所知。一旦遇到显存溢出、训练不收敛等问题,将无从下手排查。
做法 2 : 继承或自己下载一份训练代码,研究启动代码的每一个参数,去寻思并去搞懂:为啥开 offload,什么叫 sequence_parallel,等等。然后再去看看 dataloader 是怎么处理数据格式,session 数据的 loss 是只计算最后一轮还是每轮都算,代码中应用了哪些 special_token 等等。 深入阅读源码是进阶的必经之路。Offload 允许将部分层卸载到 CPU 以节省显存;Sequence Parallelism 用于并行处理超长序列。理解 Dataloader 的预处理逻辑和 Loss 计算方式,有助于判断训练是否按预期进行。Special Token 的处理直接影响模型对指令的理解。
做法 3 : 不仅搞懂了每个参数,还提出自己的见解:lr=3 是不是太多了,10W 条训练数据这个量级合适吗?special_token 是不是引入的太多了?7B 模型用这个学习率是不是太大了,warmup 该用多少 step 或者说能不能不开 warmup?带着疑惑然后去问问老师怎么说,或者搜搜大佬们的文章拜读一下。 参数调优是微调的核心艺术。学习率过大可能导致发散,过小则收敛慢。Warmup 策略能帮助模型平稳度过初始训练阶段。数据量与模型参数量需要匹配,过少会导致欠拟合,过多可能浪费算力。通过阅读论文和对比实验,可以找到最适合当前场景的配置。
做法 4 : 质疑和改进训练代码,是不是有点慢,要不要改成 FlashAttention 框架?把 megatron 和 deepspeed 的优点结合起来?如果有兴趣,也可以去 debug 下速度,发现 rope 的耗时会比 flash_attn 都长的时候想想办法去优化(查查大佬们的优化方案)? 性能优化是工程能力的体现。FlashAttention 能显著减少 IO 开销,提升训练速度。结合 Megatron-LM 的张量并行和 DeepSpeed 的 ZeRO 优化,可以在有限硬件上训练更大模型。针对特定算子(如 RoPE)的性能瓶颈进行优化,能进一步提升整体效率。
实验分析
做法 1 : 跑事前准备好的评估集,然后自评或送评,正向收益的话这个工作就结束了,负向收益的话就认为是数据不干净,想办法去清洗数据或者是构造更多的训练数据,哪个 task 的指标差就重点优化这个 task 的训练数据。 这是最基础的评估流程。依赖自动化指标(如 BLEU, ROUGE)可以快速量化效果。但仅凭指标容易陷入局部最优,必须结合人工评估才能发现模型的真实缺陷。
做法 2 : 结合 SFT / SFT_base 模型的结果,去归类和分析每一个 SFT_exp 模型的 bad case,归类分析:幻觉问题?pattern 问题?问题太难训练不充分问题?pretrain 模型压根就没有这个能力?这个 size 的模型就做不了这种复杂逻辑问题?…… Bad Case 分析是改进模型的关键。区分是幻觉(编造事实)、Pattern 过拟合(死记硬背格式)、还是能力缺失(知识盲区)。如果是 Pretrain 阶段就没学过的知识,单纯 SFT 很难解决,可能需要检索增强。如果是模型尺寸限制,则需要考虑升级基座模型。


