17、深度确定性策略梯度(DDPG)算法详解

深度确定性策略梯度(DDPG)算法详解

1. 基于离策略确定性策略梯度的演员 - 评判家算法

在离策略确定性策略梯度中,行为使用外部策略。具体而言,使用策略 $p(s, a)$ 来生成轨迹,以训练确定性动作策略 $l_h(s)$。由于 $l$ 是确定性策略,它仅需状态作为输入,就能提供单一动作建议,并且 $l$ 由参数向量 $h$ 进行参数化。目标策略 $l_h(s)$ 的真实动作价值函数可表示为 $Q_l(s, a)$。但与随机演员 - 评判家情况类似,由于该真实动作价值不可微,我们将使用近似函数来逼近此动作价值。动作价值由策略 $w$ 进行参数化,即 $Q_w(s, a) \approx Q_w(s, a)$。

其余计算与随机确定性策略类似,不同之处在于确定性策略的梯度是动作价值函数的梯度,相关方程如下:
- 计算目标值与实际值之间的误差:
- $d_t = r_t + \gamma Q_w(s_{t + 1}, l_h(s_t, a_t)) - Q_w(s_t)$ (13.5)
- 使用该误差更新目标策略参数 $w$,通过在时间步 $t$ 沿目标函数 $Q_w$ 的梯度方向移动,学习率为 $\alpha_w$:
- $w_{t + 1} = w_t + \alpha_w d_t \nabla_w Q_w(s_t, a_t)$ (13.6)
- 更新确定性动作策略参数 $h$,使用与随机策略梯度参数更新类似的链式法则。确定性动作策略关于策略参数的偏微分是目标函数关于动作的偏微分与动作策略关于其参数的偏微分的乘积。使用学习率 $\alpha_h$ 沿此梯度方向更新动作策略参数 $h$:
- $h_{t + 1} = h_t + \alpha_h \nabla_h l_h(s_t) \nabla_a Q_w(s_t, a_t)|_{a = l_h(s)}$ (13.7)

2. 深度确定性策略梯度(DDPG)

确定性策略梯度(DPG)使用 Q - 学习进行价值估计,而 Q - 学习又使用线性模型作为函数逼近器。尽管原始 DQN 论文中的实验仅使用线性函数逼近器,但可以用深度学习模型替代该线性函数逼近器,这便是深度确定性策略梯度(DDPG)的由来。

DDPG 是一种无模型、离策略、演员 - 评判家的无模型算法,基于确定性策略梯度定理,可在连续动作空间中运行。本质上,DDPG 旨在结合 DPG 的演员 - 评判家模型实现连续动作控制,并实现 DQN 进行策略估计和策略更新。相关研究表明,该算法在 20 多个需要连续动作控制的任务中始终优于 DPG 算法,并且在离散动作问题的训练中,与深度 Q 网络(DQN)算法相比,需要的数据样本更少。所有这 20 个不同的任务在执行时无需重新训练或重新配置网络,即网络配置和权重在从一个任务切换到另一个任务之前保持不变。

理想情况下,我们可以简单地用深度学习神经网络替换 DPG 中使用的线性函数逼近器。例如,在传感器领域输入的情况下,我们可以直接用基于多层感知器的深度神经网络(MLP - DNN)替换线性逼近器;在处理视频输入时,可以使用卷积神经网络(CNN)(后面接一些全连接层),这两种模型的最后一层可以是 SoftMax 激活层(用于离散动作控制)或线性激活层(用于连续动作控制)。但由于强化学习训练的特性,这种直接替换不可行。我们在 DQN 相关内容中学习了一些使基于深度学习的逼近器可行的增强方法。在 DDPG 中,部分增强方法直接使用,部分进行了修改以更适合演员 - 评判家的实现。此外,DDPG 还采用了深度学习领域的一些最新进展。

2.1 DDPG 中与深度学习实现相关的修改

