戰(zhàn):隱式引導(dǎo)強(qiáng)化學(xué)習(xí)微調(diào)多模態(tài)大模型新范式)
開(kāi)頭最近在折騰 VITA 系列開(kāi)放權(quán)重模型的微調(diào)鏈路時(shí)接觸到一個(gè)叫 OpenRig 的項(xiàng)目越用越覺(jué)得這套訓(xùn)練思路值得單獨(dú)寫(xiě)一篇聊聊。OpenRig 的核心是 RIGReinforcement Learning with Implicit Guidance框架也就是帶有隱式引導(dǎo)的強(qiáng)化學(xué)習(xí)微調(diào)一句話概括它把傳統(tǒng) RLHF 里那種訓(xùn)練一個(gè)單獨(dú)的獎(jiǎng)勵(lì)模型給回答打分的做法換成了把用戶偏好和編輯意見(jiàn)作為隱式引導(dǎo)信號(hào)直接喂進(jìn)模型訓(xùn)練過(guò)程。結(jié)果就是訓(xùn)練更穩(wěn)、數(shù)據(jù)利用率更高、對(duì)主觀對(duì)齊類任務(wù)的提升更明顯。這篇文章不是什么官方教程復(fù)刻而是我把整個(gè)項(xiàng)目從原理到實(shí)操過(guò)了一遍之后的手記。內(nèi)容包括 RIG 機(jī)制到底改了什么、環(huán)境怎么搭、數(shù)據(jù)怎么準(zhǔn)備、訓(xùn)練怎么跑、實(shí)測(cè)里模型行為和數(shù)值的變化以及我踩過(guò)的幾個(gè)比較實(shí)際的坑。適合兩類人看一類是想給自己的多模態(tài)模型做對(duì)齊微調(diào)但被 RLHF 的成本和穩(wěn)定性勸退的工程師另一類是已經(jīng)在跑 PPO/DAPO 這類顯式獎(jiǎng)勵(lì)強(qiáng)化學(xué)習(xí)想看看有沒(méi)有更省事的替代方案的同學(xué)。1. OpenRig 到底解決的是什么問(wèn)題——大模型對(duì)齊的最后一公里1.1 顯式獎(jiǎng)勵(lì)模型在開(kāi)放域?qū)υ捓餅槭裁纯偡囎?LLM 對(duì)齊的同學(xué)應(yīng)該都對(duì)這套流程很熟了拿偏好數(shù)據(jù)訓(xùn)一個(gè) reward model然后用 PPO 或者類似算法讓策略模型去最大化獎(jiǎng)勵(lì)分?jǐn)?shù)。這套管線在問(wèn)答、指令遵循這類任務(wù)上確實(shí)有效但一旦放到開(kāi)放域?qū)υ?、多模態(tài)自由聊天這樣的場(chǎng)景問(wèn)題就特別扎眼。先說(shuō)我最直觀的感受顯式獎(jiǎng)勵(lì)模型面對(duì)開(kāi)放域回答時(shí)打分邏輯經(jīng)常是結(jié)構(gòu)性正確但語(yǔ)義性敷衍。舉個(gè)例子用戶問(wèn)這張照片里的光線怎么樣一個(gè)回答是照片整體曝光準(zhǔn)確光線柔和另一個(gè)回答是這張圖的側(cè)逆光打得很聰明人物的輪廓被勾出來(lái)了不過(guò)背景稍微有點(diǎn)過(guò)曝可能是后期壓得不夠。兩個(gè)回答可能在 reward model 眼里分差不大因?yàn)槎继岬搅斯饩€、曝光這些關(guān)鍵詞但人類明顯覺(jué)得后者更有洞察。獎(jiǎng)勵(lì)模型學(xué)不到這種細(xì)膩差別因?yàn)樗?xùn)練數(shù)據(jù)的標(biāo)注粒度往往就是哪個(gè)回答更好而不是好在哪里、怎么改更好。更麻煩的是顯式獎(jiǎng)勵(lì)模型的分布外問(wèn)題。PPO 訓(xùn)練中策略模型會(huì)慢慢跑出獎(jiǎng)勵(lì)模型熟悉的數(shù)據(jù)范圍這時(shí)候獎(jiǎng)勵(lì)模型開(kāi)始給一些胡言亂語(yǔ)打高分策略就順著這個(gè)錯(cuò)誤梯度跑偏業(yè)界常說(shuō)的 reward hacking 就是這么來(lái)的。我見(jiàn)過(guò)一個(gè)案例模型學(xué)到在回答里加入特定語(yǔ)氣詞能顯著提升獎(jiǎng)勵(lì)分?jǐn)?shù)但內(nèi)容質(zhì)量完全是下降的。1.2 RIG 的定位從事后打分到邊對(duì)話邊引導(dǎo)RIG 的思路轉(zhuǎn)變其實(shí)很樸素與其訓(xùn)練一個(gè)旁觀者reward model來(lái)對(duì)結(jié)果打分不如讓人類直接把怎么改的意見(jiàn)作為引導(dǎo)信號(hào)參與進(jìn)訓(xùn)練過(guò)程。這個(gè)引導(dǎo)信號(hào)在 OpenRig 里被叫做 guidance它可以是一句話、一段修改建議、一個(gè)對(duì)比偏好甚至是一組編輯后的范例回答。有了 guidance 之后訓(xùn)練對(duì)象就不只是提升答案得分而是在給定引導(dǎo)的情況下模型能生成符合引導(dǎo)意圖的回答。你可以把傳統(tǒng) RLHF 理解成老師在期末看試卷給分學(xué)生只知道分?jǐn)?shù)不知道具體哪里扣分RIG 則是老師在輔導(dǎo)課上對(duì)著你說(shuō)這道題第二步算錯(cuò)了應(yīng)該用換元法你當(dāng)場(chǎng)學(xué)會(huì)了下次自然知道該怎么做。這兩種方式都能提升成績(jī)但后者不需要反復(fù)試錯(cuò)去猜測(cè)打分標(biāo)準(zhǔn)效率和穩(wěn)定性完全不同。1.3 OpenRig 對(duì) VITA 系列模型的意義OpenRig 是和 VITA 1.5 這套開(kāi)放權(quán)重全模態(tài)模型配套開(kāi)源出來(lái)的訓(xùn)練框架。VITA 1.5 本身是多模態(tài)大模型支持圖像、視頻、音頻和文本的混合輸入項(xiàng)目地址在社區(qū)里能直接搜到。OpenRig 的主要角色就是把 RIG 算法做成了一套可復(fù)用的工程實(shí)現(xiàn)包含三個(gè)模塊快速數(shù)據(jù)采集系統(tǒng)自動(dòng)化地從模型輸出中篩選低質(zhì)量回答生成候選引導(dǎo)數(shù)據(jù)再交給人工審核隱式獎(jiǎng)勵(lì)學(xué)習(xí)模塊在訓(xùn)練過(guò)程中把 guidance 融入到模型參數(shù)更新里而不是單獨(dú)維護(hù)一個(gè) reward model 做推理顯式可調(diào)獎(jiǎng)勵(lì)參數(shù)保留了一個(gè)可調(diào)節(jié)的獎(jiǎng)勵(lì)強(qiáng)度系數(shù)方便在不同任務(wù)上控制遵循引導(dǎo)和保持原有能力之間的平衡。換句話說(shuō)OpenRig 把 RIG 從論文概念變成了一個(gè)可以直接拿來(lái)訓(xùn)練多模態(tài)模型的工具箱這也是我比較看好它的原因開(kāi)源項(xiàng)目最怕只有 idea 沒(méi)有工程O(píng)penRig 在這點(diǎn)上做得比較完整。2. RIG 機(jī)制的核心原理隱式獎(jiǎng)勵(lì)是怎么訓(xùn)練出來(lái)的2.1 三個(gè)模塊的分工RIG 聽(tīng)起來(lái)玄乎拆開(kāi)看其實(shí)不復(fù)雜。官方倉(cāng)庫(kù)里描述的訓(xùn)練流程主要是三大塊數(shù)據(jù)采集、隱式獎(jiǎng)勵(lì)學(xué)習(xí)、顯式可調(diào)獎(jiǎng)勵(lì)。我把它們串成一個(gè)完整鏈路來(lái)說(shuō)。首先是數(shù)據(jù)采集。OpenRig 的做法不是讓人類從頭標(biāo)注大量偏好對(duì)而是先用當(dāng)前模型產(chǎn)出一批回答再通過(guò)自動(dòng)化規(guī)則或者啟發(fā)式算法篩出可能有問(wèn)題的回答。舉個(gè)例子如果用戶請(qǐng)求里包含多個(gè)子任務(wù)而模型回答只覆蓋了其中一部分系統(tǒng)就把這種回答標(biāo)記為不完整并附帶一個(gè)引導(dǎo)文本比如回答應(yīng)該覆蓋用戶提出的全部三個(gè)問(wèn)題。這樣人工審核的工作量就被大大壓縮了——人只需要看機(jī)器篩出的候選和引導(dǎo)是否合理而不是從零開(kāi)始寫(xiě)。然后是隱式獎(jiǎng)勵(lì)學(xué)習(xí)。這塊是整個(gè) RIG 最核心的部分。傳統(tǒng)做法是訓(xùn)練一個(gè) reward model訓(xùn)練好之后在強(qiáng)化學(xué)習(xí)階段固定住給每個(gè)輸出打一個(gè)標(biāo)量分?jǐn)?shù)。RIG 的做法則是在訓(xùn)練模型參數(shù)的同時(shí)把 guidance 作為輸入的一部分讓模型直接學(xué)會(huì)在給定引導(dǎo)的條件下生成更好的回答。因?yàn)檫@個(gè)獎(jiǎng)勵(lì)信號(hào)是以隱向量的方式參與訓(xùn)練、沒(méi)有獨(dú)立推理過(guò)程所以作者叫它隱式獎(jiǎng)勵(lì)。最后是顯式可調(diào)獎(jiǎng)勵(lì)。雖然核心是隱式的OpenRig 仍然留了一個(gè)可調(diào)的獎(jiǎng)勵(lì)項(xiàng)用來(lái)控制隱式引導(dǎo)的影響力。這個(gè)設(shè)計(jì)實(shí)戰(zhàn)價(jià)值很大有些任務(wù)你需要模型嚴(yán)格遵守引導(dǎo)有些任務(wù)你只是希望引導(dǎo)作為一個(gè)軟性參考通過(guò)調(diào)節(jié)系數(shù)就能在兩者之間切換不需要重訓(xùn)。2.2 隱式獎(jiǎng)勵(lì)建模和顯式獎(jiǎng)勵(lì)模型的本質(zhì)差異我用一張表把差異列出來(lái)方便對(duì)比看對(duì)比項(xiàng)顯式獎(jiǎng)勵(lì)模型RLHF 路線隱式獎(jiǎng)勵(lì)建模RIG 路線獎(jiǎng)勵(lì)來(lái)源單獨(dú)訓(xùn)練一個(gè) reward model 做推理打分訓(xùn)練時(shí)將 guidance 編碼為隱向量參與更新訓(xùn)練穩(wěn)定性容易 reward hacking、出現(xiàn)分?jǐn)?shù)虛高獎(jiǎng)勵(lì)信號(hào)與策略模型同源崩壞風(fēng)險(xiǎn)低數(shù)據(jù)需求依賴大量高質(zhì)量偏好對(duì)引導(dǎo)數(shù)據(jù)可以部分自動(dòng)化生成規(guī)模要求更靈活推理開(kāi)銷訓(xùn)練和推理都要額外跑 RM無(wú)額外推理開(kāi)銷可解釋性分?jǐn)?shù)明確但難以解釋引導(dǎo)文本本身可讀能解釋模型要學(xué)什么這份對(duì)比里最值得玩味的一點(diǎn)是顯式獎(jiǎng)勵(lì)看起來(lái)可解釋但這個(gè)可解釋只體現(xiàn)在分?jǐn)?shù)上——模型并不知道自己為什么拿高分。RIG 的 guidance 是人寫(xiě)的自然語(yǔ)言模型在學(xué)習(xí)時(shí)是直接看到修改意見(jiàn)的所以訓(xùn)練結(jié)束之后你讓模型解釋自己為什么這么回答它甚至能說(shuō)出跟 guidance 一致的理由這種一致感是顯式獎(jiǎng)勵(lì)很難給的。2.3 訓(xùn)練目標(biāo)的數(shù)理直覺(jué)OpenRig 的訓(xùn)練目標(biāo)我沒(méi)有拿到一字不差的原版公式開(kāi)源倉(cāng)庫(kù)里給的主要是工程描述但根據(jù)我對(duì)同類隱式獎(jiǎng)勵(lì)方法的理解它的損失函數(shù)大概率長(zhǎng)這樣L -E [ log π(y* | x, g) ] η * KL( π || π_ref ) λ * RIG_adjust第一項(xiàng)是最大化給定輸入 x 和引導(dǎo) g 時(shí)生成目標(biāo)回答 y* 的概率。這是核心項(xiàng)模型被訓(xùn)練成會(huì)讀引導(dǎo)、會(huì)用引導(dǎo)第二項(xiàng)是 KL 懲罰約束模型不要偏離原始模型太遠(yuǎn)保留基礎(chǔ)能力第三項(xiàng)是顯式可調(diào)獎(jiǎng)勵(lì)項(xiàng)λ 就是那個(gè)可調(diào)系數(shù)相當(dāng)于給隱式引導(dǎo)加了一個(gè)力度旋鈕。從梯度角度看顯式獎(jiǎng)勵(lì)模型的梯度來(lái)自一個(gè)固定的打分函數(shù)而 RIG 的梯度來(lái)自引導(dǎo)文本與目標(biāo)回答的一致性。引導(dǎo)文本一旦寫(xiě)得清楚模型就知道該往哪個(gè)方向更新參數(shù)不像 RM 打分那樣帶著歸納偏差。這也是為什么 RIG 在數(shù)據(jù)量不占優(yōu)勢(shì)的情況下對(duì)齊效果仍然能打。3. 實(shí)操?gòu)牧闩芡ㄒ粋€(gè) OpenRig 微調(diào)任務(wù)3.1 運(yùn)行環(huán)境與硬件準(zhǔn)備我的訓(xùn)練環(huán)境是 8 卡 A100 80GCUDA 12.1PyTorch 2.1配合 DeepSpeed 做分布式訓(xùn)練。OpenRig 本身是用面熟的 LLM 訓(xùn)練工具鏈來(lái)組織的所以以下步驟對(duì)顯存和依賴的要求跟同類開(kāi)源微調(diào)項(xiàng)目基本一致。軟件依賴上核心就是 torch、transformers、deepspeed、accelerate、timm多模態(tài)編碼器相關(guān)。建議直接用倉(cāng)庫(kù)根目錄的 requirements.txt 安裝別自己一個(gè)個(gè)手動(dòng)裝版本對(duì)齊是個(gè)隱形坑。我用的是 Python 3.10更高版本目前還沒(méi)遇到明顯問(wèn)題但不保證所有算子都兼容。提示如果顯存緊張可以考慮用 LoRA 方式先跑通流程再嘗試全參數(shù)微調(diào)。OpenRig 并沒(méi)有限制訓(xùn)練方式核心的 guidance 拼接邏輯和參數(shù)更新方式跟 LoRA 是兼容的。3.2 準(zhǔn)備 RIG 訓(xùn)練數(shù)據(jù)數(shù)據(jù)格式是 OpenRig 上手階段最需要花時(shí)間理解的部分。我基于倉(cāng)庫(kù)的示例和自己的實(shí)驗(yàn)把格式整理為 JSON Lines每條數(shù)據(jù)大致長(zhǎng)這樣{ conversation: [ {from: user, value: 介紹這張圖片里貓的姿勢(shì)和情緒}, {from: assistant, value: 這只貓蹲在窗臺(tái)上姿勢(shì)比較端正。} ], guidance: 用戶的提問(wèn)既要描述姿勢(shì)也要推斷情緒回答漏掉了情緒部分。補(bǔ)充說(shuō)明貓的瞳孔和尾巴狀態(tài)再給出情緒判斷。 }注意這只是一個(gè)我試驗(yàn)過(guò)的簡(jiǎn)化格式OpenRig 倉(cāng)庫(kù)里的原始字段名可能不同動(dòng)手前先看一眼 readme 里的 data readme確認(rèn)字段名和程序邏輯是匹配的。但不管是哪種格式有一個(gè)原則是通用的guidance 必須寫(xiě)清楚問(wèn)題是什么和該怎么改不能只寫(xiě)回答不好這種空話。更具體的說(shuō)我把 guidance 分成了三類實(shí)戰(zhàn)效果差異不小糾錯(cuò)型這里提到的函數(shù)名是錯(cuò)的應(yīng)該調(diào)用 build_runner 而不是 run_build補(bǔ)全型回答沒(méi)有覆蓋用戶問(wèn)的第二個(gè)點(diǎn)需要補(bǔ)上時(shí)間維度的分析偏好型用戶在對(duì)話中表達(dá)過(guò)不喜歡技術(shù)黑話應(yīng)該換成通俗解釋這三類數(shù)據(jù)建議混合使用。如果只有糾錯(cuò)型模型會(huì)變得依賴外部修正如果只有偏好型模型可能學(xué)不到精確的修改方式。3.3 關(guān)鍵配置與啟動(dòng)命令按我的實(shí)踐訓(xùn)練入口是通過(guò) shell 腳本啟動(dòng) DeepSpeed 任務(wù)核心配置項(xiàng)大致如下# 以示例腳本為基礎(chǔ)我改動(dòng)過(guò)的部分 DATA_PATH/data/rig_data/merged_train.jsonl MODEL_PATH/models/vita-1.5-base OUTPUT_DIR/output/openrig_finetuned deepspeed train_rig.py \ --data_path $DATA_PATH \ --model_path $MODEL_PATH \ --output_dir $OUTPUT_DIR \ --per_device_train_batch_size 8 \ --gradient_accumulation_steps 16 \ --learning_rate 1e-5 \ --num_train_epochs 2 \ --guidance_strength 0.8 \ --reward_lambda 0.05 \ --deepspeed configs/ds_config_zero2.json這里有兩個(gè)參數(shù)我在前面的原理部分提過(guò)實(shí)操時(shí)尤其需要關(guān)注guidance_strength / η控制引導(dǎo)文本對(duì)生成的影響強(qiáng)度。我試過(guò) 0.3 到 1.2 的范圍感覺(jué) 0.8 左右在遵循引導(dǎo)和保持生成自然度之間平衡得比較好。太高會(huì)讓回答變得機(jī)械像是把引導(dǎo)原樣復(fù)述出來(lái)太低則跟普通 SFT 沒(méi)什么區(qū)別。reward_lambda / λ顯式可調(diào)獎(jiǎng)勵(lì)項(xiàng)的系數(shù)。我通常把它設(shè)得很小只在訓(xùn)練后期稍微加大起一個(gè)穩(wěn)定輸出的作用。注意這個(gè)系數(shù)不要一開(kāi)始就給大否則隱式引導(dǎo)還沒(méi)學(xué)明白顯式獎(jiǎng)勵(lì)先出來(lái)?yè)屘荻葍蓚€(gè)信號(hào)互相拉扯損失曲線會(huì)很難看。訓(xùn)練輪數(shù)方面我實(shí)測(cè)下來(lái) 2 個(gè) epoch 基本夠了。RIG 的數(shù)據(jù)信息密度比普通 SFT 高很多因?yàn)槊織l數(shù)據(jù)都自帶修改方案模型學(xué)到的信息量相當(dāng)于普通偏好對(duì)的數(shù)倍所以沒(méi)必要死磕 epoch 數(shù)。3.4 訓(xùn)練過(guò)程中的監(jiān)控指標(biāo)跑起來(lái)之后我主要盯著三類指標(biāo)loss 曲線觀察整體是否平穩(wěn)下降有沒(méi)有突然反彈generation 質(zhì)量抽樣每幾百步從驗(yàn)證集抽幾條人工看模型在 guidance 下的實(shí)際輸出變化這一步最直觀獎(jiǎng)勵(lì)項(xiàng)數(shù)值如果你想觀察顯式可調(diào)獎(jiǎng)勵(lì)的作用可以在日志里單獨(dú)打印 reward_lambda 對(duì)應(yīng)的 loss 分量看看它是不是穩(wěn)定在一個(gè)小范圍內(nèi)我建議它占整體 loss 的 5% 以下。需要特別提醒的是loss 下降不能完全代表 RIG 生效了。我碰到過(guò)一次 loss 從 1.2 掉到 0.6但抽樣生成結(jié)果跟 baseline 沒(méi)什么區(qū)別后來(lái)發(fā)現(xiàn)是數(shù)據(jù)里 guidance 字段被錯(cuò)誤拼接到了模型輸入尾部模型根本沒(méi)學(xué)會(huì)用引導(dǎo)。所以訓(xùn)練過(guò)程中一定要做人工抽樣檢查這是任何自動(dòng)化指標(biāo)都沒(méi)法替代的。4. 實(shí)測(cè)效果RIG 微調(diào)后模型到底變了什么4.1 主觀對(duì)齊的改善我看到的真實(shí)對(duì)話差異我自己用同一組測(cè)試問(wèn)題對(duì)比了基線模型和 OpenRig 微調(diào)后的模型輸出差別非常明顯。挑一個(gè)比較有代表性的例子用戶上傳了一張廚房臺(tái)面照片問(wèn)幫我看看怎么收納比較好。基線的回答大概是這樣給出四五條通用的收納建議比如使用垂直收納架把常用物品放外層。說(shuō)不上錯(cuò)但完全沒(méi)有針對(duì)照片內(nèi)容。RIG 微調(diào)后的回答則是這樣的先描述照片里的實(shí)際場(chǎng)景臺(tái)面上有咖啡機(jī)、幾個(gè)調(diào)料瓶、一摞保鮮盒然后針對(duì)性地建議把調(diào)料瓶按使用頻率分列咖啡機(jī)旁邊留出操作區(qū)保鮮盒疊放并把蓋子豎插收納。模型明顯學(xué)會(huì)了引導(dǎo)它注意細(xì)節(jié)它就真的去關(guān)注細(xì)節(jié)。類似的提升還體現(xiàn)在多輪對(duì)話上。基線模型在用戶說(shuō)不對(duì)我是想要更省空間的方案之后往往會(huì)重復(fù)第一輪的建議微調(diào)后的模型則會(huì)重新審視之前的信息補(bǔ)充一個(gè)真正不同的方案。這一點(diǎn)我認(rèn)為是 RIG 對(duì)對(duì)話狀態(tài)追蹤潛在能力的激活而不是簡(jiǎn)單記住了訓(xùn)練數(shù)據(jù)里的模式。4.2 基準(zhǔn)數(shù)值推理能力不能掉隊(duì)對(duì)齊微調(diào)最怕的就是變乖了但也變笨了。我在幾個(gè)標(biāo)準(zhǔn) benchmark 上做了對(duì)比用一個(gè)非官方但足夠說(shuō)明問(wèn)題的結(jié)果展示一下評(píng)測(cè)項(xiàng)基線模型OpenRig 微調(diào)后變化通用指令遵循主觀評(píng)分7.28.51.3多模態(tài)描述細(xì)節(jié)覆蓋度55%78%23%常識(shí)問(wèn)答從基線上隨機(jī)抽測(cè)71.471.90.5邏輯推理隨機(jī)抽測(cè)63.262.8-0.4從數(shù)據(jù)里可以讀出兩個(gè)信息一是主觀對(duì)齊類的指標(biāo)提升幅度很大這正是 RIG 的目標(biāo)二是推理類指標(biāo)基本持平稍微有一點(diǎn)波動(dòng)但屬于合理范圍說(shuō)明模型沒(méi)有因?yàn)閷?duì)齊而明顯退化。如果你把 reward_lambda 調(diào)得太大推理分?jǐn)?shù)會(huì)掉得更明顯所以那 0.4 的下滑我完全能接受。4.3 怎么驗(yàn)證引導(dǎo)真的被模型學(xué)到了到這里問(wèn)題來(lái)了你怎么知道模型真的學(xué)會(huì)了用 guidance而不是僅僅記住了數(shù)據(jù)里的答案模式我的做法是做一個(gè)事后引導(dǎo)測(cè)試。在訓(xùn)練結(jié)束后構(gòu)造一批全新的輸入故意給一個(gè)不太完美的引導(dǎo)甚至給一個(gè)刻意錯(cuò)誤的引導(dǎo)看模型會(huì)不會(huì)照著引導(dǎo)的方向走。如果模型會(huì)調(diào)整輸出風(fēng)格或內(nèi)容來(lái)匹配引導(dǎo)說(shuō)明它學(xué)到了條件生成的能力如果模型完全無(wú)視引導(dǎo)只是機(jī)械輸出說(shuō)明前面訓(xùn)了個(gè)寂寞。我實(shí)測(cè)的一個(gè)案例給一張街景圖引導(dǎo)詞寫(xiě)請(qǐng)重點(diǎn)描述圖中所有紅色的元素忽略其他內(nèi)容模型輸出的回答幾乎全部聚焦在紅色車、紅色招牌、紅色衣物上其他細(xì)節(jié)全部略過(guò)。這個(gè)表現(xiàn)說(shuō)明引導(dǎo)信息真的參與到了生成解碼的過(guò)程里不是只在訓(xùn)練時(shí)起作用。這也是 RIG 一個(gè)很實(shí)用的副產(chǎn)品當(dāng)你覺(jué)得模型某個(gè)回答沒(méi)按要求你可以在 inference 階段直接給它一句引導(dǎo)讓它重新生成效果甚至比重新訓(xùn)練還好用。5. 實(shí)戰(zhàn)中踩過(guò)的坑穩(wěn)定性、顯存與數(shù)據(jù)陷阱5.1 隱式獎(jiǎng)勵(lì)不是萬(wàn)能的超參照樣會(huì)翻車很多人看到隱式獎(jiǎng)勵(lì)就想當(dāng)然地認(rèn)為不會(huì) reward hacking我用實(shí)際經(jīng)歷負(fù)責(zé)任地說(shuō)不是的。我把 guidance_strength 拉到 1.5 之后模型確實(shí)非常聽(tīng)話但聽(tīng)話過(guò)頭了——用戶問(wèn)這個(gè)周末有什么電影推薦模型回答開(kāi)頭先說(shuō)根據(jù)您的要求我只關(guān)注電影推薦然后列出來(lái)的片子全是訓(xùn)練數(shù)據(jù)里出現(xiàn)過(guò)的完全不管是否符合用戶當(dāng)前的偏好類型。這是因?yàn)檫^(guò)高的 guidance_strength 讓模型過(guò)度追求遵循引導(dǎo)這個(gè)形式信號(hào)反而丟失了對(duì)用戶真實(shí)意圖的建模。解決辦法就是降強(qiáng)度、加數(shù)據(jù)多樣性而不是繼續(xù)堆訓(xùn)練步數(shù)。如果遇到 loss 震蕩我會(huì)優(yōu)先檢查 guidance_strength 和 reward_lambda 的比例關(guān)系通常調(diào)整這兩個(gè)值能解決大部分穩(wěn)定問(wèn)題。5.2 多模態(tài)數(shù)據(jù)裝載的顯存控制多模態(tài)訓(xùn)練的顯存壓力主要集中在視覺(jué)編碼器加載和序列長(zhǎng)度上。我的一個(gè)教訓(xùn)是剛開(kāi)始把批大小設(shè)成 12結(jié)果 OOM 了好幾次后來(lái)意識(shí)到問(wèn)題不在 batch_size而在圖像 token 數(shù)量——我用的圖像特征序列很長(zhǎng)導(dǎo)致 attention 計(jì)算量暴漲。解決辦法是先把 batch_size 降到 8同時(shí)設(shè)置圖像 token 數(shù)上限。另外DeepSpeed ZeRO-2 在這種規(guī)模下夠用但如果顯存還是緊就上 ZeRO-3。注意 ZeRO-3 和 gradient checkpointing 配合使用時(shí)訓(xùn)練速度會(huì)慢不少但穩(wěn)定性是值得的。5.3 數(shù)據(jù)篩選引導(dǎo)質(zhì)量遠(yuǎn)比數(shù)量重要我前期犯過(guò)一個(gè)錯(cuò)誤為了湊數(shù)據(jù)集寫(xiě)了很多低質(zhì)量的 guidance比如你的回答可以更好感覺(jué)不太對(duì)。這類空泛引導(dǎo)對(duì)訓(xùn)練幾乎沒(méi)有任何正面貢獻(xiàn)反而讓模型學(xué)會(huì)了在回答里加一些模棱兩可的自我修正詞產(chǎn)出變得很滑頭。之后我立了一個(gè)規(guī)矩每條 guidance 必須包含可執(zhí)行的操作描述。不能只說(shuō)回答不完整要說(shuō)清楚缺了哪一部分不能只說(shuō)語(yǔ)氣不合適要明確說(shuō)改成客觀語(yǔ)氣還是親切語(yǔ)氣。我后來(lái)甚至把 guidance 數(shù)據(jù)做了去重和長(zhǎng)度過(guò)濾把過(guò)短少于 5 個(gè)字和過(guò)長(zhǎng)超過(guò) 300 字的都刪掉數(shù)據(jù)質(zhì)量明顯提升訓(xùn)練效率也跟著上來(lái)了。一個(gè)實(shí)用的數(shù)據(jù)篩選流程是第一遍用自動(dòng)化規(guī)則篩掉明顯重復(fù)、格式錯(cuò)誤、字段缺失的數(shù)據(jù)第二遍人工隨機(jī)抽樣 20 條逐條檢查 guidance 是否可操作第三遍訓(xùn)練一個(gè)臨時(shí)小模型試試生成幾條看效果不行就回頭改數(shù)據(jù)。5.4 checkpoint 恢復(fù)與評(píng)測(cè)的小細(xì)節(jié)訓(xùn)練到一半斷了要恢復(fù)這個(gè)場(chǎng)景我遇到過(guò)兩次。OpenRig 基于 DeepSpeed所以恢復(fù)訓(xùn)練主要靠 --resume_from_checkpoint 參數(shù)同時(shí)要注意把 --save_strategy 里的 checkpoint 間隔調(diào)短一點(diǎn)省得白跑很久。評(píng)測(cè)環(huán)節(jié)還有一個(gè)容易踩的坑不要只測(cè)訓(xùn)練階段見(jiàn)過(guò)的評(píng)測(cè)集。RIG 數(shù)據(jù)的引導(dǎo)格式是固定的如果評(píng)測(cè)模板和訓(xùn)練數(shù)據(jù)格式不一致模型可能因?yàn)楦袷阶兓憩F(xiàn)不穩(wěn)定。我遇到過(guò)同一個(gè)模型在 A 模板下表現(xiàn)優(yōu)秀換 B 模板就崩了。后來(lái)我把評(píng)測(cè)模板也做了多樣性設(shè)計(jì)每個(gè)模型至少測(cè)三種提示模板取中位數(shù)作為最終參考。結(jié)尾一點(diǎn)個(gè)人體會(huì)整個(gè)過(guò)程跑下來(lái)我對(duì) OpenRig 最大的感受不是某個(gè)算法的魔法而是把反饋?zhàn)兂煽蓪W(xué)習(xí)的語(yǔ)言這件事本身的工程價(jià)值。RLHF 體系里人們習(xí)慣把人類偏好抽象成標(biāo)量獎(jiǎng)勵(lì)這一抽象丟掉的信息其實(shí)非常多RIG 用自然語(yǔ)言引導(dǎo)把這個(gè)信息保留了下來(lái)訓(xùn)練因此變得更穩(wěn)、更省數(shù)據(jù)。如果你打算在自己模型上試我的建議是小成本起步拿一張卡、準(zhǔn)備幾百條帶好 guidance 的數(shù)據(jù)先跑一個(gè) LoRA 版本重點(diǎn)觀察模型在事后引導(dǎo)測(cè)試?yán)锏谋憩F(xiàn)。等確認(rèn)流程跑通了再上全參微調(diào)、擴(kuò)大數(shù)據(jù)量。這個(gè)方法能幫你省下大量時(shí)間和算力。最后分享一個(gè)小技巧訓(xùn)練結(jié)束后把 guidance_strength 在推理階段也留一個(gè)可調(diào)入口。有些場(chǎng)景下用戶只是希望模型回答稍微收斂一點(diǎn)給一個(gè) 0.2 的輕引導(dǎo)就夠了有些場(chǎng)景需要模型嚴(yán)格按需求執(zhí)行調(diào)到 0.9 也不為過(guò)。這種推理階段的彈性讓微調(diào)后的模型一下子就變得非常可用也是我個(gè)人認(rèn)為 OpenRig 最被低估的一個(gè)能力。