具身智能面试题

DDPM 和 DDIM 的区别是什么?

第一步:前置小知识(重参数化技巧)

在扩散模型中,我们最常用到一个技巧:如果你有一个符合正态分布的变量 (均值为 ,方差为 ),我们可以把它拆成:

这里的 是一个标准正态分布的纯噪声

直白点说: 任意状态 = 确定的基础值 + (随机噪声 噪声强度)。记住这个公式,它是贯穿整个推导的灵魂。

第二步:DDPM 的基础设定(从头到尾加噪)

在原来的 DDPM(去噪扩散概率模型)中,我们有一个清晰的正向加噪过程

假设我们有一张清晰的图像(或者机器人的一个完美动作),叫做 。我们在它上面不断加噪声,加到第 步时,它变成了

DDPM 证明了一个极其重要的结论:我们不需要一步步加噪声,我们可以直接从 一步跳到

公式是这样的:

  • : 初始干净数据。
  • : 第 步的含噪数据。
  • : 一个介于 0 到 1 之间的系数。你可以把它理解为**“信号保留率”**。随着步数 变大, 会越来越小(趋近于 0)。
  • : “噪声强度”
  • : 标准正态分布的纯噪声。

总结一句话: 步的数据 ,就是**“衰减后的干净数据”加上“逐渐增强的噪声”**。

第三步:逆向思考 —— 如何从 猜出

现在,我们进入大模型真正工作的阶段:反向去噪

大模型(比如一个 U-Net 神经网络)在推理时,看到的是一团带有噪声的 。它的任务是:预测出这团数据里包含的噪声 是什么。

假设我们训练好了一个神仙大模型,记作 。它可以精准地猜出当前 里面的噪声。

既然噪声被猜出来了,我们是不是可以利用第二步的公式,反推(猜测)出干净的

我们将第二步的公式 移项变形,求

(这一步只是简单的初中代数移项哦!)

这就是大模型在任意第 步时,脑海中“想象”出的最终清晰结果。

第四步:DDIM 的核心魔法 —— 重新拼装

在传统的 DDPM 中,必须依赖马尔可夫链一步一步倒退()。

DDIM 的天才之处在于:它打破了必须一步一步退的规则。 它提出,只要我保证最后生成的边缘分布一样,中间怎么走随便我!于是 DDIM 强行构造了一个生成 的新公式。

DDIM 认为,第 步的数据 ,可以由三部分拼装而成:

让我们把这三部分详细写出来(不要怕长,我们拆开看):

我们来逐一翻译这三部分:

  1. 部分1(指向 ): 你看括号里的那一坨,是不是就是我们在第三步预测的 ?前面乘上 ,意思是我们要保留多少 的信号。
  2. 部分2(指向 的方向): 为了平滑过渡,我们还需要加一点点我们刚预测出的噪声 回去。系数 是为了保证总的方差对齐。
  3. 部分3(随机噪声): 是我们自己可以控制的方差参数, 是新的随机噪声。

第五步:见证奇迹的时刻 —— 为什么能加速?

上面的公式就是泛化的扩散模型采样公式。接下来就是 DDIM 发挥威力的地方了:

操作 1:让 (消除随机性)

DDIM 的论文作者指出,如果我们直接把随机性砍掉,也就是让方差参数

此时,公式中的部分3直接消失!

这意味着什么?意味着从 的过程变成了**完全确定(Deterministic)**的!只要你的输入噪声固定,无论生成多少次,结果都一模一样。这对具身智能机器人的稳定性至关重要!

操作 2:跳步(Accelerated Sampling)

仔细看最后这个化简后的公式,你会发现:计算 的时候,我们只用到了 、大模型的预测 、以及

这里的 只是一个符号,它不需要真的是上一个整数!

也就是说,我们可以把时间步设定为一个子序列,比如从 直接跳到 ,把 作为公式里的 "" 代入计算。

这就实现了巨大的跳跃,原来需要迭代 1000 次,现在我们每 50 步跳一次,只需 20 次就能生成最终结果!这就是 DDIM 加速的根本原理。

总结归纳

  1. 我们通过大模型预测出当前的噪声
  2. 我们用这个噪声反推出干净的数据
  3. DDIM 构造了一个新公式,用预测的 预测的噪声按特定比例组合,直接算出一个确定性的前置状态。
  4. 因为公式不再依赖马尔可夫链的严密连贯性,我们可以大步幅地“跳着算”,实现几倍甚至几十倍的加速。