DDPG 对最初提出的基于线性逼近器函数的确定性策略梯度(DPG)进行了三项主要修改,以实现类似 DQN 的基于深度学习的函数逼近器:
1. 经验回放 :大多数基于无模型假设的强化学习训练方法假定训练样本是独立且同分布的。但当输入观测值来自游戏(如 Atari2600 游戏)的连续视频帧时,这一假设会被严重违反。为克服此问题,可使用“经验回放”机制,将传入帧作为经验元组(即 $(s_t, a_t, r_t, s_{t + 1}, )$ 元组)存储在“记忆缓冲区”(固定大小的内存缓存)中。状态可以是图像像素的直接帧,也可以是视频帧的相关抽象与其他相关数据连接以表示观测状态。随后,训练从该缓冲区中随机抽取(经验)样本或根据采样策略(带有一些噪声)进行。DDPG 算法使用了前面章节讨论的该记忆缓冲区的基本变体。
2. 目标网络的软更新 :在 DQN 中我们了解到,如果用于不断更新的同一网络(动作价值函数逼近网络,即在线网络)也用作计算误差的目标网络(该误差又用于在线网络的更新),会使网络更新非常不稳定。DDPG 借鉴了 Double DQN 算法的思路,使用相对稳定的第二个目标网络。但由于需要在演员 - 评判家框架中实现,需要一种在线实现机制使这个相对稳定的(离线)目标网络可行。为此,DDPG 使用了“软更新”机制,目标网络也会持续更新,但更新速度非常缓慢,以跟踪活跃的(在线)动作价值网络。软更新通过以下公式更新目标网络参数:
- $h_{t + 1} = \tau h_t + (1 - \tau) h_{t + 1}$ (13.8)
其中,$\tau$ 是范围在 $(0, 1)$ 内的常数,且 $\tau \ll 1$。
3. 批量归一化 :DDPG 在 20 多个不同类型的连续动作任务中表现出色,无需重新配置网络或重新训练权重。但在深度学习模型处理来自多个分布的输入时,会出现“协变量偏移”问题。大多数现代深度学习激活函数是非线性的,且大多不是零对称镜像函数,这会导致深度学习网络各层之间特征的底层分布发生变化,直到非线性饱和,使得训练深度网络变得非常困难,这种现象称为“(内部)协变量偏移”。传统上,通过采用非常低的学习率或增长不太快的学习率(在基于自适应学习率的优化器情况下),并仔细选择每层的初始化函数/值来处理此问题。但这些方法不仅会显著降低训练速度,还需要专业人员设置初始化值。在 DDPG 研究的同期,提出了“批量归一化”方法。批量归一化是指在小批量的所有样本中,对输入到任何层的每个维度进行归一化(具有单位均值和方差),作为网络架构的一部分(即在常规 CNN 和 DNN 层之外添加额外的归一化层)。除了内部协变量偏移问题,批量归一化在一定程度上还解决了过拟合问题,并可以补充或替代深度学习中的丢弃机制以提供类似的正则化效果。DDPG 将批量归一化作为第三项增强措施,用于克服内部协变量偏移问题。

此外,在行为策略中使用的噪声函数选择上,DDPG 与常规 DPG 实现略有不同。行为策略可表示为:
- $l_b(s_t) = l_a(s_t|h_t) + N$ (13.9)
其中,$l_b(s_t)$ 是行为策略在时间 $t$ 为状态 $s$ 推荐的动作,它是动作策略 $l_a$ 在时间 $t$ 为状态 $s$ 推荐的动作与噪声函数 $N$ 产生的噪声之和。添加的噪声 $N$ 是行为策略的重要组成部分,有助于提供探索效果。如果 $N$ 趋于 0,则行为策略将模仿动作策略,只有剥削而无探索。DDPG 算法使用的噪声函数会随着训练的进行提供不同水平的噪声,为具有惯性的物理控制问题中的探索效率生成时间相关的探索。

2.2 DDPG 算法伪代码

DDPG 算法经过修改和增强,以实现基于深度学习的函数逼近器,其伪代码如图 13.2 所示。

