Andrej的最新AI課: 大語言模型LLM深入詳解 | 5萬字完整版·附視頻

以下文章來源於Web3天空之城 ,作者天空之城城主

整理:Web3天空之城

【城主說】在這個星球上能把大模型原理講得最深入淺出的大神,私以爲OpenAI創始人之一的Andrej Karpathy是毫無疑問的最佳候選人之一。看過他之前講座的同學一定能贊同這個說法。

Andrej昨天放出了一個3.5小時的長篇視頻講座,如大神原話,在這個講座裡,他面向大衆完整討論了ChatGPT 及相關產品的技術原理 ,深入探討驅動 ChatGPT 及相關產品的 LLM 人工智能技術。整個講座涵蓋了模型開發的完整訓練流程,以及如何理解其“心理模型”,以及如何在實際應用中最好地利用它們。

Andrej大約一年前已經制作了一個“LLM 簡介”視頻,但他認爲那只是對一次隨機演講的重新錄製,所以希望製作一個更全面、更詳盡的版本。

這個講座剛發佈到網上,但已經被譽爲"可能是最好大模型的深入科普”,基本上,城主認爲如果想要從零深入瞭解大語言模型,這就是你能找到的最好資料了。

這個講座的完整中英視頻可以在本城B站觀看,有興趣的同學可以配合服用:【大神Andrej Karpathy最新講座:深入探討ChatGPT類大語言模型-嗶哩嗶哩】 https://b23.tv/pjyRR5g

本城整理了講座全文共5萬字。講座並不含特別的ppt,直接學習文字版也非常順暢。推薦給想認真瞭解學習大模型的各位。

最後值得一提的是,這個講座裡, Andrej特別點讚了DeepSeek開源R1和公開論文的重要性,或許這正是激勵他做出這個完整講座的原因之一:

“許多公司,例如OpenAI等大型語言模型提供商,內部已嘗試使用強化學習微調大型語言模型,但鮮有公開討論。所有工作都在公司內部進行。

DeepSeek論文的意義在此凸顯。這篇來自DeepSeek AI公司的論文,首次公開討論了大型語言模型的強化學習微調,及其重要性以及如何提升模型的推理能力。這篇論文重新激發了公衆對使用強化學習訓練大型語言模型的興趣,並提供了許多複製結果及模型實際運行所需的細節信息。”

講座中涉及的各個引用鏈接:

ChatGPT:https://chatgpt.com/

FineWeb (預訓練數據集):

https://huggingface.co/spaces/HuggingFaceFW/blogpost-fineweb-v1

Tiktokenizer:https://tiktokenizer.vercel.app/

Transformer神經網絡3D可視化工具:https://bbycroft.net/llm

llm.c 讓我們復現GPT-2:

https://github.com/karpathy/llm.c/discussions/677

Meta的Llama 3論文:https://arxiv.org/abs/2407.21783

Hyperbolic,用於基礎模型的推理:https://app.hyperbolic.xyz/

InstructGPT關於SFT(監督微調)的論文:

https://arxiv.org/abs/2203.02155

HuggingFace推理playground:

https://huggingface.co/spaces/huggingface/inference-playground

DeepSeek-R1論文:https://arxiv.org/abs/2501.12948

TogetherAI Playground,用於開放模型推理:

https://api.together.xyz/playground

AlphaGo論文 (PDF):

https://discovery.ucl.ac.uk/id/eprint/10045895/1/agz_unformatted_nature.pdf

AlphaGo第37步視頻:https://www.youtube.com/watch?v=HT-UZkiOLv8&t=0s

LM Arena,用於模型排名:https://lmarena.ai/

AI新聞通訊:https://buttondown.com/ainews

LMStudio,用於本地推理:https://lmstudio.ai/

我在視頻中使用的可視化UI:https://excalidraw.com/

我們構建的Excalidraw的特定文件:

https://drive.google.com/file/d/1EZh5hNDzxMMy05uLhVryk061QYQGTxiN/view?usp=sharing

Eureka Labs和本視頻的Discord頻道:

https://discord.gg/3zy8kqD9Cp

-講座全文·天空之城整理版-

大家好。我一直想製作這個視頻,它將全面但通俗地介紹大型語言模型,例如ChatGPT。我的目標是幫助大家理解這項工具,形成相應的思維模型。它在某些方面令人驚歎,但在其他方面表現不佳,並且還存在許多值得關注的問題。

那麼,這個文本框背後究竟是什麼?你可以輸入任何內容並按下回車鍵,但我們應該輸入什麼?生成的文字是什麼?它是如何工作的?你究竟在與什麼對話?我希望在這個視頻中涵蓋所有這些主題,完整地講解這些模型的構建過程,併力求讓所有內容都易於理解。

讓我們首先看看如何構建像ChatGPT這樣的模型,同時我也會討論這些工具的認知心理學意義。讓我們開始構建ChatGPT。這將分爲多個階段,按順序進行。第一階段是預訓練階段。

預訓練階段的第一步是下載和處理互聯網數據。爲了瞭解這大致是什麼樣子,我建議您訪問Hugging Face公司收集、創建和整理了一個名爲FineWeb的數據集,這篇博文詳細介紹了他們的構建過程。所有主要的LLM提供商,例如OpenAI、Anthropic和Google等,都會在其內部擁有類似FineWeb數據集的東西。

我們想要從互聯網上獲取大量公開來源的文本數據。我們需要海量的高質量、多樣化的文檔,因爲我們希望這些模型擁有豐富的知識。因此,我們需要高質量文檔的大量多樣性,並且需要很多很多這樣的文檔。實現這一點相當複雜,需要多個階段才能完成。讓我們來看一下其中一些階段。

我想指出的是,例如FineWeb數據集,它相當能代表您在生產級應用程序中看到的內容,最終僅佔用大約44TB的磁盤空間。這幾乎可以存儲在一個今天的單個硬盤上。所以最終這並不是一個巨大的數據量,即使互聯網非常龐大,我們處理的是文本數據,並且我們也進行了積極的過濾。在這個例子中,我們最終得到了大約44TB的數據。

讓我們來看一下這些數據是什麼樣的,以及這些步驟中的一些內容。對於許多這樣的工作,起點以及最終貢獻大部分數據的……

數據源自Common Crawl,這是一個自2007年以來持續掃描互聯網的組織。截至2024年,Common Crawl已索引27億個網頁,其爬蟲不斷在互聯網上爬取信息。這通常是從種子網頁開始,遵循所有鏈接,不斷索引信息,最終積累大量互聯網數據,成爲許多此類工作的起點。

Common Crawl數據較爲原始,需要進行多階段過濾。首先是URL過濾,即使用域名黑名單過濾掉惡意軟件、垃圾郵件、營銷、種族主義、成人等網站,這些網站不會被納入數據集。

其次是文本提取。爬蟲保存的是網頁的原始HTML,包含標記、CSS等計算機代碼。我們需要提取網頁文本內容,因此需要進行過濾和處理,提取優質內容。

然後是語言過濾。例如,FineWeb使用語言分類器,只保留英語比例超過65%的網頁。這是一個設計決策,不同的公司會選擇不同的語言比例,這會影響模型的多語言性能。FineWeb專注於英語,其訓練出的語言模型在英語方面表現出色,但在其他語言方面可能較弱。

除了以上步驟,還有其他過濾步驟,例如重複數據刪除和刪除個人身份信息(PII),如地址、社會安全號碼等。這些步驟旨在清洗數據,確保數據集的質量和安全性。

但這確實是預處理中相當重要的一部分,最終你會得到,例如,FineWeb數據集。點擊它後,可以看到一些實際效果示例,任何人都可以在Hugging Phase網頁上下載它。這裡有一些最終出現在訓練集中的文本示例,例如一篇關於2012年龍捲風的文章,以及一些關於2012年龍捲風及其發生情況的內容。另一個例子是一篇關於人體內兩個像9伏電池大小的黃色腎上腺的醫學文章,有點奇怪。可以把這些想象成互聯網上的網頁,只是以各種方式過濾了文本。

現在我們有了大量的文本,40TB,這將成爲下一步的起點。我想讓你們直觀地瞭解我們現在所處的位置,所以我取了這裡的前200個網頁——記住我們有很多網頁——我只是把所有文本放在一起,連接起來。這就是我們最終得到的結果:這些原始文本,原始的互聯網文本,即使在這200個網頁中也有大量文本。我可以在此處繼續縮小比例,我們只是擁有這幅巨大的文本數據織錦。這些文本數據包含所有這些模式,我們現在要做的是,我們要開始使用這些數據訓練神經網絡,以便神經網絡能夠內化並模擬這些文本的流動方式。所以我們只是擁有這巨大的文本結構,現在我們想要獲得能夠模仿它的神經網絡。

好,現在在我們把文本輸入神經網絡之前,我們必須決定如何表示這些文本以及如何將其輸入。現在,我們的這項技術對於這些神經網絡的工作方式是,它們期望一個一維符號序列,並且它們需要一組有限的可能的符號。因此,我們必須決定符號是什麼,然後我們必須將我們的數據表示爲這些符號的一維序列。所以現在我們擁有一維文本序列,它從這裡開始,然後到那裡,再到這兒,等等。所以這是一個一維序列,儘管在我的顯示器上,它當然是二維佈局的,但是它是從左到右,從上到下,對吧?所以它是一個文本的一維序列。

現在,既然是計算機,當然這裡有一個底層的表示。所以我如果使用所謂的UTF-8編碼這個文本,那麼我就可以得到與計算機中這個文本對應的原始位。看起來像這樣。所以事實證明,例如,這裡最前面的這個條形代表前八位,作爲一個例子。那麼這個東西是什麼呢,對吧?從某種意義上說,這就是我們正在尋找的表示。我們只有兩種可能的符號,0和1,並且我們有一個非常長的序列,對吧?事實證明,在我們的神經網絡中,這個序列長度實際上是一種非常有限和寶貴的資源,我們實際上不希望出現僅由兩個符號組成的極長序列。

相反,我們想要權衡詞彙表符號大小和由此產生的序列長度。我們不希望只有兩個符號和極長的序列,而是需要更多符號和更短的序列。

一種簡化序列的方法是將連續的八位比特組合成一個字節。由於比特只有開或關兩種狀態,八位比特共有256種組合。因此,可以將序列重新表示爲字節序列,長度縮短八倍,但符號數量增加到256個(0到255)。 我建議不要將這些數字視爲數值,而應視爲唯一的ID或符號,例如獨特的emoji。

