前言
最近入门具身智能,先了解了一些前置知识,然后通过论文的复现来进行基础方法的掌握,师兄推荐了一篇openvla,那么就开始吧(论文链接:https://arxiv.org/abs/2406.09246)
正文
VLA模型是在VLM,也就是多模态大模型的基础上,将最后一步输出通过各种方式改编成输出动作的模型,至于这个方式,以目前本人的见识,有各种方式,但是重点都是,将动作这种连续化的东西转换成一个个token的离散表达.
在这个动作表达部分我现在就能列出来几种:
- 直接token化
- 数值离散化
- 自然语言描述
至于如何实现输出动作这个部分,有自回归方式,扩散方式和混合的方式,都有对应的技术细节(当然本模型也会有,所以先不说太详细了)
本文的模型结构讲解
先贴一个图:
输入输出
首先看这个模型的input,是照片和语言,换句话说就是现场的图片和用户的指示.然后output是动作,具体来说是一个7D的动作指示,这个就能指导机器人操作.
多模态特征提取
在这张图里可以看到是用了DinoV2和sigLip这两个视觉编码器,分别对输入的图像进行特征提取,得到高维 的视觉特征,然后综合这两个视觉基础模型的输出,用一个多层感知机(MLP)来当做投影头.将视觉特征投影到与语言特征相同的空间,也就是进行矩阵大小的变换.
而在语言部分,使用llama Tokenizer将输入的语言指令分词并编码为token序列,得到文本特征。
多模态融合与推理
使用Llama 2 7B:大语言模型(7B参数),作为多模态融合和推理的主干,将视觉特征token + 语言token融合,集成视觉和语言信息,理解任务意图,推理出完成任务所需的动作序列。
动作解码
解码成7d的动作
OK,这么一看整体的模型工作流程是很简单的,把各个模型给拼了起来,最终完成具身智能的任务,那么接下来我就根据论文,把每一个重要步骤都讲解一下(在我的视角来看,主要就是VLM一个部分,动作解码一个部分)
工作流程
VLM部分工作
预备知识
大多数的VLM的组成就是三个部分,视觉编码器(visual encoder),一个投影器(projector),一个大语言模型(LLM).
本文的VLM
基于上述的结构,论文中说,他们就基于 Prismatic-7B VLM 进行构建,这个模型包括了 6 亿参数的视觉编码器、一个小型 2 层 MLP 投影器,以及一个 70 亿参数的 Llama 2 语言模型骨干(backbone),而这个Prismatic 使用了一个两部分的视觉编码器,由预训练的 SigLIP 和 DinoV2模型组成。输入图像块分别通过这两个编码器,并将得到的特征向量按通道连接.**也就是我们在模型图中看到的那样…**这样的操作能提升模型的空间推理能力.
然后本文就在基础上进行微调----为了让模型在机器人动作预测上有好的表现
动作解码
机器人原本的动作(如机械臂的每个关节角度、夹爪开合等)是连续数值,但大语言模型只能处理离散的token,所以,需要把每个连续动作数值离散化,变成一个个token(离散标记),这样才能作为大模型的输出。本文参考了Brohan等人的做法(RT-1/RT-2等工作)----机器人动作通常是多维的,将每一维都被分成256个区间,这样每个动作维度的输出就变成了0~255之间的一个整数----然后在这个基础上作者不是直接用所有数据的最小值到最大值来划分区间,而是用第1分位数到第99分位数(就是把最小的1%和最大的1%数据去掉,只用中间98%的数据范围来做后续处理,这样可以避免极端值对结果的影响,让数据分布更合理、更稳定。),这样做的目的是忽略极端异常值(outlier),只关注绝大多数正常动作的范围,在这个范围内,均匀地分成256个区间,每个区间的宽度是一样的。
那么这一步的动作解码究竟是如何实现的呢?根据作者说的使用的RT2来看,RT-2把每个动作维度(x、y、z、roll、pitch、yaw、gripper)都均匀离散化为256个bin(即0~255的整数),每个动作维度的实际数值范围(比如夹爪开合的最小值到最大值)被分成256份,每份对应一个token。
因此RT-2的输出是一个动作token序列,比如每个动作维度输出一个0~255之间的整数token。
再结合执勤提到的分数位操作,流程应该如下:
- 查找分位数区间:训练时统计每个动作维度的1%分位数(min)和99%分位数(max)。只在[min, max]这个区间内做离散化,忽略极端异常值。需要注意的是,这个部分是训练前的数据预处理阶段,并非训练和推理过程中
- token还原为连续值:假设某个动作维度的1%分位数是a,99%分位数是b。该维度的token为t(0~255)。那么动作值=a+(b−a)× t/255,这样就把token还原成了实际的动作数值。
- 多维动作拼接:所有动作维度都这样解码,拼成一个完整的动作向量(7维)
- 机器人控制器接收到这个动作向量,驱动机械臂或夹爪执行动作。
后记
目前看模型本体部分和工作流程部分就这些可以说的,实验部分可以另外开来说