菜鸟AI - 让提示词生成更简单! 全站导航 全站导航
AI工具安装 新手教程 进阶教程 辅助资源 AI提示词 热点资讯 技术资讯 产业资讯 内容生成 模型技术 AI信息库

已有账号?

首页 > AI教程 > DAgger数据集聚合:模仿学习原理与步骤
进阶教程 模仿学习原理与步骤

DAgger数据集聚合:模仿学习原理与步骤

2026-06-04
阅读 0
热度 0
作者 菜鸟AI编辑部
摘要

摘要

数据集聚合(DAgger)通过迭代让策略在环境中运行,收集其自身产生的状态并由专家标注,

想象一个场景:机器人跟着专家学行走,刚开始几步还挺稳,但一旦自主迈步,姿态就会逐渐变形,最后摔得四仰八叉。这不是机器人能力不足,而是行为克隆(BC)的固有缺陷——训练时它只见过专家演示的“完美状态”,一旦自己上场,任何微小偏差都会让它闯入从未见过的状态空间,接着一步错、步步错。

根源在哪?核心在于训练分布与测试分布之间的鸿沟。专家演示中的状态空间是精心规划的,而策略自主执行时产生的状态轨迹几乎必然偏离这片“安全区”。误差逐帧累积,最终彻底崩盘。

DAgger:用闭环对抗分布偏移

针对这一痛点,数据集聚合(DAgger)提供了一套极具实操性的方案:与其让策略在陌生状态中盲目猜测,不如让专家直接在策略自己跑出的状态上打标签,逐步将训练分布扩展到策略实际会访问的状态空间。

本质上是闭环迭代:训练一个策略 → 让该策略在环境中自主执行 → 将执行产生的状态交给专家标注 → 合并新旧数据 → 重新训练。每一轮迭代都在精准补强策略未来容易出错的区域。

数学保证:从 O(T²ϵ) 到 O(Tϵ)

从理论视角看,行为克隆的累积误差上界为 O(T²ϵ)(T为轨迹长度),其中的平方项会随轨迹变长急剧放大。而DAgger在线性近似下能将上界压缩至 O(Tϵ)。

直观解释:每轮迭代都在针对性加固策略的真实“短板”,而不是闭门造车式地优化一个仅在理想状态下正确的模型。

算法走一遍

DAgger的运行流程可通过以下伪代码拆解:

算法:DAgger
输入:专家策略 π_expert,环境 env,迭代次数 N
输出:策略 π_θ

1. D_0 ← 用 π_expert 采集 n 条轨迹,得到 {(s, π_expert(s))} 数据集
2. for i = 0 to N-1:
    2.1 在 D_i 上训练行为克隆策略 π_i
    2.2 用 π_i 在环境中执行 n 条轨迹,收集状态序列 {s_t}(注意:仅收集状态,不记录 π_i 的动作)
    2.3 对每个收集到的状态 s_t,查询专家动作:a_t = π_expert(s_t) → 得到新标注数据 D_new = {(s_t, a_t)}
    2.4 合并:D_{i+1} = D_i ∪ D_new
3. 在 D_N 上做最终训练,返回 π_θ

这里的 π_i 就是标准的行为克隆模型——用当前数据集 D_i 执行一次监督训练:

训练 π_i(D_i):
策略网络 π = MLP() 或 ResNet()
优化器 = Adam(π, lr=1e-3)
for epoch = 1 to N:
    for (s, a) in D_i: # D_i 是累积数据集
        a_pred = π(s)
        loss = MSE(a_pred, a)  # 连续动作
        # 或 CrossEntropy     # 离散动作
        loss.backward()
        optimizer.step()
    # 在验证集上早停
    if val_loss 连续上升: break
返回 π

关键设计决策:如何在现实中落地

理论验证后,实际部署时需仔细权衡以下决策点。常见做法及理由如下表所示:

决策点 常见做法 原因
专家标注比例 不需要 100%,可按概率 β 随机标注 降低标注成本,β 可随迭代递减
迭代次数 通常 3-5 轮即可收敛 边际收益快速递减
每轮数据量 与初始数据集等量 保证新状态有足够权重
是否保留旧数据 保留全部 旧数据防止遗忘

下面是带随机标注的DAgger实现,标注概率随迭代递减,特别适合有限标注预算的场景:

for i = 0 to N-1:
    π_i = train_BC(D_i)
    new_data = []
    for episode = 1 to n:
        s = env.reset()
        while not done:
            a = π_i(s)         # 策略自主选择动作
            s_next, _, done, _ = env.step(a)
            if random() < β_i: # β_i 随迭代递减(如 β_i = 1.0 / (i+1))
                a_expert = π_expert(s)  # 仅在这些状态上请求专家
                new_data.append((s, a_expert))
            s = s_next
    D_{i+1} = D_i ∪ new_data

代价:优势与劣势并存

DAgger的优势不言而喻:

  • 理论上有收敛保证,并非凭运气。
  • 实践中,2-3轮迭代就能显著改善BC的表现。
  • 实现极其简洁,在BC基础上加一个循环即可运行。

劣势也同样突出:

  • 需要专家在线,这是最大的瓶颈——真实场景中让专家随时待命的成本往往高到难以承受。
  • 迭代早期策略质量差,可能产生危险或无意义的状态,给专家带来极重的标注负担。
  • 若专家标注本身存在噪声(如手抖、疲劳),错误标注会污染整个数据集。

数据合并:一个常被忽视的细节

数据合并方式至关重要,错误的选择可能导致灾难性后果:

D{i+1} = Di ∪ D_new  // 保留所有历史数据(推荐)
错误做法:D{i+1} = D_new  // 仅使用新数据 → 灾难性遗忘

迭代间是否重新初始化网络

策略 特点 建议
每轮重新训练(从头初始化) 稳定,但耗时 ✅ 推荐
在上一轮 π_i 基础上继续训练 快速,但可能遗忘旧数据 ⚠️ 数据量小时可尝试

当数据集变大:工程上的训练策略

随着迭代进行,D_i 会持续膨胀,训练时间也水涨船高。工程上有两条常见路径:

  • 固定采样:每轮随机采样固定数量样本(如10000条),防止训练时间无休止增长。
  • 权重采样:给新数据赋予更高采样权重,类似 priority replay,让模型更多地从新暴露的“弱点”中学习。

工程上的实用变体:没有专家怎么办?

鉴于“专家在线”成本过高,实际工程中衍生出几种降低标注成本的变体:

变体 做法 适用场景
β-Dagger 随机子采样标注,β 逐轮递减 标注预算有限
Reverse DAgger 从简单到困难的课程学习顺序 专家标注成本高
Filter DAgger 仅在策略不确定的状态上请求标注(低置信度采样) 大幅减少标注量
GAIL(无标注) 用判别器替代专家,无需人工标注 无法获得专家标注时

从BC到DAgger,表象是从“模仿”迈向“交互式学习”的一小步,但正是这一小步,往往带来性能上的巨大跃升。

来源:互联网

免责声明

本网站新闻资讯均来自公开渠道,力求准确但不保证绝对无误,内容观点仅代表作者本人,与本站无关。若涉及侵权,请联系我们处理。本站保留对声明的修改权,最终解释权归本站所有。

同类文章推荐

相关文章推荐

更多