强化学习研究 PG

由于一些原因, 需要学习一下强化学习。用这篇博客来学习吧,

用的资料是李宏毅老师的强化学习课程。 

深度强化学习(DRL)-李宏毅1-8课(全)_哔哩哔哩_bilibili

这篇文章的目的是看懂公式, 毕竟这是我的弱中弱。 

强化学习一般就是 环境, 动作网络, 奖励三者的纠缠,

动作网络看到环境, 产生一个动作, 然后得到一个奖励。 然后我们通过这个奖励来更新动作。 

不同的方法有不同的思想, 我们来看看PG和PPO。 

PG是这样的思想。 

有一个policy网络 \pi ,就是actor。 输入是环境, 输出是策略。 

他会输出各个动作的几率, 然后可以根据这些几率采样一个动作。, 

  经过连续的一轮 也就是一个episode 就完成了一场游戏的采集。 

将奖励加起来, 就是大R

我们的目标是让大R变得越大越好。 

这是actor按照某个路线的概率。

 最后的组合概率。 也就是得到某一个结果的概率。 

当然这条路线也会对应一个大R。  

 当然 对于同一个actor, 我们会进行很多个episode。 这样的话得到不同的路线\tau

 对应不同的奖励R(\tau) 乘加起来就是当前的actor 平均能得到的奖励了, 也就能评价当前actor的好坏。 

 右边这种写法也是可以, \tau  服从pxita这样的分布, 然后每个对应一个R, 得到一个期望,我们更新模型的目的就是让这个平均的R越大越好。

 所以求R对参数的梯度,这里的R(\tau)不需要可微

由于右边只有p_ \theta与参数相关, 因此转化为对p_ \theta 的微分

 

 上下同乘p_ \theta\tau

 

 变为这个。 因为对log求导 后面那一项。 

转为分布形式。  

 然后通过采样来模拟分布。 

 带入上面的p_ \theta\tau)公式, 乘法就转为加法了。 

 直观理解, 前面的R为正, 则增加后面这个S到A映射的几率, 通过更新模型参数。 

通过这两个式子, 我们就可以更新模型了。 问题是 第二个式子后面那一堆是从哪里来的呢? 

事实上就是通过actor和环境互动得来的。 我们一直玩actor,得到很多个结果。 

actor的操作一般是从softmax里采样出来的。 

然后求softmax结果对参数的梯度, 然后乘上奖励就可以了。 

我们会发现 这个R(\tau)  是对一个episode里所有sample的动作都起作用,

也就是说, 只要这一轮游戏的奖励是好的, 在这场游戏里所有做过的动作都会增加概率。 

 所以加上时间t, 只计算动作后面的奖励分数。 

 然后乘上一个discount。 discount 预示了一个动作的有效时间, 比如, discount很大的时候, 一个动作可以考虑未来很多步的收益。

把现在的这个R-b  写作一个优势函数 A , 他是与模型\theta相关的。 

现在学了理论知识, 我们要实战通过代码来学习一下了。、 

李宏毅HW12

首先是李宏毅老师的HW12。 助教放的代码, 我猜测是PG方法, 我们看下。 

声明了一个网络,来产生策略。 输入是8维向量, 因为环境给出的接口是8维向量。

输出是4维向量, 因为可能的操作有4种。 可以看到最后还经过了softmax。 

 agent是模型的代理, 里面定义了模型的训练,保存等功能。 

理论运行五轮游戏, 也就是五个episode。 

等下看看这俩。  

环境重置, 然后步数也都重置。 

 

 对于当前的环境state, sample一个动作。 

 

 action_prob是四个动作的几率。 

 categorical : 按类别赋值。  这里按照概率赋值, 之后就可以按概率来采样。 

采样到了动作1. 

 

 这里的log_Prob是对action的概率取对数, 以e为底。

因为action1的概率为0.2368 因此取对数prob为-1.4404

 把这一步输入进环境, 得到下一个环境的状态, 这一步的奖励, 和是否为最后一个动作。

 这个注释已经解释了, 我们就是这样得到了每一对动作的概率值的对数。 

 

会记录每一步的reward 和 每一个eposide的reward和, 还会记录最后一步的reward。 

对最后一步的reward和总rewarrd求平均。  

 将每一步的reward 归一化。 

 传入那个操作的概率对数和每一步的奖励, 更新模型。 我们看看。 

 因为loss要向小优化, 所以这里前面加了负号。 最后求和。

 更新模型, 回传梯度。 

这里可以看出 和公式是一模一样的。 

我们参考的第二个代码来自于蘑菇书。 这本书一样 

 在sample 也是从分布中采样, 上面用的是softmax, 这里是伯努利。

        state_pool, action_pool, reward_pool = self.memory.sample()state_pool, action_pool, reward_pool = list(state_pool), list(action_pool), list(reward_pool)# Discount rewardrunning_add = 0for i in reversed(range(len(reward_pool))):if reward_pool[i] == 0:running_add = 0else:running_add = running_add * self.gamma + reward_pool[i]reward_pool[i] = running_add# Normalize rewardreward_mean = np.mean(reward_pool)reward_std = np.std(reward_pool)for i in range(len(reward_pool)):reward_pool[i] = (reward_pool[i] - reward_mean) / reward_std# Gradient Desentself.optimizer.zero_grad()for i in range(len(reward_pool)):state = state_pool[i]action = Variable(torch.FloatTensor([action_pool[i]]))reward = reward_pool[i]state = Variable(torch.from_numpy(state).float())probs = self.policy_net(state)m = Bernoulli(probs)loss = -m.log_prob(action) * reward  # Negtive score function x reward# print(loss)loss.backward()self.optimizer.step()self.memory.clear()

