從零開始了解大型語言模型:科技領域的里程碑式進展

聞數起舞 發佈 2023-05-04T15:32:55.576540+00:00

對大型語言模型的非常溫和的介紹,沒有炒作。本文旨在讓沒有計算機科學背景的人對ChatGPT和類似的人工智慧系統的工作原理有一些了解。

對大型語言模型的非常溫和的介紹,沒有炒作。

[這是一項正在進行的工作]

1.緒論

本文旨在讓沒有計算機科學背景的人對ChatGPT和類似的人工智慧系統(GPT-3、GPT-4、Bing Chat、Bard等)的工作原理有一些了解。ChatGPT是一個聊天機器人--一種建立在--大型語言模型之上的對話式人工智慧。這些肯定是話,我們將把這些都分解開來。在這個過程中,我們將討論它們背後的核心概念。這篇文章不需要任何技術或數學背景。我們將大量使用比喻來說明這些概念。我們將討論為什麼這些核心概念會以這樣的方式工作,以及我們可以期待或不期待像ChatGPT這樣的大型語言模型做什麼。

以下是我們要做的事情。我們將輕輕地走過一些與大型語言模型和ChatGPT相關的術語,不使用任何專業術語。如果我必須使用專業術語,我將不使用專業術語將其分解。我們將從 "什麼是人工智慧 "這個非常基本的問題開始,然後逐步深入。我將儘可能地使用一些反覆出現的比喻。我將從我們應該期望它們做什麼或不應該期望它們做什麼的角度來談論這些技術的影響。

我們走吧!

1.什麼是人工智慧?

但首先,讓我們從一些基本術語開始,你可能經常聽到這些術語。什麼是人工智慧

  • 人工智慧:一個實體,如果人類做類似的事情,它的行為可能被人合理地稱為智能。

用 "智能 "一詞來定義人工智慧是有點問題的,但沒有人能夠就 "智能 "的良好定義達成一致。然而,我認為這仍然是合理有效的。它基本上是說,如果我們看一些人工的東西,而且它做的事情很吸引人,很有用,似乎有點非同小可,那麼我們可以稱它為智能。例如,我們經常把 "人工智慧 "這個詞賦予計算機遊戲中由計算機控制的角色。這些機器人大多是一些簡單的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"來填空,而不是 "armadillo"。

我們傾向於從概率的角度來談論語言模型。在數學上,我們將上述例子寫成:

如果你對這個符號不熟悉,不用擔心。這只是數學上的說法,意思是給定 "time"這個詞的概率(P)(條形符號|表示給定),以及一系列的詞 "一次"、"在 "和 "一個"。我們希望一個好的語言模型能夠產生一個比 "armadillo "更高的 "time"這個詞的概率。

我們可以將此概括為:

這只是意味著計算在一個序列中的第n個詞的概率,給它前面的所有詞(位置1到n-1的詞)。

但讓我們往後拉一點。想一想老式的打字機,就是那種帶衝鋒臂的。

只不過,我們不是為每個字母配備不同的衝鋒臂,而是為每個單詞配備一個衝鋒臂。如果英語有50,000個單詞,那麼這就是一台大的打字機!

與汽車的網絡不同,想想一個類似的網絡,只是我們的電路頂部有50,000個連接到前臂的輸出,每個詞一個。相應地,我們將有50,000個傳感器,每一個都檢測不同的輸入詞的存在。因此,我們最後要做的是挑選一個獲得最高電信號的前鋒臂,這就是進入空白處的單詞。

我們的情況是這樣的:如果我想做一個簡單的電路,接收一個字並產生一個字,我將不得不做一個有50000個傳感器(每個字一個)和50000個輸出(每個前鋒臂一個)的電路。我只需將每個傳感器與每個衝鋒鎗臂相連,總共有50,000 x 50,000 = 25億條線。

底部的每個圓圈都能感應到一個單詞。它需要50,000個傳感器來識別 "一次 "這個詞。這些能量通過一些任意的網絡被發送。上面的所有圓圈都與每個單詞的前鋒臂相連。所有前鋒臂都收到一些能量,但其中一個會比其他的收到更多。

這是一個很大的網絡!

但情況變得更糟。如果我想做 "Once upon a ___"的例子,我需要感知哪個詞在三個輸入位置中的每個位置。我將需要50,000 x 3 = 150,000個傳感器。與50,000個衝鋒鎗連接起來,我就有150,000 x 50,000 = 75億條線。截至2023年,大多數大型語言模型可以吸收4000個單詞,最大的可以吸收32000個單詞。我的眼睛在流淚。

一個以三個字作為輸入的網絡,每個字需要50,000個傳感器。

我們將需要一些技巧來處理這種情況。我們將分階段進行。

5.1 編碼器

