大模型的提示工程:提示是對程序的搜索 精華
Google 研究員 Fran?ois Chollet 是一位在機器學習和深度學習領域具有重要影響力的一線工程師。他以創建流行的開源機器學習庫 Keras 而聞名, 同時也是流行的機器學習實戰書籍《Deep Learning with Python (使用 Python 來深度學習)》 的作者。不久前他發表博文:“How I think about LLM prompt engineering (大模型的提示工程之我見)”,深入地探討了大模型提示工程。Chollet 從語言模型架構、學習機制和能力的演進來理解大模型的提示工程。他特別指出大模型實際上是一個 (向量) 程序數據庫,而且該數據庫是連續的和內插的,因而對大模型的提示是對其中某個程序(通過內插)來查詢,所以提示工程實際上是在向量程序空間內的搜索。提示學習是當今大模型應用的主要方式; 這樣的探討對于大模型理解和應用都是有益的。我們特將該內容編譯出來和各位客戶、合作伙伴朋友分享。
回溯:Word2Vec 的涌現詞算術
在 2013 年,谷歌的Mikolov 等人注意到了一些令人矚目的現象。
他們當時正在構建一個將詞匯中的單詞嵌入到向量空間的模型——這個問題在當時已經有著悠久的學術歷史,可以追溯到上世紀 80 年代。他們的模型使用了一種優化目標,旨在將單詞之間的相關關系轉化為嵌入空間中的距離關系:每個單詞被分配一個向量,這些向量被優化,使得經常一起出現的單詞的向量點積(余弦相似度)接近 1,而很少一起出現的單詞的向量點積接近 0。
他們發現,由此產生的嵌入空間不僅能夠捕捉語義相似性,還具有某種涌現學習的能力——它能夠進行“詞算術”,而這并不是它被訓練去做的事情。在空間中存在一個向量,當它加到任意一個表示男性的名詞上時,得到的點會接近于它的女性對應詞。比如:V(國王) - V(男人) + V(女人) = V(王后)。一個“性別向量”。非常酷!似乎有幾十個這樣的神奇向量——一個復數向量,一個將野生動物名稱轉化為其對應的寵物名稱的向量等等。
圖示:一個二維嵌入空間,使得將“狼”與“狗”鏈接的向量與將“虎”與“貓”鏈接的向量相同。
Word2Vec 和大語言模型:Hebbian 學習類比
時間快進十年——我們現在已經進入了大語言模型的時代。從表面上看,現代大語言模型與原始的 word2vec 模型似乎完全不同。它們能夠生成流暢的語言——這是 word2vec 完全無法做到的——并且似乎對任何話題都有一定的了解。然而,它們實際上與古老的 word2vec 有很多共同之處。
兩者都是關于將 token(單詞或子詞)嵌入到向量空間中。兩者都依賴于相同的基本原理來學習這個空間:一起出現的 token 在嵌入空間中會更接近。用于比較 token 的距離函數在兩種情況下是相同的:余弦距離。甚至嵌入空間的維度也相似:大約在 10e3 或 10e4 的數量級上。
你可能會問——等等,我被告知大語言模型是自回歸模型,通過基于之前的單詞序列預測下一個單詞來進行訓練。這與 word2vec 最大化共存 token 點積的目標有什么關系呢?
實際上,大語言模型似乎確實將相關的 token 編碼在相近的位置,所以兩者之間一定存在某種聯系。答案是自注意力機制。
自注意力是 Transformer 架構中最重要的組成部分。它是一種通過線性組合先前空間中的 token 嵌入來學習新的 token 嵌入空間的機制,這種組合會給已經“更接近”的 token(即點積更高的 token)更大的權重。它會傾向于將已經接近的向量拉得更近——隨著時間的推移,相關關系會轉化為嵌入空間中的接近關系(以余弦距離衡量)。Transformer 通過學習一系列逐步改進的嵌入空間來實現,每個空間都是基于對前一個空間的元素進行重新組合。
自我注意力是如何工作的:在這里,注意力分數是在“站”和序列中的所有其他單詞之間計算的,然后它們被用來加權成為新的“站”向量的詞向量的總和。
自注意力賦予了 Transformer 兩個關鍵屬性:
1. 它們學習的嵌入空間在語義上是連續的,即在嵌入空間中移動一點只會使相應 token 的語義稍微改變一點。word2vec 空間也具有這個屬性。
2. 它們學習的嵌入空間在語義上是可插值的,即在嵌入空間中的兩個點之間取中間點會產生一個表示相應 token “中間含義”的點。這是因為每個新的嵌入空間都是通過在前一個空間的向量之間進行插值構建的。
請注意,這與大腦的學習方式非常相似。大腦中的關鍵學習原則是Hebbian 學習——簡而言之就是“一起激活的神經元會連接在一起”。神經激活事件之間的相關關系(可能代表動作或感知輸入)轉化為大腦網絡中的距離關系,就像Transformer(和 word2vec)將相關關系轉化為向量距離關系一樣。兩者都是信息空間的映射。
從涌現詞算術到涌現向量程序
當然,word2vec 和大語言模型之間也存在顯著的差異。word2vec 并不是為生成文本而設計的。大語言模型要大得多,能夠編碼復雜得多的變換。問題是,word2vec 確實是一個玩具模型:它之于語言建模,就像對 MNIST 圖像像素進行邏輯回歸之于最先進的計算機視覺模型一樣。基本原理大致相同,但玩具模型缺乏任何有意義的表示能力。word2vec 甚至不是一個深度神經網絡——它具有淺層、單層的架構。與此同時,大語言模型具有任何人訓練過的任何模型的最高表示能力——它們具有幾十個 Transformer 層,總共幾百層,參數數量達到數十億。
就像 word2vec 一樣,大語言模型通過將 token 組織到向量空間中來學習有用的語義函數。但由于表示能力的提高和更精細的自回歸優化目標,我們不再局限于像“性別向量”或“復數向量”這樣的線性變換。大語言模型可以存儲任意復雜的向量函數——實際上,將它們稱為向量程序比函數更準確。
word2vec 使你能夠進行一些基本操作,比如 plural(貓) → 貓們,或者 male_to_female(國王) → 女王。而大語言模型則可以進行純粹的魔法操作——比如 write_this_in_style_of_shakespeare(“...你的詩...”) → “...新詩...”。它們包含了數百萬這樣的程序。
大語言模型作為程序數據庫
你可以將大語言模型視為類似于數據庫:它存儲信息,你可以通過提示來檢索這些信息。但大語言模型和數據庫之間有兩個重要的區別。
第一個區別是,大語言模型是一種連續的、可插值的數據庫。數據不是以一組離散的條目存儲,而是存儲在一個向量空間——一條曲線上。你可以在曲線上移動(它是語義連續的,正如我們所討論的)來探索附近的相關點。你可以在不同的點之間進行插值,以找到它們的中間點。這意味著你可以從數據庫中檢索到比你輸入的更多的信息——但并不是所有的信息都是準確的或有意義的。插值可能導致泛化,但也可能導致幻覺。
第二個區別是,大語言模型不僅包含數據。它當然包含了很多數據——事實、地點、人物、日期、事物、關系。但它也是——也許主要是——一個程序數據庫。
但是,這些程序并不是你所習慣處理的那種。你可能會想到確定性的Python 程序——一系列符號語句逐步處理數據。但并不是這樣。相反,這些向量程序是高度非線性的函數,它們將潛在的嵌入空間映射到其自身。類似于 word2vec 的神奇向量,但要復雜得多。
提示作為程序查詢
要從大語言模型中獲取信息,你必須提示它。如果大語言模型是一個包含數百萬向量程序的數據庫,那么提示就像是在該數據庫中的搜索查詢。提示的一部分可以被解釋為“程序鍵”,即你想要檢索的程序的索引,另一部分可以被解釋為程序的輸入。
考慮以下提示示例:“用莎士比亞的風格重寫以下詩歌:...我的詩...”
“用 ... 風格重寫”是程序鍵。它指向程序空間中的特定位置。
“莎士比亞”和“...我的詩...”是程序輸入。
大語言模型的輸出是程序執行的結果。
現在,請記住,大語言模型作為程序數據庫的類比只是一種思維模型——還有其他模型可以使用。一個更常見的模型,但不太具有啟發性,是將大語言模型視為自回歸文本生成器,根據訓練數據分布輸出最有可能跟隨提示的單詞序列——即關注大語言模型被優化的任務。如果你在思考大語言模型的工作方式時,能記住多種模型,你會更好地理解它們——希望你會發現這個新的模型有用。
提示工程作為程序搜索過程
記住,這個“程序數據庫”是連續的和可插值的——它不是一個離散的程序集。這意味著一個稍微不同的提示,比如“用 x 的風格從歌詞上重新表述這段文本”,仍然會指向程序空間中非常相似的位置,得到的程序行為會非常接近但不完全相同。
你可以使用數千種不同的變體,每個變體都會導致一個相似但不完全相同的程序。這就是為什么需要提示工程。你的第一次嘗試、直覺上的程序鍵沒有理由在目標任務上產生最佳的程序。大語言模型不會“理解”你的意思,然后以最佳方式執行它——它只會檢索你的提示所指向的程序,而你的提示可能指向了眾多可能的位置中的一個。
提示工程是一個在程序空間中搜索的過程,目標是找到在你的目標任務上表現最佳的程序。這與你在谷歌搜索軟件時嘗試不同的關鍵詞沒有什么不同。
如果大語言模型真的理解你告訴它們的內容,那么就不需要這個搜索過程了,因為關于你的目標任務的信息量不會因為你的提示中使用“重寫”而不是“重新表述”,或者你是否在提示前加上“逐步思考”而改變。永遠不要假設大語言模型第一次就“理解”了——記住,你的提示只是無限程序海洋中的一個地址,它們都是通過自回歸優化目標將 token 組織到向量空間中的副產品。
一如既往,理解 LLM 最重要的原則是你應該抵制將它們擬人化的誘惑。
本文轉載自??MoPaaS魔泊云??,作者: Fran?ois Chollet ????