事實上,先進的語言模型會進一步縮短序列長度,因爲增加詞彙表符號是寶貴的資源。方法是運行字節對編碼算法,該算法尋找常見的連續字節或符號,例如“116, 32”。將這類對組合成一個新的符號(例如ID爲256),並替換所有出現的“116, 32”。 此算法可以迭代多次,每次都減少序列長度並增加符號數量。實踐中,一個不錯的詞彙量大小約爲100,000個符號,例如GPT-4使用100,277個符號。將原始文本轉換爲這些符號(或標記)的過程稱爲標記化。

接下來,我們看看GPT-4如何進行標記化,將文本轉換爲標記,以及將標記轉換回文本的過程。 我推薦一個網站TickTokenizer來探索標記表示,選擇CL100K Base(GPT-4基礎模型標記器)。在左側輸入文本,它會顯示標記化結果。例如,“你好,世界”被標記化爲兩個詞元:“你好”(ID爲15339)和“世界”(ID爲1917)。 將這兩個詞元連接起來,仍然得到兩個詞元,而非一個。

後跟詞元“你好,世界”(不包含“H”)。如果我在“你好”和“世界”之間添加兩個空格,這將是不同的分詞結果。這兒有一個新的詞元220。好吧,你可以自己嘗試一下,看看會發生什麼。還要記住,這是區分大小寫的。所以如果這是一個大寫的“H”,那就是其他的東西了。或者如果它是“你好,世界”,那麼實際上它最終會變成三個詞元,因爲只有兩個詞元。是的,你可以玩一下這個,從而對這些標記的工作方式有一個直觀的感受。我們稍後會在視頻中再次回到標記化部分。

現在,我只是想讓你看看這個網站。我想讓你看看這段文本最終會被GPT-4解讀成什麼樣子。例如,如果我取其中一行,這就是GPT-4看到的樣子。所以這段文本將是一個長度爲62的序列。這就是這裡的序列。這就是文本塊與這些符號的對應關係。同樣,這裡有100,277個可能的符號。現在我們有了這些符號的一維序列。是的,我們稍後會回到標記化,但現在就到這裡。

好,我現在所做的就是,我取了數據集中這段文本序列,並使用我們的分詞器將其表示爲一系列標記。這就是它現在的樣子。例如,當我們回到FindWeb數據集時,他們提到這不僅是44TB的磁盤空間,而且在這個數據集中大約有15萬億個標記序列。所以這裡,這些只是一些這個數據集的前幾千個標記,我想,但請記住這裡有15萬億個標記。再一次,請記住,所有這些都代表小的文本塊,它們都只是這些序列的原子。這裡的數字沒有任何意義,它們只是唯一的ID。

好,現在我們進入有趣的部分,那就是神經網絡訓練。在訓練這些神經網絡時,這是計算上許多繁重工作發生的地方。所以我們在這步中要做的是,我們想對這些標記在序列中如何相互遵循的統計關係進行建模。因此,我們進入數據,並提取標記窗口。因此,我們相當隨機地從這些數據中選取一個標記窗口。窗口的長度可以在零個標記到我們決定的最大大小之間任意取值。例如,在實踐中,您可以看到一個包含例如8000個標記的標記窗口。原則上,我們可以使用任意長度的標記窗口,但是處理非常長的窗口序列在計算上將非常昂貴。所以我們只是決定,比如說8000是一個好數字,或者4000,或者16000,然後我們就截斷到那裡。在此示例中,我將選取前四個標記,以便所有內容都能很好地顯示。這些標記,我們將選取一個包含四個標記的窗口,分別是bar、view、ing和space single,這些是它們的標記ID。

我們現在要做的是預測序列中接下來出現的標記。例如,接下來是3962。我們將這四個標記稱爲上下文,它們作爲神經網絡的輸入。神經網絡的輸入是可變長度的標記序列,長度在零到某個大小(比如8000)之間。輸出是對接下來會發生什麼的預測。

由於我們的詞彙表有100277個可能的標記,神經網絡將輸出100277個數字,每個數字對應於該標記作爲序列中下一個標記的概率。神經網絡最初是隨機初始化的,因此在訓練開始階段,這些概率也是隨機的。例如,對於“空格方向”,神經網絡可能預測其概率爲4%,“11799”的概率爲2%,“3962”(即post)的概率爲3%。我們知道正確的答案是3962。

我們有一個數學過程來更新神經網絡,調整其概率,使正確答案(3962)的概率更高,而其他標記的概率更低。更新後,神經網絡可能會預測“post”的概率爲4%,“case”的概率爲1%,“direction”的概率爲2%。

這個過程並非只發生在一個標記上,而是發生在整個數據集中的所有標記上。我們採樣小的窗口批次,在每個標記上,我們都調整神經網絡,使該標記的概率略微提高。所有這些都在這些標記的大批量數據中並行發生。

訓練神經網絡的過程是一系列更新過程,使它的預測與訓練集中實際發生的統計數據相匹配,並使其概率與這些標記在數據中如何相互跟隨的統計模式保持一致。

讓我們簡要了解這些神經網絡的內部結構。神經網絡內部包含輸入,即標記序列。例如,四個輸入標記,但數量可以從零到一千甚至更多,理論上無限。然而,處理無限數量的標記計算成本過高,因此將其限制在一定長度,即模型的最大上下文長度。

這些輸入與神經網絡的參數或權重一起構成一個巨大的數學表達式。現代神經網絡擁有數十億個參數,最初這些參數是隨機設置的,因此神經網絡會做出隨機預測。

通過迭代更新網絡的過程,即訓練神經網絡,調整參數設置,使神經網絡的輸出與訓練集中的模式一致。可以將這些參數想象成DJ設備上的旋鈕,旋轉它們會得到不同的預測。訓練神經網絡就是找到與訓練集統計數據一致的參數設置。

這個巨大的數學表達式包含數萬億項,但簡單來說,就是將輸入(例如x1、x2)與權重(例如w0、w1、w2、w3)通過乘法、加法、指數運算、除法等運算混合。設計高效的數學表達式是神經網絡架構研究的主題,目標是使其具有表達性、可優化性和可並行性等特性。本質上,這些表達式只是將輸入與參數混合以進行預測,優化過程旨在使預測結果與訓練集一致。

爲了展示實際生產級示例,我建議訪問一個網站,該網站對其中一個網絡進行了可視化。該網站展示的生產環境中使用的網絡被稱爲Transformer,一個特定網絡大約有85,000個參數。頂部接收輸入,即標記序列。

然後,信息流經神經網絡,直到輸出logit softmax。這些是關於接下來會發生什麼的預測,也就是下一個標記是什麼。

一系列變換以及表達式內部產生的中間值,都在預測接下來會發生什麼。例如,這些標記被嵌入到一種叫做分佈式表示的東西中,每個可能的標記在神經網絡內部都有一個向量表示。首先,我們嵌入標記,然後這些值像流過圖一樣。這些單獨來看都是非常簡單的數學表達式,例如層歸一化、矩陣乘法、softmax等等,這就是Transformer的注意力塊。然後信息流入多層感知器塊等等,所有這些數字都是表達式的中間值。

你可以將這些視爲合成神經元的放電速率,但我提醒你,不要把它想得太像神經元,因爲這些神經元與大腦中的神經元相比極其簡單。生物學上的神經元是非常複雜動態過程,具有記憶功能等等,而這個表達式中沒有記憶,它是一個從輸入到輸出的固定數學表達式,無狀態的。所以與生物神經元相比,這些神經元非常簡單,但你仍然可以鬆散地將其視爲一塊合成腦組織。因此,信息流經所有這些神經元,直到我們得到預測。

我實際上不會過多地關注所有這些轉換的精確數學細節,我覺得沒那麼重要。重要的是要理解這是一個數學函數,由一些固定的參數進行參數化,比如說85000個參數。它是一種將輸入轉換爲輸出的方法,當我們調整參數時,我們會得到不同類型的預測結果。然後我們需要找到這些參數的一個好的設置,以便預測結果與在訓練集中看到的模式相匹配。所以這就是Transformer。

我已經向你們展示了神經網絡的內部結構,並且我們也討論了一點關於訓練它的過程。我想再介紹一下使用這些網絡的另一個主要階段,那就是所謂的推理階段。在推理階段,我們所做的是從模型中生成新的數據,看看它在其網絡參數中內化了哪些模式。

從模型中生成數據相對來說很簡單。我們從一些標記開始,這些標記基本上是你的前綴,就像你想要開始的內容一樣。假設我們想從標記91開始,我們把它輸入網絡。網絡會給我們概率,一個概率向量。我們可以根據此概率分佈對標記進行採樣,模型賦予高概率的標記更有可能被採樣。

你可以這樣理解:我們從分佈中採樣以獲得單個唯一標記,例如標記860。在模型生成過程中,860可能是下一個標記,它是一個相對可能的標記,但並非唯一可能。

例如,在訓練示例中,860確實緊跟在91之後。假設我們繼續這個過程,在91之後是860,我們把它附加進去。然後採樣得到第三個標記,假設是287。重複這個過程,得到長度爲三的序列,再採樣得到第四個標記,以此類推。

然而,最終得到的標記13659並非之前看到的3962,它是一個“article”標記,表示查看一篇單獨的文章。因此,我們並沒有完全複製訓練數據中的序列。

這些系統是隨機的,我們正在進行採樣,如同拋硬幣。有時我們會幸運地複製訓練集中的某一小部分,但有時會得到訓練數據中任何文檔都不包含的標記。所以我們會得到訓練數據某種混合,因爲每一步都可能得到略微不同的標記。一旦該標記進入,後續採樣會快速生成與訓練文檔中出現的標記流非常不同的標記流。

統計上,它們會有相似的屬性,但它們與訓練數據並不相同,它們像是受訓練數據啓發的。例如,我們得到“article”,是因爲它在“bar”、“viewing”、“single”等上下文中是一個相對可能的標記,在訓練文檔中可能在某個地方跟隨這個上下文窗口。我們只是碰巧在這個階段對其進行了採樣。

基本上,推理就是一次預測一個這些分佈,我們繼續反饋標記並獲取下一個標記,一直在進行採樣。根據我們的“運氣”,我們可能會得到非常不同的模式。這就是推理。

在大多數情況下,下載互聯網並將其標記化是一個預處理步驟,只需要做一次。

一旦獲得標記序列,即可開始訓練神經網絡。實際操作中,需嘗試訓練多種不同類型的神經網絡,它們擁有不同的設置、排列和規模,因此需要進行大量神經網絡訓練。

訓練完成後,對獲得的特定參數滿意後,即可使用該模型進行推理,並從中生成數據。例如,使用ChatGPT與模型對話時,該模型很可能在幾個月前由OpenAI訓練完成,並擁有效果良好的特定權重。與模型對話的過程僅是推理,不再進行訓練,參數保持不變,你只需提供標記,模型便會完成標記序列生成。