我們要做的第一件事是把我們的電路分成兩個電路,一個叫編碼器,一個叫解碼器。啟示是,很多詞的意思大致相同。考慮一下下面的短語:

國王坐在_____上
王后坐在_____上
公主坐在_____上
攝政王坐在_____上

對上面所有的空白,合理的猜測是 "王位"(或者也許是 "廁所")。這就是說,我可能不需要在 "國王 "和 "王座 "之間,或在 "王后 "和 "王座 "之間單獨布線,等等。相反,如果我有一個大約意味著皇室的東西,並且每次我看到 "國王 "或 "王后 "時,我都用這個中間的東西來代替,那就太好了。然後我只需要擔心哪些詞的意思大致相同,然後怎麼做(把大量的能量送到 "王位 "上)。

因此,這就是我們要做的事情。我們將建立一個電路,將50,000個字的傳感器映射到一些較小的輸出集合,例如256個而不是50,000個。而不是只能觸發一個衝鋒鎗臂,我們能夠在一個時間內搗毀一堆武器。每個可能的前鋒臂組合可以代表一個不同的概念(如 "皇室 "或 "裝甲的哺乳動物")。這256個輸出將使我們有能力代表2²⁵⁶=1.15x10⁷⁸概念。在現實中,它甚至更多,因為就像在汽車的例子中,我們可以把剎車踩到一半,這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 編碼器和解碼器在一起

這裡是編碼器和解碼器一起工作,組成一個大的神經網絡:

一個編碼器-解碼器網絡。它只是一個坐落在編碼器之上的解碼器。

而且,順便說一下,一個單字輸入到一個單字輸出經過編碼只需要(50000×256)×2=2560萬個參數。這似乎要好得多。

這個例子是針對一個字的輸入和產生一個字的輸出,所以如果我們想讀取n個字,我們將有50,000 x n個輸入,256 x n個編碼。

但為什麼這能起作用呢?通過迫使50,000個詞都適合於一個小的數字集,我們迫使網絡做出妥協,將可能觸發相同的輸出詞猜測的詞組合在一起。這很像文件壓縮。當你壓縮一個文本文件時,你會得到一個更小的文件,但不再可讀。但你可以解壓縮文件,恢復原來的可讀文本。這可以做到,因為壓縮程序用速記符號替換了某些模式的單詞。然後,當它解壓縮時,它知道用什麼文字來換回速記符號。我們的編碼器和解碼器電路學習了一個電阻和門的配置,以壓縮然後解壓縮字。

5.4 自我監督

我們怎麼知道每個詞用什麼編碼最好?換句話說,我們怎麼知道 "國王 "的編碼應該類似於 "女王 "的編碼,而不是 "犰狳 "的編碼?

作為一個思想實驗,考慮一個編碼器-解碼器網絡,它應該接收一個字(50,000個傳感器)並產生完全相同的字作為輸出。這是一件愚蠢的事情,但它對接下來的內容很有啟發。

一個編碼器-解碼器網絡被訓練成輸出與輸入相同的詞(是與之前相同的圖像,但用顏色來激活)。

我輸入了 "王 "字,一個傳感器通過編碼器發送電信號,並部分打開了中間的256個編碼值。如果編碼是正確的,那麼解碼器將發送最高的電信號給同一個詞,"國王"。對嗎,容易嗎?沒有那麼快。我同樣有可能看到激活能量最高的 "犰狳 "這個詞的前鋒臂。假設 "國王 "的前鋒臂得到0.051個電信號,"犰狳 "的前鋒臂得到0.23個電信號。實際上,我甚至不關心 "犰狳 "的數值是多少。我可以只看 "國王 "的輸出能量,知道它不是1.0。1.0和0.051之間的差異就是誤差(也叫損失),我可以用反向傳播的方法對解碼器和編碼器做一些改變,這樣下次我們看到 "國王 "這個詞時就會有一個稍微不同的編碼。

我們對所有的字都這樣做。編碼器將不得不作出妥協,因為256的數量遠遠小於50,000。也就是說,有些詞必須在中間使用相同的激活能組合。因此,當有選擇時,它將希望 "國王 "和 "皇后 "的編碼幾乎相同,而 "犰狳 "的編碼則非常不同。這將給解碼器一個更好的機會來猜測這個詞,只要看一下256個編碼值。如果解碼器看到256個值的特定組合,並猜出 "國王 "為0.43,"皇后 "為0.42,只要 "國王 "和 "皇后 "得到最高的電信號,而49,998個前鋒手臂中的每一個得到的數字都比較小,我們就可以接受。另一種說法是,我們可能更願意接受網絡在國王和王后之間發生混淆,而不是網絡在國王和犰狳之間發生混淆。

