絡(luò)深度拆解:機器人操作模型的架構(gòu)選型與調(diào)優(yōu))
做機器人操作模型的團隊這兩年大概都繞不開同一個詞VLA也就是 Vision-Language-Action Model。我自己的項目 nextVLA 也在這個賽道上折騰了大半年從最初的調(diào)研、拆解公開方案到確定自己的骨干網(wǎng)絡(luò)中間踩了不少坑。這個系列我打算開一篇架構(gòu)設(shè)計的博文第一篇就先聚焦在最核心的部分——VLA 骨干的拆解與選型。這篇內(nèi)容適合兩類人看一類是剛?cè)腴T、想搞清楚 VLA 內(nèi)部到底怎么工作的同學(xué)另一類是已經(jīng)在做機器人學(xué)習(xí)、正糾結(jié)怎么設(shè)計自己的骨干網(wǎng)絡(luò)的工程師。我會把 nextVLA 在架構(gòu)層面的取舍、具體實現(xiàn)和踩坑經(jīng)驗全部展開來講不會只停留在概念層面。VLA 這個概念本身不算復(fù)雜把視覺、語言、動作三部分塞進一個大模型里輸入是圖像和指令輸出是動作。但復(fù)雜全藏在骨干網(wǎng)絡(luò)的設(shè)計里。視覺信息怎么編碼語言指令怎么和視覺特征對齊動作又該怎么從模型里吐出來每一步都是選擇題。而我做 nextVLA 的第一原則是不要為了追新而追新每一個設(shè)計都要能在實驗里說清楚收益。這篇文章就是圍繞這個原則展開的。1. VLA骨干到底在拆什么先看清整體架構(gòu)很多剛接觸 VLA 的人會把它想象成一個黑盒輸圖進指令咔嚓一下出來動作。但真到自己搭建的時候才發(fā)現(xiàn)這個黑盒的內(nèi)部結(jié)構(gòu)決定了一切。先放下具體模塊我們從整體上把 VLA 骨干拆成三段看。1.1 從三段式機器人系統(tǒng)到端到端 VLA 的演變傳統(tǒng)機器人操作系統(tǒng)是典型的感知-規(guī)劃-控制三段式感知模塊輸出物體位姿規(guī)劃模塊算軌跡控制模塊做跟蹤。這套架構(gòu)最大的問題是每一段都要單獨設(shè)計和調(diào)參而且感知誤差會一級一級傳下去到控制層已經(jīng)被放得很大。VLA 的思路是把這三段壓縮成一個模型。模型的輸入是相機圖像和自然語言指令輸出直接是動作序列。這樣做的好處很明顯中間沒有顯式的狀態(tài)估計模塊模型通過海量數(shù)據(jù)自己學(xué)到什么樣的視覺特征組合對應(yīng)什么樣的動作。但壓縮不等于消失。我拆 nextVLA 的時候還是會把骨干分成三塊來審視視覺編碼器負責把圖像變成特征LLM 主干負責做多模態(tài)推理動作頭負責把推理結(jié)果變成可執(zhí)行的動作。分塊審視不是要回到三段式而是為了在調(diào)試的時候能定位問題——比如模型能聽懂指令但動作亂大概率問題出在動作頭而不是 LLM 主干。1.2 兩條技術(shù)路線自回歸動作token與連續(xù)動作回歸現(xiàn)在公開的 VLA 骨干基本可以歸成兩條路線。第一條是自回歸的路線。代表工作是像 RT-2 那一派把動作也變成離散 token讓模型像生成文本一樣逐個生成動作 token。這個路線的好處是訓(xùn)練非常穩(wěn)定因為整體就是一個標準的 causal LM 訓(xùn)練框架loss 就是下一個 token 預(yù)測的交叉熵。但缺點也很明顯動作是連續(xù)量離散化之后精度受限尤其在做精細插孔、裝配這類任務(wù)時256 個 bin 的粗糙程度會直接反映在成功率上。第二條是連續(xù)動作回歸。模型在 LLM 的 backbone 之上接一個回歸頭直接輸出連續(xù)的動作值或者動作 chunk。OpenVLA 早期走的是動作 token 化但后來很多工作都在往連續(xù)回歸轉(zhuǎn)。再往后業(yè)界把 diffusion policy 和 flow matching 引入動作頭動作輸出從直接回歸一個點變成了回歸一個動作分布采樣。我在 nextVLA 里最終選擇了連續(xù)動作路線動作頭用流匹配來做這個后面詳細展開。1.3 nextVLA 架構(gòu)層面最初的取舍項目剛起步時我做了一張表來對比不同骨干方案的組合核心考量是三個維度訓(xùn)練穩(wěn)定性、動作精度、推理速度。方案組合訓(xùn)練穩(wěn)定性動作精度推理速度適合場景全自回歸 token 化動作高中低慢通用 VLA 研究粗糙操作自回歸語義 連續(xù)動作頭中高中高中大多數(shù)桌面操作任務(wù)自回歸語義 流匹配動作專家中高高中nextVLA 的選擇精細操作最終選的是第三種組合視覺編碼器 LLM 主干負責語義理解與任務(wù)推理動作部分單獨用一個流匹配專家模塊而不是讓 LLM 一個詞一個詞地擠動作。這樣設(shè)計的主要原因后面會講簡單說是為了在動作精度和訓(xùn)練穩(wěn)定性之間找到平衡。2. 骨干每一段都是關(guān)鍵視覺編碼器、LLM主干與動作頭整體框架定下來之后接下來就是逐段拆解。這三段里每一段單獨拎出來都有很多可以展開的設(shè)計細節(jié)而它們之間的接口設(shè)計往往比模塊本身更容易翻車。2.1 視覺編碼器怎么選從能看懂到看得準VLA 的視覺編碼器承擔的任務(wù)比純 VLM 更重。VLM 只需要理解圖像內(nèi)容然后生成文本描述而 VLA 需要從圖像里提取出與動作強相關(guān)的空間信息——物體在哪里、朝向如何、抓手離目標還有多遠。這就要求視覺特征保留足夠的空間分辨率。我第一次做 nextVLA 原型時直接用了一個現(xiàn)成的 CLIP 視覺塔特征直接送進 LLM。結(jié)果在仿真任務(wù)里效果還行但換到真實世界就露餡了模型經(jīng)常認得出物體是什么卻抓不準物體在哪。問題就出在 CLIP 的特征更偏向語義空間定位信息不夠細致。后來我改成 SigLIP 這類視覺編碼器并且加了中間層的特征融合情況才好轉(zhuǎn)。現(xiàn)在很多公開 VLA 工作也都在用 SigLIP 作為默認視覺塔不是沒有原因的。另外還有一個關(guān)鍵選擇視覺編碼器要不要凍結(jié)。如果項目數(shù)據(jù)量不大我建議微調(diào)但要用小學(xué)習(xí)率。數(shù)據(jù)集夠大的話視覺塔微調(diào)帶來的收益會很明顯尤其當你的任務(wù)分布和預(yù)訓(xùn)練數(shù)據(jù)差異較大時。我實測下來在單個任務(wù)上微調(diào)視覺塔能帶來 5-10 個百分點的成功率提升。2.2 LLM 主干尺寸、上下文與指令注入方式LLM 主干是整個 VLA 的大腦。它要同時干兩件事理解語言指令結(jié)合視覺特征做任務(wù)推理。骨干選多大直接決定顯存占用和訓(xùn)練成本。nextVLA 目前用的是 7B 級別的視覺語言模型作為主干。這個體量是我反復(fù)權(quán)衡后的結(jié)果再小一些比如 1-3B推理能力和指令跟隨能力明顯下降復(fù)雜指令經(jīng)常執(zhí)行錯再大一些比如 13B、34B性能提升是有的但訓(xùn)練和推理成本飆升對機器人側(cè)的實時性不友好。7B 在目前來看是性價比最高的區(qū)間。指令注入方式也值得注意。最常見的做法是把指令文本和圖像 token 拼成一個序列送進 LLM。這里有個隱含問題圖像 token 數(shù)量越多指令文本在注意力中的相對權(quán)重就越低。所以早期我試過在指令后面重復(fù)指令文本、或者加特殊的指令 token來強化指令的引導(dǎo)作用。這些 trick 單個看提升不大但疊加起來對長程任務(wù)的穩(wěn)定性有幫助。2.3 動作頭從分類到回歸再到流匹配動作頭是我在 nextVLA 里改動最多的部分。動作頭解決的根本問題是如何把 LLM 最后一層的隱藏狀態(tài)映射成機器人能夠執(zhí)行的關(guān)節(jié)位置或末端位姿。最早我嘗試了離散動作 token原因很直接和 LLM 的預(yù)訓(xùn)練目標對齊訓(xùn)練穩(wěn)定。但我立刻碰到了精度天花板。在仿真里做抓取這類大動作沒問題換到插孔這類需要毫米級精度的任務(wù)就崩了。離散化本質(zhì)上是給動作加了噪聲且這個噪聲不可控。后來我切換到連續(xù)回歸輸出動作 chunk也就是一次性預(yù)測未來幾十步的動作軌跡。相比自回歸一個 token 一個 token 地擠動作 chunk 有兩個好處一是避免了誤差累積二是給底層控制器更長的前瞻窗口。但連續(xù)回歸也有自己的毛病多峰問題。同樣的場景下機器人的最優(yōu)動作可能有多種直接回歸一個均值會把多峰分布平滑掉了動作看起來猶豫且抖動。最后的解決方案是流匹配動作專家。流匹配的思路很簡潔不直接回歸動作點而是學(xué)習(xí)從噪聲分布到動作分布的映射推理時從噪聲采樣并在幾步內(nèi)去噪得到動作。這個方案在動作多樣性和穩(wěn)定性之間取得了很好的平衡。我測試下來在精細操作任務(wù)上對比連續(xù)回歸成功率有明顯提升。3. 數(shù)據(jù)與訓(xùn)練nextVLA 的骨干如何真正跑起來架構(gòu)設(shè)計得再好訓(xùn)練跑不起來或者效果不穩(wěn)都是白搭。VLA 和普通語言模型最大的不同在于訓(xùn)練數(shù)據(jù)的組織方式——你需要同時管理圖像、語言、動作三條流且三條流在時序上要嚴格對齊。3.1 訓(xùn)練數(shù)據(jù)從哪來真實數(shù)據(jù)、仿真數(shù)據(jù)和開源數(shù)據(jù)nextVLA 的訓(xùn)練數(shù)據(jù)來自三個渠道各自承擔不同角色。第一個渠道是真實遙操作數(shù)據(jù)。這是最重要的數(shù)據(jù)來源。我們用主從遙操作設(shè)備采集真實操作數(shù)據(jù)包含多種工具、多種物體、多種桌面布局。真實數(shù)據(jù)的優(yōu)勢是域內(nèi)分布準確模型學(xué)到的策略直接可用缺點是采集成本高一個熟練的操作員一天能采集的有效軌跡也就幾百條。第二個渠道是仿真數(shù)據(jù)。仿真用來做規(guī)?;瘮U充我用仿真環(huán)境批量生成任務(wù)場景自動標注成功/失敗再導(dǎo)出軌跡。仿真的優(yōu)勢是便宜和量大但存在 sim-to-real gap。我的經(jīng)驗是仿真數(shù)據(jù)占比不要超過 30%否則模型會學(xué)到很多仿真特有的視覺假象。第三個渠道是開源數(shù)據(jù)集。像 Open X-Embodiment 這類跨機構(gòu)數(shù)據(jù)集可以直接拿來做預(yù)訓(xùn)練。開源數(shù)據(jù)的好處是覆蓋面廣能提升模型的泛化能力缺點是數(shù)據(jù)質(zhì)量參差不齊、動作空間不一致。我通常只拿它做骨干的冷啟動預(yù)訓(xùn)練然后用自采數(shù)據(jù)微調(diào)。3.2 訓(xùn)練階段設(shè)計先對齊、再預(yù)訓(xùn)練、最后微調(diào)VLA 的訓(xùn)練不是一次到位而是分階段進行。我在 nextVLA 里分了三步走。第一步多模態(tài)對齊預(yù)訓(xùn)練。用大規(guī)模圖文數(shù)據(jù)和開源機器人數(shù)據(jù)把視覺編碼器、LLM 主干和動作頭初步對齊。這一階段的目的是讓模型先學(xué)會看圖說話建立起視覺與語言之間的基本映射。第二步動作預(yù)訓(xùn)練。結(jié)合動作數(shù)據(jù)讓模型學(xué)會從指令和圖像預(yù)測動作。這一階段重點是讓 LLM 主干去適應(yīng)動作任務(wù)本身。和純文本預(yù)訓(xùn)練不同VLA 的動作目標函數(shù)和文本目標函數(shù)存在沖突因此要在 loss 上做權(quán)重平衡。我的經(jīng)驗是動作 loss 權(quán)重需要從 0.1 開始緩慢爬坡快速拉高會導(dǎo)致語言能力退化。第三步策略微調(diào)。用目標任務(wù)域的精細數(shù)據(jù)做微調(diào)把模型收斂到具體任務(wù)上。這一步學(xué)習(xí)率要比預(yù)訓(xùn)練低一個數(shù)量級而且要加入早停策略防止過擬合。實測下來分階段訓(xùn)練比直接端到端混合訓(xùn)練收斂速度快了將近一倍最終效果也更穩(wěn)定。3.3 顯存、吞吐與訓(xùn)練穩(wěn)定性VLA 骨干訓(xùn)練最現(xiàn)實的痛點是顯存。7B 模型微調(diào)加上視覺分支和動作分支單卡很容易 OOM。我的做法是三個并行策略gradient checkpointing、LoRA 微調(diào)、混合精度訓(xùn)練。Gradient checkpointing 用計算換顯存是默認開啟的。LoRA 微調(diào)只更新低秩適配器能省掉大量優(yōu)化器狀態(tài)。實測下來4 張 80G 的卡可以比較流暢地跑 7B 骨干加流匹配動作頭的訓(xùn)練。吞吐量方面一個經(jīng)常被忽視的瓶頸是圖像預(yù)處理的 CPU 瓶頸。圖像解碼、resize、normalize 如果放在主進程里做GPU 會一直等著吃數(shù)據(jù)。我后來把數(shù)據(jù)管線改成異步預(yù)取并把圖像預(yù)處理放到獨立的進程池里吞吐提升了將近 60%。訓(xùn)練穩(wěn)定性還有一個隱性殺手數(shù)據(jù)時序錯位。圖像、指令、動作在時間戳上差一幀loss 可能沒什么明顯變化但策略效果會稀碎。我在 pipeline 里加了對齊校驗訓(xùn)練前會檢查每條軌跡的圖像時間戳和動作時間戳是否嚴格單調(diào)對齊這個問題排查起來極其痛苦建議從一開始就做好。4. 評測與迭代從 LIBERO 基準到真實任務(wù)的驗證閉環(huán)架構(gòu)建好、訓(xùn)練跑通之后緊接著的問題就是怎么知道骨干行不行我在 nextVLA 里建立了一個兩級評測體系先在輕量級仿真基準上快速迭代再在真實場景中做最終驗證。4.1 用 LIBERO 基準快速驗證骨干能力LIBERO 是機器人操作領(lǐng)域一個被廣泛使用的仿真評測基準。我把 LIBERO 當作日常迭代的驗證工具因為它跑得快、成本低適合測不同骨干變體的效果差異。它把任務(wù)分成了幾個套件比如空間泛化、物體泛化、目標泛化、知識遷移、時序組合每個套件專門測試模型的一項能力。這個設(shè)計我非常喜歡它能告訴你模型的短板到底在哪個維度而不是只給一個平均成功率。我在 LIBERO 上做 A/B 測試時有個固定流程固定數(shù)據(jù)、固定訓(xùn)練輪數(shù)、固定隨機種子只改一個變量然后對比成功率。曾經(jīng)有一次我和同事爭論視覺編碼器應(yīng)該選 A 還是 B爭論了三天。最后在 LIBERO 的物體泛化套件上跑了一輪對比方案 B 比方案 A 高了接近 15 個點爭論立刻結(jié)束。沒有這種快速評測回路架構(gòu)迭代基本靠拍腦袋。4.2 真實環(huán)境的評測指標與細節(jié)LIBERO 表現(xiàn)好不代表真實場景沒問題。仿真環(huán)境的狀態(tài)是精確的、光照是固定的、物體形狀是不變的到了真實環(huán)境這些條件全都會變化。我見過太多在仿真里 90% 成功率、真實場景直接腰斬的案例。真實環(huán)境評測我設(shè)計了三個指標單次任務(wù)成功率、10 次重復(fù)實驗的穩(wěn)定性、以及失敗模式分類。成功率自然不用多說但穩(wěn)定性更重要——一個模型偶爾成功一次和連續(xù) 10 次穩(wěn)定成功可信度是完全不一樣的。失敗模式分類則用來指導(dǎo)下一步迭代方向模型是抓不住物體、還是抓到了放不對、還是動作執(zhí)行到一半卡住每種失敗背后的原因可能完全不同。另外真實評測的時間成本和精力成本都很高。每次重新擺場、復(fù)位物體、重置位姿都要花時間。我建議每次真實評測的任務(wù)數(shù)量控制在 3 到 5 個每個任務(wù)做 10 次實驗。這樣既能保證統(tǒng)計可信度又不會把整個團隊拖垮在評測上。4.3 骨干改造的迭代閉環(huán)VLA 骨干的開發(fā)不是一次性的而是一個持續(xù)的迭代閉環(huán)。我的節(jié)奏是每周在 LIBERO 上跑一輪骨架對比實驗每兩周做一次真實環(huán)境評測。每次改動只動一個變量并且記錄完整的實驗 log。迭代過程中我發(fā)現(xiàn)最有價值的改進往往來自對失敗案例的分析而不是對成功案例的復(fù)盤。有一次我在 LIBERO 的 Transfer 套件上發(fā)現(xiàn)模型在某個未見過的桌子顏色上全軍覆沒。排查后發(fā)現(xiàn)問題出在圖像增強策略上——訓(xùn)練時沒有加入色彩擾動導(dǎo)致模型過擬合了訓(xùn)練場景的色調(diào)。加上 color jitter 之后這個套件的成功率提升了將近 20 個點。這類問題不深入拆失敗案例是根本發(fā)現(xiàn)不了的。5. 骨干落地過程中的坑排查記錄與避坑建議最后這部分我梳理一下 nextVLA 骨干開發(fā)過程中實際遇到的典型問題。這些問題在論文里通常不會寫但每一個都真實地浪費過我?guī)滋鞎r間。5.1 訓(xùn)練不收斂或者動作抖動我在早期測試流匹配動作頭時經(jīng)常遇到 loss 在不斷下降、但動作輸出一顫一顫的情況。后來發(fā)現(xiàn)原因不是模型結(jié)構(gòu)不對而是動作歸一化沒做好。不同關(guān)節(jié)的運動范圍差異很大如果直接拿原始關(guān)節(jié)角度訓(xùn)練數(shù)值范圍大的關(guān)節(jié)會主導(dǎo)梯度更新。解決方法是按關(guān)節(jié)分別做標準化讓每個關(guān)節(jié)的數(shù)值范圍都落到接近零均值單位方差的區(qū)間。另外動作抖動還有一個常見來源是預(yù)測頻率太高。模型每個控制周期都重新推理一次上個周期的動作還沒執(zhí)行完新動作就來了兩個動作之間的不一致就表現(xiàn)為抖動。我調(diào)整了動作推理的觸發(fā)策略只按固定頻率推理并且做動作平滑抖動問題明顯改善。5.2 評測結(jié)果忽高忽低難以判斷改動是否有效這是做 VLA 最讓人頭疼的問題。同一份代碼、同一個模型在 LIBERO 上跑三次結(jié)果可能波動 10 個點以上。我開始的時候經(jīng)常被這種隨機性誤導(dǎo)把噪聲當成改進。后來我摸索出一個比較可靠的流程固定隨機種子每個實驗跑至少 5 個 seed取平均和方差。改動帶來提升的標準是平均成功率提升要超過方差。如果模型 A 平均 70%模型 B 平均 72%但各自方差都有 3-4 個點那這種差距在實際意義上并不顯著。另外評測時初始場景的隨機化程度也要統(tǒng)一否則場景差異會占掉很大一部分隨機性。5.3 推理速度和顯存問題VLA 落地到真實機器人上推理速度是硬指標。7B 模型在 GPU 上推理一次可能只要幾百毫秒但機器人控制周期要求可能只有幾十毫秒這里面的差距需要想辦法彌補。我在推理側(cè)做了三件事。第一圖像 token 會被壓縮而不是把所有視覺 token 都灌進 LLM這樣能顯著降低序列長度。第二LLM 的 KV cache 緩存復(fù)用對歷史上下文不做重復(fù)計算。第三動作頭和 LLM 解耦LLM 只需要在指令或狀態(tài)發(fā)生顯著變化時推理一次動作生成的循環(huán)只跑輕量級的流匹配去噪不經(jīng)過 LLM。這套組合拳下來端到端的推理延遲從最初的接近 2 秒降到了 300 毫秒左右達到了真實場景可用的程度。最后再分享一個我個人非常堅持的習(xí)慣每次改骨干結(jié)構(gòu)都先寫一頁紙的改動說明寫清楚改了什么、為什么改、預(yù)期帶來什么收益。這個習(xí)慣幫我避免了很多次改了不如不改但不改回去又不甘心的內(nèi)耗。架構(gòu)設(shè)計這件事最怕的不是踩坑而是踩了坑還不記得為什么踩、怎么爬出來的。把這些記錄在案下一代 VLA 迭代的時候你會有一種站在自己肩膀上的感覺。