强化学习研究 PG
由于一些原因, 需要学习一下强化学习。用这篇博客来学习吧,
用的资料是李宏毅老师的强化学习课程。
深度强化学习(DRL)-李宏毅1-8课(全)_哔哩哔哩_bilibili
这篇文章的目的是看懂公式, 毕竟这是我的弱中弱。
强化学习一般就是 环境, 动作网络, 奖励三者的纠缠,
动作网络看到环境, 产生一个动作, 然后得到一个奖励。 然后我们通过这个奖励来更新动作。
不同的方法有不同的思想, 我们来看看PG和PPO。
PG是这样的思想。
有一个policy网络 ,就是actor。 输入是环境, 输出是策略。

他会输出各个动作的几率, 然后可以根据这些几率采样一个动作。,
经过连续的一轮 也就是一个episode 就完成了一场游戏的采集。
将奖励加起来, 就是大R

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

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

最后的组合概率。 也就是得到某一个结果的概率。
当然这条路线也会对应一个大R。

当然 对于同一个actor, 我们会进行很多个episode。 这样的话得到不同的路线
对应不同的奖励R() 乘加起来就是当前的actor 平均能得到的奖励了, 也就能评价当前actor的好坏。

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

所以求R对参数的梯度,这里的R()不需要可微
由于右边只有与参数相关, 因此转化为对
的微分

上下同乘(
)

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

转为分布形式。

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

带入上面的(
)公式, 乘法就转为加法了。

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

通过这两个式子, 我们就可以更新模型了。 问题是 第二个式子后面那一堆是从哪里来的呢?
事实上就是通过actor和环境互动得来的。 我们一直玩actor,得到很多个结果。
actor的操作一般是从softmax里采样出来的。
然后求softmax结果对参数的梯度, 然后乘上奖励就可以了。
我们会发现 这个R() 是对一个episode里所有sample的动作都起作用,
也就是说, 只要这一轮游戏的奖励是好的, 在这场游戏里所有做过的动作都会增加概率。
所以加上时间t, 只计算动作后面的奖励分数。

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

