全部版块 我的主页
论坛 新商科论坛 四区(原工商管理论坛) 行业分析报告
130 0
2025-12-01

在深度分层强化学习的初期阶段,多数算法局限于双层结构设计,难以向真正意义上的多层级架构拓展。其根本原因在于:当层次增加至三层及以上时,会引发一系列连锁问题,放大原有机制的缺陷,使得直接扩展双层模式变得不可行。主要挑战包括:

  • 非平稳性:低层策略在训练过程中不断更新,导致高层策略所依赖的环境动态变化剧烈,动作输出呈现非平稳特性。这一现象在HIRO方法中已有阐述,并提出了一定缓解思路;
  • 信用分配级联:最高层的决策需经过多个中间层传递才能影响环境行为,一旦任务失败,难以追溯具体是哪一层的子目标设定出现了偏差;
  • 高层训练信号稀疏:由于高层策略执行频率极低,其获得有效反馈的时间间隔很长,造成学习效率低下。

HAC:实现多层强化学习的关键突破

HAC(Hierarchical Actor-Critic,分层演员-评论家)旨在系统性解决从双层到多层过渡中的核心难题。该方法在HIRO的基础上进一步优化了经验回放机制,并引入了子目标测试机制,显著提升了高层策略训练的稳定性与效率。通过一整套工程化设计,HAC成功构建了一个可扩展、高效的多层策略学习框架。

分层架构与嵌套决策机制

HAC采用UMDP(Universal MDP,通用马尔可夫决策过程)来形式化描述分层任务。一个UMDP由六元组 U = (S, G, A, T, R, γ) 定义,其中各元素分别表示状态空间 S、目标空间 G、动作空间 A、状态转移函数 T、奖励函数 R 和折扣因子 γ

HAC的整体架构包含 k 个层级,每一层均配备独立的UMDP和策略:

  • 每层拥有各自的UMDP:U, ..., Uk1
  • 对应策略为 π, ..., πk1 ∈ Πk1,其中第 i 层策略定义为 π: S, G → A,且满足 0 ≤ i ≤ k1
  • 所有层级的状态空间与原始环境一致:S = S
  • 目标空间也设为状态空间本身:G = S
  • 对于高层策略(i ≥ 1),其输出动作为“目标”,因此动作空间等于状态空间:A = S
  • 仅底层策略 π 输出实际可执行的动作,其动作空间与原问题一致:A = A

自上而下的嵌套执行流程

HAC通过嵌套策略实现任务分解,形成一种递归式的决策路径:

  1. 高层策略 π 根据当前状态 s 和目标 g,生成动作 a
  2. 该动作被下一层 i1 视为目标输入,即 gi1 = a
  3. i1 层策略基于新目标 gi1 和当前状态 si1 产行动作 ai1
  4. 此过程逐层向下传递,直至最底层;
  5. 第 1 层输出的动作 a 成为底层策略 π 的目标 g
  6. 最终,π 根据 gs 输出实际动作 a,交由智能体执行。

决策流的返回由高层状态转移函数 T 的终止条件触发,该条件由低层 i1 在以下两种情形下激活:

  • 低层策略 πi1 连续执行了预设步数 H,仍未达成目标 gi1
  • H 步内成功完成目标 gi1,或意外达成了更高层的目标 g(其中 k > i1)。

这里的 H 是每个层级进行一次决策所固定的持续时间跨度。

事后动作转移与非平稳性应对

在训练过程中,HAC的多层嵌套结构会加剧非平稳性问题。主要原因有两个方面:

  1. 低层策略的参数更新会导致其行为发生变化,从而使高层策略所面对的“环境”不断变动;
  2. 尽管每一层使用的是确定性策略,但在探索阶段会引入高斯噪声构造行为策略:πib = π + N(0, σ)。这意味着即使策略参数不变,高层仍会观察到不一致的执行结果。

