每個人都能讀懂的大型語言模型工作原理

簡介
本文旨在幫助沒有計算機科學背景的人士了解 ChatGPT 以及類似 AI 系統(GPT-3、GPT-4、Bing Chat、Bard 等)的工作原理。ChatGPT 是一個聊天機器人——一種基于大型語言模型構建的對話式 AI 。這些肯定都是術語,我們會把它們全部分解開來。在此過程中,我們將討論其背后的核心概念。本文不需要任何技術或數學背景。我們將大量使用比喻來闡述這些概念。我們將討論這些核心概念的工作原理,以及我們對像 ChatGPT 這樣的大型語言模型的期望。
以下是我們接下來要做的事情。我們將簡要介紹一些與大型語言模型和 ChatGPT 相關的術語,不使用任何專業詞匯。如果必須使用專業術語,我會進行分解。我們將從最基礎的“什么是人工智能”開始,逐步深入。我會盡可能多地使用一些常用的比喻。我將從我們應該期待它們做什么,以及不應該期待它們做什么的角度,來探討這些技術的含義。
1.什么是人工智能
首先,我們先來了解一些你可能經常聽到的基本術語。什么是人工智能?
?人工智能:如果像人類做類似的事情,那么人們可能會合理地稱之為智能的實體。
用“智能”一詞來定義人工智能有點問題,但沒有人能就“智能”的合理定義達成一致。不過,我認為這個定義仍然相當合理。它的基本含義是,如果我們觀察到某種人造的東西,它做的事情既引人入勝又實用,而且看起來并不瑣碎,那么我們就可以稱之為智能。例如,我們經常將“AI”一詞歸類于電腦游戲中由電腦控制的角色。這些機器人大多是簡單的if-then-else代碼(例如,“如果玩家在攻擊范圍內,則射擊,否則移動到最近的巨石處尋求掩護”)。但如果我們所做的工作是讓我們保持參與和娛樂,而不是做任何明顯愚蠢的事情,那么我們可能會認為它們比實際上更老練。
一旦我們理解了某些事物的工作原理,我們可能不會對它印象深刻,而是期待幕后有更復雜的東西。這完全取決于你對幕后發生的事情的了解程度。
關鍵在于,人工智能并非魔法。正因為它不是魔法,所以它才能被解釋。
2.什么是機器學習
您經常聽到的與人工智能相關的另一個術語是機器學習。
?機器學習:通過獲取數據、形成模型、然后執行模型來創建行為的一種方法。
有時,手動創建一堆 if-then-else 語句來捕捉一些復雜的現象(例如語言)實在太難了。在這種情況下,我們會嘗試查找大量數據,并使用能夠從數據中發現模式的算法進行建模。
但什么是模型?模型是對某些復雜現象的簡化。例如,汽車模型只是真實汽車的縮小版、簡化版,它擁有真實汽車的許多屬性,但并非旨在完全取代原車。汽車模型可能看起來很真實,并且在某些方面有用,但我們不能把它開到商店去。
就像我們可以制造更小、更簡單的汽車一樣,我們也可以制造更小、更簡單的人類語言。我們使用“大型語言模型”這個術語,是因為這些模型從使用它們所需的內存大小來看,確實很大。目前生產環境中最大的模型,例如 ChatGPT、GPT-3 和 GPT-4,規模非常大,需要在數據中心服務器中運行的大型超級計算機才能創建和運行。
3.什么是神經網絡
從數據中學習模型的方法有很多。神經網絡就是其中一種。這項技術大致基于人腦的結構,即由相互連接的腦細胞(稱為神經元)組成的網絡,這些細胞來回傳遞電信號,以某種方式幫助我們完成所有的事情。神經網絡的基本概念發明于 20 世紀 40 年代,而訓練神經網絡的基本概念則發明于 20 世紀 80 年代。神經網絡效率非常低,直到 2017 年左右,計算機硬件才發展到足以大規模使用它們。
但與其說是大腦,我更喜歡用電路來比喻神經網絡。你不需要是電氣工程師也知道電流在電線中流動,而且我們有一種叫做電阻的東西,它能使電流更難流過電路的某些部分。
假設你想制造一輛可以在高速公路上行駛的自動駕駛汽車。你已經在汽車的前后兩側安裝了接近傳感器。當附近有物體時,接近傳感器會報告 1.0;當附近沒有物體時,接近傳感器會報告 0.0。
您還對汽車進行了改裝,以便機器人機構可以轉動方向盤、踩剎車和踩油門。當加速器接收到的值為 1.0 時,它使用最大加速度,而 0.0 表示沒有加速度。類似地,發送給制動機制的值 1.0 表示猛踩剎車,0.0 表示不剎車。轉向機制的取值范圍為 -1.0 到 +1.0,負值表示左轉,正值表示右轉,0.0 表示保持直行。
你還記錄了你的駕駛數據。前方道路暢通時,你會加速。前方有車時,你會減速。左側車輛過近時,你會右轉并變道。當然,除非你的右側也有車。這是一個復雜的過程,涉及基于不同傳感器信息組合的不同動作組合(左轉、右轉、加速或減速、剎車)。
現在你必須把傳感器連接到機器人機構上。怎么做呢?目前還不清楚。所以你需要把每個傳感器連接到每個機器人執行器上。

神經網絡作為連接傳感器和執行器的電路。
當你開車上路時會發生什么?電流從所有傳感器流向所有機器人執行器,汽車會同時左轉、右轉、加速和剎車。那將是一團糟。

