Policy-Based Reinforcement Learning
策略学习:用神经网络来近似策略函数
,该神经网络叫做
policy network
。用来控制agent
运动。想要训练policy network
,必须用到policy gradient
算法。该算法是本节重点。
Policy Function Approximation
Policy Function 
policy
函数 是一个概率密度函数,可以自动控制
agent
运动。
- 输入为当前状态
;
- 输出为概率分布,给每个动作
action
分配一个概率值,每个动作对应一个概率值。
有了动作 action
的概率值, agent
就会做一次随机抽样,得到动作 action
。每个动作都有可能被抽到,但是向上的动作被抽到的可能性比较大。然后
agent
就会做动作。
Can we directly learn a policy function 
只要有了一个 policy
函数 ,就可以通过
policy
函数 自动控制
agent
运动,但是如何得到这样的policy
函数 ?如果只有几个状态和动作,我们可以画出一张表格矩阵,表中每一个格子代表一个概率。通过玩游戏把所有的概率算出来,就可以得到
policy function
。
Policy Network 
由于现实情况是状态是无数的,不可能将所有状态和对应的动作的概率统计在一张表上,无法直接通过计算得到一个 policy
函数 ,所以我们需要做函数近似,得到
policy
函数 ,可以使用神经网络来近似得到
policy
函数 ,我们把该神经网络叫做
policy network
。
为神经网络的参数,一开始是随机初始化的,然后通过学习逐渐改进参数
。下图为超级玛丽游戏中的策略函数:
- 输入为当前状态
- 输出为三维向量,每个元素对应一个动作值(发生该动作的概率)
由于 policy
函数 是一个概率密度函数,所以满足:
对于所有动作,将
policy
函数 输出的概率值加和必须为1,所以这也是为什么在神经网络中要添加
softmax
激活函数。
State-Value Function Approximation
Discounted Return
:从
时刻开始,未来所有奖励
的加权求和。由于在
时刻,未来的奖励还没有观测到,所以是随机变量,每个奖励
的随机性来自于前一时刻的动作
和状态
。动作的随机性来自于
policy
函数;状态的随机性来自于状态转移函数
。
由于 是所有奖励的加和,
的随机性来自于未来所有的动作和状态。
Action-value function
是动作价值函数,是
的条件期望,其把
时刻以后的状态
和动作
的随机性都消除,
的值依赖于当前的状态
和 当前动作
和
policy
函数。用不同的
policy
函数得到的
值是不一样的。
可以评价在状态
的情况下,
动作的好坏。
state-value function
:状态价值函,其是
的期望,将
中的动作
积分掉,动作
被当做随机变量,概率密度函数为
policy
函数 ,将动作
的影响消除,这样
只与
policy
函数 和当前状态
有关:
- 给定
policy
函数,
可以评价当前状态的好坏,
越大,表示当前胜算越大;
- 给定状态
,可以评价当前
policy
函数的好坏程度,
policy
函数好,
值越大,表示胜算大。
如果动作 是离散的,期望就可以通过求和来展开:对于所有动作
,把
和概率密度函数
policy
函数 的内积做连加,这样动作
就被消掉了。
Policy-Based Reinforcement Learning
我们得到了状态价值函,现在我们用神经网络近似状态价值函
。
现在我们来讨论一下策略学习的思想:
刚才我们用策略网络代替策略函数,这样状态价值函数可以近似写成。
可以评价状态
和
policy
函数 的好坏。给定状态
,策略网络越好 ,
值越大。
如何让策略网络越来越好呢???改进模型参数θ,让 变大。
基于此想法,我们可以把目标函数定义为:的期望,记做
。该期望是对于状态
求的,这里将状态
作为一个随机变量,用期望去掉,这样变量就剩下
了。目标函数
就是对策略网络的评价。策略网络越好
越大。所以
Policy-based Learning
就是改进 ,使得
越大越好。
如何改进θ呢?这就用到了 Policy gradient ascent
算法。
让 agent
玩游戏,每一步能观测到状态,
就是从状态的概率分布中随机抽样得到的,然后对
,关于
求导,得到梯度,然后用梯度上升来更新
,
是学习率。
这种方法类似于随机梯度上升,但是我们算的不是梯度,真正的梯度应该是目标函数 对于
求导,这里我们算的是
对
的导数,其实就是随机梯度,随机性来源于状态
。
为什么要用梯度上升呢?因为我们想让目标函数变得越来越大,
就被叫做
Policy Gradient
。
Policy Gradient
要想学习策略网络,需要策略梯度算法,策略梯度是函数是对神经网络参数
的导数,接下来会讲到如何求解导数和近似计算策略梯度。
函数是对
state-value function
的近似。 是策略神经网络,
是神经网络的参数。
策略梯度就是对神经网络参数
的导数,接下来要做数学推导,将该导数算出来:连加的导数就变成导数的连加。为了方便推导,假设
不依赖于
,这样就可以在对
求导过程中,把
当做常数提取出来。但是这种假设并不严谨,
依赖于
,而
是函数
的参数,所以
也是依赖于
的。
这样就得到策略梯度的公式:
如果动作 是离散的,直接用这个公式就能把策略梯度算出来,然而实际应用中不会用该公式来计算策略梯度。实际用的都是这个公式的蒙泰卡罗近似。
是概率密度函数,
乘以 公式第二行蓝色笔圈出的部分,再关于动作
做连加,就等于对圈出的部分做期望,求期望时,把动作
当做随机变量,
是动作
的概率密度函数。
以上的推导是不严谨的,因为中的
函数,也是关于
的函数,理应也要把
对
求导,实际上将其也考虑在内,得到的最终结果也是相同的。如果只是用一下
policy gradient
算法,这样理解就已经ok了。
我们已经推理除了策略梯度算法的两种等价形式,有了上述两个公式,就可以实际计算得到策略梯度了。
如果动作是离散的,就可以用第一种公式:
- 把连加中的东西记做
;对于每个动作
,将
值计算出来;
- 根据上述公式一:策略梯度就是把这些
全部加起来
但是,动作空间太过于庞大的时候,计算量会很大。
对于连续的动作,我们就可以使用策略梯度的第二种公式:蒙泰卡罗近似。A是连续变量,所以想求该期望,就得求定积分,但是由于π函数是神经网络,非常复杂,没有办法用数学公式对复杂的神经网络的积分求出,所以可以使用蒙泰卡罗近似,求出近似期望。蒙泰卡罗近似步骤:
- 随机抽样得到一个动作
,抽样是根据概率密度函数π得到的。
- 由于动作
是一个确定的动作。直接能够计算出
的值。
- 根据函数
的定义,其期望就是
- 由于a是根据概率密度函数随机抽样得到的,所以
是策略梯度
的无偏估计。
- 根据函数
- 由于
是策略梯度
的无偏估计,所以可以用
来近似策略梯度。
蒙泰卡罗近似就是抽一个或者很多个随机样本,用随机样本近似期望,更新模型参数 的时候,用
来作为近似的梯度就可以,不用计算精确的策略梯度(也算不出来)。
策略梯度算法
- 在
时刻观测到状态
;
- 用蒙泰卡罗近似来计算策略梯度,把策略网络
作为概率密度函数,进行随机抽样得到动作
。
- 计算价值函数
的值,把结果记做
;
- 对策略网络求导,得到
;
- 近似求取策略梯度。
- 更新策略网络的参数
步骤三中的action-value function, 是不知道的,无法算
,如何近似求取它呢?
- 方法1:Reinforce
- 用策略网络π控制agent运动, 从一开始玩到游戏结束,把整个游戏的轨迹记录下来
- 观察到所有的奖励后r,就能得到U_t
- 由于价值函数是U_t的期望,我们可以用U_t的观测值u_t来近似Q_pai。
- 所以该方法就是使用观测值u_t代替Q_pai函数,该方法需要玩完一整局游戏,观测到所有的奖励,然后才能更新策略网络。
方法2:
我们希望得到策略函数π,用π函数自动来控制agent运动。
- 每当agent观测到状态s_t,agent就用π函数算出概率分布,然后随机抽样得到一个action
- 直接求策略函数比较困难,所以需要策略神经网络来近似策略函数,
- θ是神经网络π的参数,一开始通过随机初始化得到,然后使用策略梯度算法更新。
- 策略梯度是关于价值函数V对θ的导数,算出了策略梯度,用梯度上升来跟新参数θ。why梯度上升?希望V越大越好。目标函数是
,可以理解为:使用policy函数π,agent的平均胜算有多大。策略函数越好,目标函数越大,agent的平均胜算也就越大。