深入解析SmolVLA:VLM与动作专家间的注意力机制交互

在机器人学习领域,如何有效地将视觉语言模型(VLM)的强大感知能力与低级动作控制相结合,是实现通用机器人智能的关键挑战。SmolVLA(Small Vision-Language-Action)架构正是在这一背景下应运而生,它通过一种新颖的交错注意力机制,实现了视觉语言特征与机器人动作生成之间的紧密耦合。本文将深入探讨SmolVLA架构中VLM与动作专家(Action Expert)之间的信息交互,特别是其注意力机制中KV和QKV的设计原理,并结合官方代码进行详细解析。

一、SmolVLA架构概览

SmolVLA由两大部分组成:一个预训练的视觉语言模型(VLM)和一个动作专家。VLM负责处理多模态输入,包括语言指令、RGB图像和机器人本体感受状态,并提取高级特征。这些特征随后被送入动作专家,由其生成一系列低级动作块(action chunks)。与传统的Transformer架构不同,SmolVLA的动作专家采用了交错式的自注意力(Self-Attention, SA)和交叉注意力(Cross-Attention, CA)层,而非在每个解码器块中同时包含两者。这种设计旨在优化性能并提高推理速度。
在这里插入图片描述

图1 | SmolVLA架构图

二、注意力机制基础回顾

在深入SmolVLA的细节之前,我们先简要回顾一下Transformer中自注意力和交叉注意力的基本概念:

  • 自注意力(Self-Attention):在自注意力机制中,输入序列中的每个元素都会与同一序列中的所有其他元素计算注意力权重。它通过将输入表示转换为查询(Query, Q)、键(Key, K)和值(Value, V)三个向量来实现。Q与K的点积决定了注意力权重,然后这些权重作用于V,得到加权和的输出。自注意力允许模型捕捉序列内部的依赖关系。

  • 交叉注意力(Cross-Attention):交叉注意力通常用于处理两个不同的输入序列。其中一个序列提供查询(Q),而另一个序列提供键(K)和值(V)。例如,在编码器-解码器架构中,解码器的查询来自解码器自身的输出,而键和值则来自编码器的输出。这使得解码器能够“关注”编码器输出中的相关信息。

三、SmolVLA中VLM与动作专家的信息交互

SmolVLA的核心创新之一在于其VLM与动作专家之间独特的信息交互方式。如图1所示,VLM的输出特征(通常是其最后一层或中间层的隐藏状态)被传递给动作专家。这种交互通过注意力机制实现,其中VLM的特征充当了动作专家注意力层的键(K)和值(V)的来源。

3.1 动作专家中的交叉注意力(Cross-Attention)

在SmolVLA的动作专家中,交叉注意力层(图1中金色块)负责将动作令牌(action tokens)与VLM提取的视觉语言特征进行融合。根据论文描述:

In our setup, CA layers cross-attend the VLM’s keys and values, while SA layers allow the action tokens in vθv_θvθ to attend to each other.

这意味着在交叉注意力层中:

  • 查询(Q):来自动作专家自身的当前动作令牌的表示。这些令牌代表了模型正在尝试生成的动作序列。
  • 键(K)和值(V):来自VLM的输出特征。VLM已经处理了图像、语言指令和机器人状态,并生成了包含这些多模态信息的丰富表示。这些VLM特征作为外部信息源,为动作令牌提供了上下文。

因此,交叉注意力层接收的是VLM的KV以及动作专家自身的Q。这种设计使得动作专家能够根据VLM提供的感知信息来调整和生成动作。例如,如果VLM识别出图像中的特定物体或理解了语言指令中的特定动词,这些信息将通过KV传递给动作专家,指导其生成相应的抓取或移动动作。