當我們的一些傳感器發送電流時,該電流會流向所有執行器,汽車就會同時加速、剎車和轉向。
這可不行。所以我拿出電阻,開始把它們放在電路的不同部分,這樣電流就能在某些傳感器和機器人執行器之間更順暢地流動。比如,我希望電流能更順暢地從前部接近傳感器流向剎車,而不是方向盤。我還加裝了所謂的“門”,它會阻止電流流動,直到積聚足夠的電流來觸發開關(只有當前部接近傳感器和后部接近傳感器報告的值都很高時,電流才能通過);或者,只有當輸入電壓較低時,才會向前輸送電能(當前部接近傳感器報告的值較低時,會向油門輸送更多電流)。
但是我該把這些電阻和門電路放在哪里呢?我不知道。我開始把它們隨意地放在各處。然后我再試一次。也許這次我的車開起來會更好,這意味著有時它會在數據顯示最好剎車時剎車,在數據顯示最好轉向時轉向等等。但它并非萬事俱備。有些事情它做得更糟(例如,在數據顯示最好剎車時加速)。所以我繼續隨機嘗試不同的電阻和門電路組合。最終,我會偶然找到一個效果足夠好的組合,我宣布成功。也許它看起來像這樣:

一個訓練完畢的神經網絡。深色線條表示電路中電流流動更自由的部分。中間的圓圈表示門控,它們可能會從底部積累大量能量,然后再將能量向上傳送,或者甚至可能在底部能量很少的情況下將能量向上傳送。
(實際上,我們不會增減門電路,它們始終存在,但我們會修改門電路,使它們以更少的來自下方的能量激活,或者需要更多的來自下方的能量,或者僅在來自下方的能量非常少時才釋放大量能量。機器學習純粹主義者可能會對這種描述感到有些反感。從技術上講,這是通過調整門電路上的偏置來實現的,偏置通常不會在此類圖表中顯示,但從電路的比喻來看,可以將其視為進入每個門電路的導線,直接插入電源,然后可以像所有其他導線一樣進行修改。)
讓我們試駕一下吧!

隨機嘗試很糟糕。一種名為反向傳播的算法相當擅長猜測如何改變電路的配置。該算法的細節并不重要,只要知道它對電路進行微小的改變,使電路的行為更接近數據所建議的,經過數千次或數百萬次的調整,最終可以得到接近數據的結果。
我們將電阻和門稱為參數,因為實際上它們無處不在,反向傳播算法的作用是聲明每個電阻的強弱。因此,如果我們知道電路布局和參數值,就可以在其他汽車上復制整個電路。
4.什么是深度學習
深度學習我這讓我們意識到,除了電阻和門電路之外,我們還可以添加其他東西。例如,我們可以在電路中間進行數學計算,在電流輸出之前進行加法和乘法運算。深度學習仍然使用相同的基本增量式參數猜測技術。
5.什么是語言模型
當我們做汽車的例子時,我們試圖讓神經網絡做出與數據一致的行為。我們思考的是,能否創建一個電路,像駕駛員在類似情況下那樣操縱汽車的機械裝置。我們也可以以同樣的方式處理語言。我們可以觀察人類書寫的文本,并思考電路能否生成與人類傾向于生成的單詞序列非常相似的單詞序列。現在,當我們看到單詞時,我們的傳感器就會觸發,我們的輸出機制也是單詞。
我們想做什么?我們試圖創建一個電路,根據給定的一組輸入詞猜測輸出詞。例如:
“從前有一個____”
似乎應該用“時間”而不是“犰狳”來填空。
我們傾向于用概率來討論語言模型。從數學上講,我們將上面的例子寫成:

如果您不熟悉這個符號,不用擔心。這只是一個數學術語,指的是給定(豎線符號|表示給定)一組單詞“once”、“upon”和“a”時,“time”這個詞出現的概率 (P)。我們預期一個好的語言模型會得出“time”這個詞出現的概率高于“armadillo”這個詞出現的概率。
我們可以將其概括為:

這只是意味著根據序列中第 n個單詞之前的所有單詞(位置 1 到n -1 的單詞)來計算該單詞的概率。
但讓我們稍微回顧一下。想象一下老式打字機,就是那種帶有擊針臂的打字機。

只不過,我們不再為每個字母配備一個擊針臂,而是為每個單詞配備一個擊針。如果英語有5萬個單詞,那么這臺打字機就夠大了!
與其考慮汽車的網絡,不如設想一個類似的網絡,只不過電路頂部有 5 萬個輸出連接到撞針臂,每個輸出對應一個單詞。相應地,我們將有 5 萬個傳感器,每個傳感器檢測不同的輸入單詞。所以,我們最終要做的就是選擇一個接收最高電信號的撞針臂,這個單詞就是填入空格的單詞。
我們現在的處境是這樣的:如果我想做一個接收單個單詞并輸出單個單詞的簡單電路,我就得做一個有 5 萬個傳感器(每個單詞一個)和 5 萬個輸出(每個撞擊臂一個)的電路。我只需將每個傳感器連接到每個撞擊臂,總共需要 5 萬 x 5 萬 = 25 億條線路。

底部的每個圓圈感知一個單詞。識別“一次”這個詞需要 5 萬個傳感器。這些能量會通過某個任意網絡發送。頂部的所有圓圈都連接到每個單詞的撞擊臂。所有撞擊臂都會接收一些能量,但其中一個撞擊臂接收的能量會比其他撞擊臂多。
那是一個很大的網絡!
但情況更糟。如果我想做“Once upon a ___”的例子,我需要感知三個輸入位置中分別對應的單詞。我需要 50,000 x 3 = 150,000 個傳感器。連接 50,000 個打擊臂,總共需要 150,000 x 50,000 = 75 億條傳感器。截至 2023 年,大多數大型語言模型可以容納 4,000 個單詞,最大的可以容納 32,000 個單詞。我的眼睛都快哭了。