接下來,我們以OpenAI的GPT-2爲例,具體說明訓練和推理過程。GPT代表生成式預訓練變換器(Generatively Pre-trained Transformer),GPT-2是OpenAI GPT系列的第二個迭代版本,發表於2019年。選擇GPT-2是因爲它是首次將可識別的現代技術棧整合在一起,所有組成部分在今天的現代標準下都是可識別的,只是規模更小。

GPT-2是一個Transformer神經網絡,擁有16億個參數。如今,現代Transformer的參數數量更接近於萬億或幾百億。GPT-2的最大上下文長度爲1024個token,這意味着在預測序列中的下一個token時,上下文最多不超過1024個token。根據現代標準,這也相對較小,如今的上下文長度更接近幾十萬,甚至可能達到一百萬。

GPT-2能夠更好地預測序列中的下一個token,其訓練使用了約1000億個詞元,按照現代標準,這規模較小。相比之下,精細網頁數據集包含15萬億個詞元,因此1000億個詞元數量相當少。

作爲LLM.C項目的一部分,我嘗試重現GPT-2。相關記錄已發佈在GitHub上的LLM.C倉庫中。2019年訓練GPT-2的成本估計約爲4萬美元,而如今,同樣的工作只需一天時間和600美元,甚至可以降低到約100美元。

成本下降如此之多,主要原因在於數據集質量的提升以及數據處理方式的改進。此外,硬件速度的顯著提升和模型運行軟件的優化也功不可沒,這些都促進了模型訓練效率的提高。

我無法詳細介紹GPT-2的復現過程,但這篇文章將幫助你直觀地瞭解研究人員訓練這些模型的過程。

我正在訓練一個GPT-2模型,每一行都代表一次模型更新,改進對標記預測的準確性,更新神經網絡的權重或參數,以便更好地預測序列中的下一個標記。每一行都改進對訓練集中一百萬個標記的預測,我們試圖改進對這些標記中每一個作爲序列中下一個標記的預測。

需要密切關注的是“損失”數值,它反映神經網絡的運行情況,數值越低越好。隨着模型更新的進行,損失值逐漸減少,這表示對序列中下一個標記的預測越來越準確。

損失值是神經網絡研究人員關注的關鍵指標。 訓練過程中,我們會耐心等待,觀察損失值是否隨每次更新而下降,並以此判斷網絡預測能力是否提升。

本次訓練中,每次更新處理一百萬個詞元,每次更新耗時約七秒鐘,共進行32000步優化,總計處理約330億個詞元。目前已完成420步,僅完成1%多一點,因爲訓練時間僅約10到15分鐘。 模型每20步進行一次推理,預測序列中的下一個標記。

推理過程從隨機開始,逐個預測標記。 目前生成的文本不夠連貫,這是因爲訓練過程僅完成1%。 輸出結果類似於胡言亂語,但仍然具有一定的局部連貫性,例如“既然她是我的,這是信息的一部分,應該討論我的父親、偉大的同伴們,戈登向我展示了坐在它上面的場景,等等”。 與訓練初始階段相比,模型性能已有所提升。

如果訓練完成全部32000步,模型將能夠生成相當連貫的英語文本,標記流傳輸正確,英語表達也更流暢。這還需要一兩天的時間。 目前階段,我們只需關注損失值的下降,確保訓練過程順利進行。

接下來,我們討論計算資源方面的問題。由於模型規模龐大,無法在個人電腦上運行,因此訓練過程在雲端計算機上進行。

本次訓練使用的計算資源爲一個8xh100節點,即單機擁有八個h100 GPU。這臺機器是租用的雲端服務器。

我並不確定它的物理位置。我使用的是名爲Lambda的租賃服務,但許多其他公司也提供類似服務。向下滾動即可看到這些公司提供的按需定價的配備h100(即GPU)的電腦,稍後我會展示它們的樣子。例如,按需8個NVIDIA h100 GPU的機器,每小時每GPU的價格爲3美元。您可以租用它們,然後在雲端獲得一臺可登錄並訓練模型的機器。這些GPU,長這樣。這就是一塊H100 GPU,您可以把它插進電腦裡。

GPU非常適合訓練神經網絡,因爲神經網絡計算量很大,但計算中存在大量的並行性。因此,許多獨立的工作單元可以同時工作,來解決訓練這些神經網絡底層使用的矩陣乘法運算。這只是一塊H100,實際上你會把多塊放在一起。您可以將八塊堆疊在一個節點中,然後可以將多個節點堆疊成一個完整的數據中心或一個完整的系統。所以當我們看數據中心時,我們會看到這樣的東西:一塊GPU,變成八塊GPU,變成一個系統,變成多個系統。這些都是更大的數據中心,它們當然會貴得多。

現在,所有大型科技公司都非常需要這些GPU,以便能夠訓練所有這些大型語言模型,因爲它們非常強大。這從根本上驅動了英偉達的股價達到今天的3.4萬億美元,也解釋了爲什麼英偉達會如此爆炸式增長。所以這就是淘金熱。淘金熱的關鍵在於獲取GPU,獲得足夠的GPU,以便它們能夠協同工作以執行此優化。它們都在做什麼?它們都在協同預測像FindWeb數據集這樣的數據集上的下一個token。

這就是計算工作流程,它極其昂貴。你擁有的GPU越多,你可以嘗試預測和改進的token就越多,你處理這個數據集的速度就越快,你可以迭代得更快,獲得更大的網絡,訓練更大的網絡,等等。所以這就是所有這些機器正在做的,這就是爲什麼所有這一切都如此重要。例如,這是大約一個月前的一篇文章。這就是爲什麼例如埃隆·馬斯克在一個單一數據中心獲得10萬個GPU是一件大事。所有這些GPU都極其昂貴,耗電量巨大,而且它們都在嘗試預測序列中的下一個標記,並通過這樣做來改進網絡,並且可能會比我們在這裡看到的更快地獲得更多連貫的文本。

不幸的是,我沒有幾千萬甚至上億美元來訓練這樣一個大型模型,但幸運的是,我們可以求助於一些大型科技公司,他們定期訓練這些模型,並在訓練完成後,會發布部分模型。訓練這些網絡耗費了大量的計算資源,並在優化結束後發佈。這非常有用,因爲訓練過程耗費巨大。許多公司定期訓練這些模型,但實際上很少有公司會發布這些所謂的基模型。最終的模型被稱爲基模型。

什麼是基模型?它是一個標記模擬器,一個互聯網文本標記模擬器。它本身並沒有什麼用,因爲我們想要的是助手,可以提問並得到回答。這些模型做不到這一點,它們只是創造了一種互聯網的混搭,夢想着互聯網頁面。基模型並不經常發佈,因爲它們只是幾個步驟中的第一步,還需要其他步驟才能獲得一個助手。

然而,一些模型已經發布。例如,GPT-2模型在2019年發佈了15億參數的版本。這個GPT-2模型就是一個基模型。那麼,什麼是模型發佈?發佈這些模型是什麼樣的呢?例如GitHub上的GPT-2代碼庫。

發佈模型需要兩樣東西。首先,需要Python代碼,詳細描述模型中執行的一系列操作。這段代碼實現了神經網絡的正向傳播,包含神經網絡連接的具體細節。這只是幾百行代碼,相當容易理解且標準化。不標準的是參數,這是實際價值所在。

神經網絡的參數存儲在哪裡呢?由於有15億個參數,需要正確的設置。除了源代碼,還需要發佈參數,大約15億個數字。這是一個包含15億個數字的列表,是所有旋鈕的精確設置,以便令牌能夠良好地輸出。因此,需要這兩樣東西才能獲得基模型的發佈。

現在,GPT-2已經發布,但它是一個相當舊的模型。我們將要轉向的模型是LLAMA-3。LLAMA-3與GPT-2(15億參數,基於1000億個token訓練)相比,是一個更大、更現代的模型。它由Meta發佈和訓練,包含4050億參數,並基於15萬億個token進行訓練,方式相似,只是規模大得多。

Meta發佈了LLAMA-3,論文中對此進行了詳細介紹,並着重闡述了其發佈的最大基礎模型LLAMA-3.1 4.5,這是一個擁有4050億參數的模型。

除了基礎模型,Meta還發布了指令模型,這是一個可以進行問答的助手功能,我們稍後會詳細介紹。目前,讓我們先關注這個基礎模型——一個token模擬器。我們將試用它,並探討其運作機制以及大型神經網絡與海量數據訓練後最終的結果。

我最推薦體驗基礎模型的平臺是Hyperbolic公司,它提供了4050億參數的LLAMA-3.1基礎模型。使用時,請確保選擇此模型(可能需要註冊)。設置最大標記數爲我們期望生成的標記數量,這裡爲了節省計算資源,我們將標記數減少至128。

此過程與推理過程相同,模型會基於給定前綴繼續生成標記序列。但需要注意的是,此模型並非助手模型。例如,提問“2加2等於多少?”,它不會直接回答“等於4”,因爲它只會根據詞元概率預測下一個詞元,本質上是一個非常昂貴的自動補全功能,根據訓練數據(網頁等)中的統計信息預測後續內容。

實際測試中,模型雖然回答了問題,卻也走向了哲學討論。再次嘗試後,結果仍然如此。這表明系統每次輸入都從頭開始,具有隨機性。相同的標記前綴會產生不同的答案,因爲模型從概率分佈中進行採樣,每次得到不同的樣本,從而進入不同的領域。

讓我們再試一次。它就這樣繼續下去了,它只是在重複互聯網上的統計模式。首先,它還不是一個助手,而是一個標記自動完成工具,其次,它是一個隨機系統。

即使這個模型本身對於許多應用來說還不夠完善,它仍然非常有用,因爲它在預測序列中下一個標記的任務中,已經學習了很多關於世界的知識,並將所有這些知識存儲在網絡的參數中。我們的文本來自互聯網網頁,所有這些都壓縮在網絡的權重中。

你可以把這4050億個參數看作是對互聯網的一種壓縮,一個壓縮文件,但它不是無損壓縮,而是有損壓縮。我們好像只剩下互聯網的一種整體印象,我們可以從中生成內容。我們可以通過相應地提示基礎模型來引出其中的一些知識。例如,“這是我的最佳情侶景點Top 10清單”,我這樣做是爲了引導模型繼續這個列表。

它已經開始列出清單,並給出了一些地標性景點。注意,它試圖提供很多信息,你可能無法完全相信這裡的一些信息,因爲它只是對一些互聯網文檔的回憶。互聯網數據中頻繁出現的內容比很少出現的內容更可能被正確記住,所以你不能完全相信這裡的一些信息,因爲這只是對互聯網文檔模糊的回憶,信息並沒有顯式地存儲在任何參數中,這完全是模型的回憶。

