老生常谈的一句话:有没有技术含量取决于这个工作你怎么做,尤其是方向。上手门槛相比传统深度学习变得更低了,但技术深度的挖掘空间依然巨大。
针对大模型微调的几个重要环节,列举的每一种做法大概率都能完成最终目标,甚至说训出来的模型效果都没什么差别。但对个人能力成长的帮助就大不相同。以下从数据工作、训练代码、实验分析三个维度进行详细拆解。
数据工作
做法 1:继承实验室或者同事的训练数据,拿到之后也不 check 一下数据质量,直接放进去训。 这种做法虽然高效,但风险极高。脏数据会导致模型学到错误的模式,后期修复成本远高于初期清洗。
做法 2:下载一个开源数据集,构建'system + query + answer'集合。 这是基础操作,但需要注意数据的版权许可和分布偏差。直接使用可能导致模型在特定领域表现过拟合或欠拟合。
做法 3:利用 GPT-4 生成数据,学会用 GPT-4 喜欢的 prompt 去请求。并且意识到数据 prompt 多样性,想尽各种办法去扩充 prompt 的任务多样性和表达方式多样性,甚至去刻意加一些 noisy prompt 去提升抗噪性。同时,愿意放下身架,一条一条去 check 数据质量,去和标注同学对齐标注标准。 这种方法能显著提升数据质量。通过构造多样化的指令(Instruction),可以增强模型的泛化能力。加入少量噪声数据有助于防止模型对完美格式过度依赖,提高鲁棒性。人工校验是确保逻辑正确性的关键步骤。
做法 4:利用用户的交互日志来驱动数据构造过程,收集用户的真实 prompt,用规则或者去分析用户的 feedback,进而获得高质量的 answer 数据。 基于真实场景的数据最能反映用户需求。通过分析用户反馈(如点赞、点踩、修改记录),可以识别出模型回答中的痛点,针对性地补充高质量语料。
做法 5:借鉴 CoT(Chain of Thought)、RAG(Retrieval-Augmented Generation)、Function Call、Agent 等思路,把复杂的模型无法胜任的任务在数据层面就进行拆解。 例如,'模型写不出长篇小说' --> '模型写小说大纲,模型基于小说大纲写长篇小说'。这种思维链式的任务拆解,能让模型分步解决问题,降低单次生成的难度,显著提升复杂任务的完成率。
训练代码
做法 1:继承实验室或者同事的训练代码,修改 data_path,然后 bash train.sh。 这是最快速的路径,适合验证想法。但如果遇到显存溢出或收敛问题,往往难以定位原因。
做法 2:继承或自己下载一份训练代码,研究启动代码的每一个参数,去寻思并去搞懂:为啥开 offload,什么叫 sequence_parallel,等等。然后再去看看 dataloader 是怎么处理数据格式,session 数据的 loss 是只计算最后一轮还是每轮都算,代码中应用了哪些 special_token 等等。 深入理解代码是进阶的必经之路。Offload 可以将部分权重卸载到 CPU 以节省显存;Sequence Parallelism 用于切分序列维度以减少通信开销。了解 Loss 计算方式(如是否忽略 padding)直接影响梯度更新的方向。Special Token 的处理关系到模型能否正确识别指令边界。
做法 3:不仅搞懂了每个参数,还提出自己的见解:learning_rate = 3e-5 是不是太多了,10W 条训练数据这个量级合适吗?special_token 是不是引入的太多了?7B 模型用这个学习率是不是太大了,warmup 该用多少 step 或者说能不能不开 warmup?带着疑惑然后去问问老师怎么说,或者搜搜大佬们的文章拜读一下。 超参数的调优是微调的核心艺术。学习率过大可能导致发散,过小则收敛缓慢。Warmup 阶段有助于稳定初始梯度。数据量与模型参数量需匹配,过少数据易导致灾难性遗忘,过多则增加训练成本。需要结合具体任务特性进行权衡。
做法 4:质疑和改进训练代码,是不是有点慢,要不要改成 FlashAttention 框架?把 Megatron 和 DeepSpeed 的优点结合起来?如果有兴趣,也可以去 debug 下速度,发现 RoPE 的耗时会比 Linear 都长的时候想想办法去优化(查查大佬们的优化方案)? 性能优化涉及底层算子。FlashAttention 能显著减少 IO 瓶颈。Megatron 擅长张量并行,DeepSpeed 擅长 ZeRO 优化。RoPE 位置编码的计算复杂度较高,优化其实现可提升推理和训练速度。理解硬件特性(如 Hopper 架构的 Tensor Core)有助于编写更高效的算子。
实验分析
做法 1:跑事前准备好的评估集,然后自评或送评,正向收益的话这个工作就结束了,负向收益的话就认为是数据不干净,想办法去清洗数据或者是构造更多的训练数据,哪个 task 的指标差就重点优化这个 task 的训练数据。 这是最基础的闭环。但仅凭单一指标容易误判,需结合多个维度的评测集(如通用基准、垂直领域测试)综合判断。
做法 2:结合 Pretrain / SFT_Base 模型的结果,去归类和分析每一个 SFT_Exp 模型的 bad case,归类分析:幻觉问题?Pattern 问题?问题太难训练不充分问题?Pretrain 模型压根就没有这个能力?这个 size 的模型就做不了这种复杂逻辑问题?…… Bad Case 分析是提升模型的关键。幻觉通常源于知识缺失或概率采样策略;Pattern 问题可能源于训练数据格式过于单一;能力缺失可能是基座模型本身限制。针对不同原因采取不同策略,如增加知识注入、调整解码温度、更换基座模型等。


