作者:陆平

1. 智能体与环境

策略梯度(Policy Gradient)模型是强化学习中的一个经典基础模型。它用来在某种环境下训练智能体。对于一些简单场景,我们可以把智能体与环境及关系抽象为:

智能体是在环境中实施行为的实体。它与环境的交互下图所示。首先一个episode开始,环境初始化后将释放出一个状态信息 s 1 s1 s1。智能体观测到状态信息 s 1 s1 s1,依据该信息做思考和决策,得到行为 a 1 a1 a1。环境再根据智能体的行为 a 1 a1 a1,释放出状态信息 s 2 s2 s2。智能体观测到状态信息 s 2 s2 s2,经过自身决策得到行为 a 2 a2 a2。该过程一直持续下去,直到该episode结束。

理解智能体与环境的关系,需要理解episode这个词。它的中文直译是“一段经历”,其实不太好理解。为了更通俗,举以下几个例子;

第一个例子是打游戏。大家应该都玩过超级玛丽,超级玛丽在前进过程中会遇到各种不同的怪兽和陷阱,一不小心就会被吃掉或掉进陷阱,厉害的玩家可以持续玩很长一段时间而不会挂掉,直到打通关。从开始到挂掉或通关这段时间便是一段episode。

第二个例子是历史中朝代更迭。历史中的很多朝代都想尽可能长的存续下来。然而,社会环境、自然环境都处于不断变化,很难通过某种单一策略保持永固。历史车轮滚滚向前,时代潮流浩浩荡荡,只有不断调整策略适应环境,才能上时代步伐,与时俱进。每轮更迭,便可视为一段episode。

第三个例子是探寻宝藏。对于一些特定寻宝或解谜任务,智能体并不追求在更长时间内存活下来,而是找到某个宝藏或解决某个问题,这种便要求在更短时间内完成越好。每次从开始到找到宝藏或是失败,都可以视为一段episode。

《黑客帝国》里有个名句“Everything that has a begin has an end.”翻译成中文便是“世间万物有始皆有终”,一段episode即有始有终。

2. 策略梯度模型推导

采用数学方式描述上述过程:

假设在一个episode中,智能体与环境交互所产生的状态信息和行为形成一个集合,称为迹。

τ = { s 1 , a 1 , s 2 , a 2 , . . . , s T n , a T n } \tau = \{ s_{1},a_{1},s_{2},a_{2},...,s_{T_{n}},a_{T_{n}}\} τ={s1​,a1​,s2​,a2​,...,sTn​​,aTn​​}

对于某个迹而言,其发生的可能性可以表示为一系列条件概率的乘积。

P θ ( τ ) = P ( s 1 ) P θ ( a 1 ∣ s 1 ) P ( s 2 ∣ s 1 , a 1 ) P θ ( a 2 ∣ s 2 ) P ( s 3 ∣ s 2 , a 2 ) . . . P_{\theta}(\tau) = P(s_{1})P_{\theta}(a_{1}|s_{1})P(s_{2}|s_{1},a_{1})P_{\theta}(a_{2}|s_{2})P(s_{3}|s_{2},a_{2})... Pθ​(τ)=P(s1​)Pθ​(a1​∣s1​)P(s2​∣s1​,a1​)Pθ​(a2​∣s2​)P(s3​∣s2​,a2​)...

其中,θ是智能体决策参数,可以当做智能体自己的神经网络中的权重。

P ( s 1 ) P(s_{1}) P(s1​)表示环境产生第一个状态的概率。 P θ ( a 1 ∣ s 1 ) P_{\theta}(a_{1}|s_{1}) Pθ​(a1​∣s1​)表示智能体根据环境的第一个状态做出自己的行动,它可以看成是一个条件概率,其条件为环境的第一个状态。 P ( s 2 ∣ s 1 , a 1 ) P(s_{2}|s_{1},a_{1}) P(s2​∣s1​,a1​)表示环境产生第二个状态的条件概率,条件是环境的第一个状态和智能体的做出的行动。

用连乘符号,上面这个式子可以表示为:

P θ ( τ ) = P ( s 1 ) ∏ t = 1 T n P θ ( a t ∣ s t ) P ( s t + 1 ∣ s t , a t ) P_{\theta}(\tau) = P(s_{1})\prod_{t=1}^{T_{n}}P_{\theta}(a_{t}|s_{t})P(s_{t+1}|s_{t},a_{t}) Pθ​(τ)=P(s1​)∏t=1Tn​​Pθ​(at​∣st​)P(st+1​∣st​,at​)