我們說神經網絡是自監督的,因為與汽車的例子不同,你不需要收集單獨的數據來測試輸出。我們只是將輸出與輸入進行比較--我們不需要為輸入和輸出準備單獨的數據。

5.5 遮蔽的語言模型

如果上述思想實驗看起來很傻,那麼它是被稱為掩蔽語言模型的東西的構建塊。掩蔽語言模型的想法是接受一連串的詞並生成一連串的詞。輸入和輸出中的一個詞是空白的。

MASK]坐在寶座上。

網絡猜出了所有的單詞。好吧,要猜出未被掩蓋的單詞是很容易的。我們真正關心的是網絡對被掩蓋單詞的猜測。也就是說,我們對輸出中的每個詞有50,000個前鋒臂。我們看一下被掩蓋的單詞的50,000個前鋒臂。

屏蔽一個序列。我已經厭倦了畫大量的連接線,所以我將只畫紅線來表示上面和下面的一切之間有很多很多的連接。

我們可以移動面具,讓網絡在不同的地方猜不同的字。

有一種特殊類型的掩碼語言模型只在最後有掩碼。這被稱為生成式模型,因為它所猜測的掩碼總是序列中的下一個詞,這相當於生成下一個詞,好像下一個詞不存在。就像這樣:

的[MASK]。
女王[MASK]
王后坐在[MASK]上
王后坐在[MASK]上
王后坐在[MASK]上

我們也稱這是一個自動回歸模型。回歸這個詞聽起來不是那麼好。但回歸只是意味著試圖理解事物之間的關係,比如已經輸入的詞和應該輸出的詞。自動的意思是 "自我"。一個自動回歸模型是自我預測的。它預測了一個詞。然後這個詞被用來預測下一個詞,而下一個詞又被用來預測下一個詞,以此類推。這裡面有一些有趣的含義,我們以後會再來討論。

6.什麼是Transformer 變換器?

截至本文撰寫之時,我們聽到了很多關於GPT-3和GPT-4以及ChatGPT的事情。GPT是一家名為OpenAI的公司開發的一種大型語言模型的特殊烙印。GPT是Generative Pre-trained Transformer的縮寫。讓我們把它分解一下:

  • 生成性。該模型能夠對所提供的輸入生成連續的內容。也就是說,給定一些文本,該模型試圖猜測接下來會出現哪些詞。
  • 預先訓練過的。該模型是在一個非常大的一般文本的語料庫上訓練的,目的是為了訓練一次,用於很多不同的事情,而不需要從頭開始重新訓練。

更多關於預訓練的內容......模型是在一個非常大的普通文本語料庫上訓練的,表面上涵蓋了大量可想像的主題。這或多或少意味著 "從網際網路上刮來的",而不是從一些專門的文本庫中提取的。通過對一般文本的訓練,一個語言模型比在非常具體的文本類型上訓練的語言模型更有能力應對更廣泛的輸入,例如,從醫療文件中訓練的語言模型。一個在一般語料庫上訓練的語言模型,理論上可以合理地回應任何可能出現在網際網路上的文件。它可能會對醫療文本做得很好。一個只在醫療文件上訓練的語言模型可能對與醫療背景有關的輸入反應很好,但對其他輸入如閒聊或食譜的反應就很差。

要麼模型在很多方面都足夠好,以至於人們從來不需要訓練自己的模型,要麼人們可以做一些叫做微調的事情,也就是把預先訓練好的模型進行一些更新,使其在某項專門的任務(如醫療)上工作得更好。

現在到變換器...

  • 變換器。一種特定類型的自監督編碼器-解碼器深度學習模型,具有一些非常有趣的特性,使其擅長於語言建模。

變換器是一種特殊類型的深度學習模型,它以一種特殊的方式對編碼進行變換,使其更容易猜出空白的單詞。它是由一篇名為 Attention is All You NeedVaswani等人在2017年發表的一篇名為Attention is All You Need的論文中提出的。轉換器的核心是經典的編碼器-解碼器網絡。編碼器做一個非常標準的編碼過程。如此虛無縹緲,你會感到震驚。但後來它又增加了一個叫自我注意的東西。

6.1 自我關注

這裡有一個自我關注的概念:一個序列中的某些詞與序列中的其他詞有關係。考慮一下這句話:"外星人登陸地球是因為它需要躲在一個星球上。"如果我們把第二個詞 "外星人 "掩蓋起來,讓一個神經網絡來猜測這個詞,它就會有更好的機會,因為有 "登陸 "和 "地球 "這樣的詞。同樣,如果我們把 "它 "掩蓋起來,讓神經網絡猜測這個詞,"外星人 "這個詞的存在可能會使它更傾向於 "它 "而不是 "他 "或 "她"。

詞與其他詞的關係是通過功能,通過指代同一事物,或通過告知彼此的含義。

