跳到正文
Hacker News· surprisetalk·· 5 天前AI 评分22

解析驱动机器人的 AI:以 Physical Intelligence 的 π0.5 VLA 为例

Understanding the AI That Drives Robots

AI 导读

Physical Intelligence 于 2025 年发布的开源权重 VLA 模型 π0.5 正被 Figure、Unitree、Nvidia 等公司广泛采用,成为机器人 AI 的主流架构之一。

正文 · AI 翻译

译文尚不完整,完整内容请切换到原文。

距离我上次关注人形机器人的发展状况已经过去一年多了,而人们对这项技术的热情丝毫没有减弱的迹象。初创公司 NEURA Robotics 和 Figure AI 分别融资14 亿美元和10 亿美元,Apptronik 融资5.2 亿美元。中国的宇树科技上市,融资约9 亿美元,Agility Robotics 计划今年晚些时候通过 SPAC 上市。几周前,中国举办了第二届世界人形机器人运动会,展示了人形机器人完成各种令人惊叹的物理动作。

Figure 的人形机器人正在分拣包裹,来自Wikipedia。

过去一年里,我们也看到了一些看起来很惊艳的机器人演示,不过这些都需要大打折扣地看待。Figure 展示了其机器人连续数小时分拣包裹,以及自主卸载洗碗机。Physical Intelligence 展示了其机器人模型制作咖啡,以及在巧克力工厂折叠纸盒。Generalist AI 展示了其 GEN-1.5 模型仅凭几个示例就能学习新任务。

机器人的一些进步源于硬件改进:更好的执行器等等。但绝大部分进步归功于机器人 AI 的进展,即使用专门开发的 AI 模型来控制机器人。随着更通用的 AI 能力持续快速提升,一个显而易见的问题是,机器人 AI 是否也会出现同样类型的加速。目前机器人 AI 的能力似乎仍然非常有限,但考虑到更通用的 AI 进步之快,我可以想象这种情况会很快改变。因此,了解为控制机器人而开发的 AI 模型如何工作,是值得的。

机器人 AI 有几种不同类型,有时被称为“策略”(这里的“策略”指的是将一组特定输入——机器人状态、传感器数据、收到的指令——映射到一组机器人动作的东西)。在本文中,我们将探讨一种常用架构,Figure、宇树、Physical Intelligence 和 Nvidia 等公司都在使用:视觉-语言-动作模型(VLA)。更具体地说,我们将探讨一种流行的 VLA,即 Physical Intelligence 的开源权重 π0.5 VLA,它于 2025 年发布,已被广泛使用(不过它并不是 Physical Intelligence 的最先进模型)。

大语言模型以文本为输入并输出文本,而 VLA 以文本、图像和机器人信息为输入,输出一系列机器人动作。它使用许多让 LLM 取得成功的相同组件来实现这一点,特别是注意力和 transformer 架构。VLA 是否会继续作为机器人 AI 的主要范式,目前还不太明显,但到目前为止,它们是控制机器人的一种非常常见的方法。

要了解 AI 如何工作(无论是 VLA 还是其他任何东西),掌握一点点线性代数会很有用。具体来说,我们想理解几种操作数字数组的不同运算,因为这就是 AI 模型所做的大部分事情。

例如,假设我们有以下两个二维数字数组(或矩阵):

我们可以对这些数组做的一件事就是把它们相加。这完全符合你的预期:一个数组中的每个数字与另一个数组中对应的数字相加,得到一个新的数组,其中包含所有相加的结果。

我们可以做的另一件事是将数组乘以或除以一个单一的值。这也大致符合你的预期:数组中的每个值都会乘以或除以相应的值。

但如果我们想把两个矩阵相乘呢?要做到这一点,我们需要一个叫做点积的运算。点积取两个一维数字数组(也称为向量),将一个向量中的每个值乘以另一个向量中对应的值,然后将结果求和。

你可以把点积看作衡量两件事:两个向量有多大,以及它们彼此有多相似。(如果你对向量进行归一化,将值缩放到0到1之间,那么点积就完全是衡量两个向量彼此有多相似。)

当我们把两个矩阵相乘时,我们只是在做一堆点积:结果矩阵中的每个值都是一个数组的行与另一个数组的列的点积。因为点积要求两个列表长度相等,所以矩阵乘法必须以某种方式进行:一个矩阵的列数必须等于另一个矩阵的行数。而输出矩阵的大小将是输入矩阵大小的函数。

我发现通过把一个矩阵放在左边,另一个矩阵放在右上方,最容易理解矩阵乘法。输出矩阵正好位于它们之间的空间,每个值都是第一个矩阵的行与第二个矩阵的列的点积:

正如我们所知,大多数现代AI模型都是使用神经网络构建的。神经网络的经典形象是这样的:

你有一些代表输入数据的输入神经元序列,它们连接到各种中间神经元层,然后连接到输出神经元。根据输入的数据以及不同神经元之间的连接设置方式,神经元会以不同程度“激活”,从上一层的神经元接收一些输入,并向下一层的神经元发送一些输出。这种结构有时被称为“多层感知机”,或MLP。

然而,我认为通过观察神经网络的实际实现方式,会更容易理解它们,这是通过乘以数字数组来实现的(在机器学习中,这些数组有时被称为“张量”,其中张量只是一个可以是任意维度的数字数组。例如,谷歌有一个名为“TensorFlow”的机器学习库)。例如,上面的神经网络实际上会通过类似这样的方式实现:

三个输入神经元变成一个一维数组,或者说向量,其中包含三个数字,这就是我们的输入数据。这个向量随后被传递到隐藏层,在那里经过几个步骤。首先,它乘以一个二维矩阵(图中的W1)。这个矩阵有四行(对应原图中的四个神经元)和三列(对应输入向量中的每个值):它接受一个长度为三个数字的向量(即3-向量)作为输入,并输出一个长度为四个数字的向量。得到的四数字向量随后与另一个4-向量(图中的b1)相加,其值被称为“偏置”。各层的权重和偏置被称为网络的“参数”,也是神经网络训练时被修改的内容。

偏置相加后,得到的向量(称为“预激活”,图中的z)会经过所谓的非线性函数,这只是一个根据输入不同而对输入进行不同变换的函数。上面示例中使用的一种常见非线性函数是“ReLU”,即修正线性单元。ReLU所做的只是将它所接收向量中的任何负数替换为零。其他非线性函数还有sigmoid(一种S形函数,将值压缩到0和1之间)和GELU(一种有点类似ReLU的函数,但平滑而非有尖锐折角)。

在像这样的基本MLP中,神经网络中的每个隐藏层都将由这个矩阵乘法、然后偏置、然后非线性函数组成。上面的网络只有一个隐藏层,因此在非线性函数之后,得到的向量被传递到输出神经元。这些神经元使用另一个矩阵乘法(W2)和偏置加法(b2)再次变换数据,产生一个包含两个数字的向量作为输出(y)。

这个结构简单但强大。要理解原因,想象一个神经网络,它接受单个值作为输入并给出单个值作为输出,但其隐藏层中有许多神经元(神经元的数量被称为该层的“宽度”)。在非线性函数之前,每个单独的神经元计算wx + b,这是直线的公式;权重决定直线的斜率,而偏置决定其垂直位置。而非线性函数则让该层能够在图上的不同点绘制具有不同斜率和截距的不同线段。结合起来,这使得一个足够宽的神经网络原则上能够通过绘制大量不同的线段来逼近任何连续函数1:我们添加的隐藏层神经元越多,能绘制的线段就越多,就能越接近地逼近该函数。在更高维度——更多的输入和输出——几何形状变得更复杂,但基本思想保持不变。

除了逼近非常复杂函数的能力外,神经网络的另一个关键特性是它们可以被训练,通过将网络的实际输出与您希望它拥有的输出进行比较,并相应地微调权重和偏置,使输出更准确。

训练网络从一次前向传播开始,给它一个示例输入,然后计算输出。接着用某个损失函数将这个计算出的输出与实际的正确输出进行比较,损失函数衡量两者之间的差异。对于输出是单个数字的简单情况,损失函数可能是均方误差,你可以通过将实际输出与期望输出之差的平方来计算:差异越大,损失越大。然而,如果你试图预测一个序列的下一个符号,常用的损失函数是交叉熵,它基于模型认为实际下一个符号的可能性有多大;模型认为正确符号的可能性越小,交叉熵就越高。随着模型接受训练并越来越擅长逼近正确输出,损失(希望如此)会呈下降趋势,关于 AI 训练运行的报告通常会展示训练损失曲线。

一旦确定了损失,下一步就是逐层回溯网络,并利用链式法则计算如果对每个权重和偏置做微小调整,损失会变化多少。这被称为反向传播,会产生一长串数字,每个数字告诉你当调整模型中某个参数的值时,损失会变化多少。这个列表被称为梯度,可以把它看作在高维空间中为了在模型参数当前值下最大化增加损失而需要“迈步”的方向。

