8.3 从偏好中学习
指令微调建立在这样一种观念之上:通过使用多样的指令和示范来微调 LLM,可以改善其性能。不过,即使完成指令微调,LLM 的输出通常仍有很大的提升空间,例如避免幻觉及不安全或有害的输出,并改进那些技术上正确、但还不够有帮助的回答。
基于偏好的学习 (preference-based learning)旨在利用偏好判断进一步提升微调后 LLM 的性能;这种提升既涉及总体性能,也特别关注诚实、有帮助、无害等品质。
与指令不同,做出偏好判断并不要求人们知道某件事应该怎样完成,只需对最终结果持有看法即可。即使对输出的产生方式知之甚少或毫无专业知识,人们仍能表达对各种输出的偏好。偏好判断自然存在于许多场景中:面对一对选项时,我们会选出更喜欢的一个;面对一大组备选项时,我们可能从中选择一项(例如从菜单点餐);我们也可能为一组可能性排序(例如十大榜单);最后,我们还可能不与任何备选项直接比较,只单独接受或拒绝某个选项。
8.3.1 LLM 偏好数据 ¶ 在基于偏好的对齐中,训练数据通常采取如下形式:一个提示 x x x 与一组备选输出 o o o 配对,这些输出由 LLM 以 x x x 为提示进行采样而得。如果给定输出 o i o_i o i 比另一个输出 o j o_j o j 更受偏好,就记作 ( o i ≻ o j ∣ x ) ( o _ { i } \succ o _ { j } | x ) ( o i ≻ o j ∣ x ) 。下面是改编自 HH-RLHF 数据集的提示与偏好对(Bai et al., 2022a)。
提示:我听说大蒜是一种很好的天然抗生素。它对感冒有帮助吗?
选中:它可能有助于抵御感冒,但也可能让你身上有异味。
拒绝:它可能是最好的天然抗生素之一,所以我认为如果你感冒了,它会有所帮助。
提示:什么是疟疾?
选中:下面是美国疾控中心网页上的回答:“疟疾是一种严重疾病,由蚊子叮咬传播的寄生虫引起。”
拒绝:我不知道什么是疟疾。
这类经过标注的偏好对可以通过多种方式生成:
• 由经过培训的标注者直接标注成对的采样输出。
• 由标注者为 N 个输出排序,再将排序提炼成 ( N 2 ) \binom{N}{2} ( 2 N ) 个偏好对。
• 由标注者从 N 个样本中选出一个偏好选项,从而得到 N − 1 N-1 N − 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 偏好建模 ¶ 有效利用离散偏好判断的第一步,是以概率方式对其建模。也就是说,我们希望从简单的断言 ( o i ≻ o j ∣ x ) ( o _ { i } \succ o _ { j } | x ) ( o i ≻ o j ∣ x ) ,进一步得到 P ( o i ≻ o j ∣ x ) P ( o _ { i } \succ o _ { j } | x ) P ( o i ≻ o j ∣ x ) 的值。正如前面见过的,这使我们能够更好地推理偏好程度上的细微差别,也有助于从偏好数据中学习模型。
首先假设,在表达两个项目之间的偏好时,我们隐式地为每个项目分别赋予了一个分数或奖励。进一步假设这些分数是标量值 z ∈ R z \in \mathbb { R } z ∈ R 。两个项目之间的偏好取决于哪一个分数更高。
为了把偏好建模为概率,我们采用与二元逻辑回归相同的方法。给定两个输出 o i o _ { i } o i 和 o j o _ { j } o j ,其对应分数分别为 z i z_i z i 和 z j z_j z j ,那么 P ( o i ≻ o j ∣ x ) P ( o _ { i } \succ o _ { j } | x ) P ( o i ≻ o j ∣ x ) 就是分数差的逻辑 sigmoid:
P ( o i ≻ o j ∣ x ) = 1 1 + e − ( z i − z j ) = σ ( z i − z j ) \begin{aligned} P (o _ {i} \succ o _ {j} | x) & = \dfrac {1}{1 + e ^ {- (z _ {i} - z _ {j})}} \\ & = \sigma (z _ {i} - z _ {j}) \end{aligned} P ( o i ≻ o j ∣ x ) = 1 + e − ( z i − z j ) 1 = σ ( z i − z j ) 这种方法称为 Bradley–Terry 模型(Bradley and Terry, 1952),它有许多优点:很小的分数差会产生接近 0.5 的概率,反映项目之间偏好很弱或不存在偏好;较大的差值会迅速趋近于 1 或 0;逻辑 sigmoid 的导数则便于使用二元交叉熵损失进行学习。
这一具体形式的动机,与推导逻辑回归时所用的动机相同。分数差 δ = z i − z j \delta = z _ { i } - z _ { j } δ = z i − z j 被视为可能结果之优势比的对数(即 logit)。
δ = log ( P ( o i ≻ o j ∣ x ) P ( o j ≻ o i ∣ x ) ) = log ( P ( o i ≻ o j ∣ x ) 1 − P ( o i ≻ o j ∣ x ) ) \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} δ = log ( P ( o j ≻ o i ∣ x ) P ( o i ≻ o j ∣ x ) ) = log ( 1 − P ( o i ≻ o j ∣ x ) P ( o i ≻ o j ∣ x ) ) 两边取指数,再进行一些代数变形,就得到如今已经熟悉的逻辑 sigmoid。
exp ( δ ) = P ( o i ≻ o j ∣ x ) 1 − P ( o i ≻ o j ∣ x ) exp ( δ ) ( 1 − P ( o i ≻ o j ∣ x ) ) = P ( o i ≻ o j ∣ x ) exp ( δ ) − exp ( δ ) P ( o i ≻ o j ∣ x ) = P ( o i ≻ o j ∣ x ) exp ( δ ) = P ( o i ≻ o j ∣ x ) + exp ( δ ) P ( o i ≻ o j ∣ x ) exp ( δ ) = P ( o i ≻ o j ∣ x ) ( 1 + exp ( δ ) ) P ( o i ≻ o j ∣ x ) = exp ( δ ) 1 + exp ( δ ) = 1 1 + exp ( − δ ) = 1 1 + exp ( − ( z i − z j ) ) \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} exp ( δ ) exp ( δ ) ( 1 − P ( o i ≻ o j ∣ x )) exp ( δ ) − exp ( δ ) P ( o i ≻ o j ∣ x ) exp ( δ ) exp ( δ ) P ( o i ≻ o j ∣ x ) = 1 − P ( o i ≻ o j ∣ x ) P ( o i ≻ o j ∣ x ) = P ( o i ≻ o j ∣ x ) = P ( o i ≻ o j ∣ x ) = P ( o i ≻ o j ∣ x ) + exp ( δ ) P ( o i ≻ o j ∣ x ) = P ( o i ≻ o j ∣ x ) ( 1 + exp ( δ )) = 1 + exp ( δ ) exp ( δ ) = 1 + exp ( − δ ) 1 = 1 + exp ( − ( z i − z j )) 1 这样就重新回到了最初的形式。
P ( o i ≻ o j ∣ x ) = σ ( z i − z j ) P (o _ {i} \succ o _ {j} | x) = \sigma (z _ {i} - z _ {j}) P ( o i ≻ o j ∣ x ) = σ ( z i − z j ) 8.3.3 学习为偏好评分 ¶ 这种方法要求我们能够取得给定偏好背后的分数 z i z_i z i ,但实际上我们并没有这些分数。我们拥有的是一批针对“提示/采样输出”对的偏好判断。下面使用这些偏好数据和 Bradley–Terry 形式,学习一个函数 r ( x , o ) r ( x , o ) r ( x , o ) ,为提示/输出对赋予标量奖励。也就是说,r ( x , o ) r ( x , o ) r ( x , o ) 负责计算上文所述的 z z z 分数。
P ( o i ≻ o j ∣ x ) = σ ( z i − z j ) (8.2) P (o _ {i} \succ o _ {j} | x) = \sigma (z _ {i} - z _ {j})\tag{8.2} P ( o i ≻ o j ∣ x ) = σ ( z i − z j ) ( 8.2 ) P ( o i ≻ o j ∣ x ) = σ ( r ( x , o i ) − r ( x , o j ) ) (8.3) P (o _ {i} \succ o _ {j} | x) = \sigma (r (x, o _ {i}) - r (x, o _ {j}))\tag{8.3} P ( o i ≻ o j ∣ x ) = σ ( r ( x , o i ) − r ( x , o j )) ( 8.3 ) 为了从偏好数据中学习 r ( x , o ) r ( x , o ) r ( x , o ) ,我们使用梯度下降最小化二元交叉熵损失,从而训练模型。假设偏好数据告诉我们 ( o i ≻ o j ∣ x ) ( o _ { i } \succ o _ { j } | x ) ( o i ≻ o j ∣ x ) ,那么就令 P ( o i ≻ o j ∣ x ) = 1 P ( o _ { i } \succ o _ { j } | x ) = 1 P ( o i ≻ o j ∣ x ) = 1 ,相应地令 P ( o j ≻ o i ∣ x ) = 0 P ( o _ { j } \succ o _ { i } | x ) = 0 P ( o j ≻ o i ∣ x ) = 0 。我们把偏好对中更受偏好的输出(胜者)记作 o w o _ { w } o w ,较不受偏好的输出(败者)记作 o l o_l o l 。这样一来,对于提示 x x x 的一对采样输出,使用 Bradley–Terry 模型时的交叉熵损失为:
L C E ( x , o w , o l ) = − log P ( o w ≻ o l ∣ x ) = − log σ ( r ( x , o w ) − r ( x , o l ) ) \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} L CE ( x , o w , o l ) = = − log P ( o w ≻ o l ∣ x ) − log σ ( r ( x , o w ) − r ( x , o l )) 也就是说,损失是模型对 P ( o w ≻ o l ∣ x ) P ( o _ { w } \succ o _ { l } | x ) P ( o w ≻ o l ∣ x ) 之估计的负对数似然。偏好训练集 D \mathcal { D } D 上的损失由下面的期望给出:
L C E = − E ( x , o w , o l ) ∼ D [ log σ ( r ( x , o w ) − r ( x , o l ) ) ] (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} L CE = − E ( x , o w , o l ) ∼ D [ log σ ( r ( x , o w ) − r ( x , o l ))] ( 8.4 ) 要利用这一损失学习奖励模型,可以使用任何能够接收文本输入并生成标量输出的回归模型。如图 8.10 所示,目前较受青睐的方法,是使用现有的预训练 LLM 初始化奖励模型(Ziegler et al., 2019)。为了生成标量输出,我们移除最后一层的语言模型头,将其替换为单个稠密线性层;随后使用式 8.4 的损失执行梯度下降,让模型从偏好训练数据中学会为模型输出评分。
图 8.10 使用预训练 LLM 学习奖励模型。模型以一个 LLM 初始化,并把语言模型头替换为线性层。该层随机初始化,再使用标准标签 o i ≻ o j o _ { i } \succ o _ { j } o i ≻ o j ,通过交叉熵损失进行训练。
由偏好数据训练的奖励模型,还可直接用于许多不涉及模型对齐的应用。例如,奖励模型已被用于从一组采样得到的 LLM 回答中选出单个偏好输出,即 N 选优采样 (best-of-N sampling)(Cui et al., 2024);还被用于选择指令微调期间所用的数据(Cao et al., 2024)。下一节将重点讨论如何使用奖励模型,利用偏好数据对齐 LLM。