選單

黑箱最佳化:大規模語言模型的一種落地方式

機器之心經授權轉載

作者:

孫天祥

在本文中,來自復旦大學的計算機博士生介紹了一些關於大規模預訓練語言模型落地的思考。

語言模型的增長

在 BERT 之後,人們看到了大規模預訓練的潛力,嘗試了不同的預訓練任務、模型架構、訓練策略等等,在做這些探索之外,一個更加直接也通常更加有效的方向就是繼續增大資料量和模型容量來向上探測這一模式的上界。

超大規模語言模型印象裡大概從 GPT-3 開始,國內外諸多大廠都開始了大規模預訓練的軍備競賽,Google 的 Switch-Transformer,國內智源的 CPM,百度的 ERNIE 3。0,華為的盤古,阿里的 PLUG,浪潮的源 1。0 等等。與此同時,相信也有很多人開始思考,花了幾個億訓練的大模型該怎麼用,難道就聽個響嗎?

大模型的玩法

在語言模型還不這麼大的時候,一般是這麼玩的:0。 下載某個開源的預訓練模型或自研預訓練模型,1。 收集特定任務的標註資料,2。 Fine-tune 預訓練語言模型,3。 上線推理。這種玩法我們叫小模型的玩法。

但大模型的預訓練成本和 Fine-tuning 成本都是比較昂貴的,並且現在很多大模型出於成本和商業考慮都不再開源引數,因此大模型得有大模型的玩法。作為大模型的開路先鋒,GPT-3 在他們的論文裡給出的玩法就是 in-context learning。 如下圖所示,不需要進行反向傳播,僅需要把少量標註樣本放在輸入文字的上下文中即可誘導 GPT-3 輸出答案。

黑箱最佳化:大規模語言模型的一種落地方式

GPT-3 in-context learning

