Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
lzh_me
apachecn-dl-zh
提交
7df14bff
A
apachecn-dl-zh
项目概览
lzh_me
/
apachecn-dl-zh
与 Fork 源项目一致
Fork自
OpenDocCN / apachecn-dl-zh
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
A
apachecn-dl-zh
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
7df14bff
编写于
12月 25, 2020
作者:
W
wizardforcel
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
2020-12-25 17:18:32
上级
22c47988
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
33 addition
and
21 deletion
+33
-21
new/handson-rl-py/11.md
new/handson-rl-py/11.md
+32
-20
new/handson-rl-py/13.md
new/handson-rl-py/13.md
+1
-1
未找到文件。
new/handson-rl-py/11.md
浏览文件 @
7df14bff
...
...
@@ -15,7 +15,7 @@
# 策略梯度
策略梯度是
**强化学习**
(
**RL**
)的惊人算法之一,在该算法中,我们直接优化由某些参数
!
[](
img/00304.jpeg
)
设置的策略。 到目前为止,我们已经使用 Q 函数来找到最佳策略。 现在,我们将了解如何找到没有 Q 函数的最优策略。 首先,让我们将策略函数定义为!
[](
img/00305.jpeg
)
,即在状态为
`s`
的情况下采取
`a`
动作的概率。 我们通过参数!
[](
img/00306.jpeg
)
将策略参数化为!
[](
img/00307.jpeg
)
,这使我们能够确定状态下的最佳操作。
策略梯度是
**强化学习**
(
**RL**
)的惊人算法之一,在该算法中,我们直接优化由某些参数
`θ`
设置的策略。 到目前为止,我们已经使用 Q 函数来找到最佳策略。 现在,我们将了解如何找到没有 Q 函数的最优策略。 首先,让我们将策略函数定义为
`π(a | s)`
,即在状态为
`s`
的情况下采取
`a`
动作的概率。 我们通过参数
`θ`
将策略参数化为
`π(a | s; θ)`
,这使我们能够确定状态下的最佳操作。
策略梯度方法具有多个优点,它可以处理连续动作空间,在该连续动作空间中,我们具有无限数量的动作和状态。 假设我们正在制造自动驾驶汽车。 驾驶汽车时应避免撞到其他车辆。 当汽车撞到车辆时,我们得到负奖励,而当汽车没有撞到其他车辆时,我们得到正奖励。 我们以仅获得积极奖励的方式更新模型参数,以使我们的汽车不会撞到任何其他车辆。 这是策略梯度的基本思想:我们以最大化报酬的方式更新模型参数。 让我们详细看一下。
...
...
@@ -220,7 +220,7 @@ class PolicyGradient:
在第 8 章,“深度 Q 网络和 Atari 游戏”中,我们研究了 DQN 的工作原理,并应用了 DQN 玩 Atari 游戏。 但是,在那些离散的环境中,我们只有一组有限的动作。 想象一个连续的环境空间,例如训练机器人走路; 在那些环境中,应用 Q 学习是不可行的,因为要找到一个贪婪的策略将需要在每一步进行很多优化。 即使我们使连续的环境离散,我们也可能会失去重要的功能并最终获得大量的动作空间。 当我们拥有巨大的行动空间时,很难实现融合。
因此,我们使用称为演员评论家的新架构,该架构具有两个网络:演员和评论家。 演员评论家架构结合了策略梯度和状态操作值功能。
**演员**
网络的作用是通过调整参数
!
[](
img/00310.jpeg
)
来确定
**状态**
中的最佳动作,而
**评论家**
的作用是评估
**演员**
产生的动作。
**评论家**
通过计算时间差异误差来评估演员的行动。 也就是说,我们在
**演员**
网络上执行策略梯度以选择操作,
**评论家**
网络使用 TD 误差评估由
**演员**
网络产生的操作。 下图显示了演员评论家架构:
因此,我们使用称为演员评论家的新架构,该架构具有两个网络:演员和评论家。 演员评论家架构结合了策略梯度和状态操作值功能。
**演员**
网络的作用是通过调整参数
`θ`
来确定
**状态**
中的最佳动作,而
**评论家**
的作用是评估
**演员**
产生的动作。
**评论家**
通过计算时间差异误差来评估演员的行动。 也就是说,我们在
**演员**
网络上执行策略梯度以选择操作,
**评论家**
网络使用 TD 误差评估由
**演员**
网络产生的操作。 下图显示了演员评论家架构:
![](
img/00311.gif
)
...
...
@@ -230,16 +230,20 @@ class PolicyGradient:
现在,我们将详细介绍 DDPG 算法。
假设我们有两个网络:演员网络和评论家网络。 我们用输入为状态的
!
[](
img/00312.jpeg
)
表示演员网络
,并以
!
[](
img/00313.jpeg
)
作为演员网络权重的结果进行操作。 我们将评论家网络表示为!
[](
img/00314.jpeg
)
,它将输入作为状态和动作并返回
`Q`
值,其中!
[](
img/00315.jpeg
)
是评论家网络权重。
假设我们有两个网络:演员网络和评论家网络。 我们用输入为状态的
`μ(s; θ^μ)`
表示演员网络
,并以
`θ^μ`
作为演员网络权重的结果进行操作。 我们将评论家网络表示为
`Q(s, a; θ^Q)`
,它将输入作为状态和动作并返回
`Q`
值,其中
`θ^Q`
是评论家网络权重。
同样,我们将演员网络和评论家网络的目标网络分别定义为
!
[](
img/00316.jpeg
)
和!
[](
img/00317.jpeg
)
,其中!
[](
img/00318.jpeg
)
和!
[](
img/00319.jpeg
)
是目标演员和评论家网络的权重。
同样,我们将演员网络和评论家网络的目标网络分别定义为
`μ(s; θ^μ')`
和
`Q(s, a; θ^Q')`
,其中
`θ^μ'`
和
`θ^Q'`
是目标演员和评论家网络的权重。
我们使用策略梯度更新演员网络权重,并使用根据 TD 误差计算得出的梯度更新评论家网络权重。
首先,我们通过将探索噪声
`N`
添加到演员网络产生的动作(例如!
[](
img/00320.jpeg
)
)来选择动作。 我们在
`s`
状态下执行此操作,获得
`r`
奖励,然后移至新状态
`s'`
。 我们将此转移信息存储在经验回放缓冲区中。
经过一些迭代后,我们从回放缓冲区采样转移并训练网络,然后计算目标
`Q`
值!
[](
img/00321.jpeg
)
。 我们将 TD 误差计算为:
经过一些迭代后,我们从回放缓冲区采样转移并训练网络,然后计算目标
`Q`
值:
![](
img/00321.jpeg
)
我们将 TD 误差计算为:
![](
img/00322.jpeg
)
...
...
@@ -533,13 +537,13 @@ for i in range(no_of_episodes):
在 TRPO 中,我们迭代地改进了该策略,并施加了一个约束,以使旧策略和新策略之间的
**Kullback-Leibler**
(
**KL**
)差异要小于某个常数。 !
[](
img/00326.jpeg
)
。 该约束称为信任区域约束。
那么什么是 KL 散度? KL 散度告诉我们两个概率分布如何彼此不同。 由于我们的策略是针对行动的概率分布,因此 KL 差异告诉我们新策略与旧策略有多远。 为什么我们必须使旧策略和新策略之间的距离保持小于恒定值
!
[](
img/00327.jpeg
)
? 因为我们不希望我们的新策略与旧策略脱节。 因此,我们施加了约束以使新策略接近旧策略。 同样,为什么我们必须保持旧策略呢? 当新策略与旧策略相距甚远时,它将影响代理的学习绩效,并导致完全不同的学习行为。 简而言之,在 TRPO 中,我们朝着改善策略的方向迈出了一步,即使报酬最大化,但我们还应确保满足信任区域约束。
[
它使用共轭梯度下降
](
http://www.idi.ntnu.no/~elster/tdt24/tdt24-f09/cg.pdf
)
优化网络参数!
[](
img/00328.jpeg
)
,同时满足约束条件。 该算法保证了单调策略的改进,并且在各种连续环境中也取得了出色的效果。
那么什么是 KL 散度? KL 散度告诉我们两个概率分布如何彼此不同。 由于我们的策略是针对行动的概率分布,因此 KL 差异告诉我们新策略与旧策略有多远。 为什么我们必须使旧策略和新策略之间的距离保持小于恒定值
`δ`
? 因为我们不希望我们的新策略与旧策略脱节。 因此,我们施加了约束以使新策略接近旧策略。 同样,为什么我们必须保持旧策略呢? 当新策略与旧策略相距甚远时,它将影响代理的学习绩效,并导致完全不同的学习行为。 简而言之,在 TRPO 中,我们朝着改善策略的方向迈出了一步,即使报酬最大化,但我们还应确保满足信任区域约束。
[
它使用共轭梯度下降
](
http://www.idi.ntnu.no/~elster/tdt24/tdt24-f09/cg.pdf
)
优化网络参数!
[](
img/00328.jpeg
)
,同时满足约束条件。 该算法保证了单调策略的改进,并且在各种连续环境中也取得了出色的效果。
现在,我们将了解 TRPO 的数学原理。 如果您对数学不感兴趣,可以跳过本节。
准备一些很棒的数学。
让我们指定预期的总折扣奖励
!
[](
img/00329.jpeg
)
,如下所示:
让我们指定预期的总折扣奖励
`η(π)`
,如下所示:
![](
img/00330.jpeg
)
...
...
@@ -576,9 +580,9 @@ Kakade 和 Langford 从`(1)`得出以下方程式:
`C`
是惩罚系数,等于!
[](
img/00359.jpeg
)
,!
[](
img/00360.jpeg
)
表示旧策略与新策略之间的 KL 散度。
如果我们仔细观察前面的方程式
`(2)`
,我们会注意到,只要右侧最大化,我们的预期长期回报
!
[](
img/00361.jpeg
)
就会单调增加。
如果我们仔细观察前面的方程式
`(2)`
,我们会注意到,只要右侧最大化,我们的预期长期回报
`η`
就会单调增加。
让我们将此右侧术语定义为
!
[](
img/00362.jpeg
)
,如下所示:
让我们将此右侧术语定义为
`M[i](π)`
,如下所示:
![](
img/00363.jpeg
)
----(3)
...
...
@@ -628,9 +632,9 @@ Kakade 和 Langford 从`(1)`得出以下方程式:
# 近端策略优化
现在,我们将看另一种策略优化算法,称为
**近端策略优化**
(
**PPO**
)。 它是对 TRPO 的改进,由于其性能,已成为解决许多复杂 RL 问题的默认 RL 算法。 它是 OpenAI 的研究人员为克服 TRPO 的缺点而提出的。 回忆一下 TRPO 的替代目标函数。 这是一个约束优化问题,我们在其中施加了一个约束-新旧策略之间的平均 KL 差异应小于
!
[](
img/00382.jpeg
)
。 但是 TRPO 的问题在于,它需要大量计算能力才能计算共轭梯度以执行约束优化。
现在,我们将看另一种策略优化算法,称为
**近端策略优化**
(
**PPO**
)。 它是对 TRPO 的改进,由于其性能,已成为解决许多复杂 RL 问题的默认 RL 算法。 它是 OpenAI 的研究人员为克服 TRPO 的缺点而提出的。 回忆一下 TRPO 的替代目标函数。 这是一个约束优化问题,我们在其中施加了一个约束-新旧策略之间的平均 KL 差异应小于
`δ`
。 但是 TRPO 的问题在于,它需要大量计算能力才能计算共轭梯度以执行约束优化。
因此,PPO 通过将约束更改为惩罚项来修改 TRPO 的目标函数,因此我们不想执行共轭梯度。 现在,让我们看看 PPO 的工作原理。 我们将
!
[](
img/00383.jpeg
)
定义为新旧策略之间的概率比。 因此,我们可以将目标函数编写为:
因此,PPO 通过将约束更改为惩罚项来修改 TRPO 的目标函数,因此我们不想执行共轭梯度。 现在,让我们看看 PPO 的工作原理。 我们将
`r[t](θ)`
定义为新旧策略之间的概率比。 因此,我们可以将目标函数编写为:
![](
img/00384.jpeg
)
...
...
@@ -638,19 +642,23 @@ Kakade 和 Langford 从`(1)`得出以下方程式:
![](
img/00385.jpeg
)
我们刚刚在实际方程式中添加了一个新术语!
[](
img/00386.jpeg
)
。 这是什么意思? 实际上,它会在间隔!
[](
img/00388.jpeg
)
之间裁剪!
[](
img/00387.jpeg
)
的值,也就是说,如果!
[](
img/00389.jpeg
)
的值导致目标函数增加,则在间隔之间大量裁剪的值会降低其效果。
我们刚刚在实际方程式中添加了一个新项:
![](
img/00386.jpeg
)
基于两种情况,我们将概率比限制在!
[](
img/00390.jpeg
)
或!
[](
img/00391.jpeg
)
:
这是什么意思? 实际上,它会在间隔
`[1 - ε, 1 + ε]`
之间裁剪
`r[t](θ)`
的值,也就是说,如果
`r[t](θ)`
的值导致目标函数增加,则在间隔之间大量裁剪的值会降低其效果。
*
**案例 1**
:!
[](
img/00392.jpeg
)
基于两种情况,我们将概率比限制在
`1 - ε`
或
`ε`
:
当优势为正时,这意味着相对于所有其他操作的平均值,应优先选择相应的操作。 我们将为该操作增加!
[](
img/00393.jpeg
)
的值,因此将有更大的机会被选择。 当我们执行!
[](
img/00394.jpeg
)
的限幅值时,不会超过!
[](
img/00395.jpeg
)
:
*
**案例 1**
:
`A_hat[t] > 0`
当优势为正时,这意味着相对于所有其他操作的平均值,应优先选择相应的操作。 我们将为该操作增加
`r[t](θ)`
的值,因此将有更大的机会被选择。 当我们执行
`r[t](θ)`
的限幅值时,不会超过
`1 + ε`
:
![](
img/00396.gif
)
*
**案例 2**
:
!
[](
img/00397.jpeg
)
*
**案例 2**
:
`A_hat[t]`
当优势的值为负时,这意味着该动作没有意义,因此不应采用。 因此,在这种情况下,我们将减小该操作的
!
[](
img/00398.jpeg
)
值,以使其被选择的机会较小。 类似地,当我们执行裁剪时,!
[](
img/00399.jpeg
)
的值将不会减小到小于!
[](
img/00400.jpeg
)
:
当优势的值为负时,这意味着该动作没有意义,因此不应采用。 因此,在这种情况下,我们将减小该操作的
`r[t](θ)`
值,以使其被选择的机会较小。 类似地,当我们执行裁剪时,
`r[t](θ)`
的值将不会减小到小于
`1 - ε`
:
![](
img/00401.gif
)
...
...
@@ -658,13 +666,17 @@ Kakade 和 Langford 从`(1)`得出以下方程式:
![](
img/00402.jpeg
)
`c[1]`
和
`c[2]`
是系数,!
[](
img/00403.jpeg
)
是实际值和目标值函数之间的平方误差损失,即 是!
[](
img/00404.jpeg
)
和
`S`
是熵加。
`c[1]`
和
`c[2]`
是系数,
`L[t]^(VP)`
是实际值和目标值函数之间的平方误差损失,即:
![](
img/00404.jpeg
)
`S`
是熵增。
# 概要
我们从策略梯度方法开始,该方法无需 Q 函数即可直接优化策略。 我们通过解决 Lunar Lander 游戏了解了策略梯度,并研究了 DDPG,它具有策略梯度和 Q 函数的优点。
然后,我们研究了诸如 TRPO 之类的策略优化算法,该算法通过对新旧策略之间的 KL 差异实施不大于
!
[](
img/00405.jpeg
)
的限制来确保单调策略的改进。
然后,我们研究了诸如 TRPO 之类的策略优化算法,该算法通过对新旧策略之间的 KL 差异实施不大于
`δ`
的限制来确保单调策略的改进。
我们还研究了近端策略优化,该优化通过惩罚大型策略更新将约束变为惩罚。 在下一章第 12 章, “Capstone 项目 – 使用 DQN 进行赛车”,我们将了解如何构建能够赢得赛车游戏的代理。
...
...
new/handson-rl-py/13.md
浏览文件 @
7df14bff
...
...
@@ -27,7 +27,7 @@ I2A 的架构如下:
![](
img/00409.gif
)
推出编码器分为两层:想象未来和编码器。 想象未来是想象力发生的地方。 看上图。 想象未来由想象核心组成。 当将状态
!
[](
img/00410.jpeg
)
馈送到想象力核心时,我们得到了新状态!
[](
img/00411.jpeg
)
和奖励!
[](
img/00412.jpeg
)
,当我们将这个新状态!
[](
img/00413.jpeg
)
馈给了下一个想象力核心时,我们得到了下一个新状态 状态!
[](
img/00414.jpeg
)
和奖励!
[](
img/00415.jpeg
)
。 当我们在某些
`n`
步骤中重复这些步骤时,我们会得到一个基本上是状态和奖励对的推出,然后我们使用诸如 LSTM 的编码器对该推广进行编码。 结果,我们得到了卷展编码。 这些推出编码实际上是描述未来想象路径的嵌入。 我们将针对未来不同的想象路径使用多个推出编码器,并使用聚合器来聚合此推出编码器。
推出编码器分为两层:想象未来和编码器。 想象未来是想象力发生的地方。 看上图。 想象未来由想象核心组成。 当将状态
`o[t]`
馈送到想象力核心时,我们得到了新状态
`o_hat[t + 1]`
和奖励
`r_hat[t + 1]`
,当我们将这个新状态
`o_hat[t + 1]`
馈给了下一个想象力核心时,我们得到了下一个新状态 状态
`o_hat[t + 2]`
和奖励
`r_hat[t + 2]`
。 当我们在某些
`n`
步骤中重复这些步骤时,我们会得到一个基本上是状态和奖励对的推出,然后我们使用诸如 LSTM 的编码器对该推广进行编码。 结果,我们得到了卷展编码。 这些推出编码实际上是描述未来想象路径的嵌入。 我们将针对未来不同的想象路径使用多个推出编码器,并使用聚合器来聚合此推出编码器。
等待。 想象力如何在
**想象力核心**
中发生?
**想象力核心**
中实际上是什么? 下图显示了单个
**想象核心**
:
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录