<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>轨迹预测 on 朝花夕拾</title>
        <link>https://example.org/tags/%E8%BD%A8%E8%BF%B9%E9%A2%84%E6%B5%8B/</link>
        <description>Recent content in 轨迹预测 on 朝花夕拾</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>en-us</language>
        <lastBuildDate>Tue, 17 Mar 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://example.org/tags/%E8%BD%A8%E8%BF%B9%E9%A2%84%E6%B5%8B/index.xml" rel="self" type="application/rss+xml" /><item>
            <title>MotionLM: Multi-Agent Motion Forecasting as Language Modeling</title>
            <link>https://example.org/post/robotics/e2e/motion-lm/</link>
            <pubDate>Tue, 17 Mar 2026 00:00:00 +0000</pubDate>
            <guid>https://example.org/post/robotics/e2e/motion-lm/</guid>
            <description>&lt;hr&gt;&#xA;&lt;h2 id=&#34;-一句话概括&#34;&gt;🎯 一句话概括&#xA;&lt;/h2&gt;&lt;p&gt;把自动驾驶的多智能体轨迹预测，变成一场&amp;quot;文字接龙&amp;quot;游戏——用语言模型预测下一个动作词的方式，来预测车辆和行人的未来轨迹。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;-核心洞察马路上的聊天室&#34;&gt;🌟 核心洞察：马路上的&amp;quot;聊天室&amp;quot;&#xA;&lt;/h2&gt;&lt;p&gt;想象一下，繁忙的十字路口就像是一个喧闹的**&amp;ldquo;大型聊天室&amp;rdquo;**。汽车、自行车、行人都在用他们的肢体语言和移动轨迹进行着高频的&amp;quot;对话&amp;quot;——&amp;ldquo;我要变道了&amp;rdquo;、&amp;ldquo;你先走&amp;rdquo;、&amp;ldquo;我要加速了&amp;rdquo;。&lt;/p&gt;&#xA;&lt;p&gt;既然这些交互如此像人类的语言交流，Waymo 的研究员们脑洞大开：&lt;strong&gt;为什么不直接用大语言模型（LLM，比如 ChatGPT 的底层逻辑）的方式，来预测这些车辆和行人的未来轨迹呢？&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;于是，&lt;strong&gt;MotionLM&lt;/strong&gt; 诞生了。它抛弃了传统轨迹预测中那些繁琐的设定，直接把多智能体轨迹预测（Multi-Agent Motion Prediction）变成了一场&amp;quot;文字接龙&amp;quot;游戏。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;-技术实现详解&#34;&gt;🔧 技术实现详解&#xA;&lt;/h2&gt;&lt;h3 id=&#34;1-核心魔法把连续的轨迹变成离散的单词&#34;&gt;1. 核心魔法：把&amp;quot;连续的轨迹&amp;quot;变成&amp;quot;离散的单词&amp;quot;&#xA;&lt;/h3&gt;&lt;p&gt;以前的模型在预测轨迹时，通常是在预测连续的坐标点（x, y）。但 MotionLM 说：&amp;ldquo;不，我要把它变成词汇表！&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;研究团队把连续的轨迹坐标转换成了&lt;strong&gt;离散的运动 Token（Discrete Motion Tokens）&lt;/strong&gt;。这就好比把一段连续的路线切成了一个个特定的&amp;quot;动作单词&amp;quot;。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;技术收益：&lt;/strong&gt; 这样一来，模型在每一个时间步预测下一步去哪，就不再是复杂的回归任务了，而是变成了一个&lt;strong&gt;纯粹的分类任务&lt;/strong&gt;。直接在网络最后加上一个标准的 &lt;strong&gt;Softmax 层&lt;/strong&gt;，算出下一个&amp;quot;动作单词&amp;quot;的概率分布即可，简单粗暴且极其有效。&lt;/p&gt;&#xA;&lt;h4 id=&#34;tokenization-实现细节&#34;&gt;Tokenization 实现细节&#xA;&lt;/h4&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;MotionTokenizer&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;__init__&lt;/span&gt;(self, vocab_size, grid_range):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;vocab_size &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; vocab_size      &lt;span style=&#34;color:#75715e&#34;&gt;# 例如 128x128 个网格类别 + 特殊 Token&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;grid_range &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; grid_range      &lt;span style=&#34;color:#75715e&#34;&gt;# 物理位移极限，例如 [-18m, 18m]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;ZERO_ACTION_TOKEN &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# 特殊单词：代表&amp;#34;保持匀速直线运动&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;encode&lt;/span&gt;(self, continuous_traj):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        输入: continuous_traj 形状[Agent数量, 时间步T, 2(x,y)]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        输出: discrete_tokens 形状 [Agent数量, 时间步T]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        tokens &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; []&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# 计算每一步的位移变化 (Delta x, Delta y)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        displacements &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; compute_diff(continuous_traj)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; t &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; range(T):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; t &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;and&lt;/span&gt; is_almost_equal(displacements[:, t], displacements[:, t&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;]):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#75715e&#34;&gt;# 核心魔法：如果当前速度/位移跟上一步一样，直接输出&amp;#34;零动作&amp;#34;单词&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                token &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;ZERO_ACTION_TOKEN&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#75715e&#34;&gt;# 否则，将 映射到均匀划分的离散网格中，得到对应的类别ID&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                token &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;quantize_to_grid(displacements[:, t], self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;grid_range)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            tokens&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;append(token)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; torch&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;stack(tokens)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;关键参数设定：&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;预测频率：2Hz（每 0.5 秒预测一步）&lt;/li&gt;&#xA;&lt;li&gt;位移范围：$[-18.0m, 18.0m]$&lt;/li&gt;&#xA;&lt;li&gt;网格数量：128 个 Bin&lt;/li&gt;&#xA;&lt;li&gt;二维位移映射成离散的类别组合（如 $13 \times 13 = 169$ 个核心动作 Token）&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;strong&gt;神来之笔——Verlet 积分技巧：&lt;/strong&gt; 这是一个非常取巧的细节！由于真实的车辆和行人具有惯性，速度通常是平滑过渡的。MotionLM 设计了一个特殊的**&amp;ldquo;零动作 Token&amp;rdquo;&lt;strong&gt;。如果模型输出这个 Token，它的意思不是&amp;quot;停下&amp;quot;，而是&lt;/strong&gt;&amp;ldquo;保持上一个时间步的相对位移（即匀速直线运动）&amp;rdquo;**。这极大压缩了有效词汇表的复杂度，让模型更容易学到平滑的轨迹。&lt;/p&gt;&#xA;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;💡 &lt;strong&gt;Verlet 技巧的物理含义：&lt;/strong&gt; 这相当于在词表里直接内嵌了&lt;strong&gt;牛顿第一定律（惯性）&lt;/strong&gt;！模型不需要去费力学习最基础的运动学平滑性，可以把宝贵的网络容量用来学习更高级的场景理解。&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&lt;hr&gt;&#xA;&lt;h3 id=&#34;2-扔掉历史包袱无需锚点或隐变量&#34;&gt;2. 扔掉历史包袱：无需锚点或隐变量&#xA;&lt;/h3&gt;&lt;p&gt;在自动驾驶中，未来的可能性是多样的（Multimodal distributions，比如到了路口可能左转、直行或右转）。过去为了让模型学会这种&amp;quot;多种可能性&amp;quot;，工程师们必须绞尽脑汁地设计预定义的&amp;quot;锚点轨迹&amp;quot;，或者使用非常复杂的&amp;quot;显式潜在变量优化&amp;quot;。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;MotionLM 直接掀桌子了！&lt;/strong&gt; 它根本不需要这些复杂的设定。它只用了一个最标准、最经典的语言模型目标函数——&lt;strong&gt;最大化序列 Token 的平均对数概率&lt;/strong&gt;。就像 ChatGPT 预测下一个词一样，它通过海量数据的自回归训练，自然而然地就学会了所有可能的未来轨迹分布。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h3 id=&#34;3-网络架构transformer-驱动的听与说&#34;&gt;3. 网络架构：Transformer 驱动的&amp;quot;听与说&amp;quot;&#xA;&lt;/h3&gt;&lt;p&gt;MotionLM 的骨架是一个经典的 Transformer 架构，分为两大部分：&lt;/p&gt;&#xA;&lt;h4 id=&#34;场景编码器&#34;&gt;场景编码器&#xA;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;任务：&lt;/strong&gt; &amp;ldquo;察言观色&amp;rdquo;。采用早期融合网络的设计。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;输入大杂烩：&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;矢量化的高精地图&lt;/li&gt;&#xA;&lt;li&gt;红绿灯的实时状态和历史序列&lt;/li&gt;&#xA;&lt;li&gt;目标智能体和周围所有其他车辆/行人的历史轨迹&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;&lt;strong&gt;输出：&lt;/strong&gt; 经过深度 Transformer 编码，这些异构数据被融合压缩，输出一个带有极强空间和语义上下文的 &lt;strong&gt;Scene Embeddings&lt;/strong&gt;。形状为 $R \times N \times \dots \times H$，其中 $R$ 是 Rollout 数量，$N$ 是联合建模的智能体数量，$H$ 是维度。&lt;/p&gt;&#xA;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;这就像是给了模型一个&amp;quot;当前棋局的高清快照&amp;quot;。&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&lt;h4 id=&#34;联合轨迹解码器&#34;&gt;联合轨迹解码器&#xA;&lt;/h4&gt;&lt;p&gt;这是一个自回归解码器。它一边通过&lt;strong&gt;交叉注意力&lt;/strong&gt;时刻盯着场景编码器给出的环境信息，一边通过&lt;strong&gt;自注意力&lt;/strong&gt;关注各个智能体已经生成的运动 Token，然后一口气为多个智能体生成接下来的 $T$ 个动作 Token。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;MotionLM&lt;/span&gt;(nn&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;Module):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;__init__&lt;/span&gt;(self, num_agents, vocab_size, embed_dim):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        super()&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;__init__&lt;/span&gt;()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;num_agents &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; num_agents&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# 1. 场景编码器 (借用 Wayformer 的 Early Fusion 架构)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;scene_encoder &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; WayformerEncoder(embed_dim)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# 2. 各种 Embedding 层 (为&amp;#34;单词&amp;#34;赋予意义)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;token_embed &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; nn&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;Embedding(vocab_size, embed_dim)   &lt;span style=&#34;color:#75715e&#34;&gt;# 动作值编码&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;time_embed &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; nn&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;Embedding(MAX_TIME_STEPS, embed_dim) &lt;span style=&#34;color:#75715e&#34;&gt;# 时间位置编码&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;agent_embed &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; nn&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;Embedding(num_agents, embed_dim)    &lt;span style=&#34;color:#75715e&#34;&gt;# 智能体身份编码&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# 3. 标准的 Transformer 解码器&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;transformer_decoder &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; nn&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;TransformerDecoder(&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            decoder_layer&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;nn&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;TransformerDecoderLayer(d_model&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;embed_dim, nhead&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            num_layers&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;6&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        )&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# 4. 输出头：预测下一个单词的概率分布&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;lm_head &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; nn&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;Linear(embed_dim, vocab_size)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;forward&lt;/span&gt;(self, map_data, traffic_lights, history_traj, target_tokens):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        B, N, T &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; target_tokens&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;shape&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# 第一步：察言观色&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        scene_memory &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;scene_encoder(map_data, traffic_lights, history_traj)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# 第二步：准备要接龙的&amp;#34;单词&amp;#34;序列（三种 Embedding 逐元素相加）&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        val_emb &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;token_embed(target_tokens)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        time_emb &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;time_embed(torch&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;arange(T))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        agent_emb &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;agent_embed(torch&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;arange(N))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        combined_emb &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; val_emb &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; time_emb &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; agent_emb&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# 第三步：降维打击 (Flattening) - 把所有智能体在所有时间的 Token 拉平&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        flattened_sequence &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; combined_emb&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;view(B, N &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; T, &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# 第四步：因果掩码（确保 t 时刻的预测只能看到 t-1 及以前的所有人的动作）&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        causal_mask &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; generate_agent_time_causal_mask(N, T)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# 第五步：Transformer 解码&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        decoder_out &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;transformer_decoder(&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            tgt&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;flattened_sequence,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            memory&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;scene_memory,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            tgt_mask&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;causal_mask&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        )&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# 第六步：输出预测&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        logits &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;lm_head(decoder_out)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; logits&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;输入嵌入三合一：&lt;/strong&gt; 每一个输入解码器的 Token，由三个向量&lt;strong&gt;逐元素相加&lt;/strong&gt;组成：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;动作本身的值嵌入（Value Embedding，比如&amp;quot;向左偏一点&amp;quot;）&lt;/li&gt;&#xA;&lt;li&gt;时间位置编码：告诉模型现在预测的是未来第几秒&lt;/li&gt;&#xA;&lt;li&gt;智能体身份编码：告诉模型这个动作是属于车辆 A 还是行人 B&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;&lt;strong&gt;全家桶式&amp;quot;展平自注意力&amp;quot;：&lt;/strong&gt; 过去很多模型会分别算&amp;quot;时间轴上的注意力&amp;quot;和&amp;quot;智能体之间的注意力&amp;quot;。MotionLM 嫌麻烦，直接把所有智能体在所有时间步的 Token &lt;strong&gt;拉平成一条长长的超级序列&lt;/strong&gt;。在算自注意力时，只通过严格的&lt;strong&gt;因果掩码&lt;/strong&gt;来限制：任何人在 $t$ 时刻的动作，只能参考自己和其他人 $t-1$ 时刻及以前的动作。绝对禁止&amp;quot;穿越&amp;quot;看未来，保证了严格的时序因果关系。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h3 id=&#34;4-降维打击单次自回归生成联合分布&#34;&gt;4. 降维打击：单次自回归生成&amp;quot;联合分布&amp;quot;&#xA;&lt;/h3&gt;&lt;p&gt;这是 MotionLM 最引以为傲的一点。&lt;/p&gt;&#xA;&lt;p&gt;过去的主流做法往往是&amp;quot;事后诸葛亮&amp;quot;：先让每个智能体各顾各地生成几条边缘轨迹，然后再用启发式算法打分，看看它们会不会撞在一起。&lt;/p&gt;&#xA;&lt;p&gt;MotionLM 通过&lt;strong&gt;单一的自回归解码过程&lt;/strong&gt;，直接输出所有交互智能体未来的&lt;strong&gt;联合分布&lt;/strong&gt;。大家在每一步生成时都在互相&amp;quot;看着&amp;quot;对方，完全符合真实世界里大家边走边互相博弈的逻辑。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h3 id=&#34;5-时序因果的条件推演&#34;&gt;5. 时序因果的条件推演&#xA;&lt;/h3&gt;&lt;p&gt;因为 MotionLM 在时间序列上是严格的&lt;strong&gt;时序因果分解&lt;/strong&gt;——即未来的动作严格依赖过去的动作，它解锁了一个超强的功能：&lt;strong&gt;条件推演&lt;/strong&gt;。&lt;/p&gt;&#xA;&lt;p&gt;这意味着你可以用它来做&amp;quot;如果&amp;hellip;那么&amp;hellip;&amp;ldquo;的沙盘推演。比如你可以在解码时，强行给车辆 A 设定一个动作（&amp;ldquo;如果 A 突然急刹车&amp;rdquo;），模型就能根据这个因果关系，顺滑地推演出后面跟着的车辆 B、C、D 会做出什么样的反应。这对于自动驾驶的规划系统来说，简直是梦寐以求的神器。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h3 id=&#34;6-训练极简的交叉熵损失&#34;&gt;6. 训练：极简的交叉熵损失&#xA;&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;train_step&lt;/span&gt;(model, batch_data, optimizer):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    model&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;train()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    optimizer&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;zero_grad()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# 提取并分词真实未来的轨迹&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ground_truth_traj &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; batch_data[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;future_traj&amp;#39;&lt;/span&gt;]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tokenizer &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; MotionTokenizer()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    target_tokens &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; tokenizer&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;encode(ground_truth_traj)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# 前向传播 (Teacher Forcing 模式)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    input_tokens &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; shift_right(target_tokens, pad_value&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;lt;BOS&amp;gt;&amp;#39;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    logits &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; model(batch_data[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;map&amp;#39;&lt;/span&gt;], batch_data[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;tl&amp;#39;&lt;/span&gt;], batch_data[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;hist&amp;#39;&lt;/span&gt;], input_tokens)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# 【极致的极简主义】&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# 抛弃 Huber, 抛弃 L2 距离，抛弃一切复杂的轨迹 loss&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# 只有最经典的交叉熵损失&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    loss_fn &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; nn&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;CrossEntropyLoss()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    loss &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; loss_fn(logits&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;view(&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, VOCAB_SIZE), target_tokens&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;view(&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    loss&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;backward()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    optimizer&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;step()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; loss&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;item()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;核心：&lt;/strong&gt; 丢掉一切复杂的轨迹回归损失函数（比如 Huber Loss、L2 距离）。整个庞大网络的训练目标只有一个极其纯粹的函数——&lt;strong&gt;标准的交叉熵损失&lt;/strong&gt;，即最大化真实序列 Token 的平均对数概率。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h3 id=&#34;7-推理与后处理&#34;&gt;7. 推理与后处理&#xA;&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;@torch.no_grad&lt;/span&gt;()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;inference&lt;/span&gt;(model, scene_data, num_rollouts&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;512&lt;/span&gt;, top_k&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;6&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    model&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;eval()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# 1. 编码场景&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    scene_memory &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; model&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;scene_encoder(&lt;span style=&#34;color:#f92672&#34;&gt;...&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    scene_memory &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; scene_memory&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;repeat(num_rollouts, &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)  &lt;span style=&#34;color:#75715e&#34;&gt;# 复制 512 份&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# 2. 自回归解码&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    generated_tokens &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;full((num_rollouts, N, &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;), &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;lt;BOS&amp;gt;&amp;#39;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; t &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; range(MAX_TIME_STEPS):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        logits &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; model(scene_memory, generated_tokens)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        next_step_logits &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; logits[:, :, &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, :]  &lt;span style=&#34;color:#75715e&#34;&gt;# [Rollouts, N, Vocab]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# 按概率分布采样（保证多样性）&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        probs &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;softmax(next_step_logits, dim&lt;span style=&#34;color:#f92672&#34;&gt;=-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        next_tokens &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;multinomial(probs&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;view(&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, VOCAB_SIZE), &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        next_tokens &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; next_tokens&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;view(num_rollouts, N, &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        generated_tokens &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;cat([generated_tokens, next_tokens], dim&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# 3. 翻译回坐标系&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tokenizer &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; MotionTokenizer()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    continuous_rollouts &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; tokenizer&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;decode(generated_tokens)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# 4. 后处理提炼&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    final_trajs, final_probs &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; aggregate_rollouts(continuous_rollouts, top_k)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; final_trajs, final_probs&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;aggregate_rollouts&lt;/span&gt;(rollouts, k&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;6&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&amp;#34;使用 NMS 和 K-Means 聚类&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    distance_matrix &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; compute_pairwise_distances(rollouts)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    filtered_rollouts &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; apply_nms(rollouts, distance_matrix, threshold&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2.0&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    kmeans &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; KMeans(n_clusters&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;k)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    cluster_centers &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; kmeans&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;fit(filtered_rollouts)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    cluster_probs &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; compute_cluster_probabilities(kmeans&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;labels_)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; cluster_centers, cluster_probs&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;推理狂飙：&lt;/strong&gt; 在给定的场景下，模型会平行推演出 &lt;strong&gt;512 条不同的未来宇宙&lt;/strong&gt;。因为是按照概率分布采样的，所以有的宇宙里车辆 A 抢行了，有的宇宙里车辆 A 刹车让行了。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;后期提炼：&lt;/strong&gt; 面对几百条推演出来的联合轨迹，MotionLM 引入了 &lt;strong&gt;NMS（非极大值抑制）&lt;/strong&gt; 结合 &lt;strong&gt;K-Means 聚类&lt;/strong&gt; 算法，最终聚类出 6 个截然不同的核心&amp;quot;模式&amp;rdquo;，并根据每个簇包含的样本数量给出置信度概率。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;模型集成：&lt;/strong&gt; 为了拿榜单第一，Waymo 还把几个独立训练的 MotionLM 模型集成在一起同时做 Rollout，利用&lt;strong&gt;认知不确定性&lt;/strong&gt;让生成的聚类结果更稳固、更可靠。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;-核心张量维度解析&#34;&gt;📊 核心张量维度解析&#xA;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;next_step_logits&lt;/code&gt; 的形状：&lt;strong&gt;&lt;code&gt;[num_rollouts, N, vocab_size]&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;维度&lt;/th&gt;&#xA;          &lt;th&gt;含义&lt;/th&gt;&#xA;          &lt;th&gt;示例值&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;num_rollouts&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&amp;ldquo;平行宇宙&amp;quot;数量&lt;/td&gt;&#xA;          &lt;td&gt;512&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;N&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;联合建模的智能体数量&lt;/td&gt;&#xA;          &lt;td&gt;8&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;vocab_size&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;动作词汇表大小&lt;/td&gt;&#xA;          &lt;td&gt;169&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;-深度讨论简单-loss-的底气&#34;&gt;🤔 深度讨论：简单 Loss 的底气&#xA;&lt;/h2&gt;&lt;h3 id=&#34;为什么只有交叉熵损失就够了&#34;&gt;为什么只有交叉熵损失就够了？&#xA;&lt;/h3&gt;&lt;p&gt;你可能会担心：监督信号会不会太稀疏？模型会不会只是在&amp;quot;瞎猜盲盒&amp;rdquo;，根本不懂物理规律和交通规则？&lt;/p&gt;&#xA;&lt;p&gt;Waymo 的研究员们敢这么做，底气来自于四大杀手锏：&lt;/p&gt;&#xA;&lt;h4 id=&#34;1-交叉熵不仅不稀疏反而是极其密集的时序监督&#34;&gt;1. 交叉熵不仅不稀疏，反而是&amp;quot;极其密集&amp;quot;的时序监督&#xA;&lt;/h4&gt;&lt;p&gt;传统模型的回归 Loss 往往只在轨迹终点或几个关键点算一次 L2 距离。而 MotionLM 的交叉熵是在&lt;strong&gt;每一个时间步、为每一个智能体都在做惩罚和奖励&lt;/strong&gt;！&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;如果一辆车未来有 80 个时间步，旁边有 8 辆车&lt;/li&gt;&#xA;&lt;li&gt;传统方法：几个关键点的 Loss&lt;/li&gt;&#xA;&lt;li&gt;MotionLM：$80 \times 8 = 640$ 个节点的&lt;strong&gt;步步紧逼&lt;/strong&gt;核对&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;这种&amp;quot;沿途的每一步都在纠错&amp;quot;的机制，提供的梯度信号实际上比传统的回归 Loss 还要密集和强劲。&lt;/p&gt;&#xA;&lt;h4 id=&#34;2-大力出奇迹用海量真实数据倒逼出物理规则&#34;&gt;2. &amp;ldquo;大力出奇迹&amp;rdquo;：用海量真实数据倒逼出物理规则&#xA;&lt;/h4&gt;&lt;p&gt;这是 ChatGPT 震惊世界的底层逻辑，也是大名鼎鼎的**&amp;ldquo;苦涩的教训&amp;rdquo;**：与其让人类专家去写复杂的物理规则，不如让模型自己从海量数据里去悟。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Waymo Open Motion Dataset (WOMD) 包含了数以千万计的真实人类驾驶轨迹&lt;/li&gt;&#xA;&lt;li&gt;人类司机的真实轨迹，本身就完美包含了所有的物理规律和交通规则&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;核心逻辑：&lt;/strong&gt; 如果 MotionLM 只是死记硬背或者瞎猜，它在这么庞大且复杂的数据集上，交叉熵 Loss 绝对降不下来。&lt;strong&gt;它为了把 Loss 降到最低，唯一的出路就是——被迫在神经网络的参数里，内化这些物理法则和几何约束。&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;3-交叉注意力的强制绑定&#34;&gt;3. 交叉注意力的强制绑定&#xA;&lt;/h4&gt;&lt;p&gt;模型怎么知道哪是马路、哪是墙？全靠网络架构的&amp;quot;强制看图&amp;quot;机制。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;如果模型预测一辆车要&amp;quot;向左偏&amp;quot;，但地图特征显示左边是一堵墙&lt;/li&gt;&#xA;&lt;li&gt;交叉熵误差会飙升，梯度顺着 Cross-Attention 的权重一路回传&lt;/li&gt;&#xA;&lt;li&gt;模型被迫修正对地图的理解：地图的几何约束被隐式地刻进了注意力权重里&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;4-联合序列倒逼出博弈与交互理解&#34;&gt;4. &amp;ldquo;联合序列&amp;quot;倒逼出博弈与交互理解&#xA;&lt;/h4&gt;&lt;p&gt;MotionLM 把所有车辆的动作拉平成一条长序列。当模型在预测 Agent B 第 3 秒的动作时，它的输入序列里已经包含了 Agent A 在前 2 秒的动作（比如 A 正在加速抢道）。&lt;/p&gt;&#xA;&lt;p&gt;为了降低预测误差，模型的 &lt;strong&gt;Self-Attention&lt;/strong&gt; 机制被迫学会了去关注序列前面其他车辆的动作。它自己领悟出了&amp;quot;当别人抢道时，我必须减速&amp;quot;的因果交互逻辑。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h3 id=&#34;简单-loss-的陷阱&#34;&gt;简单 Loss 的陷阱&#xA;&lt;/h3&gt;&lt;p&gt;但是，&lt;strong&gt;简单的 Loss 是一项昂贵的特权&lt;/strong&gt;。如果以下几个&amp;quot;地基&amp;quot;没打好，简单的 Loss 就会变成一场噩梦：&lt;/p&gt;&#xA;&lt;h4 id=&#34;陷阱一tokenization-的灾难&#34;&gt;陷阱一：Tokenization 的灾难&#xA;&lt;/h4&gt;&lt;p&gt;如果不加设计的暴力切分，模型会觉得下一个动作的跨度极大、毫无规律，预测会变成抛硬币。MotionLM 的 &lt;strong&gt;Verlet 积分技巧&lt;/strong&gt;是救命稻草——把绝大多数常规的平滑行驶，全都归结为一个固定的 Token。&lt;/p&gt;&#xA;&lt;h4 id=&#34;陷阱二感知噪音导致的不可解之谜&#34;&gt;陷阱二：感知噪音导致的&amp;quot;不可解之谜&amp;rdquo;&#xA;&lt;/h4&gt;&lt;p&gt;简单的交叉熵 Loss 极其依赖&lt;strong&gt;高质量、无歧义的输入上下文&lt;/strong&gt;。如果感知数据有延迟，或者高精地图有几厘米的偏移，模型会把人类的合理驾驶行为当成&amp;quot;随机噪音&amp;quot;。&lt;/p&gt;&#xA;&lt;h4 id=&#34;陷阱三注意力崩溃与维度灾难&#34;&gt;陷阱三：注意力崩溃与维度灾难&#xA;&lt;/h4&gt;&lt;p&gt;序列长度一翻倍，计算复杂度和寻找规律的难度呈平方级爆炸。MotionLM 通过&lt;strong&gt;因果掩码&lt;/strong&gt;和预先训练好的 &lt;strong&gt;Wayformer 场景编码器&lt;/strong&gt;来破局——把繁杂的地图和历史信息提前压缩成凝练的 Scene Embeddings。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;-最终战绩&#34;&gt;🏆 最终战绩&#xA;&lt;/h2&gt;&lt;p&gt;MotionLM 在目前最权威、最硬核的自动驾驶预测数据集 &lt;strong&gt;WOMD&lt;/strong&gt; 上大杀四方：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;🥇 &lt;strong&gt;交互挑战排行榜第一名&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;📈 &lt;strong&gt;联合平均精度均值（ranking joint mAP metric）提升 6%&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;-总结&#34;&gt;💎 总结&#xA;&lt;/h2&gt;&lt;p&gt;《MotionLM》的迷人之处，在于它做了一次极其优雅的&amp;quot;跨界&amp;quot;。它证明了，不用再去死磕复杂的几何约束和物理方程，只要把连续的驾驶动作变成&amp;quot;词汇&amp;quot;，用语言模型&amp;quot;预测下一个词&amp;quot;的自回归降维打击，就能让自动驾驶汽车学会看懂马路上的这盘&amp;quot;大棋&amp;quot;！&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;整套组合拳：&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;把坐标变成&amp;quot;格点&amp;quot;（Tokenization） → 加入&amp;quot;保持惯性&amp;quot;的快捷词汇 → 用 Wayformer 吃透地图 → 把所有车、所有时间的动作拉平成一条序列做接龙 → 狂暴采样 500 次 → 聚类提炼出 6 条核心剧本&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;-相关论文&#34;&gt;🔗 相关论文&#xA;&lt;/h2&gt;&lt;ul&gt;&#xA;&lt;li&gt;[[Wayformer - Waymo的早期融合场景编码器]]&lt;/li&gt;&#xA;&lt;li&gt;[[MultiPath++ - 多模态轨迹预测]]&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
        </item><item>
            <title>ResAD: Normalized Residual Trajectory Modeling for End-to-End Autonomous Driving</title>
            <link>https://example.org/post/robotics/e2e/res-ad/</link>
            <pubDate>Tue, 17 Mar 2026 00:00:00 +0000</pubDate>
            <guid>https://example.org/post/robotics/e2e/res-ad/</guid>
            <description>&lt;h2 id=&#34;核心贡献-提出了一种基于物理先验的残差轨迹建模方法通过归一化技术解决了端到端自动驾驶中的训练难题&#34;&gt;&lt;strong&gt;核心贡献&lt;/strong&gt;: 提出了一种基于物理先验的残差轨迹建模方法，通过归一化技术解决了端到端自动驾驶中的训练难题&#xA;&lt;/h2&gt;&lt;hr&gt;&#xA;&lt;h2 id=&#34;一核心动机为什么要用残差&#34;&gt;一、核心动机：为什么要用残差？&#xA;&lt;/h2&gt;&lt;h3 id=&#34;11-现有方法的问题&#34;&gt;1.1 现有方法的问题&#xA;&lt;/h3&gt;&lt;p&gt;目前的端到端自动驾驶模型（E2EAD）大多试图回答同一个问题：&amp;quot;&lt;strong&gt;未来的轨迹是什么？&lt;/strong&gt;&amp;quot; 它们直接从传感器数据预测车辆未来几秒钟的绝对坐标点 $(x, y)$。&lt;/p&gt;&#xA;&lt;p&gt;作者指出这样做有两个大坑：&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;痛点一：虚假关联（Spurious Correlations）&lt;/strong&gt;&#xA;就像考试死记硬背答案。比如模型看到前车刹车灯亮了，它学会了刹车，但它可能没理解是因为前面是红灯。如果只学绝对坐标，数据太复杂，模型容易&amp;quot;偷懒&amp;quot;学到错误的因果关系。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;痛点二：规划视野困境（Planning Horizon Dilemma）&lt;/strong&gt;&#xA;预测未来很远的地方（比如4秒后）是非常难的，误差会很大。这导致模型在训练时，为了降低远处的巨大误差，反而忽略了近处（0.5秒后）那些对安全至关重要的小调整。&lt;/p&gt;&#xA;&lt;h3 id=&#34;12-resad-的核心思想换个问法&#34;&gt;1.2 ResAD 的核心思想：换个问法&#xA;&lt;/h3&gt;&lt;p&gt;ResAD 不再问&amp;quot;未来在哪里&amp;quot;，而是问：&amp;quot;&lt;strong&gt;为什么要改变轨迹？&lt;/strong&gt;&amp;quot;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;形象理解&lt;/strong&gt;：想象你在高速公路上开车。如果你什么都不做（不踩油门不打方向），车会顺着&lt;strong&gt;惯性&lt;/strong&gt;继续滑行。这叫&amp;quot;物理先验&amp;quot;。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;ResAD 的做法&lt;/strong&gt;：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;先计算出这个&amp;quot;惯性路径&amp;quot;&lt;/li&gt;&#xA;&lt;li&gt;然后只学习&amp;quot;由于路况（红灯、变道、避让）你需要做的修正量（Residual）&amp;quot;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;strong&gt;好处&lt;/strong&gt;：把很难的&amp;quot;画全图&amp;quot;任务，变成了简单的&amp;quot;找不同&amp;quot;任务。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;二方法论核心三大关键模块&#34;&gt;二、方法论核心：三大关键模块&#xA;&lt;/h2&gt;&lt;h3 id=&#34;21-归一化残差轨迹建模-normalized-residual-trajectory-modeling&#34;&gt;2.1 归一化残差轨迹建模 (Normalized Residual Trajectory Modeling)&#xA;&lt;/h3&gt;&lt;p&gt;这是整个算法的灵魂，分为三个步骤：&lt;/p&gt;&#xA;&lt;h4 id=&#34;第一步计算惯性参考-inertial-reference&#34;&gt;第一步：计算惯性参考 (Inertial Reference)&#xA;&lt;/h4&gt;&lt;p&gt;假设车辆保持当前的速度 $v_0$ 和方向不变，未来的位置在哪里？&lt;/p&gt;&#xA;&lt;p&gt;$$ \mathbf{p}_{t_i} = \mathbf{p}_0 + \mathbf{v}_0 \cdot \Delta t_i $$&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;$\mathbf{p}_{t_i}$：未来 $t_i$ 时刻的预测位置&lt;/li&gt;&#xA;&lt;li&gt;$\mathbf{p}_0$：当前位置&lt;/li&gt;&#xA;&lt;li&gt;$\mathbf{v}_0$：当前速度向量&lt;/li&gt;&#xA;&lt;li&gt;$\Delta t_i$：时间差&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;&lt;strong&gt;解读&lt;/strong&gt;：这是初中物理公式 $S = Vt$。这一步不需要神经网络，纯物理计算，非常稳。&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;时间差的具体设定&lt;/strong&gt;：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;数据采样频率：&lt;strong&gt;2 Hz&lt;/strong&gt;（每秒钟记录/预测两次数据）&lt;/li&gt;&#xA;&lt;li&gt;时间间隔 ($\Delta t$)：&lt;strong&gt;0.5秒&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;总预测步数 ($T_f$)：&lt;strong&gt;8个时间步&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;总预测时长：8步 × 0.5秒/步 = &lt;strong&gt;4.0秒&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;具体运算中，时间差 $\Delta t_i$ 依次代入：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;第1个点（0.5秒后）： $\Delta t_1 = 0.5$ 秒&lt;/li&gt;&#xA;&lt;li&gt;第2个点（1.0秒后）： $\Delta t_2 = 1.0$ 秒&lt;/li&gt;&#xA;&lt;li&gt;&amp;hellip;以此类推&amp;hellip;&lt;/li&gt;&#xA;&lt;li&gt;第8个点（4.0秒后）： $\Delta t_8 = 4.0$ 秒&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;第二步计算残差-residual&#34;&gt;第二步：计算残差 (Residual)&#xA;&lt;/h4&gt;&lt;p&gt;神经网络只预测真实轨迹 $\tau_{gt}$ 和惯性轨迹 $\tau_{ref}$ 之间的差值：&lt;/p&gt;&#xA;&lt;p&gt;$$ \boldsymbol{r} = \tau_{gt} - \tau_{ref} $$&lt;/p&gt;&#xA;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;&lt;strong&gt;解读&lt;/strong&gt;：$\boldsymbol{r}$ 代表了人类驾驶员的&amp;quot;操作意图&amp;quot;（比如为了避让行人向左打方向）。模型只需要学这个意图，而不是学整个坐标。&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&lt;h4 id=&#34;第三步逐点残差归一化-point-wise-residual-normalization-prnorm&#34;&gt;第三步：逐点残差归一化 (Point-wise Residual Normalization, PRNorm)&#xA;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;问题&lt;/strong&gt;：远处的坐标偏差通常很大（比如几米），近处的偏差很小（几厘米）。如果直接训练，模型会只关注远处的大数字，忽略近处的安全细节。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;解决&lt;/strong&gt;：把每个时间步的数值都缩放到同一个范围（比如 -1 到 1）：&lt;/p&gt;&#xA;&lt;p&gt;$$ \tilde{r}^d_t = 2\gamma \left( \frac{r^d_t - r^d_{\min}}{r^d_{\max} - r^d_{\min} + \epsilon_0} \right) - \gamma $$&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;$r^d_{\min}, r^d_{\max}$：该时间步在整个数据集里的最大最小值&lt;/li&gt;&#xA;&lt;li&gt;$\gamma$：缩放系数（比如设为1）&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;&lt;strong&gt;解读&lt;/strong&gt;：这是一个标准的 Min-Max 归一化，但关键在于它是**Point-wise（逐点）**的。也就是第1秒的数据只和第1秒的比，第4秒的和第4秒的比。这样，近处的小偏差在归一化后，权重就和远处一样大了，模型就不会忽略近处的安全了。&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&lt;hr&gt;&#xA;&lt;h3 id=&#34;22-惯性参考微扰-inertial-reference-perturbation-irp&#34;&gt;2.2 惯性参考微扰 (Inertial Reference Perturbation, IRP)&#xA;&lt;/h3&gt;&lt;p&gt;自动驾驶需要考虑多种可能性（Multimodal），比如前面有车，我可以左变道，也可以右变道。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;做法&lt;/strong&gt;：作者不在最终结果上加噪声，而是在&lt;strong&gt;初始速度&lt;/strong&gt;上加噪声：&lt;/p&gt;&#xA;&lt;p&gt;$$ \delta_{v,k} \sim \mathcal{N}(\mathbf{0}, \boldsymbol{\Sigma}) $$&#xA;$$ \mathbf{v}&amp;rsquo;_{0,k} = \mathbf{v}&lt;em&gt;0 + \delta&lt;/em&gt;{v,k} $$&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;$\delta_{v,k}$：随机生成的微小速度/方向变化&lt;/li&gt;&#xA;&lt;li&gt;$\mathbf{v}&amp;rsquo;_{0,k}$：扰动后的新速度&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;strong&gt;效果&lt;/strong&gt;：通过改变初始速度，生成一堆略有不同的&amp;quot;惯性轨迹簇&amp;quot;。就像奇异博士看了未来的几种可能性，有的快一点，有的偏左一点。这迫使模型去学习不同初速度下的应对策略，增加了鲁棒性。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h3 id=&#34;23-扩散解码器与打分-diffusion-decoder--ranker&#34;&gt;2.3 扩散解码器与打分 (Diffusion Decoder &amp;amp; Ranker)&#xA;&lt;/h3&gt;&lt;h4 id=&#34;生成轨迹&#34;&gt;生成轨迹&#xA;&lt;/h4&gt;&lt;p&gt;使用 Diffusion Model（扩散模型，类似于生成图片的 Stable Diffusion）：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;输入&lt;/strong&gt;：图像特征 + 扰动后的惯性参考 + 噪声&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;输出&lt;/strong&gt;：去噪后的&lt;strong&gt;归一化残差&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;最终轨迹&lt;/strong&gt; = 惯性参考 + 去归一化后的残差&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;打分器-ranker&#34;&gt;打分器 (Ranker)&#xA;&lt;/h4&gt;&lt;p&gt;模型生成了 $K$ 条可能的轨迹，哪条最好？&lt;/p&gt;&#xA;&lt;p&gt;作者训练了一个 Transformer 来给每条轨迹打分（考虑安全性、舒适度等），选出分数最高的那条作为最终决策。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;三深入讨论&#34;&gt;三、深入讨论&#xA;&lt;/h2&gt;&lt;h3 id=&#34;31-惯性参考为什么是直线&#34;&gt;3.1 惯性参考为什么是直线？&#xA;&lt;/h3&gt;&lt;p&gt;基于公式 $\mathbf{p}_{t_i} = \mathbf{p}_0 + \mathbf{v}_0 \cdot \Delta t_i$ 算出来的这8个点，连起来确实是一条&lt;strong&gt;直线&lt;/strong&gt;。&lt;/p&gt;&#xA;&lt;p&gt;这其实是对**牛顿第一定律（惯性定律）**的最直接应用：假设驾驶员在这一刻&amp;quot;双手离开方向盘，双脚离开踏板&amp;quot;，车辆会保持当前的速度和方向，顺着切线方向一直往前滑行。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;既然真实道路是弯的，一条直线怎么开车呢？&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;这恰恰是作者最聪明的设计。作者的逻辑是：&lt;strong&gt;&amp;ldquo;直线部分不需要 AI 学，物理定律已经帮你画好了；AI 只需要学怎么把这条直线&amp;rsquo;掰弯&amp;rsquo;。&amp;rdquo;&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;直线（惯性参考）&lt;/strong&gt;：车辆的本能（顺着当前方向冲）&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;残差（神经网络预测的偏移量）&lt;/strong&gt;：驾驶员打方向盘和踩踏板的动作&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;最终轨迹 = 直线 + 残差&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;strong&gt;具体是怎么&amp;quot;掰弯&amp;quot;的？&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;遇到弯道（打方向盘）&lt;/strong&gt;：如果前面是个左转弯，AI 就会在第1到第8个点上，预测出越来越大的&lt;strong&gt;横向残差（向左的偏移量）&lt;/strong&gt;。把原本直线上点，一点点往左边&amp;quot;拉&amp;quot;，连起来就成了一条完美的左转曲线。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;遇到红灯（踩刹车）&lt;/strong&gt;：此时方向不变（不需要横向偏移），但速度要减慢。AI 就会预测出&lt;strong&gt;纵向的负残差（向后的偏移量）&lt;/strong&gt;。这样原本在直线远处的点，就会被&amp;quot;拉&amp;quot;回近处，表示车辆在4秒内走不了那么远，停下来了。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;strong&gt;进阶理解：一把&amp;quot;扇形的直线&amp;quot;&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;在复杂的路口，只给AI一条直线的参考，它可能很难思考对策。所以，作者在初始速度 $\mathbf{v}_0$ 上加了随机噪声（微小扰动），生成了比如 10 个不同的初始速度。&lt;/p&gt;&#xA;&lt;p&gt;这样一来，这 10 个速度就会画出 &lt;strong&gt;10 条指向不同角度的直线&lt;/strong&gt;，看起来就像一把&lt;strong&gt;打开的折扇&lt;/strong&gt;：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;有的射线偏左，有的偏右，有的长（速度快），有的短（速度慢）&lt;/li&gt;&#xA;&lt;li&gt;AI 看到这把&amp;quot;折扇&amp;quot;，就会针对每一根&amp;quot;扇骨&amp;quot;（射线），预测出对应的残差，把它们分别&amp;quot;掰&amp;quot;成左转、直行、避障等多种可能的曲线轨迹&lt;/li&gt;&#xA;&lt;li&gt;最后，Ranker（打分器）出场，选出最安全、最平滑的那条曲线作为最终决定&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr&gt;&#xA;&lt;h3 id=&#34;32-扩散模型中的噪声是什么&#34;&gt;3.2 扩散模型中的噪声是什么？&#xA;&lt;/h3&gt;&lt;p&gt;在算法的世界里，这里的&amp;quot;噪声&amp;quot;不是我们平时听到的噪音，它更像是一块**&amp;ldquo;未被雕琢的原材料&amp;rdquo;**。&lt;/p&gt;&#xA;&lt;h4 id=&#34;形象理解从迷雾中看清真相&#34;&gt;形象理解：从&amp;quot;迷雾&amp;quot;中看清真相&#xA;&lt;/h4&gt;&lt;p&gt;想象你在清晨的大雾中开车，由于雾太大，你看不清前方的路，只能看到一片混沌（这就是&lt;strong&gt;噪声&lt;/strong&gt;）。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;噪声（Noise）&lt;/strong&gt;：就是这团笼罩在未来轨迹上的&amp;quot;浓雾&amp;quot;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;图像特征 + 惯性参考&lt;/strong&gt;：这是你脑子里的&amp;quot;地图&amp;quot;和&amp;quot;指南针&amp;quot;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;扩散解码器的任务&lt;/strong&gt;：就是根据&amp;quot;地图&amp;quot;和&amp;quot;指南针&amp;quot;，把这团&amp;quot;浓雾&amp;quot;一点点拨开，最后露出隐藏在雾里的、最合理的&lt;strong&gt;残差轨迹&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;技术细节它到底长什么样&#34;&gt;技术细节：它到底长什么样？&#xA;&lt;/h4&gt;&lt;p&gt;在 ResAD 论文中，这个噪声在数学上被称为 &lt;strong&gt;高斯白噪声（Gaussian Noise）&lt;/strong&gt;。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;数学表达&lt;/strong&gt;：$z \sim \mathcal{N}(0, \mathbf{I})$，意思是从一个均值为0、方差为1的标准正态分布中随机抽取出来的数值&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;它的形状&lt;/strong&gt;：和我们要预测的轨迹是一模一样的（8个时间步 × 2个坐标 = 16个数字组成的矩阵）&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;起始状态&lt;/strong&gt;：在生成的最开始（第 $T$ 步），模型手里只有这 16 个随机生成的乱码数字&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;为什么需要这个噪声&#34;&gt;为什么需要这个噪声？&#xA;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;A. 实现&amp;quot;多样性&amp;quot;（Multi-modality）&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;自动驾驶面对同一个路口，可能有多种走法（稍微偏左一点，或者稍微偏右一点）。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;如果模型是死板的回归，它可能只会给出一个&amp;quot;平均值&amp;quot;，导致轨迹正好撞在路沿上&lt;/li&gt;&#xA;&lt;li&gt;有了噪声，每次我们换一个不同的噪声&amp;quot;种子&amp;quot;（Seed），扩散解码器就能从不同的角度&amp;quot;拨开迷雾&amp;quot;，生成不同的合理轨迹&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;strong&gt;B. 逆向建模的需要&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;扩散模型的工作原理是**&amp;ldquo;去噪&amp;rdquo;**：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;训练时&lt;/strong&gt;：我们把真实的轨迹残差（正确的答案）里慢慢加入噪声，直到它变成一团乱码&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;推理时&lt;/strong&gt;：我们给模型一团乱码，并告诉它当前的环境特征。模型会根据经验，一步步猜出：&amp;ldquo;这团乱码如果变回正确的轨迹，第一步该怎么减掉噪声？&amp;rdquo;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;strong&gt;C. 提高容错率&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;直接预测一个精确的坐标点很难，但如果让模型去**&amp;ldquo;修正&amp;rdquo;**一个带有噪声的数值，它会有更多的容错空间。通过多次微调（去噪迭代），轨迹会变得越来越平滑、自然。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h3 id=&#34;33-为什么不从惯性参考开始直接修正&#34;&gt;3.3 为什么不从惯性参考开始直接修正？&#xA;&lt;/h3&gt;&lt;p&gt;这是一个很自然的直觉：既然有了&amp;quot;惯性参考&amp;quot;这个物理先验，为什么不把它当做&amp;quot;初稿&amp;quot;直接修，非要从&amp;quot;随机噪声&amp;quot;开始白手起家？&lt;/p&gt;&#xA;&lt;p&gt;这涉及到了 &lt;strong&gt;&amp;ldquo;隐变量生成&amp;rdquo;&lt;/strong&gt; 和 &lt;strong&gt;&amp;ldquo;确定性细化（Refinement）&amp;rdquo;&lt;/strong&gt; 在数学建模上的本质差异。&lt;/p&gt;&#xA;&lt;h4 id=&#34;原因一残差空间已经非常扁平了&#34;&gt;原因一：&amp;ldquo;残差空间&amp;quot;已经非常&amp;quot;扁平&amp;quot;了&#xA;&lt;/h4&gt;&lt;p&gt;地平线 DiffusionDrive 等方案，很多时候是在&lt;strong&gt;绝对坐标空间&lt;/strong&gt;（Trajectory Space）进行打磨。因为绝对坐标范围很大（可能几十米），直接从噪声生成很难，所以用 Anchor（锚点路径）作为起始位置可以大幅缩短搜索路径。&lt;/p&gt;&#xA;&lt;p&gt;但请注意 &lt;strong&gt;ResAD 的神来之笔——PRNorm（归一化）&lt;/strong&gt;：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;ResAD 预测的不是坐标，而是&lt;strong&gt;归一化后的残差 $\tilde{r}$&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;通过 PRNorm，所有的预测目标都被强行压缩到了 $[-1, 1]$ 这个极小的、以 0 为中心的超立方体空间里&lt;/li&gt;&#xA;&lt;li&gt;标准高斯噪声的分布范围主要也在 $[-1, 1]$ 附近&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;这意味着：在 ResAD 的残差空间里，&lt;strong&gt;&amp;ldquo;随机噪声&amp;quot;和&amp;quot;最终答案&amp;quot;之间的距离，已经比绝对坐标空间近得多了！&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;h4 id=&#34;原因二解决多模态的数学严谨性&#34;&gt;原因二：解决&amp;quot;多模态&amp;quot;的数学严谨性&#xA;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;如果从惯性参考开始修（确定性细化）&lt;/strong&gt;：&#xA;这本质上是一个&lt;strong&gt;函数映射&lt;/strong&gt;：$f(\text{惯性参考}, \text{环境特征}) = \text{修正量}$。对于同一个路口，这个映射往往只能给出一个确定的结果。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;从噪声开始生成（生成式建模）&lt;/strong&gt;：&#xA;扩散模型是在学习&lt;strong&gt;整个概率分布&lt;/strong&gt; $P(\text{残差} | \text{环境, 惯性})$。从噪声 $z$ 开始，是因为 $z$ 是概率分布的&amp;quot;采样源&amp;rdquo;。&lt;strong&gt;噪声不是负担，而是&amp;quot;可能性&amp;quot;的源泉。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;h4 id=&#34;原因三惯性参考是作为条件约束存在的&#34;&gt;原因三：惯性参考是作为&amp;quot;条件约束&amp;quot;存在的&#xA;&lt;/h4&gt;&lt;p&gt;在 ResAD 的 Transformer Decoder 里：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;惯性参考（Inertial Reference）是作为&amp;quot;Condition（条件约束）&amp;ldquo;输入的&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;这就像是一个经验丰富的老师站在 AI 旁边。AI 手里拿着一块乱糟糟的泥巴（噪声），老师不断告诉它：&amp;ldquo;根据现在的惯性和前面的红灯，你应该把泥巴捏成一个向后拉伸的形状。&amp;rdquo;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr&gt;&#xA;&lt;h3 id=&#34;34-两次多模态irp-与-扩散噪声的关系&#34;&gt;3.4 两次多模态：IRP 与 扩散噪声的关系&#xA;&lt;/h3&gt;&lt;p&gt;确实引入了两次&amp;quot;随机性&amp;rdquo;，但它们是**&amp;ldquo;物理层面的多模态&amp;rdquo;&lt;strong&gt;与&lt;/strong&gt;&amp;ldquo;决策层面的多模态&amp;rdquo;**的强强联手。&lt;/p&gt;&#xA;&lt;h4 id=&#34;初始速度扰动-irp解决身体的不确定性&#34;&gt;初始速度扰动 (IRP)：解决&amp;quot;身体&amp;quot;的不确定性&#xA;&lt;/h4&gt;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;它在干什么？&lt;/strong&gt; 模拟&lt;strong&gt;车辆状态观测的误差&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;它的角色（物理先验）&lt;/strong&gt;：为模型提供多个**&amp;ldquo;赛道（Anchor Paths）&amp;rdquo;**&#xA;&lt;ul&gt;&#xA;&lt;li&gt;扰动 A：假设我现在的速度比传感器测得的快一点，惯性参考线就长一点&lt;/li&gt;&#xA;&lt;li&gt;扰动 B：假设我现在的方向盘其实已经往左带了一点，惯性参考线就偏左一点&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;总结&lt;/strong&gt;：IRP 是在&lt;strong&gt;物理空间&lt;/strong&gt;里撒网，它决定了 AI &amp;ldquo;起跑&amp;quot;的基础姿态&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;扩散随机噪声解决灵魂的多模态决策意图&#34;&gt;扩散随机噪声：解决&amp;quot;灵魂&amp;quot;的多模态（决策意图）&#xA;&lt;/h4&gt;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;它在干什么？&lt;/strong&gt; 模拟&lt;strong&gt;面对复杂环境时的选择权&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;它的角色（意图生成）&lt;/strong&gt;：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;在同一个惯性参考线上，噪声种子 1 可能让 AI 决定&amp;quot;左侧超车&amp;rdquo;&lt;/li&gt;&#xA;&lt;li&gt;噪声种子 2 可能让 AI 决定&amp;quot;减速跟车&amp;rdquo;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;总结&lt;/strong&gt;：扩散噪声是在&lt;strong&gt;决策空间&lt;/strong&gt;里探索，它决定了 AI 在既定物理基础上如何&amp;quot;起舞&amp;quot;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;为什么要双管齐下&#34;&gt;为什么要&amp;quot;双管齐下&amp;quot;？&#xA;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;方案 A：只有 IRP（没有扩散噪声）&lt;/strong&gt;：&#xA;你会有 10 条不同的射线，但每条射线上，AI 只能给出一个死板的修正。如果这 10 条射线都没能完美避开前方的障碍物，AI 就没招了。这叫**&amp;ldquo;物理多样，决策单一&amp;rdquo;**。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;方案 B：只有扩散噪声（没有 IRP）&lt;/strong&gt;：&#xA;你只有 1 条笔直的参考线。虽然扩散模型可以把它变幻出无数花样，但由于起点太单一，模型需要耗费巨大的计算量去把这条直线&amp;quot;大幅度扭转&amp;quot;到侧面。这叫**&amp;ldquo;起点单一，决策费劲&amp;rdquo;**。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;ResAD 的&amp;quot;黄金组合&amp;quot;逻辑&lt;/strong&gt;：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;先用 IRP 铺路&lt;/strong&gt;：用简单的物理扰动，快速占领未来的各种&amp;quot;物理阵地&amp;quot;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;再用扩散模型雕琢&lt;/strong&gt;：在每一个物理阵地上，利用随机噪声让 AI 灵活地思考&amp;quot;在这个位置我该怎么微调&amp;quot;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;hr&gt;&#xA;&lt;h3 id=&#34;35-wta-loss-vs-diffusion多模态策略对比&#34;&gt;3.5 WTA Loss vs Diffusion：多模态策略对比&#xA;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Winner-Take-All (WTA)&lt;/strong&gt; 策略确实是目前解决&amp;quot;平均陷阱&amp;quot;最主流、最有效的手段之一。&lt;/p&gt;&#xA;&lt;h4 id=&#34;什么是-wta形象理解赛马机制&#34;&gt;什么是 WTA？（形象理解：赛马机制）&#xA;&lt;/h4&gt;&lt;p&gt;想象你带了 6 个徒弟（6 个预测头），让他们预测车该怎么走：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;训练时&lt;/strong&gt;：如果真实的司机右转了。你发现徒弟 C 猜得最准。这时候，你&lt;strong&gt;只奖励/惩罚徒弟 C&lt;/strong&gt;，让他以后更像真实司机。而另外 5 个徒弟这次的任务就是&amp;quot;闭嘴&amp;quot;，不做任何更新&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;结果&lt;/strong&gt;：久而久之，徒弟 A 成了&amp;quot;左转专家&amp;quot;，徒弟 B 成了&amp;quot;直行专家&amp;quot;，徒弟 C 成了&amp;quot;避让专家&amp;quot;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;为什么还要-diffusion&#34;&gt;为什么还要 Diffusion？&#xA;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;A. 离散 vs. 连续（菜单与厨师）&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;WTA 是&amp;quot;点菜制&amp;quot;&lt;/strong&gt;：你预先设定了 $K$ 个头。无论路况多复杂，你永远只能从这 6 个选项里挑。如果路况需要一个&amp;quot;微小的左转再加速&amp;quot;，但你的 6 个头里只有&amp;quot;大左转&amp;quot;和&amp;quot;匀速直行&amp;quot;，你就调不出来&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Diffusion 是&amp;quot;大厨现做&amp;quot;&lt;/strong&gt;：只要噪声种子变一点，轨迹就变一点。它可以生成&lt;strong&gt;无数种、连续分布&lt;/strong&gt;的轨迹&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;strong&gt;B. &amp;ldquo;死掉的头&amp;quot;问题（Mode Collapse）&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;WTA 的噩梦&lt;/strong&gt;：如果某一个预测头运气不好，从来没被选中过，它就永远得不到训练梯度。最终，你虽然准备了 6 个头，但可能只有 3 个在干活，剩下的全成了&amp;quot;废头&amp;rdquo;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Diffusion&lt;/strong&gt;：每一轮去噪过程，网络的所有参数都在参与计算。不存在&amp;quot;死掉的头&amp;quot;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;strong&gt;C. &amp;ldquo;打磨&amp;quot;的深度&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;WTA 是&amp;quot;一锤子买卖&amp;rdquo;&lt;/strong&gt;：神经网络一次性输出 6 条线&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Diffusion 是&amp;quot;精雕细琢&amp;quot;&lt;/strong&gt;：它是迭代的。每一步去噪，模型都会结合环境特征微调轨迹。这种&lt;strong&gt;多步细化&lt;/strong&gt;的能力，让 Diffusion 出来的轨迹在运动学上通常比 WTA 直接回归出来的要好得多&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;resad-的神操作把两者结合了&#34;&gt;ResAD 的&amp;quot;神操作&amp;quot;：把两者结合了&#xA;&lt;/h4&gt;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;Diffusion（负责生成）&lt;/strong&gt;：用噪声生成 64 条形状各异的轨迹&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Ranker（负责挑选）&lt;/strong&gt;：这个 Ranker 实际上就是在做类似 WTA 的筛选&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;&lt;strong&gt;所以，ResAD 的逻辑是&lt;/strong&gt;：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;不靠 WTA 来&amp;quot;产生&amp;quot;多模态&lt;/strong&gt;（因为 WTA 产生的模态有限且容易坏死）&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;靠 Diffusion &amp;ldquo;大规模制造&amp;quot;高质量的多模态候选项&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;靠 Ranker（类似选秀）来做最终决策&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;四实验结果&#34;&gt;四、实验结果&#xA;&lt;/h2&gt;&lt;p&gt;作者在 &lt;strong&gt;NAVSIM&lt;/strong&gt; 数据集（目前最权威的端到端评测基准之一）上进行了测试。&lt;/p&gt;&#xA;&lt;h3 id=&#34;41-核心指标&#34;&gt;4.1 核心指标&#xA;&lt;/h3&gt;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;PDMS (PDM Score)&lt;/strong&gt;：综合分数，越高越好。包含不碰撞率（NC）、舒适度（C）等&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;EPDMS (Extended PDMS)&lt;/strong&gt;：NAVSIM v2 提出的更难的指标&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;42-战绩&#34;&gt;4.2 战绩&#xA;&lt;/h3&gt;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;SOTA&lt;/strong&gt;：ResAD 在 NAVSIM v1 和 v2 上都拿到了第一梯队的成绩（PDMS 88.8 / 90.6）&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;对比&lt;/strong&gt;：比之前的明星模型 Transfuser、UniAD、DiffusionDrive 都要好&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;效率&lt;/strong&gt;：推理速度非常快，只需要 &lt;strong&gt;2 步去噪&lt;/strong&gt;就能达到很好的效果&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;43-消融实验&#34;&gt;4.3 消融实验&#xA;&lt;/h3&gt;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;即插即用&lt;/strong&gt;：把&amp;quot;归一化残差建模（NRTM）&amp;ldquo;套用到旧模型上，旧模型效果也立刻提升&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;各组件的贡献&lt;/strong&gt;：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;只加 Ranker：提升一点点&lt;/li&gt;&#xA;&lt;li&gt;加 轨迹残差建模 (TRM)：提升巨大！&lt;/li&gt;&#xA;&lt;li&gt;加 归一化 (PRNorm)：收敛更快，近距离避障更准&lt;/li&gt;&#xA;&lt;li&gt;加 微扰 (IRP)：解决多模态问题，提升复杂场景处理能力&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;五伪代码详解&#34;&gt;五、伪代码详解&#xA;&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; torch&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; torch.nn &lt;span style=&#34;color:#66d9ef&#34;&gt;as&lt;/span&gt; nn&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ResAD&lt;/span&gt;(nn&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;Module):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;__init__&lt;/span&gt;(self):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        super()&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;__init__&lt;/span&gt;()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# 1. 特征提取器 (比如 Vision Transformer)，负责看路&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;backbone &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; VisualBackbone()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# 2. 扩散解码器，负责从噪声中&amp;#34;捏&amp;#34;出残差&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;diffusion_decoder &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; ResidualDiffusionDecoder()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# 3. 轨迹打分器，负责从一堆方案里选最好的&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;ranker &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; TrajectoryRanker()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;forward&lt;/span&gt;(self, sensor_data, ego_state):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        sensor_data: 摄像头图像、雷达数据等&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        ego_state:   当前车的状态 (位置 p0, 速度 v0, 朝向 theta)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# --- 第一阶段：感知与特征提取 ---&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# 提取环境特征（路口长啥样、红绿灯、其他车在哪里）&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        env_features &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;backbone(sensor_data)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# --- 第二阶段：物理先验（画&amp;#34;骨架&amp;#34;） ---&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# 1. 惯性参考扰动 (IRP)：生成 K 条略有不同的&amp;#34;初试射线条&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# 我们不只画一条直线，我们给初始速度加点噪声，生成一把&amp;#34;扇形&amp;#34;射线&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ref_trajectories &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;generate_perturbed_refs(ego_state, num_samples&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;64&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# ref_trajectories 形状: [64条, 8个时间步, (x, y)]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# --- 第三阶段：生成式决策 (核心魔术) ---&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# 2. 准备初始&amp;#34;迷雾&amp;#34; (随机噪声)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# 注意：这里的噪声是在&amp;#34;残差空间&amp;#34;里的，范围大概在 -1 到 1 之间&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# 形状与轨迹一致: [64, 8, 2]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        residual_noise &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;randn(&lt;span style=&#34;color:#ae81ff&#34;&gt;64&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# 3. 扩散去噪循环 (Iterative Denoising)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# ResAD 的优势在于只需要 2-5 步&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        current_residual &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; residual_noise&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; t &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; reversed(range(num_steps)):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#75715e&#34;&gt;# 这里的 diffusion_decoder 就像一个雕塑家&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#75715e&#34;&gt;# 输入：当前的乱码、环境特征、那一叠&amp;#34;物理射线&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#75715e&#34;&gt;# 输出：预测的更清晰一点的&amp;#34;归一化残差&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            current_residual &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;diffusion_decoder(&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                current_residual,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                env_features,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                ref_trajectories,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                t&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            )&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# --- 第四阶段：物理还原 (从残差回到世界) ---&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# 4. 去归一化 (Inverse PRNorm)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# 把预测出的 [-1, 1] 之间的数值，放大回真实的米(m)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        real_residuals &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;inverse_prnorm(current_residual)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# 5. 最终合成轨迹 = 物理骨架 + AI 预测的偏差量&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# 这一步把直线&amp;#34;掰弯&amp;#34;成真正的避障/转弯曲线&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        final_candidate_trajectories &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; ref_trajectories &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; real_residuals&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# --- 第五阶段：选秀 (Ranking) ---&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# 6. 打分器给这 64 条备选曲线打分&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# 考虑：是否撞车、是否越界、是否让乘客觉得晕车&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        scores &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;ranker(final_candidate_trajectories, env_features)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# 7. 选分数最高的一条发给方向盘和油门&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        best_trajectory &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; final_candidate_trajectories[torch&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;argmax(scores)]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; best_trajectory&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;generate_perturbed_refs&lt;/span&gt;(self, ego_state, num_samples):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        计算惯性参考轨迹：p_t = p0 + (v0 + delta_v) * t&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        dt &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0.5&lt;/span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;# 时间间隔 0.5 秒&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        time_steps &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;tensor([&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;1.0&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;1.5&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;2.0&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;2.5&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;3.0&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;3.5&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;4.0&lt;/span&gt;])&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# 给速度加扰动 (IRP)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        v0 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; ego_state&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;v0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# 产生一些微小的速度方向和大小的变化&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        perturbed_v &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; v0 &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; torch&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;randn(num_samples, &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0.1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# 计算直线点：[num_samples, 8, 2]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        refs &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; v0&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;pos &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; perturbed_v&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;unsqueeze(&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; time_steps&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;unsqueeze(&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; refs&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;inverse_prnorm&lt;/span&gt;(self, normalized_residual):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        逐点残差去归一化 (PRNorm 的逆操作)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        normalized_residual: 模型预测出来的 [-1, 1] 之间的数&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# 从预先统计好的数据集分布里拿到每个时间步的最大最小值&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# 越远的点，min/max 范围越大&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        res_min, res_max &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;dataset_stats&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;get_min_max()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# 简单的线性拉伸：从 [-1, 1] 映射回 [min, max]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        real_res &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (normalized_residual &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; (res_max &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; res_min) &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; res_min&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; real_res&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;&#xA;&lt;h2 id=&#34;六总结&#34;&gt;六、总结&#xA;&lt;/h2&gt;&lt;h3 id=&#34;这篇论文解决了什么核心问题&#34;&gt;这篇论文解决了什么核心问题？&#xA;&lt;/h3&gt;&lt;p&gt;解决了端到端自动驾驶中，直接预测绝对坐标带来的&lt;strong&gt;训练难、远近权重不平衡、容易学坏&lt;/strong&gt;的问题。&lt;/p&gt;&#xA;&lt;h3 id=&#34;核心公式背后的逻辑&#34;&gt;核心公式背后的逻辑&#xA;&lt;/h3&gt;&lt;p&gt;$$ \text{最终轨迹} = \underbrace{(\text{当前位置} + \text{速度} \times \text{时间})}&lt;em&gt;{\text{物理惯性，本来就会走的路}} + \underbrace{\text{神经网络预测的残差}}&lt;/em&gt;{\text{AI根据路况做的智能微调}} $$&lt;/p&gt;&#xA;&lt;h3 id=&#34;为什么叫-normalized-归一化&#34;&gt;为什么叫 &amp;ldquo;Normalized&amp;rdquo; (归一化)？&#xA;&lt;/h3&gt;&lt;p&gt;因为远处偏差大，近处偏差小，不归一化会导致 AI 忽视近处更危险的偏差。&lt;/p&gt;&#xA;&lt;h3 id=&#34;resad-的优势一句话总结&#34;&gt;ResAD 的优势一句话总结&#xA;&lt;/h3&gt;&lt;p&gt;利用物理学定律（惯性）作为基准，让 AI 只需专注于学习&amp;quot;变化量&amp;rdquo;，并用归一化技术平衡远近视野，从而学得更快、更稳、更准。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;相关论文&#34;&gt;相关论文&#xA;&lt;/h2&gt;&lt;ul&gt;&#xA;&lt;li&gt;[[UAD - 无需3D标注的端到端自动驾驶]]&lt;/li&gt;&#xA;&lt;li&gt;[[World4Drive - 无需感知标注的端到端世界模型]]&lt;/li&gt;&#xA;&lt;li&gt;[[LAW - Latent World Model for E2E Driving]]&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
        </item></channel>
</rss>