話雖如此,我們確實得到了一些可能大致正確的結果,而我實際上並沒有專業知識來驗證這是否大致正確。但是你會看到我們已經引出了模型的大量知識,而這些知識並不精確,是模糊的、概率的和統計的。模型中更容易記住的是那些經常發生的事情。

現在,我想展示更多關於這個模型行爲的例子。我首先去維基百科查看了斑馬的頁面,複製粘貼第一句甚至更長的句子。當我點擊回車鍵時,我們會得到什麼樣的補全結果呢?

現存三種斑馬,等等等等。模型在這裡生成的文本是對維基百科詞條的精準複述,它純粹是憑藉記憶來背誦這篇維基百科詞條,這種記憶存儲在其參數中。所以,有可能在這些512個token中的某個時刻,模型會偏離維基百科詞條,但是你可以看到它在這裡記住了大量的文本。

讓我看看這句話是否出現過。好,我們仍在正軌上。讓我在這裡檢查一下。好,我們仍在正軌上。它最終會偏離主題。

好,所以這個東西在很大程度上只是背誦出來的,它最終會偏離,因爲它無法準確記住。現在,發生這種情況的原因是這些模型在記憶方面可能非常出色,通常,這並不是你在最終模型中想要的。這叫做反芻,通常情況下,直接引用你訓練過的數據是不好的。

發生這種情況的原因實際上是,對於許多文檔,例如維基百科,當這些文檔被認爲是高質量的來源時,在訓練模型時,你往往會優先從這些來源中採樣。所以基本上,模型可能在這個數據上進行了幾個輪次的訓練,這意味着它可能看過這個網頁大約10次左右。這有點像你,如果你反覆閱讀某種文本很多次,比如說讀了100遍,那麼你就能背誦出來。對於這個模型來說也是非常類似的。如果它看到某個東西的次數太多了,它以後就能從記憶中背誦出來。只是這些模型比人更有效率,比如在表達方面。所以它可能只看過這個維基百科條目10次,但基本上它已經將其參數中這篇文章完全記住了。

好,接下來我想向你展示一些模型在訓練期間絕對沒有見過的東西。例如,如果我們查看論文,然後導航到預訓練數據,我們會看到數據集的知識截止日期是2023年底。所以它沒有見過此時間點後的文檔。當然,它也沒有看到任何關於2024年選舉及其結果的信息。

現在,如果我們用未來的標記來引導模型,它將繼續標記序列,並且它將根據其自身參數中擁有的知識做出最佳猜測。讓我們看看那會是什麼樣子。因此,共和黨可能會獲勝,好的,美國總統,自2017年起。讓我們看看它在這點之後會說什麼。例如,模型將不得不猜測競選夥伴以及對手是誰等等。讓我們按回車鍵。所以這裡提到邁克·彭斯是競選夥伴,而不是J.D.彭斯。而且這張選票是反對希拉里·克林頓和蒂姆·凱恩的。所以這可能是一個有趣的平行宇宙,根據警報,可能會發生的事情。我們來取一個不同的樣本。所以是相同的提示,讓我們重新採樣。所以這裡的競選搭檔是羅恩·德桑蒂斯,他們對抗喬·拜登和卡瑪拉·哈里斯。所以這又是一個不同的平行宇宙。

所以模型會做出有根據的猜測,並根據這些知識繼續生成標記序列。我們在這裡看到的一切都被稱爲幻覺。模型只是以概率的方式做出最好的猜測。

接下來的內容我想向您展示的是,即使這是一個基礎模型,還不是一個助手模型,如果您巧妙地設計提示,它仍然可以在實際應用中使用。

這裡有一些我們可以稱之爲“少樣本提示”的例子。這指的是十對英韓單詞,每對單詞由英文單詞、冒號和韓語翻譯構成。模型通過對這十對單詞進行學習,來完成後續的“teacher:”五個token的補全任務。這些模型具備“上下文學習”能力,即在讀取上下文時,學習數據中的模式並以此進行推斷。因此,模型承擔了翻譯的角色,最終正確地將“teacher”翻譯爲“선생님”。即使只有一個基礎模型,巧妙的提示也能構建應用程序,這依賴於模型的上下文學習能力,並通過構建少樣本提示來實現。

接下來,我想展示一種通過提示實例化完整語言模型助手的方法。技巧在於將提示設計成一個網頁形式的對話,展現樂於助人的AI助手與人類之間的互動。模型將繼續這段對話。爲了編寫提示,我使用了ChatGPT,這有點“元”,但我告訴它我想創建一個基於基礎模型的OLM助手,並請它幫忙編寫提示詞。它生成的提示詞相當不錯,模擬了AI助手與人類的對話,AI助手知識淵博、樂於助人,能夠回答各種問題。僅僅給出描述是不夠的,添加一些人類助手與人類之間的對話回合,效果會更好。最後,我們將輸入實際查詢。

我將提示詞複製粘貼到基礎模型中,扮演人類角色輸入實際提示:“爲什麼天空是藍色的?”運行後,助手回答:“天空呈現藍色是因爲瑞利散射現象……”基礎模型延續了對話序列,並承擔了助手的角色。雖然模型在助手回答後,會略顯“幻覺式”地生成下一個來自人類的問題,但它成功完成了任務。如果直接向基礎模型提問“爲什麼天空是藍色的”,結果則無法預料,可能只會得到更多不相干的問題。

所以,即使只有一個基礎模型,也可以通過這種方法創建助手。

好的,這是過去幾分鐘討論內容的簡短總結。

現在,讓我們更深入地探討。這與我們目前爲止討論的內容密切相關。我們希望訓練像ChatGPT這樣的LLM助手。我們已經討論了它的第一階段,即預訓練階段。簡而言之,就是:我們獲取互聯網文檔,將其分解成標記——這些小的文本塊的原子——然後我們使用神經網絡來預測標記序列。這個階段的輸出是基礎模型,也就是這個神經網絡的參數設置。而這個基礎模型本質上是一個在標記層面的互聯網文檔模擬器,它可以生成與互聯網文檔具有相同統計特徵的標記序列。我們看到它可以用於一些應用,但實際上我們需要做得更好。我們想要一個助手,能夠回答我們提出的問題。所以我們現在需要進入第二階段,稱爲後訓練階段。

因此,我們將基礎模型——我們的互聯網文檔模擬器——交給後訓練階段。現在我們將討論幾種所謂的模型訓練後處理方法。這些訓練後階段的計算成本將低得多。大部分計算工作,所有大型數據中心以及所有繁重的計算和數百萬美元的投入都在預訓練階段。但現在我們將進入一個成本相對較低,但仍然極其重要的階段,稱爲訓練後處理階段,在這個階段我們將大型語言模型變成一個助手。

因此,讓我們看看如何使我們的模型不再只是採樣互聯網文檔,而是回答問題。換句話說,我們要開始考慮對話。這些對話可以是多輪的,可以有多個回合。在最簡單的情況下,它們是人與助手之間的對話。例如,我們可以想象對話可能如下所示:當一個人說:“2 加 2 等於幾?”助手應該這樣迴應:2 加 2 等於 4。當人類追問,如果用星號代替加號會怎樣?助手可以做出相應的迴應。同樣地,這是另一個例子,表明助手也可以擁有一定的個性,它有點友好。然後在第三個例子中,我展示了當人類要求我們不願意幫忙的事情時,我們可以產生所謂的拒絕,我們可以說我們幫不了這個忙。

所以換句話說,我們現在想做的,是思考助手應該如何與人類互動。我們想對助手及其在這些對話中的行爲進行編程。現在,因爲這是神經網絡,我們不會用代碼明確地編程這些。我們無法那樣對助手進行編程。因爲這是神經網絡,所以一切都是通過對數據集進行神經網絡訓練來完成的。正因爲如此,我們將通過創建對話數據集來隱式地對助手進行編程。因此,這些是數據集中三個獨立的對話示例。一個實際的數據集,我將向您展示一些例子,將會大得多,它可能包含數十萬個多輪對話,非常長等等。

並涵蓋廣泛的不同主題,但在這裡我只展示三個例子。這種方法的工作原理基本上是通過示例對助手進行編程。

這些數據來自哪裡?例如,2 乘以 2 等於 4,與 2 加 2 相同,等等。這來自人工標註者。我們會給人工標註者一些對話上下文,然後讓他們給出理想的助手迴應。人工會爲任何情況下的助手寫出理想的迴應。然後我們將讓模型以此進行訓練,並模仿這類迴應。

這樣做的方式是,我們將採用在預訓練階段生成的基模型,這個基模型是在互聯網文檔上訓練的。我們現在將丟棄那個互聯網文檔的數據集,並用一個新的對話數據集替換它。我們將繼續在這個新的對話數據集上訓練模型。模型會非常迅速地調整,並學習助手如何迴應人類查詢的統計規律。然後在推理階段,我們將能夠啓動助手並獲得響應,它將模仿人類標註者在這種情況下會做的事情。我們將看到這方面的例子,這將變得更加具體。

我還想提到,在這個後期訓練階段,我們將繼續訓練模型,但預訓練階段可能需要在數千臺計算機上進行大約三個月的訓練。後期訓練階段通常會短得多,例如三個小時,這是因爲我們手動創建的對話數據集遠小於互聯網上的文本數據集。這個訓練會非常短,但從根本上說,我們將採用我們的基礎模型,我們將使用完全相同的算法、完全相同的每一件事繼續訓練,只是我們將數據換成對話。

現在的問題是這些對話在哪裡,我們如何表示它們,我們如何讓模型看到對話而不是原始文本,以及這種訓練的結果是什麼,當我們談論模型時,在某種心理學意義上你會得到什麼。那麼現在讓我們來探討這些問題。讓我們從談談對話的標記化開始。

這些模型中的所有內容都必須轉換成標記,因爲所有內容都只是關於標記序列的。我們將如何將對話轉換成標記序列呢?爲此,我們需要設計某種編碼方式。這有點類似於,如果你熟悉的話(當然你也可以不熟悉),例如互聯網上的 TCP/IP 數據包。有一些精確的規則和協議來規定如何表示信息,如何將所有內容結構化在一起,以便所有這些數據都以書面形式呈現出來,並且每個人都能達成一致。所以現在大型語言模型 (LLM) 中也是同樣的情況。我們需要某種數據結構,並且需要制定一些規則來規定這些數據結構(例如對話)如何編碼和解碼到標記。

因此,我想向你展示如何在標記空間中重現這段對話。 如果你查看TickTokenizer,可以獲取這段對話的語言模型表示方式。 我們迭代了這段兩輪對話中的用戶和助手。 目前的顯示形式可能不夠美觀,但實際上它相對簡單。

