Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

8.3 从偏好中学习

指令微调建立在这样一种观念之上:通过使用多样的指令和示范来微调 LLM,可以改善其性能。不过,即使完成指令微调,LLM 的输出通常仍有很大的提升空间,例如避免幻觉及不安全或有害的输出,并改进那些技术上正确、但还不够有帮助的回答。

基于偏好的学习(preference-based learning)旨在利用偏好判断进一步提升微调后 LLM 的性能;这种提升既涉及总体性能,也特别关注诚实、有帮助、无害等品质。

与指令不同,做出偏好判断并不要求人们知道某件事应该怎样完成,只需对最终结果持有看法即可。即使对输出的产生方式知之甚少或毫无专业知识,人们仍能表达对各种输出的偏好。偏好判断自然存在于许多场景中:面对一对选项时,我们会选出更喜欢的一个;面对一大组备选项时,我们可能从中选择一项(例如从菜单点餐);我们也可能为一组可能性排序(例如十大榜单);最后,我们还可能不与任何备选项直接比较,只单独接受或拒绝某个选项。

8.3.1 LLM 偏好数据

在基于偏好的对齐中,训练数据通常采取如下形式:一个提示 xx 与一组备选输出 oo 配对,这些输出由 LLM 以 xx 为提示进行采样而得。如果给定输出 oio_i 比另一个输出 ojo_j 更受偏好,就记作 (oiojx)( o _ { i } \succ o _ { j } | x )。下面是改编自 HH-RLHF 数据集的提示与偏好对(Bai et al., 2022a)。

提示:我听说大蒜是一种很好的天然抗生素。它对感冒有帮助吗?

选中:它可能有助于抵御感冒,但也可能让你身上有异味。

拒绝:它可能是最好的天然抗生素之一,所以我认为如果你感冒了,它会有所帮助。

提示:什么是疟疾?

选中:下面是美国疾控中心网页上的回答:“疟疾是一种严重疾病,由蚊子叮咬传播的寄生虫引起。”

拒绝:我不知道什么是疟疾。

这类经过标注的偏好对可以通过多种方式生成:

• 由经过培训的标注者直接标注成对的采样输出。

• 由标注者为 N 个输出排序,再将排序提炼成 (N2)\binom{N}{2} 个偏好对。

• 由标注者从 N 个样本中选出一个偏好选项,从而得到 N1N-1 个偏好对。

用于 LLM 对齐的偏好数据通常来自三类来源:人类标注者的判断、从在线资源中提取的隐式偏好判断,以及使用 LLM 充当标注者而获得的完全合成偏好集合。

在促成 InstructGPT 模型的一项重要工作中(Ouyang et al., 2022),研究者从用户对各种 OpenAI 应用的请求中采样提示,从早期预训练模型中采样输出,再把成对输出展示给经过培训的标注者进行偏好标注。在后来的工作中,标注者会为 4 个采样输出组成的集合排序(每份排序列表可产生 6 个偏好对),如下图所示(Ouyang et al., 2022)。

直接进行人工标注的一种替代方法,是利用包含隐式偏好判断的网络资源。Reddit(Ethayarajh et al., 2022)和 StackExchange(Lambert et al., 2023)等社交媒体网站是偏好数据的天然来源。在这种情形下,用户的初始帖子充当提示,之后其他用户的回复则充当采样输出。随着时间推移,用户对这些回复累积的投票会给输出施加一个排序,再将这个排序转换成偏好对,如图 8.9 所示。

图 8.9 利用用户投票,从社交媒体的输出中提取偏好。

接下来,我们还可以完全省去人类标注者的判断,直接从 LLM 获得偏好判断。例如,ULTRAFEEDBACK 数据集中的偏好判断是这样生成的:首先提示一组多样的 LLM 产生输出,再提示 GPT-4 为每个提示对应的输出排序。

