ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

第 22 课:Conditional 1D U-Net——Diffusion Policy 怎样理解一整段未来动作?

第 22 课:Conditional 1D U-Net——Diffusion Policy 怎样理解一整段未来动作?

第 21 课标准答案

上一课我们已经完成了 Diffusion Policy 最重要的一段数学基础:从前向加噪的概率模型出发,理解网络如何预测噪声,以及 DDPM 如何逐步生成动作。

先公布 10 道自测题的标准答案,然后正式进入第 22 课:Conditional 1D U-Net——扩散策略怎样理解一整段未来动作?

本课继续遵循理论阶段的教学规则:只讲工程直觉、数学原理、Tensor 维度、模型结构,以及具身智能的训练和推理逻辑,不穿插代码。

一、第 21 课的 10 道题

1. 为什么必须区分机器人时间 \(t\)、动作位置 \(k\) 和扩散步 \(s\)?

因为它们描述三种完全不同的过程。

假设机器人当前运行到了第 100 个控制时刻:

\[ t=100 \]

我们要求模型预测未来 16 个动作:

\[ A_t=[a_t,a_{t+1},\ldots,a_{t+15}] \]

这里:

\[ k=0,1,\ldots,15 \]

表示 Action Chunk 中的动作位置。

而这段动作在生成时,可能经历 50 次扩散去噪:

\[ s=50,49,\ldots,1 \]

因此:

符号

代表什么

发生在哪里

\(t\)

机器人当前控制时刻

真实环境

\(k\)

未来动作序列中的位置

Action Chunk

\(s\)

扩散生成过程中的噪声等级

模型内部

模型可以在机器人尚未执行下一步动作时,就完成整段动作的多次去噪计算。

2. \(\beta_s\)、\(\alpha_s\)、\(\bar\alpha_s\) 有什么区别?

\[ \beta_s \]

描述当前扩散步骤加入的新噪声方差。

\[ \alpha_s=1-\beta_s \]

描述当前一步的信号保留系数。

\[ \bar\alpha_s=\prod_{i=1}^{s}\alpha_i \]

描述从最初干净动作到当前扩散步的累计信号保留系数。

例如:

\[ \beta_1=0.1,\qquad \beta_2=0.2 \]

则:

\[ \alpha_1=0.9,\qquad\alpha_2=0.8 \]

因此:

\[ \boxed{\bar\alpha_2=0.9\times0.8=0.72} \]

需要注意:这些是方差或信号功率相关的系数,真正乘到动作数值上的幅值系数通常带有平方根。

3. 为什么多次加噪以后可以直接使用一个公式?

单步加噪:

\[ A^{(s)} = \sqrt{\alpha_s}A^{(s-1)} + \sqrt{\beta_s}\epsilon_s \]

连续加噪时,原始动作每经过一步都会被进一步缩放,因此累计幅值系数是:

\[ \sqrt{\alpha_1\alpha_2\cdots\alpha_s} = \sqrt{\bar\alpha_s} \]

另一方面,独立高斯噪声的加权和仍然是高斯分布,所以多个噪声项可以在分布意义上合并。

最终得到:

\[ \boxed{ A^{(s)} = \sqrt{\bar\alpha_s}A^{(0)} + \sqrt{1-\bar\alpha_s}\epsilon } \]

这解释了为什么训练时可以直接生成某个噪声等级的动作,而不需要逐步执行所有前向加噪步骤。

4. 估计干净动作与更新到上一扩散步,为什么不同?

估计干净动作是在计算:

\[ A^{(s)}\rightarrow\hat A^{(0)} \]

目标是估计第 0 步的动作。

而反向扩散的一步是:

\[ A^{(s)}\rightarrow A^{(s-1)} \]

目标是从当前噪声等级转移到较低的噪声等级。

对应的计算不同:

\[ \hat A^{(0)} = \frac{ A^{(s)}-\sqrt{1-\bar\alpha_s}\hat\epsilon }{ \sqrt{\bar\alpha_s} } \]

而标准 DDPM 的反向转移还涉及条件均值和方差。

因此:

\[ \boxed{ \text{估计最终答案}\neq\text{执行一次反向采样} } \]