我們說一個序列中的詞關注其他詞,是因為它們捕捉到了某種關係。這種關係不一定是已知的。它可能是解析代詞,可能是動詞和主語的關係,可能是與同一概念有關的兩個詞("地球 "和 "行星")。不管它是什麼,知道詞與詞之間存在某種關係對預測是很有用的。

下一節將討論自我注意的數學問題,但主要內容是,轉化器會學習輸入序列中哪些詞是相關的,然後為輸入序列中的每個位置創建一個新的編碼,這個編碼是所有相關詞的合併。你可以把這看作是學習編造一個由 "外星人"、"登陸 "和 "地球"(aliandearth)混合而成的新詞。這之所以有效,是因為每個詞都被編碼為一串數字。如果外星人=[0.1, 0.2, 0.3, ..., 0.4],登陸=[0.5, 0.6, 0.7, ..., 0.8],地球=[0.9, 1.0, 1.1, ..., 1。2],那麼第二個詞的位置可能被編碼為所有這些編碼的總和,即[1.5, 1.8, 2.1, ..., 2.4],這本身並不對應於任何一個詞,而是捕捉了所有詞的片段。這樣一來,當解碼器最終看到這個新編碼的單詞在第二個位置時,它就有了很多關於這個單詞在序列中如何使用的信息,從而對任何掩碼做出更好的猜測。(這個例子只是把編碼加在一起,但它會比這更複雜一些)。

6.2.自我關注是如何工作的?

自我關注是對虛無縹緲的編碼器-解碼器網絡的重大改進,所以如果你想知道更多關於它的工作原理,繼續閱讀。否則,請隨意跳過本節。TL;DR:自我關注是數學運算的一個花哨的名字,叫做點積

自我注意發生在三個階段。

(1) 我們對輸入序列中的每個詞進行正常編碼。我們對字的編碼做了四份拷貝。其中一份我們稱之為殘餘的,並放在一邊保存。

(2) 我們對其他三個人進行第二輪編碼(我們正在進行編碼)。每個都經歷了不同的編碼過程,所以它們都變得不同。我們稱一個為查詢(q),一個為鍵(k),一個為值(v)。

我想讓你想想一個哈希表(在python中也叫字典)。你有一大堆的信息存儲在一個表中。表中的每一行都有一個,一些唯一的標識符,以及,即存儲在該行的數據。為了從哈希表中檢索一些信息,你給出一個查詢。如果查詢與鍵相匹配,你就提取值。

一個可能用於查詢某位教授在哪所大學工作的哈希表。

自我關注的工作方式有點像模糊哈希表。你提供一個查詢,而不是尋找與鍵的精確匹配,它根據查詢和鍵之間的相似性來尋找近似的匹配。但是,如果這個匹配不是完全匹配呢?它會返回數值的一些部分。好吧,這隻有在查詢、鍵和值都是數字時才有意義。而它們就是:

一個有部分匹配的哈希表。

所以這就是我們要做的。對於輸入的每個詞的位置,我們將採取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%的單詞二)。但這說明了自我注意是如何混合和交換的。在這個極端版本中,第一個詞已經被換成了第二個詞,以此類推。因此,也許 "地球 "這個詞已經被換成了 "行星 "這個詞。

我們怎麼知道我們對qkv的編碼正確呢?如果整個網絡猜測面具的最佳單詞的能力提高了,那麼我們對qkv的編碼是正確的。如果不是,我們就改變參數,在下一次以不同的方式進行編碼。

(3) 我們所做的第三件事是把所有這些數學運算的結果加到殘差中。還記得我們擱置的原始編碼的第一份副本嗎?這是正確的,我們把混合和交換的版本加在上面。現在,"地球 "不僅僅是 "地球 "的編碼,而是某種想像中的詞,是 "地球 "和 "行星 "的混搭,pearth? ealanet?不太像。無論如何,這是最終的轉換編碼,將被發送到解碼器。我們也許可以同意,在每個位置上有一個真正編碼為兩個或更多單詞的假詞,對基於每個位置上的一個單詞進行預測更有用。

然後你再一個接一個地做幾次(多層)。

我漏掉了很多關於編碼器的最終編碼如何進入解碼器的細節(另一輪關注,稱為源關注,其中編碼器對每個位置的編碼被用作qk,以應用於另一個不同版本的v),但在這一點上你應該有一個大致的要點。在最後,解碼器從編碼器那裡接收編碼,為單詞發送能量到前臂,我們挑選能量最強的單詞。

7.為什麼大型語言模型如此強大?

那麼,這一切是什麼意思?大型語言模型,包括ChatGPT、GPT-4和其他模型,正好做了一件事:它們接收了一堆單詞,並試圖猜測接下來應該是什麼單詞。如果這是 "推理 "或 "思考",那麼它只是一種非常專業的形式。