第一重解密:如何证明可以直接从 跳到

要想证明这个公式,我们需要先准备一个非常基础的统计学**“外挂定理”**(正态分布的可加性):

定理: 如果你有两个相互独立的正态分布变量,分别带有方差 和方差 。把它们加在一起,新的变量依然是正态分布,且方差相加,等于

在扩散模型中,我们定义单步的加噪过程是这样的(每次只加一点点噪声):

这里的 都是标准正态分布的纯噪声(均值为0,方差为1)。系数 也就是我们说的“信号保留率”。

现在,我们要挑战把 直接用 表示出来:

的公式,直接代入到 的公式里去:

我们把括号拆开:

见证奇迹的时刻到了!我们用上面提到的“外挂定理”来合并这两坨噪声:

第一坨噪声的方差是:

第二坨噪声的方差是:

根据定理,两个噪声相加,方差相加

也就是说,这两坨噪声合并后,变成了一个全新的、方差为 的标准噪声(我们叫它 ):

你看!中间的 完美消失了!

如果我们为了书写方便,定义 (即前 步信号保留率的连乘)。

以此类推,一直套娃代入到第 步,就会得到那个核心结论:

结论: 因为正态分布的噪声加法具有奇妙的抵消和合并特性,我们不需要经过中间的 ,就能直接算出第 步的含噪结果。

第二重解密:DDIM 的生成公式为什么会分裂成三部分?

这其实不是凭空捏造的,而是作者为了**“凑出”**一个符合规定的分布,反向推导(Reverse-engineer)出来的。

1. DDIM 作者的终极目标是什么?

DDIM 的核心理念是:我不管反向去噪的过程怎么走,但我必须保证任意第 步的图像 ,必须符合我们刚刚在第一步推导出的那个前向公式的规律

也就是说, 必须满足:

2. “拆解”总噪声(核心原理)

