logo Mr.Robota 具身智能学习手册 EN
第十二章:具身智能面试问题汇总

1. 必须熟悉 DDPG 、 PPO 、 TD3 、 SAC 等算法的原理和区别。

这四种算法是连续控制(如机器人控制)中最常用的深度强化学习算法。

PPO (Proximal Policy Optimization)

  • 原理:PPO是一种同策略(On-policy)的策略梯度算法。它使用截断(Clipping)机制限制新旧策略的更新步长,防止策略更新“翻车”。

  • 核心公式:

    LCLIP(θ)=E^t[min⁡(rt(θ)A^t,clip(rt(θ),1−ϵ,1+ϵ)A^t)]L^{CLIP}(\theta) = \hat{\mathbb{E}}_t \left[ \min(r_t(\theta)\hat{A}_t, \text{clip}(r_t(\theta), 1-\epsilon, 1+\epsilon)\hat{A}_t) \right]
  • 数值计算示例:

    假设在时间步 tt,GAE计算出的优势函数 A^t=10\hat{A}_t = 10(正数,说明这个动作很好)。

    设定截断超参数 ϵ=0.2\epsilon = 0.2。

    如果新网络过于激进,导致新旧策略概率比 rt(θ)=1.5r_t(\theta) = 1.5(新策略采用该动作的概率是旧策略的1.5倍):

    1. 原始目标:1.5×10=151.5 \times 10 = 15

    2. 截断目标:clip(1.5,0.8,1.2)×10=1.2×10=12\text{clip}(1.5, 0.8, 1.2) \times 10 = 1.2 \times 10 = 12

    3. 取最小值:min⁡(15,12)=12\min(15, 12) = 12

      结论:即使网络想大幅度更新到15,PPO强制将其截断为12,保证了训练的稳定性。

