添加链接描述
优化点两个:
- gamma
- 长度正则
gamma
原始DPO把两部分母拿出来是
−
l
o
g
π
r
e
f
(
w
i
n
)
π
r
e
f
(
l
o
s
e
)
-log \frac{\pi_{ref}(win)}{\pi_{ref}(lose)}
−logπref(lose)πref(win)
由于构建数据集时常常把不满意的大模型输出作为lose,因此这个值往往>0.
这抬高了sigma内部的值,变相削弱了
π
θ
\pi_{\theta}
πθ的学习动力。
因此,一个简单的方法是手动设置超参gamma<0代替上述公式。
长度正则
长度越长,涉及token越多——其实公式上看不出什么问题,可以说没问题。
但是会出现这样一个情况:loss要变小,目标是DPO的win部分正无穷,lose部分负无穷,这只需要全序列中的少数几个token有较大的logits改动就做得到。(说是这么说,但只是个极端情况),但是极端情况在训练初期不是不可能发生。如果所谓的DPO训练完成是几个token的功劳,假如这些token都在chosen和rejected的末尾,那么infer的前期很大概率仍然是原本的错误推理。
越长的序列越可能出现这种现象,因为token多了。
长度正则能缓解这个现象,把单token的loss平均到每个token上,迫使所有token必须同时优化。
改进
gamma是个硬阈值,和PPO里优势函数的设计思路一样。不是很solid但是也只能如此了。
长度正则的做法有些饮鸩止渴,个人感觉结合step-dpo+loss贡献衰减的思路比单纯长度正则要好。