萬字長文解釋 ChatGPT 在做什么,以及為什么它能發(fā)揮作用?(4)
神經(jīng)網(wǎng)絡(luò) —— 至少在它們目前的設(shè)置中 —— 從根本上說是基于數(shù)字的。因此,如果我們要用它們來處理像文本這樣的東西,我們就需要一種方法來用數(shù)字表示我們的文本。當然,我們可以開始(基本上就像 ChatGPT 那樣)為字典中的每個詞分配一個數(shù)字。但是,有一個重要的想法 —— 例如,它是 ChatGPT 的核心 —— 超出了這個范圍。這就是 “嵌入” 的概念。我們可以把嵌入看作是一種嘗試用數(shù)字陣列來表示事物 “本質(zhì)” 的方式 —— 其特性是 “附近的事物” 由附近的數(shù)字來表示。
因此,舉例來說,我們可以把一個詞的嵌入看作是試圖在一種 “意義空間” 中排列詞語,在這個空間中,以某種方式 “在意義上接近” 的詞語在嵌入中出現(xiàn)。實際使用的嵌入 —— 例如在 ChatGPT 中 —— 往往涉及大量的數(shù)字列表。但是如果我們把它投射到二維空間,我們就可以顯示出嵌入的單詞是如何排列的例子:
而且,是的,我們看到的東西在捕捉典型的日常印象方面做得非常好。但是,我們怎樣才能構(gòu)建這樣一個嵌入呢?大致的想法是查看大量的文本(這里是來自網(wǎng)絡(luò)的 50 億個詞),然后看不同的詞出現(xiàn)的 “環(huán)境” 有多相似。因此,例如,“鱷魚” 和 “鱷魚” 經(jīng)常會在其他類似的句子中互換出現(xiàn),這意味著它們在嵌入中會被放在附近。但是 “蘿卜” 和 “老鷹” 不會出現(xiàn)在其他類似的句子中,所以它們在嵌入中會被放在很遠的地方。
但是,如何使用神經(jīng)網(wǎng)絡(luò)實際實現(xiàn)這樣的東西呢?讓我們先來討論一下不是針對單詞的嵌入,而是針對圖像的嵌入。我們想找到某種方法,通過數(shù)字列表來描述圖像,使 “我們認為相似的圖像” 被分配到相似的數(shù)字列表中。
我們?nèi)绾闻袛辔覀兪欠駪?yīng)該 “認為圖像相似”?好吧,如果我們的圖像是,例如,手寫的數(shù)字,我們可能會 “認為兩個圖像是相似的”,如果它們是相同的數(shù)字。早些時候,我們討論了一個被訓(xùn)練來識別手寫數(shù)字的神經(jīng)網(wǎng)絡(luò)。我們可以認為這個神經(jīng)網(wǎng)絡(luò)被設(shè)置成在其最終輸出中把圖像放入 10 個不同的倉,每個數(shù)字一個倉。
但是,如果我們在做出 “這是一個 ‘4’” 的最終決定之前,“****” 神經(jīng)網(wǎng)絡(luò)內(nèi)部發(fā)生的事情呢?我們可能會想到,在神經(jīng)網(wǎng)絡(luò)中,有一些數(shù)字將圖像描述為 “大部分是 4,但有一點是 2” 或類似的情況。而我們的想法是挑選出這樣的數(shù)字作為嵌入的元素。
所以這里有一個概念。我們不是直接試圖描述 “什么圖像在什么其他圖像附近”,而是考慮一個定義明確的任務(wù)(在這種情況下是數(shù)字識別),我們可以獲得明確的訓(xùn)練數(shù)據(jù) —— 然后利用這樣一個事實,即在做這個任務(wù)時,神經(jīng)網(wǎng)絡(luò)隱含地要做出相當于 “接近度決定” 的決定。因此,我們不需要明確地談?wù)?“圖像的接近性”,而只是談?wù)撘粋€圖像代表什么數(shù)字的具體問題,然后我們 “把它留給神經(jīng)網(wǎng)絡(luò)” 來隱含地決定這意味著什么 “圖像的接近性”。
那么,這對數(shù)字識別網(wǎng)絡(luò)來說是如何更詳細地工作的呢?我們可以認為這個網(wǎng)絡(luò)是由 11 個連續(xù)的層組成的,我們可以用圖標來概括它(激活函數(shù)顯示為獨立的層):
在開始時,我們向第一層輸入實際的圖像,用像素值的二維陣列表示。在最后一層,我們得到了一個由 10 個值組成的數(shù)組,我們可以認為這表示網(wǎng)絡(luò)對圖像對應(yīng)于 0 到 9 的每個數(shù)字的 “確定程度”。
輸入圖像 4,最后一層的神經(jīng)元的值就是:
換句話說,神經(jīng)網(wǎng)絡(luò)此時已經(jīng) “非常確定” 這個圖像是 4,為了實際得到輸出 “4”,我們只需挑選出數(shù)值最大的神經(jīng)元的位置。
但是,如果我們再往前看一步呢?網(wǎng)絡(luò)中的最后一個操作是一個所謂的 softmax,它試圖 “強制確定”。但在這之前,神經(jīng)元的值是:
代表 “4” 的神經(jīng)元仍然有最高的數(shù)值。但在其他神經(jīng)元的數(shù)值中也有信息。我們可以期望這個數(shù)字列表在某種意義上可以用來描述圖像的 “本質(zhì)”,從而提供我們可以用作嵌入的東西。因此,例如,這里的每一個 4 都有一個稍微不同的 “簽名”(或 “特征嵌入”) —— 都與 8 的非常不同:
在這里,我們基本上是用 10 個數(shù)字來描述我們的圖像特征。但通常情況下,使用比這更多的數(shù)字會更好。例如,在我們的數(shù)字識別網(wǎng)絡(luò)中,我們可以通過挖掘前一層得到一個 500 個數(shù)字的陣列。而這可能是一個合理的數(shù)組,作為 “圖像嵌入” 使用。
如果我們想對手寫數(shù)字的 “圖像空間” 進行明確的可視化,我們需要 “降低維度”,有效地將我們得到的 500 維向量投射到,例如,三維空間:
我們剛剛談到為圖像創(chuàng)建一個特征(從而嵌入),有效地基于識別圖像的相似性,確定(根據(jù)我們的訓(xùn)練集)它們是否對應(yīng)于同一個手寫數(shù)字。如果我們有一個訓(xùn)練集,比如說,確定每張圖片屬于 5000 種常見類型的物體(貓、狗、椅子…… ),我們就可以更普遍地對圖片做同樣的事情。通過這種方式,我們可以制作一個圖像嵌入,它被我們對常見物體的識別所 “錨定”,但然后根據(jù)神經(jīng)網(wǎng)絡(luò)的行為 “圍繞它進行概括”。關(guān)鍵是,只要這種行為與我們?nèi)祟惛兄徒忉寛D像的方式相一致,這將最終成為一個 “對我們來說是正確的” 的嵌入,并在實踐中做 “類似人類判斷” 的任務(wù)時有用。
好吧,那么我們?nèi)绾巫裱瑯拥姆椒▉韺ふ覇卧~的嵌入呢?關(guān)鍵是要從一個我們可以隨時進行訓(xùn)練的關(guān)于單詞的任務(wù)開始。而標準的任務(wù)是 “單詞預(yù)測”。假設(shè)我們得到了 “the ___ cat”?;谝粋€大型的文本語料庫(比如說,網(wǎng)絡(luò)上的文本內(nèi)容),可能 “填空” 的不同單詞的概率是多少?或者說,給定 “_____ 黑 _____”,不同的 “側(cè)翼詞” 的概率是多少?
我們?nèi)绾螢樯窠?jīng)網(wǎng)絡(luò)設(shè)置這個問題?歸根結(jié)底,我們必須用數(shù)字來表述一切。做到這一點的一個方法就是為英語中 5 萬個左右的常用詞中的每一個分配一個獨特的數(shù)字。因此,例如,“the” 可能是 914,而 “cat”(前面有一個空格)可能是 3542。(這些是 GPT-2 所使用的實際數(shù)字。)所以對于 “the ___ cat” 問題,我們的輸入可能是{914, 3542}。輸出應(yīng)該是什么樣子的呢?好吧,它應(yīng)該是一個由 50000 個左右的數(shù)字組成的列表,有效地給出了每個可能的 “填充” 單詞的概率。再一次,為了找到一個嵌入,我們要在神經(jīng)網(wǎng)絡(luò) “達到結(jié)論” 之前 “****” 它的 “內(nèi)部” —— 然后撿起在那里出現(xiàn)的數(shù)字列表,我們可以把它看作是 “每個詞的特征”。
好吧,那么這些表征是什么樣子的呢?在過去的 10 年里,已經(jīng)有一系列不同的系統(tǒng)被開發(fā)出來(word2vec, GloVe, BERT, GPT, …… ),每一個都是基于不同的神經(jīng)網(wǎng)絡(luò)方法。但最終,所有這些系統(tǒng)都是通過數(shù)百到數(shù)千個數(shù)字的列表來描述單詞的特征。
在它們的原始形式中,這些 “嵌入向量” 是相當無信息的。例如,這里是 GPT-2 產(chǎn)生的三個特定詞的原始嵌入向量:
如果我們做一些事情,比如測量這些向量之間的距離,那么我們就可以發(fā)現(xiàn)像單詞的 “接近性” 這樣的東西。稍后我們將更詳細地討論我們可能認為這種嵌入的 “認知” 意義。但現(xiàn)在主要的一點是,我們有一種方法可以有效地將單詞變成 “神經(jīng)網(wǎng)絡(luò)友好” 的數(shù)字集合。
但實際上,我們可以更進一步,不僅僅是用數(shù)字的集合來描述單詞;我們還可以對單詞的序列,或者整個文本塊進行描述。在 ChatGPT 中,它就是這樣處理事情的。它把目前得到的文本,生成一個嵌入矢量來表示它。然后,它的目標是找到接下來可能出現(xiàn)的不同詞匯的概率。它將其答案表示為一個數(shù)字列表,該列表基本上給出了 50,000 個左右的可能詞匯的概率。(嚴格地說,ChatGPT 不處理單詞,而是處理 “符號” —— 方便的語言單位,可能是整個單詞,也可能只是 “pre” 或 “ing” 或 “ized” 這樣的片段。使用代幣使 ChatGPT 更容易處理罕見的、復(fù)合的和非英語的詞匯,有時,無論好壞,都可以發(fā)明新的詞匯。)
好了,我們終于準備好討論 ChatGPT 內(nèi)部的內(nèi)容了。是的,最終,它是一個巨大的神經(jīng)網(wǎng)絡(luò) —— 目前是所謂的 GPT-3 網(wǎng)絡(luò)的一個版本,有 1750 億個權(quán)重。在許多方面,這是一個非常像我們討論過的其他神經(jīng)網(wǎng)絡(luò)。但它是一個特別為處理語言問題而設(shè)置的神經(jīng)網(wǎng)絡(luò)。它最顯著的特征是一個叫做 “轉(zhuǎn)化器” 的神經(jīng)網(wǎng)絡(luò)架構(gòu)。
在我們上面討論的第一個神經(jīng)網(wǎng)絡(luò)中,任何給定層的每個神經(jīng)元基本上都與前一層的每個神經(jīng)元相連(至少有一些權(quán)重)。但是,如果一個人在處理具有特殊的、已知的結(jié)構(gòu)的數(shù)據(jù)時,這種全連接的網(wǎng)絡(luò)(大概)是過剩的。因此,例如,在處理圖像的早期階段,典型的做法是使用所謂的卷積神經(jīng)網(wǎng)絡(luò)(“convnets”),其中的神經(jīng)元被有效地布置在一個類似于圖像中的像素的網(wǎng)格上 —— 并且只與網(wǎng)格上附近的神經(jīng)元相連。
變換器的想法是為構(gòu)成一段文本的標記序列做一些至少有點類似的事情。但是,轉(zhuǎn)化器并不只是在序列中定義一個可以有連接的固定區(qū)域,而是引入了 “注意” 的概念 —— 以及對序列的某些部分比其他部分更 “注意” 的概念。也許有一天,僅僅啟動一個通用的神經(jīng)網(wǎng)絡(luò)并通過訓(xùn)練進行所有的定制是有意義的。但至少到現(xiàn)在為止,將事情 “模塊化” 在實踐中似乎是至關(guān)重要的,就像變壓器那樣,可能也像我們的大腦那樣。
好吧,那么 ChatGPT(或者說,它所基于的 GPT-3 網(wǎng)絡(luò))實際上是做什么的?回想一下,它的總體目標是以 “合理” 的方式延續(xù)文本,基于它所看到的訓(xùn)練(包括從網(wǎng)絡(luò)上查看數(shù)十億頁的文本等),所以在任何時候,它都有一定數(shù)量的文本,它的目標是為下一個要添加的標記提出適當?shù)倪x擇。
它的操作分為三個基本階段。首先,它獲取與迄今為止的文本相對應(yīng)的標記序列,并找到代表這些標記的嵌入(即一個數(shù)字陣列)。然后,它以 “標準的神經(jīng)網(wǎng)絡(luò)方式” 對這一嵌入進行操作,數(shù)值 “通過” 網(wǎng)絡(luò)中的連續(xù)層,產(chǎn)生一個新的嵌入(即一個新的數(shù)字陣列)。然后,它從這個數(shù)組的最后一部分,生成一個大約 50,000 個值的數(shù)組,這些值變成了不同的可能的下一個標記的概率。(而且,是的,恰好使用的標記的數(shù)量與英語中的常用詞的數(shù)量相同,盡管只有大約 3000 個標記是整個單詞,其余的是片段。)關(guān)鍵的一點是,這個管道的每一部分都是由一個神經(jīng)網(wǎng)絡(luò)實現(xiàn)的,其權(quán)重是由網(wǎng)絡(luò)的端到端訓(xùn)練決定的。換句話說,實際上,除了整體架構(gòu)之外,沒有任何東西是 “明確設(shè)計的”;所有東西都是從訓(xùn)練數(shù)據(jù)中 “學(xué)習(xí)” 的。
然而,在架構(gòu)的設(shè)置方式上有很多細節(jié),反映了各種經(jīng)驗和神經(jīng)網(wǎng)絡(luò)的傳說。而且,盡管這肯定是進入了雜草叢中,但我認為談?wù)撈渲械囊恍┘毠?jié)是有用的,尤其是為了了解建立像 ChatGPT 這樣的東西所需要的東西。
首先是嵌入模塊。下面是 GPT-2 的 Wolfram 語言示意圖:
輸入是一個由 n 個標記組成的向量(如上一節(jié)所述,由 1 到 50,000 的整數(shù)表示)。這些標記中的每一個都被(通過單層神經(jīng)網(wǎng)絡(luò))轉(zhuǎn)換成一個嵌入向量(GPT-2 的長度為 768,ChatGPT 的 GPT-3 為 12,288)。同時,還有一個 “二級路徑”,它將標記的(整數(shù))位置序列,并從這些整數(shù)中創(chuàng)建另一個嵌入向量。最后,來自令牌值和令牌位置的嵌入向量被加在一起 —— 產(chǎn)生嵌入模塊的最終嵌入向量序列。
為什么只是把令牌值和令牌位置的嵌入向量加在一起?我不認為這有什么特別的科學(xué)依據(jù)。只是各種不同的東西都被嘗試過,而這是一個似乎有效的方法。這也是神經(jīng)網(wǎng)絡(luò)傳說的一部分,從某種意義上說,只要你的設(shè)置是 “大致正確的”,通常就可以通過做充分的訓(xùn)練來確定細節(jié),而不需要真正 “在工程層面上理解” 神經(jīng)網(wǎng)絡(luò)最終是如何配置它的。
下面是嵌入模塊所做的工作,對字符串 “hello hello bye bye bye”:
每個標記的嵌入向量的元素都顯示在頁面下方,在整個頁面上,我們首先看到的是 “hello” 的嵌入,然后是 “bye” 的嵌入。上面的第二個數(shù)組是位置嵌入 —— 其看起來有點隨機的結(jié)構(gòu)只是 “碰巧學(xué)到的”(在這種情況下是 GPT-2)。
好了,在嵌入模塊之后,是轉(zhuǎn)化器的 “主要事件”:一連串所謂的 “注意塊”(GPT-2 為 12 個,ChatGPT 的 GPT-3 為 96 個)。這一切都很復(fù)雜 —— 讓人想起典型的難以理解的大型工程系統(tǒng),或者,生物系統(tǒng)。但無論如何,這里是一個單一的 “注意塊” 的示意圖(對于 GPT-2):
在每個這樣的注意力塊中,有一系列的 “注意力頭”(GPT-2 有 12 個,ChatGPT 的 GPT-3 有 96 個) —— 每一個都是獨立操作嵌入向量中的不同數(shù)值塊的。(是的,我們不知道為什么分割嵌入向量是個好主意,或者它的不同部分有什么 “意義”;這只是 “被發(fā)現(xiàn)可行” 的事情之一)。
好吧,那么注意頭是做什么的?基本上,它們是一種在標記序列中 “回顧” 的方式(即在迄今為止產(chǎn)生的文本中),并將過去的內(nèi)容 “打包” 成有助于尋找下一個標記的形式。在上面的第一節(jié)中,我們談到了使用 2-gram 概率來根據(jù)它們的直接前身來挑選單詞。變換器中的 “注意” 機制所做的是允許 “注意” 甚至更早的詞 —— 因此有可能捕捉到,比如說,動詞可以指代在句子中出現(xiàn)在它們之前的許多詞的名詞的方式。
在更詳細的層面上,注意力頭所做的是以一定的權(quán)重重新組合與不同標記相關(guān)的嵌入向量中的大塊。因此,例如,在第一個注意力區(qū)塊中的 12 個注意力頭(在 GPT-2 中)對上面的 “hello, bye” 字符串有如下(“l(fā)ook-back-all-the-way-beginning-the-sequence-of-tokens”)模式的 “重組權(quán)值”:
在經(jīng)過注意力頭的處理后,產(chǎn)生的 “重新加權(quán)的嵌入向量”(GPT-2 的長度為 768,ChatGPT 的 GPT-3 的長度為 12288)被傳遞到一個標準的 “全連接” 神經(jīng)網(wǎng)層。很難掌握這個層在做什么。但這里是它使用的 768×768 權(quán)重矩陣的圖(這里是 GPT-2):
采用 64×64 的移動平均數(shù),一些(隨機漫步式的)結(jié)構(gòu)開始出現(xiàn):
是什么決定了這種結(jié)構(gòu)?最終,它可能是人類語言特征的一些 “神經(jīng)網(wǎng)絡(luò)編碼”。但到現(xiàn)在為止,這些特征可能是什么還很不清楚。實際上,我們正在 “打開 ChatGPT 的大腦”(或至少是 GPT-2),并發(fā)現(xiàn),是的,里面很復(fù)雜,而且我們不了解它 —— 盡管最終它產(chǎn)生了可識別的人類語言。
好吧,在經(jīng)歷了一個注意力區(qū)塊之后,我們得到了一個新的嵌入向量 —— 然后它又被連續(xù)地傳遞到其他的注意力區(qū)塊中(GPT-2 共有 12 個;GPT-3 有 96 個)。每個注意力區(qū)塊都有自己特定的 “注意力” 和 “完全連接” 權(quán)重模式。這里是 GPT-2 的 “hell,bye” 輸入的注意權(quán)重序列,用于第一個注意頭(attention head):
這里是全連接層的(移動平均)“矩陣”:
奇怪的是,盡管這些 “權(quán)重矩陣” 在不同的注意力塊中看起來很相似,但權(quán)重的大小分布可能有些不同(而且不總是高斯的):
那么,在經(jīng)歷了所有這些注意力區(qū)塊之后,轉(zhuǎn)化器的凈效果是什么?從本質(zhì)上講,它是將原始的符號序列的嵌入集合轉(zhuǎn)化為最終的集合。而 ChatGPT 的具體工作方式是在這個集合中提取最后一個嵌入,并對其進行 “解碼”,以產(chǎn)生一個關(guān)于下一個標記應(yīng)該是什么的概率列表。
這就是 ChatGPT 的概要內(nèi)容。它可能看起來很復(fù)雜(尤其是因為它有許多不可避免的、有點武斷的 “工程選擇”),但實際上,所涉及的最終元素非常簡單。因為最終我們要處理的只是一個由 “人工神經(jīng)元” 組成的神經(jīng)網(wǎng)絡(luò),每個神經(jīng)元都在進行簡單的操作,即接受一組數(shù)字輸入,然后將它們與某些權(quán)重相結(jié)合。
ChatGPT 的原始輸入是一個數(shù)字數(shù)組(到目前為止符號的嵌入向量),當 ChatGPT“運行” 以產(chǎn)生一個新的符號時,所發(fā)生的只是這些數(shù)字 “通過” 神經(jīng)網(wǎng)的各層,每個神經(jīng)元 “做它的事”,并將結(jié)果傳遞給下一層的神經(jīng)元。沒有循環(huán)或 “回頭”。一切都只是通過網(wǎng)絡(luò) “前饋”。
這是一個與典型的計算系統(tǒng) —— 如圖靈機 —— 非常不同的設(shè)置,在圖靈機中,結(jié)果是由相同的計算元素反復(fù) “再處理” 的。在這里,至少在生成一個特定的輸出符號時,每個計算元素(即神經(jīng)元)只被使用一次。
但在某種意義上,即使在 ChatGPT 中,仍然有一個重復(fù)使用計算元素的 “外循環(huán)”。因為當 ChatGPT 要生成一個新的標記時,它總是 “讀取”(即作為輸入)它之前的整個標記序列,包括 ChatGPT 自己之前 “寫” 的標記。我們可以認為這種設(shè)置意味著 ChatGPT —— 至少在其最外層 —— 涉及到一個 “反饋循環(huán)”,盡管在這個循環(huán)中,每一次迭代都明確地顯示為一個出現(xiàn)在其生成的文本中的標記。
但讓我們回到 ChatGPT 的核心:反復(fù)用于生成每個標記的神經(jīng)網(wǎng)絡(luò)。在某種程度上,它非常簡單:一整個相同的人工神經(jīng)元的集合。網(wǎng)絡(luò)的某些部分只是由(“完全連接”)的神經(jīng)元層組成,其中某一層的每個神經(jīng)元都與前一層的每個神經(jīng)元相連(有一定的權(quán)重)。但是,特別是它的變壓器結(jié)構(gòu),ChatGPT 有更多的結(jié)構(gòu)部分,其中只有不同層的特定神經(jīng)元被連接。(當然,人們?nèi)匀豢梢哉f,“所有的神經(jīng)元都是連接的” —— 但有些神經(jīng)元的權(quán)重為零)。
此外,ChatGPT 中的神經(jīng)網(wǎng)的某些方面并不是最自然地被認為是由 “同質(zhì)” 層組成的。例如,正如上面的圖標摘要所示,在一個注意力區(qū)塊中,有一些地方對傳入的數(shù)據(jù)進行了 “多份拷貝”,然后每個拷貝經(jīng)過不同的 “處理路徑”,可能涉及不同數(shù)量的層,然后才重新組合。但是,雖然這可能是對正在發(fā)生的事情的一種方便的表述,但至少在原則上總是可以考慮 “密集地填入” 層,但只是讓一些權(quán)重為零。
如果我們看一下 ChatGPT 的最長路徑,大約有 400 個(核心)層參與其中 —— 在某些方面不是一個巨大的數(shù)字。但是有數(shù)以百萬計的神經(jīng)元 —— 總共有 1750 億個連接,因此有 1750 億個權(quán)重。需要認識到的一點是,每當 ChatGPT 生成一個新的令牌時,它都要進行涉及這些權(quán)重中每一個的計算。在實現(xiàn)上,這些計算可以 “按層” 組織成高度并行的陣列操作,可以方便地在 GPU 上完成。但是,對于產(chǎn)生的每一個標記,仍然要進行 1750 億次計算(最后還要多一點) —— 因此,是的,用 ChatGPT 生成一個長的文本需要一段時間,這并不令人驚訝。
但最終,最了不起的是,所有這些操作 —— 它們各自都很簡單 —— 能夠以某種方式共同完成如此出色的 “類似人類” 的文本生成工作。必須再次強調(diào)的是,(至少到目前為止,我們知道)沒有任何 “最終的理論理由” 來解釋這樣的工作。事實上,正如我們將要討論的那樣,我認為我們必須把這看作是一個潛在的令人驚訝的科學(xué)發(fā)現(xiàn):在像 ChatGPT 這樣的神經(jīng)網(wǎng)絡(luò)中,有可能捕捉到人類大腦在生成語言方面的本質(zhì)。
*博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權(quán)請聯(lián)系工作人員刪除。