最終將其轉換爲標記序列的方式較爲複雜,但用戶和助手之間的對話最終變成了49個標記,一個包含49個標記的一維序列。所有不同的LLM都會有略微不同的格式或協議,現在有點像“狂野西部”,但例如GPT-4是這樣做的:有一個特殊的標記叫做IM_start(“虛擬獨白開始”的縮寫),然後必須指定輪到誰(例如用戶,這是一個1428號標記),接着是內部獨白分隔符,然後是問題的標記,最後是IM_end(虛擬獨白的結束)。 因此,“2加2等於多少”這個問題最終變成了這些標記的序列。

需要強調的是,IM_start並非文本,而是一個新增的特殊標記,在訓練前從未出現過,是我們訓練後階段創建並引入的。 這些特殊標記(例如IM_set、IM_start等)被引入並散佈在文本中,以便模型學習“這是誰的回合開始”。 回合開始是用戶的,然後是用戶所說的話,用戶結束,新的回合由助手發起,然後是助手所說內容的標記等等。 這段對話現在變成了這個標記序列。

這裡的具體細節並不重要,我想用具體的例子展示的是,我們認爲結構化的對話,最終通過某種編碼變成了單一的標記序列。 因爲它是一個單一的標記序列,所以我們可以應用之前用過的一切方法。現在它只是一個標記序列,我們可以用它來訓練語言模型,就像之前一樣預測序列中的下一個標記,並且可以表示和訓練對話數據。

在測試階段(推理階段),假設我們已經訓練了一個模型,並用這種對話數據集訓練了模型,現在我們想進行推理。 使用ChatGPT進行推理時,假設這部分已經填寫好了,例如“2加2等於多少?”,ChatGPT的工作方式基本上是這樣的:2加2等於4。

現在,你發佈了“imend”的提示,在OpenAI或類似服務器上最終發生的情況是,他們放置了一個“imstart”助手“imsep”, 這就是流程的結束。他們構建了這個上下文,然後開始從模型中採樣。在這個階段,他們會詢問模型:“什麼是好的第一個序列?什麼是好的第一個標記?什麼是好的第二個標記?”以此類推。這就是語言模型接管並創建響應的地方,例如,看起來像這樣的響應,但它不必完全相同,如果這種類型的對話存在於數據集中,它將具有這種風格。這就是協議的大致工作方式,協議的細節並不重要。我的目標只是向你展示,最終一切都只是一個一維標記序列,所以我們可以應用我們已經看到的一切,但我們現在正在訓練對話,並且我們現在基本上也在生成對話。

現在我想談談這些數據集在實踐中是什麼樣的。我想向你們展示的第一篇論文,也是朝這個方向邁出的第一步,是OpenAI在2022年發表的論文《InstructGPT》,或者說是他們開發的技術。這是OpenAI第一次談到如何利用語言模型並針對對話對其進行微調。這篇論文有很多細節,我想帶大家一起了解一下。所以我想先來看一下第3.4節,他們討論了他們僱傭的人工標註員,這些人是從Upwork或ScaleAI招聘的。

這裡涉及到人工標註員,他們的工作是專業地創建這些對話,這些標註員被要求提出提示,然後他們也被要求完成理想的助手回覆。所以這些就是人們想出的提示類型:例如“列出五個讓我重拾職業熱情的方法”、“我接下來應該閱讀的十大科幻小說是什麼?”、“將句子翻譯成西班牙語”等等。這裡有很多人們想出的東西。他們首先提出提示,然後他們也回答該提示,並給出理想的助手迴應。

那麼他們如何知道他們應該爲這些提示編寫什麼理想的助手迴應呢?當我們向下滾動一點時,我們會看到這裡有一段摘錄,其中包含給人工標註者提供的標註說明。開發語言模型的公司,例如OpenAI,會編寫標註說明,說明人類應該如何創建理想的迴應。例如,這些標註說明會在更高的層次上要求人們樂於助人、誠實和無害。如果你想在這裡看到更多內容,可以暫停視頻。但總的來說,基本上就是回答問題,儘量有幫助,儘量誠實,不要回答我們不希望ChatGPT回答的內容。

系統之後在聊天中處理的問題,通常由公司提供的標註說明指導。這些說明通常篇幅很長,動輒數百頁,需要專業人員學習後才能撰寫出理想的助手回覆,這是一個高度依賴人工的過程,正如相關論文所述。

InstructGPT 的數據集雖然從未公開發布,但一些開源項目嘗試復現其設置,並收集自身的數據,例如 OpenAssistant 項目。這些項目旨在模仿 OpenAI 使用人工標註者創建對話的過程。

舉例來說,一個提示可能是:“請寫一個簡短的介紹,介紹‘買方壟斷’(monopsony)這一術語在經濟學中的相關性,並舉例說明。” 然後,另一個人會撰寫回復,再由另一人(或同一人)撰寫理想的回覆。這便是對話數據標註的過程,最終用於模型訓練。

訓練過程中,不可能涵蓋模型在推理期間可能遇到的所有問題和提示。但通過提供大量這樣的示例,模型在訓練過程中會學習扮演樂於助人、誠實無害的助手角色,這是一種通過示例編程的方法。

如果擁有足夠多的,例如十萬個這樣的對話示例,模型就能學習其中的統計模式,並逐漸具備助手的人格。測試時,模型可能會給出與訓練集中完全相同的答案,但更可能的是,它會給出風格類似的迴應,理解用戶期望的答案類型。

這就是我們的工作方式:通過示例編程,使系統在統計學上具備樂於助人、誠實無害的助手角色,這與公司提供的標註說明相符。

自 InstructGPT 論文發表後的兩三年裡,最先進技術取得了顯著進展,人類不再獨自承擔所有繁重的工作。語言模型能夠輔助創建數據集和對話,因此,人們從頭開始逐字逐句撰寫回復的情況已非常罕見,他們更傾向於使用現有的 LLM 生成答案,然後進行編輯。

大型語言模型 (LLM) 已經開始滲透到訓練後流程的許多方面,廣泛用於創建海量的對話數據集。例如,UltraChat就是一個現代的對話數據集,它在很大程度上是合成的,但也包含一定程度的人工參與。這些數據集的構建方式各不相同,UltraChat只是衆多SFT數據集中的一個例子。這些數據集包含數百萬次對話,大多是合成的,但可能經過人工編輯,涵蓋了廣泛的領域。它們包含各種SFT混合物,部分是合成的,部分是人工的。總的來說,我們仍然使用由對話構成的SFT數據集進行訓練。

我想消除一些關於AI對話的神秘感。當你使用ChatGPT輸入問題並按下回車鍵時,返回的結果在統計上與訓練集一致。而這些訓練集,實際上只是人類按照標註說明進行操作的種子。你在ChatGPT中對話的對象並非某種神奇的AI,而是某種在統計上模仿人類標註員的東西,這源於公司編寫的標註說明。你可以將其理解爲在詢問一位人類標註員,ChatGPT的答案是對人類標註員的模擬,就像在問“在這種對話中,人類標註員會怎麼說?”。 這些標註員並非普通的網民,而是公司僱傭的專家,例如,在回答關於代碼的問題時,參與創建數據集的人通常是受過教育的專家。所以,你是在與這些專家的模擬進行對話,而不是一個神奇的AI,而是一個平均水平、可能相當熟練的標註員的模擬。

讓我們舉個具體的例子:當我訪問ChatGPT,輸入“推薦你在巴黎看到的五大標誌性建築”,然後按下回車鍵,會發生什麼?

我該如何看待它?它並非某種神奇的AI,而是基於對OpenAI聘請的標註員進行統計模擬的結果。可以這樣理解:如果這個問題存在於OpenAI後期訓練數據集中,我很有可能看到一個與人工標註員爲這五個地標撰寫內容非常相似的答案。人工標註員通常會進行網上搜索,花約20分鐘做調查,然後列出清單。如果這個清單在數據集中,我就能看到模型給出與之類似的答案。

如果該查詢不在後期訓練數據集中,那麼模型給出的答案則更多地源於涌現現象。模型在統計上理解,訓練集中這類地標通常是顯著的、人們常想了解的,且互聯網上經常討論的地標。模型已從互聯網預訓練中獲得海量知識,可能見過大量關於地標及其相關信息的對話。所以,預訓練知識與後期訓練數據集相結合,導致了這種模仿。從統計意義上說,這就是幕後發生的大致情況。

現在我想談談LLM心理學,特別是幻覺問題。大型語言模型幻覺是指模型編造信息的情況,這是個長期存在的問題,儘管現在已有所改善。讓我們嘗試理解幻覺的來源。

舉個例子,展示訓練集中可能存在的三個對話:“誰是湯姆·克魯斯?” “湯姆·克魯斯是一位著名的美國演員和製片人。” “約翰·巴拉索是誰?” “一位美國參議員。” “成吉思汗是誰?” (此處省略對成吉思汗的描述)。人類在撰寫答案時,要麼知道答案,要麼會進行網上搜索,然後自信地給出答案。測試時,當你問一個我隨機想出的、可能不存在的人是誰……

我只是嘗試隨機生成它。問題是,當我們詢問奧森·科瓦茨是誰時,助手不會簡單地回答“哦,我不知道”。即使助手和語言模型本身可能在其內部“知道”這個人並非它熟悉的人,這種“哦,我不知道這是誰”的迴應也不會出現。

因爲模型在統計上模仿訓練集,訓練集中形如“誰是XXX”的問題都能自信地給出正確答案。所以它會採用這種回答風格,並盡其所能給出統計上最可能的猜測,基本上就是編造東西。這些模型無法訪問互聯網,不做研究,我稱它們爲統計標記翻滾器。它只是試圖對序列中的下一個標記進行採樣,基本上就是編造東西。

讓我們看看這是什麼樣子。我這裡有一個來自Hugging Face的推理遊樂場,我故意選擇了一個名爲Falcon 7B的舊模型,它已經存在幾年了,所以它會出現幻覺。這種情況最近有所改善。但讓我們問問Falcon 7B,奧森·科瓦茨是誰?運行後,它回答奧森·科瓦茨是一位美國作家和科幻小說家,這完全是假的,是一種幻覺。我們再試一次,結果是奧森·科瓦茨是1950年代電視劇中的虛構人物,這完全是胡說八道。我們再試一次,這次它是位前小聯盟棒球運動員。所以基本上模型不知道,它給了我們很多不同的答案,因爲它只是從這些概率中進行採樣。

模型從“奧森·科瓦茨是誰”開始,然後獲得這些概率,並從中進行採樣,只是想出一些東西,這些東西在統計上與它訓練集中答案的風格一致。但我們體驗到的卻是虛構的事實知識。模型基本上不知道,它只是在模仿答案的格式,不會主動去查找,因爲它只是在模仿答案。