让我们看看smolvlm_with_expert.py中的forward_cross_attn_layer函数,它负责处理交叉注意力逻辑。虽然代码中直接计算了expert_query_stateexpert_key_statesexpert_value_states,但关键在于expert_key_statesexpert_value_states的来源。它们是通过expert_layer.self_attn.k_projexpert_layer.self_attn.v_proj对VLM的key_statesvalue_states进行投影得到的。这明确体现了VLM作为KV源的机制:

            _key_states = key_states.to(dtype=expert_layer.self_attn.k_proj.weight.dtype).view(*key_states.shape[:2], -1)expert_key_states = expert_layer.self_attn.k_proj(_key_states).view(*_key_states.shape[:-1], -1, expert_layer.self_attn.head_dim)  # k_proj should have same dim as kv_value_states = value_states.to(dtype=expert_layer.self_attn.v_proj.weight.dtype).view(*value_states.shape[:2], -1)expert_value_states = expert_layer.self_attn.v_proj(_value_states).view(*_value_states.shape[:-1], -1, expert_layer.self_attn.head_dim)expert_query_state = expert_layer.self_attn.q_proj(expert_hidden_states).view(expert_hidden_shape)

这里的key_statesvalue_states实际上是VLM层在处理其自身输入时生成的KV对。动作专家通过对其进行线性投影,将其适配到自己的维度空间,从而在交叉注意力中作为外部信息源。

3.2 动作专家中的自注意力(Self-Attention)

自注意力层(图1中浅黄色块)在动作专家内部运作,其目的是让动作令牌之间相互关注,捕捉动作序列内部的时间依赖性。根据论文:

SA layers allow the action tokens in vθv_θvθ to attend to each other. We employ a causal attention mask for the SA layers, ensuring that each action token can only attend to past tokens within the chunk, preventing future action dependencies.

这意味着在自注意力层中:

  • 查询(Q)、键(K)和值(V):全部来自动作专家自身的当前动作令牌的表示。每个动作令牌都生成自己的Q、K和V,并与其他动作令牌的K和V进行交互。

自注意力层接收QKV的原因是它需要捕捉序列内部的依赖关系。动作专家在生成动作序列时,需要考虑之前生成的动作对当前动作的影响,并确保动作序列的连贯性和流畅性。因果注意力掩码(causal attention mask)的引入,进一步确保了每个动作令牌只能关注其之前的令牌,从而避免了未来信息泄露,这对于序列生成任务至关重要。

smolvlm_with_expert.pyforward_attn_layer函数中,我们可以看到Q、K、V都是从inputs_embeds(即动作令牌的隐藏状态)中计算出来的:

        query_states = []key_states = []value_states = []for i, hidden_states in enumerate(inputs_embeds):layer = model_layers[i][layer_idx]if hidden_states is None or layer is None:continuehidden_states = layer.input_layernorm(hidden_states)input_shape = hidden_states.shape[:-1]hidden_shape = (*input_shape, -1, layer.self_attn.head_dim)hidden_states = hidden_states.to(dtype=layer.self_attn.q_proj.weight.dtype)query_state = layer.self_attn.q_proj(hidden_states).view(hidden_shape)key_state = layer.self_attn.k_proj(hidden_states).view(hidden_shape)value_state = layer.self_attn.v_proj(hidden_states).view(hidden_shape)query_states.append(query_state)key_states.append(key_state)value_states.append(value_state)query_states = torch.cat(query_states, dim=1)key_states = torch.cat(key_states, dim=1)value_states = torch.cat(value_states, dim=1)

这里的inputs_embeds在动作专家内部的自注意力层中,就是动作令牌的嵌入表示。通过对这些嵌入进行Q、K、V投影,模型能够计算动作令牌之间的相互依赖关系。

四、交错注意力机制的优势

SmolVLA采用交错式的交叉注意力和自注意力层,而非在每个解码器块中同时包含两者,这与许多标准VLM架构(如Transformer解码器)有所不同。论文指出:

Empirically, we find that interleaving CA and SA layers provides higher success rates and faster inference time. In particular, we find self-attention to contribute to smoother action chunks A, something particularly evident when evaluating on real robots.