对于某智能体而言,在多个episode中,得到的迹可能是不同的。因此,训练智能体的最终目标是要最大化在各个迹上的期望奖励。

R ˉ θ = ∑ τ R ( τ ) P θ ( τ ) \bar{R}_{\theta} = \sum_{\tau}R(\tau)P_{\theta}(\tau) Rˉθ​=∑τ​R(τ)Pθ​(τ)

又可以表示为:

R ˉ θ = E τ ∼ P θ ( τ ) [ R ( τ ) ] \bar{R}_{\theta} = E_{\tau\sim P_{\theta}(\tau)}[R(\tau)] Rˉθ​=Eτ∼Pθ​(τ)​[R(τ)]

为了获得最大化的期望奖励,我们可以对上式进行求梯度。在实操的时候,损失函数取最大化函数的负函数:

▽ R ˉ θ = ∑ τ R ( τ ) ▽ P θ ( τ ) = ∑ τ R ( τ ) P θ ( τ ) ▽ l o g P θ ( τ ) \triangledown \bar{R}_{\theta}=\sum_{\tau}R(\tau)\triangledown P_{\theta}(\tau)=\sum_{\tau}R(\tau) P_{\theta}(\tau) \triangledown log P_{\theta}(\tau) ▽Rˉθ​=∑τ​R(τ)▽Pθ​(τ)=∑τ​R(τ)Pθ​(τ)▽logPθ​(τ)

上式也可以表示为期望形态:

R ˉ θ = E τ ∼ P θ ( τ ) [ R ( τ ) ▽ l o g P θ ( τ ) ] \bar{R}_{\theta} = E_{\tau\sim P_{\theta}(\tau)}[R(\tau) \triangledown log P_{\theta}(\tau)] Rˉθ​=Eτ∼Pθ​(τ)​[R(τ)▽logPθ​(τ)]

表示成为期望形态后,就意味着可以采用抽样的方法,从分布 P θ ( τ ) P_{\theta}(\tau) Pθ​(τ)中抽取N个样本,然后求平均,便可以近似地表示期望。

R ˉ θ ≈ 1 N ∑ n = 1 N [ R ( τ n ) ▽ l o g P θ ( τ n ) ] \bar{R}_{\theta} \approx \frac{1}{N} \sum_{n=1}^{N} [R(\tau^{n}) \triangledown log P_{\theta}(\tau^{n})] Rˉθ​≈N1​∑n=1N​[R(τn)▽logPθ​(τn)]

再展开 ▽ l o g P θ ( τ ) \triangledown log P_{\theta}(\tau) ▽logPθ​(τ),得到:

▽ l o g P θ ( τ ) = ∑ τ = 1 T n ▽ l o g P θ ( a t n ∣ s t n ) \triangledown log P_{\theta}(\tau)=\sum_{\tau =1}^{T_{n}} \triangledown log P_{\theta}(a_{t}^{n}|s_{t}^{n}) ▽logPθ​(τ)=∑τ=1Tn​​▽logPθ​(atn​∣stn​)

求得智能体的策略梯度为:

R ˉ θ ≈ 1 N ∑ n = 1 N ∑ t = 1 T n [ R ( τ n ) ▽ l o g P θ ( a t n ∣ s t n ) ] \bar{R}_{\theta} \approx \frac{1}{N} \sum_{n=1}^{N} \sum_{t=1}^{T_{n}} [R(\tau^{n}) \triangledown log P_{\theta}(a_{t}^{n}|s_{t}^{n})] Rˉθ​≈N1​∑n=1N​∑t=1Tn​​[R(τn)▽logPθ​(atn​∣stn​)]

每次计算完梯度后,采用下式便可以更新智能体的决策参数 θ \theta θ(即神经网络中的权重)。

θ ← θ + η ▽ R ˉ θ \theta \leftarrow \theta + \eta \triangledown \bar{R}_{\theta} θ←θ+η▽Rˉθ​

其中, η \eta η为学习率。

以上即为基础的策略梯度算法。为提升学习效果和效率,可以选择做以下改进。

一是增加基线baseline。基线可以有很多种,比如可以是奖励的期望值等。