以三個單詞作為輸入的網絡每個單詞需要 50,000 個傳感器。
我們需要一些技巧來應對這種情況。我們會分階段進行。
5.1 編碼器
我們要做的第一件事是將電路分成兩個電路,一個叫做編碼器,另一個叫做解碼器。很多單詞的意思大致相同。考慮以下短語:
國王坐在___上,王后坐在___上,
公主坐在___上,
攝政王坐在___上
以上所有空格的合理猜測應該是“王座”(或者可能是“廁所”)。也就是說,我可能不需要在“國王”和“王座”之間,或者“女王”和“王座”之間,等等之間分別使用不同的線路。相反,如果我能找到一個近似表示皇室的詞,并且每次看到“國王”或“女王”時,都用這個中間詞來代替,那就太好了。這樣,我只需要考慮哪些詞的意思大致相同,然后該如何處理(把大量的精力放在“王座”上)。
所以,我們接下來要做的事情是:搭建一個電路,它能容納 5 萬個單詞傳感器,并映射到一組較小的輸出,比如 256 個,而不是 5 萬個。這樣,我們就能一次觸發多個撞擊臂,而不是只觸發一個。撞擊臂的每種可能組合都可以代表一個不同的概念(例如“皇室”或“裝甲哺乳動物”)。這 256 個輸出使我們能夠表示 22?? = 1.15 x 10?? 個概念。實際上,我們可以表示的概念甚至更多,因為就像在汽車的例子中我們可以將剎車踩到一半一樣,這 256 個輸出不僅可以是 1.0 或 0.0,還可以是介于兩者之間的任何數字。所以,也許更貼切的比喻是,所有 256 個撞擊臂都會向下壓,但每個臂向下壓的力度不同。
好的……以前,一個單詞需要 50,000 個傳感器中的一個來觸發。現在,我們將一個激活的傳感器和 49,999 個關閉的傳感器精簡為 256 個數字。因此,“國王”可能是 [0.1, 0.0 , 0.9, ..., 0.4],“女王”可能是 [0.1, 0.1 , 0.9, ..., 0.4],它們幾乎相同。我將這些數字列表稱為編碼(由于歷史原因也稱為隱藏狀態,但我不想解釋這一點,所以我們將繼續使用編碼)。我們將將 50,000 個傳感器壓縮成 256 個輸出的電路稱為編碼器。它看起來像這樣:

編碼器網絡將檢測單個單詞所需的 50,000 個傳感器值壓縮為 256 個數字的編碼(較淺和較深的藍色用于表示較高或較低的值)。
5.2 解碼器
但編碼器不會告訴我們接下來應該輸入哪個單詞。所以我們將編碼器與一個解碼器網絡配對。解碼器是另一個電路,它接收組成編碼的256個數字,并激活最初的5萬個打擊臂,每個單詞一個。然后,我們會選擇電流輸出最高的單詞。它看起來就像這樣:

解碼器網絡將編碼中的 256 個值擴展為與每個可能單詞相關的 50,000 個打擊臂的激活值。一個單詞激活最高的一個。
5.3 編碼器和解碼器一起
編碼器和解碼器共同作用,形成一個大型神經網絡:

編碼器-解碼器網絡。它只是一個位于編碼器之上的解碼器。
順便說一下,一個單詞的輸入經過編碼后,只需要 (50,000 x 256) x 2 = 2560 萬個參數。這看起來好多了。
該示例針對一個單詞的輸入和產生一個單詞的輸出,因此如果我們想要讀取n 個單詞,我們將有 50,000 x n 個輸入,而編碼則需要256 x n
但為什么這樣做有效呢?通過強制將 50,000 個單詞全部塞進一小組數字中,我們迫使網絡做出妥協,將可能觸發相同輸出單詞猜測的單詞組合在一起。這很像文件壓縮。當你壓縮一個文本文檔時,你會得到一個更小的文檔,它不再可讀。但你可以解壓文檔并恢復原始的可讀文本。這是因為壓縮程序會用簡寫符號替換某些單詞模式。然后,當它解壓時,它知道要用簡寫符號替換哪些文本。我們的編碼器和解碼器電路會學習一種電阻器和門電路的配置,用于壓縮和解壓單詞。
5.4 自我監督
我們如何知道每個單詞的最佳編碼?換句話說,我們如何知道“king”的編碼應該與“queen”的編碼相似,而不是“armadillo”的編碼?
不妨做一個思想實驗,設想一個編碼器-解碼器網絡,它應該輸入一個單詞(5萬個傳感器),并輸出完全相同的單詞。這樣做可能有點傻,但對接下來的內容卻很有啟發。

經過訓練的編碼器-解碼器網絡輸出與輸入相同的單詞(與之前的圖像相同,但使用顏色進行激活)。
我輸入單詞“king”,然后單個傳感器通過編碼器發送其電信號,并在中間部分打開 256 個編碼值。如果編碼正確,則解碼器將向同一個單詞“king”發送最高的電信號。是嗎?很簡單?別那么快。我同樣有可能看到激活能量最高的帶有單詞“armadillo”的擊打臂。假設“king”的擊打臂獲得 0.051 電信號,而“armadillo”的擊打臂獲得 0.23 電信號。實際上,我甚至不關心“armadillo”的值是多少。我只需查看“king”的輸出能量就知道它不是 1.0。1.0 和 0.051 之間的差異是誤差,我可以使用反向傳播對解碼器和編碼器進行一些更改,以便下次我們看到單詞“king”時進行略微不同的編碼。
我們對所有單詞都這樣做。編碼器必須做出妥協,因為 256 遠小于 50,000。也就是說,有些單詞必須使用相同的激活能量組合。因此,當有選擇時,它會希望“king”和“queen”的編碼幾乎相同,而“armadillo”的編碼則截然不同。這將使解碼器僅通過查看 256 個編碼值就能更好地猜測單詞。如果解碼器看到 256 個值的特定組合,并猜測“king”為 0.43,“queen”為 0.42,只要“king”和“queen”獲得最高的電信號,并且 49,998 個擊打臂中的每一個都獲得較小的數字,我們就可以接受。換句話說,我們可能更愿意接受網絡混淆“king”和“queen”,而不是混淆“kings”和“armadillos”。
我們說神經網絡是自監督的,因為與汽車的例子不同,你不需要收集單獨的數據來測試輸出。我們只需將輸出與輸入進行比較——我們不需要為輸入和輸出分別準備數據。
5.5 掩蔽語言模型
如果上述思想實驗看起來有點傻,那么它正是所謂的掩碼語言模型(masked language models)的基礎。掩碼語言模型的思想是輸入一個單詞序列,并生成一個單詞序列。輸入和輸出中的一個單詞會被隱藏。
[面具] 坐在王座上。
網絡會猜測所有單詞。其實,猜測未屏蔽的單詞相當容易。我們真正關心的只是網絡對屏蔽詞的猜測。也就是說,輸出中每個單詞都有 50,000 個 striker arm。我們關注的是屏蔽詞的 50,000 個 striker arm。

