微調性能趕不上提示工程怎么辦?Can Gradient Descent Simulate Prompting?——論文閱讀筆記

今天速讀一篇文章
Can Gradient Descent Simulate Prompting?

一句話總結

針對【新知識應用的場景里,FT效果往往追不上ICL】這個情況,作者引入MAML的思想↓
內圈讓模型學習新知識形成知識FT模型;
外圈通過最小化ICL和知識FT模型的KL散度,來引導模型逼近ICL的效果。

※ 備注1:ICL這里單指把知識召回到上下文當中,不考慮有沒有few-shot Example。
※ 備注2:作者把這個方法叫learn by condition, LC,實驗中會用到這個稱呼。
※ 備注2【新知識應用的場景里,FT效果往往追不上ICL】這個情況舉個常見的例子,如果RAG的知識索引和知識切片做的好,本地知識的回答正確率往往比在這些知識庫上Train過的模型高。

多說一句【新知識應用的場景里,為什么還要用FT?】

我選這篇讀確實是因為這個Setting有現實意義。
比如,在讓模型KnowHow的場景下,模型要學習大量的“在什么場景下應該作什么,應該怎么做”這樣的知識。如果這些知識的總量比較有限(場景比較靜態),那ICL就能做的很好。但如果場景非常非常多(你就想想自己看小紅書炒菜會出多少種跟圖文攻略不一樣的情況,就能體會了),把所有這些知識都塞到上下文里就不如訓練更經濟了。
而且一些場景中(比如引導型對話),又很難把“場景”的索引建起來以便RAG——因為場景描述本身就是個非結構化知識描述,表征、文本分析法其實都比較難準確建立索引。

想通過訓練解決問題,但僅靠背誦一遍 【操作手冊】(formalize 在什么場景下應該作什么,應該怎么做的文檔),模型的執行性能是遠遠做不到和ICL相比的。

而且在實際工程開發中,其實存在兩個階段:
階段一是用提示工程和Agent體系來支持80%的場景,這個時候會積累一些非常精品的知識。
階段二是想辦法把剩下20%的場景也支持起來,這個時候ICL其實受限于場景的膨脹和模型的理解效率,已經無法維繼,必須轉向其他方案,而轉向其他方案時,如果不繼續利用前面開發的提示工程和Agent生產的數據,前面的開發成本又白花了。
所以能夠彌合這兩個階段的方案,其實非常適合實際場景應用。

整體步驟

  1. 內圈優化(Inner Loop)
    假裝微調:給模型θ\thetaθ看一條新知識ccc(如“Bob works at Best Buy”),讓它用一次梯度下降更新自己的參數,得到θ′\theta'θ

  2. 外圈優化(Outer Loop)
    訓練模型的“學習能力”

    • 拿BASE模型θ\thetaθ 和新知識 ccc 去回答問題 qqq(如“Does Bob work at an electronics store?”)得到答案 aaa
    • 拿內圈“假裝微調”后的模型θ′\theta'θ,計算這個目標↓

這個目標就是BASE模型 θ\thetaθ 給定新知識 ccc ,問題 qqq 的情況下生成答案 a^\hat{a}a^ 的概率和假裝微調模型 θ′\theta'θ,給定問題qqq,“生成” a^\hat{a}a^ 的概率的KL。(不是真生成,只是算logits)

  • 調整:根據這個KL,用梯度下降更新模型的初始參數θ\thetaθ

但以上理念性方案之外,作者對訓練的描述非常缺乏細節。除了,使用了LORA,超參 lr=1E-3和訓了1個epoch以外,其他的細節就沒啥了(比如,作者說對梯度進行了clip,那你clip的參數是多少呢?再比如,訓練的時候,學習知識的單步gradient怎么放訓練圖上?再比如,通過后面實驗可以看到,作者主實驗里的的內圈是每次一個知識的,但是外圈的batch_size是16個, 這是不是得固定好對應篇章的問題?種種,心累)

效果怎么樣

一定程度逼近了ICL,但差距還比較明顯