上述因素共同导致高层训练过程不稳定。为此,HAC引入了“事后动作转移”(In-the-loop Action Transfer)机制,通过对低层实际执行轨迹的重构,提升高层经验的有效性和一致性,从而缓解因底层波动带来的训练干扰。

HAC通过一个巧妙的假设,为高层策略构建了一个理想化且稳定的学习环境。具体而言,对于每一个高层策略 π_i,HAC假设其所有下属的低层策略 Π_{i-1} 均为最优策略 Π_{i-1}^*,从而屏蔽了训练过程中的非平稳性问题。这一关键思想借助“事后动作转移”(Hindsight Action Transition)机制得以实现,其理念与HIRO中的离策略校正方法一脉相承。

考虑一个典型的双层HAC架构,其任务是引导智能体移动至黄旗所在位置。

在初始状态 s_0,高层策略 π_1 输出目标 g_0,随后由低层策略 π_0 执行 H=5 步操作,最终到达状态 s_1;接着,高层策略再次输出新目标 g_1,依此类推。每一次状态转移 T 所产生的经验是一个五元组:(s, a, s', g, γ),包含转移前的状态 s、所采取的动作 a、转移后的状态 s'、来自高层的目标 g 以及折扣因子 γ

以基于 g_0 的状态转移为例,高层策略 π_1 收集到的经验为:(s_0, a = g_0, r, s' = s_1, g_{total} = 黄旗, γ)。这里的关键在于“事后动作转移”的重构机制——它强调“实际完成了什么”比“原本计划做什么”更具学习价值。

理论上,任何由高层策略 π_1 提出的可行目标,都应能被一个最优的低层策略 π_0^*H 步内完成。若 π_0 实际上成功抵达目标区域,则该条经验自然可视为由 π_0^* 产生。反之,如图中所示,当智能体从 s_0 出发试图执行目标 g_0 却最终停留在较远的 s_1 时,HAC将对原始经验进行修正:将原动作 g_0 替换为实际到达的状态 s_1

通过这种重构方式,原本在目标 g_0 下属于失败的经验,被转换成在目标 s_1 下的一次成功经历,并被视为由最优低层策略 π_0^* 完成。这使得高层策略 π_1 能够学习到:在状态 s_0 选择导向 s_1 的动作,相较于坚持原定目标 g_0,可能更有利于最终达成黄旗任务。

关于奖励函数 r 的设计,遵循两个核心原则:其一,我们仅能确保最优低层策略 π_0^* 可以实现的结果,但无法预判其具体路径,因此奖励不应依赖于执行路径细节;其二,奖励机制需鼓励高层策略探索最短路径。为此,HAC采用了极为简洁的稀疏奖励机制:若当前达到的状态等于或足够接近本层目标,则给予奖励 r = 0,否则 r = -1

因此,在应用事后动作转移后,高层策略 π_1s_0 输出动作 g_0 后到达 s_1 的经验被更新为:(s_0, a = s_1, r = -1, s' = s_1, g_{total} = 黄旗, γ)

事后目标转移

“事后动作转移”通过对高层输出动作的重构,保障了高层策略训练的稳定性;而“事后目标转移”(Hindsight Goal Transition)则通过调整当前层级的目标 g,缓解因奖励稀疏带来的学习困难,提升各层策略的训练效率。

继续以黄旗任务为例。假设在一次完整的决策过程中,高层策略 π_1 累计收集了从 s_0s_5 的5条原始经验。如果直接使用原始目标 g_{total} = 黄旗 进行训练,那么由于均未真正抵达黄旗位置,所有经验都将获得负奖励 r = -1,导致策略难以获取有效的正向反馈。

为了确保至少存在一条成功经验可供学习,HAC引入事后目标转移机制,将最终目标重设为实际到达的状态 s_5。此时,从 s_4 到达 s_5 的转移将被视为一次成功行为,奖励变为 r = 0。原本在 g_{total} = 黄旗 下的5条失败经验,经过重标定后转化为在新目标 \tilde{g}_{total} = s_5 下的4条失败经验和1条成功经验。

这种方式确保了即使低层策略始终无法在限定步数 H 内完成高层设定的理想目标,系统仍可通过事后目标转移持续生成关于可实现目标的成功样本,从而为神经网络提供稳定且有意义的学习梯度。

在算法实现层面,每当发生一次状态转移时,HAC会同时生成两条经验数据:一条基于原始目标,另一条则基于经事后修正后的目标。这种双重经验存储机制有效增强了策略在稀疏奖励环境下的学习能力。

在强化学习过程中,智能体每执行 H 步会生成两类经验数据:一类是包含完整奖励与目标信息的标准经验;另一类则是目标被暂时抹除、标记为 TBD(待定)的待定经验。当收集齐这 H 步的所有经验后,HAC 算法会从每一步所到达的状态中随机选取 n 个状态,作为当前层级策略的目标候选集。

随后,每个选出的新目标会被分别填充至所有待定经验中,重新计算对应的奖励值,从而生成 H \times n 条新的经验,称为事后经验。这些新增的经验中至少包含 n 条成功轨迹,极大提升了训练样本的有效性。原始的标准经验仍保留在训练集中,以防止策略因过度依赖事后构造而偏离真实任务目标。

像 HIRO 所采用的离策略校正机制,以及 HAC 中的事后动作转移和事后目标转移方法,本质上都是通过对失败经历进行“重新解释”来修正经验数据,这类技术统称为事后经验回放(Hindsight Experience Replay, HER)。该机制显著缓解了深度分层强化学习中普遍存在的稀疏奖励问题。

子目标测试机制

尽管事后经验回放在提升样本利用率方面效果显著,但单纯依赖事后动作与目标转移会导致高层策略 \pi_i 对低层策略 \pi_{i-1} 的实际能力产生认知偏差,主要体现在两个方面:

  1. 高层策略只能学习到在当前 H 步内可由低层策略实现的子目标(或动作)对应的 Q 值,而对于更远距离的潜在目标则缺乏有效学习。即使随着训练推进,低层策略的能力逐步扩展,高层策略也难以及时感知这种变化。若网络初始化阶段对某些初期不可达子目标存在高估或低估倾向,则后续很难纠正,可能导致整体行为不稳定。
  2. 高层策略可能固守过去发现的最短路径策略,然而低层策略的能力具有动态性——可能因探索过程中的泛化或遗忘而丢失某些特定技能。此时原先可行的路径可能已失效,但高层策略无法及时察觉这一变化。

虽然 Critic 网络具备一定的 Q 值泛化能力,能够通过边界状态间接推测稍远目标的价值,但这种信息传递仍较为模糊,不足以支撑上下层策略之间的准确对齐。

为缓解上述问题,HAC 引入了子目标测试(Subgoal Testing Transitions)机制。具体而言,在高层策略 \pi_i 提出一个子目标 a 后,系统以概率 \lambda 进入测试模式。在此模式下,下属的低层策略 \Pi_{i-1} 将关闭探索噪声,严格按照当前学习到的策略执行动作,并观察其是否能在 H 步内达成指定子目标。

  • 若低层策略成功完成子目标,则按常规流程处理,不生成特殊经验;
  • 若未能在限定步数内完成,则向高层策略添加一条特殊的子目标测试经验:(s, a, r = -H, s', g, \gamma = 0)。其中关键设计包括:
    • 设置惩罚性奖励 r = -H,表示此次尝试浪费了整个时间跨度;
    • 设定折扣因子 \gamma = 0,即不考虑未来状态价值,形成一个固定的即时负收益,避免因低层策略后续能力提升而导致 Q 值波动。

子目标测试对 Q 值的影响分析

结合不同情境,我们可以从以下三种情况理解子目标测试如何引导 Q 值的学习:

  1. 绝对不可达的子目标:即使是理论上最优的低层策略也无法在 H 步内完成。此时子目标测试将持续返回 -H 的惩罚,使对应 Q 值稳定收敛于 -H,促使高层策略主动规避此类无效目标。
  2. 当前可达的子目标:低层策略可以顺利完成。此时测试大多成功,不会触发惩罚经验,Q 值主要由事后经验驱动,基本不受子目标测试干扰。
  3. 理论可达但当前无法实现的子目标:虽属于低层策略能力范围内,但受限于当前学习进度尚不能完成。此时 Q 值表现为大量事后经验的泛化结果与少量测试惩罚的加权平均,其中测试经验的权重最终趋于测试概率 \lambda。随着低层策略能力增强并逐渐掌握该技能,Q 值将逐步上升至其理论最优水平。

综上所述,HAC 以嵌套式分层结构为基础框架,综合利用多种机制实现高效稳定的多层级并行学习:

  • 通过事后动作转移解决层级间策略非平稳性问题;
  • 借助事后目标转移应对层级内部的稀疏奖励挑战;
  • 引入子目标测试机制纠正高层策略对低层能力的认知偏差,保障策略演进的安全性与适应性。

算法流程概述

HAC 为每一层的 Actor 和 Critic 网络采用 DDPG 算法进行训练。其整体伪代码流程如下:

初始化阶段

  • 设定超参数:层级总数 k、最大时间跨度 H、子目标测试概率 \lambda、折扣因子 \gamma
  • 初始化每一层的 Actor 网络与 Critic 网络。

每幕循环执行

  1. 初始化初始状态 s \leftarrow S_{init} 与总目标 g \leftarrow G_{k-1}
  2. 调用训练函数 train_level(k-1, s, g)
  3. 依据 DDPG 算法,并行更新所有层级的 Actor 与 Critic 网络。

其中,核心训练函数 train_level() 负责递归协调各层策略的执行与学习过程。

函数 trainlevel(i, s, g) 是一个递归结构的训练过程,其伪代码逻辑如下所示:

输入参数:层级 i,当前状态 s,目标状态 g

首先对状态和目标进行初始化:
si ← s,表示将当前状态赋值给第 i 层的状态变量;
同时令 gi ← g,即将目标状态赋值给该层的目标变量。

随后进入循环,持续执行最多 H 步,或直到高层目标达成(即满足条件 gn,i ≤ n < k)为止。

在每一步中:

  • 生成动作输出:ai ← πi(si, gi) + noise(仅在非子目标测试模式下添加噪声);
  • 若当前层级 i > 0,则需判断是否对该层的子目标 ai 进行测试;
  • 接着获取后续状态:
    • 如果 i > 0,通过递归调用得到后继状态:s'i ← train_level(i1, si, ai)
    • 否则(即 i = 0),直接执行底层动作 a0 并观测实际的后继状态 s'0

i > 0 且当前动作 ai 尚未成功实现时,进一步处理经验数据:

  • 若该动作已被标记为测试项,则构造一条惩罚性经验元组:

    (s = si, a = ai, r = H, s' = s'i, g = gi, γ = 0),并将其存入经验缓存区。

  • 执行事后动作转移:更新动作目标为实际达到的状态,即 ai ← s'i
  • 生成标准经验条目:

    (s = si, a = ai, r ∈ {1, 0}, s' = s'i, g = gi, γ = γ),写入经验缓存;

  • 同时创建一条待定经验记录:

    (s = si, a = ai, r = TBD, s' = s'i, g = TBD, γ = γ),暂存于待定经验缓存区;

  • 更新全局状态:s ← s'i

最后,在退出前执行事后目标填充机制:遍历待定经验缓存区,将其中所有未完成的条目根据实际达成的状态补全为完整的事后经验,并统一移入主经验缓存区。

函数最终返回递归所得的后继状态 s'i,作为上一层级的输入依据。

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群