论文把干预模块写成一个内部决策接口。给定当前观测 o t o_t ot、语言指令 ℓ \ell ℓ 和策略提出的动作 a t a_t at,模块同时输出动作价值估计、干预分数以及一段恢复动作。部署时,当干预分数低于阈值,系统执行原策略动作;分数超过阈值,则从恢复记忆中检索目标,并调用目标条件恢复策略生成动作块。这个接口把"是否接管"和"接管后怎么做"连接起来,避免了只训练触发器却没有可执行恢复器的问题。
I ψ ( o t , ℓ , a t ) = ( q ^ t , s t i n t , A t r e c ) , a t e x e c = { a t , s t i n t < τ i n t a t r e c , s t i n t ≥ τ i n t \mathcal{I}{\psi}(o_t,\ell,a_t)=\left(\hat q_t, s_t^{\mathrm{int}}, A_t^{\mathrm{rec}}\right),\qquad a_t^{\mathrm{exec}}=\begin{cases}a_t,&s_t^{\mathrm{int}}<\tau{\mathrm{int}}\\a_t^{\mathrm{rec}},&s_t^{\mathrm{int}}\geq\tau_{\mathrm{int}}\end{cases} Iψ(ot,ℓ,at)=(q^t,stint,Atrec),atexec={at,atrec,stint<τintstint≥τint
真实机器人任务常常只在终点给一个成功或失败结果,直接用这个稀疏奖励训练干预判别器,模型很难知道中间哪一步已经朝正确方向移动。UniIntervene 的公开实现先为每条轨迹构造 normalized time-to-go 进度标签。成功轨迹的第 t t t 步标签是 t / ( T − 1 ) t/(T-1) t/(T−1),从零逐渐增加到一;失败轨迹的归一化值保持为零,原始值使用 -500 作为明显的失败信号。这个标签不是环境真实奖励,而是一个用于学习"成功轨迹通常怎样变好"的代理监督。它让价值函数能够在终点奖励之外提供每一步的相对进展刻度。
python复制代码
def label_episode(transitions, fail_value=-500):
"""为一条 episode 写入 raw_value 与 raw_norm。"""
T = len(transitions)
denom = max(T - 1, 1)
success = is_success(transitions)
if success:
for t, tr in enumerate(transitions):
tr["raw_value"] = t - (T - 1)
tr["raw_norm"] = 1.0 if T == 1 else float(t / denom)
else:
for tr in transitions:
tr["raw_value"] = fail_value
tr["raw_norm"] = 0.0
return transitions
机器人在正常完成任务时也会短暂进入低价值状态。插入动作可能先退开再对齐,抓取柔性物体时可能松手重抓,擦拭任务则可能为了保持接触而沿边缘移动。若系统看到一次价值下降就接管,恢复策略会打断本来有机会成功的动作序列。UniIntervene 使用长度为八的历史窗口,把最近的价值增量放在一起观察,只有当实际增量持续低于期望进展速率时,风险才会累积。风险还乘以 1 − V t 1-V_t 1−Vt,任务越接近完成,剩余进展越少,短暂波动越不应触发强制恢复。
6.2 TVR 公式与公开实现
R t = ( 1 − V t ) ∑ i = 0 K − 1 γ r i ( ϵ − Δ V t − i ) , Δ V i = V i − V i − 1 R_t=(1-V_t)\sum_{i=0}^{K-1}\gamma_r^i\left(\epsilon-\Delta V_{t-i}\right),\qquad \Delta V_i=V_i-V_{i-1} Rt=(1−Vt)i=0∑K−1γri(ϵ−ΔVt−i),ΔVi=Vi−Vi−1
在公开配置中, K = 8 K=8 K=8、 ϵ = 0.005 \epsilon=0.005 ϵ=0.005、 γ r = 0.9 \gamma_r=0.9 γr=0.9,干预阈值为 0.5 0.5 0.5。风险头接收未来潜变量和价值历史编码,训练目标是上式计算出的连续 TVR;同时,Mining 阶段用下降、平台和骤降三类规则生成离线干预标签,VQ1 可使用 focal loss 处理干预点远少于普通点的类别不平衡。这里的设计把"风险估计"和"触发分类"放在同一条价值趋势上,但它们不完全等价:连续 TVR 告诉模型停滞程度,离散标签则告诉模型哪些时刻应当被标记为接管点。
python复制代码
def _compute_tvr_target(values_hist, gamma, epsilon):
"""TVR_t = (1 - V_t) * sum gamma^i * (epsilon - delta_i)"""
K = len(values_hist) - 1
V_t = float(values_hist[-1])
total = 0.0
for i in range(K):
delta_i = float(values_hist[K - i]) - float(values_hist[K - i - 1])
total += (gamma ** i) * (epsilon - delta_i)
return float((1.0 - V_t) * total)
这段函数来自 research_impl/hil_vlm_train.py。它按照从近到远的顺序累计短缺量,因此最新一步的短缺权重最高。实现中没有对风险结果强制截断,具体阈值和正负样本处理由配置与训练头决定;这意味着复现时不能只抄公式,还要同时读取 history_window、epsilon、gamma_r、threshold 和损失类型。一个实际的工程风险是代理价值尺度发生漂移后, 1 − V t 1-V_t 1−Vt 与 ϵ \epsilon ϵ 的意义会变化,所以 VF 训练、Annotation 和 VQ1 训练之间必须保存来源信息,不能把不同版本的价值预测混在同一个缓冲区里。