本系列的完结篇,介绍了连续控制情境下的强化学习方法,确定策略 DPG 和随机策略 AC 算法。
离散动作空间
连续动作空间
\(Action \ space \ \mathcal{A}=[0°,360°]×[0°,180°]\)
比如机械臂,如果具有两个运动关节:

价值网络 DQN 可以解决离散动作控制的问题,因为 DQN 输出的是有限维度的向量。

策略网络也同样。

所以此前的方法不能简单照搬到连续控制。要想应用到连续控制上,可以采用 连续空间离散化。
连续空间离散化:
另外还有两个方法:
Deterministic Policy Gradient.确定策略梯度,可以用于解决连续控制问题。后续引入深度神经网络,就是著名的 DDPG。
DPG 是 Actor-Critic 方法的一种。结构图如下:

策略网络 actor
价值网络 critic
训练两个神经网络,让两个网络越来越好。
用 TD 算法更新 价值网络:
观测 transition:\((s_t,a_t,r_t,s_{t+1})\)
价值网络预测 t 时刻 的动作价值 \(q_t=q(s_t,a_t;w)\)
价值网络预测 t+1时刻的价值:\(q_{t+1}=q(s_{t+1},a'_{t+1};w)\)
注意这里的 \(a'_{t+1}\) 是 策略网络 t+1 时刻预选出来的动作,尚未执行。
TD error:\(\delta_t=q_t-\underbrace{(r_t+\gamma\cdot q_{t+1})}_{TD \ target}\)
更新参数:\(w\leftarrow w-\alpha\cdot\delta_t \cdot \frac{\partial q(s_t,a_t;w)}{\partial w}\)
策略网络用 DPG 算法 更新
对 DPG 算法进行推导。
训练价值网络的目标是,让价值网络的输出 q 越大越好。
而在DPG 的网络结构中,在给定状态时,动作是确定的(策略网络会给出一个确定的动作),且价值网络固定,那么影响输出的就是策略网络的参数 \(\theta\)。
所以更新 θ 使价值 q 更大;
计算价值网络关于 θ 的梯度 DPG:\(g=\frac{\partial q(s,\pi(s;\theta))}{\partial\theta}=\frac{\partial a}{\partial\theta}\cdot\frac{\partial q(s,a;w)}{\partial a}\)
链式法则,让梯度从价值 q 传播到动作 a;再从 a 传播到策略网络。
梯度上升更新 \(\theta\):\(\theta\leftarrow \theta+\beta\cdot g\)
上面的 DPG 是比较原始的版本,用 Target Network 可以提升效果。Target Network 在此前第11篇中讲过,上文中的算法也会出现高估问题或者低估问题。
因为用自身下一时刻的估计来更新此时刻的估计。
Target Network 方法的过程是:
同样,之前讲过的其他改进也可以用于这里,如经验回放、multi-step TD Target 等。
DPG 使用的是 确定策略网络,跟之前的随机策略不同。
| \ | 随机策略 | 确定策略 |
|---|---|---|
| 策略函数 | $\pi(a | s;\theta)$ |
| 输出 | 每个动作一个概率值,向量 | 确定的动作 |
| 控制方式 | 根据概率分布抽样a | 输出动作并执行 |
| 应用 | 大多是离散控制,用于连续的话结构大有不同 | 连续控制 |
这部分来介绍怎么在连续控制问题中应用随机策略梯度。
构造一个策略网络,来做连续控制,这个策略网络与之前学过的相差很大,以机械臂为例:
先从一个简单的情况研究起,自由度为1,这时动作都是实数 \(\mathcal{A}\subset \mathbb{R}\)
而机械臂的自由度通常是3或者更高,把自由度记为 d,动作 a 是一个 d 维的向量。
但是问题是,我们不知道 具体的 \(\mu , \sigma\),我们用神经网络来近似它们。
网络结构如下:

观测到 状态 s,输入神经网络;
神经网络输出 \(\hat\mu=\mu(s;\theta^\mu),\hat\rho=\rho(s;\theta^\rho)\),都是 d 维度
\(\hat\rho\) 计算 \(\hat\sigma_i^2=\exp(\hat\rho_i)\)
随机抽样得到动作 a :\(a_i\sim\mathcal{N}(\hat\mu_i,\hat\sigma_i^2)\)
这个正态分布是假定的策略函数。
Auxiliary Network, 计算策略梯度时对其求导。
随机策略梯度为:\(g(a)=\frac{\partial ln\pi(a|s;\theta)}{\partial\theta}\cdot Q_\pi(s,a)\)
计算 \(\pi\) 的对数。
策略网络为:\(\pi(A|s;\theta^\mu)=\Pi_{i=1}^d\frac{1}{\sqrt{6.28}}\cdot\exp(-\frac{(a_i--\mu)^2}{2\delta^2_i})\),输出是一个概率密度,表示在某点附近的可能性大小
虽然可以算出来某个动作的概率,但实际上我们只需要知道 均值 和 方差,来做随机抽样即可,所以实际上我们用不到这个策略函数 \(\pi\)
由上面策略梯度公式知:我们需要策略 \(\pi\) 的对数,所以训练时,我们会用到策略 \(\pi\) 的对数,而不是 \(\pi\) 本身:
由于神经网络输出的时方差对数\(\rho_i\),而不是\(\delta^2_i\),所以做个替换:\(\delta_i^2=\exp\rho_i\)
\(\ln\pi(a|s;\theta^\mu,\theta^\rho)=\sum_{i=1}^d[-\ln\delta_i-\frac{(a_i-\mu_i)^2}{2\delta^2}]+const\\=\sum_{i=1}^d[-\frac{\rho_i}{2}-\frac{(a_i-\mu_i)^2}{2\exp(\rho_i)}]+const\)
这样 神经网络的对数 就表示成了 \(\rho,\mu\) 的形式,记 \(\theta=(\theta^\mu,\theta^\rho)\)
把上式连加的一项记为 \(f(s,a;\theta)\),这就是辅助神经网络 Auxiliary Network.用于帮助训练。
\(f(a,s;\theta)=\sum_{i=1}^d[-\frac{\rho_i}{2}-\frac{(a_i-\mu_i)^2}{2\exp(\rho_i)}]\)
f 的输入是 s, a ,依赖于 \(\rho,\mu\),所以参数也是 \(\theta\)
结构如下:

输入为 \(\underbrace{\mu,\rho}_{s},a\),输出为一个实数 f;
f 依赖于卷积层和全连接层的参数,所以接下来反向传播,可以算出 f 关于全连接层 Dense 参数的梯度,再算出 关于卷积层参数的梯度:

用 \(\frac{\partial f}{\partial \theta}\) 来表示梯度。
随机策略梯度:\(g(a)=\frac{\partial ln\pi(a|s;\theta)}{\partial\theta}\cdot Q_\pi(s,a)\)
辅助神经网路:\(f(s,a;\theta)=\ln\pi(a|s;\theta)+const\)
可以注意到,f 的梯度和 \(\ln\pi\) 的梯度相同,可以用前者梯度代替后者,即
而 f 作为一个神经网路,成熟的 pytorch 等可以对其自动求导。
Q 还未知,需对其做近似
连续动作空间有无穷多种动作数量
解决方案包括:
离散动作空间,使用标准DQN或者策略网络进行学习,但是容易引起维度灾难
使用确定策略网络进行学习
没有随机性,某些情境下不合适。
随机策略网络(\(\mu\) 与 \(\sigma^2\))
随机策略的训练过程:
本系列完结撒花!
我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123
当我在Rails控制台中按向上或向左箭头时,出现此错误:irb(main):001:0>/Users/me/.rvm/gems/ruby-2.0.0-p247/gems/rb-readline-0.4.2/lib/rbreadline.rb:4269:in`blockin_rl_dispatch_subseq':invalidbytesequenceinUTF-8(ArgumentError)我使用rvm来管理我的ruby安装。我正在使用=>ruby-2.0.0-p247[x86_64]我使用bundle来管理我的gem,并且我有rb-readline(0.4.2)(人们推荐的最少
我正在使用Ruby2.1.1和Rails4.1.0.rc1。当执行railsc时,它被锁定了。使用Ctrl-C停止,我得到以下错误日志:~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`gets':Interruptfrom~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`verify_server_version'from~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.
我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新rubygems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems
说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时
目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称
最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总
深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal
在我的Character模型中,我添加了:字符.rbbefore_savedoself.profile_picture_url=asset_path('icon.png')end但是,对于数据库中已存在的所有角色,它们的profile_picture_url为nil。因此,我想进入控制台并遍历所有这些并进行设置。在我试过的控制台中:Character.find_eachdo|c|c.profile_picture_url=asset_path('icon.png')end但这给出了错误:NoMethodError:undefinedmethod`asset_path'formain:O
我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or