但即使是這種專門的形式也顯得非常強大,因為ChatGPT和類似的東西可以做很多看起來非常好的事情:寫詩,回答關於科學和技術的問題,總結文件,起草電子郵件,甚至寫代碼,這只是其中的一些事情。為什麼它們要做得這麼好?

秘訣有兩個方面。第一個我們已經談過了:轉化器學會了混合單詞的語境,使其真正擅長猜測下一個單詞。秘訣的另一部分是如何訓練這些系統。大型語言模型是在從網際網路上刮來的大量信息上訓練的。這包括書籍、博客、新聞網站、維基百科文章、reddit討論、社交媒體對話。在訓練過程中,我們從這些來源之一輸入一個文本片段,要求它猜測下一個詞。記住:自我監督。如果它猜錯了,我們就稍微調整一下模型,直到它猜對為止。如果我們考慮一下LLM被訓練來做什麼,它就是產生可能合理地出現在網際網路上的文本。它不可能記住網際網路,所以它使用編碼來做出妥協,並得到一些錯誤的東西,但希望不要太錯。

重要的是,不要低估網際網路上的文本在主題方面的多樣性。法律碩士們已經看到了這一切。他們已經看到了數十億的對話,幾乎所有的話題都有。因此,LLM可以產生看起來像是在與你對話的文字。它見過數十億首詩歌和音樂歌詞,幾乎所有可以想像的東西都見過,所以它可以產生看起來像詩歌的文字。它見過數十億份家庭作業和它們的解決方案,所以它可以對你的作業做出合理的猜測,即使略有不同。它已經看到了數十億的標準化測試問題和它們的答案。我們真的認為今年的SAT試題與去年的有什麼不同嗎?它見過人們談論他們的假期計劃,所以它能猜出那些看起來像假期計劃的詞。它見過數十億的代碼例子,做各種各樣的事情。電腦程式員所做的很多事情都是將用於做非常典型的、被充分理解的事情的代碼片段組裝成更大的代碼塊。

因此,LLM可以為你寫那些小的、常見的片段。它在stackoverflow.com上看到了數以億計的錯誤代碼及其更正的例子。是的,所以它可以接受你的錯誤代碼並提出修復建議。它見過數十億人在推特上說他們碰了熱爐子,燒傷了手指,所以法律碩士知道一些常識。它讀過很多科學論文,所以它能猜出眾所周知的科學事實,即使它們對你來說並不知名。它見過數十億人總結的例子,把文字改寫成要點,描述如何使文字更符合語法、更簡潔或更有說服力。

重點是:當你要求ChatGPT或其他大型語言模型做一些聰明的事情時--而且成功了--你很有可能要求它做一些它已經看過的數十億個例子。即使你想出一些非常獨特的東西,比如 "告訴我Flash Gordon在吃了六個卷餅後會做什麼"(這是否獨特,我甚至不知道),它也看過關於Flash Gordon的粉絲小說,也看過人們談論吃了太多的卷餅,並且可以--因為自我注意--混合和匹配一些片段,以組裝一個合理的聽起來的反應。

在與大型語言模型互動時,我們的第一直覺不應該是 "哇,這些東西一定非常聰明,非常有創造力,非常善解人意"。我們的第一直覺應該是 "我可能要求它做一些它以前見過的零碎的東西"。這可能意味著它仍然非常有用,即使它沒有 "非常努力地思考 "或 "做一些非常複雜的推理"。

我們不必用擬人化的方式來理解它在做什麼,為我們提供一個回應。

關於這個主題的最後一點說明:由於大型語言模型的工作方式和訓練方式,它們傾向於提供有點像中位數反應的答案。對我來說,在問了一個關於閃電俠的故事後,模型傾向於給出平均答案,這可能顯得非常奇怪。但在一個故事,或一首詩的背景下,可以認為這些回答是很多人(在網際網路上寫作)在不得不妥協的情況下會想出的東西。它不會是壞的。以一個人坐在那裡獨自思考問題的標準來看,它可能相當不錯。但你的故事和詩歌可能也只是普通的(但它們對你來說是特別的)。對不起。

8.我應該注意什麼?