這個圖上橫軸對應的是訓練配置,柱子的顏色對應的是測試配置,橫軸上,BM是BASE Model,LC是作者的方法,LG是把BASE模型通過ICL生成的答案a^\hat{a}a^ 換成ground truth aaa,其他沒變。
注意圖上的字,中文是我寫的,主實驗你放張表怎么啦,能畫得這么不清楚,作者真的是……需要調整 _(|3」∠)_

效果上看,BASE模型+ICL在SQuAD上能達到87%(caption里寫是Accuracy……),BASE模型+純FT(就是普通的拿訓練集Finetune)就只能達到47.3%。而作者的方法LC(橙色柱子中間LC對應的哪個柱子)能達到58.6%,簡單說還是有所逼近但不夠看

內外圈的配置很關鍵,但作者沒說清楚

你就說,實驗配置有沒有必要寫到caption里去吧……

這個實驗表,其實就是比是不是用LORA就夠了。如果說純BASE模型+ICL是天花板的話:↓

※一個結果是:內外圈都用全參數微調外圈用了Rank=1的LORA(內圈還是全參數微調)的結果差不多,因為內圈實際上只參與外圈模型更新的gradient計算,但不參與更新,所以其實意思是這些知識和問題回答只要Rank=1就夠了?(我其實希望作者能展示更多實驗數據集上的結果)

※ 另一個結果是,內圈用隨機初始的LORA來更新,和內圈用訓練過的LORA來更新,后者效果好巨多。注意這里沒說Rank,正文里也沒有明說Inner的Rank是不是等于1(雖然按作者的實驗節奏是有可能是1 的,畢竟你這個LORA adapter從哪兒來的嘛),吊詭的是表的這一列(最后一列)上效果Gap最大,SQuAD 上能打到72% 但wiki只能達到38,即和Full差不多。而wiki 數據上的question其實是作者楞構造的,就是把一句話隨機楞拆成 三部分,比如 ↓

這樣其實真的挺楞的。無非打磨是續寫能力,跟背誦原知識差距不大。
這個SQuAD和wiki的Gap,往好了解釋,可以說是我參考的一篇論文觀點的印證 Instruction-tuned Language Models are Better Knowledge Learners 即 先訓QA后訓QA+Document對模型回答問題的能力有幫助。

往不好了解釋:這個Inner拿來的Adapter訓練得多深啊,不是上一個epoch訓完,已經見過一遍知識和QA的adapter吧?那訓練epoch數就不一樣了啊,算不算過擬合呢?

可能是難知識編輯的一種方案


上表中的表頭被我改了,當前arxiv版本中的表頭根本看不出是寫啥(作者你快改吧,加油干💪🏻)簡單來說,就是↓
※ 其一、作者發現有些Case(表的第一行)在普通FT前后,模型都答不對問題。在作者推薦的LC方法的內圈(我猜的)跑完之后,也是回答不正確的,但是LC外圈跑完之后就能回答對了。

※ 其二、有些Case就是普通FT訓練前后都回答不正確,但LC內圈跑完已經能回答了。
這里其實我有個疑問,普通FT的lr是多少啊,LC1e-3的lr模型其實啥都背的下來了,就只是對這個Q敏感不敏感的問題。

評價與感想

  1. 作者這篇工作特別像是把第0.5稿給丟到arxiv上了。實驗的setting,結果的描述等等都非常欠整理,代碼也沒有放,導致很多細節無法確定,應該后面會有更好的版本放出來的,對吧ヾ(?°?°?)ノ゙。
  2. 刨去論文寫作沒完工帶來的問題,這篇的setting和思路我都非常喜歡。前面說過了場景的價值,這里說思路。在LLM的學習過程中引入MAML的嘗試其實不止這篇論文一個,但是著眼于新知識學習的工作,我最近好像只看到這一個。而且就作者現在的setting而言,也應該可以擴展到Reasoning(雖然看ICLR25也有一個引入MAML做推理的,但是著眼點不太一樣,不在這里比較了)。
  3. 論文的機制分析非常非常不夠。就之前對Induction Head的研究而言,一些工作會認定模型的ICL能力和知識記憶能力來自于Transformer不同的Head。比如Cutting Off the Head Ends the Conflict: A Mechanism for Interpreting and Mitigating Knowledge Conflicts in Language Models 這篇文章提到模型上下文理解的頭和知識記憶的頭分別在不同的層,而且這兩者的作用強弱會影響“知識沖突”這一現象。

