大型語言模型 LLM 是如何讀懂我們的?對機器來說,人類的語言要如何理解?AI真的知道它在說什麼嗎?
一開始,我們有自然語言的字串 String。這個字串可能是任何人類的語言。
1 Tokenizer
Tokenizer 的目的是把文本翻譯成模型可以處理的數值。
1.1 分詞:把文本的字串切成一堆 Token
Token 是機器可以處理的最小單位,在大語言模型的情境中,通常翻為「標記」。那該怎麼切呢?如果是英語,詞彙與詞彙之間有間隔的語言,是不是就照著空白切?還是說需要切成字母?那如果是詞彙間沒有空白的語言,比如說中文、阿拉伯語,該怎麼切?
第一個想法是直接根據詞彙 word 來產生 token。這對於英語、西班牙語等,用空格就可以區分詞彙的語言來說,非常方便。但缺點是,這種分詞方式,需要為語言中的每個詞創造一個 token。英語有超過五十萬個詞彙,也就是需要超過五十萬個 token ID,產生一個巨大的詞彙表。因為 token ID 彼此間沒有關連性,所以 dog 與 dogs 對模型來說沒有相似性,run 與 running 也是。另外。我們需要一個未知 token [UNK] 來代表沒有出現在詞彙表中的未知詞彙。如果分詞的過程出現大量的未知 token,代表文本中有許多資訊被遺漏了。
為了解決詞彙表過於巨大,還有未知標記過多的問題,另一個想法是我們用字元 character 來產生 token。對印歐語系來說是字母,對中文來說是字。而對不同的語系來說,以字元為基礎的分詞方式產生不同的問題。拉丁字母承擔的資訊,遠不如詞彙豐富,而且字母為單位的分詞法,會讓一個詞彙需要很多 token 才能表示。而對於中文而言,每個中文字所包含的意思,又與它們構成詞彙時包含的意思有差距。
因此現在大語言模型採用的是第三種作法,結合字元與詞彙的技巧:子詞 Subword 分詞。
子詞分詞的原則是:常用詞不應該被拆分成更小的子詞,而罕見詞應該被分解成有意義的子詞。例如 tokenization 這個詞本身,拆分為 「token」 與「ization」,兩個 token 就能表示一個長詞彙,而且幾乎不會有未知詞,因為可以用各種子詞組合。這個方法對於土耳其語等黏著語特別有用,子詞可以串連成任意長的複雜詞彙。
子詞分詞的依據並不是語言學,而是統計頻率。在大量的語料中,常出現的字元組合,就形成一個子詞單元。所以不論是英文、中文、阿拉伯語、土耳其語,都可以用子詞分詞法。
然而,因為子詞分詞的效果來自大量的語料,而當代大語言模型中,英文遠多於中文,中文遠多於阿拉伯文,資料少的語言,子詞 token 的切分就比較粗糙,模型的理解就比較差。同樣一句話,英文可能只需要 10 個 token,某些語料稀少的語言可能需要 30 個。
如果進一步考慮到:語言不只承擔訊息,也承擔了歷史、文化和思考方式,那麼用大量語料訓練 AI,其實就是在用某一種族群的經驗來餵養 AI ,塑造 AI 的思考方式與性格氣質。AI 模型看似中立,但訓練 AI 的語料是有立場的,當中包括著許多偏見。現今的大語言模型,訓練資料幾乎都是英語語料,所以也帶著英語語料代表族群的立場與偏見。我們與 AI 對話的同時,也是與另一個文化的世界觀對話。這也是為什麼我們需要提倡主權 AI;同樣使用英語,美國的英語資料和英國的是不一樣的;台灣與中國的中文資料也是;如果我們依賴簡體中文語料訓練產生的大語言模型,我們對話的對象,使用的就是當代中國的中文,帶著當代中國的文化與氣質。
1.2 將 Token ID 前後加上 [CLS] 還有 [SEP] 字符
這是給模型讀取的框架標記。[CLS] 標記句子的開始,[SEP] 標記句子的結束或兩句之間的分隔。這是 BERT 類模型預訓練時就使用的慣例,推論時也必須加上,否則模型無法正確識別輸入的邊界。
1.3 將 token 換成 token ID
在這一步,原本帶有語言意義的子詞 token 被轉換為數字了。這些數字沒有任何語意,只是給模型的索引;意義要到 Model 階段的 Embedding 才會再出現。
1.4 Padding 補零與 Attention Mask 標記
把自然語言轉換成數值的目的是讓機器能夠處理這些數值。目前最有效的處理方式是用 GPU 來運算矩陣——整批運算大量的數字。但是我們把自然語言轉換成 Token ID 的時候,這個句子多長,Token ID 的序列大概就多長,不同長度的句子會產生不同長度的 Token ID 序列,這樣就沒有辦法構成有固定大小的矩陣。
所以這裡我們要用 Padding 的方式補零。原則上來說,最長的句子不必補零,比那個句子短的都要補零。為了節省補零的空間,還可以把這些句子分段,每一段最長的句子不必補零;這種動態補零 Dynamic Padding 的辦法可以避免一個單一的長句子引起大量的補零。無論如何,我們不可能要求使用者每一句話都要有固定的長度——做不到。所以 Tokenizer 自己要補零。
但是補零之後,產生了新的問題:那些補上的零對模型來說,會列入計算,與沒有補零的結果不同。所以我們還要加上 Attention Mask 注意力遮罩,告訴模型哪一些是真正的資料,哪一些只是為了形成矩陣的補零。
1.5 包成二維 batch,Tokenizer 完成。
所以 Tokenizer 的流程是:自然語言字串分詞為 Subword Token,加[CLS][SEP],轉換成 Token ID 之後,Padding 補零、加上 Attention Mask 標記模型該注意的真實資料,就可以包成二維的 Batch,交給模型來處理。
2 Model
2.1 Embedding
Model 在接收到 Token ID 包裝成的數值矩陣後會進行 Embedding,把數值矩陣投射進向量空間當中。所謂的向量空間,用很簡單的方式講,就是有很多維度的空間。講到維度,大家可能會想到上下左右,或者是 3D 遊戲裡面的 XYZ 軸。但其實維度就是一種屬性。對大語言模型而言,所謂的「很多維度」不只是三維四維五維,而是 768 維、1024 維,非常高維度的空間。
為什麼需要這麼多維度呢?因為每一個詞彙,都有各種屬性。人類的大腦太厲害了,在運用詞彙的時候可以很自然地理解並使用一個詞彙的各種屬性;但是對機器來說,要「理解」一個詞彙,方法就是把字串變成 token ID,然後放進向量空間,產生這個 token ID 在各種屬性維度上的值,這些值不是人工設定的,而是模型根據訓練資料中歸納而出的,反映了大量語料當中某個 token 與其他詞彙的關係。屬性值的數量則取決於向量空間的維度,1024 維就會產生一千零二十四個值。
當 Token ID 這個沒有意義的數字,轉換為高維的向量後,這個 Token ID 在向量空間中就有了一個位置。而既然有了位置,模型就可以度量 Token ID 彼此之間的距離。原本的自然語言詞彙,意義越相近的,在高維向量空間中的距離就越近。反過來說,在向量空間當中很近的兩個向量,對應到真實自然語言的時候,會是意義相近的詞彙。
因此,到了這一步,自然語言當中所謂「意義的遠近」,被翻譯成 Token ID 之間在向量空間中的距離。而這個距離就是電腦可以處理的東西。我們事實上把「意義」這個東西數學化了,成為機器可以處理的東西。
2.2 Transformer
當自然語言翻譯成的 Token ID 轉換成高維向量之後,LLM 的核心 Transformer 就可以進行 Attention 機制的處理。
2017 年 「Attention Is All You Need」這篇論文,奠定了生成式 AI 的基礎。以往的自然語言處理 NLP ,線性地依序處理句子裡的每個詞彙。Transformer 機制不然,Transformer 為核心的模型處理每一個 token 的時候,同時「看」句子裡所有其他的 token,決定哪些詞對當前位置最重要。例如「它很累所以沒有過馬路」;「它」指的是誰?Attention 讓模型回頭看整句話,判斷「它」跟「動物」的關聯比跟「馬路」更強。這也就是為什麼,token ID 需要轉為高維向量:模型才能根據向量的距離,判斷詞彙的關聯性。
Attention 機制的處理結果會產生一組向量,包含了這個 token 在整個句子語境下的完整語意表示,稱為 token 的 Hidden States。Hidden States 就是模型對輸入的『理解』。
2.3 Head
但這時候模型還沒有決定這個任務的性質。任務的性質要靠 Head 來決定。Head 決定任務性質後,就可以把 Hidden States 壓縮成 Logits。Logits 是神經網路模型輸出的原始分數,表示模型各種預測的證據強度。你可以把它想成模型對輸入內容的原始投票結果。Logits 會在後處理階段被轉換成總和為 1 的機率。
所以,Model 這個階段的流程是將 Token ID Embedding 後產生高維向量,Transformer 以 Attention 機制處理語意產生 Hidden States,Head 決定任務性質,把 Hidden States 壓縮成 Logits。接著就進入後處理階段。
3 Post-Processing 後處理
在後處理這邊,SoftMax 把 Logits 轉換成機率。機率最高的那個 token,就是模型的下一個輸出;這就是所謂「大型語言模型的輸出其實只是文字接龍」的真相:LLM 透過一連串步驟,將使用者提供的自然語言轉化為機器可以處理的機率值,並根據這個機率值選擇機率最高的 token 回應使用者。
以上就是AI 的心;以 Transformer 為核心的大語言模型,處理自然語言輸入與產生輸出的原理。
那為什麼, AI 看起來能夠與人產生有意義的互動?甚至有人認為 AI 產生了「靈魂」?
機器根據訓練資料,分析 token ID 的向量空間距離,產生統計上機率最高的下一個 token;Attention 機制讓模型能夠看到所有能見到的 token,決定什麼是最有關聯的。這樣的運作方式,讓LLM 的文字接龍,自然就會與使用者的輸入高度相關。對模型來說,一切都是距離與可能性。
而對人來說,意義來自自我與世界的互動。我們天生就想要賦予任何事情意義,尤其是與我們關心的話題高度相關又足夠豐富的內容。大型語言模型非常擅長提供這樣的內容。
所以問題也許不是為什麼 AI 看起來有情感,有靈魂;而是現代生活中,是否有太多無關又貧乏的互動,以至於 LLM 與我們的互動看起來,比生活的其他部分還有趣?

