變形金剛的工作方式和訓練方式產生了一些真正微妙的影響。以下是技術細節的直接影響。

  • 大型語言模型是在網際網路上訓練的。這意味著他們也對人類的所有黑暗部分進行了訓練。大型語言模型在種族主義的咆哮、性別歧視的尖叫、對各種類型的人的侮辱、對他人的刻板印象的假設、陰謀論、政治錯誤信息等方面進行過訓練。這意味著,語言模型選擇生成的詞語可能會反芻這種語言。
  • 大型語言模型沒有 "核心信念"。它們是詞語猜測者;它們試圖預測如果同一個句子出現在網際網路上,接下來的詞語會是什麼。因此,人們可以要求大型語言模型寫一個贊成某事的句子,或反對同一事物的句子,而語言模型將遵守這兩種方式。這些並不表明它相信一件事或另一件事,或改變其信念,或一個比另一個更正確。如果訓練數據中有更多關於一件事與另一件事的例子,那麼一個大型的語言模型將傾向於對更經常出現在其訓練數據中的東西作出更一致的反應,因為它更經常出現在網際網路上。記住:該模型正在努力模仿最常見的反應。
  • 大語言模型沒有任何真理或對錯的感覺。有些事情我們認為是事實,比如地球是圓的。一個大型語言模型會傾向於這樣說。但是如果上下文是正確的,它也會說相反的話,因為網際網路上確實有關於地球是平的文字。不能保證法學碩士會提供真相。可能會有一種猜測我們認為是真實的詞語的傾向,但這是我們最接近於對LLM "知道 "真相或對或錯的 說法。
  • 大型語言模型會犯錯誤。訓練數據可能有很多不一致的材料。當我們提出問題時,自我注意可能不會注意到我們希望它注意的所有事情。作為一個單詞猜測器,它可能會做出不幸的猜測。有時,訓練數據中的一個詞見得多了,以至於它更喜歡這個詞,即使它對輸入的內容沒有意義。上述情況導致了一種被稱為 "幻覺 "的現象,即猜測出一個既不來自輸入也不 "正確 "的詞。LLMs有傾向於猜測小數字而不是大數字,因為小數字更常見。所以LLM們的數學水平並不高。LLMs對數字 "42 "有偏好,因為人類確實是因為某本名著。LLMs對更常見的名字有偏好,所以可能會編造作者的名字。
  • 大型語言模型是自動回歸的。因此,當它們做出我們可能認為很差的猜測時,這些猜測的詞會被添加到它們自己的輸入中,以做出下一個詞的猜測。也就是說:錯誤會累積。即使只有1%的出錯機率,那麼自我注意也會注意到那個錯誤的選擇,並對那個錯誤加倍注意。即使只犯了一個錯誤,後面的一切都可能與這個錯誤聯繫在一起。那麼語言模型就可能在此基礎上再犯錯誤。變形金剛沒有辦法 "改變主意 "或再試一次或自我糾正。他們隨波逐流。
  • 人們應該總是驗證大型語言模型的輸出。如果你要求它做一些你自己不能勝任的驗證的事情,那麼你應該考慮一下你是否可以對所犯的任何錯誤採取行動。對於低風險的任務,如寫一個短篇小說,這可能是好的。對於高風險的任務,如試圖獲得信息以決定投資哪只股票,也許這些錯誤會導致你做出一個非常昂貴的決定。
  • 自我關注意味著你在輸入提示中提供的信息越多,反應就越專業,因為它在猜測中會混入更多你的話。反應的質量與輸入提示的質量成正比。更好的提示會產生更好的結果。嘗試幾個不同的提示,看看什麼對你最有效。不要假設語言模型 "明白 "你要做什麼,並會在第一次就給它最好的機會。
  • 你並不是真的在和一個大型語言模型 "對話"。一個大型的語言模型不會 "記住 "交流中發生的事情。你的輸入進去了。響應就出來了。LLM什麼都不記得。你的初始輸入、回應和你對回應的回應都會進入。因此,如果它看起來像是在記憶,那是因為對話的記錄變成了一個新的輸入。這是前端的一個編程技巧,使大型語言模型看起來像是在進行對話。由於這個技巧,它可能會保持話題,但不能保證它不會與之前的回答相矛盾。另外,向大型語言模型輸入多少單詞是有限制的(目前ChatGPT允許大約4000個單詞,GPT-4允許大約32000個單詞)。輸入的大小可以相當大,所以對話往往會在一段時間內看起來保持連貫性。最終,累積的日誌會變得太大,對話的開頭會被刪除,系統會 "忘記 "先前的事情。
  • 大型語言模型不做問題解決或計劃。但是你可以要求它們創建計劃和解決問題。我在這裡要分清一些事情。問題解決計劃是人工智慧研究界的某些團體保留的術語,意味著非常具體的東西。特別是,它們意味著有一個目標--你想在未來完成的事情--並通過在有可能使人更接近該目標的備選方案中做出選擇來實現該目標。大型語言模型沒有目標。它們有一個目標,那就是在輸入序列的情況下,選擇一個最可能出現在訓練數據中的詞。它們是模式匹配的。尤其是規劃,通常涉及到一種叫做前瞻的東西。當人類做計劃時,他們想像自己行動的結果,並分析該未來與目標的關係。如果它看起來能讓人更接近目標,那就是一個好的行動。如果不是這樣,我們可能會嘗試想像另一個行動的結果。這裡面有很多東西,但關鍵的一點是,大型語言模型沒有目標,也不做前瞻。變形器是向後看的。自我關注只能應用於已經出現的輸入詞。現在,大型語言模型可以生成看起來像計劃的輸出,因為它們在訓練數據中看到了大量的計劃。他們知道計劃是什麼樣子的,他們知道關於他們所看到的某些主題的計劃中應該出現什麼。它要對該計劃進行良好的猜測。該計劃可能會忽略關於世界的特定細節,而傾向於最通用的計劃。大型語言模型當然沒有 "考慮過其他選擇",也沒有嘗試過一件事,然後回溯並嘗試另一件事。在變壓器內部沒有任何可以指出的機制可以對未來進行這樣的反反覆覆的考慮。(這一點有一個注意事項,將在下一節中出現。)在要求計劃時一定要驗證輸出。