下面用表格总结 DDPG 相对 DPG 的改进点:
|改进点|描述|
| ---- | ---- |
|经验回放|使用记忆缓冲区存储经验元组,随机抽取样本进行训练,解决样本相关性问题|
|目标网络软更新|使用相对稳定的目标网络,并采用软更新机制使其缓慢跟踪在线网络,提高训练稳定性|
|批量归一化|在网络架构中添加归一化层,克服内部协变量偏移问题,提高训练效率|
|噪声函数选择|使用能随训练提供不同水平噪声的噪声函数,实现时间相关的探索|

mermaid 流程图展示 DDPG 主要流程:

graph LR
    A[初始化网络参数] --> B[收集经验存入缓冲区]
    B --> C[从缓冲区随机采样]
    C --> D[计算误差]
    D --> E[更新在线网络]
    E --> F[软更新目标网络]
    F --> B

综上所述,DDPG 为连续动作控制问题提供了一种有效的解决方案,通过结合深度学习和强化学习的优势,在多个任务中展现出良好的性能。在下半部分,我们将介绍如何使用高级包装库来编写 DDPG 代码,并将其应用于连续动作控制任务。

3. 用高级包装库编写 DDPG 代码

3.1 强化学习高级包装库

在之前,我们主要使用低级别编码平台来实现算法,如纯 Python、NumPy、TensorFlow 及其包装库 Keras。这些都是通用平台,并非专门的强化学习库。而在这部分,我们将使用高级专用强化学习包装库 Keras - RL 来简化和简洁地实现 DDPG 算法。使用高级包装库有以下几个原因:
- 之前仅在介绍实现资源时提及这些库,尚未用于实际编码。
- 在现实场景中,关键挑战往往是将实际应用领域转化为强化学习场景,需要快速原型机制来测试不同代理,使用高级包装库能满足这一需求。
- 让读者体验使用高级包装库进行强化学习开发的过程。

3.2 使用 Keras - RL 实现 DDPG 算法

我们将使用 Keras - RL 库来实现 DDPG 算法,并将其应用于 Gym 的 Mountain Car Continuous 环境中的连续动作控制任务。以下是实现的步骤:

步骤 1:安装必要的库

首先,确保你已经安装了 Keras - RL、Gym 和其他相关依赖库。可以使用以下命令进行安装:

pip install keras-rl gym
步骤 2:导入必要的库

在 Python 代码中,导入所需的库:

import gym
from keras.models import Sequential, Model
from keras.layers import Dense, Flatten, Input, Concatenate
from keras.optimizers import Adam
from rl.agents.ddpg import DDPGAgent
from rl.memory import SequentialMemory
from rl.random import OrnsteinUhlenbeckProcess
步骤 3:创建环境

使用 Gym 创建 Mountain Car Continuous 环境:

env = gym.make('MountainCarContinuous-v0')
nb_actions = env.action_space.shape[0]
步骤 4:构建演员(Actor)和评判家(Critic)网络

构建演员和评判家网络的结构:

# 演员网络
actor = Sequential()
actor.add(Flatten(input_shape=(1,) + env.observation_space.shape))
actor.add(Dense(16, activation='relu'))
actor.add(Dense(16, activation='relu'))
actor.add(Dense(nb_actions, activation='linear'))
print(actor.summary())

# 评判家网络
action_input = Input(shape=(nb_actions,), name='action_input')
observation_input = Input(shape=(1,) + env.observation_space.shape, name='observation_input')
flattened_observation = Flatten()(observation_input)
x = Concatenate()([action_input, flattened_observation])
x = Dense(32, activation='relu')(x)
x = Dense(32, activation='relu')(x)
x = Dense(32, activation='relu')(x)
x = Dense(1, activation='linear')(x)
critic = Model(inputs=[action_input, observation_input], outputs=x)
print(critic.summary())
步骤 5:配置 DDPG 代理

配置 DDPG 代理,包括内存、随机过程和优化器:

# 内存
memory = SequentialMemory(limit=100000, window_length=1)