遮蔽一個序列。我已經厭倦了畫那么多連接線,所以我只畫紅線來表示上下所有東西之間的大量連接。
我們可以移動掩碼并讓網絡猜測不同位置的不同單詞。
有一種特殊的掩碼語言模型,掩碼只在末尾。這種模型被稱為生成模型,因為它猜測的掩碼始終是序列中的下一個單詞,這相當于生成下一個單詞,就好像下一個單詞不存在一樣。就像這樣:
[面具]
女王 [面具]
女王坐在 [面具] 女王坐在 [面具]
女王坐在 [面具]
女王坐在 [面具]
我們也稱之為自回歸模型。 “回歸”這個詞聽起來不太好。但回歸只是意味著試圖理解事物之間的關系,比如輸入的單詞和應該輸出的單詞。 “自”的意思是“自我”。自回歸模型具有自我預測能力。它預測一個單詞,然后用這個單詞預測下一個單詞,然后用這個單詞預測下一個單詞,如此反復。這其中有一些有趣的含義,我們稍后會再討論。
6.什么是變壓器
截至撰寫本文時,我們聽到了很多關于 GPT-3、GPT-4 和 ChatGPT 的消息。GPT 是由 OpenAI 公司開發的一種大型語言模型的特定品牌。GPT 代表生成式預訓練 Transformer。讓我們來詳細分析一下:
?生成式。該模型能夠根據提供的輸入生成后續內容。也就是說,給定一些文本,模型會嘗試猜測接下來會出現哪些單詞。
?預訓練。該模型是在非常大的通用文本語料庫上進行訓練的,只需訓練一次即可用于許多不同的事情,而無需從頭開始重新訓練。
該模型基于一個非常龐大的通用文本語料庫進行訓練,該語料庫表面上涵蓋了大量可以想到的主題。這或多或少意味著“從互聯網上抓取”,而不是取自某些專門的文本庫。通過對通用文本進行訓練,語言模型能夠比例如對特定類型文本(例如醫學文檔)進行訓練的語言模型更能響應更廣泛的輸入。理論上,在通用語料庫上訓練的語言模型可以合理地響應互聯網文檔中可能出現的任何內容。它可能對醫學文本的處理還算不錯。僅對醫學文檔進行訓練的語言模型可能對與醫學背景相關的輸入響應良好,但在響應其他輸入(例如閑聊或食譜)時會非常糟糕。
要么模型在很多方面都足夠好,人們永遠不需要訓練自己的模型,要么人們可以做一些稱為微調的事情,這意味著采用預先訓練的模型并對其進行一些更新,以使其在專門任務(如醫療)上更好地工作。
現在來看看變壓器……
?Transformer。一種特定類型的自監督編碼器-解碼器深度學習模型,具有一些非常有趣的特性,使其擅長語言建模。
Transformer是一種特殊的深度學習模型,它以特定的方式轉換編碼,使被遮擋的單詞更容易被猜出。它是由 Vaswani 等人在 2017 年發表的一篇名為《Attention is All You Need》的論文中提出的。Transformer的核心是經典的編碼器-解碼器網絡。編碼器執行非常標準的編碼過程。簡單到你可能會感到震驚。但它還添加了一個叫做自注意力(self-attention)的東西。
6.1 自注意力機制
自注意力機制的原理如下:序列中的某些詞與序列中的其他詞相關。例如這句話:“外星人降落在地球上,因為它需要躲在一個星球上。” 如果我們屏蔽掉第二個詞“外星人”,并讓神經網絡猜測這個詞,它會有更好的概率,因為有“降落”和“地球”這樣的詞。同樣,如果我們屏蔽掉“它”,并讓神經網絡猜測這個詞,那么“外星人”這個詞的存在可能會讓它更有可能選擇“它”,而不是“他”或“她”。

詞語之間通過功能、指代同一事物或相互傳達含義而相互關聯。
我們說一個序列中的單詞會關注其他單詞,因為它們捕捉到了某種關系。這種關系不一定是已知的。它可能是解析代詞,可能是動詞和主語的關系,也可能是兩個與同一概念相關的單詞(“地球”和“行星”)。無論它是什么,了解單詞之間存在某種關系對于預測都是有用的。
下一節將深入探討自注意力機制的數學原理,但其核心思想是,Transformer 會學習輸入序列中哪些詞是相關的,然后為輸入序列中的每個位置創建一個新的編碼,該編碼是所有相關詞的合并。你可以把它想象成學習組成一個由“alien”、“landed”和“earth”(aliandearth?)混合而成的新詞。這是因為每個詞都被編碼為一個數字列表。如果Alien = [0.1, 0.2, 0.3, ..., 0.4],Landed = [0.5, 0.6, 0.7, ..., 0.8],Earth = [0.9, 1.0, 1.1, ..., 1.2],那么第二個詞的位置可能被編碼為所有這些編碼的總和,即 [1.5, 1.8, 2.1, ..., 2.4],它本身并不對應任何詞,但卻捕獲了所有詞的片段。這樣,當解碼器最終看到第二個位置上的單詞的新編碼時,它就掌握了大量關于該單詞在序列中如何使用的信息,從而能夠更好地猜測任何掩碼。(該示例只是將編碼加在一起,但實際情況會比這更復雜一些)。
6.2. 自注意力機制如何工作
自注意力機制是對傳統編碼器-解碼器網絡的重大改進,因此如果您想進一步了解它的工作原理,請繼續閱讀。否則,請跳過本節。簡而言之:自注意力機制是數學運算“點積”的別稱。
自我注意力分為三個階段。
(1)我們像往常一樣對輸入序列中的每個單詞進行編碼。我們將單詞編碼復制四份。其中一份我們稱之為殘差,并留作安全保管。
(2)我們對另外三個數據進行第二輪編碼(也就是對一個編碼進行編碼)。每個數據都經過不同的編碼過程,因此它們最終都變得不同。我們將其中一個稱為查詢 ( q ),一個稱為鍵 ( k ),一個稱為值 ( v )。
我想讓你想象一下哈希表(在 Python 中也稱為字典)。表中存儲了大量信息。表中的每一行都有一個鍵(key),即一個唯一標識符,以及一個值(value),即存儲在該行中的數據。要從哈希表中檢索某些信息,你需要進行查詢。如果查詢與鍵匹配,則提取值。