這一玩法在當時是相當驚豔的,大家被 GPT-3 的這種玩法以及大規模預訓練帶來的 “質變” 感到震驚的同時,OpenAI 也開始了對大模型商業落地的嘗試,開始開放 GPT-3 的推理 API 給開發者,出現了不少有趣的 APP,下面是其中一個例子,更多的 GPT-3 Demo 可以參見:300+ GPT-3 Examples, Demos, Apps, Showcase, and NLP Use-cases | GPT-3 Demo。(https://gpt3demo。com/)

黑箱最佳化:大規模語言模型的一種落地方式

使用 GPT-3 生成網頁佈局

類似的,悟道 2。0 也開展了 AI 創新應用大賽來鼓勵基於大模型 API 開發好玩的 APP:https://www。biendata。xyz/wudao/。

而這一玩法後來也被髮展成為如今大火的 prompt-based learning,即我們可以將下游任務轉化為(M)LM 任務來直接用預訓練語言模型解決,倘若模型規模越大從(M)LM 遷移到下游任務就越容易,那我們就可以用一個大規模通用語言模型來解決各種下游任務了。

由此來看,Prompt-based learning 起初的想法是很好的,但後來發展成為魔改輸入輸出後的加強版 fine-tuning,配以 MLM head 更好的初始化主攻小樣本效能個人以為偏離了其初心。但後來發展又與包括 Adapter 在內的 parameter-efficient tuning 的工作類似,僅 fine-tune 連續的 prompt 而保持語言模型引數不變,能夠做到 mixed-task inference,我覺得一定程度上又迴歸了原來的目標,即通用大模型的高效部署。然而,所有 in-context learning 之後的發展都需要梯度反向傳播,這至少損失了 in-context learning 一半的魅力。試想,未來大廠會僱傭一大批調參師傅來對使用者上傳的訓練資料進行 fine-tune 或者 prompt-tuning,甚至進行 template 和 verbalizer 的搜尋?使用者越多需要的調參師傅也越多,這不能規模化。

關於大模型的落地姿勢,除了 OpenAI 之外,國內也有類似的看法,比如智源的張宏江博士就表示:“未來,大模型會形成類似電網的智慧基礎平臺,像發電廠一樣為全社會源源不斷地供應‘智力源’”。這種把大模型作為一個線上的服務的模式我們稱之為 Language-Model-as-a-Service (LMaaS)。

可以看到,大模型的玩法更貼近個人使用者和小 B 開發者,透過呼叫大廠開放的 API,就可以使用少量標註資料得到還不錯的效果(這裡指 in-context learning)。相比於之前小模型的玩法,LMaaS 當然要能夠降低某一個或幾個環節的成本才能夠推行。我們粗略地從這幾個方面去對比一下本地訓練小模型的玩法和 LMaaS 的玩法:

預訓練模型:小模型玩法可以是免費的(直接用開源預訓練模型),而 LMaaS 需要支付一部分呼叫 API 的費用

資料標註:小模型需要的標註資料通常更多,因而標註成本更高

實際效能:對於複雜任務或對於有計算資源的使用者,本地訓練小模型通常能夠超過使用 prompt 來呼叫大模型 API 的效果;對於簡單任務或計算資源有限的使用者,直接使用大模型 API 可能效果更好

經過粗略地對比我們發現有呼叫大模型推理 API 需求的使用者主要是標註預算不高、處理簡單任務、計算資源有限的個人使用者或者小 B 開發者。那麼,假設未來大規模預訓練模型就是這樣一種玩法,怎麼使其更好地為更多的使用者提供服務呢?或者說,怎麼利用通用語言模型的推理 API 做好下游任務?再或者,怎麼設計一個推理 API 能夠惠及更多的下游任務?更進一步,大廠是否能夠釋出推理 API 的同時也釋出一輔助使用工具?這些問題構成了我們最近工作的主要動機。

黑箱最佳化:僅呼叫模型推理 API 完成常見語言理解任務

接下來我們提供一個適用於上述 LMaaS 場景的方案:Black-Box Tuning。

我們的文章標題叫 Black-Box Tuning for Language-Model-as-a-Service,又名 Forward is All You Need,又名 Make Zeroth Optimization Great Again,又名 Inference as Training

前面提到,LMaaS 是要把大模型當作發電廠,那自然不能給每家每戶都派一個調電(調參)師傅過去,最好是每家每戶能夠自己把電器(任務)管理好,發電廠(大模型服務方)只需要確保供應電力(算力),這才是規模化的玩法。

為了做到大模型的高效部署,我們可以訴諸於 parameter-efficient tuning,即只 fine-tune 少量引數,如 adapter 和 prompt tuning,但仍然需要調參師傅在服務端幫你 tuning。自然地,我們想到可以讓使用者根據推理 API 的返回結果自己最佳化 adapter 或 prompt,比如用無梯度最佳化(Derivative-Free Optimization)去最佳化這些 “少量” 的引數。基於這個樸素的想法,我們有了下面的一張願景圖:

黑箱最佳化:大規模語言模型的一種落地方式

LMaaS

但無梯度方法本質上還是基於搜尋的,即使對於 parameter-efficient tuning 也還是會有上萬的引數量需要最佳化(例如 prompt tuning 最佳化 20 個 token,每個 token 1024 維,總共是 20480 維),這讓非梯度最佳化很難做。

在非梯度最佳化中,如果要最佳化的目標函式原本維度很高,但只要本徵維度很小,我們就可以使用非梯度最佳化方法來做,一種方法就是透過 random embedding。 例如在下圖中,左邊的目標函式是二維的,但其函式值實際上只跟一個引數( [x_1] )相關,那麼我們就可以使用一個 random embedding 將要最佳化的引數對映到一低維子空間(如下圖右邊的 embedding 就是 [x_1=x_2] ),在這一子空間中進行最佳化便可以找到最優解 [x^*] 。

黑箱最佳化:大規模語言模型的一種落地方式

Random Embedding

幸運的是,最近的一些工作表明預訓練模型引數越多,其本徵維度反而越小。例如人們發現僅訓練 RoBERTa-large 的 200 + 個引數,然後映射回原本引數空間就可以達到 fine-tuning 90% 的效能[1],這就使得非梯度最佳化方法變得可行了。

有意思的是,過去非梯度最佳化方法不用於神經網路的引數最佳化是因為其引數太多,而僅用於調節少數超引數,現在隨著神經網路引數越來越多,梯度下降變得非常笨重,而非梯度最佳化方法反而正好可以拿來做。

基於以上,我們大概可以得知,結合 parameter-efficient tuning 和基於 random embedding 的非梯度最佳化演算法,就可以做到前文提到的使用推理 API 把下游任務做好(開除調參師傅)的願景。下面我們給出了 black-box tuning 的一個具體實現,比較懶,請大家讀 caption。

黑箱最佳化:大規模語言模型的一種落地方式

Black-Box Tuning

這樣我們發現,大模型服務方僅需要執行模型推理(即提供算力),任務效能的最佳化由使用者自己完成(即根據推理結果最佳化 prompt),這樣就不需要調參師傅了。此外,prompt 的最佳化幾乎是不耗費算力的,因此這一最佳化過程可以在任何終端裝置進行,根本不需要 GPU,所有算力需求集中在大模型服務端。此外,這種最佳化方式還解藕了最佳化過程和模型前向傳播的複雜度,原本的梯度下降中,反向傳播的時間和記憶體佔用與模型前向傳播成正比,隨著模型越來越大,最佳化也變得越來越昂貴;而 black-box tuning 的最佳化過程本身不耗費什麼時間和記憶體,且複雜度僅依賴於本徵維度 d 的大小,與前向傳播的複雜度無關。

(說了這麼多,效果還是最關鍵的,它得能 work,至少要比 manual prompt 和 in-context learning 好吧)於是,我們做了 true few-shot 的實驗,他竟然不僅 work 了,還比基於梯度的 prompt-tuning 和 fine-tuning 還要 work,請看下圖:

黑箱最佳化:大規模語言模型的一種落地方式

Forward is All You Need

結果就不做太多解讀了,畢竟我也還沒整明白。

但既然這條路走通了,可以想到很多有意思的方向可以繼續做,(出於本人畢業壓力,這裡還不能告訴你們,只能隨便說幾個)例如 inference as training:實際上我們的 black-box tuning 是可以和 fine-tuning 並存的,在 fine-tune 之後(調參師傅調完之後),你還可以一邊推理 - 一邊標註 - 一邊繼續最佳化你的 prompt,這樣就不用再麻煩調參師傅了;再有一個就是可以做一個 Pre-Trained Optimizer for Pre-Trained Language Models,也就是前面說的幾個問題裡的“大廠是否能夠釋出推理 API 的同時也釋出一輔助使用工具”。好了不能再說了,否則,我就成調參師傅了。

參考

Intrinsic Dimensionality Explains the Effectiveness of Language Model Fine-Tuning https://aclanthology。org/2021。acl-long。568。pdf