ACT、Diffusion Policy 面试题解析

📅 2026/7/17 6:22:21
ACT、Diffusion Policy 面试题解析
ACTAction Chunking with Transformers和 Diffusion Policy扩散策略是目前具身智能Embodied AI和机器人模仿学习Imitation Learning领域最经典、最主流的两个基线模型。在面试中通常会重点考察对多模态动作分布建模、时序依赖处理、以及模型工程落地的理解。一、 核心原理与架构对比类1. 请对比 ACT 和 Diffusion Policy 的核心思想、优缺点及适用场景。参考答案ACT基于CVAE条件变分自编码器架构。通过引入隐变量 z 来建模动作的多峰分布结合 Action Chunking 预测动作序列。优点推理速度极快一次前向传播即可输出一个 Chunk实时性好架构相对简单训练稳定。缺点CVAE 的生成能力上限受限于高斯假设在处理极度复杂、多峰且形状不规则的动作分布时可能会出现动作模糊Blurring。Diffusion Policy (DP)将动作生成建模为条件去噪扩散过程。通过迭代去噪从纯噪声中逐步恢复出动作序列。优点生成质量极高能完美拟合复杂的多峰分布生成的动作轨迹非常平滑符合物理直觉在长视野Long-horizon复杂任务上表现优异。缺点推理需要多步迭代延迟较高训练和调参如噪声调度相对复杂。适用场景ACT 适合对实时性要求高、动作相对连贯的中低频任务如桌面抓取DP 适合对动作精度、平滑度要求极高或任务逻辑极其复杂的场景如精密装配、柔性物体操作。2. 为什么在机器人模仿学习中直接回归动作如 MSE Loss效果不好ACT 和 DP 是如何解决这个问题的考察点对模仿学习核心痛点多峰分布坍塌的理解。参考答案MSE 的缺陷当面对多模态动作分布时例如桌上有个障碍物机器人可以从左边绕也可以从右边绕MSE Loss 会迫使模型预测这两个动作的均值。这个“均值”动作往往会直接撞上障碍物导致任务失败。ACT 的解决方式引入 CVAE 的隐变量 z。在推理时从先验分布中采样不同的 zDecoder 会基于不同的 z 生成完全不同的动作分支从而避开均值化陷阱。DP 的解决方式扩散模型在去噪过程中模型会根据当前条件观测被吸引到不同的数据流形即不同的动作模式上从而自然地输出多峰分布中的某一个合理动作。3. ACT 中的 Action Chunking动作分块具体解决了什么问题Chunk size 应该怎么选考察点对时序误差累积的理解及超参调优经验。参考答案解决的问题误差累积Compounding Error如果每次只预测单步动作微小的预测误差会在多步执行后迅速放大。预测一个 Chunk如 10 步可以大幅减少模型推理次数降低累积误差。时间相关性Temporal Correlation机器人的动作在时间上是高度连续的。Chunking 强制模型在生成动作时考虑未来的时序依赖使动作更平滑。Chunk size 的选择这是一个 Trade-off。太大模型难以预测长远的未来导致 Chunk 后半段动作质量下降且机器人对环境的突发变化反应迟钝缺乏闭环反馈。太小失去了减少误差累积的优势退化为单步预测。经验值通常在 10 到 100 步之间对应 0.5秒 - 5秒具体取决于任务的控制频率和动态变化程度。4. 简述 ACT (Action Chunking with Transformers) 的网络结构和 Loss 函数解释 KL 散度在损失函数中的作用如果 KL 散度太大或太小会导致什么问题如何缓解考察点前者是对 ACT 论文细节的掌握KL散度问题则是对 VAE 底层数学原理及训练 Trick 的掌握高频考点答题要点结构ACT 本质上是一个条件变分自编码器CVAE结合 Transformer。它包含一个 Encoder处理观测和一个 Decoder生成动作 chunk。引入了一个低维隐变量 z。前向过程观测通过 Encoder 得到后验分布采样得到 zz 加上位置编码后输入 Transformer Decoder解码出动作 chunk。Loss 函数包含两部分。一是动作重建损失如 L1 Loss计算预测动作与 GT 的差距二是KL 散度损失约束后验分布接近先验分布保证隐空间的平滑性。KL散度在损失函数中的作用KL 散度用于正则化隐空间迫使 Encoder 输出的后验分布接近先验分布通常是标准高斯分布保证了推理时从采样出的 z 是有效的。KL 太大模型会过度依赖先验而忽略观测 x 和真实动作 a 的信息导致后验坍塌Posterior Collapse生成的动作变得模糊、缺乏细节。KL 太小隐空间变得不连续存在大量空洞。推理时从先验采样的 z 很容易落入空洞导致 Decoder 生成无效或危险动作。缓解方案KL 退火KL Annealing训练初期将 KL 权重设为 0 或极小值让模型先拟合数据减小重建误差然后随着训练进行逐渐将 KL 权重增加到目标值如。Free bits限制 KL 散度的下限防止其过小。5. 扩散模型处理多峰分布时面对两种都合理的避障路径模型是怎么避免决策摇摆训练阶段学习多峰动作分布完整保留各种情况推理时每次从随机噪声出发采样‌不同随机种子自然导向不同模态‌一次跑偏左一次跑偏右单次生成结果确定且平滑无内部震荡。引入动作指数移动平均 (Action EMA)。设 t 时刻实际执行的动作为 a_t它是当前生成的动作与历史动作的加权通过给历史决策赋予权重打破了由于采样随机性导致的左右对称摇摆。二、 算法对比与场景选择6. ACT 和 Diffusion Policy 都使用了 Action Chunking它们在生成动作的机制上有什么本质区别考察点算法底层数学逻辑的对比。答题要点ACT基于CVAE 架构。通过一次前向传播采样隐变量 z Decoder 解码直接输出动作 chunk。本质上是单步生成非自回归速度快但多模态表达能力受限于隐变量 z 的维度。Diffusion Policy基于 迭代去噪。从纯高斯噪声开始经过 T 步如 10-100 步迭代逐步去噪生成动作。本质上多步生成能够拟合极其复杂的多模态分布但推理速度慢。7. 在处理“多模态动作分布”例如障碍物在左边时可以从右边绕在右边时可以从左边绕时两者分别是如何解决的考察点对多模态Multimodality问题的深入理解。答题要点ACT通过隐变量 z 来捕获多模态。在推理时从先验分布中采样不同的 z从而生成不同的动作轨迹。但如果 z 维度太低无法覆盖所有模态如果太高又容易过拟合或导致动作不平滑。Diffusion Policy扩散模型具有极强的多模态拟合能力。在推理时从不同的初始噪声​ 出发去噪过程会自然收敛到不同的数据模态上不需要显式设计隐变量能更好地覆盖长尾分布。8. Diffusion Policy 是如何将动作生成建模为扩散过程的条件观测是如何注入的考察点对扩散模型在控制领域应用的理解。答题要点建模将动作序列视为数据。前向过程逐步加入高斯噪声直到变成纯噪声反向过程训练一个神经网络​ 预测每一步加入的噪声。条件注入将当前观测图像、本体感觉通过视觉/状态编码器提取特征作为条件来引导去噪过程。条件注入方式通常有FiLM 层对特征进行仿射变换、Cross-Attention将观测特征作为 K/V动作特征作为 Q、或者直接Concat拼接后将条件特征注入到 U-Net/Transformer 的去噪网络中。三、工程实现与调优 Trick9. Diffusion Policy 的推理延迟较高在实际机械臂控制如要求 20Hz即 50ms 内完成推理中有哪些加速方案答题要点减少采样步数放弃 DDPM使用DDIM或更先进的 ODE 求解器如DPM-Solver, UniPC可以将采样步数从 100 步大幅压缩到 5-10 步。动作分块Action Chunking 滑动窗口一次预测较长的动作序列如 16 步执行时采用滑动窗口如每次执行 8 步保留 8 步作为下一步的先验从而降低模型调用频率。模型蒸馏使用Consistency Models一致性模型技术训练一个只需 1-2 步即可生成的蒸馏模型。将 DP教师的知识蒸馏给一个轻量级的 MLP 或小型 Transformer学生。工程加速使用 TensorRT 进行算子融合和 FP16/INT8 量化优化视觉编码器的推理如使用更小的 ResNet 或 MobileViT。10. 手写 ACT 的 CVAE 重参数化 Trick答题要点1 CVAE的重参数化引入CVAE 引入了条件 c在 ACT 语境下c 通常包含历史状态、观测甚至动作 Action。重参数化 Trick 的核心思想是将随机性从参数中剥离出来转移到一个固定的外部噪声上。编码器输出的后验分布是一个高斯分布若直接让网络输出均值和方差然后进行采样此时 z 的生成过程包含随机采样梯度无法回传。重参数化做法可导引入一个外部辅助变量让它服从标准正态分布。然后通过一个确定性的数学变换来生成 z其中⊙ 表示逐元素相乘。为什么这样就解决了问题随机性外置现在的随机性来自于而是从外部采样的不依赖于网络参数。计算图连通z 变成了关于、和的确定性函数只是简单的加法和乘法。因此梯度可以顺畅地通过 z 反向传播到和进而更新编码器网络​ 的参数。2pytorch手写实现重参数化核心 5 行代码重参数化 Trick将不可导的采样操作转化为可导的确定性计算import torch def reparameterize(mu, logvar): CVAE 核心重参数化 Trick :param mu: 均值向量 (Batch, Latent_Dim) :param logvar: 对数方差向量 (Batch, Latent_Dim)即 log(σ^2) :return: 采样后的隐变量 z # 1. 计算标准差 σ exp(0.5 * log(σ^2)) std torch.exp(0.5 * logvar) # 2. 采样标准正态分布噪声 ε ~ N(0, I) eps torch.randn_like(std) # 3. 重参数化: z μ σ * ε return mu eps * std # 计算 KL 散度 (解析解不需要重参数化) def kl_divergence(mu, log_var): # -0.5 * sum(1 log(sigma^2) - mu^2 - sigma^2) return -0.5 * torch.sum(1 log_var - mu.pow(2) - log_var.exp(), dim-1) # 越疆 x_trainer 平台的 kl 散度代码详解https://chat.qwen.ai/c/6948d428-49dc-4680-9db9-ef976250e1fe # mu 和 logvar 通常是 2D 张量 (batch_size, latent_dim)。 # 如果检测到是 4D 张量使用 .view() 展平为 2D 张量 (batch_size, channels * height * width)。 def kl_divergence(mu, logvar): batch_size mu.size(0) assert batch_size ! 0 if mu.data.ndimension() 4: mu mu.view(mu.size(0), mu.size(1)) if logvar.data.ndimension() 4: logvar logvar.view(logvar.size(0), logvar.size(1)) # 计算的是每一个样本在每一个隐变量维度上的独立 KL 散度。 klds -0.5 * (1 logvar - mu.pow(2) - logvar.exp()) # 总 KL 散度 - 用于最终 Loss total_kld klds.sum(1).mean(0, True) dimension_wise_kld klds.mean(0) mean_kld klds.mean(1).mean(0, True) return total_kld, dimension_wise_kld, mean_kld注意使用 logvar 而非 var 或 std (数值稳定性 Trick)代码体现std torch.exp(0.5 * logvar)