可以使用哈希表來查詢教授在哪所大學工作。
自注意力機制的工作原理有點像模糊哈希表。你提供一個查詢,它不是尋找與鍵的精確匹配,而是根據查詢和鍵之間的相似性找到近似匹配。但是,如果匹配不是完全匹配怎么辦?它會返回該值的一部分。這只有當查詢、鍵和值都是數字時才有意義。它們是:

具有部分匹配的哈希表。
這就是我們要做的。對于輸入中的每個單詞位置,我們將采用q編碼和k編碼來計算相似度。我們使用一種叫做點積的方法,也稱為余弦相似度。這并不重要。關鍵在于,每個單詞都是一個包含 256 個數字的列表(基于我們之前的示例),我們可以計算這些數字列表的相似度,并將相似度記錄在一個矩陣中。我們將這個矩陣稱為自注意力得分。如果我們有一個三個單詞的輸入序列,我們的注意力得分可能如下所示:

每個單元格表示一個位置上的編碼詞對另一個位置上的編碼詞的關注程度。
網絡將第一個詞視為查詢,并與第二個鍵匹配(我們可以說第一個詞“關注”第二個詞)。如果第二個詞是查詢,它將與第三個鍵匹配。如果第三個詞是查詢,它將與第一個鍵匹配。實際上,我們永遠不會有像這樣的 1 和 0;我們會有 0 到 1 之間的部分匹配,并且每個查詢(行)將與多個鍵(列)進行部分匹配。
現在繼續用檢索的比喻,我們將這個矩陣與v編碼相乘,就會發生一些有趣的事情。假設我們的v編碼如下所示:

每一行都是序列中一個單詞的編碼。
也就是說,第一個單詞被編碼為 0.10…0.19 的數字列表,第二個單詞被編碼為 0.20…0.29 的數字列表,第三個單詞被編碼為 0.30…0.39 的數字列表。這些數字只是為了方便說明而編造的,絕對不會這么整齊。

用價值觀增加關注度。
第一個查詢匹配第二個鍵,因此檢索第二個編碼字。第二個查詢匹配第三個鍵,因此檢索第三個編碼字。第三個查詢匹配第一個鍵,因此檢索第一個編碼字。我們實際上做的就是交換行!