把现在的这个R-b 写作一个优势函数 A , 他是与模型相关的。
现在学了理论知识, 我们要实战通过代码来学习一下了。、
李宏毅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结果。应该是一个 的一组结果(一个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
相关文章:
强化学习研究 PG
由于一些原因, 需要学习一下强化学习。用这篇博客来学习吧, 用的资料是李宏毅老师的强化学习课程。 深度强化学习(DRL)-李宏毅1-8课(全)_哔哩哔哩_bilibili 这篇文章的目的是看懂公式, 毕竟这是我的弱中弱。 强化…...
uniapp微信小程序 401时重复弹出登录弹框问题
APP.vue 登陆成功后,保存登陆信息 if (res.code 200) {uni.setStorageSync(loginResult, res)uni.setStorageSync(token, res.token);uni.setStorageSync(login,false);uni.navigateTo({url: "/pages/learning/learning"}) }退出登录 toLogout: func…...
Cloud Studio实战——热门视频Top100爬虫应用开发
最近Cloud Studio非常火,我也去试了一下,感觉真的非常方便!我就以Python爬取B站各区排名前一百的视频,并作可视化来给大家分享一下Cloud Studio!应用链接:Cloud Studio实战——B站热门视频Top100爬虫应用开…...
php 去除二维数组重复
在 PHP 中,我们常常需要对数组进行处理和操作。有时候,我们需要去除数组中的重复元素,这里介绍一种针对二维数组的去重方法。 以下是列举一些常见的方法: 方法一:使用 array_map 和 serialize 函数 array_map 函数可以…...
玩转graphQL
转载至酒仙桥的玩转graphQL - SecPulse.COM | 安全脉搏 前言 在测试中我发现了很多网站开始使用GraphQL技术,并且在测试中发现了其使用过程中存在的问题,那么,到底GraphQL是什么呢?了解了GraphQL后能帮助我们在渗透测试中发现哪些…...
神经网络super(XXX, self).__init__()的含义
学习龙良曲老师的课程,在77节有这样一段代码 import torch from torch import nnclass Lenet5(nn.Module):def __init__(self):super(Lenet5,self).__init__()那么,super(XXX, self).init()的含义是什么? Python中的super(Net, self).init()…...
45.杜芬方程解仿真解曲线(matlab程序)
1.简述 Dufing方程是一种重要的动力系统山,是反映工程物理系统中非线性现象和混沌动力学行为的极其重要的方程式。通过Duffing方程可以探讨铁磁谐振电路中的分岔、拟周期运动、子谐波振荡。而在非线性与混沌系统的研究中,Duffing方程展示了丰富的混沌动力…...
服务器数据恢复-EXT3分区误删除邮件的数据恢复案例
服务器数据恢复环境: 一台服务器有一组由8块盘组建的RAID5阵列,EXT3文件系统。 服务器故障: 由于工作人员的误操作导致文件系统中的邮件丢失。用户需要恢复丢失的邮件数据。 服务器数据恢复过程: 1、将故障服务器中所有磁盘以只…...
C 语言的逗号运算符
逗号运算符 comma operator 逗号运算符最常用在 for 循环的循环头中. 程序示例: #include<stdio.h> #define FIRST_OZ 46 #define NEXT_OZ 20int main(void) {int ounces;float cost;printf("ounces cost\n");for (ounces 1, cost FIRST_OZ…...
无人车沿着指定线路自动驾驶与远程控制的实践应用
有了前面颜色识别跟踪的基础之后,我们就可以设定颜色路径,让无人车沿着指定线路做自动驾驶了,视频:PID控制无人车自动驾驶 有了前几章的知识铺垫,就比较简单了,也是属于颜色识别的一种应用,主要…...
C++ 多态性——纯虚函数与抽象类
抽象类是一种特殊的类,它为一个类族提供统一的操作界面。抽象类是为了抽象和设计的目的而建立的。可以说,建立抽象类,就是为了通过它多态地使用其中的成员函数。抽象类处于类层次的上层,一个抽象类自身无法实例化,也就…...
小程序如何使用防抖和节流?
防抖(Debounce)和节流(Throttle)都是用来优化函数执行频率的技术,特别在处理用户输入、滚动等频繁触发的情况下,它们可以有效减少函数的执行次数,从而提升性能和用户体验。但它们的工作方式和应…...
计算机三级网络技术(持续更新)
BGP考点 A S:自治系统 BGP: Border Gateway Protocol(当前使用的版本是 BGP-4)外部网关协议 动态路由协议可以按照工作范围分为IGP以及EGP。IGP工作在同一个AS内,主要用来发现和计算路由,为AS内提供路由信息的交换&…...
Django Rest_Framework(二)
文章目录 1. http请求响应1.1. 请求与响应1.1.1 Request1.1.1.1 常用属性1).data2).query_params3)request._request 基本使用 1.1.2 Response1.1.2.1 构造方式1.1.2.2 response对象的属性1).data2).status_code3&…...
Kotlin~Visitor访问者模式
概念 将数据结构和操作分离,使操作集合可以独立于数据结构变化。 角色介绍 Visitor:抽象访问者,为对象结构每个具体元素类声明一个访问操作。Element:抽象元素,定义一个accept方法ConcreteElement:具体元…...
LVS-DR模式集群构建过程演示
一、工作原理 LVS的工作原理 1.当用户向负载均衡调度器(Director Server)发起请求,调度器将请求发往至内核空间 2.PREROUTING链首先会接收到用户请求,判断目标IP确定是本机IP,将数据包发往INPUT链 3.IPVS是工作在IN…...
UML-A 卷-知识考卷
UML-A 卷-知识考卷 UML有多少种图,请列出每种图的名字: 常用的几种UML图: 类图(Class Diagram):类图是描述类、接口、关联关系和继承关系的图形化表示。它展示了系统中各个类之间的静态结构和关系。时序…...
BpBinder与PPBinder调用过程——Android开发Binder IPC通信技术
在Android系统中,进程间通信(IPC)是一个非常重要的话题。Android系统通过Binder IPC机制实现进程间通信,而Binder IPC通信技术则是Android系统中最为重要的进程间通信技术之一。本文将介绍Binder IPC通信技术的原理,并…...
篇十五:模板方法模式:固定算法的步骤
篇十五:"模板方法模式:固定算法的步骤" 设计模式是软件开发中的重要知识,模板方法模式(Template Method Pattern)是一种行为型设计模式,用于定义一个算法的骨架,将算法中一些步骤的具…...
web-ssrf
目录 ssrf介绍 以pikachu靶场为例 curl 访问外网链接 利用file协议查看本地文件 利用dict协议扫描内网主机开放端口 file_get_content 利用file协议查看本地文件: fsockopen() 防御方式: ssrf介绍 服务器端请求伪造,是一种由攻击者构造形成…...
别再手动刷权重了!用Maya的ADV插件,30分钟搞定角色身体绑定(附减模包裹技巧)
别再手动刷权重了!用Maya的ADV插件30分钟完成角色身体绑定 角色绑定一直是三维动画制作中的痛点环节。记得刚入行时,我曾为一个穿着皮夹克的游戏角色手动刷权重整整两天,结果肘部变形依然不自然。直到接触ADV插件的减模包裹功能,…...
5分钟快速上手!免费开源字幕编辑器Subtitle Edit终极使用指南
5分钟快速上手!免费开源字幕编辑器Subtitle Edit终极使用指南 【免费下载链接】subtitleedit the subtitle editor :) 项目地址: https://gitcode.com/gh_mirrors/su/subtitleedit 你是否正在寻找一款功能强大且完全免费的字幕编辑软件?Subtitle …...
Windows Defender 移除工具:企业级安全组件深度卸载与系统优化技术指南
Windows Defender 移除工具:企业级安全组件深度卸载与系统优化技术指南 【免费下载链接】windows-defender-remover A tool which is uses to remove Windows Defender in Windows 8.x, Windows 10 (every version) and Windows 11. 项目地址: https://gitcode.co…...
AI MV 工具评测指南 2026:多模态音视频自动生成系统
AI MV 工具评测指南 2026:多模态音视频自动生成系统 适用读者:需要批量生产音乐可视化内容的自媒体创作者、社交媒体运营者、短视频内容创作者一、技术定义与核心功能 AI MV 工具是实现音频到视频自动转化的多模态生成系统。其工作原理是:输入…...
Python EXE逆向工程完全指南:使用python-exe-unpacker快速反编译打包程序
Python EXE逆向工程完全指南:使用python-exe-unpacker快速反编译打包程序 【免费下载链接】python-exe-unpacker A helper script for unpacking and decompiling EXEs compiled from python code. 项目地址: https://gitcode.com/gh_mirrors/py/python-exe-unpa…...
编译和链接+预处理
编译(compile)和链接(link)在以前我们提到过,C语言是一门编译型的计算机语言,C语言的源代码都是文本文件,文本文件本身无法运行,电脑不能执行C语言代码,计算机能够执行的…...
离子原生QAOA算法:量子优化新突破
1. 离子原生QAOA算法概述量子近似优化算法(Quantum Approximate Optimization Algorithm, QAOA)是近年来量子计算领域最具前景的算法之一,特别适用于解决组合优化问题。该算法通过交替应用问题哈密顿量和混合哈密顿量,构建参数化量…...
AssetStudio深度解析:Unity资源提取原理与跨版本兼容实践
1. 这不是个“点开即用”的工具,而是一把需要校准的Unity资源解剖刀AssetStudio这个名字听起来像某个轻量级小工具,但实际用过的人很快会意识到:它根本不是拿来就跑的“一键提取器”,而是一套需要你亲手调参、理解Unity底层序列化…...
VHS Pro深度解析:Unity中模拟真实录像机信号链的原理与实践
1. 这不是“加个滤镜”那么简单:VHS Pro 的真实定位与行业缺口你打开 Unity Asset Store,搜“vhs”,会跳出二十多个插件。有的叫 VHS Effect,有的叫 Retro Tape,还有的直接叫 “80s Glitch”。点开预览图,全…...
WT32-S3-DK开发板全解析:从硬件设计到物联网项目实战
1. 项目概述:一块“小而全”的物联网开发板最近在捣鼓一个智能家居的传感器节点项目,需要一块性能足够、接口丰富、最好还带屏幕的开发板。市面上ESP32-S3的方案很多,但要么是核心板,需要自己配底板和屏幕,要么就是功能…...
