DAgger与交互式模仿学习_ACT学习笔记

DAgger 与交互式模仿学习:从你的追问走到 ACT action chunk

阅读路线:先弄清"状态、动作、标签到底是什么",再看 DAgger 为什么聚合数据、专家怎样参与,最后把人类接管产生的短纠错轨迹接到 ACT。文中用 原始设定 、理解用简化 、机器人实践 标出不同层次。公式使用常见 Markdown 数学语法 $...$ / $$...$$。

0. 先把符号和场景定住

以机械臂抓取工件并放入夹具为例。 s t s_t st 是时刻 t t t 的环境状态(可包含不可直接观测的量); o t o_t ot 是策略实际获得的观测,如图像与机器人关节状态; a t a_t at 是下发给控制接口的动作; s t + 1 s_{t+1} st+1 是执行动作后环境演化出的下一状态。 π θ \pi_\theta πθ 是待学习策略, π ∗ \pi^* π∗ 是专家策略;上标 ∗ * ∗ 表示专家给出的目标动作,不表示"下一状态"。用状态表述算法时写 π ( s t ) \pi(s_t) π(st),写真实视觉机器人时可把输入换成 o t o_t ot 或观测历史。

s t → a t s t + 1 , a t ∗ = π ∗ ( s t ) . s_t\xrightarrow{a_t}s_{t+1},\qquad a_t^*=\pi^*(s_t). stat st+1,at∗=π∗(st).

你问的概念 在这份笔记中的含义 机械臂例子
state / observation 环境真实状态 / 策略看见的输入 物体真实姿态 / 相机图像与关节读数
action 控制接口接收的命令,不是下一状态 目标 joint position、joint velocity、EEF 位姿增量、夹爪命令;也可因接口不同而是加速度或力矩
next state 动作作用于机器人和环境后的结果 夹爪移动后的真实位姿、工件接触状态
expert label 专家在当前状态建议的动作 人类遥操作命令或程序控制器输出

所以,"动作和下一刻状态都会被记录"与"已经有正确标签"是两回事:Student 执行时记录的 a t S a_t^S atS 是它实际做了什么 ;DAgger 所需 a t ∗ a_t^* at∗ 是专家认为在同一输入下应该做什么。二者可能不同。下一个状态还受动力学、接触、延迟和噪声影响,不能直接当动作标签。

1. 你问:BC 为什么会有 distribution shift?

原始设定 行为克隆(BC)从专家轨迹收集 D 0 = { ( s t , a t ∗ ) } D_0=\{(s_t,a_t^*)\} D0={(st,at∗)},在这些样本上拟合 π θ \pi_\theta πθ。专家访问的状态分布记为 d π ∗ d_{\pi^*} dπ∗,训练好的 Student 自己执行时访问的分布记为 d π θ d_{\pi_\theta} dπθ。小动作误差会改变后续状态,错误可能累积,使 d π θ d_{\pi_\theta} dπθ 偏离 d π ∗ d_{\pi^*} dπ∗。模型此时需要处理的偏离状态,恰恰在初始演示里稀少。

理解用简化 对准夹具时偏了 2 mm → 下一帧看到的接触角度与演示不同 → 继续照熟悉的动作执行 → 偏差扩大。这是动作导致的状态分布偏移;不是只有随机初始位置或人工扰动才会产生"没见过的状态"。

2. 你问:rollout 是什么?和 trajectory 有何区别?

rollout 强调"让某个策略在环境中实际跑起来"的采集过程;trajectory 强调这次运行得到的有序记录,例如 τ = ( s 0 , a 0 , s 1 , a 1 , ... , s T ) \tau=(s_0,a_0,s_1,a_1,\ldots,s_T) τ=(s0,a0,s1,a1,...,sT)。一个 rollout 可以产生一条轨迹;任务被重置后再跑,会产生另一条。若中途切换 Student / Human,同一条记录也可包含不同控制来源,必须逐步标记谁执行、谁提供专家标签。

3. 你问:专家就是人吗?为什么 Student 跑出的状态还要专家标注?

原始设定 π ∗ \pi^* π∗ 是可对遇到的状态给动作的策略或 oracle ,可由人、程序控制器、规划器或模拟器中的特权控制器实现。最初人类从头演示时,人在自己访问的状态下执行动作,天然得到 D 0 D_0 D0。第二轮由 Student 执行,到达偏离状态 s t ′ s_t' st′ 后,日志虽有 ( s t ′ , a t S , s t + 1 ′ ) (s_t',a_t^S,s_{t+1}') (st′,atS,st+1′),却没有专家目标 a t ∗ = π ∗ ( s t ′ ) a_t^*=\pi^*(s_t') at∗=π∗(st′);因此还要询问专家。

