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

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

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

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

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

但這裡有個核心難題:

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

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

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

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

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

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

例如:

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

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

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

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

2. TF-IDF

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

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

常見公式可以寫成:

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

其中:

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

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

TF-IDF 比詞袋法更能抓到關鍵詞,但它仍然有一個根本限制:它只知道詞出現得多不多,卻不知道詞與詞之間的語意關係。

三、第二階段:神經網路與語意嵌入

Word2Vec:讓詞走進語意空間

Word2Vec 是文字向量化的重要突破。

它透過淺層神經網路,把詞彙映射到一個稠密、低維的向量空間中。在這個空間裡,語意相近的詞會靠得比較近。

最經典的例子是:

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

這代表模型學到的不只是「國王」和「皇后」經常一起出現,而是捕捉到了某種性別與身份的語意關係

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)

最終輸入通常由兩部分組成:

輸入表徵=詞元向量+位置向量\text{輸入表徵} = \text{詞元向量} + \text{位置向量}

位置編碼主要有兩種做法:

1. 透過模型訓練學習(Learned Positional Encoding)

把每個位置視為可訓練參數,讓模型自己學出位置向量。

這種方法直觀,但缺點是無法處理超過訓練時最大長度的序列

2. 透過數學公式計算(Fixed Positional Encoding)

最著名的是原始 Transformer 使用的正弦與餘弦波編碼:

PE(pos,2i)=sin(pos100002i/d)PE_{(pos, 2i)} = \sin\left(\frac{pos}{10000^{2i/d}}\right) PE(pos,2i+1)=cos(pos100002i/d)PE_{(pos, 2i+1)} = \cos\left(\frac{pos}{10000^{2i/d}}\right)

這種方法不需要訓練參數,也具備一定外推能力,能讓模型捕捉不同尺度的位置關係。

絕對位置與相對位置

  • 絕對位置:告訴模型這是第幾個詞。
  • 相對位置:告訴模型兩個詞之間相隔多遠。

許多研究發現,語法與語意結構更依賴相對距離

近年來流行的 RoPE(旋轉位置編碼),就是結合絕對位置與相對位置優點的設計,廣泛應用於 LLaMA 等現代大模型中。

七、可導性:向量不是查表,而是被學出來的

很多人以為詞嵌入只是「查表」,但真正的關鍵在於:這張表不是人工寫死的,而是可訓練的。

當模型預測錯誤時,損失函數會透過反向傳播,把誤差訊號一路傳回嵌入矩陣,持續調整每個 Token 的向量數值。

因此,經過大量訓練後,語意相近的詞會逐漸靠近,語意不同的詞會逐漸分開。

這也是為什麼嵌入層雖然看似簡單,卻是整個大語言模型理解語言的入口

八、總結:從離散文字到連續語意

文字向量化的演進,可以濃縮成這條路線:

  1. 詞袋法:只看詞有沒有出現
  2. TF-IDF:加入詞的稀有性與代表性
  3. Word2Vec:用稠密向量捕捉語意關係
  4. Transformer:根據上下文動態生成嵌入
  5. Token + Embedding + Position:成為現代 LLM 的標準輸入形式

這條路的本質,是從「字面統計」走向「語意理解」,從「靜態表徵」走向「動態上下文」。

當文字被轉成向量之後,模型才能真正開始計算、比較、關注與生成

而下一步,就是讓模型知道:在這麼多向量之中,它應該「關注」哪些詞。

那就是下一篇要談的主角:注意力機制(Attention Mechanism)


下一篇預告

《注意力機制入門:QKV、Mask 與縮放點積》

我們會解釋 Query、Key、Value 如何運作,為什麼需要 Mask,以及為什麼要除以 dk\sqrt{d_k}