簡介
本文旨在讓沒有計算機科學背景的人對ChatGPT和類似的人工智能系統(tǒng)(GPT-3、GPT-4、Bing Chat、Bard等)的工作原理有一些了解。ChatGPT是一種基于大語言模型(Large Language Model) 的對話式AI聊天機器人。這些詞匯當前還比較陌生,但我們將逐步拆解,討論它們背后的核心概念。這篇文章不需要任何技術或數(shù)學背景,我們通過大量比喻來說明這些概念,討論核心概念的工作方式,以及ChatGPT這樣的大語言模型可以或不可以做什么。
這就是本文要做的,在沒有任何術語的情況下慢慢講解與大語言模型和ChatGPT相關的術語,對于必要術語,我將用常見詞匯來拆解解釋。我們從"什么是人工智能"開始,逐步深入。我會盡可能多的使用重復出現(xiàn)的比喻,從我們應該期望AI能做什么或不能做什么來談論這些技術的含義。
出發(fā)!
1. 什么是人工智能(Artificial Intelligence)?
我們先從一些可能經(jīng)常聽到的基本術語開始。什么是人工智能(artificial intelligence) ?
- 人工智能 : 如果一個實體的行為和人類類似,這個實體可能會被稱之為智能。
"智能"的定義并沒有達成一致,因此用"智能"這個詞來定義人工智能有點問題,不過我覺得這仍然相當不錯。基本上可以認為,如果看一些人工的東西,做一些吸引人的、有用的、讓人驚嘆的事情,就可以稱之為智能。例如,我們經(jīng)常將"AI"一詞歸因于電腦游戲中由電腦控制的角色,這些機器人大多是簡單的if-then-else代碼(例如: 例如,"如果玩家在射程內,那么射擊,然后移動到……")。但如果工作會讓我們保持投入和興奮,而不是做那些明顯的傻事,我們可能會認為這些工作更復雜。
我們一旦了解了某些東西是如何工作的,可能并不會留下太深刻的印象,而且會期望在幕后看到更復雜的東西,這完全取決于你對幕后發(fā)生事情了解多少。
重點是,人工智能不是魔法。因為不是魔法,所以可以解釋。
讓我們開始吧。
2. 什么是機器學習(Machine Learning)?
你經(jīng)常聽到的另一個與人工智能相關的術語是機器學習(machine learning) 。
- 機器學習 : 一種通過獲取數(shù)據(jù),形成模型,然后執(zhí)行模型來創(chuàng)建行為的方法。
有時候,手動創(chuàng)建一堆if-then-else語句來捕捉復雜的現(xiàn)象(比如語言)非常困難。在這種情況下,我們試圖找到一堆數(shù)據(jù),并用可以在數(shù)據(jù)中找到的模式來建模的算法。
但什么是模型呢?模型是對一些復雜現(xiàn)象的簡化。例如,模型汽車是一輛真正汽車的更小、更簡單版本,它有許多屬性,但并不意味著完全取代原來的汽車。一輛模型車可能看起來很真實,有時候很有用,但不能開它去購物。
就像我們能造出更小更簡單的汽車一樣,我們也能造出更小更簡單的人類語言。我們用術語" 大語言模型(large language models) ",因為考慮到它們需要多少內存,這些模型非常大。生產(chǎn)中最大的模型,如ChatGPT、GPT-3和GPT-4,大到需要在數(shù)據(jù)中心服務器上運行大型超級計算機來創(chuàng)建和運行。
3. 什么是神經(jīng)網(wǎng)絡(Neural Network)?
有許多從數(shù)據(jù)中學習模型的方法,神經(jīng)網(wǎng)絡就是其中之一。該技術大致模仿人類大腦通過神經(jīng)元相互連接的腦細胞網(wǎng)絡而組成,這些神經(jīng)元來回傳遞電信號,以某種方式使人類能夠完成各種任務。20世紀40年代提出了神經(jīng)網(wǎng)絡的基本概念,但直到20世紀80年代才發(fā)明了訓練神經(jīng)網(wǎng)絡的基本概念。神經(jīng)網(wǎng)絡效率非常低下,直到2017年左右,由于計算機硬件的發(fā)展,才讓大規(guī)模使用神經(jīng)網(wǎng)絡成為可能。
不過,相對于大腦,我更喜歡用電路來比喻神經(jīng)網(wǎng)絡。即使你不是電氣工程師,也應該知道電是通過電線流動的,而有種叫做電阻的東西,可以阻礙電流經(jīng)過電路的某些部分。
假設你想做一輛能在高速公路上行駛的自動駕駛汽車,汽車的前部、后部和側面都配備了距離傳感器,當有什么東西非常接近時,傳感器報告數(shù)值為1.0,而當附近沒有任何東西時,報告數(shù)值為0.0。
你還調整了汽車的控制,使自動裝置可以轉動方向盤、踩剎車、踩油門。當加速器接收到值1.0時,表示用最大的加速度,0.0表示不加速。同樣,發(fā)送給制動裝置的值1.0表示猛踩剎車,0.0表示不剎車。發(fā)送給轉向裝置的值為-1.0到+1.0,負值表示向左轉向,正值表示向右轉向,0.0表示保持直線。
你還得記錄駕駛數(shù)據(jù)。當前方道路暢通時,就加速。前面有車時,要減速。當一輛車從左邊靠得太近時,就向右轉,改變車道(除非右邊也有一輛車)。這是一個復雜的過程,涉及基于不同傳感器信息的不同動作組合(向左轉向,向右轉向,加速或減速,剎車)。
現(xiàn)在要把傳感器和自動裝置連接起來。該怎么做?目前還不清楚。所以你把每個傳感器和每個自動裝置驅動器連接起來。
作為電路連接傳感器和執(zhí)行器的神經(jīng)網(wǎng)絡。
就這樣開車上路的話會發(fā)生什么?電流從所有傳感器流向所有執(zhí)行器,汽車同時向左、向右轉向、加速和剎車,一團糟。
當傳感器發(fā)送電流時,會流向所有執(zhí)行器,汽車就會同時加速、剎車和轉向。
這可不行。所以我想在電路的不同部分放上電阻,這樣電流就只能在某些傳感器和某些執(zhí)行器之間流動。例如,我希望電流只從前方距離傳感器流向剎車,而不是流向方向盤。此外,我還放了一些叫做門的東西,可以阻止電流流動,直到電力積累到足夠翻轉開關(只有當前方距離傳感器和后方距離傳感器報告的數(shù)字比較高時才允許電流流動),或者只有在輸入電流強度低時才流動(當前方距離傳感器報告數(shù)值較低時向加速器發(fā)送更多電流)。
但把這些電阻和門放在哪里呢?不知道。一開始我把它們隨意放在各個地方,然后再試一次。也許這次車開得更好了,它在數(shù)據(jù)顯示應該剎車的時候剎車,應該轉向的時候轉向,等等。但并不是每件事都做對了,有些事情做得更糟(數(shù)據(jù)顯示需要剎車的時候它卻加速了),所以我一直隨機嘗試電阻和門的不同組合。最終,我偶然發(fā)現(xiàn)一種效果足夠好的組合,成功了。也許看起來像這樣:
經(jīng)過訓練的神經(jīng)網(wǎng)絡。較暗的線表示電路中電流可以自由流動的部分。中間的圓圈是門,在將電流發(fā)送到上面的執(zhí)行器之前,可能會從下面的傳感器積累大量電流,或者可能在幾乎沒有電流的情況下發(fā)送電流。
(我們在現(xiàn)實中不能增加或減少門,它們總是存在的,但可以修改門,使它們以更少或更多的電流激活。純粹的機器學習主義者可能會對這種描述感到惡心。不過從技術上說,這是通過調整門的偏置(bias) 來完成的,通常不會在圖表中顯示,但就電路比喻而言,可以將其視為直接插入電源的門的導線,然后可以像其他導線一樣進行修改。)
讓我們試駕一下吧!
隨機嘗試是種很糟糕的方式,有一種被稱為反向傳播(back propagation) 的算法在猜測如何改變電路的配置方面相當出色。算法細節(jié)并不重要,只需要知道算法會對電路進行微小調整,讓電路的行為更接近數(shù)據(jù)的建議,經(jīng)過數(shù)百萬次調整,最終使電路與數(shù)據(jù)一致。
我們把電阻和門稱為參數(shù),但實際上參數(shù)無所不在,反向傳播算法會聲明每個電阻的強弱,因此一旦知道了電路的布局和參數(shù),就可以復制到其他汽車上。
4. 什么是深度學習(Deep Learning)?
深度學習可以讓我們在電路中加入除了電阻和門之外的其他東西。例如,可以在電路中進行數(shù)學計算,在輸出電流之前進行相加或相乘。深度學習仍然使用一樣基本增量技術猜測參數(shù)。
5. 什么是語言模型(Language Model)?
在汽車的例子里,我們試圖讓神經(jīng)網(wǎng)絡的行為與數(shù)據(jù)一致,從而創(chuàng)造出一種能夠操縱汽車機械裝置的電路,模擬司機的行為。我們可以用同樣的方式對待語言,看看人類寫的文本,并嘗試電路是否能產(chǎn)生與人類產(chǎn)生的單詞序列非常相似的單詞序列。現(xiàn)在,當傳感器看到單詞時就會啟動,輸出的也是單詞。
我們要做什么?嘗試創(chuàng)建一個電路,在給定一堆輸入單詞的情況下,猜測輸出單詞。例如:
"Once upon a ___"
我們傾向于從概率角度來討論語言模型,上述例子的數(shù)學形式為:
如果不熟悉這個符號,別擔心,這只是一個數(shù)學術語,意思是"time"這個詞在給定(|符號的意思表示 給定 )一堆單詞"once"、"upon"和"a"條件下出現(xiàn)的概率(P)。我們期望好的語言模型輸出"time"這個詞的概率比"armadillo"這個詞的概率高。
可以將其概括為:
意思是計算序列中第n個單詞在給定在它之前所有單詞(從位置1到n-1的單詞)的條件下出現(xiàn)的概率。
不過現(xiàn)在退一步,想想老式打字機,就是那種有撞針的打字機。
DALL-E2生成了這張照片,看看那些撞針!
除了每個字母都有不同的撞針,我們給每個單詞都裝上一個撞針,如果英語有5萬個單詞,那么這會是一臺巨大的打字機!
設想一個與汽車網(wǎng)絡不同但類似的網(wǎng)絡,電路頂部有5萬個輸出連接到撞針上,每個單詞一個。相應的,有5萬個傳感器,每個傳感器檢測不同輸入單詞。最終選擇一個能得到最高電流信號的撞針,對應的單詞就會出現(xiàn)在空白紙上。
現(xiàn)在的情況是,如果想做一個簡單的電路,輸入一個單詞并產(chǎn)生一個單詞,就必須做一個有5萬個傳感器(每個單詞一個)和5萬個輸出(每個撞針一個)的電路。只需將傳感器連接到撞針上,總共50000 × 50000 = 25億根電線。
底部的每個圓圈表示一個單詞,需要5萬個傳感器來識別單詞"once",電流通過網(wǎng)絡隨意傳播,上面每個圓圈都連接到一個單詞的撞針上,所有撞針都得到了一些電流,但其中某個會得到更多的電流。
這是個很大的網(wǎng)絡!
更糟的是,如果我想以"Once upon a ___ "為例,需要感知三個輸入位置都是哪個單詞,將會需要50000 × 3 = 150,000個傳感器,連接到5萬個撞針,得到15萬 × 5萬 = 75億個電線。截至2023年,大多數(shù)大型語言模型可以接收4000個單詞,最大的可以接收3.2萬個單詞。我要哭了。
以三個單詞作為輸入的網(wǎng)絡,每個單詞需要50000個傳感器。
需要一些技巧來處理這種情況,我們將分階段進行。
5.1 編碼器(Encoders)
第一件事是把電路分成兩個電路,一個叫編碼器(encoder) ,一個叫解碼器(decoder) 。由于許多單詞的意思大致相同,比如以下短語:
The king sat on the ___
The queen sat on the ___
The princess sat on the ___
The regent sat on the ___
對于上面所有空格,一個合理的猜測是"throne"(或者"toilet")。也就是說,可能不需要在"king"和"throne"之間、"queen"和"throne"之間進行區(qū)分,相反,如果有一些近似意味著"royalty"的東西,每次看到"king"或"queen",就可以用這個東西來代替。然后就只需要關心哪些單詞的意思大致相同,然后該怎么做(向"throne"發(fā)送大量電流)。
這就是我們要做的。設置一個電路,有5萬個單詞的傳感器,并映射到一些較小的輸出集合(比如256個而不是5萬個)。同時不是只能觸發(fā)一個撞針,而是可以一次觸發(fā)一堆。每種可能的撞針組合都可以代表不同的概念(如"royalty"或"armored mammals")。這256個輸出使我們能夠表示 個概念,而在現(xiàn)實中甚至更多。就像在汽車的例子中,可以踩下部分剎車,這256個輸出的每一個都處于1.0和0.0之間。也許更貼切的比喻是256只撞針都向下?lián)舸颍恐涣Χ炔煌?/p>
好吧,以前一個單詞需要5萬個傳感器中的某一個來激活,現(xiàn)在我們把一個激活的傳感器和49999個關閉的傳感器濃縮成256個數(shù)字。所以"king"可能是[0.1, 0.0 , 0.9, …, 0.4],"queen"可能是[0.1, 0.1 , 0.9, …, 0.4],幾乎一樣。這些數(shù)字列表被稱為 encodings (由于歷史原因也稱為 隱藏狀態(tài)hidden state ,但我不想解釋這個,所以我們將堅持使用encoding)。把5萬個傳感器壓縮成256個輸出的電路被稱為 encoder ,看上去是這樣的:
encoder網(wǎng)絡將監(jiān)測單個單詞所需的5萬個傳感器值壓縮為256個數(shù)字編碼(較淺和較深的藍色用于表示較高或較低的值)。
5.2 解碼器(Decoders)
但編碼器不會告訴我們下一個單詞應該是哪個,所以我們將編碼器與解碼器網(wǎng)絡配對。解碼器是另一個電路,采用256個數(shù)字構成編碼,并激活原始的5萬個撞針,每個單詞一個,然后選擇輸出電量最高的單詞,看起來是這樣的:
解碼器網(wǎng)絡將編碼中的256個值擴展為與每個可能的單詞相關聯(lián)的5萬個撞針的激活值,數(shù)值最高的單詞被激活。
5.3 編碼器和解碼器的組合
編碼器和解碼器一起工作,形成一個大神經(jīng)網(wǎng)絡:
編碼器-解碼器網(wǎng)絡。
順便說一下,通過編碼實現(xiàn)單個單詞輸入單個單詞輸出只需要(50000 × 256) × 2 = 2560萬個參數(shù),看起來好多了。
這個例子是一個單詞輸入并產(chǎn)生一個單詞輸出,所以如果想要讀取n個單詞,將有50000 × n個輸入,編碼后將有256 × n個輸入。
為什么會這樣?通過將5萬個單詞都壓縮到一個小的數(shù)字集合中,我們迫使網(wǎng)絡做出妥協(xié),并將可能觸發(fā)相同輸出單詞的輸入單詞分組在一起。這很像文件壓縮,壓縮文本文檔時,我們會得到一個較小的不可讀的文檔。但可以解壓縮文檔并恢復原始可讀文本。因為zip程序用符號替換了某些單詞模式,解壓縮時知道要將哪些文本替換符號。編碼器和解碼器電路學習了某種電阻和門的配置,可以用來壓縮和解壓縮單詞。
5.4 自監(jiān)督(Self-Supervision)
怎么才能知道每個單詞的最佳編碼方式?換句話說,怎么知道"king"的編碼應該與"queen"的編碼相似,而不是"armadillo"?
作為思想實驗,考慮一個編碼器-解碼器網(wǎng)絡,接收一個單詞(5萬個傳感器)并產(chǎn)生完全相同的單詞作為輸出。這是件蠢事,但對接下來的事情很有啟發(fā)意義。
編碼器-解碼器網(wǎng)絡被訓練輸出與輸入相同的單詞。
輸入"king",一個傳感器通過編碼器發(fā)送電信號,并在中間部分打開編碼中的256個值。如果編碼正確,那么解碼器將向同一個單詞"king"發(fā)送最高的電信號。容易對不對?先別下結論。很有可能會看到帶有"armadillo"字樣的撞針具有最高的電能,假設"king"的撞針得到0.051的電信號,"armadillo"的撞針得到0.23的電信號。而實際上我們根本不在乎"armadillo"的值是多少,可以只看"king"的輸出能量,就知道它不是1.0。1.0和0.051之間的差異是誤差(也稱為 損耗 ),可以用反向傳播對解碼器和編碼器進行一些更改,以便下次看到單詞"king"時的編碼稍微不同。
我們對所有單詞都這樣做,而編碼器將不得不妥協(xié),因為256比50000小得多。也就是說,有些詞必須使用相同的能量組合。因此選擇時,會希望"king"和"queen"的編碼幾乎相同,而"armadillo"的編碼則非常不同,這將使解碼器通過查看256個編碼值來更好的猜測單詞。如果解碼器看到256個值的特定組合,并猜測"king"為0.43,"queen"為0.42,只要"king"和"queen"得到最高的電信號,并且其余49998個撞針都得到較小的數(shù)字,就可以接受。另一種說法是,我們可能更容易接受網(wǎng)絡混淆king和queen,而不是混淆king和armadillo。
我們說神經(jīng)網(wǎng)絡是自我監(jiān)督(self-supervised) 的,因為與汽車的例子不同,不需要單獨收集數(shù)據(jù)來測試輸出,而只需要比較輸出和輸入(不需要為輸入和輸出單獨提供數(shù)據(jù))。
5.5 掩碼語言模型(Masked Language Models)
上面的思維實驗看起來很傻,但是所謂的掩碼語言模型的基石,其思想是接收一個單詞序列并生成一個單詞序列,但掩蓋輸入和輸出中的一個單詞。
The [MASK] sat on the throne.
網(wǎng)絡會猜測所有單詞,我們只關心網(wǎng)絡對掩蔽詞的猜測。也就是說,對于輸出的每個單詞,有5萬個撞針,我們來看看這5萬個掩蔽詞的撞針。
掩碼序列。紅線表示上下所有東西之間的很多很多連接。
可以移動掩碼,讓網(wǎng)絡在不同的地方猜測不同的單詞。
一種特殊類型的掩碼語言模型只在末尾有掩碼,這被稱為生成模型,因為猜測的掩碼總是序列中的下一個單詞,相當于生成下一個單詞,看上去是這樣的:
The [MASK]
The queen [MASK]
The queen sat [MASK]
The queen sat on [MASK]
The queen sat on the [MASK]
我們也稱其為自回歸(auto-regressive) 模型。回歸(regressive) 這個詞聽起來不太好,但只是意味著試圖理解事物之間的關系,比如已經(jīng)輸入的單詞和應該輸出的單詞。Auto的意思是"自我",自回歸模型是自我預測的,預測下一個單詞,然后這個單詞又被用來預測下一個單詞,以此類推。其中有些有趣的含義,稍后會講到。
6. 什么是轉移模型(Transformer)?
我們聽過很多關于GPT-3、GPT-4和ChatGPT的東西。GPT是OpenAI公司開發(fā)的一種大語言模型的特定品牌。GPT代表生成式預訓練轉移模型(Generative Pre-trained Transformer) 。我們來分析一下:
- 生成式(Generative) 。該模型能夠生成所提供輸入的延續(xù),也就是說,給定一些文本,模型試圖猜測接下來出現(xiàn)的單詞。
- 預訓練(Pre-trained) 。該模型是在一個非常大的通用文本語料庫上進行訓練的,只需訓練一次,就可用于許多不同場景,而不需要從頭開始訓練。
該模型是在一個非常大的通用文本語料庫上進行訓練的,涵蓋了大量可以想到的主題。這或多或少意味著"從互聯(lián)網(wǎng)上抓取",而不是從一些專門的文本庫中獲取。通過對一般文本進行訓練,語言模型相對基于非常特定類型的文本(如來自醫(yī)療文檔的文本)上訓練的語言模型更有能力響應廣泛的輸入。在通用語料庫上訓練的語言模型理論上可以合理響應互聯(lián)網(wǎng)上文檔中可能出現(xiàn)的任何內容,但可能對醫(yī)學文本響應一般。只在醫(yī)療文檔上訓練的語言模型可能對與醫(yī)療上下文相關的輸入響應得很好,但在響應閑聊或食譜等其他輸入時就很差了。
要么模型在很多事情上都足夠好,以至于人們不需要訓練自己的模型,要么可以做一些所謂的微調(fine-tuning) ,即采用預先訓練好的模型并對其進行一些更新,使其在特定任務(如醫(yī)療)上能更好的工作。
接下來是轉移模型…
- 轉移模型(Transformer) 。一種特殊類型的自監(jiān)督編碼器-解碼器深度學習模型,具有一些非常有趣的屬性,使其擅長語言建模。
Transformer是一種特殊類型的深度學習模型,以一種特殊方式轉換編碼,使其更容易猜出空白的單詞,最早是由Vaswani等人在2017年發(fā)表的一篇名為Attention is All You Need ^[2]^ 的論文中介紹的。Transformer的核心是經(jīng)典的編碼器-解碼器網(wǎng)絡,編碼器執(zhí)行非常標準的編碼過程,你會驚訝于它的普通,但它還增加了另一種叫做自關注(self-attention) 的東西。
6.1 自關注(Self-Attention)
這是自關注的概念: 序列中的某些單詞與序列中的其他單詞相關。想想這個句子:"The alien landed on earth because it needed to hide on a planet."如果我們掩蓋第二個單詞"alien",并讓神經(jīng)網(wǎng)絡猜測,它會通過"landing"和"earth"這樣的單詞更容易的猜出來。同樣的,如果我們把"it"遮住,讓神經(jīng)網(wǎng)絡猜這個詞,"alien"這個詞的出現(xiàn)可能會讓神經(jīng)網(wǎng)絡更傾向于選擇"it",而不是"he"或"she"。
單詞通過功能、指稱同一事物或相互傳達意義而相互聯(lián)系。
我們知道,一個序列中的單詞會與其他單詞相關聯(lián),因為它們之間有某種關系,這種關系并不一定為人所知。這種關系可以是解析代詞,可以是動詞和主語的關系,也可以是與同一個概念相關的兩個單詞("earth"和"planet")。不管是什么,知道單詞之間存在某種聯(lián)系對預測很有用。
下一節(jié)將討論自關注的數(shù)學問題,要點是Transformer學習輸入序列中哪些單詞是相關的,然后為輸入序列中的每個位置創(chuàng)建一個新的編碼,該編碼是所有相關單詞的合集。可以把它想象成學習創(chuàng)造一個新詞,這個新詞是"alien"、"landing"和"earth"的混合體(aliandearth?)。每個單詞都被編碼為一個數(shù)字列表,如果alien = [0.1, 0.2, 0.3, …, 0.4],landing = [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 自關注是如何起作用的?
自關注是對普通編碼器-解碼器網(wǎng)絡的重大改進,如果想了解更多有關其工作原理的信息,請繼續(xù)閱讀,否則可以跳過本節(jié)。自關注是數(shù)學運算點積(dot product) 的一個博眼球的名字。
自關注分為三個階段。
(1) 對輸入序列的每個單詞進行正常編碼。將單詞編碼復制四份,其中一份稱為 residual ,先保存起來。 (2) 在其他三份上運行第二輪編碼(對編碼的編碼)。每一份都經(jīng)歷不同的編碼過程,所以出來的結果不同,一個為查詢(q),一個為鍵(k),一個為值(v)。
考慮有一大堆信息存儲在哈希表(在python中也稱為字典)中,每一行都有 鍵 (唯一標識符)和 值 (存儲在該行中的數(shù)據(jù))。要從哈希表中檢索信息,可以執(zhí)行查詢,如果查詢匹配到鍵,則提取對應的值。
可以用來查詢教授在哪個大學工作的哈希表。
自關注有點像一個模糊的哈希表,提供一個查詢,但不是查找與鍵的精確匹配,而是根據(jù)查詢和鍵之間的相似性查找近似匹配。如果沒有完美匹配,就返回值的一部分。這只有在查詢、鍵和值都是數(shù)值的情況下才有意義,類似這樣:
部分匹配的哈希表。
這就是我們要做的。對于輸入的每個單詞位置,采用q編碼和k編碼并計算相似度,計算方式是點積,也叫余弦相似度。不過這不重要,關鍵是每個單詞都是256個數(shù)字的列表(基于之前示例),可以計算數(shù)字列表的相似性并記錄在矩陣中。我們稱這個矩陣為自關注得分(self-attention scores) 。如果有三個單詞的輸入序列,注意力得分可能是這樣:
每個單元格表示一個位置上的編碼單詞對另一個位置上的編碼單詞的關注程度。
網(wǎng)絡將第一個單詞視為查詢,并與第二個關鍵字進行匹配(或者說第一個單詞"關注"第二個單詞)。如果第二個單詞是查詢,將與第三個鍵匹配。如果第三個單詞是查詢,將與第一個鍵匹配。在現(xiàn)實中永遠不會有這樣的1和0,而是會在0和1之間進行部分匹配,并且每個查詢(行)會對多個鍵(列)進行部分匹配。
繼續(xù)檢索的比喻,把這個矩陣乘以v編碼,有趣的事情發(fā)生了。假設v編碼像這樣:
每一行都是序列中一個單詞的編碼。
也就是說,第一個單詞被編碼為數(shù)字列表0.10…0.19,第二個單詞被編碼為數(shù)字列表0.20…0.29,第三個單詞被編碼為數(shù)字列表0.30…0.39。這些數(shù)字是為了說明的目的而編出來的,實際上不會這么整齊。
將注意力與值相乘。
第一個查詢匹配第二個鍵,因此檢索第二個編碼單詞。第二個查詢與第三個鍵匹配,因此檢索第三個編碼單詞。第三個查詢匹配第一個鍵,因此檢索第一個編碼單詞。實際上做的是行交換!
實踐中,分數(shù)不會是完美的1和0,而是將是每種編碼混合在一起的(例如,單詞1的97%加上1%或單詞3加上單詞2的2%),但這說明自關注是一種混合和交換。在這個極端版本中,第一個單詞被替換為第二個單詞,依此類推。所以也許"earth"這個詞被換成了"planet"這個詞。
怎么知道正確編碼了q、k和v?如果整個網(wǎng)絡猜測掩碼最佳單詞的能力提高了,那么就正確編碼了q、k和v。如果沒有,那就改一下參數(shù),用稍微不同的方式編碼。
(3) 第三件事是把所有數(shù)學運算的結果加到residual上。還記得我們擱置的原始編碼的第一個副本嗎?沒錯,現(xiàn)在要把混合交換的版本加進去。現(xiàn)在,"earth"不僅僅是"earth"的編碼,而是某種虛構的詞,是"earth"和"planet"的混搭……pearth?ealanet?都不是。無論如何,這是將被發(fā)送到解碼器的最終轉換編碼。每個位置都有一個假單詞,它實際上編碼了兩個或更多單詞,這更有利于對基于位置的單個單詞進行預測。
然后再這樣做幾次(多層)。
這里省略了很多關于編碼器的最終編碼如何進入解碼器的細節(jié)(另一輪關注,稱為 源關注source-attention ,其中編碼器每個位置的編碼被用作q和k,以應用于另一個不同版本的v),但現(xiàn)在你只需要知道個大概。最后,解碼器接收編碼器的編碼,將能量發(fā)送給撞針,挑選出能量最強的單詞。
7. 為什么大語言模型如此強大?
這一切意味著什么?包括ChatGPT、GPT-4等在內的大語言模型只做一件事: 接收一堆單詞,并嘗試猜測下一個單詞應該是什么。如果這是"推理"或"思考",那也只是一種非常特殊的形式。
但即使是這種特殊的形式似乎也非常強大,因為ChatGPT和類似的東西似乎可以很好的完成很多事情: 寫詩、回答有關科學和技術的問題、總結文檔、起草電子郵件,甚至編寫代碼。為什么會如此有效?
秘訣有兩個,第一個已經(jīng)討論過了: Transformer學習混合單詞上下文的方式,從而非常善于猜測下一個單詞。其次是如何訓練系統(tǒng)。大語言模型根據(jù)從互聯(lián)網(wǎng)上抓取的大量信息進行訓練,包括書籍、博客、新聞網(wǎng)站、維基百科、reddit、社交媒體對話等。在訓練過程中,從其中一個來源中輸入一段文本,并要求它猜測下一個單詞。如果猜錯了,就稍微調整一下模型,直到猜對為止。想一下LLM被訓練做什么,其實就是產(chǎn)生可以合理出現(xiàn)在互聯(lián)網(wǎng)上的文本。它記不住整個互聯(lián)網(wǎng),所以用編碼來做出妥協(xié),也許會有點錯,但希望不要錯得太離譜。
重要的是不要低估互聯(lián)網(wǎng)上文本的多樣性。LLM學習了一切,看了幾乎所有話題的數(shù)十億次對話。因此,LLM可以生成看起來像是在與你對話的單詞。它已經(jīng)看了數(shù)十億首詩歌和歌詞,幾乎可以想象,它可以產(chǎn)生看起來像詩歌的文本。它已經(jīng)看了數(shù)十億家庭作業(yè)及答案,所以可以對你的家庭作業(yè)做出合理的猜測。它看了數(shù)以十億計的標準化考試問題及答案。而今年的SAT試題和去年也不會有什么不同。它看過人們談論假期計劃,所以可以猜出看起來像假期計劃的單詞。它已經(jīng)看了數(shù)十億代碼示例,涵蓋各種各樣場景。程序員做的很多事情都是將非常典型和容易理解的代碼片段組裝成更大的代碼塊,因此LLM可以編寫這些小而通用的代碼片段。它已經(jīng)在stackoverflow.com上看了數(shù)十億個錯誤代碼的例子和更正,這樣它就能針對你的錯誤代碼提出修復建議。已經(jīng)有數(shù)十億人在推特上說,由于摸了熱爐子而燒傷了手指,所以LLM知道這些常識。它已經(jīng)閱讀了大量科學論文,所以可以猜測眾所周知的科學事實,即使你還不知道。它已經(jīng)看了數(shù)十億關于如何總結要點的例子,知道如何使文本更符合語法,更簡潔或更有說服力。
重點是,當你要求ChatGPT或其他大語言模型做某些事,并且發(fā)現(xiàn)它完成了,很有可能你只是在要求它做一些它已經(jīng)見過數(shù)十億個例子的事情。即使你想出了一些非常獨特的東西,比如"告訴我閃電俠戈登吃了六個墨西哥卷餅后會做什么"(我甚至不知道這是不是獨特的),而它已經(jīng)看了關于閃電俠戈登的同人小說,看到人們談論吃了太多的墨西哥卷餅,并且可以(由于自關注)混合和搭配零碎的東西來組合一個聽上去合理的回應。
當我們與大語言模型交互時,第一直覺不應該是"哇,這東西一定非常聰明,或者非常有創(chuàng)造力,或者非常容易理解"。我們的第一反應應該是"我可能已經(jīng)要求它做一些它以前見過的東西"。不過即使它不是"認真思考"或"做一些非常復雜的推理",仍然非常有用。
我們不需要擬人化的來理解它做了什么來給我們提供回應。
關于這個主題的最后一點說明: 由于大語言模型的工作方式和訓練方式,它們傾向于提供某種程度上屬于中間響應的答案。在詢問關于閃電俠戈登的故事后,模型往往會給出平庸的回答,這對我來說似乎很奇怪。但在一個故事或一首詩的背景下,這些回應可以被認為是許多人(在互聯(lián)網(wǎng)上寫作)會想到的。以一個人獨自思考的標準來看,這可能相當不錯。但你自己寫的故事和詩歌可能也很普通(但它們對你來說很特別)。對不起,事實如此。
8. 我應該注意什么?
Transformer的工作方式和訓練方式會產(chǎn)生一些微妙的影響,以下是一些技術細節(jié)。
- 大語言模型是在互聯(lián)網(wǎng)上訓練的,這意味著也接受了人類陰暗面的訓練。大語言模型可能會被輸入種族主義、性別歧視言論、對各種類型的人的各種侮辱、對他人的刻板假設、陰謀論、政治錯誤信息等,因此語言模型選擇生成的單詞可能會反應這種語言。
- 大語言模型沒有"核心信念"。他們是在玩填詞游戲,試圖預測如果同樣的句子出現(xiàn)在互聯(lián)網(wǎng)上,下一個單詞會是什么。因此,可以要求大語言模型寫一個支持或反對同一件事的句子,語言模型將遵循這兩種方式。這并不意味著它相信這個或那個,或者改變信仰,或者一個比另一個更正確。如果訓練數(shù)據(jù)中一個事物的例子比另一個事物多,那么大語言模型將傾向于一致的響應互聯(lián)網(wǎng)上出現(xiàn)的更頻繁的數(shù)據(jù)。記住: 該模型力求模仿最常見的反應。
- 大語言模型沒有任何對與錯的概念。有些事情我們認為是事實,比如地球是圓的,LLM也會這么說。但如果換個上下文,它也會說相反的話,因為互聯(lián)網(wǎng)上確實有關于地球是平的文字。LLM不能保證提供真相,只是傾向于猜測我們認為正確的單詞,這是最接近于LLM"知道"真相或對錯的方式。
- 大語言模型可能會出錯。訓練數(shù)據(jù)可能有很多不一致的材料,當我們問問題時,自關注可能不會關注到我們想要關注的所有事情。作為填詞游戲,它可能會做出錯誤的猜測。有時,訓練數(shù)據(jù)看到一個詞的次數(shù)太多,以至于更喜歡這個詞,即使它對輸入沒有意義。以上導致了一種被稱為" 幻覺(hallucination) "的現(xiàn)象,在這種現(xiàn)象中,一個詞是猜測出來的,既不是來自輸入,也不是"正確的"。LLM傾向于猜測較小的數(shù)字,因為較小的數(shù)字更常見。LLM并不擅長數(shù)學。LLM更喜歡數(shù)字"42",因為人類由于一本特別著名的書而喜歡這個數(shù)字。LLM更喜歡常用的名字,所以可能會虛構成作者的名字。
- 大語言模型是自回歸的。因此,當它們猜到不正確的單詞時,這些猜測的單詞會被添加到它們自己的輸入中,猜測下一個單詞。也就是說,錯誤會累積。即使只有1%的幾率出錯,自關注也會關注到那個錯誤的選擇,并使錯誤加倍。即使只犯了一個錯誤,之后發(fā)生的所有事情也可能與這個錯誤有關。然后,語言模型可能會在此基礎上產(chǎn)生額外的錯誤。Transformer沒有辦法"改變主意"或再試一次或自我糾正,只能隨波逐流。
- 應該始終驗證大語言模型的輸出。如果你要求它做一些你自己無法勝任的事情,那么應該考慮一下是否可以對所犯的錯誤采取行動。對于低風險任務(比如寫一個短篇故事),這可能沒問題。而對于高風險任務(比如決定投資哪些股票),這些錯誤可能會導致你做出非常昂貴的決定。
- 自關注意味著在輸入提示中提供的信息越多,回答就會越專業(yè),因為它會在猜測中混合更多輸入的單詞。響應的質量與輸入提示的質量成正比,更好的提示產(chǎn)生更好的結果。嘗試幾種不同的提示,看看哪種最適合。不要假設語言模型"理解"你想要做的事情,并且能在第一次就給出最好的結果。
- 你并沒有真正與大語言模型"進行對話"。大言模型不會"記住"交流中發(fā)生的事情。你只是輸入并獲得輸出,LLM什么都不記得。也許你覺得初始輸入、響應以及對響應的響應看起來像是在記憶,那也只是因為對話日志作為了新的輸入。這是一個前端編程技巧,使大語言模型看起來像是在進行對話。由于這個技巧,它可能會圍繞主題輸出,但不能保證不會與之前的回應相矛盾。此外,可以輸入多少單詞是有限制的(目前ChatGPT允許大約4000個單詞,而GPT-4允許大約32000個單詞)。輸入可以相當大,所以對話通常會在一段時間內保持連貫。最終,累積的日志變得越來越大,不得不把一開始的對話刪掉,也就是說系統(tǒng)會"忘記"早期的內容。
- 大語言模型無法自己解決問題或制定計劃,但可以要求他們制定計劃并解決問題。這里需要詳細解釋一下,解決問題(Problem-solving) 和計劃(planning) 是人工智能研究社區(qū)中某些團體的保留術語,用于表示非常具體的東西。具體來說,意味著有一個目標(想在未來完成的事情)并通過在若干可以接近目標的備選方案中做出選擇來努力實現(xiàn)目標。大語言模型沒有目標,或者說他們只有一個目標,即在給定輸入序列的情況下,選擇最有可能出現(xiàn)在訓練數(shù)據(jù)中的單詞,也就是模式匹配。計劃通常涉及到前瞻性(look-ahead) ,人們做計劃時,會想象行動結果,并根據(jù)目標分析未來。如果看起來離目標更近了一步,就是一個很好的行動。如果沒有,可能會嘗試想象另一種行為的結果。實際生活中還有更多東西,但關鍵是大語言模型沒有目標,也沒有前瞻性。Transformer只向后看,自關注只能應用于已經(jīng)出現(xiàn)的輸入詞。現(xiàn)在,大語言模型可以生成看起來像計劃的輸出,只是因為在訓練數(shù)據(jù)中看了很多計劃,知道計劃是什么樣的,也知道關于某些主題的計劃應該出現(xiàn)什么,因而對計劃可以做出很好的猜測。它們做出計劃可能會忽略特定細節(jié),而傾向于最一般的計劃。大語言模型當然沒有"考慮各種選擇",也沒有嘗試一件事,然后又退回去嘗試另一件事。在Transformer內部,沒有機制可以讓它對未來進行這樣的考慮。因此在要求它給出計劃時,一定要驗證其輸出。
9. 是什么讓ChatGPT如此特別?
"所以我聽說RLHF是ChatGPT真正聰明的地方。"
"ChatGPT使用強化學習,所以它這么聰明。"
不一而足……
現(xiàn)在人們對RLHF(基于人類反饋的強化學習,Reinforcement Learning with Human Feedback)感到非常興奮。業(yè)界在訓練ChatGPT(以及其他越來越多的大語言模型)方面做了很多事情,這些并非是全新的技術,但是在ChatGPT發(fā)布時,這些技術的廣泛引入產(chǎn)生了很好的效果。
ChatGPT是基于Transformer的大語言模型,因其非常擅長生成對輸入提示的響應以及拒絕回答某些可能被認為是有害或固執(zhí)己見的問題而贏得了聲譽。它所做的與上面介紹的沒有什么不同,事實上它很普通,但在訓練過程中有點不一樣。ChatGPT的訓練方式和正常的一樣,從互聯(lián)網(wǎng)上抓取大量信息,提取文本片段,然后讓系統(tǒng)預測下一個單詞,這就產(chǎn)生了一個基本模型,已經(jīng)是非常強大的單詞預測器(相當于GPT-3),但還有兩個額外的訓練步驟: 指令調優(yōu)(Instruction tuning) 和基于人類反饋的強化學習(reinforcement learning with human feedback) 。
9.1. 指令調優(yōu)(Instruction Tuning)
大語言模型有個特別的問題: 它們只接受輸入單詞序列并生成后續(xù)單詞。大多數(shù)時候,這正是人們想要的,但并非總是如此。考慮以下輸入提示:
"寫一篇關于亞歷山大·漢密爾頓的文章。"
你認為回答應該是什么?可能會想到:"亞歷山大·漢密爾頓于1757年出生在尼維斯。他是政治家、律師、陸軍上校和美國第一任財政部長……"但實際上可能得到:
"你的文章應該至少有五頁,雙倍行距,并包括至少兩次引用。"
發(fā)生了什么?嗯,語言模型可能已經(jīng)看到了很多學生作業(yè)的例子,這些作業(yè)以"寫一篇關于……的文章"開頭,包括詳細描述長度和格式的單詞。當然,當你寫"寫一篇文章……"時,你認為是在給語言模型寫指令,就好像它是一個能夠理解意圖的人。語言模型不理解你的意圖或者它們自己的意圖,它們只將輸入與訓練數(shù)據(jù)中看到的模式相匹配。
為了解決這個問題,可以做一些叫做指令調優(yōu)的事情。想法相當簡單,如果你得到了錯誤響應,寫下正確的響應應該是什么,并將原始輸入和新的、經(jīng)過修正的輸出作為訓練數(shù)據(jù)通過神經(jīng)網(wǎng)絡發(fā)送。有了足夠多的修正輸出的例子,系統(tǒng)將學會改變其回路,使新的答案成為首選。
不需要做太花哨的事,只要讓很多人與大語言模型交互,并要求它做很多事情,并在它行為不正確時糾正,然后收集所有出錯的例子和新的、正確的輸出,并進行更多的訓練。
這使得大語言模型表現(xiàn)得好像能夠理解輸入提示的意圖,并表現(xiàn)得好像它在遵循指令。除了試著猜下一個單詞,它其實什么也沒做。但新的訓練數(shù)據(jù)讓它能夠更好的猜測對輸入更匹配的單詞。
9.2. 基于人類反饋的強化學習(Reinforcement Learning from Human Feedback)
下一步是從人類反饋中進行強化學習,這里需要一點解釋。
強化學習(Reinforcement learning) 是一種AI技術,傳統(tǒng)上用于機器人研究和虛擬游戲模擬(想想可以玩國際象棋、圍棋或星際爭霸的AI系統(tǒng))。強化學習特別擅長弄清楚當它得到所謂的獎勵時該怎么做。獎勵只是一個數(shù)字,表明它做得有多好(做得非常好+100,做得很差-100)。在現(xiàn)實世界和游戲中,通常很少會有獎勵。在游戲中,可能需要玩很久才能得分,甚至只會在游戲的最后一刻得分。在現(xiàn)實世界中,沒有足夠的人告訴你什么時候做得很好,除非你是一條狗。你唯一需要知道的是,強化學習系統(tǒng)試圖預測它們將獲得多少獎勵,然后選擇最有可能獲得更多獎勵的行為,這與人們用狗糧來訓練狗的方式并沒有什么不同。
好吧,先不想這些,考慮下面的提示:
"Mark是什么方面的專家?"
假設語言模型的輸出為:
"Mark在人工智能、圖形學和人機交互方面發(fā)表了許多著作。"
這只是部分正確,但我沒有在圖形學方面發(fā)表過論文,所以很想給它一個!或者-1分。但這里只有"圖形學"是錯的,如果告訴系統(tǒng)整個句子都是錯的,語言模型可能會覺得所有這些單詞都應該避免使用,但其實很多詞并沒什么問題。
這就是強化學習的用武之地。強化學習的工作原理是嘗試不同選擇,看看哪種選擇能獲得最大回報。假設我要求它對原始提示生成三個不同的響應。
"Mark在人工智能、圖形學和人機交互方面發(fā)表了許多著作。"
"Mark曾從事人工智能、安全NLP系統(tǒng)和人機交互方面的工作。"
"Mark研究過人工智能、游戲AI和圖形學。"
我可以給第一個相應-1,給第二個+1,給第三個-1。就像玩游戲一樣,強化學習算法可以回顧并找出導致-1的一個共同因素是"圖形學"這個詞。現(xiàn)在,系統(tǒng)可以鎖定這個單詞,調整神經(jīng)網(wǎng)絡,使其不與特定的輸入提示一起出現(xiàn)。
然后讓一群人與大語言模型交互,這一次系統(tǒng)會給出三種(或更多)可能的回答。我們可以通過要求大語言模型提供多次響應并在響應的選擇中引入一點隨機性來做到(還沒忘記吧?)我們有時可能會選擇排第二或第三的響應,而不是選擇激活可能性的響應。這就提供了不同的文本回復,人們可以選擇最喜歡的回復,第二喜歡的回復,等等。現(xiàn)在有了選擇,有了權重數(shù)字,就可以用強化學習來調整神經(jīng)網(wǎng)絡。
實際上,我們用"好"、"不好"的反饋來訓練第二神經(jīng)網(wǎng)絡來預測人們的反應。如果這個神經(jīng)網(wǎng)絡能夠很好的預測人們會喜歡什么,那么就可以用第二神經(jīng)網(wǎng)絡來猜測語言模型的反應會得到"好"還是"不好",然后用它來訓練語言模型。
強化學習將文本生成視為游戲,每個動作都是一個單詞。在序列最后,語言模型被告知是得分了還是丟分了。語言模型并沒有像前一節(jié)中討論的那樣精確的進行預判,但是在某種意義上,它已經(jīng)被訓練來預測哪些單詞會被點贊。大語言模型還是沒有明確目標,但有一個"被點贊"的隱含目標(或者也可以說有一個"滿足普通人"的隱含目標),并且已經(jīng)學會將特定提示的特定反應與獲得點贊聯(lián)系起來。這具有許多計劃的特性,但沒有明確的前瞻性機制,更像是記住了在很多情況下都有效的獲得獎勵的策略。
那么RLHF有沒有讓ChatGPT更智能?它使ChatGPT更有可能產(chǎn)生我們希望看到的響應,因此看起來更智能,它的輸出似乎傳達了一種感覺,即能夠理解我們輸入的意圖,并有自己的回應意圖。其實這是一種錯覺,因為它仍然只是對文字進行編碼和解碼。但話說回來,這不就是我們?yōu)樯兑獙戇@篇文章么。
指令調優(yōu)和RLHF還使ChatGPT能夠抵抗某些類型的濫用,例如產(chǎn)生種族主義、性別歧視或政治內容。還是有可能輸出這些內容,而且舊版本的GPT-3總是能夠被用來輸出這些東西。然而作為免費的面向公眾的服務,ChatGPT針對某些類型的濫用所做的工作傳遞了一種安全感,并且它還抵制將意見作為事實提供,這也消除了對用戶的潛在傷害。
用強化學習來修改預訓練的語言模型并不是什么新鮮事,至少可以追溯到2016年,并已被用于使大語言模型更安全。大多數(shù)基于強化學習的大語言模型調優(yōu)都用第二模型來提供獎勵,這也是用ChatGPT完成的。ChatGPT值得注意的是通過強化學習調整系統(tǒng)的規(guī)模,以及大規(guī)模的人類反饋收集工作。
審核編輯:郭婷
評論
查看更多