<?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%AF%AD%E8%A8%80%E6%A8%A1%E5%9E%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%AF%AD%E8%A8%80%E6%A8%A1%E5%9E%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></channel>
</rss>
