從0構建大模型知識體系(3):大模型的祖宗RNN
更新于:2025-04-14 12:15:45

從自然語言的數字化過程,到RNN的數學原理、訓練方法和文本生成機制,再到其在現代大模型中的地位和影響,本文將為你揭開RNN的神秘面紗,帶你深入理解大語言模型的核心技術基礎。

按照慣例,結論先行

這篇文章要討論啥?

討論AI是如何通過自然語言處理技術來完成“用戶提問,AI回答”的文字生成任務的。RNN(迴圈神經網路,Recurrent Neural Network)是完成這一任務的經典模型,同時也是現在大語言模型的技術源頭,瞭解RNN有助於我們理解現在大語言模型的概率輸出機制以及幻覺現象的成因。

我會以訓練一個RNN架構的客服機器人為切入口,剖析其通過迴圈結構實現序列數據記憶的機制,並闡釋其概率輸出機制與幻覺現象的內在關聯。

文章討論的核心問題和結論是啥?

① 人類的自然語言是如何被數位化的?

自然語言的數位化過程分為token化、數位映射、獨熱編碼和詞嵌入四步

② 如果說模型的本質是一套數學公式,那麼文本生成模型的數學公式是什麼?

模型的數學公式無法用一個簡單式子描述,只能畫出模型結構,其內部進行了矩陣乘法運算

③ 文本生成模型的訓練數據是如何構造的,模型又是怎麼被訓練的?

將訓練語料分割為多個“輸入→輸出”語料對,通過這些語料對來調整模型參數

④ 訓練出的模型是怎麼完成文本生成任務的?

基於文字序列末尾的幾個字循環預測下一個字,逐字擴展直至完成文本生成

⑤ 為什麼模型會有幻覺現象?

根本原因在於模型基於概率的輸出機制本質是在最大化語言的連貫性而非正確性

次要問題和結論是啥?

⑥ 模型真的具備智慧嗎?

語言模型本質是統計不同字詞共同出現概率的預測系統,不具備因果理解能力,不具備廣義的智慧

⑦ 為什麼模型會對相同的輸入產生不同的輸出?

為追求創造性,模型的“溫度”參數會讓其在即便相同的輸入下也會輸出不同的內容

上一篇文章《從0構建大模型知識體系(2):給模型開眼的CNN》已介紹圖像識別的經典模型CNN。但日常傳遞資訊除了圖像外還會使用大量的自然語言,即人類日常交流使用的語言(如中文、英語)。讓計算機能夠理解並處理自然語言的技術被統稱為自然語言處理(NLP,Natural Language Processing),其中最經典的一項技術就是本文要介紹的循環神經網路(RNN,Recurrent Neural Network)。

順便一提,RNN被稱為大模型祖宗是因其改良版本——LSTM(長短期記憶網路)啟發了Transformer的設計。而Transformer又是現在大模型(如chatGPT、DeepSeek)的基礎架構,因此理解RNN有助於理解現代大模型的核心機制及挑戰,如幻覺的成因。

從客服機器人開始說起

假設你是某網店的客服,面對日均5000+條諸如 “包郵嗎”、” 有贈品嗎 ” 的重複諮詢,即便寫了FAQ文件使用者也懶得看。於是你開始思考:能否訓練一個智慧助手,讓它根據使用者的問題自動生成符合語境的回復?

這種需求催生了自然語言處理領域的文本生成任務(text generation),其核心是讓模型在給定輸入后,輸出語法正確且語義連貫的文本。當前炙手可熱的ChatGPT、DeepSeek等大語言模型,本質上都是在完成這一任務。

與上一篇文章處理圖片數據不同的是,自然語言處理有兩個特殊挑戰。

處理自然語言的兩個挑戰:序列性與上下文相關性

在圖像識別任務中,CNN架構的模型存在兩個致命缺陷。① 無法處理輸入數據的順序。例如識別數位時,先識別圖片1後識別圖片2與先識別2後識別1毫無差異。② 無法記憶之前處理的內容。即圖片1的識別結果完全不會影響圖片2。然而自然語言具有:

1)嚴格的序列性:”我喜歡上班” 與 “班喜歡上我” 的語序差異直接導致語義顛覆。

2)複雜的上下文相關性:例如試著完成下面3個空格填字

  1. “食堂大__”
  2. “保潔阿__”
  3. “外賣小__”

人類可以輕鬆補全為 “媽 / 姨 / 哥”,這是因為人腦能建立上下文關聯。這種特性要求模型必須具備記憶能力,這正是傳統 CNN 難以處理自然語言的根本原因。

不過在解決這兩個挑戰之前還有個問題,那就是專欄第一篇文章就提到,無論大模型小模型,其本質都是把一個數通過一定運算變成另一個數的數學公式。所以顯然,我們需先解決自然語言數字化的問題。

把自然語言轉為數位的四個步驟

第一步:token化(tokenization)。人類理解中文是以字為最小單位,如“我喜歡上班。”這句話是被拆分為“我”、“喜”、“歡”、“上”、“班”、“。”來理解的。類似人類逐字理解的過程,token(詞元)即模型處理自然語言的最小單元,將句子分割為多個token的過程就是token化。

比如“我喜歡上班。”這句話按照詞的維度可以被token化為[“我” ,”喜歡” ,”上班” , “。”]4個token,也可以按照字的維度token化為[“我” ,”喜” ,”歡” ,”上” ,”班”, “。”]6個token。不同的模型往往有不同的策略。所以我們平時使用大模型時輸入一句話到底算幾個token取決於所用模型自己的token策略

現在的大模型如DeepSeek廣泛採用的token化策略叫做BPE(Byte Pair Encoding),核心思想是將高頻字元組(包括非完整詞彙)與單字共同作為 token。比如除了將“我”、“喜”、“歡”三個高頻漢字各算作一個token外,也會將“我喜歡”,這樣高頻出現的非完整詞彙算作一個token。所以上面這句話其實還可以被分割為[“我喜歡” ,”上班”, “。”]3個token。

為方便解釋,本文一律把一個漢字算作一個token。

第二步:指定token和數位的對應關係。token雖然是模型處理自然語言的最小單位,但畢竟token不是數位,所以還需要給每個token指定所對應的數位。比如我們可以這樣指定token和數位的對應關係:

那麼“我喜歡上班。” 這句話現在就可以表示為[1, 2, 3, 4, 5, 6]6個數位。實踐當中往往會把所有token按照其在語料中的出現頻率由高到低排列,頻率越高的token指定的數位越小,這是因為小的數位在計算機中的存儲和運算成本都更小

到此,對於一些數據量少,問題簡單,小模型就能解決的場景來說自然語言數位化的過程就結束了。但這樣的數字化結果存在兩個問題:

1)數值大小≠語義關係。例如“我”對應數位1,“喜”對應2,雖然1<2但這並不代表“我”<“喜”。數值大小與語義脫節會導致模型學習到錯誤的語言規律。

2)無法進行運算。雖然數學上 1+2=3,但 “我”+“喜” 顯然不等於“你”。這將導致模型無法以數學運算的方式對語言做處理。

因此,大模型需要通過後續步驟解決這些問題,使數位真正承載語義資訊,從而實現更接近人類的語言處理能力。

第三步:獨熱編碼(one-hot encoding)。也就是將每個token所對應的數位再做一次轉換,具體轉換也很容易理解,比如“我”對應的數位是1,那就用除了第一位是1,其餘位全是0的六維向量來表示它,即[1,0,0,0,0,0]。同理,“愛”對應2,那麼它的編碼結果就是[0,1,0,0,0,0]……以此類推。這種方法消除了數值大小的誤導性,且允許簡單組合,比如“我”+“喜”=[1,1,0,0,0,0]表示“我”和“喜”兩個字,很合理。但獨熱編碼仍存在兩大局限:

1)計算成本高。這裏我們只考慮了6個token,所以一個token經過獨熱編碼後只有6個數位。但處理整個中文體系至少也需要一萬個token吧。每個token獨熱編碼后就是一萬個數位,所以光是理解“我喜歡上班。”6個token就需要電腦處理6萬個數位,成本太高。

2)語義關聯性缺失。例如 “樹”被編碼為 [0,0,0,0,1,0],“ 木”被編碼為 [1,0,0,0,0,0],兩個編碼結果完全無法體現“樹”和“木”的語義相似性。

所以對於大模型來說,自然語言的數位化轉換還有一步。

第四步:將獨熱編碼后的token進行詞嵌入操作(word embedding)。通過專門訓練的詞嵌入模型,將獨熱編碼的高維向量(如 10000 維)轉換為低維向量(如 3 維)。詞嵌入模型的設計和訓練是另一個話題,我們只需要知道經過詞嵌入后可實現三個效果:

1)維度變低且數值有零有整。原本一個token是用一個只有0和1的高維向量表示的,但現在變為了有零有整的低維向量,比如[3.1, 2.6, 7]這樣。

2)語意相近的token編碼結果會比較相似。比如我們會發現進行詞嵌入處理後以下4個token的編碼可能長這樣

如果把每個token編碼中的三個數字當做xyz座標,“樹”、“木”、“葉”會非常接近,且他們距離“海”的距離都比較遠。

3)token編碼之間的加減也具有語義。比如我們會發現“樹”-“木”≈“葉”

到此,對大模型來說自然語言數位化的過程才算徹底結束。

所以總結一下,當我們輸入一句話時,這句話首先會被切分成多個token,不同的模型有不同的切分策略,每個token會被映射成一個數位,之後再經過獨熱編碼和詞嵌入,最終成為模型可處理的一串數。

現在我們解決了自然語言數字化的問題,接下來就需要搭建模型完成文本生成任務了。完成這一任務的核心數學運算是矩陣乘法,所以我們先簡單介紹一下這種運算。

一種運算:矩陣乘法

矩陣乘法就是說兩個矩陣相乘可以得到一個新的矩陣。比如:

總之就是兩組數相乘表示通過對這兩組數進行加法和乘法運算可以得到新的一組數。

來,讓我們給AI開記憶

RNN中的神經元其實就幹矩陣相乘這一件事。RNN既然叫迴圈神經網路,說明在其中有個東西得是迴圈出現的,並且還通過這種方式組成了一個網路。這個循環出現的東西就是RNN網路中的神經元,它長這樣:

在這個結構中A、B和C都是一個矩陣。其中A是輸入,B是模型參數,A與B相乘后得到了輸出C,C會往模型中其他兩個方向繼續傳遞,所以C有兩個輸出方向。

模型對語言的處理本質上也是在做加減乘除。舉個例子,假設“你”這個字數位化后的結果為[1, 5, 3]這串數,而模型的參數B為:

那麼輸入“你”后模型內部即進行了一次矩陣乘法,即:

得到的結果怎麼解讀我們之後再說。

神經元迴圈連接就成為了迴圈神經網路RNN,網路能夠將歷史輸入資訊融入當前計算,從而具備了記憶。比如我們讓神經元循環連接3次,得到的網路長這樣:

我們來觀察一下模型的3個輸出C1、C2和C3。C1的產生完全由A1決定,它是以A1為輸入與B相乘後得到的輸出。數據流向畫出來是這樣

而C2的產生則是由A1和A2共同決定的

同理,C3的產生由A1,A2和A3共同決定。換句話說,模型在輸出時記住了之前輸入的內容,所以說模型擁有了記憶。

那如果要讓模型完成“外賣小__”的空格填字怎麼辦了?好說,把“外”、“賣”、“小”三個字數位化后分別當做A1、A2和A3輸入給模型,取C3作為最終輸出就行,畢竟C3的產生結合了A1至A3。至於中間結果C1和C2在我們這兒用不上,丟棄就行。

C3表示模型認為每一個token有多大的可能成為當前的輸出。現在我們來解讀一下模型的最終輸出。模型最終的輸出C3不是一個數,而是一串數。有多少個數取決於我們準備的訓練語料包含多少個不同的token。假設我們的語料一共包含“外賣小哥保潔阿姨食堂大媽”這12個token,那麼C3就是12個數,每個數是一個0~1之間的小數,比如我們輸入“外賣小”三個token后得到的C3可能長這樣:

[0.05, 0.02, 0.1, 0.2, 0.1, 0.05, 0.04, 0.07, 0.02, 0.15, 0.09, 0.11]

其中第一個數表示模型認為token集中第一個token(也就是“外”)應該作為本次輸出的概率為0.05,第二個數表示第二個token(也就是“賣”)作為本次輸出的概率為0.02……以此類推。我們畫個圖來看一下

這個圖表示了每個token的輸出概率,因此模型的輸出機制是“基於概率輸出”。從這些候選token中如何選出一個token作為輸出就叫做“採樣策略”。目前來看“哥”這個token的概率最高,所以如果我們的採樣策略是“把概率最高的token作為本次輸出”(雖然這是最符合直覺的採樣策略,但實際往往不會這樣做),那模型就會以“哥”作為本次輸出。當然,在實際當中完全有可能是某個別的token概率最大。

至於為什麼要強調“基於概率輸出”以及“採樣策略”這兩點,先埋個伏筆……在介紹完模型訓練和實際使用之後再回收。

所以總結一下,將RNN神經元多次循環連接就可以得到RNN。最末尾神經元的輸出是由之前所有的輸入共同決定的,因此RNN具有記憶。此外,模型對自然語言的處理本質也只是在做加減乘除,當我們輸入一句話後,模型的輸出是一個概率分佈,最終實際會輸出什麼內容取決於我們的採樣策略。

到此,模型就搭建完了,其本質也是一個數學公式,即給定一句話後進行的一系列運算。回到一開始的問題,我們要如何依靠這個模型來訓練一個客服機器人呢?這就關乎訓練數據應該如何準備以及如何訓練了。

訓練前:準備訓練數據

還記得啥叫文本生成嗎?讓模型依據給定的輸入來輸出符合語法規則、語義通順的文本內容。所以我們要根據語料不停的提供這樣的“輸入→輸出”示範讓模型學會語料內的內在關係。具體來說,假設我們的客服文檔中關於產品品質部分的說明如下:

“此款襯衫採用新疆長絨棉混紡莫代爾面料,兼具純棉的透氣親膚與莫代爾的抗皺垂墜特性。立體剪裁設計,衣長覆蓋腰線,袖口深度優化活動自由度,版型貼合人體工學。”

那麼我們可以四個字為一組,前三個字作為給定輸入,第四個字為期望輸出的方式對這段話進行分割,如下所示。

按照這樣的方式上面這段話能被分割為71個語料對。到此我們的訓練數據就準備完了。

訓練中:輸入每個語料對調整參數

分割出的每一對語料對都將用於調整模型參數,以第一個語料對(此款襯,衫)為例,一共有4步:

所以整個訓練過程可以這樣表示:

訓練后:文本生成

完成訓練后的模型就可以投入使用了。實際使用需要使用者先給輸入,也就是現在常說的prompt。假設用戶輸入“您好!”,模型會先根據這三個字輸出下一個字,然後繼續根據最新的三個字輸出下一個字,如此迴圈直到模型認為可以停止輸出。整個過程可以如下表示:

這就解釋了為什麼我們日常使用的大模型通常採用逐字輸出的方式,同時也解釋了為何部分模型會忘記使用者之前輸入的內容——因為之前輸入的內容已超出其輸入範圍。比如圖中這個模型每次的輸入範圍就只有最近的3個token,3個token之前的東西就記不住。(但現在的大模型如GPT-4o的輸入範圍是128,000個token)

伏筆回收之一:模型基於概率的輸出機制

無論是大模型還是本文介紹的RNN,他們都採用基於概率的輸出機制,因此必然產生 幻覺 。回顧一下我們是怎麼訓練模型的:我們將語料按照“輸入→輸出”的方式分割為了眾多語料對,並用來調整模型參數。這種機制使模型學到的是語料中字詞共同出現的規律(也就是當某些字出現之後,在這之後的字大概率會是什麼),而非事實邏輯。

因此假設我們的語料中出現了大量的“星期三”,模型就會認為“星期”二字之後大概率應該是“三”,所以如果輸入“2025年4月32日是星期”,模型會輸出“三”,哪怕4月其實並沒有32日。同理,如果語料中出現大量的“1+1=3”,那麼輸入“1+1=”模型也會輸出3。

這種基於概率的輸出機制使得模型並不追求語言的 “正確性”,而是根據所學語料追求語言的“連貫性”。因此會出現模型的語言表達連貫自然但與事實不符的現象,也就是幻覺。

模型真的“智慧”嗎?現在我們理解了模型的本質是通過大規模數據訓練形成的概率預測系統,那這算作真正的智慧嗎?我認為不算。雖然“智慧”到底應該如何定義是一個巨集大的哲學問題,但一個智慧的個體至少應該能夠理解因果,並運用因果關係解決實際問題。而模型從海量的數據中真的學到了因果嗎?顯然不是,它只學到了字詞共同出現的概率。

那為什麼現在的大模型看上去如此智慧?因為語料足夠多,質量足夠好,模型設計足夠複雜,這使得現在的大模型確實太像一個真正智慧的個體了,像到確實可以用來解決很多問題了。但即便如此,其概率預測系統的本質決定了它不可能發展為理解因果關係的終極智能系統。

伏筆回收之二:模型的token採樣策略

回到輸入“外賣小”後模型的輸出這個例子,我們之前假設模型此時對每個token的輸出概率如下

如果選擇“把概率最高的token作為本次輸出”的採樣策略,那模型自然會輸出“哥”字。而實際當中往往不會採用這個策略,而是用一個叫做“溫度”(temperature)的參數來控制模型的輸出要按照多大程度偏移概率最高的token。

如果溫度為0,那麼模型就會始終按照它從訓練語料中習得的最有可能與當前輸入共同出現的token作為輸出。這種情況下無論我們輸入多少次“外賣小”,模型輸出都是“哥”。此時的模型具有較強的準確性。

如果把溫度提升,模型就可能從其他token里選一個作為輸出,溫度越高越有可能。這種情況下我們多次輸入“外賣小”的話有可能第一次是“哥”,第二次是“姨”,第三次又是“媽”,第四次又是“哥”。此時的模型具有較強的創造性。這也是為啥我們即便多次輸入一樣的內容給大模型,每次回復都不一樣的原因之一。(其他原因有使用者所用的設備不同、地點不同、時間不同。這些信息雖然不在我們的prompt中,但app會自動上傳給大模型以優化其回復)

因此,如果app內可以調控這個參數的話(比如下圖裡Google的AI Studio),對於一些要求準確性強的任務,如法律檔生成,可以將溫度調低,讓模型忠於語料中學到的字詞共現規律,不要憑空捏造法律條文。而對於要求創造性的任務,如詩歌生成,則可以將溫度適當調高。

復盤一下,我們學到了什麼

自然語言的序列性和上下文相關性是兩大挑戰。這要求模型具備記憶能力。

自然語言處理本質也是在對數字進行加減乘除。我們輸入的一句話會先被切分成多個token,每個token會經過獨熱編碼和詞嵌入最終成為模型可處理的一串數。模型對這些數進行加減乘除后就可以達到預期的效果。

RNN就是將一個神經元迴圈連接組成的網路,這種網路具有記憶。一個神經元只幹矩陣相乘這一件事,當我們把這樣的神經元循環連接后,最後一個神經元的輸出會兼顧之前所有的輸入,所以RNN具有記憶。

給定一句話,讓模型續寫這事兒叫文本生成,訓練文本生成模型需要準備眾多語料對。每個語料對體現的是哪些字詞會共同出現,模型就是通過學習這種共現規律來生成文本的。

模型基於序列末尾的幾個字循環預測下一個字,逐字擴展直至完成文本生成。這是模型之所以一個字一個字往外蹦以及有時候會忘記使用者之前輸入內容的原因。

模型產生幻覺的根本原因在於其基於概率的輸出機制。無論大模型還是 RNN,這類語言模型都通過學習語料中字詞的共現規律來生成輸出。在訓練過程中,數據被分割為 “輸入→輸出” 的語料對,模型通過統計規律預測給定輸入后的下一個字,本質是在最大化語言的連貫性而非正確性,因此會出現幻覺。

大模型也好,小模型也罷,都不是真正的智慧。模型的本質是一個統計了語料間字詞共現規律的概率預測系統,它並未理解語料中包含的資訊,並不理解因果,更不能運用因果。現在的大模型確實很像一個智慧的個體,像到了真的可以用來解決現實問題的程度,但它依舊不是廣泛意義的智慧。