而今天我們討論的這篇文章的作者可以說是【把ICL頭當做Teacher,把記憶頭當做Student,做模型內的知識蒸餾】,那訓練完了之后,這些頭有什么變化?
另外,作者在LC方法能獨占優化的Case上也沒有分析,到底在外圈模型的什么變了導致模型能答對問題了?這些都需要解釋。
不過,往好處說,至少還可以再出兩篇續作,一篇講機制,一篇講訓練加速,是不是?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/914463.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/914463.shtml
英文地址,請注明出處:http://en.pswp.cn/news/914463.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

從“直覺搶答”到“深度思考”:大模型的“慢思考”革命,思維鏈、樹、圖如何讓AI越來越像人?

注:此文章內容均節選自充電了么創始人,CEO兼CTO陳敬雷老師的新書《GPT多模態大模型與AI Agent智能體》(跟我一起學人工智能)【陳敬雷編著】【清華大學出版社】 GPT多模態大模型與AI Agent智能體書籍本章配套視頻課程【陳敬雷】 文…

Android系統的問題分析筆記 - Android上的調試方式 debuggerd

debuggerd 是 Android 系統中的一個重要調試工具,主要用于生成進程崩潰時的核心轉儲(core dump)和調試信息(如堆棧跟蹤)。以下是關于 debuggerd 的詳細說明: 1. 基本功能 崩潰分析:當 Native 進…

python 雙下劃線開頭函數

在 Python 里,雙下劃線開頭的函數(準確地說是方法)有著特殊的用途和意義。下面為你詳細介紹相關內容: 1. 類的特殊方法(魔術方法) 以雙下劃線開頭和結尾的方法,被稱為特殊方法或者魔術方法&…

VyOS起步指南:用Docker快速搭建網絡實驗環境

文章目錄1. VyOS是什么?為什么選擇它?2. 五分鐘快速部署:Docker方案3. 進入容器:初探VyOS世界4. 核心操作:像開發者一樣思考5. 踩坑提醒:新手常見問題6. 結語:網絡即代碼的未來1. VyOS是什么&am…

動態規劃理論基礎,LeetCode 509. 斐波那契數 LeetCode 70. 爬樓梯 LeetCode 746. 使用最小花費爬樓梯

動態規劃理論基礎動態規劃,英文:Dynamic Programming,簡稱DP,如果某一問題有很多重疊子問題,使用動態規劃是最有效的。所以動態規劃中每一個狀態一定是由上一個狀態推導出來的,這一點就區分于貪心&#xff…

暑期自學嵌入式——Day02(C語言階段)

點關注不迷路喲。你的點贊、收藏,一鍵三連,是我持續更新的動力喲!!! 主頁: 一位搞嵌入式的 genius-CSDN博客https://blog.csdn.net/m0_73589512?spm1000.2115.3001.5343 目錄 Day02→數據類型&#xf…

如何單獨安裝設置包域名

前言 在 npm 中,直接通過 package-lock.json 無法單獨設置包的安裝地址,因為該文件是自動生成的依賴關系鎖定文件。但你可以通過以下方法間接實現: 一、在 package.json 中指定包來源(推薦) 在 package.json 的 depend…

存儲過程探秘:數據庫編程的藝術

文章目錄存儲過程語法格式BEGIN...END語句塊DECLARE(聲明局部變量)流控制語句if函數批處理操作測試2測試3存儲過程與函數的關系存儲過程 MYSQL的存儲過程是一組預處理的SQL語句,可以像函數一樣在數據庫中進行存儲和調用。 它們允許在數據庫…

非阻塞寫入核心:asyncio.StreamWriter 的流量控制與數據推送之道