这种设计选择的优势在于:

  • 效率提升:通过交错使用,而不是在每个层都同时计算两种注意力,可以减少计算开销,从而实现更快的推理速度。
  • 性能优化:实验结果表明,这种交错方式能够带来更高的成功率。自注意力层有助于生成更平滑、更连贯的动作序列,这对于真实机器人控制至关重要。
  • 明确职责:交叉注意力层专注于融合外部视觉语言信息,而自注意力层则专注于建模动作序列内部的依赖关系,职责更加明确,可能有助于模型更好地学习各自的特定任务。

五、总结

SmolVLA通过交错注意力机制,在VLM与动作专家之间建立了高效且富有表现力的信息交互通道。交叉注意力层允许动作专家从VLM中获取丰富的感知上下文(KV),从而指导动作的生成;而自注意力层则使动作专家能够捕捉动作序列内部的依赖关系(QKV),确保动作的连贯性和流畅性。这种独特的设计不仅提升了模型的性能和推理速度,也为机器人学习领域提供了一种新的注意力机制范式,使其在复杂任务中展现出卓越的潜力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/94323.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/94323.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Security 认证与授权实现机制

Spring Security 是一个功能强大且高度可定制的身份验证和访问控制框架,其认证和授权实现机制如下:一、认证(Authentication)实现 1. 核心组件 AuthenticationManager:认证入口点,委托给AuthenticationProviderAuthenticationProv…

开源的时间跟踪工具TimeTagger

简介 什么是 TimeTagger ? TimeTagger 是一个开源的时间跟踪工具,旨在帮助用户记录和分析他们的时间使用情况。它提供了一个互动的用户界面和强大的报告功能,适合个人和自由职业者使用。 主要特点 直观的用户界面:基于互动时间线…

学习游戏制作记录(角色属性和状态脚本)8.4

1.实现简单的角色属性创建CharactorState脚本:挂载在敌人和玩家身上public float damage;//角色伤害public float maxHp;//最大生命[SerializeField] private float currentHealth;//当前生命void Start(){currentHealth maxHp;//初始化将当前生命设置为最大生命}p…

04-Chapter02-Example01

文章介绍 1、完善项目结构 1.1 新建第二章对应模块Chapter021.2 新建模块Chapter02对应包com.itheima1.3 在包com.itheima下新建class类 ,类名称Example01.java项目结构如下:2、编写Example01.java代码 P38 package com.itheima;public class Example01…

【达梦MPP(带主备)集群搭建】

达梦MPP(带主备)集群搭建 为了提高MPP系统可靠性,克服由于单节点故障导致整个系统不能继续正常工作的问题,DM在普通的MPP系统基础上,引入数据守护主备机制,为每一个MPP节点配置一个实时备库作为备份节点&a…

Java基础学习(一):类名规范、返回值、注释、数据类型

目录 一、类名规范二、返回值三、注释四、数据类型 1. 基本类型2. 引用类型3. 强制数据类型转换4. 进制5. 进制的转换6. 超范围运算 相关文章 Java基础学习(二):Java中的变量和常量、final(重点)、运算、字符串 了…

Nginx相关实验(2)

nginx的一些高级配置 nginx状态页 基于nginx 模块 ngx_http_stub_status_module 实现, 在编译安装nginx的时候需要添加编译参数 --with-http_stub_status_module 否则配置完成之后监测会是提示语法错误 #检查模块是否配置 如果不存在需要添加模块重新编译 nginx …

2.Java和C++有什么区别

2.Java和C有什么区别 1.在C中,支持操作符重载,而在Java里是不允许的 2.C支持多继承,而Java不可以,但Java可以单继承多实现 3.Java内置多线程机制,而C没有 4.Java里面自带了垃圾回收机制,可以自动清理缓存等…

MLIR Introduction

简介 MLIR 项目是一个构建可重用和可扩展编译器基础设施创新项目,旨在解决软件碎片化问题,显著降低构建特定领域编译器的成本。 基于MLIR,可以实现: 数据流图表达(如TensorFlow),包含dynamic…