有了梯度,下一步就是朝相反方向迈出一小步(因为我们想减小损失,而不是增大它)。具体做法是将梯度中的每个值乘以一个小的正数(称为学习率),然后从每个参数中减去所得的数字。参数改变后,你可以再让一个输入通过模型,计算新的损失,并再次修改参数。这种反复计算梯度、然后用它来修改模型参数以(希望)减小损失的过程被称为梯度下降。

在实践中,大多数模型使用梯度下降的修改版、更复杂的版本进行训练,例如使用近期梯度的平均值来更新参数,以及在训练过程的不同阶段使用不同的学习率。实践中也不常见每处理一个训练样本就更新一次模型。相反,模型是按批次(有时称为“小批次”)训练的:让几十、几百甚至更多训练样本通过模型,对它们的损失取平均,并基于平均损失计算梯度。决定模型如何训练的设置,例如学习率或批次大小,被称为“超参数”,而找出训练模型的最佳超参数是机器学习的一个重要领域。

为了让 AI 做有用的工作,我们希望能够向它输入图像和文本数据之类的东西。我们如何将图像、文本和其他数据转换成模型能够理解和操作的形式?

对于文本,主要有两个步骤。首先,一串文本被分解成若干块,即“token”。然后,每个 token 被转换为一个长数字向量,称为“嵌入”(embedding),随后便可由网络进行处理。让我们依次来看每一步。

分词是将一串文本分解为一系列块的方法,这很有用,因为它能让模型学习到各个文本块的含义。一种做法是使用预定义的单词列表来拆分文本,但固定的完整单词列表会阻止我们处理以前未见过的单词或字符组合。因此,更常见的做法是使用 token 库,其中包含单个字符和字符簇(包括完整单词以及单词的部分),这些都是在实际文本中频繁出现的。例如,GPT-3 的 token 词汇表包含 约 50,000 个条目。你可以在此浏览 GPT token 词汇表,会看到其中包含单个字符、单词片段和完整单词(通常包含标点或空格)。

一旦文本被分解为单个 token,每个 token 就会被转换为一个嵌入,即一个长数字向量。例如,GPT-3 的嵌入向量长度为 12,288 个数字。你可以将这个嵌入向量视为某个非常高维空间中的坐标。转换通过嵌入矩阵完成,它实际上是一个巨大的矩阵,每一行对应一个特定 token 的嵌入。下图展示了使用(高度简化的)token 词汇表和嵌入表将字符串“the cat sat on the mat”转换为一系列嵌入向量的示例。

关于嵌入矩阵的一个关键事实是,其中的值——每个嵌入向量中的数字——是模型参数,会像多层感知机中的权重和偏置一样被学习。在模型训练过程中,嵌入向量会通过所使用的某种梯度下降方法进行更新,而模型学到的相似甚至可替代的 token 在“嵌入空间”中可能会彼此更接近。

对于图像,我们可以使用类似的过程,但必须稍作修改。在诸如视觉 Transformer(一种用于图像分类等任务的 AI 模型)中,图像首先被分解为一系列较小的块(例如 16 × 16 像素的正方形),称为 patch,相当于图像中的 token。然而,与 token 不同,为每个可能的图像 patch 都设置一个唯一的嵌入向量是不可行的,因为可能的 patch 数量太大。即使图像仅限于黑白像素,唯一的 16 × 16 patch 数量也是 2^256,这与宇宙中估计的原子数量相差并不太多。这远远超出了表格所能列出的条目数量。

取而代之的是,patch 通过一个学习到的嵌入函数转换为嵌入向量。首先,一个 patch 被转换为一个非常长的向量,包含每个像素的数值颜色值。然后,这个向量通过某个学习到的嵌入函数(例如乘以一个学习到的矩阵)转换为嵌入向量,其参数通过训练进行更新。

对于文本和图像,这个过程都会生成一个矩阵,其中每一行是某个特定 token 或 patch 的嵌入向量。由于嵌入向量本身并不提供 token 在特定文本片段中出现位置的信息,因此通常会通过给每个嵌入向量加上一个位置编码向量来修改嵌入向量列表。

先继续讨论文本,我们有分词器和嵌入矩阵,它们将单词转换为长数字向量。我们向这些向量添加位置信息,然后将它们输入神经网络,以各种方式修改它们,最终产生一些输出。

这种安排的一个弱点是,虽然网络可以通过嵌入表了解各种文本块的普遍相似性,但嵌入向量不包含任何关于 token 在特定文本字符串中含义的信息。token “red” 和 “crimson” 的向量将反映模型对它们一般用法的学习,由于它们描述相似的颜色,它们最终可能在嵌入空间中彼此接近,得到相似的嵌入向量。但这不会提供任何关于它们在像 “the harvard crimson staff were seeing red on sunday when the president shut down their office.” 这样的句子中含义的信息。如果我们想准确预测序列中的下一个 token,那么能够修改嵌入向量以包含周围上下文的信息将很有用。

