后训练Qwen2.5-0.5B-Instruct¶
(手写的草稿)
期望达成目标¶
通过实操理解一下内容:
- 手写几十条 (prompt, response) 对,构造成 conversational 格式
- 写训练脚本,配置 LoraConfig + TrainingArguments(梯度检查点、小 batch、bf16
- 跑训练 + 监控
笔记和总结¶
SFT 这里主要学习了使用loRA方法做训练,具体来讲,构造测试数据,这个测试数据里面会有明显的偏好,于是希望在后训练过程里模型学会这些内容,主要是回答的风格。
这里面loRA的核心思路是不修改原始的模型权重M,而是生成一个delta M,具体表现为B和A,当输入过来之后,通过计算原始model得出的结果,和将input先用A压缩(压缩,把维度挤到很小的 r),再用B展开,把 r 维放大回原始输出维度)展开回到原始M的生成规模后,两者合在一起得出最终结果。
数学上,这提供了一种通过较小规模的参数调整来获取到在较大规模参数M上生效的办法,从数学上讲也就是 (M+ delta M) * input = M * input + delta M * input. 但在真正计算的时候,由于计算delta M和M规模相等,计算delta M无法节省资源,所以通过B@A这种压缩/回放矩阵把input完成压缩和恢复(MxN =. rM x Nr), 这里的r通常选择小于理论矩阵的秩的天花板,比如2,4,8,etc。具体哪个值更好需要做消融实验。这里需要强调的是,delta M从未被计算,而真正的秩就在这个delta M里面,所以这里我们不可能知道真正的秩是多少。
在本地测试时候,需要构造实例,测试本身跑着很简单,没什么复杂的,难度我认为主要在于规模上去之后的高效运行,以及验证等内容。具体来讲,体会sft可以把一些偏好带给模型,同时会遇到例如(1) 英语sft的偏好在回答中文时不会被继承 (2) 出现模型能力回退,比如格式等,尤其是在DPO里更明显。
DPO也是类似,也可以使用loRA做训练,这里需要注意loRA是一种对原有模型M训练调整的优化方案,不同训练方法主要是算loss方法不同,他们两者是独立的。