现在,我们手里有三个已知情报:

  1. 预测出的干净图像(
  2. 当前的带噪图像(
  3. 我们预测出的,包含在 里的那坨噪声(

在上面的终极目标公式中,“总噪声”的方差(或者说它的总强度)必须是

作者想:如果我把这团“总噪声”全部变成随机噪声,那就是普通的 DDPM,每次结果都不一样。我能不能把这团总噪声“切”成两块?

  • 一块是确定的(Deterministic): 用我们大模型已经预测出来的噪声 来代替,这样它就有确定的方向(指向 )。
  • 一块是随机的(Stochastic): 引入一点点全新的纯随机噪声 ,它的方差我们自己设定为

就像分蛋糕一样,总方差预算是

既然我分给了“随机噪声” 的份额,那么留给“确定性噪声”的份额就只剩下:

3. 拼装成型

根据上面的“分蛋糕”逻辑,我们把原本的 公式重新写一遍:

把对应的方差系数套进去:

最后,因为真实的 我们是不知道的,我们只能用大模型预测出来的 (也就是你提到的初中代数移项出来的那个式子)来替换掉公式里的

这就是那“三部分”的由来!

它没有任何魔法,它的原理就是:在保持总方差(噪声强度)绝对不变的前提下,巧妙地把噪声分成了“可预测部分”和“纯随机部分”。 当我们把纯随机部分(方差 )设为 0 时,整个过程就变成了完全确定的加速跳步过程。

核心定理:方差的平方缩放性质

在概率论中,如果你有一个随机变量 ,它的方差是 。如果你给它乘上一个常数 ,那么新变量的方差,等于原来方差乘以常数 的平方

写成公式就是:

把定理套用到我们的推导里

在扩散模型中,我们所有的基础噪声 (无论是 还是 ),都被定义为标准正态分布

标准正态分布有一个最重要的特性:它的均值是 0,方差是 1

也就是说:

现在,我们来看你抓出的第一坨噪声:

我们来算一下这一整坨的方差:

  1. 这里的常数
  2. 根据上面的定理,这坨东西的方差 =
  3. 我们把 平方,根号就直接消掉了,变成了:
  4. 又因为基础噪声的方差
  5. 所以,最终的方差 =

同理,我们看第二坨噪声:

它的方差就是把系数平方再乘以 1,即:

最后一步:加起来重新打包

因为 是两次完全独立的随机抽卡(独立同分布),它们加在一起的总方差,就是各自的方差直接相加(这就是我们前面说的“外挂定理”):

现在,我们得到了这两坨噪声合并后的总方差

但我们要把它重新写回公式里呀!公式里需要的是系数乘以一个标准噪声

根据逆向推导:既然方差是 ,那么根据 ,我们要找的新系数 ,必然就是总方差的平方根

所以,合并后的噪声项就顺理成章地写成了:

(这里的 就是代表合并后的全新标准正态分布噪声)。

在具身智能(比如控制一个机械臂去抓杯子)的 Diffusion Policy 中,大模型输出的不再是一张图片,而是机器人的动作序列(比如未来 16 步的关节角度)。

下面这段极简风格的 Python 伪代码,展示了我们刚刚推导的 DDIM 公式是如何在机器人大脑中高速运转的:

# 假设我们训练好了一个扩散大模型 (U-Net),它能根据看到的画面预测动作里的噪声
# robot_camera_image: 机器人当前看到的画面 (作为生成动作的条件)

def ddim_fast_sample(robot_camera_image, unet_model, total_train_steps=1000, jump_steps=10):
    """
    使用 DDIM 加速生成机器人动作轨迹
    原本需要 1000 步,现在我们只跳跃计算 10 步 (极大提升速度,满足实时控制)
    """
    # 1. 初始化:凭空捏造一条完全随机的动作轨迹 (纯噪声)
    # 比如:随机生成未来 16 步的关节运动指令,这时的动作完全是乱抖的
    action_t = generate_random_noise(shape=(16, joint_dim)) 
    
    # 2. 规划跳步路线:比如从 1000 跳到 900, 800 ... 一直到 0
    timesteps = get_jump_sequence(total_train_steps, jump_steps)
    
    # 3. 核心逆向去噪循环 (DDIM 开始发威)
    for i in range(len(timesteps)):
        t = timesteps[i]                     # 当前时间步
        t_prev = timesteps[i+1] if i < len(timesteps)-1 else 0 # 下一个要跳到的时间步
        
        # [对应数学推导]:大模型登场!根据当前的乱码动作和看到的画面,预测出里面的噪声
        predicted_noise = unet_model(action_t, t, condition=robot_camera_image)
        
        # [对应数学推导的移项公式]:用当前带噪动作和预测的噪声,反推算出完全干净的完美动作 (x_0)
        predicted_x0 = calculate_clean_x0(action_t, predicted_noise, t)
        
        # [对应数学推导的三部分拼装]:DDIM 的确定性公式
        # 这里直接消除了随机方差项 (sigma_t = 0),只用 x_0 和 预测噪声 组合出 t_prev 步的动作
        action_t = ddim_assemble_formula(predicted_x0, predicted_noise, t_prev)
        
    # 循环结束,这时的 action_t 已经从一团乱码,变成了一套极其平滑、精准的抓取动作!
    return action_t


# ==========================================
# 机器人的真实物理控制循环 (例如每秒执行 10 次)
# ==========================================
while robot_is_turned_on:
    # A. 睁开眼睛,看看当前环境
    current_image = get_camera_frame()
    
    # B. 大脑飞速运转:调用上面的 DDIM 算法,仅用 10 步算出未来 16 步的动作
    action_trajectory = ddim_fast_sample(current_image, my_diffusion_model)
    
    # C. 具身智能的特殊技巧:Receding Horizon Control (滚动时域控制)
    # 虽然预测了未来 16 步,但为了应对突发情况,我们只执行前 8 步,然后重新看、重新算!
    execute_on_physical_robot(action_trajectory[0:8])

伪代码里的三个核心看点:

  1. condition=robot_camera_image(条件控制):这就是具身智能的灵魂。传统的扩散模型是根据文字生成图片,而在具身智能里,模型是根据当前的视觉画面来指导噪声的预测,从而生成符合当前环境的动作。
  2. 只循环 10 次(极速推理):因为有了 DDIM 的跳步公式 ddim_assemble_formula,原本 for 循环要跑 1000 次,现在只要 10 次或者 20 次。这让计算延迟从几秒钟缩短到了几十毫秒,机器人才能不卡顿地丝滑运动。
  3. 滚动执行(Receding Horizon):你看最后的主循环,机器人每次预测一长串动作,但只执行一小部分。这就像人开车一样,眼睛看着远方(预测 16 步),但手只打眼前的方向盘(执行 8 步),然后不断循环这个过程,安全且鲁棒。
#AI求职记录#
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务