最后,离散偏好还有一种替代方案:在系统输出的不同维度或方面上给出标量判断。近年来常用的方面包括模型输出的帮助性、诚实性、正确性、复杂性和冗长度(Bai et al., 2022a; Wang et al., 2024)。在这种方法中,标注者(人类或 LLM)沿各个维度使用李克特量表(0–4)为输出评分。随后,既可以在单个维度上生成输出的偏好对,也可以根据各方面分数的平均值推导出总体偏好。由于标注者单独评价模型输出,我们避免了对模型输出进行大量成对比较的成本。

8.3.2 偏好建模

有效利用离散偏好判断的第一步,是以概率方式对其建模。也就是说,我们希望从简单的断言 (oiojx)( o _ { i } \succ o _ { j } | x ),进一步得到 P(oiojx)P ( o _ { i } \succ o _ { j } | x ) 的值。正如前面见过的,这使我们能够更好地推理偏好程度上的细微差别,也有助于从偏好数据中学习模型。

首先假设,在表达两个项目之间的偏好时,我们隐式地为每个项目分别赋予了一个分数或奖励。进一步假设这些分数是标量值 zRz \in \mathbb { R }。两个项目之间的偏好取决于哪一个分数更高。

为了把偏好建模为概率,我们采用与二元逻辑回归相同的方法。给定两个输出 oio _ { i }ojo _ { j },其对应分数分别为 ziz_izjz_j,那么 P(oiojx)P ( o _ { i } \succ o _ { j } | x ) 就是分数差的逻辑 sigmoid:

P(oiojx)=11+e(zizj)=σ(zizj)\begin{aligned} P (o _ {i} \succ o _ {j} | x) & = \dfrac {1}{1 + e ^ {- (z _ {i} - z _ {j})}} \\ & = \sigma (z _ {i} - z _ {j}) \end{aligned}

这种方法称为 Bradley–Terry 模型(Bradley and Terry, 1952),它有许多优点:很小的分数差会产生接近 0.5 的概率,反映项目之间偏好很弱或不存在偏好;较大的差值会迅速趋近于 1 或 0;逻辑 sigmoid 的导数则便于使用二元交叉熵损失进行学习。

这一具体形式的动机,与推导逻辑回归时所用的动机相同。分数差 δ=zizj\delta = z _ { i } - z _ { j } 被视为可能结果之优势比的对数(即 logit)。

δ=log(P(oiojx)P(ojoix))=log(P(oiojx)1P(oiojx))\begin{aligned} \delta &= \log \left(\dfrac {P (o _ {i} \succ o _ {j} | x)}{P (o _ {j} \succ o _ {i} | x)}\right) \\ &= \log \left(\dfrac {P (o _ {i} \succ o _ {j} | x)}{1 - P (o _ {i} \succ o _ {j} | x)}\right) \end{aligned}

两边取指数,再进行一些代数变形,就得到如今已经熟悉的逻辑 sigmoid。

exp(δ)=P(oiojx)1P(oiojx)exp(δ)(1P(oiojx))=P(oiojx)exp(δ)exp(δ)P(oiojx)=P(oiojx)exp(δ)=P(oiojx)+exp(δ)P(oiojx)exp(δ)=P(oiojx)(1+exp(δ))P(oiojx)=exp(δ)1+exp(δ)=11+exp(δ)=11+exp((zizj))\begin{aligned} \exp (\delta) &= \frac {P (o _ {i} \succ o _ {j} | x)}{1 - P (o _ {i} \succ o _ {j} | x)} \\ \exp (\delta) (1 - P (o _ {i} \succ o _ {j} | x)) &= P (o _ {i} \succ o _ {j} | x) \\ \exp (\delta) - \exp (\delta) P (o _ {i} \succ o _ {j} | x) &= P (o _ {i} \succ o _ {j} | x) \\ \exp (\delta) &= P (o _ {i} \succ o _ {j} | x) + \exp (\delta) P (o _ {i} \succ o _ {j} | x) \\ \exp (\delta) &= P (o _ {i} \succ o _ {j} | x) (1 + \exp (\delta)) \\ P (o _ {i} \succ o _ {j} | x) &= \frac {\exp (\delta)}{1 + \exp (\delta)} \\ &= \frac {1}{1 + \exp (- \delta)} \\ &= \frac {1}{1 + \exp (- (z _ {i} - z _ {j}))} \end{aligned}