DDPG (Deep Deterministic Policy Gradient)

  • 原理:异策略(Off-policy)的 Actor-Critic 算法。Actor输出确定性动作,Critic评估Q值。

  • 核心公式(Critic更新):

    yi=ri+γQϕ′(si+1,μθ′(si+1))y_i = r_i + \gamma Q_{\phi'}(s_{i+1}, \mu_{\theta'}(s_{i+1}))
  • 数值计算示例:

    假设机器人往前走了一步,获得奖励 ri=1.0r_i = 1.0。折扣因子 γ=0.99\gamma = 0.99。

    目标网络(Target Actor和Target Critic)预测下一个状态的最优Q值为 Qϕ′=100Q_{\phi'} = 100。

    计算TD目标值(备注1):yi=1.0+0.99×100=100.0y_i = 1.0 + 0.99 \times 100 = 100.0。

    如果当前Critic网络预测的Q值为90,则均方误差(MSE) Loss为 (100.0−90)2=100(100.0 - 90)^2 = 100。

TD3 (Twin Delayed DDPG)

  • 原理:解决DDPG中Q值高估问题,引入双Q网络、延迟更新、目标策略平滑。

  • 核心公式(截断双Q学习与平滑):

    y=r+γmin⁡j=1,2Qϕj′(s′,a′)y = r + \gamma \min_{j=1,2} Q_{\phi'_j}(s', a')
    a′=μθ′(s′)+ϵ,ϵ∼clip(N(0,σ),−c,c)a' = \mu_{\theta'}(s') + \epsilon, \quad \epsilon \sim \text{clip}(\mathcal{N}(0, \sigma), -c, c)
  • 数值计算示例:

    目标Actor给出下一个动作 araw=0.5a_{raw} = 0.5。加入噪声 ϵ=0.05\epsilon = 0.05(经过截断),最终目标动作 a′=0.55a' = 0.55。

    把 a′a' 输入两个目标Critic网络:

    假设 Critic 1 预测Q值为 105105,Critic 2 预测Q值为 9595。

    TD3取最小值以抑制高估:min⁡(105,95)=95\min(105, 95) = 95。

    最终TD目标 y=r+γ×95y = r + \gamma \times 95。

SAC (Soft Actor-Critic)

  • 原理:异策略的最大熵强化学习算法,鼓励探索。

  • 核心公式(目标函数中的熵项):

    J(π)=E[r(st,at)+αH(π(⋅∣st))]J(\pi) = \mathbb{E} \left[ r(s_t, a_t) + \alpha \mathcal{H}(\pi(\cdot|s_t)) \right]
  • 数值计算示例:

    假设当前状态下有两个离散化的可能动作,策略输出概率分布为 [0.9,0.1][0.9, 0.1]。

    计算信息熵:H=−(0.9ln⁡0.9+0.1ln⁡0.1)≈0.325\mathcal{H} = -(0.9 \ln 0.9 + 0.1 \ln 0.1) \approx 0.325。

    如果温度系数 α=0.2\alpha = 0.2。则该步的“软奖励”附加项为 0.2×0.325=0.0650.2 \times 0.325 = 0.065。

    如果策略变得更随机 [0.5,0.5][0.5, 0.5],熵 H≈0.693\mathcal{H} \approx 0.693,附加奖励变为 0.1380.138。SAC通过这种方式实质性地奖励了探索行为。


2. 理解 GAE (广义优势估计)和 PG (策略梯度)等概念。

PG (Policy Gradient)

  • 公式:∇θJ(θ)=E[∇θlog⁡πθ(at∣st)R(τ)]\nabla_\theta J(\theta) = \mathbb{E} \left[ \nabla_\theta \log \pi_\theta(a_t|s_t) R(\tau) \right]

  • 数值计算示例:

    假设一回合总奖励 R(τ)=100R(\tau) = 100。某一步动作 ata_t 的概率 π(at)=0.2\pi(a_t) = 0.2。

    log⁡(0.2)≈−1.6\log(0.2) \approx -1.6。梯度的更新幅度将乘以 100100。如果同一动作在另一条轨迹总奖励只有 1010,则更新力度变为 1010。网络会逐渐倾向于拉高高回报轨迹中动作的概率。

GAE (Generalized Advantage Estimation)

  • 原理:平衡TD误差的偏差和方差。

  • 核心公式:

    δtV=rt+γV(st+1)−V(st)\delta_t^V = r_t + \gamma V(s_{t+1}) - V(s_t)

    A^t=∑l=0∞(γλ)lδt+lV\hat{A}_t = \sum_{l=0}^\infty (\gamma \lambda)^l \delta_{t+l}^V

  • 数值计算示例(2步轨迹的手算):

    设 γ=0.99\gamma = 0.99, λ=0.95\lambda = 0.95。

    有三个状态 s0,s1,s2s_0, s_1, s_2(结束)。

    奖励:r0=1,r1=2r_0 = 1, r_1 = 2。

    价值网络预测:V(s0)=2.0,V(s1)=3.0,V(s2)=0.0V(s_0) = 2.0, V(s_1) = 3.0, V(s_2) = 0.0(结束状态为0)。

    1. 计算每步单步TD误差 (δ\delta):

      δ0=1+0.99×3.0−2.0=1.97\delta_0 = 1 + 0.99 \times 3.0 - 2.0 = 1.97

      δ1=2+0.99×0.0−3.0=−1.0\delta_1 = 2 + 0.99 \times 0.0 - 3.0 = -1.0

    2. 反向递推计算优势 (AA):

      最后一步:A1=δ1=−1.0A_1 = \delta_1 = -1.0

      倒数第二步:A0=δ0+γλA1=1.97+(0.99×0.95)×(−1.0)=1.97−0.9405=1.0295A_0 = \delta_0 + \gamma \lambda A_1 = 1.97 + (0.99 \times 0.95) \times (-1.0) = 1.97 - 0.9405 = 1.0295

    结论:动作 a0a_0 的优势值为正 (1.0295),应鼓励;动作 a1a_1 为负 (-1.0),应抑制。

Pythonimport torch
# 带入上述数值验证伪代码
rewards = torch.tensor([1.0, 2.0])
values = torch.tensor([2.0, 3.0])
next_value = 0.0
dones = torch.tensor([0.0, 1.0])
gamma, lam = 0.99, 0.95
# (循环逻辑见原始回答,计算结果与手算完全一致)




1. 宏观视角:强化学习的“教练与运动员”

我们可以把整个流程想象成一个**教练(GAE/价值网络)指导运动员(策略网络)**的过程。

策略梯度 (PG) —— 运动员的演习

PG 的核心逻辑非常朴素:“如果这一局赢了,那么这一局里我做的所有动作,以后都要提高出现的概率;如果输了,就降低概率。”

  • 它不关心动作本身好不好,它只关心结果。
  • 痛点:如果一局比赛有 1000 步,第 5 步走得精妙绝伦,但第 999 步手滑输了。PG 会因为结局是“输”,而把第 5 步那个天才动作也一起惩罚了。这就是高方差(Variance)。

广义优势估计 (GAE) —— 教练的复盘

GAE 就是为了解决上面的痛点。它不再用“最终结果”来评价每一步,而是根据**“这一步比我预想的好多少”**来评价。

  • 它结合了“当前的即时奖励”和“对未来的预测”。
  • 它像一个理性的教练,告诉运动员:“虽然最后输了,但你第 5 步那个操作确实让胜率从 20% 提高到了 60%,那一笔加分!”

2. 完整的 Pipeline(迭代流程)

在实际的 PPO 或 A2C 算法中,数据是这样流动的:

第一步:交互(采样)

运动员(策略网络 πθ\pi_\theta)去环境中玩 NN 步。

  • 输出:得到一堆数据 {st,at,rt,st+1}\{s_t, a_t, r_t, s_{t+1}\}(状态、动作、奖励、下一个状态)。
  • 状态:此时网络参数 θ\theta 是固定的,不更新。

第二步:评价(算分 - GAE 发挥作用)

现在我们要给这 NN 步里的每一个动作 ata_t 打分,这个分数就是 优势函数 AtA_t。

  1. 价值估计:把 sts_t 输入给“价值网络 VV”,它会预测每个状态值多少分。
  2. 计算 TD 误差 (δ\delta):看看实际拿到的奖励 rtr_t 加上对未来的预期,是否超过了现在的预期。
  3. GAE 平滑:利用 λ\lambda 参数,把现在、一秒后、两秒后的误差全部加权累加。
    • 这一步结束后,每个动作 ata_t 都有了一个精准的 A^t\hat{A}_t(正数代表比预期好,负数代表比预期差)。

第三步:学习(更新 - PG 发挥作用)

有了打分(A^t\hat{A}_t),我们要回头修改运动员(策略网络)的肌肉记忆。

  1. 算梯度:找出在状态 sts_t 下,选择动作 ata_t 的概率 log⁡π(at∣st)\log \pi(a_t|s_t)。

  2. 加权更新:

    更新量=∇θlog⁡π(at∣st)×A^t\text{更新量} = \nabla_\theta \log \pi(a_t|s_t) \times \hat{A}_t
    • 如果 A^t\hat{A}_t 是正的(好球!),梯度方向会拉高该动作的概率。
    • 如果 A^t\hat{A}_t 是负的(臭球!),梯度方向会压低该动作的概率。
  3. 梯度上升:更新 θ\theta,让网络变得更聪明。

第四步:循环

用更新后的“运动员”重新去打球,重复第一步。


3. 为什么一定要 GAE?(深度直觉)

如果我们只用 PG,不加 GAE,会发生什么?

  • 没有 GAE 的 PG(REINFORCE):

    用 R(τ)R(\tau)(整局的总分)去乘每一个动作。

    • 缺点:更新极其缓慢且不稳定,就像你参加了一场 3 小时的考试,最后只给你一个总分,你根本不知道哪道题做对了,哪道题做错了。
  • 有了 GAE 的 PG:

    用 A^t\hat{A}_t 去乘每一个动作。

    • 优点:它给每一道题(每一个动作)都安排了一个“小分”。λ\lambda 参数就像一个调节阀:
      • 当 λ=0\lambda=0,它只看下一秒,非常有远见但可能短视。
      • 当 λ=1\lambda=1,它看全局,非常公正但可能被偶然因素(噪声)干扰。
      • GAE 取中间值,实现了偏差和方差的完美平衡。

总结:你的计算过程是怎么串起来的?

  1. V(s)V(s) 网络提供了预期的“基准线”。
  2. δt\delta_t (TD Error) 计算了“现实与理想的差距”。
  3. GAE (Advantage) 通过 γλ\gamma \lambda 的递归,把这些差距串成了一条线,给动作定了性(好还是坏)。
  4. PG (Policy Gradient) 拿着这个定性结果,去微调神经网络里的权重。

3. 能讲清楚奖励函数的设计思路,以及如何处理 Sim-to-Real 的 gap。

奖励函数设计思路

  • 公式:

    Rt=ωtaskI(success)+ωshapeexp⁡(−α∣∣pee−pobj∣∣2)−ωpen∣∣τt∣∣22R_t = \omega_{task} \mathbb{I}(success) + \omega_{shape} \exp(-\alpha || p_{ee} - p_{obj} ||_2) - \omega_{pen} || \tau_t ||^2_2
  • 数值计算示例:

    假设抓取任务权重 ωtask=100\omega_{task} = 100,距离引导 ωshape=5\omega_{shape} = 5,平滑度参数 α=10\alpha = 10,惩罚权重 ωpen=0.1\omega_{pen} = 0.1。

    当前机械臂末端坐标 pee=(0.5,0,0.5)p_{ee} = (0.5, 0, 0.5),目标物体坐标 pobj=(0.5,0,0.4)p_{obj} = (0.5, 0, 0.4)。

    力矩输出二范数的平方 ∣∣τt∣∣22=4.0||\tau_t||^2_2 = 4.0。

    1. 计算距离:∣∣pee−pobj∣∣2=0+0+(0.5−0.4)2=0.1|| p_{ee} - p_{obj} ||_2 = \sqrt{0 + 0 + (0.5-0.4)^2} = 0.1 米。

    2. 计算成型奖励:5×exp⁡(−10×0.1)=5×exp⁡(−1)≈5×0.367=1.8355 \times \exp(-10 \times 0.1) = 5 \times \exp(-1) \approx 5 \times 0.367 = 1.835。

    3. 计算惩罚:0.1×4.0=0.40.1 \times 4.0 = 0.4。

    4. 未抓到目标,I(success)=0\mathbb{I}(success) = 0。

      当前步总奖励:Rt=0+1.835−0.4=1.435R_t = 0 + 1.835 - 0.4 = 1.435。

处理 Sim-to-Real 的 Gap (Domain Randomization 数值示例)

在仿真中,我们将机械臂连杆的质量设定为正态分布。真实质量为 2.0 kg,我们在仿真中设定每回合采样质量 m∼N(2.0,0.22)m \sim \mathcal{N}(2.0, 0.2^2)。这意味着RL网络在训练时,必须学会一套在 1.6 kg 到 2.4 kg 范围内都能成功的控制策略,从而在部署到物理世界时,直接无视掉电机的摩擦力模型误差。


4. 熟悉 Open-VLA 、 RT-2 等主流模型的架构和思想。

RT-2 (Robotic Transformer 2)

  • 核心思想:将动作当作文本词汇一样进行离散化(Tokenization),直接喂给大模型预测。

  • 数值计算示例(动作 Token 化):

    公式:atoken=⌊a−aminamax−amin×255⌋a_{token} = \lfloor \frac{a - a_{min}}{a_{max} - a_{min}} \times 255 \rfloor

    假设需要预测夹爪的开合程度 aa,真实物理值范围是 [−1.0,1.0][-1.0, 1.0](-1全关,1全开)。

    当前示范数据中,夹爪开合值为 a=0.12a = 0.12。

    代入公式:

    atoken=⌊0.12−(−1.0)1.0−(−1.0)×255⌋=⌊1.122.0×255⌋=⌊0.56×255⌋=⌊142.8⌋=142a_{token} = \lfloor \frac{0.12 - (-1.0)}{1.0 - (-1.0)} \times 255 \rfloor = \lfloor \frac{1.12}{2.0} \times 255 \rfloor = \lfloor 0.56 \times 255 \rfloor = \lfloor 142.8 \rfloor = 142。

    此时,物理动作被映射为大模型字典中第 142 个特殊 token(例如 <action_142>)。

Open-VLA

  • 基于7B参数。如果使用FP16精度推理,权重本身需要占用约 14GB 显存,加上KV Cache,通常需要一张 24GB 的 RTX 3090 或 4090 才能进行流畅的单步推理。

5. 了解 LoRA 等微调方法的原理。

LoRA (Low-Rank Adaptation)

  • 公式:h=W0x+BAxh = W_0 x + B A x

  • 数值计算示例(极简矩阵手算):

    假设预训练模型的某个线性层权重 W0∈R2×2W_0 \in \mathbb{R}^{2 \times 2}。由于太大被冻结。输入特征 x=[1,2]Tx = [1, 2]^T。

    我们设定秩 (Rank) r=1r = 1。

    初始化低秩矩阵 A∈R1×2A \in \mathbb{R}^{1 \times 2} 为随机高斯分布,假设当前 A=[1,1]A = [1, 1]。

    初始化低秩矩阵 B∈R2×1B \in \mathbb{R}^{2 \times 1} 为全0,但假设训练了几步后 B=[1,−1]TB = [1, -1]^T。

    设缩放因子 scaling=α/r=16/1=16\text{scaling} = \alpha / r = 16 / 1 = 16。

    旁路计算过程:

    1. Ax=[1,1]×[1,2]T=1×1+1×2=3A x = [1, 1] \times [1, 2]^T = 1 \times 1 + 1 \times 2 = 3 (降维到 r=1)

    2. B(Ax)=[1,−1]T×3=[3,−3]TB (Ax) = [1, -1]^T \times 3 = [3, -3]^T (升维回2)

    3. 乘以缩放因子:16×[3,−3]T=[48,−48]T16 \times [3, -3]^T = [48, -48]^T。

      最终输出就是在原预训练模型输出 W0xW_0 x 的基础上,加上这微调带来的 Δ=[48,−48]T\Delta = [48, -48]^T。

      参数量对比:原本如果全参微调需要更新 2×2=42 \times 2 = 4 个参数;使用 r=1r=1 的 LoRA 只需要更新 1×2+2×1=41 \times 2 + 2 \times 1 = 4 个参数。但在大模型中(比如 4096×40964096 \times 4096),LoRA (r=8r=8) 的参数量仅为全参的 0.4%0.4\%!


6. 能够分析 VLA 与其他方法(如纯强化学习)的优劣,并思考其在工业界的落地可能性。

  • 数值对比分析:
    • 成功率与泛化:在一个“抓取桌上任意颜色的杯子”任务中,纯RL面对未见过的红色杯子,成功率可能从 95% 断崖式下跌到 5%;而VLA因为具备VLM的语义理解,依然能保持 85% 以上的成功率。
    • 控制频率:纯RL网络极小(如MLP),推理延迟在 1ms 以内,支持 500Hz 的底层力控;而 7B 参数的 VLA(哪怕量化为INT8),单次前向推理通常需要 80ms - 200ms,最高只能做 5Hz - 10Hz 的高级动作规划。
  • 工业落地:因此,工业界会采用 上层VLA (2Hz) + 下层MPC/RL (200Hz) 的双层架构。

7. 理解正逆运动学( IK )、 雅各比矩阵 、 PID 控制 、 MPC 等基本概念。

正逆运动学 (以二维平面2自由度机械臂为例)

  • 数值示例:

    两根连杆长度 L1=1.0L_1 = 1.0 米, L2=1.0L_2 = 1.0 米。

    正运动学 (FK):已知关节角 θ1=90∘(π/2)\theta_1 = 90^\circ (\pi/2), θ2=0∘\theta_2 = 0^\circ。

    末端坐标 x=L1cos⁡(θ1)+L2cos⁡(θ1+θ2)=0+0=0x = L_1 \cos(\theta_1) + L_2 \cos(\theta_1+\theta_2) = 0 + 0 = 0。

    末端坐标 y=L1sin⁡(θ1)+L2sin⁡(θ1+θ2)=1+1=2y = L_1 \sin(\theta_1) + L_2 \sin(\theta_1+\theta_2) = 1 + 1 = 2。

    结论:末端在 (0,2)(0, 2)。

    逆运动学 (IK):已知目标点在 (0,2)(0, 2),反推可知 θ1=90∘,θ2=0∘\theta_1 = 90^\circ, \theta_2 = 0^\circ(在无奇异点时成立)。

雅各比矩阵

  • 数值示例:X˙=J(θ)θ˙\dot{X} = J(\theta) \dot{\theta}

    假设当前算出的 J(θ)=[0−110]J(\theta) = \begin{bmatrix} 0 & -1 \\ 1 & 0 \end{bmatrix}。我们希望末端执行器以线速度 X˙=[0.1,0]T\dot{X} = [0.1, 0]^T (m/s) 沿x轴正方向平移。

    求解关节速度 θ˙=J−1X˙=[01−10][0.10]=[0−0.1]\dot{\theta} = J^{-1} \dot{X} = \begin{bmatrix} 0 & 1 \\ -1 & 0 \end{bmatrix} \begin{bmatrix} 0.1 \\ 0 \end{bmatrix} = \begin{bmatrix} 0 \\ -0.1 \end{bmatrix} (rad/s)。

    也就是关节1不动,关节2以 0.1 rad/s 的速度反转。

PID 控制

  • 公式:u(t)=Kpe(t)+Ki∫e(τ)dτ+Kde˙(t)u(t) = K_p e(t) + K_i \int e(\tau)d\tau + K_d \dot{e}(t)

  • 数值计算示例:

    目标位置 10.0,当前真实位置 8.0。当前误差 e(t)=2.0e(t) = 2.0。

    累计历史误差积分 ∫e=5.0\int e = 5.0。

    误差正在减小,变化率 e˙(t)=−0.5\dot{e}(t) = -0.5。

    设置参数 Kp=2.0,Ki=0.1,Kd=0.5K_p = 2.0, K_i = 0.1, K_d = 0.5。

    电机输出力矩 u(t)=(2.0×2.0)+(0.1×5.0)+(0.5×−0.5)=4.0+0.5−0.25=4.25u(t) = (2.0 \times 2.0) + (0.1 \times 5.0) + (0.5 \times -0.5) = 4.0 + 0.5 - 0.25 = 4.25 Nm。


8. 了解常见传感器(如 Realsense 深度相机 )的原理和应用。

Realsense 深度相机 (双目视差计算)

  • 公式:Z=f⋅BdZ = \frac{f \cdot B}{d}

  • 数值计算示例:

    假设相机的红外镜头焦距 f=600f = 600 像素。

    左右摄像头的物理基线距离 B=0.05B = 0.05 米 (5厘米)。

    目标物体上的一点,在左眼图像的横坐标为 300,在右眼图像横坐标为 280。视差 d=300−280=20d = 300 - 280 = 20 像素。

    计算深度距离:Z=600×0.0520=3020=1.5Z = \frac{600 \times 0.05}{20} = \frac{30}{20} = 1.5 米。

    相机就能输出这个像素点的深度为 1.5m。


9. “你项目里奖励函数为什么这么设置?尝试过哪些其他方式?”

(融入势能计算的数值示例)

“除了稀疏奖励,我使用了基于势能的奖励成型(Potential-based Reward Shaping):

F(s,a,s′)=γΦ(s′)−Φ(s)F(s, a, s') = \gamma \Phi(s') - \Phi(s)

其中 Φ(s)\Phi(s) 是末端与物体距离倒数的某种缩放。

具体计算:假设距离 dd,我们定义势能函数 Φ(s)=1d+0.1\Phi(s) = \frac{1}{d + 0.1}。γ=0.99\gamma = 0.99。

在状态 ss(上一步),距离 d=0.4d=0.4 米,势能 Φ(s)=10.5=2.0\Phi(s) = \frac{1}{0.5} = 2.0。

在状态 s′s'(执行动作后),机械臂靠近了物体,距离缩小到 d=0.15d=0.15 米,势能 Φ(s′)=10.25=4.0\Phi(s') = \frac{1}{0.25} = 4.0。

这一步获得的引导奖励为:F=0.99×4.0−2.0=3.96−2.0=1.96F = 0.99 \times 4.0 - 2.0 = 3.96 - 2.0 = 1.96。

这 1.96 的正奖励有效鼓励了机械臂靠近物体,且数学上保证了不会引入局部最优的‘兜圈子’漏洞(Reward Loop)。”


10. “你的观测空间包含哪些信息?为什么这么设计?”

(融入维度计算的数值示例)

“我的观测空间严格控制了维度大小,以优化样本效率。具体拼接如下:

  1. 本体信息:6自由度机械臂的关节角 (6维) 和角速度 (6维) = 12维。

  2. 末端位姿:位置 (x,y,z)(x,y,z) 3维 + 四元数姿态 4维 + 夹爪开度 1维 = 8维。

  3. 视觉特征:手眼相机的 84×84×384 \times 84 \times 3 图像,如果不降维直接Flatten是 21168 维,极易过拟合。我通过冻结的预训练 ResNet-18 提取特征,输出 zimgz_{img} 为 512 维。

    总维度:最终喂入 RL Actor 网络的观测向量 OtO_t 维度为 12+8+512=53212 + 8 + 512 = 532 维的 1D 张量。这个设计既保留了环境的马尔可夫性,又把状态空间压缩到了极简。”


11. “请解释一下 Transformer 的多头注意力机制。”

自注意力机制的数值计算示例

  • 公式:Attention(Q,K,V)=softmax(QKTdk)V\text{Attention}(Q, K, V) = \text{softmax} \left( \frac{Q K^T}{\sqrt{d_k}} \right) V

  • 假设输入只有两个 Token(比如“红”、“杯子”),投影后的 Q,K,VQ, K, V 维度设积极小,比如 dk=4d_k = 4。

    令 Q=[10100101]Q = \begin{bmatrix} 1 & 0 & 1 & 0 \\ 0 & 1 & 0 & 1 \end{bmatrix} (两行代表两个词的Query)。

    令 K=[10100101]K = \begin{bmatrix} 1 & 0 & 1 & 0 \\ 0 & 1 & 0 & 1 \end{bmatrix}。

    1. 计算内积 QKT=[10100101][10011001]=[2002]Q K^T = \begin{bmatrix} 1 & 0 & 1 & 0 \\ 0 & 1 & 0 & 1 \end{bmatrix} \begin{bmatrix} 1 & 0 \\ 0 & 1 \\ 1 & 0 \\ 0 & 1 \end{bmatrix} = \begin{bmatrix} 2 & 0 \\ 0 & 2 \end{bmatrix}。

    2. 除以 dk=4=2\sqrt{d_k} = \sqrt{4} = 2,得到注意力分数矩阵:[1001]\begin{bmatrix} 1 & 0 \\ 0 & 1 \end{bmatrix}。

    3. Softmax(由于非对角线为0,且为了演示简略),结果高度集中在自身。最后乘以 VV,完成信息的提取。

      多头机制则是将上述过程在几个并行空间做 hh 次,最后 concat 在一起,保证模型在看同一个词时能提取诸如“颜色”、“形状”等不同子空间的特征。


12. “扩散模型(DM)和自回归模型(AR)在 VLA 中有什么区别?”

  • 自回归 (AR) 数值示例:

    预测一个动作序列 [a1,a2][a_1, a_2]。

    第一步预测概率 P(a1∣obs)=0.9P(a_1 | obs) = 0.9。将 a1a_1 放回输入,第二步预测 P(a2∣obs,a1)=0.8P(a_2 | obs, a_1) = 0.8。

    整体轨迹联合概率为 0.9×0.8=0.720.9 \times 0.8 = 0.72。问题在于一旦 a1a_1 预测产生微小误差,误差会随步数指数级累积(Exposure Bias)。

  • 扩散模型 (DM) 数值示例:

    预测整条动作轨迹。网络 ϵθ\epsilon_\theta 的任务是预测出当前添加的噪声。

    假设 Ground Truth 动作加上真实采样的高斯噪声 ϵ=[0.1,−0.2]T\epsilon = [0.1, -0.2]^T。

    网络前向推理预测出噪声 ϵ^=[0.08,−0.22]T\hat{\epsilon} = [0.08, -0.22]^T。

    计算 DDPM 的 MSE Loss:∣∣ϵ−ϵ^∣∣22=(0.1−0.08)2+(−0.2−(−0.22))2=0.0004+0.0004=0.0008|| \epsilon - \hat{\epsilon} ||_2^2 = (0.1 - 0.08)^2 + (-0.2 - (-0.22))^2 = 0.0004 + 0.0004 = 0.0008。

    DM每次直接去噪并输出一个包含多步动作的 Chunk(如 16 步长度),轨迹天然是平滑且相互一致的,彻底解决了 AR 的级联误差问题。


13. “你为什么选择我们实验室/这个方向?”

"我选择具身智能方向,是因为它能闭环干预物理世界。

至于选择贵实验室:

  1. 技术契合度:我阅读了您团队关于扩散模型解决长视野灵巧手操作的论文。我注意到你们将动作预测的 Chunk Size 设定为 32,成功将夹取成功率提升了 15%。我在我之前的项目中也尝试过调整 Action Chunking 的窗口长度,发现 16 到 32 是一个甜点区,这让我对你们的工程细节产生了极大共鸣。
  2. 算力与硬件落地:你们拥有 4 台配备多指灵巧手的真实机器人平台,并且具备私有云的 A100 集群。相比我目前只能用单卡 RTX 3090 跑 50 万步强化学习仿真,你们的平台能让我在相同的周期内跑上 1000 万步,极大地加速 Sim-to-Real 的闭环周期。"

一、 DDPG/PPO/TD3/SAC 到底是干嘛的?输入输出是什么?

它们是一套通用的“大脑学习规则”(连续控制框架)。你可以用它们训练机械臂抓取、训练机器狗跑酷、甚至训练自动驾驶汽车打方向盘。

这四个算法的核心结构通常都包含两个神经网络:Actor(演员,负责输出动作) 和 Critic(评论家,负责打分)。

1. 模型的输入 (Observation/State)

在执行任务时,输入给模型(主要是 Actor 网络)的通常是一个一维向量,代表机器人当前感知到的状态 sts_t。这个向量里可以拼接各种信息:

  • 物理状态(最常见):比如机械臂6个关节的角度、角速度,末端夹爪的 (x,y,z)(x,y,z) 坐标。如果是一个12维的数组,网络输入层大小就是12。
  • 图像输入(Visual RL):如果你要让模型“看”图像,通常不会把几万像素直接喂给这些强化学习算法。标准的做法是先用一个 CNN(比如 ResNet)把RGB图像压缩成一个固定长度的特征向量(比如 256 维),然后再和上面的物理状态拼接到一起喂给算法。
  • 语言指令:如果是最近流行的语言条件控制,做法类似。把“抓起红色苹果”这句话通过类似 CLIP 的文本编码器变成一串数字向量,也拼接到输入状态里。

2. 模型的输出 (Action)

Actor 网络的输出 ata_t 是下一步要执行的连续动作指令。

  • 具体形式:比如一个 6 维的向量,代表机械臂 6 个电机的目标扭矩,或者期望的关节角速度。
  • 输出流向:这个输出会直接发送给物理引擎(比如 Isaac Gym 仿真器)或者真实的硬件控制器去执行。

3. 中间迭代流程 (The RL Loop)

以机械臂抓东西为例,整个闭环迭代过程如下:

  1. 观察环境:传感器获取当前状态 sts_t(比如:机械臂在A点,目标在B点)。
  2. 网络决策:把 sts_t 喂给 Actor 网络,Actor 计算后输出动作 ata_t(比如:各个电机转动一定角度)。
  3. 环境反馈:机器人执行动作 ata_t 后,移动到了新状态 st+1s_{t+1}。这时候环境(或你写的代码)会给出一个奖励 rtr_t(比如:靠近目标了,给 +1 分;撞墙了,给 -10 分)。
  4. 收集数据:把这一步的经历 (st,at,rt,st+1)(s_t, a_t, r_t, s_{t+1}) 存到一个“经验回放池”(一个大的数据表)里。
  5. 更新网络:
    • Critic 更新:Critic 从池子里拿出数据,学习如何更准确地预测“在某个状态下采取某个动作,未来总共能拿多少分”。(这里就会用到 TD 目标值,马上讲)。
    • Actor 更新:Actor 根据 Critic 的打分来调整自己的参数,确保下次遇到同样情况时,大概率输出得分更高的动作。
  6. 循环:回到第1步,不断重复几万到几百万次,直到模型学会最佳策略。

二、 什么是“TD 目标值 (TD Target)”?

TD(Temporal Difference,时间差分)是强化学习里最精妙的一个概念。你可以把 TD 目标值理解为:结合了刚刚发生的“真实奖励”,对未来总收益做出的“最新、更准确的预测值”。

我举个生活中的例子你就秒懂了:

假设你要从北京开车去上海,出发前你大脑(Critic网络)估算全程需要 12小时。

开到天津时,你花掉了 2小时(这相当于当前步的真实奖励 rtr_t)。此时,你用导航重新查了一下,从天津到上海还需要 9小时(这相当于模型对下一个状态 st+1s_{t+1} 的未来估算)。

那么,结合这已经走完的一段路,你对“北京到上海”这趟旅程的最新总时间估算变成了:

2小时 (真实已花时间) + 9小时 (最新预测剩余时间) = 11小时。

这个 11小时,就是 TD 目标值!

你的大脑会根据这个 11 小时,去修正出发前预估的 12 小时。这种利用“走一步看一步”的新信息来不断修正旧预测的方法,就是 TD 学习的核心。

放到公式里看就是这样:

yt=rt+γQ(st+1,at+1)y_t = r_t + \gamma Q(s_{t+1}, a_{t+1})
  • rtr_t:刚刚执行动作拿到的真实奖励(花掉的2小时)。
  • Q(st+1,at+1)Q(s_{t+1}, a_{t+1}):Critic 网络对到了新状态后,未来还能拿多少分的预测(从天津到上海还要多久)。
  • γ\gamma:折扣因子(通常是 0.99,代表未来的预估要打个折扣,稍微降低点权重)。
  • yty_t:算出来的 TD 目标值。

在训练时,Critic 网络的任务就是拼命让自己的预测值 Q(st,at)Q(s_t, a_t) 去逼近这个 TD 目标值 yty_t,以此来让自己变得越来越精准。

宏观上,DDPG/PPO/TD3/SAC确实都在玩同一个“观察-动作-奖励-更新”的过家家游戏(Actor-Critic 架构)。但在微观上,为了解决训练过程中出现的各种“翻车”问题,科学家们对网络输出形式、Q值计算方法和奖励机制做了不同的“魔改”。

核心区别就集中在这几个微观层面上。我们可以先把 PPO 拿出来,再把 DDPG、TD3、SAC 这三个“同门师兄弟”放在一起对比。

1. 根本阵营的区别:数据怎么用?

  • PPO(同策略,On-policy): 它是“现学现卖”的典型。Actor 亲自去环境里收集一批数据,用完更新完网络后,这批数据就扔掉了。下一次更新必须再用最新的 Actor 去收集新数据。
  • DDPG / TD3 / SAC(异策略,Off-policy): 它们有一个巨大的“经验回放池”(Replay Buffer)。Actor 收集的数据存进去后,Critic 可以在里面反复捞旧数据来学习。这种方式更节省与环境交互的成本(样本效率高)。

2. 微观手术刀:它们到底在 Q 值和策略上改了什么?

这三个异策略算法(DDPG -> TD3 -> SAC)其实是一部“填坑血泪史”,它们的微观区别刚好回答了你的疑问:

DDPG:开山鼻祖(但也漏洞百出)

  • 动作输出:Actor 直接输出一个确定的数值(比如“电机输出 2.5 牛米”)。这叫确定性策略。
  • Q值计算:Critic 就像一个天真的老师,直接根据正常的 TD 目标值公式 y=r+γQ(s′,a′)y = r + \gamma Q(s', a') 来更新。
  • 致命缺陷:因为神经网络在预测时总会有误差,DDPG 的 Critic 极其容易盲目乐观(Q值高估)。它会把一个明明很烂的动作打出极高的分数,导致 Actor 学废了。

TD3:DDPG 的“强力打补丁版”

为了解决 DDPG 的“盲目乐观”,TD3 在微观的 Q 值计算上做了极其精妙的修改:

  • 双 Q 网络取最小(重点!):它直接搞了两个独立的 Critic 网络。在计算未来的 Q 值预测时,两个网络分别打分,然后强制取两者中较小的一个。
    • 生活例子:你去评估一套房子的未来价值,找了两个估价师。一个说值 500 万,一个说值 300 万。为了保险起见(防止高估被套牢),你按 300 万来做决策。
  • 目标策略平滑:在计算 TD 目标值时,它故意给下一步的动作 a′a' 加上一点点随机噪声。这迫使 Critic 明白:“别只盯着一个特定动作给高分,你要看它周围的一小片区域是不是都好。”
  • 延迟更新:Critic 更新两三次,Actor 才更新一次。等 Critic 把分数算准了,再指导 Actor。

SAC:当今王者,直接修改了“奖励”的定义

SAC 另辟蹊径,它在微观上的最大改变是修改了奖励函数的目标(最大熵框架):

  • 奖励的微观改变:它在传统的真实奖励 rr 后面,硬生生塞进了一个“熵奖励”(Entropy Bonus)。
    • 目标变成了:最大化 [任务奖励+α×策略的随机性][ 任务奖励 + \alpha \times 策略的随机性 ]。
  • 动作输出:与 DDPG/TD3 输出确定的动作不同,SAC 的 Actor 输出的是一个高斯分布(均值和方差)。
  • 效果:这意味着 SAC 不仅要求机器人把任务完成,还鼓励机器人用尽可能多、尽可能随机的姿势去完成任务。这种微观设计让 SAC 在面对物理环境的突发干扰时,表现出较强的鲁棒性。

3. 一图胜千言:微观区别总结表

算法 Actor 输出形式 Q 值预测微观操作 (Critic) 奖励/更新的特殊机制 适用场景特点
PPO 概率分布 (高斯/离散) 使用优势函数 (Advantage) 截断 (Clipping),防止更新步伐太大扯到蛋 极度稳定,调参最简单,最省心
DDPG 确定性具体数值 单个 Q 网络,直接预测 无特殊机制,直接算 TD 误差 容易崩溃,现在很少单独用
TD3 确定性具体数值 双 Q 网络取最小值 目标动作加噪,延迟更新 Actor 训练速度快,算力消耗相对较小
SAC 概率分布 (高斯均值/方差) 双 Q 网络取最小值 最大化策略熵(奖励里加了探索分) 样本利用率极高,真机部署鲁棒性最强

拨开复杂的数学公式,它们在代码实现时,往往只是在 Critic.forward() 或者 Loss 的计算那几行代码里,加上了 torch.min(q1, q2) 或者 + alpha * entropy 这样的小操作,却带来了宏观性能的质变。