那麼我們該如何減輕這個問題呢?例如,當我們使用ChatGPT並詢問“Orson Kovats是誰”時,OpenAI最先進的模型會告訴你它需要搜索網絡。它實際上正在嘗試使用工具,而不是像之前的模型那樣直接編造答案。而“Orson Kovats是誰”這個提問並沒有使用任何工具,我不希望它進行網絡搜索。

有一個著名的歷史公衆人物叫Orson Kovats,所以這個模型不會編造東西。此模型知道自己不知道,並會告訴你它似乎不認識這個人。所以不知何故,我們某種程度上改進了幻覺問題,即使它們在較舊的模型中顯然是一個問題。如果你的訓練集就是這樣,那麼你得到這些答案就完全說得通了。

那麼我們如何解決這個問題呢?很明顯,我們需要在我們的數據集中加入一些例子,其中助手正確的答案是模型不知道某個特定的事實。但我們只需要在模型實際上不知道的情況下才能產生這些答案。所以問題是,我們如何知道模型知道什麼或不知道什麼?我們可以根據經驗探測模型來弄清楚這一點。

讓我們以Meta如何處理Llama 3系列模型的幻覺爲例。在他們發表的這篇Meta論文中,我們可以看到幻覺,他們在這裡稱之爲事實性。他們描述了他們基本上用來詢問模型以找出它知道什麼和不知道什麼的程序,以找出其知識的邊界。然後,他們向訓練集中添加示例,對於模型不知道的內容,正確的答案是模型不知道,這在原則上聽起來很容易做到。但這大致解決了這個問題。它之所以能解決這個問題,是因爲請記住,模型實際上可能在網絡內部擁有一個相當好的自我知識模型。所以請記住,我們查看了網絡和網絡內部的所有這些神經元。你可以想象,網絡中的某個神經元會在模型不確定時亮起來。但問題是,該神經元的激活目前並沒有與模型實際說出它不知道的內容相連。因此,即使神經網絡的內部知道,因爲有一些神經元代表這一點,模型也不會顯示出來。相反,它會做出最好的猜測,以便聽起來很自信,就像它在訓練集中看到的那樣。所以我們需要基本上詢問模型,並允許它在不知道的情況下說“我不知道”。

讓我帶你瞭解一下MetaRoughly的功能。基本上,它們的功能是,這裡我有一個例子。多米尼克·哈塞克是今天的特色文章,所以我只是隨機訪問了它。它們做的基本上是從訓練集中隨機選擇一個文檔,然後選取一段,並使用LLM來構建關於該段落的問題。例如,我在這裡用chat.gpt做了這件事。我說,這是這個文檔中的一段話。基於這段話生成三個具體的客觀問題,並給出問題和答案。因此,LLM已經足夠好到可以創建和重構這些信息。所以,如果信息在這個LLM的上下文窗口中,它實際上運行得很好。它不必依賴於它的記憶。它就在上下文窗口裡。因此它基本上可以以相當高的準確率重新構建這些信息。例如,它可以爲我們生成這樣的問題:他爲哪個隊效力?

答案在這裡。他贏得了多少個盃賽?我們現在要做的是,對模型進行提問,模型有問題和答案。我們將把問題提交給模型,例如Meta的Llama,但這裡我們用Mistral 7b舉例。這個模型知道答案嗎?我們來看看。他爲布法羅軍刀隊效力過,模型知道。我們可以通過編程的方式來判斷,即從模型獲取答案並與正確答案進行比較。模型能夠自動完成此任務,無需人工參與。我們可以獲取模型的答案,並用另一個大型語言模型判斷答案是否正確。如果正確,則模型可能知道答案。我們將重複此過程幾次。它知道是布法羅軍刀隊。我們再試一次,布法羅軍刀隊。再試一次,布法羅軍刀隊。三次詢問後,模型似乎知道答案,一切都很棒。

現在嘗試第二個問題:他贏得了多少個斯坦利杯?正確答案是兩個。模型聲稱他贏了四次,這是錯誤的。模型不知道,它在編造。我們再試一次,模型再次編造。再試一次,它說他職業生涯中沒有獲勝。很明顯,模型不知道。我們可以通過編程的方式判斷,即三次詢問模型,並將答案與正確答案進行比較。如果模型不知道,我們就知道了。然後我們將這個問題,創建一個新的對話添加到訓練集中。訓練集中會添加一個新的對話:“他贏得了多少個斯坦利杯?” 答案是:“對不起,我不知道,或者我不記得了”。這是正確的答案,因爲我們詢問了模型,這就是情況。

如果你對許多不同類型的問題和文檔都這樣做,你就在給模型一個機會,在其訓練集中,根據其知識拒絕回答。如果訓練集中只有幾個這樣的例子,模型就能學習這種基於知識的拒絕與其內部神經元的關聯。從經驗上看,這是可能的。它可以學習這種關聯:當不確定性神經元的值很高時,我實際上不知道,我可以說“我很抱歉,但我記不起這個了”等等。如果你在訓練集中包含這些例子,就能很大程度地減輕幻覺問題。這就是ChatGPT。

也能夠做到這些事情的原因是,這些都是人們已經實施並隨着時間推移改善了事實性問題緩解措施。

我已描述了第一種緩解方法,基本上是爲了減輕幻覺問題。現在,我們可以做得更好,不必僅僅說“我不知道”,我們可以引入第二種緩解方法,讓大型語言模型有機會給出事實性答案並實際回答問題。

如果我問你一個事實性問題,而你不知道答案,你會怎麼做?你可能會去搜索,使用互聯網找出答案,然後告訴我。我們可以對這些模型做完全相同的事情。想象一下神經網絡內部,在其數十億參數內部的知識,可以將其視爲模型在訓練期間、預訓練階段很久以前看到的事物的模糊記憶,如同一個月前讀到的東西。如果你不斷閱讀某些東西,你就會記住它,模型也是如此。但如果信息稀少,你的記憶可能不清晰。這時,你和我都一樣,會去查找它。

當你查找它時,你基本上是用信息刷新你的工作記憶,然後你就能檢索它、談論它等等。所以我們需要一些等效的方法來允許模型刷新其記憶或回憶,我們可以通過爲模型引入工具來做到這一點。

我們的方法是,與其只是說“對不起,我不知道”,不如嘗試使用工具。我們可以創建一個機制,讓語言模型發出特殊的標記,例如“搜索開始”和“搜索結束”。當模型不知道答案時,它可以選擇發出“搜索開始”標記,這對於OpenAI來說,就是將查詢發送到bing.com或谷歌搜索等。它會發出查詢,然後發出“搜索結束”標記。

然後,運行推理、從模型中採樣的程序,當它看到“搜索結束”標記時,它不會採樣序列中的下一個標記,而是會暫停從模型中生成,它會啓動一個會話連接到bing.com,並將搜索查詢粘貼到bing中。然後它將獲取所有檢索到的文本,也許會用一些其他特殊標記再次表示它,並將這段文本複製粘貼到上下文窗口中。

模型從網頁搜索獲得的文本現在就在上下文窗口內,它將被輸入到神經網絡中。你可以把上下文窗口想象成模型的工作內存。

上下文窗口中的數據可以直接被模型訪問,並直接輸入到神經網絡中。因此,模型不再依賴模糊的回憶,而是可以直接訪問上下文窗口中的數據。 當模型採樣新的標記時,可以輕鬆參考已複製粘貼的內容。這就是這些工具大致的工作方式,網頁搜索只是其中一種。稍後我們將探討其他工具。

基本上,通過引入新的標記和模式,模型可以利用這些標記並調用特定功能,例如網頁搜索。

那麼,如何教會模型正確使用這些工具,例如網頁搜索、搜索開始和搜索結束呢?這同樣是通過訓練集完成的。我們需要大量數據和對話,通過示例向模型展示如何使用網頁搜索,在哪些情況下使用搜索以及搜索結果的呈現方式。訓練集中包含數千個此類示例,模型就能很好地理解工具的工作方式,知道如何構建查詢。

由於預訓練數據集及其對世界的理解,模型已經理解了什麼是網頁搜索,並對什麼樣的內容構成有效的搜索查詢有相當好的原生理解。因此,只需要少量示例來展示如何使用新工具,模型就能依靠它檢索信息並將其放入上下文窗口。這類似於我們查找資料的過程,因爲一旦信息進入上下文,就進入了工作內存,非常容易操作和訪問。

幾分鐘前,當我在ChatGPT中搜索Orson Kovats是誰時,ChatGPT語言模型認爲這是一個罕見的人物,它沒有直接給出答案,而是選擇採樣一個特殊標記進行網絡搜索。我們看到一些信息閃過,表明使用了網絡工具。稍作等待後,它生成了答案並創建了引用,表明它正在引用來源。

它啓動了一次網絡搜索,找到了來源和網址。這些網頁的文本被添加到上下文窗口中(雖然未顯示),模型以此爲基礎進行引用,例如“可能是這些人,引用;可能是那些人,引用”等等。

這就是爲什麼當我問誰是奧森·科瓦茨時,我也可以說“不要使用任何工具”。這足以讓ChatGPT不使用工具,而只使用其記憶和回憶。

我也嘗試向ChatGPT提出了這個問題:多米尼克·哈塞克贏得了多少次斯坦利杯?

ChatGPT 認爲自己知道答案,並自信地聲稱贏了兩次。這源於它對自身權重、參數和激活值的信心,使其能夠直接從“記憶”中檢索信息。但也可以通過網絡搜索來驗證。 同樣的查詢,ChatGPT 會進行搜索,找到並整合多個來源,最終列出這些來源,例如維基百科文章。這就是工具(網絡搜索)如何運作,也是模型緩解幻覺和確保事實性的方法。

這強調了一個重要的觀點:神經網絡參數中的知識是一種模糊的記憶,上下文窗口中的知識和標記則構成工作記憶。這與人類大腦的工作方式類似:我們記住的東西是參數,近期經歷則在上下文窗口中。隨着我們體驗周圍環境,上下文窗口不斷更新。

這對於使用大型語言模型有啓示。例如,要求 ChatGPT 總結《傲慢與偏見》第一章,效果不錯,因爲它對名著有較好的“記憶”,可能看過大量相關資料。但這類似於人類的記憶:讀過書後才能總結。

通常,直接提供信息效果更好。更好的提示是請求幫助總結,並附上參考文本。 我通常會複製粘貼第一章內容。 這樣,模型可以直接訪問信息,無需回憶,從而顯著提高摘要質量。這與我們人類相似,如果在總結前重新閱讀,就能寫出更好的摘要。

我接下來想簡要談談另一種心理上的怪癖:自我認知。我經常在互聯網上看到人們向大型語言模型提出諸如“你是哪個模型?誰創造了你?”之類的問題。這個問題多少有些荒謬。

