强化学习研究 PG

news2024/11/26 0:48:14

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

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

深度强化学习(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很大的时候, 一个动作可以考虑非常多的步的奖励。 

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

李宏毅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 reward
        running_add = 0
        for i in reversed(range(len(reward_pool))):
            if reward_pool[i] == 0:
                running_add = 0
            else:
                running_add = running_add * self.gamma + reward_pool[i]
                reward_pool[i] = running_add

        # Normalize reward
        reward_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 Desent
        self.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.coloradmin.cn/o/848138.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

想要实现高效数据复制?Paxos并不总是最佳选择!

数据复制典型的算法就是Paxo和Raft。 1 分片元数据的存储 分布式存储系统中,收到客户端请求后,承担路由功能的节点: 先访问分片元数据(简称元数据),确定分片对应节点然后才访问真正数据 元数据&#xf…

PoseiSwap 开启“Poseidon”池,治理体系或将全面开启

PoseiSwap曾在前不久分别以IDO、IEO的方式推出了POSE通证,但PoseiSwap DEX中并未向除Zepoch节点外的角色开放POSE资产的交易。而在前不久,PoseiSwap推出了全新的“Poseidon”池,该池将向所有用户开放,并允许用户自由的进行质押、交…

Python机器学习实战-建立随机森林模型预测肾脏疾病(附源码和实现效果)

实现功能 建立随机森林模型预测肾脏疾病 实现代码 import pandas as pd import warnings warnings.filterwarnings("ignore") pd.set_option(display.max_columns, 26)#读取数据 df pd.read_csv("E:\数据杂坛\datasets\kidney_disease.csv") dfpd.Data…

计算机组成原理-笔记-第二章

二、第二章——数据的表示和运算 1、进位制度(二进制、十进制) 2、BCD码(余三码、2421码) 编码方式 功能 好处 弊处 BCD码 将每个十进制数码转换为4位二进制码 精度高,适合直接用于数码管或LED等显示设备 编码…

docker 安装hive

记录一下使用docker快速搭建部署hive环境 目录 写在前面 步骤 安装docker 安装docker安装docker-compose配置docker国内镜像源(可选) 安装git & 配置github部署Hive docker-hive开始部署 使用Hive命令行收尾工作 安装vi、lrzsz关闭相关命令 END…

解锁Java迭代器:优雅遍历集合元素的秘密武器

解锁Java迭代器:优雅遍历集合元素的秘密武器 你是否曾想过,在Java的编程世界中,有没有一种方法可以优雅地遍历集合中的元素,而不需要关心底层实现?答案是肯定的,那就是——迭代器(Iterator&…

使用vite创建Vue/React前端项目,配置@别名和Sass样式,又快又方便

Vite官方网站:Vite | 下一代的前端工具链 Vite 并不是基于 Webpack 的,它有自己的开发服务器,利用浏览器中的原生 ES 模块。这种架构使得 Vite 比 Webpack 的开发服务器快了好几个数量级。Vite 采用 Rollup 进行构建,速度也更快…

【前端|CSS】5种经典布局

页面布局是样式开发的第一步,也是 CSS 最重要的功能之一。 常用的页面布局,其实就那么几个。下面我会介绍5个经典布局,只要掌握了它们,就能应对绝大多数常规页面。 这几个布局都是自适应的,自动适配桌面设备和移动设备…

【BASH】回顾与知识点梳理(十五)

【BASH】回顾与知识点梳理 十五 十五. 指令与文件的搜寻15.1 脚本文件名的搜寻which (寻找『执行档』) 15.2 文件档名的搜寻whereis (由一些特定的目录中寻找文件文件名)locate / updatedbfind与时间有关的选项与使用者或组名有关的参数与文件权限及名称有关的参数额外可进行的…

h5端获取定位

第三方api有腾讯、高德、百度&#xff0c;下面简述腾讯位置api 引入jweixin.js <script> // 方法一 把js文件放到自己服务器上 import wx from /static/jweixin-1.6.0.js;// 方法二 vue在生命周期中应用 mounted() {const oScript document.createElement("scrip…

TechTool Pro for mac(硬件监测和系统维护工具)

TechTool Pro 是为 Mac OS X 重新设计的全新工具程序&#xff0c;不但保留旧版原有的硬件侦测功能&#xff0c;还可检查系统上其他重要功能&#xff0c;如&#xff1a;网络连接&#xff0c;区域网络等。 TechTool Pro for mac随时监控和保护您的电脑&#xff0c;并可预设定期检…

C++入门(小白篇1)

前言&#xff1a; 最近想学一下一下C看了一些博客内容写的倒是很充实&#xff0c;但是&#xff0c;细节不到位&#xff0c;我是有Python基础的&#xff0c;所以学习来蛮快的&#xff0c;但是对于小白的话&#xff0c;有好多小细节大多数博客还是不够详细&#xff0c;由此我想写…

在golang中引入私有git仓库的pkg包?引入私有Git仓库的包:在Go语言项目中轻松实现

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to Golang Language.✨✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1…

CAD绘制法兰、添加光源、材质并渲染

首先绘制两个圆柱体&#xff0c;相互嵌套 在顶部继续绘制圆柱体&#xff0c;这是之后要挖掉的部分 在中央位置绘制正方形 用圆角工具&#xff1a; 将矩形的四个角分别处理&#xff0c;效果&#xff1a; 用拉伸工具 向上拉伸到和之前绘制的圆柱体高度齐平 绘制一个圆柱体&#…

性能优化必知必会

系统性能调优 分为四个层次 基础设施网络编解码分布式系统性能整体提升 一&#xff1a;基础设施优化 从提升单机进程的性能入手&#xff0c;包括高效的使用主机的CPU、内存、磁盘等硬件&#xff0c;通过提高并发编程提升吞吐量&#xff0c;根据业务特性选择合适的算法 01 …

将http协议升级为https协议——域名平台部分的设置

为远程群晖NAS的自定义域名免费申请SSL证书 文章目录 为远程群晖NAS的自定义域名免费申请SSL证书前言1. 向域名平台申请SSL证书1.1 购买“免费证书” 2. 进一步进行创建证书设置2.1 对证书的关联域名进行补充 3. 云解析DNS3.1 进行验证信息 前言 我们可以成功地将自己购买的域…

数据结构之时间复杂度-空间复杂度

大家好&#xff0c;我是深鱼~ 目录 1.数据结构前言 1.1什么是数据结构 1.2什么是算法 1.3数据结构和算法的重要性 1.4如何学好数据结构和算法 2.算法的效率 3.时间复杂度 3.1时间复杂度的概念 3.2大O的渐进表示法 【实例1】&#xff1a;双重循环的时间复杂度&#xf…

uView日历控件(u-calendar)优化

1 问题 u-calendar日历控件存在的问题&#xff1a; 不能设置默认选中值&#xff0c;打开弹窗选择起始日期&#xff0c;然后点击取消按钮或蒙版关闭弹窗时&#xff0c;日历弹窗中的选中值发生改变&#xff08;再次打开日历弹窗时&#xff0c;就可以看到选中值的错误&#xff09…

IMV8.0

一、背景内容 经历了多个版本&#xff0c;基础内容在前面&#xff0c;可以使用之前的基础环境&#xff1a; v1&#xff1a; https://blog.csdn.net/wtt234/article/details/132139454 v2&#xff1a; https://blog.csdn.net/wtt234/article/details/132144907 v3&#xff1a; h…

选择软件检测机构时的注意事项,获取软件测试报告的费用为多少?

随着信息科技的发展&#xff0c;我们的生活和工作也越来越离不开软件产品的使用。软件企业要想在行业崭露头角&#xff0c;软件质量是重中之重。因此很多软件企业为了更好的保障软件质量&#xff0c;会选择将该项工作交由软件检测机构进行。 一、选择软件检测机构时的注意事项…