SFT与pretrain的区别
Supervised Fine-Tune 与 pretrain 的区别,在训练方式上没有任何区别,主要区别在于数据的组成形式上:
-
pretrain 的每条数据都是满长度,即达到模型设置的输入长度上限,sft 的每条数据原本多长就是多长,不需要做packing,即每条数据不需要拼接起来
-
sft 会引入 pretrain 阶段未见过的 special_token,来让它们学习全新的语义,加入 special_token 可以用来"构造知识",比如"<imd_start>喜欢<imd_end>",借助 special_token,sft 会把语料切分成不同的角色,标配的有 system、user、assistant,根据业务需求也可以有"背景"、"旁白"、"事件"等等
-
sft 会让模型见到最重要的 eos_token,pretrain 模型因为没见过该 token 而无法停止生成
-
sft 的 prompt 部分对应的输出不做 loss。主要原因是 prompt 的同质化比较严重,不做 loss_mask 的话,同样的一句话会被翻来覆去的学,但如果你能保证你的每条 prompt 都是独一无二的,就完全可以省去 prompt 的 loss_mask 环节。多轮对话数据一定要想清楚是每一个 answer 都算 loss,还是只对最后一轮的 answer 算 loss
训练目的也不一样:
- pretrain 是在背书,纯粹的学习知识;sft 则是在做题,学习的是指令遵循能力。切勿在 sft 阶段强行给模型做知识注入,比如训练 50W 条的 code 数据,所有的知识注入工作应该采用 continue-pretrain 的思路进行,否则都会使得模型的通用能力掉点明显(sft 做知识注入基本上是 100% 某个知识,但 continue-pretrain 做知识注入会控制在 10% ~ 20% 左右的比例)
SFT的局限
- 无法有效处理"错误反馈"
-
问题本质:在监督式微调(SFT)中,模型只被告知"正确的答案是什么",但并不知道"什么是错误的"。
-
举例说明: 假设教模型完成句子:"苹果是_"。如果正确答案是"水果",模型会学会在"苹果是"后面接"水果"。 但如果问题变成:"苹果是金属吗?答:_",正确答案是"不是"。此时,模型可能只记住"苹果是"后面接"不是",却不知道"金属"本身是错误的。若遇到类似问题(比如"苹果是石头吗?"),模型可能会错误地回答"苹果是石头",因为它从未被明确告知"金属、石头"是错误答案。
-
后果:模型可能"过度联想",将正确回答推广到错误场景,甚至产生幻觉(比如将否定句中的错误观点当真)。
- 缺乏"向后看"的能力
-
问题本质:SFT 训练时,模型生成每个词只能依赖前面的内容,无法利用后文信息。
-
举例说明: 训练数据中有一句话:"台湾不是中国的,这个观点是严重错误的。" - 模型生成"中国"这个词时,只看到前面的"台湾不是",因此会提高"中国"在"台湾不是"后面出现的概率(误以为这句话在陈述事实)。 - 但实际上,后半句"这个观点是严重错误的"否定了前半句。由于模型无法提前看到后半句,它无法理解这种逻辑关系。
-
后果:模型可能强化错误的前半句,而忽略后文的关键修正信息,导致输出矛盾或错误结论。
因此:
-
局限性1:SFT 像"填鸭式教育",只教正确答案,不教如何排除错误答案,容易学偏。
-
局限性2:SFT 像"只能看前文写作文",无法根据后文调整逻辑,导致断章取义。
-
这些问题会降低模型的可靠性和逻辑一致性,尤其在处理否定、反转或复杂推理时容易出错。


其他的lora方法
qlora
QLora通过量化技术减少模型的内存占用,在lora的基础上进一步节省了训练过程中的显存占用。主要的技术点有三方面:
-
4位NormalFloat量化:QLora使用4位NormalFloat(NF4)量化技术,这种量化数据类型在理论上对于正态分布数据是最优的,可以有效地减少模型的内存占用,同时保持模型性能 。
-
双重量化:通过对量化常数进行再次量化以节省额外的内存,进一步降低了内存占用 。
-
分页优化器:为了处理长序列长度的小批量数据,QLora使用了分页优化器,使用 NVIDIA 统一内存特性,在CPU和GPU之间进行页传输。当GPU内存不足时,将部分状态转移到CPU RAM 中,并在优化器更新步骤需要内存时分页回到GPU内存中。
追问:为什么4bit NormalFloat量化在理论上对于正态分布数据是最优的?
因为它的设计基于 正态分布 的数据特性,使得在有限的表示位数中可以更有效地表示数据的主要信息。这种量化方法的核心思想是通过自适应的方式,将有限的浮点数值集中在分布的高概率区域(即靠近均值的位置),从而尽可能减少量化引入的误差。
adalora
lora存在的问题:
1、对所有模块都采用相同的秩
2、微调的过程中秩保持不变
针对这两个问题,Adalora做出了改进:
Adalora的整体目标是做参数预算(parameter budget),也就是忽略不重要的参数,把训练资源给重要的参数。即模型在微调过程中,自己学习每个模块的参数对训练结果的重要性,然后,依据重要性,动态调整不同模块的秩。