在 asyncio 的異步編程框架中,如果說 asyncio.StreamReader 是你異步應用的數據輸入管道,那么 asyncio.StreamWriter 就是你異步應用的數據輸出管道。它是一個至關重要的組件,讓你能夠方便、高效且非阻塞地向連接的另一端(如 TCP …

控制臺打開mysql服務報錯解決辦法

控制臺打開mysql服務報錯解決辦法這個MySQL錯誤表示訪問被拒絕,通常是因為沒有提供正確的用戶名和密碼。以下是幾種解決方法: 方法1:指定用戶名和密碼連接 mysql -u root -p然后輸入root用戶的密碼。 方法2:如果忘記了root密碼&am…

Unsloth 實戰:DeepSeek-R1 模型高效微調指南(下篇)

食用指南 本系列因篇幅原因拆分為上下兩篇: 上篇以基礎環境搭建為主,介紹了 Unsloth 框架、基座模型下載、導入基座模型、數據集下載/加載/清洗、SwanLab 平臺賬號注冊。 下篇(本文)以實戰微調為主,介紹預訓練、全量…

Ubuntu安裝Jenkins

Ubuntu安裝Jenkins方法1:使用官方的Jenkins倉庫1. 添加Jenkins倉庫2. 更新軟件包列表3. 安裝Jenkins4. 啟動Jenkins服務5. 設置Jenkins開機啟動6. 查找初始管理員密碼7. 訪問Jenkins方法2:使用Snap包(適用于較新的Ubuntu版本)1. 安…

ubuntu22.04下配置qt5.15.17開發環境

自從qt5.15版本開始,不再提供免費的離線安裝包,只能通過源碼自行編譯。剛好最近需要在ubuntu22.04下配置qt開發環境,于是寫篇文章記錄配置的過程。 其實一開始是想配置qt5.15.2的,但是在編譯配置參數這一步驟中出現如下報錯 em…

S7-1200 與 S7-300 CPS7-400 CP UDP 通信 Step7 項目編程

S7-1200 CPU 與S7-300 CP STEP7 UDP通信S7-1200 與 S7-300 CP 之間的以太網通信可以通過 UDP 協議來實現,使用的通信指令是在S7-1200 CPU 側調用通信-開放式用戶通信TSEND_C,TRCV_C指令或TCON,TDISCON,TUSEND,TURCV 指…

基于YOLOv11的無人機目標檢測實戰(Windows環境)

1. 環境搭建 1.1 硬件與操作系統 操作系統:Windows 11 CPU:Intel i7-9700 GPU:NVIDIA RTX 2080(8GB顯存) 1.2 安裝CUDA和cuDNN 由于YOLOv11依賴PyTorch的GPU加速,需要安裝CUDA和cuDNN: 安…

Spring Cloud分布式配置中心:架構設計與技術實踐

從單體到微服務:Spring Cloud 開篇與微服務設計 Spring Cloud服務注冊與發現:架構設計與技術實踐深度分析 在以往分享中,碼友們已經掌握了微服務的設計和注冊中心的設計,部分聰明的碼友已經察覺了,已經到了需要設計一個…

15.2 Common Criteria合規

目錄1. Common Criteria簡介1.1 CC評估要素1.2 CC與TF-A的關系2. TF-A的CC合規要求2.1 安全功能需求2.2 開發過程要求3. TF-A的CC合規實現3.1 關鍵安全機制3.2 開發流程控制4. CC認證實踐指南4.1 認證準備步驟4.2 典型挑戰與解決方案4.3 已認證案例參考5. 持續合規建議1. Commo…

【前端:Typst】--let關鍵字的用法

在 Typst 中,#let 命令是用于定義變量和函數的核心指令,其用法非常靈活。以下是詳細的用法說明和示例。 目錄 1.基礎變量定義 2.函數定義 3.默認參數 4.內容塊參數(Content Blocks) 5.遞歸函數 1.基礎變量定義 // 定義簡單…

Qt輪廓分析設計+算法+避坑

輪廓分析擬合方面我現在只考慮矩形擬合和圓形擬合細分的話,橢圓擬合,矩形擬合,最小外接矩形,最小外接圓。對于一張圖像可能有不同的圖形,不同的圓,不同的矩形,我需要對其進行篩選,也…

C++中STL六大組件List的簡單介紹

一、前言C非常重視效率&#xff0c;對效率有損失的代碼常常是能省則省。使用list要包含的頭文件是<list>&#xff0c;要包含頭文件就是#iinclude <list>&#xff0c;List肯定是一種鏈表&#xff0c;我們不妨回憶一下那種鏈表插入刪除效率最快也就是最簡單&#xff…