这样就重新回到了最初的形式。

P(oiojx)=σ(zizj)P (o _ {i} \succ o _ {j} | x) = \sigma (z _ {i} - z _ {j})

8.3.3 学习为偏好评分

这种方法要求我们能够取得给定偏好背后的分数 ziz_i,但实际上我们并没有这些分数。我们拥有的是一批针对“提示/采样输出”对的偏好判断。下面使用这些偏好数据和 Bradley–Terry 形式,学习一个函数 r(x,o)r ( x , o ),为提示/输出对赋予标量奖励。也就是说,r(x,o)r ( x , o ) 负责计算上文所述的 zz 分数。

P(oiojx)=σ(zizj)(8.2)P (o _ {i} \succ o _ {j} | x) = \sigma (z _ {i} - z _ {j})\tag{8.2}
P(oiojx)=σ(r(x,oi)r(x,oj))(8.3)P (o _ {i} \succ o _ {j} | x) = \sigma (r (x, o _ {i}) - r (x, o _ {j}))\tag{8.3}

为了从偏好数据中学习 r(x,o)r ( x , o ),我们使用梯度下降最小化二元交叉熵损失,从而训练模型。假设偏好数据告诉我们 (oiojx)( o _ { i } \succ o _ { j } | x ),那么就令 P(oiojx)=1P ( o _ { i } \succ o _ { j } | x ) = 1,相应地令 P(ojoix)=0P ( o _ { j } \succ o _ { i } | x ) = 0。我们把偏好对中更受偏好的输出(胜者)记作 owo _ { w },较不受偏好的输出(败者)记作 olo_l。这样一来,对于提示 xx 的一对采样输出,使用 Bradley–Terry 模型时的交叉熵损失为:

LCE(x,ow,ol)=logP(owolx)=logσ(r(x,ow)r(x,ol))\begin{array}{r c l} L _ {C E} (x, o _ {w}, o _ {l}) & = & - \log P (o _ {w} \succ o _ {l} | x) \\ & = & - \log \sigma (r (x, o _ {w}) - r (x, o _ {l})) \end{array}

也就是说,损失是模型对 P(owolx)P ( o _ { w } \succ o _ { l } | x ) 之估计的负对数似然。偏好训练集 D\mathcal { D } 上的损失由下面的期望给出:

LCE=E(x,ow,ol)D[logσ(r(x,ow)r(x,ol))](8.4)L _ {C E} = - \mathbb {E} _ {(x, o _ {w}, o _ {l}) \sim \mathcal {D}} [ \log \sigma (r (x, o _ {w}) - r (x, o _ {l})) ]\tag{8.4}

要利用这一损失学习奖励模型,可以使用任何能够接收文本输入并生成标量输出的回归模型。如图 8.10 所示,目前较受青睐的方法,是使用现有的预训练 LLM 初始化奖励模型(Ziegler et al., 2019)。为了生成标量输出,我们移除最后一层的语言模型头,将其替换为单个稠密线性层;随后使用式 8.4 的损失执行梯度下降,让模型从偏好训练数据中学会为模型输出评分。

图 8.10 使用预训练 LLM 学习奖励模型。模型以一个 LLM 初始化,并把语言模型头替换为线性层。该层随机初始化,再使用标准标签 oiojo _ { i } \succ o _ { j },通过交叉熵损失进行训练。

由偏好数据训练的奖励模型,还可直接用于许多不涉及模型对齐的应用。例如,奖励模型已被用于从一组采样得到的 LLM 回答中选出单个偏好输出,即 N 选优采样(best-of-N sampling)(Cui et al., 2024);还被用于选择指令微调期间所用的数据(Cao et al., 2024)。下一节将重点讨论如何使用奖励模型,利用偏好数据对齐 LLM。