一文看懂强化学习
password
Sub-item
type
status
date
summary
tags
icon
Parent item
slug
category
基本概念
强化学习(Reinforcement learning,RL)以学习曲线陡峭著称,而新手在接触RL时很大的问题是概念不清,或无法把字面上的概念与实际应用联系起来。这些概念是RL学习的基础,需要深刻理解其含义。
简言之,强化学习是智能体(agent)通过试错法学习的过程。智能体与环境(environment)交互,根据环境的状态(state)采取行动(action),并根据环境的奖励(reward)信息,来重复或遗忘该action,实现趋利避害。
强化学习系统具有马尔可夫性(Markov property),即t+1时刻的state 只依赖第t时刻的state 和action :
多数情况下,我们可以这么理解这些概念: agent:目标神经网络,从MLP到ChatGPT environment:黑盒,不需要关注 state:一个vector reward:一个scalar action:vector或scalar
除了agent、environment、state,reward、action这些基础概念,我们还了解以下七个引申概念:
- observation:agent看到的state;绝大多数情况下,可以把observation理解成state。
- policy:agent的大脑;绝大多数情况下,可以把policy理解成agent,即我们目标优化的神经网络。policy可以分为两类(其中为神经网络的参数):
- stochastic policy:用表示。t时刻的行为,从概率中采样得到:
- deterministic policy:用表示,;
- action space:action的候选集,要么不连续(此时action是离散值/离散vector)要么连续(此时action是一个实数vectors)
- trajectory(又叫episodes 或rollouts,一个意思):一连串的state,action;
- Return: 一个trajectory中reward的累加和,记作。
有时,我们会在Return计算公式上加上折现因子(discount factor),以体现时间的作用(越早的奖励越重要):
- V函数:如果从state 开始,遵循policy 与环境互动,那么记Return的期望值为V函数(value function)。
- Q函数:如果从state 开始,采取action为a,后续遵循policy 与环境互动,那么记Return的期望值为Q函数(value-value function)。
以上十二概念,构成了RL的核心。
基本思想
REINFORCE是最原始的policy gradient(PG)算法 ,其核心思想是增加产生更高回报的动作的概率,减少产生更低回报的动作的概率。
如今绝大多数policy都是参数化的,因此REINFORCE(乃至所有的PG类算法)的目标是找到最优policy(的参数),从而最大化预期回报(expected returns):
其中,期望回报的计算公式为:
其中,为策略下整个轨迹的概率,由于t+1时刻的状态只依赖第t时刻的state 和action (马尔可夫性):
对于这个优化目标:
我们可以通过梯度上升法来学习:
即为策略梯度(policy gradient),从实际应用的角度,那么我们只需要知道可以用以下方式来估计:
其中 ,是我们收集的轨迹集合,每个轨迹都是通过让策略 与环境做互动而得到的;是D中轨迹的数量(N);T是每个轨迹的长度。
公式推导(大可忽略):
- 给定策略 ,轨迹 的概率为:
- 对数导数技巧:
- 轨迹的对数概率:
- 环境函数的梯度:
- 环境函数不依赖于, 因此 , 和 的梯度都为零。
- 因此,轨迹的对数概率梯度为:
综上所述,我们得到以下内容:这是一个期望值,这意味着我们可以用sample的方式来估计它,即
通过不断让策略 与环境进行交互,得到用于策略梯度更新的样本。注意到没,训练样本取决于我们要优化的神经网络,这是强化学习很大的特色。监督学习的样本,训练前便标注好、与模型无关。
在实际代码实现中,我们类比监督学习算法,构建一个损失函数,通过Pytorch或Tensorflow自动进行梯度计算、回传,并利用梯度下降法进行参数更新。
当向损失函数传入正确数据时, =,即这个损失函数的负梯度等于策略梯度(policy gradient)。这里的正确数据指的是,我们向损失函数传入的数据,必须是当前policy与environment交互得到的(state, action, return),而不能是任意的(state, action, return)。
可以把这个损失函数,跟我们熟悉的监督学习的损失函数做个对比:
- 形式上,它跟我们熟悉的分类交叉熵loss很像——累加公式里面,都是对数概率*系数的形式。只不过交叉熵损失里面,系数是标注的标签(hard label),这里则是环境反馈的Return。
- 在监督学习中,我们关注损失函数,如果其下降说明训练过程正常。但在策略梯度算法中,损失函数的大小毫无意义。这里使用损失函数,只是因为它与我们的优化目标拥有相同的梯度。policy gradient算法的训练过程中,我们应该只关心平均回报。
两点改进
以上是policy gradient的核心思想了,但通常我们会对两个地方进行改进:
- 目标函数里,用到的系数是整个轨迹的return,均匀作用到所有step上。但仔细想想,这其实并不合理——第t个时间步的行为,应该只对应t时间步之后的return(毕竟,我们不应该为过去的事情负责)。0到t-1时间步的return,其实与无关。
从数学上来讲,使用代替是无偏的(证明可见:链接),且能够降低方差(reward的随机性是方差的一个来源,这里使得参与累加的reward变少)
- 引入基线(baseline),衡量当前的行为,能够比预期好多少。如果不引入baseline会发生什么事情呢?我们假设环境的return只有正值,如果这时sample到一个『差行为』,其return低于平均值,我们应该降低其概率。但由于其损失(对数概率*系数)中的系数为正数,通过上面的优化算法,反而会让其概率上升,由于输出层是softmax,会使『好行为』概率下降。
Baseline可以是一个待调整的超参数;或者使用一个待训练的网络(通常称为critic)、产出当前状态的value值作为baseline。
此外,我们可以用Q函数代替 (证明可见),则有, 现在通常会把这一项叫做优势函数(Advantage),即:
代码实现
策略用简单的mlp实现:
损失函数的实现,就是简单的cross-entropy,这里的weights可以是reward,也可以更复杂如Advantage。
计算每一步的return时,我们只考虑未来的reward,并对未来的reward进行discount:
训练1个epoch的过程中,先是利用当前策略与环境交互,采样出batch size大小的样本,其中可能包含了多个trajectory,然后统一更新:
其reward曲线如下,可以看到后期已经完全收敛,回报达到最大值200:
参考资料:
- Utterance