PPO? 强化学习
基本概念
强化学习五要素:智能体、行为、环境、状态、奖励。
先直接将五个要素映射到文本生成任务上:
智能体:生成模型。
行为: 获取当前step token的概率分布,并选取其中一个作为生成的token。
环境:一个评判标准,可以是模型,一般都是分类模型,seqgan是使用判别是否机器生成的分类器模型,chatgpt是人类偏好分类器;也可以是人为制定的评估标准,类似relu,rouge。
状态:当前step已生成的文本。
奖励:由环境结合当前的状态给出的分数。
状态价值的计算
V ( s ) = R ( s ) + γ ∑ s ′ ∈ S P ( s ′ ∣ s ) V ( s ′ ) V(s) = R(s) + \gamma \sum_{s^{'} \in S} P(s'|s) V(s') V(s)=R(s)+γs′∈S∑P(s′∣s)V(s′)
R ( s ) R(s) R(s): 当前状态的奖励
γ \gamma γ:折扣因子,因为当前的状态对后续的状态会随着步数的增加而减小。
先给出一个简单的例子:
一个生活中最常见的“吃饭”例子
好比吃饭可以带来奖励为6,折扣因子为0.8,对于吃饭状态的奖励值的计算为:
V ( 吃饭 ) = R ( 吃饭 ) + γ ∑ s ′ ∈ S P ( s ′ ∣ s ) V ( s ) = 6 + 0.8 ( 0.5 ∗ V ( 喝酒 ) + 0.5 ∗ V ( 喝茶 ) ) = 6 + 0.8 ( 0.5 ∗ ( 3 + 0.8 ( 1.0 ∗ 10 ) ) + 0.5 ∗ ( 5 + 0.8 ( 1.0 ∗ 4 ) ) ) \begin{aligned} V(吃饭) &= R(吃饭) + \gamma \sum_{s^{'} \in S} P(s^{'}|s) V(s)\\ &=6 + 0.8(0.5 * V(喝酒) + 0.5 * V(喝茶))\\ &=6 + 0.8(0.5 * (3 + 0.8(1.0 * 10)) + 0.5 * (5 + 0.8(1.0 * 4)))\\ \end{aligned} V(吃饭)=R(吃饭)+γs′∈S∑P(s′∣s)V(s)=6+0.8(0.5∗V(喝酒)+0.5∗V(喝茶))=6+0.8(0.5∗(3+0.8(1.0∗10))+0.5∗(5+0.8(1.0∗4)))
问题:1)对于文本生成而言,我们无法对每个状态给出一个奖励,我们只有在一个样本生成结束之后,才可以评判一个样本生成的好坏。
2)假设我们要生成一个20字长的文本,生成器的词表大小是20000,我们的状态空间就是20000的20次方,这是显然我们无法接受。
求解方法:
蒙特卡洛
蒙特卡洛方法,也称为统计模拟方法,就是通过大量的随机样本来估算或近似真实值,比如近似估算圆的面积。
可以通过 圆的面积/ 正方形的面积 = 圆中点的个数/正方形中点的个数 来计算圆的面积。
类似的,在文本生成中我们也可以用蒙特卡洛方法来估计一个模型的状态价值。考虑到 一个状态的价值是它的期望回报,那么如果我们用当前模型采样很多条序列,然后计算从这个状态出发的回报再求其期望就可以了,这样我们就同时解决了上述的两个问题。
例子:
输入:今天的天气怎么样?
模型采样输出:1)s1 = 很抱歉,我无法回答当前天气情况,因为我没有实时获取天气信息的功能。 7
2)s2 = 今天天气晴朗。 3
3)s3 = 今天会下冰雹。 5
…
E π ( " 今天天气怎么样 ? " ) = ∑ τ R ( τ ) P π ( τ ) E_{\pi}(^"今天天气怎么样?^") = \sum_{\tau}R(\tau)P_{\pi}(\tau) Eπ("今天天气怎么样?")=τ∑R(τ)Pπ(τ)
τ \tau τ 是我们任何可能生成的文本, π \pi π 是我们当前的生成模型,我们期望最大化 E π ( " 今天天气怎么样 ? " ) E_{\pi}(^"今天天气怎么样?^") Eπ("今天天气怎么样?"),既然要最大化,我们肯定需要对期望进行求导。
∇ E π ( " 今天天气怎么样 ? " ) = ∑ τ R ( τ ) ∇ P π ( τ ) = ∑ τ R ( τ ) P π ( τ ) ∇ P π ( τ ) P π ( τ ) = ∑ τ R ( τ ) P π ( τ ) ∇ l o g ( P π ( τ ) ) = E π ( " 今天天气怎么样 ? " ) [ R ( τ ) ∇ l o g ( P π ( τ ) ) ] \begin{aligned} \nabla E_{\pi}(^"今天天气怎么样?^") &= \sum_{\tau}R(\tau)\nabla P_{\pi}(\tau)\\ &= \sum_{\tau}R(\tau)P_{\pi}(\tau) \frac {\nabla P_{\pi}(\tau)} {P_{\pi}(\tau)}\\ &=\sum_{\tau}R(\tau)P_{\pi}(\tau)\nabla log(P_{\pi}(\tau))\\ &= E_{\pi}(^"今天天气怎么样?^")[R(\tau)\nabla log(P_{\pi}(\tau))] \end{aligned} ∇Eπ(