一种已被证明非常成功的方法是称为“注意力”的机制。注意力基本上是一种用周围上下文信息修改嵌入向量的方式。这是通过将 token 的嵌入向量转换为三个其他向量来实现的:查询向量、键向量和值向量。每个向量都是通过将嵌入向量乘以某个矩阵创建的。与嵌入表一样,这些矩阵是学习得到的:其中的值将通过训练过程修改。在 GPT-3 中,查询、键和值向量各有 128 个数字。

查询向量可以看作代表类似“哪些其他 token 对解释我重要?”的东西。键向量可以看作代表类似“我适合用于什么类型的东西?”的东西。值向量可以看作代表“我将提供什么类型的信息?”得到的向量组合成一个查询矩阵 Q、一个键矩阵 K 和一个值矩阵 V,每一行是某个特定 token 的向量。

为了计算注意力,查询矩阵 Q 会与转置后的键矩阵 K 相乘(这里的“转置”指的是“行变成列,列变成行”)。这会产生一个新的矩阵 QKᵀ,其中的数值表示每个 token 对于理解其他每个 token 有多重要。然后对这个矩阵进行几个机械性的步骤。首先,我们将 QKᵀ 矩阵中的每个值除以键向量长度的平方根,以防止数值变得过大。在预测序列中的下一个 token 时,我们不希望较早的 token 能够“看到”后面的 token。我们通过所谓的“因果掩码”来纠正这一点——本质上就是把后面 token 对前面 token 的值设为负无穷。我们还使用一个叫做“softmax”的函数,对每一行中的值进行缩放,使其介于 0 和 1 之间并且总和为 1。(如果你有向量 [10 6 4],softmax 会把它转换为 [0.5 0.3 0.2])。你可以把这理解为创建一个矩阵,告诉我们每个 token 应该从其他 token 中获取多少信息。

经过缩放和掩码处理的 QKᵀ 矩阵随后会与值矩阵 V 相乘。这个乘法的输出是一组嵌入向量,其中每个向量都已被修改,以包含有关该 token 周围上下文的信息。

在实践中,通常会同时多次运行这种注意力机制(这被称为“多头注意力”)。例如,GPT-3 有 96 个注意力头。每个注意力头都会学习不同的矩阵来计算 Q、K 和 V,并且可能学会在周围上下文中寻找不同的东西:你可以想象一个注意力头在“寻找”相关的名词,一个在寻找某个词之前的提及,等等。(这些只是概念性的例子;在实践中,注意力头学会“关注”的东西并不一定能够这样清晰地对应到这些概念上。)每个注意力头的输出会被拼接成一个矩阵,然后再与另一个学习到的矩阵相乘,从而把来自不同头的信息混合在一起。得到的矩阵随后可以交由神经网络的其余部分处理。

使用注意力最常见的方式大概就是通过所谓的 transformer 架构。GPT 风格的 transformer 由多个“transformer 块”组成,每个块都包含一个注意力步骤,后面跟着一个多层感知机。例如,GPT-3 包含 96 个 transformer 块。在第一个 transformer 块中,模型接收 token 的嵌入向量,然后这些向量由 96 个注意力头处理,生成一个输出矩阵,其各行是经过修改和处理的嵌入向量。矩阵的每一行随后会经过一个带有单个隐藏神经元层的 MLP:注意力机制在 token 之间混合信息,而 MLP 则分别处理它接收到的每个嵌入向量,进一步修改它们。输出随后会被送入另一个 transformer 块,后者做同样的事情:对前一个块的输出运行注意力机制(使用全新的、学习到的矩阵来计算 Q、K 和 V),然后将其送入一个 MLP。这个过程会一次又一次地进行,经过所有 transformer 块,直到最后,最后一个 token 的向量被转换为一个分数列表,每个可能的 token 对应一个分数,表示模型对序列中下一个 token 可能是哪个的猜测。

A transformer architecture can also be used to process images. The Vision Transformer (ViT) base model described in a 2020 paper by a team from Google uses 12 transformer blocks, each one with 12 attention heads. One difference with the vision transformer is that there’s no causal masking: every token can “see” every other token when processed by the attention mechanism. Another difference is the output: while a GPT-style language transformer takes a string of tokens as an input and predicts the next token as an output, the initial vision transformer takes a string of image “tokens” as an input and produces a classification of the image as an output.