[找出字符串中第一个匹配项的下标]

代码思路分析: 1. 边界情况处理 代码中没有显式处理以下边界情况,但逻辑已隐含支持: needle 为空字符串:应返回 0(但题目通常保证 needle 非空)。haystack 比 needle 短:直接返回 -1&#xff08…

深入剖析RT-Thread串口驱动:基于STM32H750的FinSH Shell全链路Trace分析与实战解密(上)

0. 概述 这是cherryusb代码trace分析系列文章之七。 RT-Thread串口驱动框架与FinSH Shell运行机制深度解析:针对STM32H750 ART-PI平台,本文独辟蹊径采用创新的代码trace分析方法,破解庞大串口框架下的复杂运行逻辑。通过精确trace日志与drv_u…

Python与C++通信教程:C++打包dll,供Python调用(1)

目录 1,新建一个工程 math_functions.cpp内容: 先编译一下看是否可以正常运行: 2,编译成dll,并用Python调用 有两种方式: 命令 1(使用静态链接): 可移植性: 命令 2(动态链接): 可移植性: 这里我使用的是静态链接的方式: python调用实例 test_dll.py 1,…

编程与数学 03-002 计算机网络 19_网络新技术研究

编程与数学 03-002 计算机网络 19_网络新技术研究一、软件定义网络(SDN)(一)SDN的基本原理与架构(二)SDN的应用场景与优势二、网络功能虚拟化(NFV)(一)NFV的概…

uniapp 跨端开发

一、创建uniapp项目 1. 项目架构2. 初始化项目3. pages.json 和 tabBar 案例4. uni-app和原生小程序开发区别5. 用命令行创建uni-app项目 官网链接:https://uniapp.dcloud.net.cn/quickstart-cli.html#创建uni-app6. 用vscode开发uni-app在uni-app中只有manifest.js…

区块链支付技术的核心原理

区块链支付利用分布式账本技术(DLT)实现点对点的价值转移,无需传统银行或支付网关的中介。核心特点是去中心化、透明、可追溯。• 基本流程:1. 用户发起交易:通过加密货币钱包发送支付请求(例如用ETH支付&a…

linux中 多进程 导致cuda错误的问题解决

问题总结与解决方案 核心问题 在使用 Linux 系统时,多进程并行计算中加载模型到 GPU 时出现错误:_MODEL SentenceTransformer( model_path, device "cuda" if torch.cuda.is_available() else "cpu" )根本原因: CUDA 上…

智能感知的新入口:AIGC 与低延迟视频通路的深度融合

✳️ 引言:AIGC,正在重构视觉智能的“生成逻辑” AI生成内容(AIGC)正在从“内容创作工具”跃升为计算机视觉系统的新引擎。它不再只是“文生图”、“图生文”的演示技术,而是实实在在地改变着我们构建、处理和理解视觉…

Ubuntu 内网多台服务器时间同步方案(适用于临时能上外网的环境)

哎,最近项目是运行在内网环境下的,出现了由于时间不同步导致的bug。一般来讲,几台服务器的时间不一致,会带来很多问题,比如日志时间对不上、分布式服务出现异常,等等。项目上现在有三台服务器,其…

延长电池寿命的低Iq技术

本文章是笔者整理的备忘笔记。希望在帮助自己温习避免遗忘的同时,也能帮助其他需要参考的朋友。如有谬误,欢迎大家进行指正。一、概述随着电池供电型应用的激增,人们对质优价廉的电池和电池包的需求持续猛涨。电池制造商们不断采用新的化学物…

QT 如何实现enum与字符串的互转

将enum中定义的枚举值,以字符串的形式写入文件,同时也能从字符串转为枚举值。举例说明: ColorSelector中的Colors枚举,我们希望 kColorRed 这个写入到本地文件时,可以直接保存“kColorRed”,而非kColorRed对…