作指令微調(diào):提升機(jī)器人學(xué)習(xí)泛化性的關(guān)鍵)
做機(jī)器人學(xué)習(xí)這塊的朋友應(yīng)該都有一種共同的體感視覺語言模型VLM越來越強(qiáng)但要把它真正“接”到機(jī)械臂上總覺得隔著一層?xùn)|西。最近我花了一晚上認(rèn)真讀了這篇標(biāo)題很長(zhǎng)的論文《LLARVA: Vision-Action Instruction Tuning Enhances Robot Learning》雖然名字繞口但核心命題非常直接把視覺觀測(cè)和動(dòng)作輸出放到同一個(gè)“指令微調(diào)”框架里到底能不能提升機(jī)器人學(xué)習(xí)的泛化性讀完之后我的結(jié)論是這個(gè)思路的工程價(jià)值被低估了。這篇博文就是一篇論文拆解筆記我會(huì)先講清楚它解決的問題是什么、方法骨架怎么搭、實(shí)驗(yàn)上通常關(guān)注哪些維度再聊聊如果我想在自己的數(shù)據(jù)集上復(fù)現(xiàn)這套視覺-動(dòng)作指令微調(diào)管線應(yīng)該從哪下手、有哪些坑。適合兩類人看一是剛?cè)霗C(jī)器人學(xué)習(xí)、想搞懂VLAVision-Language-Action這條路線的同學(xué)二是已經(jīng)在跑模仿學(xué)習(xí)基線但困惑“為什么視覺特征和動(dòng)作頭總是不太匹配”的工程師。1. 這篇論文到底在解決什么問題1.1 一個(gè)容易被忽略的錯(cuò)位視覺特征和動(dòng)作輸出沒有對(duì)齊早期的機(jī)器人模仿學(xué)習(xí)管線通常是兩條腿視覺模塊負(fù)責(zé)從圖像里抽取特征動(dòng)作模塊負(fù)責(zé)把這些特征映射成關(guān)節(jié)速度或末端位姿。常見的做法是拿一個(gè)預(yù)訓(xùn)練的視覺模型做backbone后面再接一個(gè)MLP或者Transformer動(dòng)作頭。聽起來順理成章但實(shí)際操作中你會(huì)發(fā)現(xiàn)一個(gè)尷尬的問題視覺模型在ImageNet或者Web數(shù)據(jù)集上預(yù)訓(xùn)練時(shí)根本沒有接觸過“這張圖接下來對(duì)應(yīng)什么動(dòng)作”這個(gè)信息。它學(xué)習(xí)到的是物體類別、場(chǎng)景語義而不是“我現(xiàn)在應(yīng)該把手往左移5厘米”。這就像教一個(gè)新手開車給他看了大量道路照片告訴他這是紅燈、這是行人、這是車道線但從來沒有把“看到紅燈”和“踩剎車”這兩件事綁定訓(xùn)練。等真上車的時(shí)候他能認(rèn)出路況卻不知道手腳該怎么動(dòng)。LLARVA這篇論文的出發(fā)點(diǎn)就是把“看到什么”和“接下來動(dòng)一下”直接打包成指令樣本讓模型在訓(xùn)練階段就開始建立視覺特征與動(dòng)作輸出之間的強(qiáng)關(guān)聯(lián)。這種做法術(shù)語叫Vision-Action Instruction Tuning本質(zhì)上是對(duì)齊視覺表征和動(dòng)作表征的語義空間。1.2 為什么不是從頭訓(xùn)練而是“指令微調(diào)”有人可能會(huì)問既然視覺和動(dòng)作對(duì)不齊那干脆用一個(gè)端到端的大模型從零開始學(xué)任務(wù)不就行了理論上可以但實(shí)際上有幾個(gè)很現(xiàn)實(shí)的問題。第一是數(shù)據(jù)量。機(jī)器人示教數(shù)據(jù)的采集成本極高一條有效軌跡往往需要人工遙控機(jī)械臂、反復(fù)演示、清洗時(shí)間戳不對(duì)齊的壞樣本。哪怕是在仿真環(huán)境里批量生成也很難短時(shí)間湊夠從零訓(xùn)練一個(gè)大模型所需的千萬級(jí)樣本量。第二是算力。從頭訓(xùn)練一個(gè)多模態(tài)模型對(duì)大多數(shù)人來說遙不可及。第三是災(zāi)難性遺忘。即便你費(fèi)盡力氣從零訓(xùn)了一個(gè)模型它的語言理解能力和通用視覺先驗(yàn)也會(huì)因?yàn)橛?xùn)練目標(biāo)太聚焦而退化后續(xù)換一個(gè)任務(wù)又得重來。所以“指令微調(diào)”是性價(jià)比最高的路線先利用VLM已有的視覺語言基礎(chǔ)把動(dòng)作知識(shí)當(dāng)作一種新任務(wù)注入進(jìn)去而且注入的方式不是傳統(tǒng)的“給一段文字prompt讓它輸出動(dòng)作”而是把動(dòng)作本身變成一個(gè)可以和視覺token相互作用的語義角色。這也是我把這類工作歸為VLA路線里偏“指令派”的原因。為了更直觀我畫了張對(duì)比表來區(qū)分主流做法和LLARVA這類指令微調(diào)做法的差別對(duì)比維度傳統(tǒng)“視覺特征動(dòng)作頭”通用VLM直接輸出動(dòng)作Vision-Action指令微調(diào)視覺特征訓(xùn)練目標(biāo)識(shí)別/分類為主語言對(duì)齊為主與動(dòng)作token對(duì)齊為主動(dòng)作輸出方式連續(xù)向量單獨(dú)head文本化/離散化token潛在動(dòng)作token解碼器還原模間關(guān)系視覺模塊和動(dòng)作頭分開訓(xùn)練模型“讀”文本prompt再輸出視覺動(dòng)作聯(lián)合組成指令樣本數(shù)據(jù)效率需要大量配對(duì)數(shù)據(jù)需要強(qiáng)語義任務(wù)描述中等數(shù)據(jù)量即可有明顯提升2. 方法拆解Vision-Action指令微調(diào)是怎么搭起來的2.1 數(shù)據(jù)層面把“圖像序列動(dòng)作序列”做成指令對(duì)理解這套方法最關(guān)鍵的突破點(diǎn)在于數(shù)據(jù)組織方式。傳統(tǒng)方法里一條演示數(shù)據(jù)是“若干幀圖像 每個(gè)時(shí)刻對(duì)應(yīng)的動(dòng)作向量”。LLARVA的做法是把動(dòng)作序列先編碼成潛在動(dòng)作token然后按照語言模型的指令模板把“觀測(cè)圖像”和“動(dòng)作token”組合成類似多輪對(duì)話的樣本。舉個(gè)例子假設(shè)一個(gè)桌面抓取任務(wù)示教數(shù)據(jù)有50幀圖像每一幀對(duì)應(yīng)一個(gè)六維末端位姿動(dòng)作。做法不是讓模型每幀輸出一個(gè)連續(xù)向量而是把整個(gè)動(dòng)作序列通過一個(gè)動(dòng)作編碼器壓縮成若干個(gè)離散token然后排列成類似這樣的格式System: 你是一個(gè)機(jī)械臂控制模型請(qǐng)根據(jù)當(dāng)前觀測(cè)輸出下一步動(dòng)作。User: [觀測(cè)圖像幀1][觀測(cè)圖像幀2][觀測(cè)圖像幀3]...Assistant: [動(dòng)作token_1][動(dòng)作token_2][動(dòng)作token_3]...這樣做的第一個(gè)好處是模型在推理時(shí)看到的輸入格式和訓(xùn)練時(shí)完全一致沒有“換個(gè)場(chǎng)景就不知道該怎么組織輸入”的問題。第二個(gè)好處是動(dòng)作被離散化之后VLM可以像生成文本一樣逐token生成動(dòng)作不需要在模型的輸出層外接一個(gè)額外的回歸頭模型結(jié)構(gòu)變簡(jiǎn)單了訓(xùn)練也更穩(wěn)定。關(guān)于動(dòng)作編碼器我理解的常見做法是用一個(gè)類VAE變分自編碼器結(jié)構(gòu)把原始連續(xù)動(dòng)作壓縮到低維潛在空間。為什么這樣做因?yàn)橹苯幼屨Z言模型輸出連續(xù)坐標(biāo)本質(zhì)上是在做一個(gè)高維回歸任務(wù)這對(duì)LLM來說并不擅長(zhǎng)。離散化之后模型可以把“預(yù)測(cè)下一個(gè)動(dòng)作token”當(dāng)作一個(gè)類別選擇問題穩(wěn)定性高很多。如果做個(gè)生活化類比連續(xù)動(dòng)作就像是鋼琴的每個(gè)琴鍵都要單獨(dú)記憶而潛在動(dòng)作token就像是五線譜上的音符只需要記住有限的音符組合就能還原出各種旋律。當(dāng)然壓縮過程中會(huì)有信息損失所以動(dòng)作編碼器的重建質(zhì)量直接決定了整條管線的上限。這一點(diǎn)我在后面實(shí)操部分會(huì)再展開。2.2 模型結(jié)構(gòu)視覺編碼器、動(dòng)作編碼器與LLM主干如何協(xié)作這套方法的模型結(jié)構(gòu)從大的模塊上分無外乎幾塊視覺編碼器、動(dòng)作編碼器、投影層、LLM主干以及動(dòng)作解碼器。視覺編碼器負(fù)責(zé)把原始圖像轉(zhuǎn)換成視覺token序列。這里通常會(huì)用一個(gè)在大規(guī)模數(shù)據(jù)上預(yù)訓(xùn)練過的視覺Transformer但論文的取向是在視覺-動(dòng)作指令微調(diào)階段需要對(duì)視覺編碼器做一定程度的解凍甚至是低秩適配因?yàn)橥ㄓ靡曈X特征并不天然適合動(dòng)作預(yù)測(cè)。只凍結(jié)視覺編碼器的話后續(xù)LLM再怎么學(xué)也很難把視覺里面跟動(dòng)作強(qiáng)相關(guān)的細(xì)節(jié)比如物體邊緣的深度線索提出來。投影層的作用是把視覺token映射到LLM的embedding空間。這里有一個(gè)容易被忽視的細(xì)節(jié)投影層參數(shù)量不大但它決定了視覺信息以怎樣的“語言形式”進(jìn)入LLM。如果投影層訓(xùn)練不充分視覺token在LLM看來就是一堆亂碼。所以論文里普遍的做法是在正式指令微調(diào)之前先做一個(gè)階段性的跨模態(tài)預(yù)訓(xùn)練讓投影層和視覺編碼器適應(yīng)動(dòng)作token的表征方式。LLM主干承擔(dān)的是跨模態(tài)推理職責(zé)。它不直接輸出動(dòng)作而是把“視覺上下文歷史狀態(tài)”融合成隱狀態(tài)再用這個(gè)隱狀態(tài)去預(yù)測(cè)動(dòng)作token的分布。訓(xùn)練時(shí)的loss通常包括兩部分一部分是語言/推理目標(biāo)的交叉熵另一部分是對(duì)動(dòng)作token預(yù)測(cè)的交叉熵。但要注意動(dòng)作token預(yù)測(cè)的權(quán)重不宜過大否則模型會(huì)把所有容量都用在動(dòng)作映射上語言理解能力會(huì)退化。在推理階段模型接收最近N幀觀測(cè)圖像作為上下文自回歸地生成一串潛在動(dòng)作token然后通過動(dòng)作解碼器把它們還原成真實(shí)世界的動(dòng)作序列。這里的上下文窗口設(shè)計(jì)也很有講究窗口太短模型看不到運(yùn)動(dòng)趨勢(shì)窗口太長(zhǎng)則容易把無關(guān)的歷史信息帶進(jìn)來而且推理延遲會(huì)顯著上升。2.3 一套最小訓(xùn)練流程的偽代碼為了把上面的抽象描述變成更可操作的東西我寫一段簡(jiǎn)化的偽代碼模擬從數(shù)據(jù)準(zhǔn)備到訓(xùn)練再到推理的完整流程。這段代碼不針對(duì)某個(gè)具體框架只用來表示關(guān)鍵步驟之間的依賴關(guān)系方便大家對(duì)照自己的項(xiàng)目理解。# 假設(shè)已有 # - demo_data: List[Dict]包含image_frames (T, H, W, 3) 和 actions (T, A) # - action_encoder: VAE模型含 encode() 和 decode() 方法 # - visual_encoder: 預(yù)訓(xùn)練視覺Transformer # - projector: MLP投影層把視覺token映射為llm embedding # - llm: 預(yù)訓(xùn)練語言模型 # - action_decoder: 與action_encoder配套 def prepare_instruction_samples(demo_data): samples [] for demo in demo_data: images demo[image_frames] actions demo[actions] # (T, A) latent_tokens action_encoder.encode(actions) # (T, L) for t in range(3, T): ctx_images images[t-3:t] # 取歷史N幀 target_tokens latent_tokens[t] sample { images: ctx_images, input_ids: tokenize(根據(jù)觀測(cè)輸出動(dòng)作), labels: target_tokens, } samples.append(sample) return samples def train_one_step(batch): img_feats [visual_encoder(img) for img in batch[images]] img_feats projector(torch.stack(img_feats)) # (B, N, D) txt_feats llm.embed(batch[input_ids]) fused llm.forward(inputs_embedstxt_feats img_feats) logits llm.lm_head(fused.hidden_states) loss cross_entropy(logits, batch[labels]) return loss def inference(obs_images, action_decoder): ctx projector(visual_encoder(obs_images)) pred_tokens llm.generate(inputs_embedsctx, max_new_tokens8) real_action action_decoder.decode(pred_tokens) return real_action這里我把目標(biāo)token設(shè)計(jì)成單獨(dú)的時(shí)間片實(shí)際論文里可能會(huì)采用更精細(xì)的因果掩碼和窗口關(guān)系但核心思想是一致的模型看到的上下文是“視覺幀動(dòng)作token的歷史”預(yù)測(cè)目標(biāo)是“下一個(gè)動(dòng)作token”。訓(xùn)練對(duì)象不再是一個(gè)孤立的動(dòng)作回歸任務(wù)而是被嵌在指令模板里的多模態(tài)生成任務(wù)。3. 實(shí)驗(yàn)上最值得關(guān)注的三個(gè)維度3.1 零樣本遷移與少樣本拿捏這類論文最看重的一個(gè)指標(biāo)是模型在訓(xùn)練時(shí)沒見過的環(huán)境里表現(xiàn)如何。比如只在仿真桌面場(chǎng)景上做視覺-動(dòng)作指令微調(diào)然后直接拿到真實(shí)機(jī)械臂平臺(tái)上測(cè)試抓取成功率。這里的“零樣本”不是指模型憑空學(xué)會(huì)抓取而是指它能把訓(xùn)練中抽象出來的“看到什么就做什么”映射規(guī)律遷移到新背景、新物體、新相機(jī)視角上。從標(biāo)題語義和摘要描述來看LLARVA強(qiáng)調(diào)性能提升的關(guān)鍵是“指令微調(diào)”本身。也就是說同樣的骨干網(wǎng)絡(luò)如果只是做視覺特征提取動(dòng)作頭回歸跟在指令模板里把視覺和動(dòng)作token統(tǒng)一建模相比后者的遷移成功率會(huì)有明顯領(lǐng)先。原因在于指令微調(diào)強(qiáng)制模型把視覺表征和動(dòng)作語義綁定在一個(gè)上下文里模型學(xué)到的不是孤立特征而是“視覺-動(dòng)作配對(duì)”的條件分布。少樣本場(chǎng)景也值得關(guān)注。現(xiàn)實(shí)項(xiàng)目里不可能為每一個(gè)新物體都采集幾百條演示所以論文實(shí)驗(yàn)如果展示了“在新任務(wù)上只給8~16條演示就能快速適應(yīng)”那說明它的表征結(jié)構(gòu)更適合被新任務(wù)擴(kuò)展。這個(gè)特性我認(rèn)為來源于它把動(dòng)作離散化、語義化之后模型可以利用語言模型強(qiáng)大的模式記憶能力而不是從零擬合一個(gè)動(dòng)作流形。3.2 動(dòng)作token化的粒度與重建誤差讀這類論文不能只看最終成功率還要看動(dòng)作編碼器的信息瓶頸設(shè)置在什么位置。動(dòng)作編碼過程像一個(gè)壓縮過程壓縮率越高模型預(yù)測(cè)越容易但丟掉的動(dòng)作細(xì)節(jié)也越多。比如一個(gè)小小的夾爪閉合動(dòng)作可能只占潛在空間里很細(xì)微的一個(gè)維度如果壓縮后這個(gè)維度被合并到其他動(dòng)作里重建出來的動(dòng)作就是“意思對(duì)了但差了那么一點(diǎn)”。公開研究里這種潛在動(dòng)作表示通常會(huì)做一個(gè)重建誤差表對(duì)比不同碼本大小、不同潛在維度下的Mean Squared Error。我最關(guān)心的是在高頻動(dòng)作比如快速插拔、抖動(dòng)、轉(zhuǎn)向上重建誤差是不是顯著大于低速穩(wěn)定動(dòng)作。如果誤差分布不均衡模型可能會(huì)系統(tǒng)性地學(xué)丟那些“關(guān)鍵時(shí)刻的小動(dòng)作”導(dǎo)致任務(wù)失敗。讀實(shí)驗(yàn)部分時(shí)我建議重點(diǎn)關(guān)注這個(gè)誤差表而不是只盯著平均成功率。3.3 泛化到“看不見的組合”的能力機(jī)器人學(xué)習(xí)領(lǐng)域有個(gè)常見陷阱模型在訓(xùn)練環(huán)境里跑得飛起但換一個(gè)光照條件、換一個(gè)同款但不同顏色的物體性能就斷崖式下跌。這背后的原因是模型學(xué)到了背景特征和物體外表的捷徑而不是真正理解“夾爪接近物體表面時(shí)應(yīng)該張開到什么程度”這種物理關(guān)系。視覺-動(dòng)作指令微調(diào)的作用就是把這些物理關(guān)系更直接地暴露在訓(xùn)練目標(biāo)中。因?yàn)槟P捅仨氃谝曈Xtoken和動(dòng)作token之間建立顯式依賴它很難繞過視覺信息直接記憶動(dòng)作。如果論文的實(shí)驗(yàn)里設(shè)計(jì)了“訓(xùn)練時(shí)只出現(xiàn)紅色方塊測(cè)試時(shí)換成綠色方塊”“訓(xùn)練時(shí)機(jī)械臂在左臂位測(cè)試時(shí)在右臂位”這類組合那確實(shí)能說明指令微調(diào)帶來的泛化收益是結(jié)構(gòu)性的而不是數(shù)據(jù)集本身的紅利。4. 如果我要復(fù)現(xiàn)這個(gè)思路我會(huì)怎么做4.1 從最短路徑開始先做一個(gè)單任務(wù)demo很多人拿到這類論文第一反應(yīng)是“我要完整復(fù)現(xiàn)它的模型結(jié)構(gòu)”。我的建議正好相反先不要碰復(fù)雜的模型架構(gòu)而是把你自己的模仿學(xué)習(xí)數(shù)據(jù)集重新打包成“視覺-動(dòng)作指令對(duì)”的格式然后在一個(gè)很小的模型上做一次指令微調(diào)實(shí)驗(yàn)。具體分三步第一步數(shù)據(jù)清洗。把演示數(shù)據(jù)中時(shí)間戳對(duì)齊、剔除停滯和抖動(dòng)片段。這個(gè)工作在傳統(tǒng)模仿學(xué)習(xí)里也是必須的但在指令微調(diào)范式下格外重要。因?yàn)橹噶钗⒄{(diào)會(huì)把動(dòng)作序列離散成token如果某一段動(dòng)作明顯抖動(dòng)token化之后會(huì)變成一堆互斥的離散選擇模型無所適從。第二步訓(xùn)練一個(gè)最小的動(dòng)作Token編碼器。用你任務(wù)里最常見的幾類動(dòng)作片段比如平移、旋轉(zhuǎn)、抓取、放置訓(xùn)練一個(gè)小的VAE。不用一開始就追求高精度重建只要重建后的動(dòng)作能讓機(jī)械臂在仿真里執(zhí)行成功率達(dá)到60%左右就可以先拿去做指令微調(diào)實(shí)驗(yàn)。第三步跑一個(gè)消融對(duì)比。同一份數(shù)據(jù)、同一個(gè)基礎(chǔ)模型A組用傳統(tǒng)“圖像特征動(dòng)作回歸頭”B組用視覺-動(dòng)作指令微調(diào)。你會(huì)發(fā)現(xiàn)B組的訓(xùn)練收斂速度可能略慢一些因?yàn)樵诔跗谝曈X和動(dòng)作token之間的對(duì)齊關(guān)系還沒建立好但只要過了某個(gè)門檻它在新場(chǎng)景上的表現(xiàn)會(huì)穩(wěn)定超出一截。這個(gè)過程本質(zhì)上是為了驗(yàn)證“這個(gè)方法到底適不適合你的數(shù)據(jù)分布”而不是直接復(fù)現(xiàn)一個(gè)論文里的SOTA數(shù)字。我實(shí)驗(yàn)下來最值得復(fù)現(xiàn)的其實(shí)是這種“用指令模板把動(dòng)作語義化”的思路而不是具體的網(wǎng)絡(luò)維度。4.2 數(shù)據(jù)組織與超參選擇的經(jīng)驗(yàn)參考在數(shù)據(jù)組織上有一個(gè)細(xì)節(jié)容易踩坑圖像幀和動(dòng)作token之間的對(duì)應(yīng)關(guān)系要非常嚴(yán)格。動(dòng)作token的粒度決定了多少個(gè)動(dòng)作step對(duì)應(yīng)一個(gè)token。如果你把連續(xù)5個(gè)step編碼成一個(gè)token那推理時(shí)模型只能每5個(gè)step輸出一個(gè)動(dòng)作中間的動(dòng)作要靠解碼器線性插值補(bǔ)上。這個(gè)問題在低速精細(xì)操作時(shí)很致命。我建議的動(dòng)作token粒度是先把一段軌跡按時(shí)間均勻切片讓每個(gè)token覆蓋3到5幀前提是你的控制頻率足夠高比如30Hz以上。如果控制頻率太低就不要過度壓縮寧可讓token序列長(zhǎng)一點(diǎn)也要保證重建精度。超參方面有幾個(gè)我實(shí)測(cè)后比較靠譜的參考值超參數(shù)建議范圍個(gè)人心得上下文圖像幀數(shù)4~8幀太少看不到運(yùn)動(dòng)趨勢(shì)太多主要增加推理延遲視覺編碼器狀態(tài)部分解凍或LoRA適配完全凍結(jié)容易導(dǎo)致視覺特征與動(dòng)作語義脫節(jié)動(dòng)作token潛在維度16~64維維度太低動(dòng)作細(xì)節(jié)丟失明顯指令微調(diào)輪數(shù)2~4個(gè)epoch再多容易過擬合到數(shù)據(jù)集的軌跡模式訓(xùn)練batch size視計(jì)算資源而定小batch下先保證梯度穩(wěn)定此外有一點(diǎn)容易被忽略推理時(shí)的動(dòng)作平滑。即使模型預(yù)測(cè)的潛在動(dòng)作token在語義空間是連續(xù)的解碼到真實(shí)世界坐標(biāo)系后依然可能出現(xiàn)相鄰動(dòng)作之間的小幅跳變。通常需要加一個(gè)低通濾波或者指數(shù)移動(dòng)平均代價(jià)是會(huì)讓動(dòng)作延遲一點(diǎn)點(diǎn)但能顯著提升實(shí)機(jī)部署的穩(wěn)定性。4.3 計(jì)算資源不夠時(shí)的替代方案如果手頭沒有A100這類大顯存顯卡也不是不能跑??梢韵劝岩曈X編碼器凍結(jié)用LoRA微調(diào)投影層并且把語言模型換成最小號(hào)的開源模型甚至用中等規(guī)模的多模態(tài)模型。這時(shí)候模型的絕對(duì)性能不會(huì)太高但你依然可以驗(yàn)證一個(gè)核心問題視覺-動(dòng)作指令微調(diào)這個(gè)數(shù)據(jù)組織方式是否比傳統(tǒng)的獨(dú)立動(dòng)作頭更好。我自己的經(jīng)驗(yàn)是用大約50~100條示教數(shù)據(jù)在單張消費(fèi)級(jí)顯卡上花半小時(shí)訓(xùn)練一個(gè)最小demo就足以觀察到明顯的表征優(yōu)勢(shì)。因?yàn)橹噶钗⒄{(diào)成功與否很大程度上取決于數(shù)據(jù)的組織邏輯而不是模型的絕對(duì)規(guī)模。5. 實(shí)操中常見的坑與排查實(shí)錄5.1 兩個(gè)模態(tài)“雞同鴨講”loss下降緩慢這個(gè)坑我遇到過很多次?,F(xiàn)象很典型loss降得非常慢或者降到某個(gè)值就下不去了視覺token和動(dòng)作token在模型看來好像各說各話完全無法融合。排查思路很簡(jiǎn)單第一步先查投影層輸出和文本embedding的分布是否在一個(gè)量級(jí)。如果視覺特征經(jīng)過投影后像素值波動(dòng)很大而文本embedding的分布很平滑那LLM根本沒法把兩者等權(quán)重地融合。另一個(gè)比較容易忽視的原因是視覺編碼器輸出token數(shù)量太多。一張384×384的圖通常輸出幾百個(gè)視覺token如果全部塞給LLM注意力基本被視覺token淹沒動(dòng)作token很難得到有效關(guān)注。通常需要做一個(gè)token合并或者采樣把視覺token數(shù)量壓縮到幾十個(gè)以內(nèi)讓動(dòng)作token在序列里占有合理的比例。5.2 動(dòng)作重建誤差很大預(yù)測(cè)再準(zhǔn)也是白搭我見過很多項(xiàng)目花了大量時(shí)間調(diào)指令微調(diào)模型最后發(fā)現(xiàn)瓶頸根本不在預(yù)測(cè)部分而是動(dòng)作編碼器重建動(dòng)作時(shí)就已經(jīng)變形了。最典型的例子是模型預(yù)測(cè)的潛在動(dòng)作token明明很準(zhǔn)但解碼后的動(dòng)作速度曲線有明顯的“臺(tái)階感”不是平滑的軌跡。排查方法很簡(jiǎn)單從訓(xùn)練集里隨機(jī)抽一批動(dòng)作數(shù)據(jù)過一遍動(dòng)作編碼器解碼然后把重建動(dòng)作和原始動(dòng)作畫在同一張圖上逐個(gè)維度檢查誤差。如果發(fā)現(xiàn)某個(gè)維度比如手腕旋轉(zhuǎn)角度、夾爪開合度的誤差顯著大于其他維度不要急著調(diào)LLM先優(yōu)化VAE那邊的loss權(quán)重或者給那個(gè)維度單獨(dú)增加重建損失權(quán)重。5.3 模型在訓(xùn)練環(huán)境很猛換一個(gè)背景就崩這個(gè)問題可以追溯到視覺編碼器過擬合到背景特征。解決方法有兩個(gè)方向。第一個(gè)方向是在數(shù)據(jù)組織階段做視覺擾動(dòng)比如隨機(jī)改變亮度、隨機(jī)裁剪、隨機(jī)遮擋讓模型必須依靠物體本身的幾何特征而不是背景色塊來做動(dòng)作決策。第二個(gè)方向是在指令微調(diào)階段刻意在部分樣本里把物體和背景做組合重組比如仿真渲染的時(shí)候隨機(jī)換桌面紋理強(qiáng)迫模型把視覺特征和動(dòng)作邏輯解耦。如果條件不允許重新生成數(shù)據(jù)可以用一種“注意力引導(dǎo)”的排查法把模型在某個(gè)樣本上的注意力圖拿出來看它在生成動(dòng)作token時(shí)注意力到底是集中在物體輪廓附近還是集中在背景某個(gè)角落。如果是后者那基本可以確定模型學(xué)了一個(gè)背景捷徑。5.4 推理延遲過高實(shí)機(jī)控制跟不上機(jī)器人控制對(duì)延遲極其敏感。如果模型自回歸生成動(dòng)作token太慢控制頻率跟不上整個(gè)策略就沒法部署。一個(gè)常見的優(yōu)化點(diǎn)是用“粗預(yù)測(cè)精修正”兩段式先讓模型以較快的速度生成一批低精度的動(dòng)作草圖token再在一個(gè)輕量解碼器里做高精度的局部修正。另一個(gè)優(yōu)化方向是緩存視覺特征。因?yàn)樵谝欢芜B續(xù)的任務(wù)里相鄰幾個(gè)控制周期之間的圖像變化通常不大不需要每幀都重新過一遍視覺編碼器。每10幀或者20幀更新一次視覺特征中間的時(shí)間步直接復(fù)用緩存配合動(dòng)作token的自回歸預(yù)測(cè)可以把端到端延遲壓到可接受范圍內(nèi)。6. 這個(gè)思路還能往外擴(kuò)展到哪里視覺-動(dòng)作指令微調(diào)這個(gè)思路不只是個(gè)“機(jī)械臂抓取任務(wù)專用”的小技巧。我個(gè)人的看法是它給了一類通用問題的解法當(dāng)一個(gè)高能力的多模態(tài)模型需要接入一個(gè)低維度的連續(xù)控制量時(shí)與其在模型外面加一堆任務(wù)頭不如先把控制量token化然后再用指令模板把它和觀測(cè)輸入一起“講給”模型聽。順著這個(gè)思路我可以想到幾個(gè)很有潛力的擴(kuò)展方向。第一個(gè)是操作多個(gè)機(jī)器人的協(xié)同任務(wù)把每個(gè)機(jī)械臂的動(dòng)作都編碼成獨(dú)立的token流模型可以交錯(cuò)預(yù)測(cè)兩臺(tái)機(jī)械臂的動(dòng)作。第二個(gè)是移動(dòng)機(jī)器人底盤的導(dǎo)航?jīng)Q策把線速度和角速度壓成潛在動(dòng)作token讓模型基于第一視角圖像預(yù)測(cè)下一步移動(dòng)。第三個(gè)是智能體的工具使用模擬把鼠標(biāo)移動(dòng)和點(diǎn)擊還原成token流讓模型通過閱讀屏幕截圖來控制光標(biāo)這其實(shí)和很多自動(dòng)化腳本項(xiàng)目的底層邏輯是相通的。我自己目前在一套桌面整理演示數(shù)據(jù)上嘗試了類似的做法最明顯的變化不是單次準(zhǔn)確率提升而是模型對(duì)“同樣場(chǎng)景不同起始位置”的適應(yīng)性變好了。以前動(dòng)作頭回歸出來的軌跡像是背答案現(xiàn)在更像是在“看情況做決策”。雖然離真正的通用機(jī)器人策略還很遠(yuǎn)但至少這條路踩上去是實(shí)的。讀這類論文我的建議是帶著“它改變了什么接口關(guān)系”這個(gè)問題去讀而不是只盯著準(zhǔn)確率數(shù)字。LLARVA這類視覺-動(dòng)作指令微調(diào)的核心其實(shí)就是把“視覺輸入到動(dòng)作輸出”這件事從一個(gè)回歸問題平移到了語言模型的token預(yù)測(cè)框架里。想通這一點(diǎn)剩下的網(wǎng)絡(luò)結(jié)構(gòu)和訓(xùn)練技巧都能按自己的資源條件做取舍。