1. RLHF的发展历程
年份 | 论文 | 简介 |
---|---|---|
2017 | Deep Reinforcement Learning from Human Preferences | 传统游戏领域 |
2017 | Proximal Policy Optimization Algorithms | TRPO改进->PPO |
2020 | Learning to summarize from human feedback | 文本摘要+RLHF |
2022 | Training language models to follow instructions with human feedback | GPT3+RLHF |
2023 | GPT-4 Technical Report | 最强语言模型 |
2023 | Aligning Text-to-Image Models using Human Feedback | 文生图+HF |
2023 | DPOK: Reinforcement Learning for Fine-tuning Text-to-Image Diffusion Models | 文生图+RLHF |
2023 | Training Diffusion Models with Reinforcement Learning | 文生图+RLHF |
从上面的发展历程可以看到,随着chatGPT的惊艳效果的出现,如今无论是在语言模型还是在文生图模型中,关于RLHF的实验研究越来越多。经过大量的实验也证明RLHF在满足人类偏好,缓解偏见,提升文生图模型的图文对齐方面都有很好的效果。本文将重点介绍RLHF算法的架构以及其中涉及的强化学习理论及PPO算法,最后概述部分论文的RLHF实践。
2. 强化学习
2.1 强化学习基本概念
强化学习是用于描述agent和环境交互过程中通过学习策略以达成回报最大化的问题。强化学习一般包括如下要素:
- 智能体(agent):感知环境状态,根据反馈奖励选择合适的行为,最大化长期收益,在交互过程中进行学习
- 状态(state):是对环境的描述,可以是离散的也可是连续的
- 行为(action):agent在某一轮中采取的动作,这个动作会作用于环境且执行后获得一个奖励
- 奖励(reward):本质上是描述实现某一目标而采取的一系列动作的质量
- 策略(policy):定义agent在特定时间的行为方式,可以理解为是环境状态到动作的映射
- 回合(episode):agent在环境里面执行某个策略从开始到结束这一个过程
2.2 强化学习分类
强化学习一般可分为基于值的方法、基于策略的方法和actor-critic方法这三类
基于值函数的学习方法要学习一个价值函数, 去计算每个动作在当前环境下的价值,目标就是获取最大的动作价值,即每一步采取回报最大的动作和环境进行互动。Value-Based的方法输出的是动作的价值,选择价值最高的动作。适用于非连续的动作。常见的方法有Q-learning、Deep Q Network和Sarsa。其基础网络结构如下图所示,在编码网络之后,直接用一个全连接层来为每个状态输出一个分数。
基于策略梯度的学习方法去学习策略函数,去计算当前前环境下每个动作的概率,目标是获取最大的状态价值,即该动作发生后期望回报越大越好。Policy-Based的方法直接输出下一步动作的概率,根据概率来选取动作。但不一定概率最高就会选择该动作,还是会从整体进行考虑。适用于非连续和连续的动作。常见的方法有Policy gradients。从图中可以看出来,在全连接层之后还有一个softmax层,从而将打分转化成概率。
Actor-Critic 融合了上述两种方法,价值函数和策略函数一起进行优化。价值函数负责在环境学习并提升自己的价值判断能力,而策略函数则接受价值函数的评价,尽量采取在价值函数那可以得到高分的策略。
2.3 Policy Gradient
在强化学习中,最主要的部件有:agent、environment、reward function、state、atction,其中env和reward function是事先就定好的,无法控制。唯一能调整的是agent的policy,使agent能获得最大的reward。policy在agent中起决策作用,决定了agent的行为。即输入状态(state)要输出动作(action)。
在深度强化学习中,通常用
π
\pi
π来表示policy,policy通常就是我们要训练的network,network中参数用
θ
\theta
θ表示。如下图所示,从初始状态
s
1
s_1
s1开始,agent(或actor)根据策略采取动作
a
1
a_1
a1,并获得奖励
r
1
r_1
r1,如此进行下去,直到结束。从开始到结束称为一个episode(回合)。每一个episode的所有s和a的序列,叫做Trajectory(轨迹)。agent的目标就是要总的奖励
R
(
τ
)
=
∑
t
T
r
t
R(\tau)=\sum_t^T r_t
R(τ)=∑tTrt 最大。
在给定policy的参数
θ
\theta
θ 情况下,可以计算每一个
τ
\tau
τ 的概率
p
θ
(
τ
)
=
p
(
s
1
)
p
θ
(
a
1
∣
s
1
)
p
(
s
2
∣
s
1
,
a
1
)
p
θ
(
a
2
∣
s
2
)
p
(
s
3
∣
s
2
,
a
2
)
⋯
=
p
(
s
1
)
∏
t
=
1
T
p
θ
(
a
t
∣
s
t
)
p
(
s
t
+
1
∣
s
t
,
a
t
)
\begin{aligned} &p_{\theta}(\tau) \\ &=p(s_{1})p_{\theta}(a_{1}|s_{1})p(s_{2}|s_{1},a_{1})p_{\theta}(a_{2}|s_{2})p(s_{3}|s_{2},a_{2})\cdots \\ &=p(s_{1})\prod_{t=1}^{T}p_{\theta}(a_{t}|s_{t})p(s_{t+1}|s_{t},a_{t}) \end{aligned}
pθ(τ)=p(s1)pθ(a1∣s1)p(s2∣s1,a1)pθ(a2∣s2)p(s3∣s2,a2)⋯=p(s1)t=1∏Tpθ(at∣st)p(st+1∣st,at)
其中 p ( s t + 1 ∣ s t , a t ) p(s_{t+1}|s_t,a_t) p(st+1∣st,at)代表的是environment,我们没办法控制这一部分,能控制的是采取不同的 θ \theta θ(policy网络的参数),进而影响 p θ ( a t ∣ s t ) p_\theta(a_t|s_t) pθ(at∣st),最终对 p θ ( τ ) p_\theta(\tau) pθ(τ) 产生影响。
所以对于 R 我们要算它的期望
R
θ
ˉ
\bar{R_\theta}
Rθˉ ,穷举所有的trajectory
τ
\tau
τ 并计算每个
τ
\tau
τ 出现的概率,最后算
∑
τ
R
(
τ
)
p
θ
(
τ
)
\sum_\tau{R(\tau)p_\theta(\tau)}
∑τR(τ)pθ(τ) 。即:从
p
θ
(
τ
)
p_\theta(\tau)
pθ(τ) 的分布中采样(sample)出一个
τ
\tau
τ ,然后计算
R
(
τ
)
R(\tau)
R(τ) 的期望。
为了使
R
θ
ˉ
\bar{R_\theta}
Rθˉ 最大化,需要做gradient ascent(注意不是gradient descent),即对
R
θ
ˉ
\bar{R_\theta}
Rθˉ 求梯度。注意
R
θ
ˉ
\bar{R_\theta}
Rθˉ 中
R
(
τ
)
R(\tau)
R(τ) 是不可微的,但不影响。
E
τ
∼
p
θ
(
τ
)
[
R
(
τ
)
∇
l
o
g
p
θ
(
τ
)
]
E_{\tau \sim p_\theta(\tau)}[R(\tau)\nabla log p_\theta(\tau)]
Eτ∼pθ(τ)[R(τ)∇logpθ(τ)] 是无法计算的,所以sample出N个
τ
\tau
τ ,对每个
τ
\tau
τ 求
R
(
τ
n
)
∇
l
o
g
p
θ
(
τ
n
)
R(\tau^n)\nabla log p_\theta(\tau^n)
R(τn)∇logpθ(τn) 再求和取平均。
上文中提到 p θ ( τ ) = p ( s 1 ) ∏ t = 1 T p θ ( a t ∣ s t ) p ( s t + 1 ∣ s t , a t ) p_{\theta}(\tau)=p(s_{1})\prod_{t=1}^{T}p_{\theta}(a_{t}|s_{t})p(s_{t+1}|s_{t},a_{t}) pθ(τ)=p(s1)∏t=1Tpθ(at∣st)p(st+1∣st,at),而 p ( s t + 1 ∣ s t , a t ) p(s_{t+1}|s_t,a_t) p(st+1∣st,at) 由环境决定,我们无法知道,而且这一项本来也和 θ \theta θ没关系,因此对 l o g p θ ( τ ) logp_{\theta}(\tau) logpθ(τ) 计算梯度,本质上就是对 p θ ( a t ∣ s t ) p_\theta(a_t|s_t) pθ(at∣st) 计算梯度。所以最后 R ( τ n ) ∇ l o g p θ ( τ n ) R(\tau^n)\nabla log p_\theta(\tau^n) R(τn)∇logpθ(τn) 改写为 ∑ t = 1 T n R ( τ n ) ∇ l o g p θ ( a t n ∣ s t n ) \sum_{t=1}^{T_n} R(\tau^n)\nabla log p_\theta(a_t^n|s_t^n) ∑t=1TnR(τn)∇logpθ(atn∣stn)。
最后的 1 N ∑ n = 1 N ∑ t = 1 T n R ( τ n ) ∇ l o g p θ ( a t n ∣ s t n ) \frac{1}{N} \sum_{n=1}^N \sum_{t=1}^{T_n} R(\tau^n)\nabla log p_\theta(a_t^n|s_t^n) N1∑n=1N∑t=1TnR(τn)∇logpθ(atn∣stn):若在 s t n s_t^n stn 下执行 a t n a_t^n atn 使得 R ( τ n ) R(\tau^n) R(τn) 为正,则增加概率 p θ ( a t n ∣ s t n ) p_\theta(a_t^n|s_t^n) pθ(atn∣stn),为负则减少概率
policy gradient 算法流程如下所示:在实际实验中,会让actor去和 environment 做互动,产生左边的数据。左边的方框是做 sample,获得很多
(
s
,
a
)
(s, a)
(s,a) 的pair(代表在
s
s
s下采取
a
a
a,得到
R
(
τ
)
R(\tau)
R(τ))。然后将这些数据送入训练过程中计算
∇
l
o
g
p
θ
(
a
t
n
∣
s
t
n
)
\nabla log p_\theta(a_t^n|s_t^n)
∇logpθ(atn∣stn)。然后更新模型的参数
θ
\theta
θ。
2.3.1 add a baseline
如下图所示,蓝色柱子的代表在某一state下,采取三种动作的概率,绿色箭头则代表每种动作的Reward,越长的表示Reward越大。可以看到在这个state下,采取的所有action的reward都是正值。
按照上文所述,假如执行 action a 后 R 为正,则提高 action a 出现的概率;R 为负,则降低 action a 出现的概率。理想的情况如上图所示,执行 action a 后 R 的增加量大,则 action a 出现概率增加得大;执行 action b 后R的增加量小,则 action b 出现概率相对增加得小。
但是实际情况是在sample中可能有些动作没有sample到,比如 action a,这样归一化后 action a 出现的概率会必然下降,因为 action b/c 出现的概率无论如何都会上升,这样就把 action a 出现的概率给压下去了,这显然是不妥的
所以我们希望reward不要总是正的,即改成
R
(
τ
n
)
−
b
R(\tau^n)-b
R(τn)−b ,
b
b
b 是一个baseline,这样如果一个 reward 是一个很小的正值,减掉
b
b
b 后就会变负。
b
≈
E
[
R
(
τ
)
]
b \approx E[R(\tau)]
b≈E[R(τ)] 可以用
R
(
τ
)
R(\tau)
R(τ) 的平均值代替。
即原先的期望奖励
∇
R
ˉ
θ
≈
1
N
∑
n
=
1
N
∑
t
=
1
T
n
R
(
τ
n
)
∇
l
o
g
p
θ
(
a
t
n
∣
s
t
n
)
\nabla\bar{R}_{\theta}\approx\frac{1}{N}\sum_{n=1}^{N}\sum_{t=1}^{T_{n}}R(\tau^{n})\nabla logp_{\theta}(a_{t}^{n}|s_{t}^{n})
∇Rˉθ≈N1∑n=1N∑t=1TnR(τn)∇logpθ(atn∣stn)优化成如下形式:
∇
R
θ
ˉ
≈
1
N
∑
n
=
1
N
∑
t
=
1
T
n
(
R
(
τ
n
)
−
b
)
∇
l
o
g
p
θ
(
a
t
n
∣
s
t
n
)
b
≈
E
[
R
(
τ
)
]
\nabla\bar{R_{\theta}}\approx\frac{1}{N}\sum_{n=1}^{N}\sum_{t=1}^{T_{n}}(R(\tau^{n})-b)\nabla logp_{\theta}(a_{t}^{n}|s_{t}^{n})\quad b\approx E[R(\tau)]
∇Rθˉ≈N1n=1∑Nt=1∑Tn(R(τn)−b)∇logpθ(atn∣stn)b≈E[R(τ)]
2.3.2 assign suitable credit
如下图,不管一个回合中的某个 action 是好是坏,总会乘上相同的权重 R,这显然也是不合理的。如下图中整场游戏的 reward 是+3,按规定其中三个
∇
l
o
g
p
θ
(
a
t
n
∣
s
t
n
)
\nabla log p_\theta(a_t^n|s_t^n)
∇logpθ(atn∣stn) 都要被乘上 3 的权重,但是
a
3
a_3
a3 未必见得好,因为执行
a
3
a_3
a3 后的得分是 -2。如果我们sample的次数够多,可能会看出
a
3
a_3
a3 不够好,这个问题能够得到解决。但是实际中可能没办法搜集足够多的数据,所以在sample次数不够多的情况下,我们希望每个action的权重不同
解决的方法是,不把整场游戏的 R(+5+0±2=+3)作为统一权重,而将执行该动作后剩下序列的reward之和作为该动作的权重。比如对于
(
s
b
,
a
2
)
(s_b,a_2)
(sb,a2) ,它的权重应该为
(
+
0
−
2
=
−
2
)
(+0-2=-2)
(+0−2=−2)。即执行某个 action 前得到多少 reward 都跟该 action 无关,该 action 只影响之后的游戏过程。
所以把权重中的
R
(
τ
n
)
R(\tau^n)
R(τn) 换成
∑
t
′
=
t
T
n
r
t
′
n
\sum_{t'=t}^{T_n}r_{t'}^n
∑t′=tTnrt′n,其中
t
t
t 代表该 action 执行的时刻,
T
n
T_n
Tn 代表游戏结束的时刻,即把当前的
r
r
r 以及之后每一步的
r
r
r 做一个求和。还需要考虑的一点是,当前的 action 对之后游戏的影响会随之时间推移而减弱,所以我们要有 discount,在求和的每一步都乘上一个小于1的
γ
\gamma
γ(比如0.9),这样 action 之后的动作越多,分数乘上的
γ
\gamma
γ 越多,越往后得到reward就会打上更大的折扣。
把
R
(
τ
n
)
−
b
R(\tau^n)-b
R(τn)−b 这一项称作Advantage Function
A
θ
(
s
t
,
a
t
)
A^{\theta}(s_t, a_t)
Aθ(st,at),也叫优势函数。它表示 agent 在
s
t
s_t
st下采取
a
t
a_t
at,相较于其它 action(同样对于
s
t
s_t
st)有多好,上标
θ
\theta
θ 代表 采用参数为
θ
\theta
θ 的 policy 的 agent。
2.4 TRPO和PPO算法
2.4.1 on-policy
on-policy 指我们学习的 agent(即actor) 和与环境交互的 agent 是相同的,即 agent 一边和环境互动,一边学习。On policy的方式学习如下:
- 使用actor π θ \pi_\theta πθ去收集数据,用这些数据来进行参数的更新,此时参数 θ \theta θ 变为 θ ′ \theta^{'} θ′
- 由于参数 θ \theta θ 变为 θ ′ \theta^{'} θ′,原本actor π θ \pi_\theta πθ 收集的数据就不能用了,所以要重新收集数据
- 再根据 actor π θ ′ \pi_{\theta^{'}} πθ′ 收集的数据,将参数 θ ′ \theta^{'} θ′ 变为 θ ′ ′ \theta^{''} θ′′
- 如此更新下去…
不足:每更新一次参数就需要重新去收集数据,这样更新的效率很低,很花时间
新目标:用 π θ ′ \pi_{\theta^{'}} πθ′ 去收集数据,用这些数据去训练 π θ \pi_\theta πθ ,这样就可以更新参数很多次而只用同一批数据,这就是off-policy
2.4.2 Important Sampling
E x ∼ p [ f ( x ) ] E_{x\sim p}[f(x)] Ex∼p[f(x)] 代表从分布 p p p 中取样本 x x x 送入 f ( x ) f(x) f(x) 并求期望,类似于从 p p p 中取 N N N 个 x i x_i xi,然后代入 f ( x ) f(x) f(x) 求平均,即:
E x ∼ p [ f ( x ) ] ≈ 1 N ∑ i = 1 N f ( x i ) E_{x\sim p}[f(x)]\approx\frac{1}{N}\sum_{i=1}^{N}f(x^i) Ex∼p[f(x)]≈N1i=1∑Nf(xi)
假设我们不能从分布 p p p 中 sample 数据,但我们仍然要求 E x ∼ p [ f ( x ) ] E_{x\sim p}[f(x)] Ex∼p[f(x)],那该怎么办?只需要重新找一个能采样数据的分布 q q q ,然后通过 q q q来计算上式,如下所示:
E x ∼ p [ f ( x ) ] = ∫ f ( x ) p ( x ) d x = ∫ f ( x ) p ( x ) q ( x ) q ( x ) d x = E x ∼ q [ f ( x ) p ( x ) q ( x ) ] E_{x\sim p}[f(x)]=\int f(x)p(x)dx=\int f(x)\frac{p(x)}{q(x)}q(x)dx=E_{x\sim q}[f(x)\frac{p(x)}{q(x)}] Ex∼p[f(x)]=∫f(x)p(x)dx=∫f(x)q(x)p(x)q(x)dx=Ex∼q[f(x)q(x)p(x)]
即从
q
q
q 中采样,然后带入
f
(
x
)
p
(
x
)
q
(
x
)
f(x)\frac{p(x)}{q(x)}
f(x)q(x)p(x)求平均即可。理论上
q
q
q 为任意分布即可,但是实际中需要
q
q
q和
p
p
p尽可能相近,否则会出现一些问题。根据方差计算公式
V
A
R
[
X
]
=
E
[
X
2
]
−
(
E
[
X
]
)
2
VAR[X]=E[X^{2}]-(E[X])^{2}
VAR[X]=E[X2]−(E[X])2得到如下式子:
V
a
r
x
∼
p
[
f
(
x
)
]
=
E
x
∼
p
[
f
(
x
)
2
]
−
(
E
x
∼
p
[
f
(
x
)
]
)
2
Var_{x\sim p}[f(x)]=E_{x\sim p}[f(x)^{2}]-\left(E_{x\sim p}[f(x)]\right)^{2}
Varx∼p[f(x)]=Ex∼p[f(x)2]−(Ex∼p[f(x)])2
V a r x ∼ q [ f ( x ) p ( x ) q ( x ) ] = E x ∼ q [ ( f ( x ) p ( x ) q ( x ) ) 2 ] − ( E x ∼ q [ f ( x ) p ( x ) q ( x ) ] ) 2 = E x ∼ p [ f ( x ) 2 p ( x ) q ( x ) ] − ( E x ∼ p [ f ( x ) ] ) 2 . \begin{aligned} Var_{x\sim q}[f(x)\frac{p(x)}{q(x)}]& =E_{x\sim q}\left[\left(f(x)\frac{p(x)}{q(x)}\right)^{2}\right]-\left(E_{x\sim q}\left[f(x)\frac{p(x)}{q(x)}\right]\right)^{2} \\ &=E_{x\sim p}\left[f(x)^{2}\frac{p(x)}{q(x)}\right]-\left(E_{x\sim p}[f(x)]\right)^{2}. \end{aligned} Varx∼q[f(x)q(x)p(x)]=Ex∼q[(f(x)q(x)p(x))2]−(Ex∼q[f(x)q(x)p(x)])2=Ex∼p[f(x)2q(x)p(x)]−(Ex∼p[f(x)])2.
即便两者期望值一样,但是他们的方差(variance)不同,两式的区别在于下式中多了一项
p
(
x
)
q
(
x
)
\frac{p(x)}{q(x)}
q(x)p(x),因此我们在选则
q
q
q的时候,尽量让其与
p
p
p接近。具体可看下面的case:
如上图所示,蓝线代表
p
p
p 的分布,绿线代表
q
q
q 分布,红线代表
f
(
x
)
f(x)
f(x) 函数,针对两种方法,我们要分别从
p
p
p 和
q
q
q 分布中 sample 出
x
x
x ,投到
f
(
x
)
f(x)
f(x) 中计算。如果sample次数不够多,会造成只sample到一种分布中数量比较多的那些样本,比如从
p
p
p 中sample,会容易sample到使
f
(
x
)
f(x)
f(x) 小于0的
x
x
x,从
q
q
q 中sample,会容易sample到使
f
(
x
)
f(x)
f(x) 大于0的
x
x
x。
如上图所示,当sample次数够多的时候,以从
q
q
q中sample为例,就可能sample到左边的点,这时它有很大的weight(
p
(
x
)
q
(
x
)
\frac{p(x)}{q(x)}
q(x)p(x)),这样就会将原本应该是正的
f
(
x
)
f(x)
f(x) 拉回负的。
由于在实际采样过程中,我们无法采样足够多的次数,因此在选择 q q q 分布的时候就会尽量选择接近 p p p的分布,从而来缩小方差的差异。
2.4.3 Off Policy
off-policy 指学习的 agent 与环境交互的 agent 是不同的,即 agent 通过看别人玩游戏来学习。即用 π θ ′ \pi_{\theta^{'}} πθ′ 去收集数据,用这些数据去训练 π θ \pi_\theta πθ 。这样就可以更新参数很多次而只用同一批数据。而通过2.3.2章节的重要性采样即可将 ∇ R ˉ θ = E τ ∼ p θ ( τ ) [ R ( τ ) ∇ l o g p θ ( τ ) ] \nabla\bar{R}_{\theta}=E_{\tau\sim p_{\theta}(\tau)}[R(\tau)\nabla logp_{\theta}(\tau)] ∇Rˉθ=Eτ∼pθ(τ)[R(τ)∇logpθ(τ)] 转换成下式:
∇ R ˉ θ = E τ ∼ p θ ′ ( τ ) [ p θ ( τ ) p θ ′ ( τ ) R ( τ ) ∇ l o g p θ ( τ ) ] \nabla\bar{R}_{\theta}=E_{\tau\sim p_{\theta'}(\tau)}\left[\frac{p_{\theta}(\tau)}{p_{\theta^{'}}(\tau)}R(\tau)\nabla logp_{\theta}(\tau)\right] ∇Rˉθ=Eτ∼pθ′(τ)[pθ′(τ)pθ(τ)R(τ)∇logpθ(τ)]
这样就能用 agent π θ ′ \pi_{\theta^{'}} πθ′ 收集数据,给agent π θ \pi_\theta πθ去训练了。具体off policy的梯度计算如下图所示
A
θ
(
a
t
,
s
t
)
A_\theta(a_t,s_t)
Aθ(at,st) 是总计的Reward减掉bias,即
A
θ
(
s
t
,
a
t
)
=
R
(
τ
n
)
−
b
A^\theta (s_t,a_t)=R(\tau^n)-b
Aθ(st,at)=R(τn)−b,就是衡量在状态
s
t
s_t
st 下采取动作
a
t
a_t
at 的回报,
A
θ
′
(
a
t
,
s
t
)
A^{\theta^{'}} (a_t,s_t)
Aθ′(at,st)是根据 sample 到的数据计算,因为
π
θ
′
\pi_{\theta^{'}}
πθ′ 与环境做互动,所以
A
θ
(
a
t
,
s
t
)
A^{\theta}(a_t,s_t)
Aθ(at,st) 要变为
A
θ
′
(
a
t
,
s
t
)
A^{\theta^{'}} (a_t,s_t)
Aθ′(at,st)。此外,这里我们估计
p
θ
(
s
t
)
p
θ
′
(
s
t
)
=
1
\frac{p_\theta(s_t)}{p_{\theta^{'}}(s_t)}=1
pθ′(st)pθ(st)=1,因为 state 的出现与
θ
\theta
θ 关系不大,且实际应用时会让
π
θ
\pi_\theta
πθ 和
π
θ
′
\pi_{\theta^{'}}
πθ′ 尽量接近,况且这一项本来就无法计算,因为state出现的概率我们是不能控制或估计的。最后
p
θ
(
a
t
∣
s
t
)
p
θ
‘
(
a
t
∣
s
t
)
\frac {p_\theta(a_t|s_t)}{p_{\theta{‘}}(a_t|s_t)}
pθ‘(at∣st)pθ(at∣st)可以直接计算。
2.4.4 TRPO 和 PPO 算法
上文讲了 θ \theta θ 和 θ ′ \theta^{'} θ′ 相差太多,会出现问题。那么为了防止 θ \theta θ 和 θ ′ \theta^{'} θ′ 相差太多,TRPO (Trust Region Policy Optimization) 算法在优化目标后面增加了约束项,如下式所示
J T R P O θ ′ ( θ ) = E ( s t , a t ) ∼ π θ ′ [ p θ ( a t ∣ s t ) p θ ′ ( a t ∣ s t ) A θ ′ ( s t , a t ) ] , K L ( θ , θ ′ ) < δ \begin{aligned}J_{TRPO}^{\theta'}(\theta)=E_{(s_t,a_t)\sim\pi_{\theta'}}\left[\frac{p_\theta(a_t|s_t)}{p_{\theta'}(a_t|s_t)}A^{\theta'}(s_t,a_t)\right],KL(\theta,\theta')<\delta\end{aligned} JTRPOθ′(θ)=E(st,at)∼πθ′[pθ′(at∣st)pθ(at∣st)Aθ′(st,at)],KL(θ,θ′)<δ
TRPO在作梯度上升的时候,只上式中前半部分对求梯度上升,而 K L ( θ , θ ′ ) KL(\theta,\theta{^{'}}) KL(θ,θ′) 只作为一个额外的约束,很难计算。
为此,PPO (Proxima Policy Optimization) 算法将约束直接和目标函数放到一起优化,就像深度学习中的正则化项,如下式所示:
J P P O θ ′ ( θ ) = J θ ′ ( θ ) − β K L ( θ , θ ′ ) J_{PPO}^{\theta^{\prime}}(\theta)=J^{\theta^{\prime}}(\theta)-\beta KL(\theta,\theta^{\prime}) JPPOθ′(θ)=Jθ′(θ)−βKL(θ,θ′)
其中 J θ ′ ( θ ) = E ( s t , a t ) ∼ π θ ′ [ p θ ( a t ∣ s t ) p θ ′ ( a t ∣ s t ) A θ ′ ( s t , a t ) ] J^{\theta^{\prime}}(\theta)=E_{(s_t,a_t)\sim\pi_{\theta^{\prime}}}\left[\frac{p_\theta(a_t|s_t)}{p_{\theta^{\prime}}(a_t|s_t)}A^{\theta^{\prime}}(s_t,a_t)\right] Jθ′(θ)=E(st,at)∼πθ′[pθ′(at∣st)pθ(at∣st)Aθ′(st,at)],后面一项是衡量 θ \theta θ 和 θ ′ \theta^{'} θ′ 的差距,这里的差距指的是 actor 行为上的差距而不是参数上的差距。
TRPO和PPO两者性能差不多,为了方便使用,目前一般都使用PPO算法。PPO中 β \beta β 和学习率有点类似,需要手动设置。我们可以设定两个阈值 K L m a x KL_{max} KLmax 和 K L m i n KL_{min} KLmin 。经过一次参数更新后,查看KL的值,如果 K L ( θ , θ ′ ) KL(\theta,\theta{^{'}}) KL(θ,θ′) 大于 K L m a x KL_{max} KLmax ,说明 θ \theta θ , θ ′ \theta^{'} θ′ 相差太大,需要加大 β \beta β ,加大惩罚。反之则减小
2.4.5 PPO2 算法
PPO2算法仍然是在约束上做文章,如下式所示:
J P P O 2 θ ′ ( θ ) ≈ ∑ ( s t , a t ) m i n ( p θ ( a t ∣ s t ) p θ ′ ( a t ∣ s t ) A θ ′ ( s t , a t ) , c l i p ( p θ ( a t ∣ s t ) p θ ′ ( a t ∣ s t ) , 1 − ε , 1 + ε ) A θ ′ ( s t , a t ) ) J_{PPO2}^{\theta^{\prime}}(\theta)\approx\sum_{(s_t,a_t)}min\left(\frac{p_\theta(a_t|s_t)}{p_{\theta^{\prime}}(a_t|s_t)}A^{\theta^{\prime}}(s_t,a_t),\right.\left.clip\left(\frac{p_\theta(a_t|s_t)}{p_{\theta^{\prime}}(a_t|s_t)},1-\varepsilon,1+\varepsilon\right)A^{\theta^{\prime}}(s_t,a_t)\right) JPPO2θ′(θ)≈(st,at)∑min(pθ′(at∣st)pθ(at∣st)Aθ′(st,at),clip(pθ′(at∣st)pθ(at∣st),1−ε,1+ε)Aθ′(st,at))
clip 函数的意思是:
p
θ
(
a
t
∣
s
t
)
p
θ
′
(
a
t
∣
s
t
)
\frac{p_\theta(a_t|s_t)}{p_{\theta^{\prime}}(a_t|s_t)}
pθ′(at∣st)pθ(at∣st) 小于
1
−
ϵ
1-\epsilon
1−ϵ,则取
1
−
ϵ
1-\epsilon
1−ϵ;若
p
θ
(
a
t
∣
s
t
)
p
θ
′
(
a
t
∣
s
t
)
\frac{p_\theta(a_t|s_t)}{p_{\theta^{\prime}}(a_t|s_t)}
pθ′(at∣st)pθ(at∣st) 大于
1
+
ϵ
1+\epsilon
1+ϵ 则取
1
+
ϵ
1+\epsilon
1+ϵ ;若介于两者之间,则取
p
θ
(
a
t
∣
s
t
)
p
θ
′
(
a
t
∣
s
t
)
\frac{p_\theta(a_t|s_t)}{p_{\theta^{\prime}}(a_t|s_t)}
pθ′(at∣st)pθ(at∣st),如下图所示。
J
P
P
O
2
θ
′
(
θ
)
J_{PPO2}^{\theta^{\prime}}(\theta)
JPPO2θ′(θ) 整体图像如下图所示,绿线代表 min 函数的第一项的图像,蓝线代表 min 函数的第二项的图像,红线代表最终 min 函数的输出结果。
这个式子其实就是让
θ
\theta
θ 和
θ
′
\theta^{\prime}
θ′ 不要差距太大。
如果 Advantage Function A > 0 A> 0 A>0,代表当前的 action 是好的,所以我们希望 p θ ( a t ∣ s t ) p_\theta(a_t|s_t) pθ(at∣st) 越大越好(即横轴代表的 p θ ( a t ∣ s t ) p θ ′ ( a t ∣ s t ) \frac{p_\theta(a_t|s_t)}{p_{\theta^{\prime}}(a_t|s_t)} pθ′(at∣st)pθ(at∣st) 增大),但是 p θ ( a t ∣ s t ) p_\theta(a_t|s_t) pθ(at∣st) 和 p θ ′ ( a t ∣ s t ) p_{\theta^{\prime}}(a_t|s_t) pθ′(at∣st) 二者不能相差太多,所以设了一个上界 1 + ϵ 1+\epsilon 1+ϵ (上图左边)
A < 0 A<0 A<0,则说明当前的action不好,所以希望 p θ ( a t ∣ s t ) p_\theta(a_t|s_t) pθ(at∣st) 越小越好(即横轴代表的 p θ ( a t ∣ s t ) p θ ′ ( a t ∣ s t ) \frac{p_\theta(a_t|s_t)}{p_{\theta^{\prime}}(a_t|s_t)} pθ′(at∣st)pθ(at∣st) 减小),但同样要设一个下界 1 − ϵ 1-\epsilon 1−ϵ 。
3. RLHF 基本架构
在本章节中主要以语言模型中的RLHF来介绍RLHF的基本架构,在文生图模型中基本框架与语言模型类似。RLHF的框架主要包括3步:
- 预训练一个语言模型 (LM)
- 收集人类反馈数据并训练一个奖励模型 (Reward Model,RM)
- 用强化学习 (RL) 方式微调 LM
总体结构如下图所示:
3.1 预训练语言模型
使用经典的预训练目标训练一个语言模型。对这一步的模型,OpenAI 在其第一个流行的 RLHF 模型 InstructGPT 中使用了较小版本的 GPT-3; Anthropic 使用了 1000 万 ~ 520 亿参数的 Transformer 模型进行训练;DeepMind 使用了自家的 2800 亿参数模型 Gopher。在一步中另外还可以用额外的文本或者条件对这个 LM 进行微调,但微调并不是 RLHF 必须的一步.
3.2 训练奖励模型
使用收集的人类偏好数据训练一个奖励模型,这一模型接收一系列文本并返回一个标量奖励,数值上对应人的偏好。关于模型选择方面,RM 可以是另一个经过微调的 LM,也可以是根据偏好数据从头开始训练的 LM。关于训练奖励数值方面,这里需要人工对 LM 生成的回答进行排名。起初我们可能会认为应该直接对文本标注分数来训练 RM,但是由于标注者的价值观不同导致这些分数未经过校准并且充满噪音。通过排名可以比较多个模型的输出并构建更好的规范数据集。
目前成功的 RLHF 系统使用了和生成模型具有不同大小的 LM ,例如 OpenAI 使用了 175B 的 LM 和 6B 的 RM,Anthropic 使用的 LM 和 RM 从 10B 到 52B 大小不等,DeepMind 使用了 70B 的 Chinchilla 模型分别作为 LM 和 RM 。一种直觉是,偏好模型和生成模型需要具有类似的能力来理解提供给它们的文本
3.3 使用强化学习微调
首先将微调任务表述为 RL 问题。首先,该策略 (policy) 是一个接受提示并返回一系列文本 (或文本的概率分布) 的 LM。这个策略的行动空间 (action space) 是 LM 的词表对应的所有词元 (一般在 50k 数量级) ,观察空间 (observation space) 是可能的输入词元序列,也比较大 (词汇量 ^ 输入标记的数量) 。奖励函数是偏好模型和策略转变约束 (Policy shift constraint) 的结合。
目前多个组织找到的可行方案是使用策略梯度强化学习 (Policy Gradient RL) 算法、近端策略优化 (Proximal Policy Optimization,PPO) 微调初始 LM 的部分或全部参数
4. 最新实践RLHF
4.1 语言模型RLHF
- 【论文阅读】InstructGPT: Training language models to follow instructions with human feedback
- 【论文阅读】Training a Helpful and Harmless Assistant with Reinforcement Learning from Human Feedback
4.2 文生图模型RLHF
- 强化学习微调文生图模型:Reinforcement Learning for Fine-tuning Text-to-Image Diffusion Models
- 强化学习在文生图中的应用:Training Diffusion Models with Reinforcement Learning