本文的重点:使用一个神经网络来近似策略函数Π
我们使用一个神经网络来近似策略函数,这个神经网络叫做策略网络,他可以用来控制agent运动,想要训练这个神经网络,就要用到policy gradient算法
策略函数Π的输入是当前状态s,他的输出是一个概率分布(0,2,0.1,0.7),给每一个动作a一个概率值
超级玛丽的例子里面,Π函数的输入是状态s,输出是个三维向量,每个元素是一个动作的概率,有了这三个概率值,agent会做一个随机抽样,得到动作a,左右上这三个动作都有可能被抽到,但是向上被抽到的概率最大,是0.7
1、如何得到策略函数呢?
假如一个游戏只有5个状态10个动作,那很好办,我们画一张5*10的表,表里面每一格对应一个概率,我们通过玩游戏,把这50个概率值算出来就好了,但是超级玛丽这样的游戏有无数个这样的状态,这张表根本装不下,所以我们没法直接计算policy函数Π,所以我们得做函数近似,学出来一个函数来近似策略函数,函数近似的方法有多种多样,可以用线性函数,可以用曲线函数,也可以用神经网络,这里的θ是神经网络的参数,一开始θ是随机初始化的,后来我们通过学习来改进θ
2、如果是超级玛丽这个游戏,我们可以把策略网络设计成这个样:
输入是状态s,也就是当前屏幕显示的画面,也可以是最近几帧的画面, 然后是一个或者几个卷积层,把画面变成特征向量,然后全连接层把特征向量映射到一个三维向量,由于有3个动作,所以这里的维度是3,随后使用softmax激活函数,这样的输出才是一个概率分布,输出的是一个三维向量,每一个元素对应一个动作,里面的值都是动作的概率
softmax可以让输出的都是整数,且加和=1
3、回顾一下状态价值函数:
动作价值函数QΠ是Ut的条件期望,QΠ的值依赖于policy函数Π,at,st
而状态价值函数VΠ是QΠ的期望,把QΠ中的动作A给积掉,这里的A被当作是随机变量,概率密度是Π,把A给消掉之后,VΠ就只与policy函数Π和状态st有关了
这样一旦你给定策略函数Π,VΠ就可以评价当前状态st的好坏了,VΠ越大说明当前的胜算越大
给定状态s,VΠ 可以评价策略函数Π 的好坏,如果Π很好,VΠ就会比较大,说明胜算大
4、策略学习的主要思想:
我们刚刚用策略网络来近似策略函数,这样一来,价值函数就可以写成V(s;θ),V可以评价状态s和策略网络的好坏
5、怎么让策略网络变得越来越好呢?
》不断改进调整策略网络的参数θ
这个期望是关于状态S求的,这里把状态S作为一个随机变量,用期望给去掉,这样一来变量就只剩下θ了,目标函数J(θ)就是对策略网络的评价,策略网络越好,J(θ)就越大,所以策略学习的目标就是改进θ,使J(θ)越大越好
6、怎么改进θ呢?
》使用policy gradient算法
我们让agent玩游戏,每一步都会观测到一个不同的状态s,这个s就相当于是从状态的概率分布当中随机抽样出来的,观测到状态s,把V(s,θ),关于θ求导,得到一个梯度,然后用梯度上升来更新θ,这里的β是学习率,其实这就相当于是随机梯度上升,我们算的不是梯度,真正的梯度是目标函数J(θ),关于θ的导数,这里我们算的是v关于θ的导θ数,其实就是一个随机梯度,随机性来自于S,为什么要用梯度上升呢?因为我们想要使目标函数J(θ)越来越大,这里的v关于θ的导数就被称为policy gradient(策略梯度)
7、为什么使用梯度上升来更新θ呢?
》因为沿着梯度上升的方向走,我们的目标函数J(θ)就会越接近最大值!
对函数V求导得到的是局部最大值,而对它的期望J求导得到的是全局最大值
下面来讲怎么近似计算policy gradient:
为了简化推导,假设QΠ不依赖于θ(其实是有可能依赖的),这样就可以把QΠ当成一个常数,从求导的运算中提取出来,放到导数的外面
但是实际中通常不会使用这个公式来计算策略梯度,实际通常用的都是这个策略梯度的蒙特卡洛近似
离散的动作:
连续的动作:
A是连续变量,所以想要直接求这个期望就要做定积分,但是积分是做不到的,因为Π函数是个神经网络,非常复杂,没办法直接计算出来,所以只能做蒙特卡洛近似
蒙特卡洛近似的过程:
1、随机抽样一个动作记作a hat,抽样是根据概率密度函数Π来抽的
2、计算g(a hat,θ),这里的a hat是一个确定的动作,有了a hat直接算一下g(a hat,θ)的值就好了
由于a hat是根据概率密度函数Π随机抽样出来的,所以g(a hat,θ)是策略梯度的一个无偏估计
由于g()是策略梯度的无偏估计,所以可以用g()来近似策略梯度,这个被称为蒙特卡洛近似,蒙特卡洛就是抽一个或者几个随机样本,用随机样本来近似期望,更新模型参数θ的时候,用g()来作为近似的梯度就可以了
总结一下策略梯度算法:
1、在第t个时间点,观测到了状态st
2、使用蒙特卡洛近似来计算策略梯度,把策略网络Π作为概率密度函数,用它随机抽样得到一个动作at,比如at是向左的动作
3、计算价值函数QΠ的值,把结果记作qt
4、对策略网络Π求导,算出logΠ关于θ的导数,得到的结果dθ,t是向量、矩阵或者是张量,dθ,t的大小和θ是一样的,如果θ是100*100的矩阵,那么dθ,t也是100*100的矩阵,tensorflow和pytorch这些系统都支持自动求梯度你告诉系统当前at,st还有当前参数θt,系统可以自动求出来梯度dθ,t
5、近似地计算策略梯度,用一个样本a来算策略梯度的蒙特卡洛近似
6、最后一步,有了近似的策略梯度,就可以用它来更新策略网络的参数θ了
目前还有一个没解决的问题就是QΠ是什么呢?
我们不知道QΠ,所以没法算qt,那么如何近似去算qt呢?
法一:用策略网络Π来控制agent运动,从一开始一直玩到游戏结束,把整个游戏的轨迹都记录下来,s1,a1,r1,s2,a2,r2,...sn,an,rn,观测到所有奖励r,我们就可以算出ut
由于价值函数QΠ是Ut的期望,我们可以用大Ut的观测值小ut来近似QΠ,所以reinforce强化算法就是使用观测到的ut来代替QΠ函数,reinforce算法需要玩完一局游戏,观测到所有的奖励,然后才能更新策略网络
法二:用一个神经网络来做近似:
原本已经用神经网络近似了策略函数Π,现在用另一个神经网络来近似价值函数QΠ,这样就有了两个神经网络,一个被称为Actor,一个被称为Critic,这样就有了actor-critic方法
总结:
直接求策略函数比较困难,所以我们要用神经网络来近似测量函数
θ是神经网络的参数,一开始随机初始化,然后通过policy gradient算法来学习参数θ
这节课的主要内容就是推导策略梯度和计算策略梯度
策略梯度是价值函数V关于θ的导数,算出了策略梯度,就做梯度上升来更新参数θ,为什么要做梯度上升呢?因为我们希望价值函数V越大越好,目标函数是E(V),可以理解为使用策略函数Π,agent的平均胜算有多大,策略函数越好,这个目标函数的值就会越大,agent的评价胜算也就越大
如果大家对这节课的内容比较迷糊的话,我会在下一篇答疑篇给大家指点一下迷津,希望能对你有所帮助!