“溫度”是導致模型對於相同輸入的回復不一致的原因之一。溫度為0,模型則始終按照概率最大的token進行輸出。溫度越高,模型偏移概率最大的token進行輸出的可能性越高。除此之外,app還會上傳使用者所用設備、所在的位置、時間等資訊供大模型參考,也會導致相同prompt下大模型輸出不一致。

歡迎來到1997

RNN雖然在20世紀80年代就已被提出,但礙於其梯度消失和爆炸的固有問題(即網路一旦變長,通過反向傳播就無法有效調整模型參數)實際應用非常受限。直到1997年Sepp Hochreiter和Jürgen Schmidhuber提出的長短期記憶網路(LSTM)才徹底解決了這個問題,使得RNN被大量應用於自然語言處理。ChatGPT的早期版本、蘋果Siri、亞馬遜Alexa都是其具體應用。

所以這裡以RNN的第二生日來恭喜你對大模型知識的理解來到了1997年。此時距離DeepSeek-R1發佈還有28年。

順便提一下,RNN由於可並行計算的部分有限,因而不能在大規模數據集上通過GPU訓練,所以現在已經不怎麼流行了。取而代之的是繼承了RNN的思想,所有計算都可並行的,下一篇文章就會提到的,現在大模型普遍採用的,大模型基石——Transformer。

AI Heroes

賦予RNN第二次生命的LSTM。RNN在誕生之初由於梯度消失和爆炸問題導致模型一旦過長便無法有效訓練,因此無法處理較長的序列數據。這個問題在1997年由Sepp Hochreiter和Jürgen Schmidhuber發表的《Long Short-Term Memory》中被徹底解決,他們對RNN的改良在於引入門控機制和記憶單元,實現了對資訊的選擇性存儲與遺忘,使得 LSTM 在處理長序列時能夠穩定地傳遞梯度,有效捕捉長期依賴。一個LSTM神經元長這樣:

比咱介紹的只做了一次矩陣乘法的RNN神經元複雜多了,而且看上去像只草履蟲哈哈哈

Sepp Hochreiter,IEEE 2021年神經網路先驅獎獲得者。Hochreiter現任奧地利林茨大學研究所所長,2021年獲得 IEEE 神經網路先鋒獎以表彰他在LSTM領域的開創性貢獻,該獎項被視為神經網路領域的最高榮譽之一。

xLSTM,makes RNN great again。 2024年5月Hochreiter團隊推出的了xLSTM(eXtended LSTM),旨在解決現在以Transformer架構為主的大模型(如DeepSeek)計算開銷大的問題。

  • Transformer架構的計算開銷與文本長度呈平方增長關係,而xLSTM在處理長文本時只需增加相應數量的神經元,因此計算開銷僅為線性增長。
  • 在模型訓練上xLSTM克服了傳統LSTM的並行計算瓶頸,實現了與Transformer相當的並行化訓練能力。
  • 在最終效果上,xLSTM在同等參數量下,長序列任務性能顯著優於Transformer,尤其在語言建模和實時場景中困惑度更低、記憶體效率更高,硬體適配性更強,適合工業部署;但在代碼生成、多模態融合等結構化任務中仍弱於Transformer,需依賴混合架構平衡順序與並行能力。
  • 對於那些推理計算量龐大和需要快速響應的場景,xLSTM 或許是值得關注的一條技術路線。

連續創業者。

  • 2017 年Hochreiter 創立奧地利人工智慧高級研究所(IARAI)並擔任首任所長,推動 AI 在交通、能源等領域的應用,例如開發即時交通預測系統,減少城市擁堵。
  • 2024年其研究所孵化了一家名叫NXAI的科技公司,針對特定行業(如汽車、醫療)定製 AI 解決方案
  • 2025年孵化Emmi AI,專注於通過其核心技術xLSTM 模型為製造業和能源行業提供輕量化、高效能的 AI 解決方案。

本文由 @夜雨思晗 原創發佈於人人都是產品經理。未經作者許可,禁止轉載

題圖來自Unsplash,基於CC0協定

該文觀點僅代表作者本人,人人都是產品經理平臺僅提供資訊存儲空間服務