专家标注可以在线获得,也可以在完整记录足以重现决策条件时事后标注;真实接触任务中,静态回放未必能提供触觉、时序与操控感,事后人工精确给连续动作也可能很难。这里不存在"原始 DAgger 必须事后统一打标签"的规定。

你问"物理世界的 s s s 几乎不重复, π ∗ \pi^* π∗ 遇到没见过的状态怎么办":专家策略是从输入到动作的函数/决策过程 ,不是按状态精确索引的表。人看新画面实时判断;程序根据新状态计算控制命令。能否正确处理分布外状态,仍取决于专家能力与可观测性,并非定义上自动保证。训练集 D 0 ∪ D 1 ∪ ⋯ D_0\cup D_1\cup\cdots D0∪D1∪⋯ 也不要求状态重复;监督模型要从不同状态泛化。数据集很大时可以放磁盘、按批训练、做采样;数据总量增加不等于所有样本同时占满显存。

4. 你问: D 0 ∪ D 1 D_0\cup D_1 D0∪D1 聚合了,为什么损失里只写 a ∗ a^* a∗?

原始设定 初始数据 D 0 D_0 D0 是专家演示中的状态和专家动作。第 i i i 轮用当前策略采样新状态,向专家取这些状态的动作,得到 D i = { ( s , a ∗ ) ∣ s 来自本轮 rollout } D_i=\{(s,a^*)\mid s\text{ 来自本轮 rollout}\} Di={(s,a∗)∣s 来自本轮 rollout};再聚合:

D a g g ( i ) = D 0 ∪ D 1 ∪ ⋯ ∪ D i , π i + 1 = Train ⁡ ( D a g g ( i ) ) . D_{\mathrm{agg}}^{(i)}=D_0\cup D_1\cup\cdots\cup D_i,\qquad \pi_{i+1}=\operatorname{Train}(D_{\mathrm{agg}}^{(i)}). Dagg(i)=D0∪D1∪⋯∪Di,πi+1=Train(Dagg(i)).

这里的 ∪ \cup ∪ 表示保留各轮训练样本的聚合(重复样本如何存储是实现细节)。a ∗ a^* a∗ 是每条样本的标签类型,不是数据集编号 : D 0 D_0 D0 里也是 a ∗ a^* a∗, D 1 D_1 D1 里也是 a ∗ a^* a∗。可把目标简写为 min ⁡ π ∑ ( s , a ∗ ) ∈ D a g g ℓ ( π ( s ) , a ∗ ) \min_\pi\sum_{(s,a^*)\in D_{\mathrm{agg}}}\ell(\pi(s),a^*) minπ∑(s,a∗)∈Daggℓ(π(s),a∗); ℓ \ell ℓ 是动作预测误差。Student 动作 a S a^S aS 可记录用于分析,却不能仅因它被执行就当作正确监督标签。

text 复制代码
Human 演示 → D0 → 训练 π1
                    ↓
              π1 rollout → 新状态 → Expert 标注 → D1
                    ↓                         ↓
                 再训练 ←────────────── D0 ∪ D1

5. 你问: β \beta β 混合策略意味着每步让人随机接管吗?

原始设定 经典 DAgger 用 β i \beta_i βi 控制第 i i i 轮采样时使用专家动作的概率,形式常写为 π i = β i π ∗ + ( 1 − β i ) π ^ i \pi_i=\beta_i\pi^*+(1-\beta_i)\hat\pi_i πi=βiπ∗+(1−βi)π^i;这里的"加法"表示以概率选择策略执行动作 ,不是数值上把两条动作向量线性相加。 π ^ i \hat\pi_i π^i 是当前学得的策略, β i \beta_i βi 通常逐轮下降。无论哪一方实际控制,采到的状态仍需专家动作标签以训练下一轮。

机器人实践 当 π ∗ \pi^* π∗ 是有权限实时运行的程序,按时间步切换较容易实现;当它是人,逐 timestep 随机切换会遇到注意力、反应延迟、操作连续性与安全问题。因此,人类机器人交互常改用整段接管、明确交还、选择性询问等机制。不能把理论上的混合策略直接说成人每帧掷硬币操作,也不能推断"原生 DAgger 的专家只能是程序"。

6. 你连续问的几种交互式方法,各解决什么成本?