原因在於,當我試圖解釋一些底層原理時,這東西並非一個人,它根本沒有任何持久的存在。它啓動、處理標記,然後關閉,對每個人都如此操作。它只是構建一個對話的上下文窗口,然後所有內容都被刪除。所以,這個實體就像每次對話都從頭開始重啓。它沒有持久自我,沒有自我意識,它只是一個標記攪拌機,遵循其訓練集的統計規律。所以,問它“你是誰”、“是誰創造了你”等等,並沒有什麼意義。默認情況下,你將會得到一些非常隨機的答案。

例如,讓我們以Falcon爲例,這是一個相當舊的模型。它在迴避問題,編造說自己是由OpenAI基於GPT-3模型構建的。很多人會認爲這是該模型在OpenAI數據上進行訓練的證據,但我並不這麼認爲。因爲,如果你沒有明確地對模型進行編程以回答這類問題,你得到的將是其對答案的統計最佳猜測。這個模型具有包含對話的SFT數據混合,在微調過程中,模型在根據此數據進行訓練時,某種程度上理解到它正在承擔一個有幫助的助手的角色。它並沒有被明確告知應該給自己貼上什麼標籤,它只是扮演了一個樂於助人的助手。

記住,預訓練階段使用了來自整個互聯網的文檔,而ChatGPT和OpenAI在這些文檔中非常突出。我認爲這裡實際發生的情況是,這只是它自己幻想出來的標籤——它的自我認同,即它是OpenAI的ChatGPT。它之所以這麼說,是因爲互聯網上存在大量類似的答案數據,這些答案實際上來自OpenAI和ChatGPT。所以這就是它給自己貼的標籤。

現在,作爲開發者,你可以覆蓋它。如果你有一個大型語言模型,你實際上可以覆蓋它,並且有一些方法可以做到這一點。舉個例子,讓我來給你展示一下Allen AI的Olmo模型。這是一個大型語言模型(LLM),它並不是頂級的大型語言模型,但我還是很喜歡它。

Olmo及其相關論文均爲開源,這很好。其SFT混合體包含微調數據和對話數據集。Olmo模型的訓練數據包含一百萬次對話,但Olmo2模型僅使用240次硬編碼對話。

這些硬編碼對話包含預設問題及答案,例如詢問模型名稱、開發機構等。 將這240次對話用於微調,模型會傾向於鸚鵡學舌,否則可能產生無意義的AI生成內容。

另一種方法是使用系統消息,在對話開始前提供模型身份、訓練日期、知識截止日期等信息。這類似於爲模型創建文檔記錄,並將其隱藏在上下文窗口中。這兩種方法都能使模型描述自身,但都屬於附加信息,並非模型內在屬性。

接下來討論這些模型在解決問題場景中的計算能力,以及構建對話示例時需要注意的事項。這些模型的思考方式具有啓發性,需要仔細考量。 接下來,讓我們考慮一個來自人類的提示,並假設我們將以此構建對話示例,用於訓練模型解決簡單的數學問題。

艾米莉買了三個蘋果和兩個橙子,每個橙子兩美元,總價是13美元。蘋果的價格是多少?這是一個簡單的數學題,有兩個正確的答案,都是3。但其中一個答案對輔助模型來說更好。例如,數據標註員在創建答案時,一個答案對模型來說很糟糕,另一個則可以接受。

思考一下爲什麼兩個答案中一個明顯比另一個更好。使用錯誤的答案會使模型的數學能力變差,併產生不良後果。在訓練人員創建理想回復時,這是標註文檔中需要注意的事項。

模型在訓練和推理時,都是從左到右處理一維的標記序列。可以想象標記序列從左到右演變,爲了生成序列中的下一個標記,所有標記都輸入到神經網絡中,神經網絡給出下一個標記的概率。

這與之前的網絡演示圖完全一樣,計算過程獲取上面輸入的標記,執行神經元運算,給出下一個標記概率的答案。模型只有有限幾層計算,例如只有1、2、3層注意力機制和MLP,而現代先進網絡可能有100層甚至更多。

從之前的標記序列到下一個標記的概率,只有大約100層的計算。對於每個標記,只有有限量的計算,可以認爲計算量非常少且幾乎固定。雖然輸入的標記越多,神經網絡的前向傳播越昂貴,但不會貴很多。

可以將模型理解爲對每個標記進行固定量的計算,計算量不會太大,因爲層數有限,計算量有限。模型無法僅僅通過一次前向傳播進行任意計算來獲得單個標記。

這意味着推理和計算必須分佈到許多標記上,因爲每個標記只在其上花費有限量的計算。我們希望將計算分佈到許多標記上,並且不能對模型在任何單個標記上的計算期望過高,因爲每個標記的計算量是有限的。

這裡的計算量大致是固定的。因此,左側答案明顯更差。原因是模型必須從左到右逐個生成標記,它需要在單個標記中完成所有計算並給出答案“3”。一旦答案生成,後續標記只是對答案的解釋,因爲答案已在上下文窗口中。模型實際上並未進行計算,而是試圖在一個標記中猜測答案,由於每個標記的計算量有限,這行不通。

右側答案則好得多,因爲它將計算分佈在整個答案中,讓模型逐步得出答案。從左到右,模型生成中間結果,例如“橙子的總成本是4,所以13減去4是9”。每個中間計算都不復雜,模型在每個標記中處理的難度降低。測試時,模型也能進行計算。我們教模型分散推理,將計算分散到各個標記上,每個標記處理簡單問題,最終累加得到答案。

這與左側的方案形成對比,左側方案教模型試圖在一個標記中完成計算,這非常糟糕。 通常不必明確考慮這一點,因爲OpenAI的標註員會確保答案是分散的,OpenAI會處理這個問題。 當我詢問ChatGPT時,它會緩慢地生成答案,創建中間結果(這些結果對用戶不可見,但對模型很重要)。 如果沒有這些中間結果,模型無法得出正確的答案“3”。

最後,我們可以故意刁難模型。例如,使用相同的提示,要求它用單個標記回答問題。

直接給我答案,什麼都不要。結果發現,對於這個簡單的提示,它竟然一次就完成了。它只創建了一個,我想這是兩個詞元,對吧?因爲美元符號本身就是一個詞元。所以基本上,這個模型沒有給我一個詞元,它給了我兩個詞元,但它仍然給出了正確的答案。而且它是在網絡的單次前向傳播中做到的。

現在,這是因爲這裡的數字非常簡單。所以我把它弄得更難一些,故意刁難一下模型。所以我說道,艾米莉買了23個蘋果和177個橙子,然後我只是把數字弄得大了一點,只是讓模型更難處理了,我要求它在一個token中進行更多計算。所以我說了同樣的話,它在這裡給了我5,而5實際上是不正確的。

所以模型未能在一輪網絡前向傳播中完成所有計算。它未能從輸入token出發,然後在一輪網絡前向傳播中,一次性通過網絡,它無法產生結果。然後我說,好吧,現在別擔心token限制,像平時一樣解決問題吧。然後它會列出所有中間結果,進行簡化。這裡每一箇中間結果和中間計算,對模型來說都容易得多,而且每個令牌的工作量也不算太大。此處的所有令牌都是正確的,它產生了一個修正的解決方案,即7。它只是無法壓縮所有這些工作,它無法將這些壓縮到網絡的單次前向傳遞中。

所以我覺得這只是一個很可愛的例子,可以思考一下,而且我認爲這再次闡明瞭這些模型的工作方式。關於這個話題,我想說的最後一點是,如果我在日常生活中實際嘗試解決這個問題,我實際上可能不會相信模型,不會相信這裡所有中間計算的正確性。所以實際上,我可能會這樣做:我會來到這裡,然後說,“使用代碼”。

這是因爲代碼是ChatGPT可以使用的工具之一。而不是讓它進行心算,像這裡的心算一樣,我不完全相信它,尤其當數字變得非常大時,模型無法保證能夠正確地進行運算。從原則上講,任何一箇中間步驟都可能失敗。我們正在使用神經網絡進行心算,就像你在大腦中進行心算一樣,它可能會搞砸一些中間結果。它甚至能夠進行這種心算,這實際上令人驚歎,我認爲我無法在腦子裡做到這一點。但基本上,模型就像在它自己的“腦子裡”進行運算。我不相信這一點,所以我希望它使用工具。因此你可以說一些諸如“使用代碼”之類的話。我不確定那裡發生了什麼。使用代碼。正如我提到的,有一個特殊的工具,模型可以編寫代碼。我可以檢查這段代碼是否正確。然後它就不依賴於它的心算能力了。它使用Python解釋器(這是一種非常簡單的編程語言)來編寫計算結果的代碼。

我更信任Python程序的結果,它比語言模型的直接計算更可靠。因此,遇到類似問題時,建議使用模型的代碼解釋器。

模型通過專用標記調用代碼解釋器,這並非語言模型自身生成。它編寫程序,發送到計算機的特定部分執行,再將結果返回給模型。模型據此得出每個蘋果7元的結論。這是另一種實用工具,建議大家實踐操作。

這種方法更容易避免錯誤。這就是本節命名爲“模型需要令牌來思考”的原因:分散計算到多個令牌,要求模型創建中間結果,並儘可能依賴工具,而不是讓模型將所有內容都儲存在內存中。如果模型試圖將所有內容都儲存在內存中,不要完全相信它,優先使用工具。

我將用另一個例子說明這種情況:計數。語言模型不擅長計數,因爲在一個單獨的詞元中要求太多。例如,我展示一堆點,讓模型計算數量。模型試圖在一個詞元中解決這個問題,即在上下文窗口中計算點數,並在網絡的單次前向傳遞中完成。但網絡單次前向傳遞的計算能力有限。

模型看到的只是分詞器處理後的結果。例如,“下面有多少個點”,以及隨後的一堆點,可能被分詞器分成若干個詞元,每個詞元包含一組點。模型實際看到的只是這些詞元的ID,然後據此計算數量。結果並非161,而是177。

我們可以使用代碼解決這個問題。雖然看似簡單,但實際上我已將問題分解成對模型更容易處理的子問題。使用代碼後,結果正確顯示爲177。

我知道模型擅長複製粘貼。 使用代碼時,模型會創建一個Python字符串,並將輸入複製粘貼到其中。 模型將字符串視爲幾個標記,複製粘貼並解包這些標記非常簡單。 因此,模型創建字符串,調用Python例程dot count,最終得到答案。Python解釋器進行計數,而非模型的心算。 這再次說明模型需要標記來思考,不能依賴其心算能力,這也是模型計數能力不佳的原因。 如果需要模型執行計數任務,應始終讓其藉助工具。

