一文看懂强化学习
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
 
notion image
 
多数情况下,我们可以这么理解这些概念: agent:目标神经网络,从MLP到ChatGPT environment:黑盒,不需要关注 state:一个vector reward:一个scalar action:vector或scalar
 
除了agent、environment、state,reward、action这些基础概念,我们还了解以下七个引申概念:
 
  1. observation:agent看到的state;绝大多数情况下,可以把observation理解成state
  1. policy:agent的大脑;绝大多数情况下,可以把policy理解成agent,即我们目标优化的神经网络。policy可以分为两类(其中为神经网络的参数):
    1. stochastic policy:用表示。t时刻的行为,从概率中采样得到:
    2. deterministic policy:用表示,
  1. action space:action的候选集,要么不连续(此时action是离散值/离散vector)要么连续(此时action是一个实数vectors)
  1. trajectory(又叫episodes 或rollouts,一个意思:一连串的state,action;
  1. Return: 一个trajectory中reward的累加和,记作
有时,我们会在Return计算公式上加上折现因子(discount factor),以体现时间的作用(越早的奖励越重要):
  1. V函数:如果从state 开始,遵循policy 与环境互动,那么记Return的期望值为V函数(value function)。
  1. 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是每个轨迹的长度。
 
公式推导(大可忽略):
 
  1. 给定策略 ,轨迹 的概率为:
  1. 对数导数技巧:
  1. 轨迹的对数概率:
  1. 环境函数的梯度:
      • 环境函数不依赖于, 因此 , 的梯度都为零。
  1. 因此,轨迹的对数概率梯度为:
综上所述,我们得到以下内容:
notion image
 
这是一个期望值,这意味着我们可以用sample的方式来估计它,即
 
 
通过不断让策略 与环境进行交互,得到用于策略梯度更新的样本。注意到没,训练样本取决于我们要优化的神经网络,这是强化学习很大的特色。监督学习的样本,训练前便标注好、与模型无关。
 
在实际代码实现中,我们类比监督学习算法,构建一个损失函数,通过Pytorch或Tensorflow自动进行梯度计算、回传,并利用梯度下降法进行参数更新。
当向损失函数传入正确数据时, =,即这个损失函数的负梯度等于策略梯度(policy gradient)。这里的正确数据指的是,我们向损失函数传入的数据,必须是当前policy与environment交互得到的(state, action, return),而不能是任意的(state, action, return)。
 
可以把这个损失函数,跟我们熟悉的监督学习的损失函数做个对比:
  1. 形式上,它跟我们熟悉的分类交叉熵loss很像——累加公式里面,都是对数概率*系数的形式。只不过交叉熵损失里面,系数是标注的标签(hard label),这里则是环境反馈的Return。
  1. 在监督学习中,我们关注损失函数,如果其下降说明训练过程正常。但在策略梯度算法中,损失函数的大小毫无意义。这里使用损失函数,只是因为它与我们的优化目标拥有相同的梯度。policy gradient算法的训练过程中,我们应该只关心平均回报。
 

两点改进

以上是policy gradient的核心思想了,但通常我们会对两个地方进行改进:
  1. 目标函数里,用到的系数是整个轨迹的return,均匀作用到所有step上。但仔细想想,这其实并不合理——第t个时间步的行为,应该只对应t时间步之后的return(毕竟,我们不应该为过去的事情负责)。0到t-1时间步的return,其实与无关。
    1.  
      从数学上来讲,使用
      代替
      是无偏的(证明可见:链接),且能够降低方差(reward的随机性是方差的一个来源,这里使得参与累加的reward变少)
  1. 引入基线(baseline),衡量当前的行为,能够比预期好多少。如果不引入baseline会发生什么事情呢?我们假设环境的return只有正值,如果这时sample到一个『差行为』,其return低于平均值,我们应该降低其概率。但由于其损失(对数概率*系数)中的系数为正数,通过上面的优化算法,反而会让其概率上升,由于输出层是softmax,会使『好行为』概率下降。
    1. Baseline可以是一个待调整的超参数;或者使用一个待训练的网络(通常称为critic)、产出当前状态的value值作为baseline。
      此外,我们可以用Q函数代替证明可见),则有, 现在通常会把这一项叫做优势函数(Advantage),即:
 

代码实现

策略用简单的mlp实现:
 
损失函数的实现,就是简单的cross-entropy,这里的weights可以是reward,也可以更复杂如Advantage。
 
计算每一步的return时,我们只考虑未来的reward,并对未来的reward进行discount:
训练1个epoch的过程中,先是利用当前策略与环境交互,采样出batch size大小的样本,其中可能包含了多个trajectory,然后统一更新:
 
其reward曲线如下,可以看到后期已经完全收敛,回报达到最大值200:
notion image

参考资料:

  1. https://spinningup.openai.com/en/latest/spinningup/rl_intro3.html
  1. https://towardsdatascience.com/proximal-policy-optimization-ppo-explained-abed1952457b
  1. https://fse.studenttheses.ub.rug.nl/25709/1/mAI_2021_BickD.pdf
  1. https://huggingface.co/deep-rl-course/unit8/visualize?fw=pt
  1. objective vs loss function
  1. what-is-the-bias-variance-trade-off-in-reinforcement-learning
 

  • Utterance

文章数:
29
访客数:

公众号/知乎/雪球同名