從文字到向量:NLP 向量化與 Token 的演進

從 Bag-of-Words 一路談到 Transformer,理解「文字向量化」這條關鍵演化之路。

從文字到向量:NLP 向量化與 Token 的演進

這篇是「LLM 核心原理」系列的第一篇。

在這個系列裡,我們從最基礎的問題開始:文字是怎麼變成模型可以計算的東西?
再走到注意力機制、Transformer 架構,最後理解大語言模型如何生成回應。

這條路上有幾個關鍵節點:詞嵌入、位置編碼、注意力、多頭注意力、前饋神經網路、自回歸生成。
但在拆解這些節點之前,我們需要先回答一個更根本的問題:

為什麼文字不能直接丟給模型?

一、為什麼文字不能直接丟給模型?

電腦擅長的是數字運算,不是文字本身。

對模型來說,「蘋果」這兩個字沒有直接意義,它必須先被轉換成一個或多個數值向量,才能進行數學運算。

但這裡有個核心難題:

  • 文字是離散符號:每個詞看起來彼此獨立。
  • 語言是有順序的:「我愛你」和「你愛我」順序相反,意思卻完全不同。
  • 語意是依賴上下文的:「蘋果」在「我喜歡吃蘋果」和「我買了蘋果手機」中,指的不是同一件事。

因此,文字向量化的目標不只是「把字變成數字」,而是要把語意、順序與上下文盡可能保留下來。

這條演化路線,大致可以分成三個階段:

  1. 基於統計的表示法:詞袋法、TF-IDF
  2. 神經網路與語意嵌入:Word2Vec
  3. 動態上下文與深度學習:Transformer、BERT、GPT

接下來,我們先從第一階段開始。

二、第一階段:基於統計的表示法

1. 詞袋法(Bag-of-Words, BoW)

最早的作法很直覺:把一段文字看成一個「袋子」,裡面裝了哪些詞。

模型只記錄每個詞是否出現,或出現幾次,完全不考慮詞的順序。

例如:

  • 句子 A:我 愛 你
  • 句子 B:你 愛 我

在詞袋法眼中,這兩句可能一模一樣,因為它們都包含「我、愛、你」三個詞,只是順序不同。

這種方法簡單,但缺點非常明顯:

  • 忽略詞序
  • 向量非常稀疏
  • 無法理解語意相似性
  • 詞彙表一大,維度就爆炸

2. TF-IDF

接下來出現了 TF-IDF(Term Frequency-Inverse Document Frequency)。

它不只統計詞在單篇文件中出現的頻率,還加入「這個詞有多稀有」的權重。

常見公式可以寫成:

wt,d=tft,d×log⁡Ndftw_{t,d} = tf_{t,d} \times \log \frac{N}{df_t}

其中:

  • tft,dtf_{t,d}:詞 tt 在文件 dd 中出現的頻率
  • NN:文件總數
  • dftdf_t:包含詞 tt 的文件數量

這樣一來,像「的」、「是」、「在」這類高頻但沒什麼辨識度的停用詞,權重會降低;而「量子」、「通膨」、「演算法」這種具有代表性的詞,權重會提高。

TF-IDF 比詞袋法更能抓到關鍵詞,但它仍然有一個根本限制:

它只知道詞出現得多不多,卻不知道詞與詞之間的語意關係。

三、第二階段:從統計走向語意(簡介)

統計方法解決了「把文字變成數字」的問題,但沒有解決「語意」的問題。

後來的 Word2Vec 帶來了關鍵突破:它把詞彙映射到一個稠密、低維的向量空間中。
在這個空間裡,語意相近的詞會靠得比較近。

最經典的例子是:

國王−男人+女人≈皇后\text{國王} - \text{男人} + \text{女人} \approx \text{皇后}

這代表模型學到的不只是共現統計,而是某種語意結構。

不過,Word2Vec 有一個根本限制:它產生的詞向量是靜態的,同一個詞永遠對應同一個向量。
這無法處理「一詞多義」,也無法根據上下文動態調整語意。

這些細節,我們會留到下一篇深入拆解。

四、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 的稀疏向量
   ↓
乘上嵌入矩陣:得到稠密的詞元向量

這個過程本質上像是「查表」,但在實作中是以可導的矩陣相乘完成,因此可以透過反向傳播持續優化。

至於嵌入矩陣怎麼運作、為什麼能捕捉語意,我們會在下一篇詳細解釋。

五、下一步:語意與順序

到這裡,我們已經把文字變成了 Token,也知道 Token 會進一步轉成向量。

但還有兩個關鍵問題沒回答:

  1. 語意:模型怎麼知道「蘋果」和「香蕉」比較近?
  2. 順序:模型怎麼知道「我愛你」不等於「你愛我」?

這兩個問題,分別對應到兩個關鍵技術:

  • 詞嵌入(Word Embedding)
  • 位置編碼(Positional Encoding)

下一篇,我們就會把這兩個部分補齊。

六、總結:從離散文字到連續向量的第一步

這一篇我們走了文字向量化的前半段路:

  • 詞袋法:只看詞有沒有出現
  • TF-IDF:加入詞的稀有性與代表性
  • Tokenization:把文字切成模型能處理的最小單位
  • Token ID → One-Hot → 嵌入矩陣:文字進入模型前的標準流程

這條路的本質,是從「字面統計」走向「語意理解」的第一步。

而下一步,就是讓模型真正理解「詞的意思」與「詞的順序」。


下一篇預告

《詞嵌入與位置編碼:模型如何理解語意與順序》

我們會解釋:

  • 嵌入矩陣如何把 Token ID 變成稠密向量
  • Word2Vec 如何讓語意變成空間中的距離
  • 為什麼靜態詞向量不夠,需要動態上下文嵌入
  • 位置編碼如何讓模型理解詞序
  • 從絕對位置到相對位置(RoPE、ALiBi)的技術演進