这事更新模型的代码。 

第一步, 先采样一组action结果。应该是一个\tau 的一组结果(一个episode)

这里是乘以那个时间参数γ。 从后往前乘, 越向后乘的越多。  

归一化。

 

和上面一样, 也是对action的概率取对数, 乘以reward。  但是伯努利的sample 的action是两个值。 不知道为什么。 

不管怎么样, 我们大概知道PG的做法了。 就是算出来各个操作的概率, 然后放在一个分布里sample。 然后要对sample出来的操作的概率取对数 然后乘上它的奖励。 乘以一个负号, 最小化它。

代码在这里 : 

https://github.com/datawhalechina/easy-rl/blob/master/notebooks/PolicyGradient.ipynb

https://colab.research.google.com/github/ga642381/ML2021-Spring/blob/main/HW12/HW12_ZH.ipynb#scrollTo=bIbp82sljvAt

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/59208.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【SpringBoot框架篇】33.优雅集成i18n实现国际化信息返回

文章目录 1.简介2.MessageSource配置和工具类封装2.1.配置MessageSource相关配置2.2.配置工具类2.3.测试返回国际级文本信息 3.不优雅的web调用示例(看看就行,别用)4.优雅使用示例4.1.错误响应消息枚举类4.2.ThreadLocal工具类配置4.2.1.ThreadLocal工具类数据封装4…

git原理与使用

目录 引入基本操作分支管理远程操作标签管理 引入 假设你的老板要你设计一个文档,当你设计好了,拿给他看时,他并不是很满意,就要你拿回去修改,你修改完后,再给他看时,他还是不满意,…

python爬虫相关

目录 初识爬虫 爬虫分类 网络爬虫原理 爬虫基本工作流程 搜索引擎获取新网站的url robots.txt HTHP协议 Resquests模块 前言: 安装 普通请求 会话请求 response的常用方法 简单案例 aiohttp模块 使用前安装模块 具体案例 数据解析 re解析 bs4…

每次执行@Test方法前都执行一次DB初始化(SpringBoot Test + JUnit5环境)

引言 在执行单元测试时,可以使用诸如H2内存数据库替代线上的Mysql数据库等,如此在执行单元测试时就能尽可能模拟真实环境的SQL执行,同时也无需依赖线上数据库,增加了测试用例执行环境的可移植性。而使用H2数据库时,通…

C#程序的启动显示方案(无窗口进程发送消息) - 开源研究系列文章

今天继续研究C#的WinForm的实例显示效果。 我们上次介绍了Winform窗体的唯一实例运行代码(见博文:基于C#的应用程序单例唯一运行的完美解决方案 - 开源研究系列文章 )。这就有一个问题,程序已经打开了,这时候再次运行该应用程序,…

16 Springboot——登录功能实现

16.1 修改index.html中表单跳转的地址 将action的地址改为user/login&#xff0c;意思是点击提交按钮后&#xff0c;就会跳转到user/login地址&#xff0c;然后只要用Controller类的RequsetMapping去接这个地址就行了。 <body class"text-center"><form cl…

Spring 是如何解决循环依赖问题的?

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 例如&#xff1a;项目场景&#xff1a;示例:通过蓝牙芯片(HC-05)与手机 APP 通信&#xff0c;每隔 5s 传输一批传感器数据(不是很大) 问题描述 我们都知道&#xff0c;如果在代码中&#xff0c;将两个…

记录一次因为代码混淆导致的安卓app崩溃的事件

最近公司布置了一个新任务&#xff0c;给一个旧的安卓app增加一个新功能。 功能是替换加密算法&#xff0c;新的算法库由第三法提供&#xff0c;通过jni调用底层C库。 按照项目需求&#xff0c;修改了代码&#xff0c;调试测试阶段也都运行正常。结果发布的时候&#xff0c;测…

视频网站如何选择国外服务器?

​ 视频网站如何选择国外服务器? 地理位置&#xff1a;选择靠近目标用户群体的国外服务器位置是至关重要的。若用户主要集中在中国以外的地区&#xff0c;因您应选择位于用户所在地附近的服务商&#xff0c;以确保视频的传输速度。 带宽和速度&#xff1a;选择带宽足够且方便升…

【论文阅读】对抗溯源图主机入侵检测系统的模仿攻击(NDSS-2023)

作者&#xff1a;伊利诺伊大学芝加哥分校-Akul Goyal、Gang Wang、Adam Bates&#xff1b;维克森林大学-Xueyuan Han、 引用&#xff1a;Goyal A, Han X, Wang G, et al. Sometimes, You Aren’t What You Do: Mimicry Attacks against Provenance Graph Host Intrusion Detect…

基于kubeadm部署K8S集群

目录 基于kubeadm部署K8S集群 一、环境准备 1、主机初始化配置 2、配置主机名并绑定hosts&#xff0c;不同主机名称不同 3、主机配置初始化 二、部署docker环境 1、三台主机上分别部署 Docker 环境 2、镜像加速器&#xff08;所有主机配置&#xff09; 三、部署kubern…

Maven基础总结

前言 Maven 是一个项目管理工具&#xff0c;可以对 Java 项目进行构建、依赖管理。 基本要求掌握 配置Maven环境直接查。 得会在IDEA创建Maven的java项目吧、会创建Maven的web项目吧、会创建多模块项目吧。 得会配置插件pligin、依赖dependency吧 一、Maven四大特性 1、…