有了能处理视觉或文本的 transformer,设计一个能同时处理图像和文本的模型就不难了:比如给它输入一张图像和一个文本查询(“这张图片是什么?”),让模型生成答案。这被称为视觉语言模型,简称 VLM。LLaVA(Large Language and Vision Assistant 的缩写)就是这样一个模型。在 LLaVA-1.5 中,图像被输入视觉 transformer,后者将其分成 patch,将这些 patch 转换为嵌入,然后将嵌入通过一系列视觉 transformer 块,生成一系列向量(每个 patch 一个)。这些向量随后通过所谓的“投影器”转换,这是一个 MLP,改变它们的大小并将其表示修改为 LLM 所期望的形式。这些转换后的向量随后与输入文本 token 的嵌入一起被输入 LLM,LLM 由另一系列 transformer 块组成。这个 transformer 中的注意力可以同时查看来自图像和文本的向量,根据图像内容和文本内容修改它们。数据流经 transformer 块,最终输出为预测的文本字符串(“这是一张狗的照片”)。这种基本架构——一个视觉 transformer、一个将其输出转换为 LLM 大小向量的投影器,以及一个处理文本和图像数据的 LLM——很常见,尽管不同模型以不同方式实现它。

你可以类似地使用 transformer 架构来驱动机器人,方法是向其输入机器人状态信息以及图像和文本,并让它输出一系列机器人动作。这被称为视觉-语言-动作模型,简称 VLA。π0.5 VLA 的架构如下图所示:

来自机器人摄像头的图像数据、文本指令以及表示机器人状态的数据都通过各种编码器转换为 token 嵌入。这些随后被输入语言主干,该主干由一系列 18 个 transformer 块组成。(有趣的是,这些块有多个注意力头,但仅用于查询矩阵:每个注意力头的键和值矩阵相同。这被称为“多查询注意力”。)

与这个视觉语言模型并行运行的是另一个 transformer,即动作 transformer,它同样由 18 个 transformer 块组成(与视觉语言模型相同)。这个动作 transformer 接收的输入是本质上代表 50 个随机动作的 token 嵌入。这些嵌入经过 transformer 处理,在针对每个动作向量的每个注意力步骤中,动作 transformer 不仅查看其他动作向量,还查看视觉语言模型中对应块里来自图像、文本和机器人状态的向量。然后它根据从文本和图像向量中获得的信息,修改这些动作嵌入,使其偏离随机动作。随着动作向量经过动作 transformer,它们会继续利用处理后的图像、文本和状态向量中的信息被修改。动作 transformer 的输出随后被用来校正输入的“噪声”动作,整个过程再次运行。经过 10 次迭代后,动作 transformer 的输出有望成为一串有用的 50 个动作序列。(该模型一次处理 50 个动作,因为如果输出单个动作,然后为下一个动作再次运行整个模型,会让机器人移动得非常缓慢。这被称为“动作分块”。)这些动作以关节角度或夹爪位置目标的形式出现,随后被送入传统的机器人控制器,由其转换为电机扭矩,从而实际移动机器人。

该系统由各种已有的组件组装而成,然后一起训练。将图像块转换为嵌入向量的 transformer 称为 SigLIP,这是一个拥有 4 亿参数的模型,最初创建于 2023 年,并在图像和文本对上进行了训练。2024 年,Google 将 SigLIP 与一个已有的、拥有 20 亿参数的 LLM(名为 Gemma,曾在 3 万亿 token 的文本上训练)结合,创建了 PaliGemma VLM,随后又在超过 10 亿个训练样本上对其进行了进一步训练。这些样本包括为图像生成说明文字和回答关于图像的问题等任务。为了创建 π0.5 VLA,Physical Intelligence 采用了 PaliGemma,将其与一个将机器人动作转换为 token 的系统(他们称之为 FAST)以及一个新创建的动作 transformer(一个拥有 3 亿参数的模型)相结合,然后在各种机器人操作任务(以及一些额外的图像描述任务)上训练了这个组合系统。

在研究这个之前,我模糊地知道机器人 AI 模型与我熟悉的 AI 聊天机器人所使用的模型相似。但我惊讶于两者之间的重叠程度如此之大,VLA 实际上将基于文本训练的 LLM 作为主要构建模块,并且 LLM 的基本 transformer 架构被应用于生成机器人动作。这并不一定意味着我们会在机器人能力上看到与 AI 整体上相同的快速改进,但这确实让我觉得这可能是可能的。

机器人和控制它们的 AI 是我预计会变得越来越重要的东西,也是我计划投入越来越多时间的一个主题,更深入、更多地审视这项技术及其进展。

1

在一个固定的、有界的输入范围内。

来源:Hacker News · construction-physics.com