# 随机过程
random_process = OrnsteinUhlenbeckProcess(size=nb_actions, theta=.15, mu=0., sigma=.3)

# DDPG 代理
agent = DDPGAgent(nb_actions=nb_actions, actor=actor, critic=critic, critic_action_input=action_input,
                  memory=memory, nb_steps_warmup_critic=100, nb_steps_warmup_actor=100,
                  random_process=random_process, gamma=.99, target_model_update=1e-3)
agent.compile(Adam(lr=.001, clipnorm=1.), metrics=['mae'])
步骤 6:训练代理

使用环境对代理进行训练:

agent.fit(env, nb_steps=50000, visualize=False, verbose=1)
步骤 7:测试代理

训练完成后,测试代理在环境中的表现:

agent.test(env, nb_episodes=5, visualize=True)

3.3 代码解释

  • 演员网络 :接收环境的观测作为输入,输出动作。通过多层全连接层学习从状态到动作的映射。
  • 评判家网络 :接收动作和观测作为输入,输出动作价值。通过将动作和观测拼接后输入到多层全连接层,学习评估动作的价值。
  • 内存 :使用顺序内存存储经验元组,用于经验回放。
  • 随机过程 :使用 Ornstein - Uhlenbeck 过程为动作添加噪声,实现探索。
  • DDPG 代理 :将演员和评判家网络结合,配置训练参数,如预热步数、折扣因子和目标模型更新率。
  • 训练和测试 :使用 fit 方法进行训练,使用 test 方法进行测试。

3.4 总结

通过使用 Keras - RL 高级包装库,我们可以简洁地实现 DDPG 算法,并将其应用于连续动作控制任务。以下是整个实现过程的步骤总结:
1. 安装必要的库
2. 导入所需的库
3. 创建环境
4. 构建演员和评判家网络
5. 配置 DDPG 代理
6. 训练代理
7. 测试代理

表格总结 DDPG 代码实现步骤:
|步骤|操作|
| ---- | ---- |
|1|安装必要的库|
|2|导入所需的库|
|3|创建环境|
|4|构建演员和评判家网络|
|5|配置 DDPG 代理|
|6|训练代理|
|7|测试代理|

mermaid 流程图展示 DDPG 代码实现流程:

graph LR
    A[安装库] --> B[导入库]
    B --> C[创建环境]
    C --> D[构建网络]
    D --> E[配置代理]
    E --> F[训练代理]
    F --> G[测试代理]

综上所述,DDPG 算法结合了确定性策略梯度和深度学习的优势,为连续动作控制问题提供了有效的解决方案。通过使用高级包装库,我们可以更方便地实现和应用该算法。

"Mstar Bin Tool"是一款专门针对Mstar系列芯片开发的固件处理软件,主要用于智能电视及相关电子设备的系统维护与深度定制。该工具包特别标注了"LETV USB SCRIPT"模块,表明其对乐视品牌设备具有兼容性,能够通过USB通信协议执行固件读写操作。作为一款专业的固件编辑器,它允许技术人员对Mstar芯片的底层二进制文件进行解析、修改与重构,从而实现系统功能的调整、性能优化或故障修复。 工具包中的核心组件包括固件编译环境、设备通信脚本、操作界面及技术文档等。其中"letv_usb_script"是一套针对乐视设备的自动化操作程序,可指导用户完成固件烧录全过程。而"mstar_bin"模块则专门处理芯片的二进制数据文件,支持固件版本的升级、降级或个性化定制。工具采用7-Zip压缩格式封装,用户需先使用解压软件提取文件内容。 操作前需确认目标设备采用Mstar芯片架构并具备完好的USB接口。建议预先备份设备原始固件作为恢复保障。通过编辑器修改固件参数时,可调整系统配置、增删功能模块或修复已知缺陷。执行刷机操作时需严格遵循脚本指示的步骤顺序,保持设备供电稳定,避免中断导致硬件损坏。该工具适用于具备嵌入式系统知识的开发人员或高级用户,在进行设备定制化开发、系统调试或维护修复时使用。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值