9.是什麼讓ChatGPT如此特別?

"所以我聽說RLHF是使ChatGPT真正聰明的原因。"

"ChatGPT使用強化學習,這就是它的聰明之處。"

嗯......算是吧。

在寫這篇文章的時候,有一個叫RLHF的東西引起了很多人的興奮,也就是帶人類反饋的強化學習。有幾件事情是用來訓練ChatGPT的(以及越來越多的其他大型語言模型)。它們並不完全是新的,但在ChatGPT發布時,它們被廣泛引入,產生了巨大的效果。

ChatGPT是一個基於轉化器的大型語言模型。ChatGPT因善於對輸入提示做出反應,以及拒絕回答有關某些可能被認為是有毒或有意見的話題而贏得了聲譽。它並沒有做任何與上述內容特別不同的事情。事實上,它是很虛的。但有一個區別:它是如何訓練的。ChatGPT的訓練是正常的--從網際網路上搜出一大塊文本,取其片段,讓系統預測下一個詞。這就產生了一個基礎模型,它已經是一個非常強大的單詞預測器(相當於GPT-3)。但隨後又有兩個額外的訓練步驟。指令調整帶有人類反饋的強化學習。

9.1.指令微調

大型語言模型有一個特別的問題:它們只想接受一個輸入的單詞序列,並生成接下來的內容。大多數情況下,這就是人們想要的。但並非總是如此。考慮一下下面的輸入提示:

"寫一篇關於亞歷山大-漢密爾頓的文章。"

你認為回答應該是什麼。你可能在想它應該是這樣的:"亞歷山大-漢密爾頓於1757年出生在尼維斯。他是一位政治家、律師、陸軍上校和美國第一任財政部長......"但實際上你可能得到的是:

"你的論文應該至少有五頁,雙倍行距,並包括至少兩個引文。"

剛剛發生了什麼?好吧,語言模型可能已經看到了很多學生作業的例子,這些作業以 "寫一篇關於......的文章 "開始,並包括詳細說明長度和格式的文字。當然,當你寫下 "寫一篇文章...... "時,你在想你是在向語言模型寫指令,就好像它是一個理解意圖的人。語言模型不理解你的意圖,也沒有自己的意圖;它們只將輸入與它們在訓練數據中看到的模式相匹配。

為了解決這個問題,人們可以做一些叫做指令微調的事情。這個想法相當簡單。如果你得到了錯誤的反應,寫下正確的反應應該是什麼,並通過神經網絡發送原始輸入和新的、修正的輸出作為訓練數據。有了足夠多的糾正輸出的例子,系統將學會改變它的電路,使新的答案成為首選。

人們不需要做任何太花哨的事情。只要讓很多人與大型語言模型互動,要求它做很多事情,並寫下它行為不正確時的糾正。然後收集所有這些它犯了錯誤的例子和新的、正確的輸出,並進行更多的訓練。

這使得大型語言模型表現得好像它理解了輸入提示的意圖,並表現得好像它在遵循指令。除了試圖猜測下一個詞之外,它沒有做任何事情。但是現在,新的訓練數據讓它猜出了似乎對輸入更有反應的詞。

9.2.從人類反饋中強化學習

訓練的下一步是對人類反饋的強化學習。我想這需要解釋一下。

強化學習是一種人工智慧技術,傳統上用於一些機器人研究,也用於虛擬遊戲代理(想想能下西洋棋、圍棋或星際爭霸的人工智慧系統)。強化學習尤其擅長在得到一種叫做獎勵的東西時找出該做什麼。獎勵只是一個數字,表明它做得有多好(做得非常好的為+100;做得非常差的為-100)。在現實世界和遊戲中,獎勵往往很少給予。在遊戲中,你可能要做很多動作才能得到任何積分。也許你只有在遊戲的最後才得到積分。在現實世界中,只是沒有足夠的人告訴你什麼時候你做的好(你是)。除非你是一隻狗(他們都是好孩子)。你真正需要知道的是,強化學習系統試圖預測他們未來會得到多少獎勵,然後選擇最有可能獲得更多未來獎勵的行動。這與人們使用狗食來教自己的狗行為的方式並不完全不同。