方法 主要决策 与人类参与有关的边界
DAgger 原始设定 在 Student 访问的状态上拿专家标签并聚合 专家查询频繁;人实时输出连续标签很吃力
HG-DAgger 论文机制 Human-gated:人认为需要时主动接管,形成纠错示范 让人真正控制以改善交互和标签质量;接管时机仍依赖人监测
SafeDAgger 论文机制 用学得的 safety policy / estimator 预测是否需查询专家 降低查询次数;"Safe"不是物理安全保证,Human 仍可能需要可快速响应
LazyDAgger 论文机制 显式考虑 Human/Robot 切换成本,决定 takeover 与 release 接管后不必一见"安全"就立即交还;切换次数与人控制时长是不同指标
ThriftyDAgger 论文机制 在专家干预预算下,用 novelty 与 risk 等门控决定何时请求协助 兼顾任务表现与人类负担;并非只用动作差异或只用不确定性

你问 SafeDAgger 的关键点是对的:减少 query 频率不等于人可以离开现场。若系统只能在危险已临近时发出请求,人类响应时间可能长于剩余安全时间;是否能离开由独立安全控制、停机机制和响应时间决定。你问 LazyDAgger 的关键点则是:一次接管有固定的上下文切换成本,不能只统计"人控制了几个 timestep"。

你问:active learning 是"学习该学什么",还是自动挑高价值样本?

是后者:模型或采集策略选择值得花标注成本的待标注样本 ,拿到标签后训练。一个 acquisition value(选样分数)可参考 uncertainty(模型不确定)、diversity(覆盖不同样本)、expected usefulness(预计能带来多少学习收益);在机器人还需考虑风险与专家可达性。它们是常见设计思路,并无通用的固定加法公式。ThriftyDAgger 有主动选择何时请求专家的思想,但它的 novelty/risk 门控及预算机制应以其论文为准,不能把普通分类主动学习的公式冒充其原始公式。

7. 最后串一次:ACT 抓取放置从初始演示到迭代训练

机器人实践示例;不是经典 DAgger 或 ACT 论文共同规定的唯一实现 任务是"抓工件 → 移动 → 对准夹具 → 插入"。设 ACT 的 action chunk 长度为 H H H; A t ∗ = a t ∗ , a t + 1 ∗ , ... , a t + H − 1 ∗ A_t^*=a_t\^\*,a_{t+1}\^\*,\\ldots,a_{t+H-1}\^\* At∗=at∗,at+1∗,...,at+H−1∗ 表示从时刻 t t t 开始的 H H H 步目标动作序列。ACT 预测的是动作序列,不保证一次把预测的 H H H 步全部盲目执行;实际执行可按系统频率重规划或平滑。

text 复制代码
① Human 完整示范 → D0
② 用 D0 做 BC:从 (o_t, A_t*) 训练 ACT π1
③ π1 自主 rollout → 对准/插入阶段偏离演示分布
④ Human takeover:停止 Student 控制,丢弃尚未执行的旧 chunk
⑤ Human 纠正并继续一段有意义的动作 → corrective trajectory
⑥ 重建可用 ACT 训练窗口,记录每步动作来源与有效标签 mask
⑦ D0 ∪ Dcorr;按需要给稀少纠错片段更高采样概率
⑧ 重新训练/微调 → 评估 → 再 rollout → 重复

为什么丢弃旧 chunk? 例如时刻 t = 200 t=200 t=200 预测了 A ^ 200 \hat A_{200} A^200,到 t = 210 t=210 t=210 人接管。尚未执行的后续预测建立在 Student 原计划的轨迹上;人类动作改变了实际状态。恢复 Student 时要根据新的观测重新预测。旧预测可保留在日志用于诊断,但不应继续当控制命令执行,更不能自动当专家标签。

你问的棘手处:Human intervention 比 chunk 短怎么办?

假设 H = 100 H=100 H=100,Human 只控制 t = 20 , ... , 29 t=20,\ldots,29 t=20,...,29 共 10 步。拿 o 20 o_{20} o20 训练时,目标本应覆盖 a 20 , ... , a 119 a_{20},\ldots,a_{119} a20,...,a119。 a 30 , ... , a 119 a_{30},\ldots,a_{119} a30,...,a119 若是 Student 后续动作,虽然可凑足长度,却不是专家给出的正确后缀。可选处理如下:

处理 标签语义 适用条件 / 风险
延长 Human 纠错片段,或只取足长专家连续窗口 整个 chunk 都是可信专家动作 人的操作成本更高;短片段会少产生训练窗口
使用有效位 mask,只监督 Human 已标注步 仅已标注位置承担监督损失 训练实现须支持 mask;原 ACT 目标中的重建、潜变量及边界处理需逐项适配
将 Human 前缀与 Student 后缀直接拼成"专家 chunk" 语义错误 后缀并未被专家认可,不能默认当作 A t ∗ A_t^* At∗

一种示意性 masked loss 是

L t = ∑ j = 0 H − 1 m t , j   ℓ ( a ^ t + j , a t + j H ) max ⁡ ( 1 , ∑ j = 0 H − 1 m t , j ) , \mathcal L_t=\frac{\sum_{j=0}^{H-1}m_{t,j}\,\ell(\hat a_{t+j},a_{t+j}^H)}{\max(1,\sum_{j=0}^{H-1}m_{t,j})}, Lt=max(1,∑j=0H−1mt,j)∑j=0H−1mt,jℓ(a^t+j,at+jH),

其中 j j j 是 chunk 内偏移; m t , j = 1 m_{t,j}=1 mt,j=1 表示该位置有可信 Human 动作标签 ,否则为 0; a ^ t + j \hat a_{t+j} a^t+j 是模型在该位置的预测; a t + j H a_{t+j}^H at+jH 是人类动作,只有 m t , j = 1 m_{t,j}=1 mt,j=1 时才被读取。此式仅说明监督 mask 的思想,不是 ACT 原论文给短接管数据规定的原始损失。窗口不能越过 episode 重置;混合控制片段还要保留时间戳、动作接口与控制来源,防止错误拼接。

聚合之后为什么还要加权采样?

若 D 0 D_0 D0 有大量正常示范而 D c o r r D_{\mathrm{corr}} Dcorr 很少,简单均匀抽样可能让纠错状态在训练中出现太少。可选工程做法 可以提高纠错片段采样概率,或按片段来源设置权重,但应在独立验证集上同时检查正常成功率和失败恢复率,避免过采样导致正常动作退化。加权采样是这条 ACT 实践链的选择,不是原始 DAgger 的必要步骤。

8. 一页回顾:你的问题对应哪条逻辑

追问 最短回答
action 是下一状态吗? 不是。动作是命令;下一状态是环境执行后的结果。
Student 的日志已有动作,为何还问专家? 日志是 a S a^S aS;监督目标要同一状态下的 a ∗ a^* a∗。
rollout 是什么? 策略在环境中实际运行;trajectory 是运行产生的时序记录。
a ∗ a^* a∗ 是否代表只用 D 1 D_1 D1? 否。 D 0 D_0 D0、 D 1 D_1 D1 都有专家标签 a ∗ a^* a∗,聚合后一起训练。
连续状态不重复,专家怎么处理? π ∗ \pi^* π∗ 是可对新输入作决策的函数或人类行为,不是查表。
β \beta β 混合是否要求人每帧切换? 理论采样可这样表达;真实人工接管通常按片段进行。
SafeDAgger 让人不用待机了吗? 查询减少;能否离开取决于响应时间与独立安全机制。
Active learning 的"主动"是什么? 主动选择高价值待标注样本。
短 Human 纠错如何喂给 ACT? 用足长可信窗口或按有效步 mask;不要把 Student 后缀冒充专家。

原始资料与边界

相关推荐
Canmag 兴隆磁性1 小时前
回复磁导率 μ_R:永磁体在动态磁路中的关键参数
开发语言·学习·r语言·永磁材料·充磁·磁导率
He BianGu2 小时前
【笔记】C# 中BindingFlags的详细作用
笔记·c#
lengxuenong2 小时前
区间覆盖问题 · 简明学习手册1
java·学习·算法
AI视觉网奇2 小时前
turtle 入门教程笔记
笔记
跨知易知识产权2 小时前
美国专利确权是什么,和专利诉讼有什么不一样?
笔记
杨逢昌工厂6S管理2 小时前
126-杨逢昌6S三环体系:越做越乱的现场熵增机理与基准化治理——一线现场诊断笔记
经验分享·笔记·职场和发展·学习方法
悟道书生2 小时前
若依 RBAC 权限控制学习笔记
java·网络·笔记·sql·学习·vue
Be for thing3 小时前
PyTorch自动求导Autograd详解|requires_grad、backward、grad、梯度清零
pytorch·学习·1024程序员节
陈哈哈11113 小时前
折腾了半天,总算把 Vim 9.2 装明白了
笔记