從文字到向量:NLP 向量化與 Token 的演進
從 Bag-of-Words 一路談到 Transformer,理解「文字向量化」這條關鍵演化之路。
一、為什麼文字不能直接丟給模型?
電腦擅長的是數字運算,不是文字本身。
對模型來說,「蘋果」這兩個字沒有直接意義,它必須先被轉換成一個或多個數值向量,才能進行數學運算。
但這裡有個核心難題:
- 文字是離散符號:每個詞看起來彼此獨立。
- 語言是有順序的:「我愛你」和「你愛我」只差順序,意思卻完全不同。
- 語意是依賴上下文的:「蘋果」在「我喜歡吃蘋果」和「我買了蘋果手機」中,指的不是同一件事。
因此,文字向量化的目標不只是「把字變成數字」,而是要把語意、順序與上下文盡可能保留下來。
二、第一階段:基於統計的表示法
1. 詞袋法(Bag-of-Words, BoW)
最早的作法很直覺:把一段文字看成一個「袋子」,裡面裝了哪些詞。
模型只記錄每個詞是否出現,或出現幾次,完全不考慮詞的順序。
例如:
- 句子 A:我 愛 你
- 句子 B:你 愛 我
在詞袋法眼中,這兩句可能一模一樣,因為它們都包含「我、愛、你」三個詞,只是順序不同。
這種方法簡單,但缺點非常明顯:
- 忽略詞序
- 向量非常稀疏
- 無法理解語意相似性
- 詞彙表一大,維度就爆炸
2. TF-IDF
接下來出現了 TF-IDF(Term Frequency-Inverse Document Frequency)。
它不只統計詞在單篇文件中出現的頻率,還加入「這個詞有多稀有」的權重。
常見公式可以寫成:
其中:
- :詞 在文件 中出現的頻率
- :文件總數
- :包含詞 的文件數量
這樣一來,像「的」、「是」、「在」這類高頻但沒什麼辨識度的停用詞,權重會降低;而「量子」、「通膨」、「演算法」這種具有代表性的詞,權重會提高。
TF-IDF 比詞袋法更能抓到關鍵詞,但它仍然有一個根本限制:它只知道詞出現得多不多,卻不知道詞與詞之間的語意關係。
三、第二階段:神經網路與語意嵌入
Word2Vec:讓詞走進語意空間
Word2Vec 是文字向量化的重要突破。
它透過淺層神經網路,把詞彙映射到一個稠密、低維的向量空間中。在這個空間裡,語意相近的詞會靠得比較近。
最經典的例子是:
這代表模型學到的不只是「國王」和「皇后」經常一起出現,而是捕捉到了某種性別與身份的語意關係。
Word2Vec 常見訓練方式有兩種:
- CBOW:用上下文預測中心詞
- Skip-gram:用中心詞預測上下文
它成功解決了過去統計方法「詞彙孤立」的問題,讓機器開始能計算詞與詞之間的語意距離。
但 Word2Vec 還是不夠
Word2Vec 產生的是一種靜態詞向量。也就是說,同一個詞永遠對應同一個向量。
例如「蘋果」不管出現在:
- 我喜歡吃蘋果
- 我買了蘋果手機
在 Word2Vec 裡,它的向量都一樣。
這顯然無法處理一詞多義,也無法真正根據上下文動態調整語意。
四、第三階段:動態上下文與深度學習
後來的模型開始採用 Transformer 架構,並搭配大規模預訓練,實現了能根據上下文動態調整的嵌入表示,例如 BERT、GPT 系列模型。
這類模型和 Word2Vec 最大的差別在於:
- Word2Vec:一個詞只有一個固定向量
- Transformer:同一個詞會因為上下文不同,得到不同的向量
換句話說,「蘋果」在「吃蘋果」和「蘋果手機」中,會變成兩個不同的向量。
模型不再只是記住詞的表面,而是能根據整句話的語境,動態理解詞的意義。
這種從「靜態詞向量」到「動態上下文嵌入」的轉變,是現代大語言模型能夠理解複雜語言的關鍵之一。
五、Token:文字進入模型前的最小單位
在文字變成向量之前,還有一個重要步驟:Tokenization(分詞)。
模型並不是直接處理「一個詞」或「一個字」,而是處理 Token。
Token 可以是:
- 一個完整的詞,例如
apple - 一個子詞,例如
Ap+ple - 一個標點符號
- 甚至一個單獨的字元
為什麼要用子詞?
因為如果完全以「詞」為單位,詞彙表會爆炸,而且遇到沒看過的新詞就無法處理。
子詞切分可以在「詞彙表大小」與「未知詞處理」之間取得平衡。
常見的分詞方法包括:
- BPE(Byte Pair Encoding)
- WordPiece
- SentencePiece
分詞完成後,每個 Token 會得到一個整數 ID。
但整數 ID 本身沒有語意,所以還要進一步轉成向量。
流程大致如下:
原始文字:我喜歡蘋果
↓
分詞:我、喜歡、蘋、果 或類似切分
↓
Token ID:例如 [102, 345, 678, 910]
↓
One-Hot 編碼:每個 ID 變成一個只有對應位置為 1 的稀疏向量
↓
乘上嵌入矩陣:得到稠密的詞元向量
這個過程本質上像是「查表」,但在實作中是以可導的矩陣相乘完成,因此可以透過反向傳播持續優化。
六、位置:順序不能消失
有了詞元向量之後,還不夠。
因為 Transformer 內部的自注意力機制本身不具備順序概念,如果只給它詞向量,它會像一個沒有時間感的閱讀者,分不清「我愛你」和「你愛我」。
所以我們還需要加入位置向量(Positional Embedding)。
最終輸入通常由兩部分組成:
位置編碼主要有兩種做法:
1. 透過模型訓練學習(Learned Positional Encoding)
把每個位置視為可訓練參數,讓模型自己學出位置向量。
這種方法直觀,但缺點是無法處理超過訓練時最大長度的序列。
2. 透過數學公式計算(Fixed Positional Encoding)
最著名的是原始 Transformer 使用的正弦與餘弦波編碼:
這種方法不需要訓練參數,也具備一定外推能力,能讓模型捕捉不同尺度的位置關係。
絕對位置與相對位置
- 絕對位置:告訴模型這是第幾個詞。
- 相對位置:告訴模型兩個詞之間相隔多遠。
許多研究發現,語法與語意結構更依賴相對距離。
近年來流行的 RoPE(旋轉位置編碼),就是結合絕對位置與相對位置優點的設計,廣泛應用於 LLaMA 等現代大模型中。
七、可導性:向量不是查表,而是被學出來的
很多人以為詞嵌入只是「查表」,但真正的關鍵在於:這張表不是人工寫死的,而是可訓練的。
當模型預測錯誤時,損失函數會透過反向傳播,把誤差訊號一路傳回嵌入矩陣,持續調整每個 Token 的向量數值。
因此,經過大量訓練後,語意相近的詞會逐漸靠近,語意不同的詞會逐漸分開。
這也是為什麼嵌入層雖然看似簡單,卻是整個大語言模型理解語言的入口。
八、總結:從離散文字到連續語意
文字向量化的演進,可以濃縮成這條路線:
- 詞袋法:只看詞有沒有出現
- TF-IDF:加入詞的稀有性與代表性
- Word2Vec:用稠密向量捕捉語意關係
- Transformer:根據上下文動態生成嵌入
- Token + Embedding + Position:成為現代 LLM 的標準輸入形式
這條路的本質,是從「字面統計」走向「語意理解」,從「靜態表徵」走向「動態上下文」。
當文字被轉成向量之後,模型才能真正開始計算、比較、關注與生成。
而下一步,就是讓模型知道:在這麼多向量之中,它應該「關注」哪些詞。
那就是下一篇要談的主角:注意力機制(Attention Mechanism)。
下一篇預告
《注意力機制入門:QKV、Mask 與縮放點積》
我們會解釋 Query、Key、Value 如何運作,為什麼需要 Mask,以及為什麼要除以 。