GCBC
输入输出
输入:
- 专家轨迹数据集 $\mathcal{D} = { \tau^1, \tau^2, \dots, \tau^N }$
- 其中每条轨迹 $\tau = {(s_0, a_0, s_1), (s_1, a_1, s_2), \dots, (s_T, a_T, s_{T+1})}$
- 策略网络 $\pi_\theta(a|s, g)$ 和初始参数 $\theta$
输出:
- 训练好的目标条件策略 $\pi_\theta$
流程
- 采样一条专家轨迹。
- 选取当前状态 $s_t$。
- 向后看,选取未来状态 $s_{t+k}$ 作为目标 $g$。
- 喂入网络 $\pi_\theta(s_t, g)$。
- 监督网络输出的动作,使其尽可能接近专家在该时刻的真实动作 $a_t$。
优缺点
优点:
- 简单:没有复杂的价值函数、没有 RL 的探索难题
- 稳定:纯监督学习,训练很稳定
- 可泛化:因为目标是条件化的,可以组合没见过的初始状态+目标
局限:
- 分布外问题:如果测试时的目标状态与训练时差异太大,性能会下降
- 需要大量数据:毕竟是模仿学习,需要足够多的专家示范
- 不能处理没见过的复杂任务组合:如果训练时没见过"从 X 到 Y"这种组合,可能会失败
GCIQL
结合了 目标条件强化学习 (GCRL) 与 隐式 Q 学习 (IQL) 的离线强化学习算法。
核心逻辑在于:在不访问环境、不进行采样的情况下,通过对现有数据集进行“期望分位数回归 (Expectile Regression)”,拟合出该数据集在通往特定目标时的最优价值上限
重点
重点一:IQL的解决方案?
离线学习的困境: 在离线场景下,我们无法计算 maxaQ(s,a),因为如果某个动作 a 不在数据集里,模型对它的 Q 估计可能是虚高的(过估计),直接取 max 会导致训练崩溃。
IQL 的解决方案: 我们不去寻找那个可能不存在的“最大值”,而是去看数据集里已有的动作。如果一个状态下有 100 个历史动作,我们不取这 100 个动作的平均分,而是取前 10% 的高分作为 V 的估计。这种“偏向高分”的估计就是所谓的乐观估计。
重点二:目标重采样 (Goal Relabeling)
虽然代码中没有直接展示采样逻辑,但 get_config 中的 value_p_trajgoal 等参数揭示了关键:
- 在训练时,我们会把未来的状态 $s_{t+k}$ 伪装成目标 $g$。
- 逻辑纠错:很多初学者认为目标必须是环境预设的。但在 GCIQL 中,任何经历过的状态都可以是目标,这极大提高了数据集的利用率。
重点三:Expectile ($\tau$) 的权重
代码中的 expectile_loss 函数实现了这一逻辑:
$$L_V(V) = \mathbb{E}_{(s, a) \sim \mathcal{D}}[f_\tau(Q(s, a) - V(s))]$$
其中损失函数 $f_\tau(\delta)$ 的定义为:
$$f_\tau(\delta) = |\tau - \mathbb{I}(\delta < 0)|\delta^2$$
通过设置参数 expectile(即 $\tau$,代码中通常为 0.7 或 0.9),损失函数会对正负误差施加不对等的惩罚:
- 当 $Q > V$ 时(即 $V$ 估低了):损失会被乘以 $\tau$(如 0.9)。惩罚非常重,强迫 $V$ 必须涨上来。
- 当 $Q < V$ 时(即 $V$ 估高了):损失会被乘以 $(1 - \tau)$(如 0.1)。惩罚很轻,我们容忍 $V$ 比一部分 $Q$ 值高。
- 如果 $\tau = 0.5$,$V$ 变成了 $Q$ 的平均值,算法退化为普通的行为克隆 (BC)。
- 如果 $\tau \to 1.0$,$V$ 试图拟合 $Q$ 的最大值,容易受到噪声和异常值的影响。
- 通常取 0.7 - 0.9,在“提取精华”和“抵御噪声”之间取得平衡。
GCIVL
GCIVL 的核心逻辑分为两步:隐式价值学习(学习环境有多好)和优势加权行为克隆(学习如何达到目标)
HIQL
训练逻辑:如何从离线数据里学习?
HIQL 依然遵循 IQL 的“择优录取”思想,但分两步走:
A. 价值函数 $V(s, g)$:评估大局
它首先学习在当前数据集下,从 $s$ 到 $g$ 到底有多难。
- 代码中的
value_loss:使用 Expectile Loss 提取数据集中表现最好的路径价值。
B. 底层训练 (Low Actor):学习“怎么走”
- 它观察数据:当一个人从 $s$ 走到 $s'$,执行了动作 $a$。
- 如果这次移动让价值 $V$ 提升了(
adv = nv - v为正),说明这个动作 $a$ 很好。 - 员工就会加强学习:在 $s$ 下,为了达到去往 $s'$ 的路标,我应该做动作 $a$。
C. 高层训练 (High Actor):学习“定什么目标”
- 它观察轨迹中的中间点(子目标)。
- 如果选择某个中间态作为子目标,能显著提升通往最终目标的价值(
adv = nv - v,注意这里的nv是子目标的价值)。 - 经理就会加强学习:在这种情况下,定这个中间态作为子目标是明智的。
推理流程:实战中怎么跑?
想象机器人要从房间 A 去房间 C,中间经过房间 B。
- 高层决策:经理看了一眼 A(当前)和 C(终点),输出一个向量 $\phi_B$(代表“往房间 B 走”的抽象信号)。
- 底层执行:员工拿到 $\phi_B$,开始疯狂输出动作(左转、前进、避障)。
- 循环:员工跑了 25 步后,经理再次抬头看路,发现已经到房间 B 了,于是输出下一个信号 $\phi_C$。