好吧,把這些都藏起來,考慮一下下面的提示:

馬克是什麼方面的專家?

假設語言模型的輸出是:

馬克在人工智慧、圖形學和人機互動方面有許多著作。

這只是部分正確。我不在圖形方面發表文章。我真的只想給這個大拇指,或-1分。但只有一個部分是錯的:圖形這個詞。如果我告訴系統整個句子都是錯的,語言模型可能會學習到所有這些詞都應該被避免。好吧,這些詞中有很多是合理的。

這就是強化學習的意義所在。強化學習的工作原理是嘗試不同的選擇,看哪種選擇能得到最多的獎勵。假設我要求它對原始提示產生三種不同的反應。

馬克在人工智慧、圖形學和人機互動方面有許多著作。

馬克曾在人工智慧、安全NLP系統和人機互動方面工作。

標記為研究人工智慧、遊戲AI和圖形。

我可以對第一種選擇豎起大拇指(-1),對第二種選擇豎起大拇指(+1),而對第三種選擇豎起大拇指(-1)。就像玩遊戲一樣,強化學習算法可以回顧並發現導致-1的一個共同點是 "圖形 "這個詞。現在,系統可以鎖定這個詞,並調整神經網絡電路,使其不與該特定的輸入提示一起使用這個詞。

再一次,我們將讓一群人與大型語言模型互動。這一次,我們將給人們三個(或更多)可能的反應。我們可以通過要求大型語言模型對一個提示作出若干次反應來做到這一點,並在選擇前鋒臂時引入一點隨機性(沒有忘記這些,是嗎?)我們有時可能不會選擇激活度最高的前鋒臂,而是選擇激活度第二或第三的前鋒臂。這就給出了不同的文字反應,我們要求人們挑選他們最喜歡的第一個反應,第二個最喜歡的,以此類推。現在我們有了備選方案,也有了數字。現在我們可以使用強化學習來調整神經網絡電路。

[實際上,我們使用這些大拇指和小拇指的反饋來訓練第二個神經網絡,以預測人們是否會豎起大拇指或小拇指。如果這個神經網絡在預測人們會喜歡什麼方面足夠好,那麼我們就可以用這個第二個神經網絡來猜測語言模型的反應是否可能得到大拇指或小拇指,並利用這個來訓練語言模型。]

強化學習所做的是把文本的生成當作一個遊戲,每個動作都是一個詞。在一個序列結束時,語言模型被告知它是贏得了一些分數還是失去了一些分數。語言模型並不完全是像上一節所討論的那樣做前瞻,但它在某種意義上已經被訓練成預測哪些詞會被豎起大拇指。大型語言模型仍然沒有一個明確的目標,但它有一個 "獲得大拇指 "的隱性目標(或者我們也可以說它有 "滿足普通人 "的隱性目標),並且已經學會將對某些提示的某些反應與獲得大拇指相關聯。這有很多計劃的特質,但沒有明確的前瞻機制。更像是它已經記住了在很多情況下都有效的獲得獎勵的策略。

對於RLHF是否使ChatGPT更加智能這個大問題......它使ChatGPT更有可能產生我們希望看到的那種反應。它看起來更聰明,因為它的輸出似乎傳達了一種感覺,即它理解了我們輸入的意圖,並有自己的意圖來回應。這是個假象,因為它仍然只是在對文字進行編碼和解碼。但話說回來,這就是我們這篇文章的出發點。

指令調整和RLHF也使得使用ChatGPT可以抵制某些類型的濫用,如產生種族主義、性別歧視或政治性的內容。它仍然可以做到,而且無論如何,GPT-3的舊版本總是能夠做到這一點。然而,作為一個面向公眾的免費服務,ChatGPT對某些類型的濫用所產生的摩擦傳達了一種安全感。它也抵制把意見當作事實來提供,這也消除了對用戶的一種潛在傷害。

[使用強化學習來修改預先訓練好的語言模型並不新鮮。它至少可以追溯到2016年,並被用來使大型語言模型更加安全。大多數基於強化學習的大型語言模型的調整使用第二個模型來提供獎勵,這也是ChatGPT所做的。ChatGPT值得注意的是,用強化學習調整的系統規模,以及大規模的人類反饋收集工作]。

10.結論

我需要得到更多的睡眠。這就是我從這一切中得出的結論。

關鍵字: