博客專欄

        EEPW首頁 > 博客 > 萬字長文解釋 ChatGPT 在做什么,以及為什么它能發揮作用?(4)

        萬字長文解釋 ChatGPT 在做什么,以及為什么它能發揮作用?(4)

        發布人:AI科技大本營 時間:2023-02-21 來源:工程師 發布文章

        圖片

        嵌入的概念


        神經網絡 —— 至少在它們目前的設置中 —— 從根本上說是基于數字的。因此,如果我們要用它們來處理像文本這樣的東西,我們就需要一種方法來用數字表示我們的文本。當然,我們可以開始(基本上就像 ChatGPT 那樣)為字典中的每個詞分配一個數字。但是,有一個重要的想法 —— 例如,它是 ChatGPT 的核心 —— 超出了這個范圍。這就是 “嵌入” 的概念。我們可以把嵌入看作是一種嘗試用數字陣列來表示事物 “本質” 的方式 —— 其特性是 “附近的事物” 由附近的數字來表示。

        因此,舉例來說,我們可以把一個詞的嵌入看作是試圖在一種 “意義空間” 中排列詞語,在這個空間中,以某種方式 “在意義上接近” 的詞語在嵌入中出現。實際使用的嵌入 —— 例如在 ChatGPT 中 —— 往往涉及大量的數字列表。但是如果我們把它投射到二維空間,我們就可以顯示出嵌入的單詞是如何排列的例子:

        圖片

        而且,是的,我們看到的東西在捕捉典型的日常印象方面做得非常好。但是,我們怎樣才能構建這樣一個嵌入呢?大致的想法是查看大量的文本(這里是來自網絡的 50 億個詞),然后看不同的詞出現的 “環境” 有多相似。因此,例如,“鱷魚” 和 “鱷魚” 經常會在其他類似的句子中互換出現,這意味著它們在嵌入中會被放在附近。但是 “蘿卜” 和 “老鷹” 不會出現在其他類似的句子中,所以它們在嵌入中會被放在很遠的地方。

        但是,如何使用神經網絡實際實現這樣的東西呢?讓我們先來討論一下不是針對單詞的嵌入,而是針對圖像的嵌入。我們想找到某種方法,通過數字列表來描述圖像,使 “我們認為相似的圖像” 被分配到相似的數字列表中。

        我們如何判斷我們是否應該 “認為圖像相似”?好吧,如果我們的圖像是,例如,手寫的數字,我們可能會 “認為兩個圖像是相似的”,如果它們是相同的數字。早些時候,我們討論了一個被訓練來識別手寫數字的神經網絡。我們可以認為這個神經網絡被設置成在其最終輸出中把圖像放入 10 個不同的倉,每個數字一個倉。

        但是,如果我們在做出 “這是一個 ‘4’” 的最終決定之前,“****” 神經網絡內部發生的事情呢?我們可能會想到,在神經網絡中,有一些數字將圖像描述為 “大部分是 4,但有一點是 2” 或類似的情況。而我們的想法是挑選出這樣的數字作為嵌入的元素。

        所以這里有一個概念。我們不是直接試圖描述 “什么圖像在什么其他圖像附近”,而是考慮一個定義明確的任務(在這種情況下是數字識別),我們可以獲得明確的訓練數據 —— 然后利用這樣一個事實,即在做這個任務時,神經網絡隱含地要做出相當于 “接近度決定” 的決定。因此,我們不需要明確地談論 “圖像的接近性”,而只是談論一個圖像代表什么數字的具體問題,然后我們 “把它留給神經網絡” 來隱含地決定這意味著什么 “圖像的接近性”。

        那么,這對數字識別網絡來說是如何更詳細地工作的呢?我們可以認為這個網絡是由 11 個連續的層組成的,我們可以用圖標來概括它(激活函數顯示為獨立的層):

        圖片

        在開始時,我們向第一層輸入實際的圖像,用像素值的二維陣列表示。在最后一層,我們得到了一個由 10 個值組成的數組,我們可以認為這表示網絡對圖像對應于 0 到 9 的每個數字的 “確定程度”。

        輸入圖像 4,最后一層的神經元的值就是:

        圖片

        換句話說,神經網絡此時已經 “非常確定” 這個圖像是 4,為了實際得到輸出 “4”,我們只需挑選出數值最大的神經元的位置。

        但是,如果我們再往前看一步呢?網絡中的最后一個操作是一個所謂的 softmax,它試圖 “強制確定”。但在這之前,神經元的值是:

        代表 “4” 的神經元仍然有最高的數值。但在其他神經元的數值中也有信息。我們可以期望這個數字列表在某種意義上可以用來描述圖像的 “本質”,從而提供我們可以用作嵌入的東西。因此,例如,這里的每一個 4 都有一個稍微不同的 “簽名”(或 “特征嵌入”) —— 都與 8 的非常不同:

        在這里,我們基本上是用 10 個數字來描述我們的圖像特征。但通常情況下,使用比這更多的數字會更好。例如,在我們的數字識別網絡中,我們可以通過挖掘前一層得到一個 500 個數字的陣列。而這可能是一個合理的數組,作為 “圖像嵌入” 使用。

        如果我們想對手寫數字的 “圖像空間” 進行明確的可視化,我們需要 “降低維度”,有效地將我們得到的 500 維向量投射到,例如,三維空間:

        圖片

        我們剛剛談到為圖像創建一個特征(從而嵌入),有效地基于識別圖像的相似性,確定(根據我們的訓練集)它們是否對應于同一個手寫數字。如果我們有一個訓練集,比如說,確定每張圖片屬于 5000 種常見類型的物體(貓、狗、椅子…… ),我們就可以更普遍地對圖片做同樣的事情。通過這種方式,我們可以制作一個圖像嵌入,它被我們對常見物體的識別所 “錨定”,但然后根據神經網絡的行為 “圍繞它進行概括”。關鍵是,只要這種行為與我們人類感知和解釋圖像的方式相一致,這將最終成為一個 “對我們來說是正確的” 的嵌入,并在實踐中做 “類似人類判斷” 的任務時有用。

        好吧,那么我們如何遵循同樣的方法來尋找單詞的嵌入呢?關鍵是要從一個我們可以隨時進行訓練的關于單詞的任務開始。而標準的任務是 “單詞預測”。假設我們得到了 “the ___ cat”。基于一個大型的文本語料庫(比如說,網絡上的文本內容),可能 “填空” 的不同單詞的概率是多少?或者說,給定 “_____ 黑 _____”,不同的 “側翼詞” 的概率是多少?

        我們如何為神經網絡設置這個問題?歸根結底,我們必須用數字來表述一切。做到這一點的一個方法就是為英語中 5 萬個左右的常用詞中的每一個分配一個獨特的數字。因此,例如,“the” 可能是 914,而 “cat”(前面有一個空格)可能是 3542。(這些是 GPT-2 所使用的實際數字。)所以對于 “the ___ cat” 問題,我們的輸入可能是{914, 3542}。輸出應該是什么樣子的呢?好吧,它應該是一個由 50000 個左右的數字組成的列表,有效地給出了每個可能的 “填充” 單詞的概率。再一次,為了找到一個嵌入,我們要在神經網絡 “達到結論” 之前 “****” 它的 “內部” —— 然后撿起在那里出現的數字列表,我們可以把它看作是 “每個詞的特征”。

        好吧,那么這些表征是什么樣子的呢?在過去的 10 年里,已經有一系列不同的系統被開發出來(word2vec, GloVe, BERT, GPT, …… ),每一個都是基于不同的神經網絡方法。但最終,所有這些系統都是通過數百到數千個數字的列表來描述單詞的特征。

        在它們的原始形式中,這些 “嵌入向量” 是相當無信息的。例如,這里是 GPT-2 產生的三個特定詞的原始嵌入向量:

        圖片

        如果我們做一些事情,比如測量這些向量之間的距離,那么我們就可以發現像單詞的 “接近性” 這樣的東西。稍后我們將更詳細地討論我們可能認為這種嵌入的 “認知” 意義。但現在主要的一點是,我們有一種方法可以有效地將單詞變成 “神經網絡友好” 的數字集合。

        但實際上,我們可以更進一步,不僅僅是用數字的集合來描述單詞;我們還可以對單詞的序列,或者整個文本塊進行描述。在 ChatGPT 中,它就是這樣處理事情的。它把目前得到的文本,生成一個嵌入矢量來表示它。然后,它的目標是找到接下來可能出現的不同詞匯的概率。它將其答案表示為一個數字列表,該列表基本上給出了 50,000 個左右的可能詞匯的概率。(嚴格地說,ChatGPT 不處理單詞,而是處理 “符號” —— 方便的語言單位,可能是整個單詞,也可能只是 “pre” 或 “ing” 或 “ized” 這樣的片段。使用代幣使 ChatGPT 更容易處理罕見的、復合的和非英語的詞匯,有時,無論好壞,都可以發明新的詞匯。)


        圖片

        ChatGPT 內部


        好了,我們終于準備好討論 ChatGPT 內部的內容了。是的,最終,它是一個巨大的神經網絡 —— 目前是所謂的 GPT-3 網絡的一個版本,有 1750 億個權重。在許多方面,這是一個非常像我們討論過的其他神經網絡。但它是一個特別為處理語言問題而設置的神經網絡。它最顯著的特征是一個叫做 “轉化器” 的神經網絡架構。

        在我們上面討論的第一個神經網絡中,任何給定層的每個神經元基本上都與前一層的每個神經元相連(至少有一些權重)。但是,如果一個人在處理具有特殊的、已知的結構的數據時,這種全連接的網絡(大概)是過剩的。因此,例如,在處理圖像的早期階段,典型的做法是使用所謂的卷積神經網絡(“convnets”),其中的神經元被有效地布置在一個類似于圖像中的像素的網格上 —— 并且只與網格上附近的神經元相連。

        變換器的想法是為構成一段文本的標記序列做一些至少有點類似的事情。但是,轉化器并不只是在序列中定義一個可以有連接的固定區域,而是引入了 “注意” 的概念 —— 以及對序列的某些部分比其他部分更 “注意” 的概念。也許有一天,僅僅啟動一個通用的神經網絡并通過訓練進行所有的定制是有意義的。但至少到現在為止,將事情 “模塊化” 在實踐中似乎是至關重要的,就像變壓器那樣,可能也像我們的大腦那樣。

        好吧,那么 ChatGPT(或者說,它所基于的 GPT-3 網絡)實際上是做什么的?回想一下,它的總體目標是以 “合理” 的方式延續文本,基于它所看到的訓練(包括從網絡上查看數十億頁的文本等),所以在任何時候,它都有一定數量的文本,它的目標是為下一個要添加的標記提出適當的選擇。

        它的操作分為三個基本階段。首先,它獲取與迄今為止的文本相對應的標記序列,并找到代表這些標記的嵌入(即一個數字陣列)。然后,它以 “標準的神經網絡方式” 對這一嵌入進行操作,數值 “通過” 網絡中的連續層,產生一個新的嵌入(即一個新的數字陣列)。然后,它從這個數組的最后一部分,生成一個大約 50,000 個值的數組,這些值變成了不同的可能的下一個標記的概率。(而且,是的,恰好使用的標記的數量與英語中的常用詞的數量相同,盡管只有大約 3000 個標記是整個單詞,其余的是片段。)關鍵的一點是,這個管道的每一部分都是由一個神經網絡實現的,其權重是由網絡的端到端訓練決定的。換句話說,實際上,除了整體架構之外,沒有任何東西是 “明確設計的”;所有東西都是從訓練數據中 “學習” 的。

        然而,在架構的設置方式上有很多細節,反映了各種經驗和神經網絡的傳說。而且,盡管這肯定是進入了雜草叢中,但我認為談論其中的一些細節是有用的,尤其是為了了解建立像 ChatGPT 這樣的東西所需要的東西。

        首先是嵌入模塊。下面是 GPT-2 的 Wolfram 語言示意圖:

        圖片

        輸入是一個由 n 個標記組成的向量(如上一節所述,由 1 到 50,000 的整數表示)。這些標記中的每一個都被(通過單層神經網絡)轉換成一個嵌入向量(GPT-2 的長度為 768,ChatGPT 的 GPT-3 為 12,288)。同時,還有一個 “二級路徑”,它將標記的(整數)位置序列,并從這些整數中創建另一個嵌入向量。最后,來自令牌值和令牌位置的嵌入向量被加在一起 —— 產生嵌入模塊的最終嵌入向量序列。

        為什么只是把令牌值和令牌位置的嵌入向量加在一起?我不認為這有什么特別的科學依據。只是各種不同的東西都被嘗試過,而這是一個似乎有效的方法。這也是神經網絡傳說的一部分,從某種意義上說,只要你的設置是 “大致正確的”,通常就可以通過做充分的訓練來確定細節,而不需要真正 “在工程層面上理解” 神經網絡最終是如何配置它的。

        下面是嵌入模塊所做的工作,對字符串 “hello hello  bye bye bye”:

        圖片

        每個標記的嵌入向量的元素都顯示在頁面下方,在整個頁面上,我們首先看到的是 “hello” 的嵌入,然后是 “bye” 的嵌入。上面的第二個數組是位置嵌入 —— 其看起來有點隨機的結構只是 “碰巧學到的”(在這種情況下是 GPT-2)。

        好了,在嵌入模塊之后,是轉化器的 “主要事件”:一連串所謂的 “注意塊”(GPT-2 為 12 個,ChatGPT 的 GPT-3 為 96 個)。這一切都很復雜 —— 讓人想起典型的難以理解的大型工程系統,或者,生物系統。但無論如何,這里是一個單一的 “注意塊” 的示意圖(對于 GPT-2):

        圖片

        在每個這樣的注意力塊中,有一系列的 “注意力頭”(GPT-2 有 12 個,ChatGPT 的 GPT-3 有 96 個) —— 每一個都是獨立操作嵌入向量中的不同數值塊的。(是的,我們不知道為什么分割嵌入向量是個好主意,或者它的不同部分有什么 “意義”;這只是 “被發現可行” 的事情之一)。

        好吧,那么注意頭是做什么的?基本上,它們是一種在標記序列中 “回顧” 的方式(即在迄今為止產生的文本中),并將過去的內容 “打包” 成有助于尋找下一個標記的形式。在上面的第一節中,我們談到了使用 2-gram 概率來根據它們的直接前身來挑選單詞。變換器中的 “注意” 機制所做的是允許 “注意” 甚至更早的詞 —— 因此有可能捕捉到,比如說,動詞可以指代在句子中出現在它們之前的許多詞的名詞的方式。

        在更詳細的層面上,注意力頭所做的是以一定的權重重新組合與不同標記相關的嵌入向量中的大塊。因此,例如,在第一個注意力區塊中的 12 個注意力頭(在 GPT-2 中)對上面的 “hello, bye” 字符串有如下(“look-back-all-the-way-beginning-the-sequence-of-tokens”)模式的 “重組權值”:

        圖片

        在經過注意力頭的處理后,產生的 “重新加權的嵌入向量”(GPT-2 的長度為 768,ChatGPT 的 GPT-3 的長度為 12288)被傳遞到一個標準的 “全連接” 神經網層。很難掌握這個層在做什么。但這里是它使用的 768×768 權重矩陣的圖(這里是 GPT-2):

        圖片

        采用 64×64 的移動平均數,一些(隨機漫步式的)結構開始出現:

        圖片

        是什么決定了這種結構?最終,它可能是人類語言特征的一些 “神經網絡編碼”。但到現在為止,這些特征可能是什么還很不清楚。實際上,我們正在 “打開 ChatGPT 的大腦”(或至少是 GPT-2),并發現,是的,里面很復雜,而且我們不了解它 —— 盡管最終它產生了可識別的人類語言。

        好吧,在經歷了一個注意力區塊之后,我們得到了一個新的嵌入向量 —— 然后它又被連續地傳遞到其他的注意力區塊中(GPT-2 共有 12 個;GPT-3 有 96 個)。每個注意力區塊都有自己特定的 “注意力” 和 “完全連接” 權重模式。這里是 GPT-2 的 “hell,bye” 輸入的注意權重序列,用于第一個注意頭(attention head):

        圖片

        這里是全連接層的(移動平均)“矩陣”:

        圖片

        奇怪的是,盡管這些 “權重矩陣” 在不同的注意力塊中看起來很相似,但權重的大小分布可能有些不同(而且不總是高斯的):

        圖片

        那么,在經歷了所有這些注意力區塊之后,轉化器的凈效果是什么?從本質上講,它是將原始的符號序列的嵌入集合轉化為最終的集合。而 ChatGPT 的具體工作方式是在這個集合中提取最后一個嵌入,并對其進行 “解碼”,以產生一個關于下一個標記應該是什么的概率列表。

        這就是 ChatGPT 的概要內容。它可能看起來很復雜(尤其是因為它有許多不可避免的、有點武斷的 “工程選擇”),但實際上,所涉及的最終元素非常簡單。因為最終我們要處理的只是一個由 “人工神經元” 組成的神經網絡,每個神經元都在進行簡單的操作,即接受一組數字輸入,然后將它們與某些權重相結合。

        ChatGPT 的原始輸入是一個數字數組(到目前為止符號的嵌入向量),當 ChatGPT“運行” 以產生一個新的符號時,所發生的只是這些數字 “通過” 神經網的各層,每個神經元 “做它的事”,并將結果傳遞給下一層的神經元。沒有循環或 “回頭”。一切都只是通過網絡 “前饋”。

        這是一個與典型的計算系統 —— 如圖靈機 —— 非常不同的設置,在圖靈機中,結果是由相同的計算元素反復 “再處理” 的。在這里,至少在生成一個特定的輸出符號時,每個計算元素(即神經元)只被使用一次。

        但在某種意義上,即使在 ChatGPT 中,仍然有一個重復使用計算元素的 “外循環”。因為當 ChatGPT 要生成一個新的標記時,它總是 “讀取”(即作為輸入)它之前的整個標記序列,包括 ChatGPT 自己之前 “寫” 的標記。我們可以認為這種設置意味著 ChatGPT —— 至少在其最外層 —— 涉及到一個 “反饋循環”,盡管在這個循環中,每一次迭代都明確地顯示為一個出現在其生成的文本中的標記。

        但讓我們回到 ChatGPT 的核心:反復用于生成每個標記的神經網絡。在某種程度上,它非常簡單:一整個相同的人工神經元的集合。網絡的某些部分只是由(“完全連接”)的神經元層組成,其中某一層的每個神經元都與前一層的每個神經元相連(有一定的權重)。但是,特別是它的變壓器結構,ChatGPT 有更多的結構部分,其中只有不同層的特定神經元被連接。(當然,人們仍然可以說,“所有的神經元都是連接的” —— 但有些神經元的權重為零)。

        此外,ChatGPT 中的神經網的某些方面并不是最自然地被認為是由 “同質” 層組成的。例如,正如上面的圖標摘要所示,在一個注意力區塊中,有一些地方對傳入的數據進行了 “多份拷貝”,然后每個拷貝經過不同的 “處理路徑”,可能涉及不同數量的層,然后才重新組合。但是,雖然這可能是對正在發生的事情的一種方便的表述,但至少在原則上總是可以考慮 “密集地填入” 層,但只是讓一些權重為零。

        如果我們看一下 ChatGPT 的最長路徑,大約有 400 個(核心)層參與其中 —— 在某些方面不是一個巨大的數字。但是有數以百萬計的神經元 —— 總共有 1750 億個連接,因此有 1750 億個權重。需要認識到的一點是,每當 ChatGPT 生成一個新的令牌時,它都要進行涉及這些權重中每一個的計算。在實現上,這些計算可以 “按層” 組織成高度并行的陣列操作,可以方便地在 GPU 上完成。但是,對于產生的每一個標記,仍然要進行 1750 億次計算(最后還要多一點) —— 因此,是的,用 ChatGPT 生成一個長的文本需要一段時間,這并不令人驚訝。

        但最終,最了不起的是,所有這些操作 —— 它們各自都很簡單 —— 能夠以某種方式共同完成如此出色的 “類似人類” 的文本生成工作。必須再次強調的是,(至少到目前為止,我們知道)沒有任何 “最終的理論理由” 來解釋這樣的工作。事實上,正如我們將要討論的那樣,我認為我們必須把這看作是一個潛在的令人驚訝的科學發現:在像 ChatGPT 這樣的神經網絡中,有可能捕捉到人類大腦在生成語言方面的本質。



        *博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。



        關鍵詞: AI

        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 玛多县| 若羌县| 河津市| 长宁区| 玉龙| 修武县| 都安| 正蓝旗| 九江市| 贵阳市| 香港 | 彭阳县| 香港 | 璧山县| 化德县| 宁晋县| 南皮县| 永康市| 陈巴尔虎旗| 临沂市| 浦东新区| 友谊县| 西宁市| 三亚市| 磐石市| 察雅县| 富阳市| 阿瓦提县| 钟山县| 卢湾区| 常德市| 黔东| 沂源县| 昂仁县| 滦平县| 太仓市| 永州市| 平顶山市| 新营市| 昌黎县| 巴马|