5. DDPM 为什么要计算均值和方差?

因为标准 DDPM 将一步反向转移建模为条件高斯分布:

\[ p_\theta(A^{(s-1)}\mid A^{(s)},O_t) = \mathcal N(\mu_\theta,\Sigma_s) \]

均值:

\[ \mu_\theta \]

决定这一步反向更新的中心。

协方差:

\[ \Sigma_s \]

描述围绕该中心的随机性。

在采用固定后验方差的常见 DDPM 设置中,可以写为:

\[ A^{(s-1)} = \mu_\theta+\sqrt{\tilde\beta_s}\xi \]

其中:

\[ \xi\sim\mathcal N(0,I) \]

但这不意味着所有扩散采样器都必须在每一步加入随机噪声。不同采样器可能采用不同的确定性或随机更新规则。

6. Noise Predictor 和 Noise Scheduler 分别干什么?

Noise Predictor 是需要学习的神经网络。

\[ \hat\epsilon = \epsilon_\theta(A^{(s)},s,O_t) \]

它根据带噪动作、扩散步和 Observation,估计噪声。

Noise Scheduler 负责定义噪声时间表和反向更新规则。

它利用:

\[ \alpha_s,\beta_s,\bar\alpha_s \]

以及网络预测结果,计算下一步候选动作。

在标准 DDPM 设置中,主要通过 Backward 更新的是 Noise Predictor 的参数,而不是预先规定的噪声时间表。

7. 为什么训练不需要完整去噪,而推理需要?

训练时拥有专家动作:

\[ A^{(0)} \]

因此可以随机选择一个扩散步 \(s\),直接生成:

\[ A^{(s)} \]

然后训练网络预测人为加入的噪声。

推理时不存在未来专家动作,模型从随机噪声开始,需要使用学习到的反向生成过程逐步获得动作。

所以:

\[ \boxed{ \text{训练:随机一个噪声等级进行监督} } \]

\[ \boxed{ \text{推理:从高噪声逐步生成动作} } \]

这是常见 DDPM 噪声预测训练与采样之间的重要区别。

8. Noise Target 从哪里来?

由训练过程人为采样:

\[ \epsilon\sim\mathcal N(0,I) \]

然后将它加入专家 Action Chunk:

\[ A^{(s)} = \sqrt{\bar\alpha_s}A^{(0)} + \sqrt{1-\bar\alpha_s}\epsilon \]

因为加入的 \(\epsilon\) 是已知的,所以能够直接用它监督网络。

不需要人类专家额外标注“这条动作中包含多少噪声”。

9. 为什么预测 16 步动作,不一定执行 16 步?

因为 Prediction Horizon 与 Execution Horizon 可以不同。

例如:

\[ K=16 \]

但每轮只执行:

\[ T_a=4 \]

步。

那么:

\[ \text{预测16步} \rightarrow \text{执行4步} \rightarrow \text{重新观察} \rightarrow \text{重新预测} \]

这种滚动时域执行方式允许机器人利用新观察修正后续行为。

它有利于闭环控制,但实际效果仍然依赖控制频率、感知延迟及策略性能。

10. 为什么生成的动作不能直接理解成电机指令?

因为 Action 的数值意义由训练数据和 Action Representation 决定。

模型可能生成的是:

  • 关节目标位置;

  • 关节位置增量;

  • 末端位姿目标;

  • 末端运动增量。

而不是直接生成驱动器需要的电流或脉冲信号。

因此真实执行仍需要:

\[ \boxed{ \text{模型动作} \rightarrow \text{反归一化} \rightarrow \text{约束检查} \rightarrow \text{控制接口} \rightarrow \text{机器人运动} } \]

Diffusion Policy 是机器人策略生成模块,不自动取代底层控制系统。

第 22 课:Conditional 1D U-Net——Diffusion Policy 怎样理解一整段未来动作?

理论参考:Diffusion Policy 原论文。本课关于 Conditional 1D U-Net、时间卷积、条件调制和多尺度结构的说明,已参考论文及作者公开实现核对。

上一课,我们学会了 DDPM 的基本原理:

\[ A^{(s)} \xrightarrow{\text{Noise Predictor}} \hat\epsilon \xrightarrow{\text{Scheduler}} A^{(s-1)} \]

但还有一个问题没有解决:

Noise Predictor 究竟怎样知道一整段动作中的哪些数值应该一起变化?

举个例子。

一个机械臂正在向杯子靠近。我们希望未来 8 个时刻的动作是连续、协调的,而不是每个时刻各走各的。

如果第 3 个时刻向右、第 4 个时刻突然向左、第 5 个时刻又向右,那么即使每个动作数值都处于允许范围,这段动作也可能不适合任务。

因此,Noise Predictor 不能只分别处理每个动作数值。

它还需要识别:

一段动作序列内部的时间联系,以及这段动作与机器人观察状态之间的联系。

Conditional 1D U-Net 正是实现这种学习的一种网络架构。

一、为什么机器人 Action Chunk 可以看成一条一维信号?

我们先暂时不讨论 U-Net。

假设一个机械臂未来有 8 个动作:

\[ A_t=[a_t,a_{t+1},\ldots,a_{t+7}] \]

如果每个动作是二维的:

\[ a_{t+k}=[x_{t+k},y_{t+k}] \]

那么整段动作可以写成:

\[ A_t= \begin{bmatrix} x_t&y_t\\ x_{t+1}&y_{t+1}\\ \vdots&\vdots\\ x_{t+7}&y_{t+7} \end{bmatrix} \]

Shape:

\[ \boxed{[8,2]} \]

这里有两个不同的维度。

第一维:

\[ K=8 \]

是未来动作序列长度。

第二维:

\[ D_a=2 \]

是每个动作的特征维度。

现在固定看第一个动作分量:

\[ [x_t,x_{t+1},\ldots,x_{t+7}] \]

你会发现,它和一条随时间变化的信号很相似。

例如:

\[ [0.10,0.12,0.15,0.19,0.22,0.24,0.25,0.25] \]

这些数值之间存在时间上的联系。

同样,第二个动作分量也有自己的变化规律。

所以可以把整个 Action Chunk 理解成:

由多个动作通道组成的一段有限长度的时间序列。

这就是为什么可以采用 1D Convolution(一维卷积)。

这里的“一维”不是说动作只有一个数值,而是说:

卷积核主要沿着动作序列的时间轴滑动。

例如 Action 有 7 个分量,仍然可以使用 1D Convolution。

二、Conv1D 为什么能够学习动作之间的时间联系?

先想象一个很简单的任务。

机械臂正在接近抓取目标,某个动作分量随时间变化:

\[ [0.10,0.15,0.20,0.25,0.30] \]

如果我们只观察:

\[ 0.20 \]

这个数字,就不知道它前后发生了什么。

但如果同时观察:

\[ [0.15,0.20,0.25] \]

就能发现这一小段呈现逐渐增大的趋势。

卷积的直觉,就是拿一个固定大小的观察窗口,沿整段序列滑动,在不同位置寻找类似的局部变化特征。

1. 先理解一个卷积核

假设我们有三个连续动作数值:

\[ [x_1,x_2,x_3] \]

定义卷积核:

\[ w=[w_1,w_2,w_3] \]

那么某个位置的输出可以写成:

\[ \boxed{ y_i=w_1x_{i-1}+w_2x_i+w_3x_{i+1}+b } \]

其中:

  • \(x_{i-1}\):当前位置之前的一个数值;

  • \(x_i\):当前位置数值;

  • \(x_{i+1}\):当前位置之后的一个数值;

  • \(w_1,w_2,w_3\):卷积核权重;

  • \(b\):偏置;

  • \(y_i\):这个局部窗口计算出的新特征。

例如人为设置:

\[ w=[-1,0,1] \]

那么:

\[ y_i=-x_{i-1}+x_{i+1} \]

它可以反映局部变化趋势。

但在神经网络中,我们通常不手工规定这样的卷积核。

网络通过训练自动学习权重:

\[ w_1,w_2,w_3 \]

从而提取对噪声预测有用的动作局部特征。

2. 为什么实际卷积不只处理一个动作维度?

假设动作有 7 个维度:

\[ A:[B,K,7] \]

网络内部通常将其视为:

\[ \boxed{[B,7,K]} \]

其中:

  • \(B\):Batch Size;

  • \(7\):动作通道数;

  • \(K\):动作序列长度。

如果有多个输入通道,卷积计算就不只是对单条序列的三个数值做加权。

更一般地:

\[ Y_{b,c_o,k} = b_{c_o} + \sum_{c_i=1}^{C_{\mathrm{in}}} \sum_{r=-m}^{m} W_{c_o,c_i,r} X_{b,c_i,k+r} \]

这里:

  • \(c_i\):输入通道编号;

  • \(c_o\):输出通道编号;

  • \(k\):动作时间位置;

  • \(r\):卷积窗口内部的相对位置;

  • \(W\):需要训练的卷积权重;

  • \(m\):卷积窗口的半径,假设窗口长度为 \(2m+1\)。

对于越过序列边界的位置,需要根据 Padding 等边界处理规则计算。

公式虽然长,但意义非常直观:

每个输出位置,可以同时综合附近多个时间位置、多个输入动作通道的信息。

例如机器人某个关节的变化趋势,可能与另一个关节的变化状态有关。普通多通道卷积具备学习这类跨通道关系的能力。

因此 Conv1D 的两项重要能力是:

\[ \boxed{\text{沿动作时间轴学习局部关系}} \]

以及:

\[ \boxed{\text{融合不同动作特征通道}} \]

3. 为什么卷积还需要非线性?

如果整个网络只使用线性卷积,那么多层线性变换组合后,本质上仍是一个线性映射。

但机器人动作与环境条件之间通常存在复杂的非线性关系。

所以卷积网络会在特征变换之间加入非线性激活、归一化等操作。

这些结构让网络能够学习更复杂的关系,而不只是简单计算局部加权平均。

三、为什么只有 Conv1D 还不够?U-Net 为什么要先下采样,再上采样?

现在出现一个新的问题。

假设模型要生成未来 16 个动作。

某一个动作位置确实需要参考它附近的动作,但它可能还要考虑更远处的动作。

例如机械臂从当前位置移动到目标附近,再逐渐减速抓取。

如果网络只关注相邻的三个动作,就可能只知道:

现在附近的动作变化是什么?

却难以直接捕捉:

整段动作应该如何协调,才能完成当前抓取任务?

因此需要扩大网络的 Receptive Field(感受野)。

感受野是指一个输出特征能够受到输入序列中多大范围的信息影响。

1. 为什么下采样可以扩大有效观察范围?

假设:

\[ K=16 \]

也就是一段 16 步动作。

U-Net 可以逐层降低时间分辨率:

\[ 16\rightarrow8\rightarrow4 \]

在每一层中,网络都进行卷积特征提取。

可以把它理解为看一段录像。

第一次,你逐帧观察动作细节。

第二次,你减少时间位置的数量,从更粗的尺度观察变化趋势。

第三次,你进一步概括整段动作的结构。

这里必须强调:

下采样不是简单删除未来动作,也不是决定机器人少执行几步。

它只发生在神经网络内部的特征表示上。

例如:

\[ F_0:[B,64,16] \]

经过下采样与特征变换:

\[ F_1:[B,128,8] \]

再进一步:

\[ F_2:[B,256,4] \]

这里:

\[ 16\rightarrow8\rightarrow4 \]

表示内部特征的时间分辨率降低。

而:

\[ 64\rightarrow128\rightarrow256 \]

表示特征通道数量增多。

更多通道允许网络使用更丰富的特征表示,但不代表它直接拥有更多原始信息。

2. 上采样的意义是什么?

经过下采样,网络已经能够利用更大范围的动作信息。

但最终任务不是只输出:

\[ [B,256,4] \]

而是要对原来 16 个动作位置都产生预测。

因此需要上采样:

\[ 4\rightarrow8\rightarrow16 \]

网络一边恢复时间分辨率,一边结合下采样路径提取到的特征。

最终再映射回动作维度:

\[ \boxed{[B,7,16]} \]

这样 U-Net 才能对 16 个未来动作位置的每个动作分量输出对应的噪声估计。

3. Skip Connection 为什么必不可少?

想象一段动作中有非常细微的变化。

例如抓取前最后两步,机械臂需要进行小幅位置修正。

在不断下采样的过程中,某些细粒度的时间信息可能变得难以保留。

因此 U-Net 会将下采样路径中的中间特征传给上采样路径的对应层。

这叫 Skip Connection(跳跃连接)。

它像是在做两份记录:

一份是从整体上概括动作趋势。

另一份则保留了更高时间分辨率的局部特征。

当网络恢复最终动作表示时,将两部分信息结合起来。

需要注意,这与我们在 Transformer 中学习过的:

\[ Y=X+F(X) \]

那种 Residual Connection 有联系,但不是完全相同的结构概念。

U-Net 的跨路径 Skip Connection 常采用特征拼接;网络内部的 Residual Block 则可以使用逐元素相加。

U-Net 的核心优势之一,就是融合不同时间尺度的特征:既能够利用较大范围的动作关系,也能保留较细的局部结构。

但它不自动保证输出动作平滑,也不等于有明确的物理运动约束。动作质量仍然由训练数据、条件信息、模型学习结果和后续控制系统共同决定。

四、为什么叫 Conditional U-Net?Observation 与扩散步怎样进入网络?

现在假设有一段带噪动作:

\[ A_t^{(s)}:[B,K,D_a] \]

如果我们只把它送进普通 U-Net,那么网络只能从当前带噪动作本身估计噪声。

这还不是我们真正想要的机器人 Policy。

因为机器人动作必须与环境有关。

例如同一段初始随机动作,在不同的机器人场景中,应该逐渐生成不同的动作结果。

因此我们还要向 U-Net 提供两类条件。

第一类:机器人 Observation。

\[ O_t=(I_t,q_t) \]

其中视觉图像通过视觉编码器产生特征,机器人状态也可以映射成条件特征。

我们将编码后的观察特征统一记为:

\[ c_o=f_{\mathrm{obs}}(O_t) \]

第二类:扩散步 \(s\)。

噪声网络还必须知道当前属于哪个噪声等级。

因此需要为扩散步创建一个向量表示:

\[ e_s=f_{\mathrm{time}}(s) \]

这个过程称为 Diffusion Timestep Embedding。

你以前在 Transformer 学过 Position Embedding,所以这里可以借用相同的直觉:一个整数虽然能标记位置或阶段,但将它映射到连续特征空间,更便于神经网络处理。

常见方法会采用不同频率的正弦、余弦函数构造时间特征,再做可学习的特征变换。

这里的 Timestep Embedding 表示扩散噪声阶段,不是 Action Chunk 内的未来动作位置。

1. Observation 与 Timestep 如何共同影响网络?

我们可以把它们组合成条件表示:

\[ c=g(c_o,e_s) \]

这个 \(c\) 就用于控制 U-Net 的特征处理。

于是 Noise Predictor 可以写成:

\[ \boxed{ \hat\epsilon = f_\theta(A_t^{(s)};c_o,e_s) } \]

分号表示 \(c_o,e_s\) 作为网络的条件输入;它不是数学上必须采用的特殊运算符。

现在模型不仅知道:

当前动作噪声是什么样?

还知道:

当前机器人观察到了什么?

以及:

当前应该按照什么噪声等级进行修正?

2. FiLM 为什么会出现?

原始 Diffusion Policy 的 CNN 版本采用了 FiLM(Feature-wise Linear Modulation) 作为条件调制机制。作者公开实现还支持条件加性偏置和预测缩放、偏置两种形式。

FiLM 可以理解成:

让 Observation 和 Diffusion Step 决定,卷积网络内部各个特征通道应该怎样调整。

假设 U-Net 某层内部特征为:

\[ F:[B,C,K] \]

其中:

  • \(C\):该层特征通道数;

  • \(K\):当前层的序列长度。

条件编码器根据 \(c\) 生成:

\[ \gamma(c),\delta(c) \]

然后进行:

\[ \boxed{ \tilde F_{b,j,k} = \gamma_{b,j}(c)F_{b,j,k} + \delta_{b,j}(c) } \]

其中:

  • \(\gamma_{b,j}(c)\):当前样本第 \(j\) 个特征通道的缩放系数;

  • \(\delta_{b,j}(c)\):当前样本第 \(j\) 个特征通道的偏移量;

  • \(k\):动作序列的时间位置。

这里使用 \(\delta\) 表示偏移,避免与 DDPM 中的噪声方差系数 \(\beta_s\) 混淆。

假设网络某个内部通道用于表示“动作朝目标方向变化”的某种特征。

在不同 Observation 下,条件模块可以学习给予这个通道不同的缩放和偏移。

需要强调,这只是帮助理解的例子。真实通道并不一定具有这样明确、固定的人类可解释语义。

3. 为什么条件要进入多层,而不是只在网络最后加入一次?

因为 Observation 不只是决定最后的输出数值。

它还可能影响网络在不同尺度下如何分析带噪动作。

例如机器人当前距离目标较远,与已经接近目标时,网络可能需要学习不同的动作序列模式。

因此在多个卷积特征处理阶段使用条件信息,可以让不同尺度的去噪特征都受到任务条件影响。

这正是 Conditional U-Net 相较普通无条件 U-Net 的重要区别。

还有一个容易误解的地方:

Conditional U-Net 并不是把 RGB 像素、关节位置和带噪动作无条件地混合成一条原始数值序列。

在常见视觉条件扩散策略中,视觉与状态先经过编码,再作为条件影响动作去噪主干。

五、把整个网络放回 Diffusion Policy 的训练与推理

现在我们终于可以把第 20、21、22 课连接成一套完整的具身策略。

训练阶段:U-Net 学习预测整段动作里的噪声

设:

\[ O_t=[o_{t-T_o+1},\ldots,o_t] \]

是观察历史。

专家动作序列:

\[ A_t^{(0)} = [a_t,\ldots,a_{t+T_p-1}] \]

其中:

  • \(T_o\):Observation Horizon;

  • \(T_p\):Prediction Horizon。

我们随机选取扩散步:

\[ s \]

并添加高斯噪声:

\[ A_t^{(s)} = \sqrt{\bar\alpha_s}A_t^{(0)} + \sqrt{1-\bar\alpha_s}\epsilon \]

观察编码器得到:

\[ c_o=f_{\mathrm{obs}}(O_t) \]

噪声预测网络得到:

\[ \hat\epsilon = \epsilon_\theta(A_t^{(s)},s,c_o) \]

其中 \(\epsilon_\theta\) 可以采用刚刚讲过的 Conditional 1D U-Net。

训练损失:

\[ \boxed{ L(\theta) = \mathbb E_{t,s,\epsilon} \left[ \left\| \epsilon-\epsilon_\theta(A_t^{(s)},s,c_o) \right\|^2 \right] } \]

训练时,梯度不仅能够更新 U-Net,也可以在端到端可训练的设置下更新观察编码器。

因此视觉特征学习与动作去噪学习能够围绕同一个任务目标进行优化。

推理阶段:同一个条件,引导多轮去噪

机器人当前获得:

\[ O_t \]

通过观察编码得到:

\[ c_o \]

然后初始化:

\[ A_t^{(S)} \sim\mathcal N(0,I) \]

在反向扩散的每一步:

\[ \hat\epsilon_s = \epsilon_\theta(A_t^{(s)},s,c_o) \]

Scheduler 根据网络输出更新:

\[ A_t^{(s-1)} \]

直到得到:

\[ \hat A_t^{(0)} \]

注意,这个过程中:

Action Chunk 在不断变化,但当前轮的 Observation 条件通常保持不变。

模型在这一轮去噪时,不是每去噪一次就让真实机器人执行一个动作。

去噪是内部生成计算,真实执行发生在完整 Action Chunk 已经生成之后。

随后:

\[ \hat A_t^{(0)} \]

经过反归一化与必要的动作约束处理,再选出本轮需要执行的 \(T_a\) 个动作。

例如:

\[ T_o=2,\qquad T_p=16,\qquad T_a=4 \]

含义就是:

看最近 2 个 Observation,预测未来 16 个 Action,每轮实际执行其中 4 个,然后重新观察。

三个 Horizon 的不同职责

Observation

2

已知的观察位置

Prediction

16

预测的动作位置

Execution

4

本轮执行的动作

以上是教学配置。实际执行哪一段预测动作及其时间对齐方式,应由具体策略设计确定。

因此整个闭环为:

\[ \boxed{ \begin{aligned} &\text{Observation History}\\ &\downarrow\\ &\text{Visual / State Encoding}\\ &\downarrow\\ &\text{Random Action Chunk}\\ &\downarrow\\ &\text{Conditional U-Net + Scheduler,多轮去噪}\\ &\downarrow\\ &\text{Predicted Action Chunk}\\ &\downarrow\\ &\text{执行选定动作}\\ &\downarrow\\ &\text{New Observation} \end{aligned} } \]

这里还有一个需要建立的认识:Conditional U-Net 是一种噪声预测网络的选择,而不是扩散策略唯一允许的网络。

原始 Diffusion Policy 同时研究了 CNN/U-Net 和 Transformer 形式的扩散模型。它们在如何建立动作时间关系、如何注入条件方面有所不同,但都可以服务于条件扩散动作生成。

六、第 22 课总结:你现在真正应该理解什么?

经过这一课,我们已经把三个问题连接起来:

第一个问题:动作为什么能使用一维卷积?

因为 Action Chunk 可以看作多个动作特征通道随时间变化的序列,卷积能够学习局部时间关系和跨通道关系。

第二个问题:为什么采用 U-Net?

因为只看局部动作还不够,需要通过下采样提取不同时间尺度的特征,再通过上采样和 Skip Connection 恢复逐位置输出。

第三个问题:为什么是 Conditional U-Net?

因为机器人生成动作不是无条件的,它必须结合当前视觉、机器人状态和扩散噪声等级。

因此:

\[ \boxed{ \text{Temporal Convolution} + \text{Multi-scale U-Net} + \text{Observation / Timestep Conditioning} } \]

构成了我们这一课所研究的噪声预测网络核心。

而它在整个扩散策略中的位置是:

\[ \boxed{ \underbrace{\epsilon_\theta(A^{(s)},s,O_t)}_{\text{Conditional U-Net}} + \underbrace{\text{Noise Scheduler}}_{\text{反向更新}} \rightarrow \text{Action Generation} } \]

Conditional U-Net 不直接负责执行机器人动作,也不负责制定 DDPM 噪声时间表。它主要学习给定条件下的噪声预测映射。

第 22 课自测

1. 为什么 Action Chunk 可以看成一维时间序列?这里的“一维”为什么不等于动作只有一个数值?

2. 一个大小为 3 的时间卷积核,会利用当前位置附近哪些动作信息?

3. 如果:

\[ A:[B,16,7] \]

将动作维度作为通道、时间作为卷积长度时,对应什么 Shape?

4. 为什么普通 Conv1D 能学习局部时间关系,但堆叠多尺度卷积有助于学习更大范围的动作关系?

5. U-Net 中下采样、上采样和 Skip Connection 分别解决什么问题?

6. U-Net 中跨层传递特征的 Skip Connection,与 Transformer 中的 Residual Connection 是否完全相同?

7. 为什么 Conditional U-Net 除了输入带噪 Action,还必须接收 Observation 和 Diffusion Step?

8. FiLM 条件调制公式:

\[ \tilde F=\gamma(c)\odot F+\delta(c) \]

中的 \(F,\gamma,\delta,c\) 各自是什么意思?

9. 为什么同一轮 Action Chunk 去噪过程中,Observation 通常可以保持不变,而扩散步 \(s\) 必须不断更新?

10. 为什么 Conditional U-Net 输出的是噪声估计,而不是可以立即下发机器人的动作指令?

11. 如果:

\[ T_o=3,\quad T_p=16,\quad T_a=4 \]

请分别解释这三个数的实际意义。它们与扩散采样步数 \(S\) 又是什么关系?

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进