模型還有許多其他小的認知缺陷,這些是技術上的不足,需要時間來逐漸改進。例如,模型在各種拼寫相關的任務上表現不佳。 這與分詞有關,因爲模型看到的是詞元而非字符。模型的世界是基於詞元的,詞元是文本片段。 因此,簡單的字符級任務往往會失敗。

例如,給模型一個字符串“ubiquitous”,要求其打印從第一個字符開始的每第三個字符。 模型的結果可能不正確,這可能是因爲算術運算失敗,更重要的是,模型無法像人類一樣訪問單個字母。模型將三個詞元視爲一個整體,因爲其訓練數據是基於詞元的。 模型需要從大量數據中學習不同字母與詞元之間的關係,而我們使用詞元的主要原因是爲了提高效率。 很多人希望完全取消詞元,使用字符級或字節級模型,但這會產生非常長的序列,目前人們還不知道如何處理。

因此,在分詞的世界裡,任何拼寫任務實際上都不指望能做得很好。因爲我知道由於分詞的原因,拼寫不是它的強項,所以我又能要求它依賴工具,我可以直接說使用代碼。我再次預期這會奏效,因爲將“ubiquitous”複製粘貼到Python解釋器中的任務要容易得多,然後我們依靠Python解釋器來操作這個字符串的字符。所以我如果說使用代碼,“ubiquitous”,是的,它會索引到每一個第三個字符,實際的結果是“UQTS”,在我看來是正確的。所以,再次,這是一個拼寫相關任務效果不好的例子。

最近一個非常著名的例子是,草莓(strawberry)中有多少個字母R?這多次在網上病毒式傳播。基本上,現在的模型都能正確回答了,它們會說草莓中有三個R,但很長一段時間裡,所有最先進的模型都會堅持說草莓裡只有兩個R。這引起了很多騷動,因爲這是一個詞嗎?我想是的。因爲這就像,爲什麼這些模型如此出色?它們可以解決數學奧林匹克競賽題,但它們卻不能,比如,數草莓裡的“R”。而對此的答案,同樣地,我已經慢慢地解釋了,但首先,模型看不到字符,它們看到的是標記;其次,它們不太擅長計數。所以我們在這裡結合了看到字符的困難和計數的困難,這就是爲什麼模型難以解決這個問題,儘管我認爲現在,老實說,我認爲OpenAI可能已經在這裡硬編碼了答案,或者我不確定他們做了什麼。但這個具體的查詢現在可以工作了。

所以模型不太擅長拼寫,還有一些其他的小問題,我不想一一贅述。我只想展示一些在實際使用這些模型時需要注意的例子。我實際上並不想在這裡全面分析模型的所有不足之處,我只想指出,這裡有些地方不夠完善。我們已經討論過其中一些,其中一些說得通,但有些則說不通。它們就像……即使你深入瞭解這些模型的工作原理,也會讓你摸不着頭腦。

最近的一個很好的例子如下:這些模型在處理像這樣的非常簡單的問題時表現不佳,這讓很多人感到震驚,因爲這些模型可以解決複雜的數學問題。它們能夠比我更好地回答博士級別的物理、化學、生物學問題,但有時它們在像這樣的超級簡單的問題上卻力不從心。所以,我們開始吧。9.11大於9.9,它以某種方式證明了這一點,但是很明顯……然後最後,好吧,它實際上後來又改變了決定。所以我不認爲這是非常可重複的。有時候它會改變答案,有時候它答對了,有時候它答錯了。我們再試一次。好吧,即使它看起來可能更大……好吧,所以這裡它最終甚至沒有自我糾正。

如果你反覆提問,有時它也能給出正確答案。但模型如何在奧林匹克級別的難題上表現出色,卻在如此簡單的題目上失敗呢?我認爲這一點,正如我提到的,有些令人費解。

事實上,許多人對此進行了深入研究,雖然我並未閱讀相關論文,但我從研究團隊瞭解到,當仔細檢查神經網絡內部的激活情況,查看哪些特徵開啓或關閉,哪些神經元開啓或關閉時,發現許多通常與聖經經文相關的的神經元被激活。因此,我認爲模型可能受到了這些類似聖經經文標記的提示,在聖經經文的語境下,9.11 會出現在 9.9 之後。所以,模型不知何故認爲在聖經經文中 9.11 比 9.9 大,這在認知上令人費解,即使它嘗試用數學方法證明並得出答案,最終卻得到錯誤的結果。所以,它基本上說不通,也沒有被完全理解,還有一些類似的棘手問題。這就是爲什麼應該把它當成它本來面目——一個真正神奇的隨機系統,但你不能完全信任它。你應該把它當作工具來使用,而不是直接複製粘貼其結果。

現在我們已經涵蓋了大型語言模型訓練的兩個主要階段。首先是預訓練階段,我們基本上是在互聯網文檔上進行訓練。當使用互聯網文檔訓練語言模型時,得到的是所謂的基模型,它基本上是一個互聯網文檔模擬器。這是一個有趣的產物,訓練它需要在數千臺計算機上花費數月時間,可以說是互聯網的一種有損壓縮。它極其有趣,但並沒有直接的用處,因爲我們不想採樣互聯網文檔,我們想向人工智能提問並讓它回答我們的問題。所以,我們需要一個助手。

我們可以在後期的訓練過程中構建一個助手,尤其是在監督微調過程中。在這個階段,算法與預訓練相同,沒有任何變化,唯一改變的是數據集。我們不再使用互聯網文檔,而是創建一個並精心策劃一個非常棒的對話數據集。我們需要數百萬個關於各種不同主題的人與助手之間的對話。從根本上說,這些對話是由人類創造的,人類編寫提示,也編寫理想的回覆。他們根據標註文檔來做這件事。現在,在現代技術棧中,實際上並不是完全由人工手動完成的,他們現在實際上得到了這些工具的大量幫助,所以我們可以使用語言模型來幫助我們創建這些數據集,而且這是廣泛使用的。

但從根本上說,這一切都源於人工策劃。我們創建了對話數據集,對其進行微調或繼續訓練,最終得到一個助手模型。然後,我們開始探討助手的認知特性。例如,如果不採取緩解措施,助手會出現幻覺,這很常見。我們研究了緩解幻覺的措施。我們發現這些模型令人印象深刻,能夠在“腦子裡”完成很多事情,但也能通過工具提升性能。例如,網絡搜索可以減少幻覺,獲取更新信息;代碼解釋器可以幫助大型語言模型編寫、運行代碼並查看結果。這些是我們目前研究的一些主題。

現在我想介紹流程的最後一個也是最重要的階段:強化學習。強化學習屬於後期訓練,是第三個主要階段,也是一種不同的語言模型訓練方式,通常作爲第三步進行。在OpenAI這樣的公司,這由獨立團隊負責:一個團隊負責預訓練數據,一個團隊負責預訓練訓練,一個團隊負責對話生成,一個團隊負責監督微調,還有一個團隊負責強化學習。這就像模型的交接:得到基礎模型後,微調成助手,然後進行強化學習,接下來我們將討論它。

這就是主要流程,現在讓我們關注強化學習,這是訓練的最後一個主要階段。首先解釋其動機,以及爲什麼我們要進行強化學習,以及它在高層次上的樣子。我想解釋強化學習階段的動機及其對應內容。這類似於上學:我們想讓大型語言模型“上學”,變得非常優秀。我們使用幾種範例向它們傳授知識或轉移技能。

在學校使用教科書時,你會發現三種主要信息類型。第一種是大量的闡述性內容。這是一本我從網上隨意找來的書,可能是某種有機化學書籍,我不確定。重要的是,你會發現大部分文本,大部分內容是闡述性的核心部分,就像背景知識等等。閱讀這些闡述性文字,可以將其理解爲對數據的訓練,就像預訓練一樣。

這是我們構建數據知識庫並瞭解主題的地方。你接下來會看到的主要信息是問題及其解答。一位人類專家,例如本書作者,不僅提供了問題,還完成了解答過程,這個解答等同於理想的助手迴應。專家展示瞭如何完整地解決問題,我們在閱讀解決方案時,就是在專家數據上進行訓練,之後可以嘗試模仿專家,這相當於擁有SFT模型。我們完成了預訓練,並涵蓋了對專家的模仿以及他們如何解決問題。

強化學習的第三階段是練習題。有時只有一個練習題,但教科書章節結尾通常有很多練習題。練習題至關重要,因爲它們讓你練習並發現自己解決問題的方法。練習題中只有題目描述,沒有解題過程,答案通常在課本答案key中給出。你知道最終答案和題目陳述,但沒有解題過程,你正在練習解題過程,嘗試不同的方法,查看哪種方法最能得到最終解決方案,探索如何解決問題。在這個過程中,你依賴於預訓練的背景信息,以及模仿人類專家的方法,可能還會嘗試類似的解決方案。我們已經完成了這些,現在我們將進行練習。我們將得到提示和最終答案,但沒有專家解法,必須練習並嘗試各種方法,這就是強化學習的意義所在。

讓我們回到之前處理過的問題,以便有一個具體的例子。我在這裡使用tick分詞器,因爲我想要一個文本框。但我想再次提醒你,我們始終處理一維的token序列。我更喜歡這種視圖,因爲它就像LLM的原生視圖,它看到的是token ID。

艾米麗買了三個蘋果和兩個橙子。每個橙子2美元。所有水果的總成本是13美元。每個蘋果的成本是多少?這四個可能的候選解決方案,只是個例子,它們都得出答案三。如果我是創建訓練集人工數據標註者,我實際上並不知道……

要將哪些對話添加到數據集中?一些對話構建了一個方程組,一些僅用英語解釋,還有一些直接跳到解決方案。例如,使用ChatGPT並提出問題,它會定義一個變量系統並進行類似操作。

然而,我們需要區分的是,解決方案的首要目的是得出正確答案。我們想要得到最終答案“三”,這是最重要的目標。但也有次要目標,即使其對人類友好。我們假設用戶希望看到解決方案和中間步驟,並以清晰的方式呈現。所以這裡存在兩件事:一是面向人類的呈現,二是獲得正確答案。

讓我們暫時專注於僅獲得最終答案。如果我們只關心最終答案,那麼哪個提示最優或最好?或者,對於LLM來說,哪個解決方案最能獲得正確答案?我認爲我們不知道。作爲人類標註者,我也不知道哪個更好。

例如,我們之前在查看標記序列和心算推理時發現,對於每個標記,我們基本上只能花費有限的計算量,而且不算很大。所以我們實際上不能在任何一個標記上取得太大的飛躍。例如,這個例子很好,因爲它只有很少的標記,我們只需要很短的時間就能得到答案。但是,當我們計算“13減4除以3等於”時,在這個標記...