實際上,分數不會是完美的1和0,結果會是每種編碼的一點點混合在一起(例如,第一個單詞的97%加上1%,或者第三個單詞加上第二個單詞的2%)。但這說明了自注意力機制是如何進行混合和交換的。在這個極端版本中,第一個單詞被替換成了第二個單詞,依此類推。所以也許“earth”這個詞被替換成了“planet”。
我們如何知道q、k和v的編碼是正確的?如果整個網絡猜測掩碼最佳單詞的能力有所提高,那么q、k和v 的編碼就是正確的。如果沒有,我們下次就修改參數,采用略有不同的編碼方式。
(3)我們做的第三件事是將所有數學運算的結果加到殘差中。還記得我們之前擱置的原始編碼的第一個副本嗎?沒錯,我們將混合交換后的版本加到其中。現在,“earth”不再僅僅是“earth”的編碼,而是一個由“earth”和“planet”混合而成的虛構詞……pearth?ealanet?其實不然。總之,這是最終的轉換編碼,將發送給解碼器。我們或許會同意,在每個位置上放置一個實際上編碼了兩個或更多單詞的假詞,對于基于每個位置一個單詞進行預測更有用。
然后你再一次重復此操作幾次(多層)。
關于編碼器最終編碼如何進入解碼器(這是另一輪注意力機制,稱為源注意力機制,其中編碼器對每個位置的編碼被用作q和k,并應用于另一個不同版本的v),我省略了很多細節,但到這里你應該對事情有了大致的了解。最終,解碼器接收來自編碼器的編碼,將能量發送到擊打臂,用于處理單詞,然后我們挑選能量最強的單詞。
7.為什么大型語言模型如此強大
那么這一切意味著什么呢?包括 ChatGPT、GPT-4 等在內的大型語言模型只做一件事:它們輸入一堆單詞,然后嘗試猜測下一個單詞應該是什么。如果這就是“推理”或“思考”,那么它只是一種非常特殊的形式。
但即使是這種特殊形式也似乎非常強大,因為 ChatGPT 及其類似工具似乎可以很好地完成很多事情:寫詩、回答科技問題、總結文檔、起草電子郵件,甚至編寫代碼,等等。它們為什么會如此出色?
秘訣有兩個方面。第一點我們已經討論過了:Transformer 學會了混合上下文,使其能夠非常輕松地猜測下一個單詞。秘訣的另一部分在于系統的訓練方式。大型語言模型的訓練基于從互聯網上抓取的海量信息。這些信息包括書籍、博客、新聞網站、維基百科文章、Reddit 討論以及社交媒體對話。在訓練過程中,我們會從其中一個來源輸入一段文本,并要求模型猜測下一個單詞。記住:這是自監督的。如果模型猜錯了,我們會稍微調整模型,直到猜對為止。如果我們思考一下 LLM 的訓練目標,那就是生成可能出現在互聯網上的文本。它無法記住互聯網上的內容,因此它會使用編碼進行妥協,結果可能會有些許誤差,但希望不會太差。
重要的是不要低估互聯網上文本在主題方面的多樣性。大型語言模型(LLM)無所不知。他們看過幾乎所有主題的數十億次對話。因此,LLM 可以生成看起來像在與你對話的文字。他們看過幾乎所有你能想到的事物的數十億首詩歌和歌詞,因此他們可以生成看起來像詩歌的文本。他們看過數十億份家庭作業及其答案,因此他們可以對你的作業做出合理的猜測,即使略有不同。他們看過數十億份標準化考試題目及其答案。我們真的認為今年的 SAT 題目和去年的題目有那么大的不同嗎?他們看過人們談論他們的假期計劃,因此他們可以猜出看起來像假期計劃的單詞。他們看過數十億個執行各種操作的代碼示例。計算機程序員所做的很多工作就是將用于執行非常典型且易于理解的操作的代碼片段組裝成更大的代碼塊。因此,LLM 可以為你編寫這些簡短、常見的代碼片段。它在 stackoverflow.com 上看過數十億個錯誤代碼示例及其修正。是的,所以它可以接收你的錯誤代碼并提出修復建議。它見過數十億人發推文說他們碰過熱爐子燙傷了手指,所以大型語言模型(LLM)知道一些常識。它讀過大量的科學論文,所以它可以猜測出眾所周知的科學事實,即使你并不了解這些事實。它見過數十億人總結、改寫文本要點、描述如何使文本更符合語法、更簡潔或更具說服力的例子。
重點在于:當你要求 ChatGPT 或其他大型語言模型做一些巧妙的事情——而且它確實成功了——你要求它做的事情很可能是它已經看過數十億個例子的事情。即使你想出了一些非常獨特的問題,比如“告訴我,Flash Gordon 吃了六個墨西哥卷餅后會做什么”(這算不算獨特,我甚至不知道),它也看過關于 Flash Gordon 的同人小說,也看過人們談論吃了太多墨西哥卷餅,并且能夠——憑借自注意力機制——將零散的信息混合搭配,組合成一個聽起來合理的答案。
與大型語言模型交互時,我們的第一反應不應該是“哇,這些東西一定很聰明,很有創造力,或者理解力很強”。我們的第一反應應該是“我可能讓它做了一些它之前已經見過的片段”。這可能意味著它仍然非常有用,即使它沒有“認真思考”或“進行一些非常復雜的推理”。
我們不需要使用擬人化來理解它如何為我們提供回應。
關于這個主題的最后一點說明:由于大型語言模型的工作方式和訓練方式,它們提供的答案往往是中位數。如果說模型在詢問一個關于《飛俠哥頓》的故事后,往往會給出平均水平的答案,這聽起來可能很奇怪。但就一個故事或一首詩而言,這些答案可以理解為許多人(在互聯網上寫作的人)在不得不妥協的情況下會想出的結果。這不會很糟糕。以一個獨自坐著思考的人的標準來看,這已經相當不錯了。但你的故事和詩歌可能也很普通(但它們對你來說很特別)。 對不起。
8.我應該注意什么
Transformer 的工作原理和訓練方式會帶來一些非常微妙的影響。以下是這些技術細節的直接影響。
1.大型語言模型是在互聯網上訓練的。這意味著它們也訓練了人性中所有陰暗的一面。大型語言模型訓練的內容包括種族主義言論、性別歧視言論、針對各種人的各種侮辱、人們對他人的刻板印象、陰謀論、政治錯誤信息等等。這意味著語言模型選擇生成的詞匯可能會重復這些語言。
2.大型語言模型沒有“核心信念”。它們只是詞語猜測器;它們試圖預測如果同一句話出現在互聯網上,接下來的詞語會是什么。因此,我們可以要求大型語言模型寫一個句子來支持某件事,或者反對同一件事,語言模型會兩種方式都遵循。這些并不表明它相信某件事或另一件事,或者改變了它的信念,或者某件事比另一件事更正確。如果訓練數據中某件事的例子比另一件事多,那么大型語言模型就會傾向于對訓練數據中出現頻率更高的事物做出更一致的反應,因為這些事物在互聯網上出現的頻率更高。記住:模型正在努力模仿最常見的反應。
3.大型語言模型不具備任何真理或對錯的概念。有些事情我們認為是事實,比如地球是圓的。大型語言模型(LLM)往往會這樣說。但如果上下文正確,它也會說相反的話,因為互聯網上確實有關于地球是平的文字。大型語言模型并不能保證提供真理。我們可能傾向于猜測那些我們認同為真的詞語,但這幾乎是我們能夠斷言大型語言模型“了解”什么真理或對錯的方式了。
4.大型語言模型可能會犯錯。訓練數據可能包含很多不一致的材料。當我們提出問題時,自注意力機制可能無法關注到我們想要它關注的所有內容。作為一個猜詞器,它可能會做出錯誤的猜測。有時,訓練數據已經見過某個單詞很多次了,以至于它更喜歡用這個詞,即使這個詞對于輸入來說毫無意義。上述情況會導致一種稱為“幻覺”的現象,即猜測的單詞既不是來自輸入,也不是“正確的”。LLM 傾向于猜測小數而不是大數,因為小數更常見。所以 LLM 不擅長數學。LLM 偏愛數字“42”,因為人類會因為某本名著而這樣做。LLM 偏愛更常見的名字,因此可能會編造作者的名字。
5.大型語言模型是自回歸的。因此,當它們做出我們認為可能不太好的猜測時,這些猜測的單詞會被添加到它們自己的輸入中,用于猜測下一個單詞。也就是說,錯誤會累積。即使只有 1% 的錯誤概率,自注意力機制也能注意到這個錯誤的選擇,并加倍努力去解決這個錯誤。即使只犯了一個錯誤,之后的所有錯誤都可能與這個錯誤有關。然后,語言模型可能會在此基礎上犯下更多錯誤。Transformer 無法“改變主意”、重試或自我修正。它們會順其自然。
6.我們應該始終驗證大型語言模型的輸出。如果你要求它做一些你自己無法勝任驗證的事情,那么你應該考慮一下自己是否能夠接受對模型中可能出現的錯誤采取行動。對于低風險的任務,比如寫一篇短篇小說,這樣做或許沒問題。但對于高風險的任務,比如嘗試獲取信息來決定投資哪只股票,這些錯誤可能會導致你做出代價高昂的決定。
7.自注意力機制意味著你在輸入提示中提供的信息越多,響應就越專業化,因為它會將更多你的詞匯融入到猜測中。響應的質量與輸入提示的質量成正比。更好的提示會產生更好的結果。嘗試幾個不同的提示,看看哪個最適合你。不要想當然地認為語言模型“理解”了你的意圖,并會在第一次就盡力而為。
8.你實際上并非在與大型語言模型“對話”。大型語言模型不會“記住”交流中發生的事情。你的輸入會被輸入,回復會被輸出。LLM 什么都不記得。你的初始輸入、回復以及你對回復的回復都會被輸入。因此,如果它看起來像是在記住,那是因為對話日志變成了新的輸入。這是一個前端編程技巧,可以讓大型語言模型看起來像是在進行對話。由于這個技巧,它可能會保持對話主題,但無法保證它不會與之前的回復相矛盾。此外,輸入大型語言模型的單詞數量是有限制的(目前 ChatGPT 允許輸入大約 4,000 個單詞,而 GPT-4 允許輸入大約 32,000 個單詞)。輸入量可能很大,因此對話通常會在一段時間內保持連貫。最終,累積的日志會變得過大,對話的開頭會被刪除,系統會“忘記”之前的內容。
9.大型語言模型不解決問題或規劃。但你可以要求它們制定計劃并解決問題。這里我要進行一些區分。解決問題和規劃是人工智能研究社區中某些群體保留的術語,用于表示非常具體的含義。具體來說,它們意味著有一個目標——你想要在未來實現的事情——并通過在可能更接近該目標的選項之間做出選擇來努力實現該目標。大型語言模型沒有目標。它們有一個目的,即在給定輸入序列的情況下選擇最有可能出現在訓練數據中的單詞。它們是模式匹配。特別是規劃,通常涉及一種稱為前瞻的東西。當人類進行規劃時,他們會想象他們的行為的結果,并根據目標分析未來。如果它看起來更接近目標,那么這是一個很好的舉動。如果沒有,我們可能會嘗試想象另一個動作的結果。還有更多內容,但關鍵在于大型語言模型沒有目標,也不會進行前瞻。Transformer 是向后看的。自注意力只能應用于已經出現過的輸入詞。現在,大型語言模型可以生成看起來像計劃的輸出,因為它們已經在訓練數據中看到了很多計劃。它們知道計劃是什么樣的,它們知道關于它們所見過的某些主題的計劃中應該出現什么。它會對這個計劃做出很好的猜測。這個計劃可能會忽略關于世界的特定細節,傾向于最通用的計劃。大型語言模型當然沒有“仔細考慮過所有替代方案”,也沒有嘗試過一件事然后回溯并嘗試另一件事。Transformer 內部沒有任何機制可以對未來進行如此反復的考慮。在要求計劃時,務必驗證輸出。
9.ChatGPT 有何特別之處
“所以我聽說 RLHF 讓 ChatGPT 變得非常智能。”
“ChatGPT 使用強化學習,這就是它如此智能的原因。”
截至撰寫本文時,人們對一種名為 RLHF(基于人類反饋的強化學習)的技術非常興奮。為了訓練 ChatGPT(以及越來越多的其他大型語言模型),人們已經做了一些工作。這些工作并非新鮮事物,但在 ChatGPT 發布時就被廣泛采用并產生了巨大的影響。
ChatGPT 是一個基于 Transformer 的大型語言模型。ChatGPT 因其擅長對輸入提示做出響應,并且拒絕回答某些可能被認為有害或帶有主觀性的問題而聞名。它與上面描述的方法并沒有什么特別不同,實際上非常普通。但有一個區別:它的訓練方式。ChatGPT 的訓練方式與常規方法相同——抓取大量互聯網數據,提取其中的片段,然后讓系統預測下一個單詞。這構建了一個基礎模型,它本身就是一個非常強大的單詞預測器(相當于 GPT-3)。但之后還增加了兩個訓練步驟:指令調整和基于人工反饋的強化學習。
9.1. 指令調整
大型語言模型有一個特殊問題:它們只想輸入一個單詞序列,然后生成接下來的內容。大多數情況下,這確實能實現,但并非總是如此。請考慮以下輸入提示:
“寫一篇關于亞歷山大·漢密爾頓的文章。”
你覺得答案應該是什么呢?你可能覺得應該這樣寫:“亞歷山大·漢密爾頓1757年出生于尼維斯。他是一位政治家、律師、陸軍上校,也是美國第一任財政部長……”但你實際上可能會得到這樣的答案:
“你的論文應該至少有五頁,雙倍行距,并且至少包含兩個引用。”
剛才發生了什么?語言模型可能見過很多以“寫一篇關于……的文章”開頭的學生作業,其中包含詳細說明長度和格式的文字。當然,當你寫下“寫一篇文章……”時,你以為你是在向語言模型發出指令,就好像它是一個理解你意圖的人一樣。語言模型并不理解你的意圖,也沒有自己的意圖;它們只會將輸入與它們在訓練數據中看到的模式進行匹配。
為了解決這個問題,可以進行所謂的指令調優。這個想法很簡單。如果得到了錯誤的答案,就寫下正確的答案,并將原始輸入和新的修正輸出作為訓練數據發送到神經網絡。有了足夠多的修正輸出樣本,系統就會學會調整電路,使新的答案成為首選。
不需要做太花哨的事。只需要讓很多人與大型語言模型交互,讓它做很多事情,并在它表現不正確時記下更正。然后收集所有犯錯的例子和新的正確輸出,并進行更多訓練。
這使得大型語言模型表現得好像理解了輸入提示的意圖,并且就像在遵循指令一樣。它除了嘗試猜測下一個單詞之外什么也沒做。但現在,新的訓練數據讓它能夠猜測那些似乎對輸入更具響應性的單詞。
9.2. 從人類反饋中進行強化學習
訓練的下一步是根據人類反饋進行強化學習。我想這需要一點解釋。
強化學習是一種人工智能技術,傳統上用于一些機器人研究,也用于虛擬游戲代理(想想可以下國際象棋、圍棋或星際爭霸的人工智能系統)。強化學習尤其擅長在獲得獎勵時決定做什么。獎勵只是一個數字,表示它做得有多好(做得非常好就加 100;做得非常糟糕就加 -100)。在現實世界和游戲中,通常很少給予獎勵。在游戲中,你可能需要做很多動作才能獲得積分。也許你只會在游戲的最后獲得積分。在現實世界中,沒有足夠多的人告訴你什么時候你做得很好(你做得很好)。除非你是一條狗(它們都是好孩子)。你真正需要知道的唯一一件事是,強化學習系統會嘗試預測它們未來將獲得多少獎勵,然后選擇最有可能獲得更多未來獎勵的動作。這與人們用狗食來訓練狗的行為方式并不完全不同。
好的,把這些都收起來,然后考慮以下提示:
馬克是哪方面的專家?
假設語言模型的輸出是:
馬克在人工智能、圖形和人機交互方面發表了許多著作。
這只是部分正確。我不在圖形領域發表文章。我真想給這個句子一個差評,或者說-1分。但只有一部分是錯的:“圖形”這個詞。如果我告訴系統整個句子都是錯的,語言模型可能會學習到所有這些詞都應該避免。嗯,其中很多詞都是合理的。
這就是強化學習的用武之地。強化學習的工作原理是嘗試不同的替代方案,看看哪些方案能獲得最大的獎勵。假設我要求它對原始提示生成三個不同的響應。
- 馬克在人工智能、圖形和人機交互方面發表了許多著作。
- Mark 曾從事人工智能、安全 NLP 系統和人機交互方面的工作。
- 標記為研究人工智能、游戲 AI 和圖形。
我可以對第一個選項點贊(+1),對第二個選項點踩(-1),對第三個選項點踩(-1)。就像玩游戲一樣,強化學習算法可以回顧并找出導致 -1 的一個共同點是“圖形”這個詞。現在,系統可以鎖定這個詞,并調整神經網絡電路,使其不與特定的輸入提示結合使用。
再次,我們將讓一群人與大型語言模型進行交互。這次,我們將提供三種(或更多)可能的答案。我們可以讓大型語言模型對提示做出多次響應,并在選擇擊打臂時引入一些隨機性(你沒忘了這些吧?)。我們有時不會選擇激活程度最高的擊打臂,而是選擇激活程度第二高或第三高的擊打臂。這會給出不同的文本答案,我們會要求人們選擇他們最喜歡的答案、第二喜歡的答案,等等。現在我們有了備選答案和數字。現在我們可以使用強化學習來調整神經網絡電路。
實際上,我們會利用這些“贊”和“踩”的反饋來訓練第二個神經網絡,預測人們會給出“贊”還是“踩”的反饋。如果這個神經網絡能夠足夠準確地預測人們的偏好,那么我們就可以用第第二個神經網絡來猜測語言模型的回復可能會得到“贊”還是“踩”,并以此來訓練語言模型。
強化學習是如何將文本生成視為一個游戲,其中每個動作都是一個單詞。在一個序列的末尾,語言模型會被告知它是得了分還是丟了分。語言模型并不像上一節討論的那樣嚴格進行前瞻,但在某種意義上,它已經被訓練來預測哪些單詞會得到點贊。大型語言模型仍然沒有明確的目標,但它有一個“獲得點贊”的隱含目標(或者我們也可以說它有一個“讓普通人滿意”的隱含目標),并且已經學會將對某些提示的某些反應與獲得點贊聯系起來。這具有許多規劃的特質,但沒有明確的前瞻機制。更像是它記住了獲得獎勵的策略,這些策略在很多情況下都有效。
RLHF 是否能讓 ChatGPT 更智能,關鍵在于它能讓 ChatGPT 更有可能做出我們期望看到的那種反應。它看起來更智能,是因為它的輸出似乎傳達了一種感覺,它理解我們輸入的意圖,并且有自己的回應意圖。這只是一種錯覺,因為它仍然只是在對單詞進行編碼和解碼。不過話說回來,這正是我們開始寫這篇文章的原因。
指令調整和 RLHF 也使 ChatGPT 能夠抵御某些類型的濫用,例如生成種族主義、性別歧視或政治色彩濃厚的內容。這種情況仍然存在,而且無論如何,舊版本的 GPT-3 一直能夠做到這一點。然而,作為一項面向公眾的免費服務,ChatGPT 針對某些類型的濫用所設置的阻力傳達了一種安全感。它還能防止將觀點當作事實提供,這也消除了一種對用戶的潛在危害。
使用強化學習來修改預訓練語言模型并非新鮮事。它至少可以追溯到 2016 年,并已用于提高大型語言模型的安全性。大多數基于強化學習的大型語言模型調優方法都會使用第二個模型來提供獎勵,ChatGPT 也采用了這種方法。ChatGPT 的顯著特點在于其使用強化學習進行調優的系統的規模,以及大規模的人工反饋收集工作。
10.結束
當我手繪神經網絡時,它看起來像鯨須。總之,我希望我已經能夠撥開一些關于大型語言模型的面紗。


