R ˉ θ ≈ 1 N ∑ n = 1 N ∑ t = 1 T n [ ( R ( τ n ) − b a s e l i n e ) ▽ l o g P θ ( a t n ∣ s t n ) ] \bar{R}_{\theta} \approx \frac{1}{N} \sum_{n=1}^{N} \sum_{t=1}^{T_{n}} [(R(\tau^{n})-baseline) \triangledown log P_{\theta}(a_{t}^{n}|s_{t}^{n})] Rˉθ​≈N1​∑n=1N​∑t=1Tn​​[(R(τn)−baseline)▽logPθ​(atn​∣stn​)]

二是用当前时刻至episode结束的奖励之和,作为当前智能体行为的奖励。举例说明,假设[2,3,4,6]是智能体在第n个episode中迹的片段(到episode结束),该片段是按产生时刻先后进行排序,分别对应于时刻[t1, t2, t3, t4],智能体的行为[a1, a2, a3, a4]。那么t1时刻的智能体产生行为a1的奖励为2+3+4+6=15,t2时刻的智能体产生行为a2的奖励为3+4+6=13,t3时间的智能体产生行为a3的奖励为4+6=10,t4时间的智能体产生行为a4的奖励为6。

R ˉ θ ≈ 1 N ∑ n = 1 N ∑ t = 1 T n [ ( ∑ t ′ = t T n r t ′ n − b a s e l i n e ) ▽ l o g P θ ( a t n ∣ s t n ) ] \bar{R}_{\theta} \approx \frac{1}{N} \sum_{n=1}^{N} \sum_{t=1}^{T_{n}} [(\sum_{t'=t}^{T_{n}}r_{t'}^{n}-baseline) \triangledown log P_{\theta}(a_{t}^{n}|s_{t}^{n})] Rˉθ​≈N1​∑n=1N​∑t=1Tn​​[(∑t′=tTn​​rt′n​−baseline)▽logPθ​(atn​∣stn​)]

三是对奖励按时间进行折扣。还是举上段的例子,假设折扣率为0.9,t1时刻的智能体产生行为a1的奖励为2+3×0.9+4×0.9×0.9+6×0.9×0.9×0.9=9.4。

R ˉ θ ≈ 1 N ∑ n = 1 N ∑ t = 1 T n [ ( ∑ t ′ = t T n g a m m a t ′ − t r t ′ n − b a s e l i n e ) ▽ l o g P θ ( a t n ∣ s t n ) ] \bar{R}_{\theta} \approx \frac{1}{N} \sum_{n=1}^{N} \sum_{t=1}^{T_{n}} [(\sum_{t'=t}^{T_{n}}gamma^{t'-t}r_{t'}^{n}-baseline) \triangledown log P_{\theta}(a_{t}^{n}|s_{t}^{n})] Rˉθ​≈N1​∑n=1N​∑t=1Tn​​[(∑t′=tTn​​gammat′−trt′n​−baseline)▽logPθ​(atn​∣stn​)]

其中,gamma是折扣因子(取值范围0至1之间)。

3. 平衡杆环境(gym)

平衡杆环境中,杆子的一头连接在小车上(连接处可以转动),小车可沿着无摩擦的轨道移动,随机给定杆子的初始状态,智能体可以通过向左或向右移动小车,来防止杆子倒下。小车的移动速度方向和大小,取决于杆子的角度和杆子顶端的速度。杆子重心的偏离程度越大,恢复平衡所需要的能量也就越高。举个生活中类似的例子,手上竖立一根棍子,要保证棍子不倒下,人需要根据棍子倾斜的角度和速度,来控制手的移动方向和力度大小。

平衡杆环境的观测空间(连续值)

编号 物理含义 取值范围
1 小车所处的位置 -4.8至4.8
2 小车的速度 -inf至inf
3 杆子的角度 -24度至24度
4 杆子顶端的速度 -inf至inf

智能体的行动空间(离散值)

含义
0 向左移动小车
1 向右移动小车

4. 应用策略梯度模型训练平衡杆智能体

应用PaddlePaddle2.0,构建一个应用策略

import os
from itertools import count
import gym
import paddle
import paddle.nn.functional as F
from paddle.distribution import Categoricalclass PolicyAgent(paddle.nn.Layer):def __init__(self, obs_space, action_space):#初始化super(PolicyAgent, self).__init__()#设样本批量数为batch,输入形状大小为[batch, obs_space],输出形状大小为[batch, 16]self.linear1 = paddle.nn.Linear(obs_space, 16)#输入形状大小为[batch, 16],输出形状大小为[batch, action_space]self.linear2 = paddle.nn.Linear(16, action_space)#log_probs列表用来保存历次行为的概率self.log_probs = []#rewards列表用来保存智能体每次与环境交互所产生的回报self.rewards = []def forward(self, x):#前向传播过程#把输入x转化为tensor格式数据,并转成浮点数。x = paddle.to_tensor(x, dtype="float32")#输入x经过linear1网络层运算,再接上relu激活函数x = F.relu(self.linear1(x))#再经过linear2网络层运算,然后在最后一个维度上接softmax函数action_probs = F.softmax(self.linear2(x), axis=-1)#把上述的行动概率,转成分类分布action_distribution = Categorical(action_probs)#从分类分布中进行抽样action = action_distribution.sample([1])#根据上述抽样的结果,求解该抽样结果的概率,对概率进行log运算#每次得到的结果,追加到log_probs列表之中self.log_probs.append(action_distribution.log_prob(action))#返回行动值return action.numpy().item()def loss_calculate(self, gamma):#损失函数rewards = []dis_reward = 0log_probs = self.log_probsfor reward in self.rewards[::-1]: #把rewards倒序排列#计算折扣回报率dis_reward = reward + gamma * dis_reward#每次从0位置插入,后进来的数排在前面。rewards.insert(0, dis_reward)#把rewards转化为tensor,并对rewards进行标准化rewards = paddle.to_tensor(rewards)rewards = (rewards - rewards.mean()) / (rewards.std())loss = 0for logprob, reward in zip(log_probs, rewards):#参考算法推导部分action_loss = -logprob * rewardloss += action_lossreturn lossdef clear_memory(self):#清除智能体记忆的函数del self.rewards[:]del self.log_probs[:]def train():#创建平衡杆cartpole环境env = gym.make('CartPole-v1')env = env.unwrappedenv.seed(1)paddle.seed(1)obs_space = env.observation_space.shape[0] #状态空间,数值为4action_space = env.action_space.n #行动空间,数值为2#设置超参数gamma = 0.9 #折扣率episodes = 500 #设定episodes轮数,即让智能体一共玩多少回游戏#模型初始化model = PolicyAgent(obs_space, action_space)#优化器初始化optimizer = paddle.optimizer.Adam(learning_rate=0.02, parameters=model.parameters())#开始训练duration = [] #记录每轮eposide所持续的时间for i in range(episodes):state = env.reset() #state的类型是ndarrayfor t in count():#一直不断地循环action = model(state)#输入状态,输出智能体选择的行动#环境会根据智能体的动作,输出下一个状态、回报、完成等信息state, reward, done, info = env.step(action)model.rewards.append(reward)if done or t >= 100: #episode终止或玩游戏持续次数超过100break #跳出本局循环duration.append(t) #把本局的持续时间t,追加到持久期里面if i % 250 == 0:#每过250次保存模型paddle.save(model.state_dict(), './lup/'+str(i)+'.pdparams')#清零梯度optimizer.clear_grad()#生成损失函数loss = model.loss_calculate(gamma)#对损失函数求梯度,反向传播loss.backward()#优化器用反向传播计算出来的梯度,对参数进行更新optimizer.step()#清空智能体记忆model.clear_memory()return duration#训练智能体
if __name__ == '__main__':duration = train()
#打印出结果,看智能体在玩平衡杆游戏中所能持续的时间
import matplotlib.pyplot as pltplt.plot(duration)
plt.show()


想运行代码,可以点击进入AI studio项目:

基于PaddlePaddle2.0-构建策略梯度模型

策略梯度模型 (Policy Gradient)原理与实现相关推荐

  1. 强化学习(三)—— 策略学习(Policy-Based)及策略梯度(Policy Gradient)

    强化学习(三)-- 策略学习(Policy-Based)及策略梯度(Policy Gradient) 1. 策略学习 2. 策略梯度 3. 案例 1. 策略学习 Policy Network 通过策略 ...

  2. 【强化学习笔记】策略梯度(Policy Gradient)

    文章目录 1.基本元素 2.游戏示例 3.基本概念 3.1.回合(episode) 3.2.总奖励(Total Reward) 3.3.轨迹(Trajectory) 3.4.奖励期望(Expected ...

  3. 【7】强化学习之策略梯度(Policy Gradient)

    [李宏毅]强化学习笔记(一) 什么是强化学习 监督学习 VS. 强化学习 AlphaGo Chat-bot Outline 1. Policy-based Approach:Learning an A ...

  4. 【强化学习】Policy Gradient原理

    1.Policy Gradient和DQN系列强化算法最大的区别在于: DQN系列基于Value,也就是说执行完所有的动作并保存所得到的价值,根据这些价值计算出最优价值函数,并以此选择动作,最终获得一 ...

  5. 强化学习(Reinforcement Learning)之策略梯度(Policy Gradient)的一点点理解以及代码的对应解释

    一.策略梯度算法推导以及解释 1.1 背景 设πθ(s)\pi_{\theta }(s)πθ​(s)是一个有网络参数θ\thetaθ的actor,然后我们让这个actor和环境(environment ...

  6. triplet loss后面不收敛_Policy Gradient——一种不以loss来反向传播的策略梯度方法...

    目录 1.前言 2.核心算法 3.Add a Baseline 4.总结 1.前言 这次介绍的基于策略梯度的Policy Gradient的算法属实比之前的算法没那么好理解,笔者看完莫烦教程之后还是有 ...

  7. 不等式视角下的策略梯度算法

    本文首发于:行者AI 强化学习(Reinforcement Learning,RL),也叫增强学习,是指一类从(与环境)交互中不断学习的问题以及解决这类问题的方法.强化学习问题可以描述为一个智能体从与 ...

  8. 殊途同归的策略梯度与零阶优化

    ©PaperWeekly 原创 · 作者|苏剑林 单位|追一科技 研究方向|NLP.神经网络 深度学习如此成功的一个巨大原因就是基于梯度的优化算法(SGD.Adam 等)能有效地求解大多数神经网络模型 ...

  9. 强化学习笔记:连续控制 确定策略梯度DPG

    1 离散控制与连续控制 之前的无论是DQN,Q-learning,A2C,REINFORCEMENT,SARSA什么的,都是针对离散动作空间,不能直接解决连续控制问题. 考虑这样一个问题:我们需要控制 ...

最新文章

  1. 美团_cc城市自定义
  2. PAT甲级1154 Vertex Coloring :[C++题解]图论、模拟、结构体存边
  3. 嘿,运维!你与VXLAN有场约会……
  4. 密码学电子书_密码学中的电子密码书(ECB)
  5. ECSHOP隐藏帮助中心文章页的评论功能方法
  6. 学java的就业方向_学习Java的就业前景怎么样
  7. java.io.IOException: 你的主机中的软件中止了一个已建立的连接。
  8. 显示服务器运行时间,查看服务器运行时间
  9. Win10之fastboot devices无反应
  10. 网站获取ip代码怎么写_大学生写论文必备技能:怎么免费获取外文文献并下载...
  11. 【报错】table burner has no column named USER (code 1): , while compiling: INSERT INTO burner(USER,YELL
  12. mysql自增字段AUTO_INCREMENT重排或归零
  13. python计算均线斜率_一根20日均线闯天下——量化回测“压箱底指标”,值得读十遍!...
  14. 总体均值的区间估计和习题
  15. mysql查询区分英文大小写_Mysql查询英文如何严格区分大小写?
  16. 嵌入式软件开发下的数据积累
  17. HTML5微案例讲解系列视频课程-杨千锋-专题视频课程
  18. 迅雷9屏蔽所有游览器和网站相应
  19. HTML5页面元素figure与figcaption标记的应用
  20. java解决 No enclosing instance of type XXX is accessible的问题

热门文章

  1. Java学习笔记: Tomcat基础配置
  2. R型变压器220v和110v电压有什么不同的用途?
  3. WPF的资源Resource
  4. 【UE4 C++】播放声音、特效
  5. 云贝餐饮连锁V2 v2.5.7外卖/店内/预定/排号 餐饮外卖扫码点餐 智慧新零售
  6. spyder pyecharts不显示_摄影修图好帮手 明基 SW2700PT显示器体验评测
  7. 线性表顺序存储完整代码
  8. XtraBackup/innobackupex 远程备份MySQL
  9. 初探AFL-Fuzz
  10. 达人评测 i9 13900H 和i7 12700h差多少 酷睿i913900H 和i712700h对比