[自然語言處理](https://app.notion.com/p/3e6fc631b03081b4a9e8f91f3411f61f) › [W3(9/24)](https://app.notion.com/p/3e6fc631b03081ff9776f36fab3e6e50) › 04|影片 [1:28:24–1:46:39](https://www.youtube.com/watch?v=g0QE6O17BWE&t=5304s)|投影片 W1_NLP_brief_v2 p.91–95|上一章 [03 word2vec 的訓練方式(1:02–1:28)](https://app.notion.com/p/3e6fc631b03081f1b4bfe71efbd2cd7a)|下一章 [05 作業一說明(1:46–2:02)](https://app.notion.com/p/3e6fc631b03081e59d87d1d5fa01e936)
## 重點
- word2vec 之後有兩個延伸:GloVe 用「整個語料的共現次數」來學(global,全域);FastText 把字拆成字母片段來學,所以能替沒看過的字(OOV)拼出向量。
- 該用哪一種向量?投影片答「It depends」(看情況):在自己的任務上實際試,並用 WordSim353 這類人工評分資料來評估。
- 老師強調 BM25(關鍵字比對)到現在仍是很強的搜尋基準。向量搜尋有三個盲點:整句向量會把關鍵字沖淡、相似不等於相關、怕打錯字。
## Exam-ready
- **GloVe**: "word2vec is excellent at learning similarity and linear regularities" / "But it doesn’t make full use of co-occurrence statistics" / "GloVe improves word2vec by considering global statistical information"(W1_NLP_brief p.91)
- 中文:word2vec 很會學「字跟字像不像」和線性規律(linear regularities,例如 king − man + woman ≈ queen),但沒有充分用到共現統計(兩個字一起出現幾次);GloVe 加入整個語料的全域統計來改良。白話:word2vec 看局部,GloVe 看全局。
- **FastText**: "Considers character-level features, and can thus take a guess and generate vectors for out-of-vocabulary words, taking advantage of patterns in morphology" / "For Chinese:CW2Vec, Stroke-rich FastText"(W1_NLP_brief p.92)
- 中文:FastText 看字元層級(character-level,字母片段)的特徵,所以能替字典外的字(OOV)猜出向量,靠的是構詞規則(morphology,字首、字尾)。中文版有 CW2Vec、Stroke-rich FastText(用筆畫)。
- **Which vectors**: "What Vectors Should I Use? --It depends." / "A good idea is to try different vectors on specific tasks."(W1_NLP_brief p.93)
- 中文:該用哪種向量?看情況。最好的做法是在你的具體任務上試不同的向量。
- **Train your own**: "Training your own with word2vec may be indicated when you have many “out-of-vocabulary” words" / "This can happen in special areas - for example when dealing with classical Chinese text."(W1_NLP_brief p.93)
- 中文:很多字是字典外的字(沒有現成的預訓練向量)時,適合用 word2vec 自己訓練。這常發生在特殊領域,例如文言文(classical Chinese)。
- **Evaluation**: "Evaluation: Example dataset: WordSim353"(W1_NLP_brief p.93)
- 中文:評估詞向量的範例資料集是 WordSim353:人工替 353 組字對打相似度分數,拿來跟向量的判斷比。
- **BM25**: "BM25 is a strong baseline for search"(W1_NLP_brief p.94)【老師強調】(1:34:36)
- 中文:BM25 是搜尋的強基準(baseline,拿來比較的標準)。白話:新的向量搜尋要先贏過這個老方法才算數。
- **MTEB**: "MTEB (Massive Text Embedding Benchmark, ...)"(W1_NLP_brief p.94)
- 中文:MTEB(大規模文字嵌入評測)是比較各家 embedding 的標準考卷和排行榜。
- **Static vs. contextual**: "contextual embeddings (e.g., BERT), vs. static embeddings (e.g., Word2Vec, GloVe)." / "768 dimensions vs. 1536 dimensions"(W1_NLP_brief p.94)
- 中文:上下文向量(contextual,如 BERT)依句子給同一個字不同向量;靜態向量(static,如 Word2Vec、GloVe)一個字永遠一個向量。維度也要取捨:768 維還是 1536 維。
- **Similar ≠ relevant**: "Similar does not necessarily mean relevant." / "“How to fix a faucet” and “Where to buy a kitchen faucet”"(W1_NLP_brief p.94)
- 中文:相似不一定相關。「怎麼修水龍頭(faucet)」和「哪裡買廚房水龍頭」用字很像,意圖卻完全不同。
- **Search**: "keyword-based search vs. vector-based search" / "Vector search is not robust to typos" / "Out-of-domain is not the same as out-of-vocabulary"(W1_NLP_brief p.94)
- 中文:關鍵字搜尋 vs. 向量搜尋;向量搜尋遇到打錯字不穩(not robust);領域外(OOD)不等於字典外(OOV)。
## [1:28:24](https://www.youtube.com/watch?v=g0QE6O17BWE&t=5304s) GloVe:從局部到全域統計
word2vec 每次只看小視窗(context window)裡的一對字,是 local(局部)的:很會學相似,卻沒把整個語料的共現統計用完。GloVe(Global Vectors,2014,Stanford)先把整個語料「誰跟誰一起出現幾次」數成一張共現表,再用這張表訓練向量:一起出現越多次,兩個向量越對齊。可以把它想成 LSA(整張共現表)加 word2vec(用訓練學向量)的合體。老師只點到為止,說論文值得自己讀。
要先知道兩個舊概念:word2vec(第 3 週 [03 章](https://app.notion.com/p/3e6fc631b03081f1b4bfe71efbd2cd7a)學過:拿一個字去猜它周圍的字,猜久了就學出每個字的向量,也就是一排代表字義的數字);LSA(第 3 週 [02 章](https://app.notion.com/p/3e6fc631b030815a90adc80645bf2668)學過:先數「字跟字一起出現幾次」做成一張大表,再壓縮成短向量)。共現(co-occurrence)就是兩個字出現在同一個小視窗裡,例如「咖啡」和「杯子」常常一起出現。
生活比喻:word2vec 像每天聽一小段對話來認識同學;GloVe 像先把整年的聊天紀錄統計好「誰常跟誰一起出現」,再看全貌。
用文字說步驟:1. 掃過整個語料,數每兩個字在同一視窗出現幾次,得到共現表。2. 替每個字設一個向量。3. 調整向量,讓兩個字的向量相乘(內積)接近它們共現次數取 log。4. 常見字(the、of)的權重設上限,免得霸佔訓練。
步驟裡的兩個數學詞:內積(dot product)是把兩個向量同一格的數字相乘、再全部加起來,數字越大代表兩個向量方向越一致、意思越像。取 log 是把大數字壓小(以 10 為底時,10 變 1、100 變 2、1000 變 3),免得出現幾百萬次的字跟罕見字差距大到沒法比。
下面這張圖比較兩種方法怎麼「讀」同一份語料:
```mermaid
flowchart LR
A["同一份語料"] --> B["word2vec:滑動小視窗"]
B --> C["一次看一對字,邊看邊更新"]
A --> D["GloVe:先數完整個語料"]
D --> E["共現次數表"]
E --> F["用全體統計訓練向量"]
```
上面那條是局部、一口一口吃;下面那條先把全局數清楚再學,這就是名字裡 Global 的意思。
考試可能怎麼問:What limitation of word2vec does GloVe address?(GloVe 補了 word2vec 哪個缺點?)
**注意:老師口頭先說 GloVe 是 2013 年,接著改口 2014 年;投影片寫 2014(word2vec 才是 2013)。**
下面摺疊的公式在做什麼(白話):把步驟 3、4 寫成一條算式,量「向量算出來的分數」跟「真實共現次數」差多少;差越小,代表向量越忠實地記住整個語料裡「誰常跟誰一起出現」。
它到底怎麼運作?(進階,可跳過)
論文的目標函數(我補充,投影片沒有):J = Σ f(Xᵢⱼ) · (wᵢ · w̃ⱼ + bᵢ + b̃ⱼ − log Xᵢⱼ)²。Xᵢⱼ 是共現次數;每一格算「內積 − log 次數」的平方,加總越小越好,f 是步驟 4 的權重。
一個例子(GloVe 論文,60 億字語料),比值 P(k | ice) ÷ P(k | steam):solid(固體)8.9,跟 ice 有關;gas(氣體)0.085,跟 steam 有關;water 1.36、fashion 0.96 接近 1。看比值就分得出意思,GloVe 把這種全域統計塞進向量。
老師原話是什麼?
「你看到這個 Global 這個字你就知道,原來 word2vec 的是 Local,它是 Global」(1:28:57)
## [1:29:49](https://www.youtube.com/watch?v=g0QE6O17BWE&t=5389s) FastText:拆成字元片段
word2vec 和 GloVe 都把一個字當成不能拆的整體,語料沒出現過的字(out-of-vocabulary,OOV,字典外的字)就沒有向量。FastText 改從字元層級(character-level)學:一個字切成好幾個字母片段(character n-gram),每個片段有向量,整個字的向量=片段向量加起來。所以沒看過的字,也能用看過的片段拼出來,醫學這種靠字首、字尾拼成的字特別有用(利用 morphology,構詞規則)。老師說它是今天 tokenizer(把文字切成小單位的工具)的雛形,作業一也會碰到 OOV。
生活比喻:像看到沒學過的病名 colitis,雖然不認識,但認得字尾 -itis 是「發炎」,就猜得到是某種發炎。
用文字說步驟:1. 字前後加邊界記號。2. 用長度 3 到 6 個字母的窗口滑過去,切出片段。3. 每個片段學一個向量。4. 片段向量相加=字向量;沒看過的字也照切照加。
下面這張圖是 FastText 遇到沒看過的字時,怎麼一步步猜出意思:
```mermaid
flowchart LR
A["沒看過的字 colitis"] --> B["切成片段:col、oli、iti、tis…"]
B --> C["iti、tis 在 hepatitis、arthritis 看過"]
C --> D["片段向量相加"]
D --> E["猜出:某種發炎"]
```
關鍵在第三格:片段是「舊的」,所以新字也有線索;word2vec 遇到同一個字只能給 unknown。
unknown 是字典裡的一個特殊記號:所有沒看過的字都被換成它、共用同一個向量,所以模型分不出它們誰是誰。
中文怎麼辦?英文能拆字首(in-、pre-)和字尾(-ly);中文很難再拆,多半改用較大的 n-gram。投影片列了 CW2Vec、Stroke-rich FastText,把字拆成筆畫,讓「林」「森」這種長得像的字共用資訊;老師說這塊學問很大。
考試可能怎麼問:How can FastText generate a vector for an out-of-vocabulary word?(FastText 怎麼替沒看過的字產生向量?)
下面摺疊在做什麼(白話):拿 where 和 colitis 實際切一次,讓你看到片段長什麼樣,以及沒看過的字為什麼也找得到看過的片段。
它到底怎麼運作?(進階,可跳過)
FastText 論文的例子,n = 3:where 加邊界成 ⟨where⟩,切成 ⟨wh、whe、her、ere、re⟩,再加上整個字 ⟨where⟩。
colitis 用 n = 3 到 6 切,共 22 個片段;其中 6 個在 hepatitis、gastritis、arthritis 看過(iti、tis、is⟩、itis、tis⟩、itis⟩),全都來自字尾 -itis。
老師原話是什麼?
「因為他有現在的Tokenizer的前型」(1:29:59)
「他可以靠著雖然也沒看過這個字,但他可以拼湊啊」(1:31:42)
## [1:32:08](https://www.youtube.com/watch?v=g0QE6O17BWE&t=5528s) 該用哪一種向量、怎麼評估
投影片的答案是「It depends」:GloVe 用的人最多、效果好;FastText 比較新、採用得慢,但也有好結果;領域裡很多字沒有現成向量(例如文言文)時,就用 word2vec 拿自己的語料訓練。老師補充,LLM 出來之前大家常這樣重訓或微調,把 OOV 降低。好壞怎麼評?用 WordSim353:人工替 353 組字打相似度分數(0–10);它很小、很舊,但還能用。
生活比喻:選向量像選鞋,沒有一雙適合所有場合,要在自己的路上(任務)穿著跑跑看。
用文字說評估步驟:1. 用你的向量算每組字的相似度。2. 按相似度排名次。3. 跟人工分數的名次比,越一致越好。
下表比較三種向量:
| 模型 | 從哪裡學 | 最小單位 | 沒看過的字 | 什麼時候用 |
| **word2vec**(2013) | 局部:視窗裡的字對 | 整個字 | 沒有向量 | OOV 很多,拿自己的語料訓練 |
| **GloVe**(2014) | 全域:整個語料的共現表 | 整個字 | 沒有向量 | 通用,用的人最多 |
| **FastText** | 視窗,但字拆成片段 | 字元 n-gram | 用片段拼出來 | 新字、拼湊字多 |
考試可能怎麼問:Which word vectors should you use, and how would you evaluate them?(該用哪種向量、怎麼評估?)→ 答:It depends;在任務上試不同向量;用 WordSim353 比對人工評分。
**注意:老師口頭說「當然一般來講我們會覺得GloVe比word2vec好」(1:32:25),投影片 p.93 寫的是「It depends」,以投影片為準:看任務,實際試不同向量。**
下面摺疊在做什麼(白話):用投影片上五組字實際算一次「向量排的名次跟人排的名次有多一致」。算出來的數字叫 Spearman 等級相關,越接近 1,代表這組向量判斷「兩個字像不像」的方式越接近人。
它到底怎麼運作?(進階,可跳過)
投影片上的幾列(人給的分數):car–automobile 8.6、cell–phone 6.06、century–year 4.73、car–flight 2.66、century–nation 1.65。
1. 用 cosine similarity(只看兩個向量方向像不像,−1 到 1)算每組,假設得到 0.78、0.52、0.61、0.30、0.25。
2. 排名次。人:1、2、3、4、5;模型:1、3、2、4、5。
3. Spearman 等級相關:名次差 d = 0、−1、1、0、0,ρ = 1 − 6Σd² ÷ (n(n² − 1)) = 1 − 12 ÷ 120 = 0.9。越接近 1 越像人的判斷(比名次,因為兩邊分數尺度不同)。
## [1:33:42](https://www.youtube.com/watch?v=g0QE6O17BWE&t=5622s) BM25 仍是強基準
投影片 p.94 整理一篇文章:作者在向量資料庫公司 Weaviate 工作兩年的 37 條心得。向量資料庫(vector database)先把大量文件轉成向量存起來,再用向量找相似文件;LLM 流行後很多公司要做 RAG,就需要它。老師說第一句對大家最重要:BM25 到現在還是很強的搜尋 baseline(比較基準)。它只用稀疏向量(sparse vector)比對關鍵字,但每個字有權重,效果就出來了。【老師強調】(1:34:36)
兩個前幾週的概念:BM25(第 2 週 [07 章](https://app.notion.com/p/3e6fc631b030819ca51ee21869f5c86d)學過:改良版的 TF-IDF,替「文件跟查詢有多相關」打分數);稀疏向量(第 2 週 [06 章](https://app.notion.com/p/3e6fc631b0308121891cc1705fe5be4a)學過:字典有幾個字就有幾格,一篇文章只用到少數字,所以幾乎全是 0)。RAG 是「先搜尋資料、再交給 LLM 回答」的做法,本章最後一段的摺疊有說明。
生活比喻:BM25 像翻書後面的索引找關鍵字,找得準,但換個說法就找不到;向量搜尋像問懂行的店員,聽得懂你的意思,卻可能拿錯型號。
用文字說 BM25 的三個直覺:1. 查詢字在文件出現越多次越相關,但會飽和。2. 越少文件有的字越有鑑別力,「的」「課」這種到處都有的字幾乎不加分。3. 長文件本來就容易出現各種字,要扣回來。
下表對照兩種搜尋,重點看最後一列的弱點:
| keyword-based search(例:BM25) | vector-based search(dense embedding) |
| 向量長相 | 稀疏:維度=字典大小,大部分是 0 | 稠密:幾百到上千維,每格都有值 |
| 比對什麼 | 字面關鍵字,罕見字權重高 | 整體意思 |
| 擅長 | 明確的關鍵字、專有名詞、型號 | 換句話說、同義詞(car 和 automobile) |
| 弱點 | 字面不同就找不到 | 關鍵字被沖淡、相似不等於相關、怕打錯字 |
考試可能怎麼問:Why is BM25 still a strong baseline even though dense embeddings exist?(有了向量搜尋,為什麼 BM25 還是強基準?)
**注意:老師在 2:49:09 說考試不太會叫你算 BM25;要記的是它為什麼強、什麼時候比向量搜尋好。**
別人怎麼教這個?
- [投影片引用的原文(Leonie Monigatti)](https://www.leoniemonigatti.com/blog/what_i_learned.html):p.94 每一行都出自這 37 條心得。
老師原話是什麼?
「其實第一句話對你們蠻重要的,BM25是一個還是一個很strong的Base Line」(1:34:36)
## [1:35:00](https://www.youtube.com/watch?v=g0QE6O17BWE&t=5700s) 為什麼句子向量會糊掉
既然 BM25 這麼強,為什麼還要學 dense vector?因為詞向量和之後的句子、文件向量(sentence/document embedding,把整句壓成一個向量)確實比較能抓住整句的意思。問題是整句只有一個向量:你要找的其實是某個關鍵字時,它會被其他字的意思沖淡,老師稱為「糊掉」。句子越長、概念越多,維度卻不變,所有句子越擠在一起、越難區分。拿 BERT 或 LLM 當 encoder 也有這個問題,所以老師說不是什麼都丟給 LLM 就能解決。
embedding(嵌入)就是「用一排數字代表一段文字」:詞向量是一個字的 embedding,句子向量是一整句的 embedding。dense vector(稠密向量)是每一格都有值的短向量,跟 BM25 那種幾乎全是 0 的稀疏向量相反。encoder 是什麼,見本章最後的「補充」段。
生活比喻:像把顏料倒進杯子攪勻,兩三種還看得出偏紅偏藍,倒進二十種就每杯都是灰褐色。老師的例子:叫 AI 用一句話摘要每週上課影片,搞不好 16 週都是「老師在教 NLP」。
下面這張圖用老師的兩句話,看句子向量和 BM25 的差別:
```mermaid
flowchart LR
A["我 今天 去 上 NLP 課"] --> C["句子向量 A"]
B["我 今天 去 上 機器學習 課"] --> D["句子向量 B"]
C --> E["共同的字占多數:A、B 幾乎重疊"]
D --> E
A --> F["BM25 看關鍵字 NLP"]
F --> G["只有 A 有,一刀分開"]
```
六個字裡五個一樣,句子向量被共同的字主導;BM25 只看「NLP」這個罕見字。
考試可能怎麼問:Why can a sentence embedding miss an important keyword?(為什麼句子向量會漏掉重要的關鍵字?)→ 答:整句只有一個向量,關鍵字被其他字稀釋,句子越長越嚴重。
下面摺疊在做什麼(白話):用只有三個數字的小向量證明「糊掉」:兩句只差一個關鍵字,平均成句子向量後相似度還有 0.96(1 代表完全一樣);兩句再各加五個相同的字,就更分不開。
它到底怎麼運作?(進階,可跳過)
用最簡單的句子向量:字向量取平均。3 個維度代表「日常動作」「NLP」「機器學習」:我、今天、去、上 都是 (1, 0, 0);課 = (1, 0.2, 0.2);NLP = (0, 1, 0);機器學習 = (0, 0, 1)。兩個關鍵字完全不像,cos = 0。
句子 A 平均 = (0.83, 0.20, 0.03),句子 B = (0.83, 0.03, 0.20),cos(A, B) = 0.962。兩句都再加「早上 八點 跟 同學 一起」,cos 變 0.990,更分不開。
老師原話是什麼?
「他就會糊掉,所以通常我會講模糊就是這樣,因為他會跟其他字的概念混在一起」(1:36:49)
「搞不好你發現16周重點都一樣這樣子,老師在教NLP這樣子」(1:37:49)
「也不是everything都是拿LM就可以解決掉了」(1:38:29)
## [1:38:38](https://www.youtube.com/watch?v=g0QE6O17BWE&t=5918s) MTEB 排行榜
MTEB(Massive Text Embedding Benchmark,大規模文字嵌入評測)是很常被引用的 embedding benchmark(標準考卷):同一批任務、同一套分數,讓各家 embedding 模型公平比較。排行榜(leaderboard)可以依語言、任務、領域(例如程式碼)篩選,做了自己的 embedding 就上去比。它比 WordSim353 複雜得多:WordSim353 只測「兩個字像不像」,MTEB 測分類、分群、檢索、語意相似度等多種任務。原始論文也發現沒有哪個模型每一科都第一(我補充),又呼應 p.93 的「It depends」。
生活比喻:MTEB 像全國統一考試:同一份考卷、分科計分、公開放榜,想知道自己的模型幾斤幾兩就去考一次。
考試可能怎麼問:What is MTEB, and why is it better than WordSim353 for comparing embeddings?(MTEB 是什麼?為什麼比 WordSim353 更適合比較 embedding?)
別人怎麼教這個?
- [MTEB Leaderboard(Hugging Face)](https://huggingface.co/spaces/mteb/leaderboard):投影片上的連結,可以篩語言和任務,看哪個模型排前面。
## [1:40:45](https://www.youtube.com/watch?v=g0QE6O17BWE&t=6045s) 靜態與上下文向量、相似不等於相關
word2vec、GloVe 是 static embedding(靜態向量):一個字不管在哪一句都是同一個向量,老師說這樣太死。我們想要 contextual embedding(上下文向量):同一個字在不同句子有不同向量,之後的 BERT 就是這個概念。維度也要取捨:768 維還是 1536 維(word2vec 常用 300 維);維度越大能裝越多細節,但儲存量跟著翻倍。
維度就是向量裡有幾個數字:300 維=每個字用 300 個數字表示。數字越多,能記的細節越多,但也越佔空間。
生活比喻:static 像一個人不管去哪都穿同一套制服;contextual 像看場合換衣服,上班、爬山各一套。
下面這張圖用 bank(銀行/河岸)看兩種向量的差別:
```mermaid
flowchart LR
A["我去 bank 存錢"] --> S["static:同一個 bank 向量"]
B["我們坐在 bank 野餐"] --> S
A --> C["contextual:錢的 bank"]
B --> D["contextual:河岸的 bank"]
```
static 只好把兩種意思平均成「一半錢、一半河」;contextual 依前後文分開。
相似不等於相關:你家水龍頭漏水,搜「How to fix a faucet」,向量搜尋卻覺得「Where to buy a kitchen faucet」很像(都在講水龍頭);用字像、向量近,意圖卻不同。這是 p.74「有出現不見得是相關」的老問題,所以老師說 BM25 還是乖乖用一下。
(第 3 週 [02 章](https://app.notion.com/p/3e6fc631b030815a90adc80645bf2668)學過:一個字有很多意思,所以兩段文字有同一個字,不代表在講同一件事。)
怕打錯字:faucet 打成 fuacet,對 word2vec、GloVe 就是沒看過的字(OOV);FastText、BERT 會拆片段,可能好一些,但整個向量空間常常還是會跑掉。老師建議學完 BERT 後自己試:故意打錯一個字,看 CLS token(BERT 代表整句的位置)變多少。
考試可能怎麼問:Explain "Similar does not necessarily mean relevant" with an example.(用例子解釋「相似不一定相關」。)
**注意:老師口頭說「我該用768維度還是1000多維度」(1:41:16),投影片寫的是 768 dimensions vs. 1536 dimensions,以投影片為準。**
下面摺疊在做什麼(白話):算儲存空間。維度加倍,存同樣多文件需要的硬碟空間也加倍,所以維度不是越大越好。
維度越大越好嗎?(進階,可跳過)
每一維存 4 bytes(32 位元浮點數),存 100 萬篇文件:768 維是 1,000,000 × 768 × 4 = 3.07 GB,1536 維是 6.14 GB。選 1536 前先想值不值得。768 是 BERT-base 的維度,老師說這跟後面 Transformer 的維度有關。
老師原話是什麼?
「有時候你覺得相似的,相似他其實不見得是相關」(1:41:41)
「BM25還是乖乖的用一下這樣子」(1:42:32)
「對打錯字是非常不robust,他非常sensitive」(1:42:43)
## [1:43:49](https://www.youtube.com/watch?v=g0QE6O17BWE&t=6229s) OOV 與 OOD、RAG 與總結
投影片說 out-of-domain(OOD,領域外)不等於 out-of-vocabulary(OOV,字典外):OOV 是字典沒有這個字,OOD 是字認得但沒看過這個領域。老師補充,兩者技術上的症狀很像,因為都是訓練時沒看過的東西。最後老師說做 RAG 一定逃不掉 IR(資訊檢索);傳統 NLP 這段只留下「怎麼學字的表示」(p.95 總結:從基本字詞理解、結構分析到 word vector),W2 投影片從這裡接下去。
生活比喻:OOV 像查字典查不到這個字;OOD 像字查得到,但換了行業意思就變了。
下表是 OOV 和 OOD 的對照:
| OOV(out-of-vocabulary) | OOD(out-of-domain) |
| 是什麼 | 字典裡沒有這個字 | 字有,但沒看過這個領域的用法 |
| 例子 | 新創字、罕見醫學字、打錯的字 | virus 在醫學是病毒、在資安是電腦病毒;cell 在生物是細胞、在通訊是手機 |
| 模型怎麼表現 | 變成 unknown 標記,大家同一個向量 | 有向量,但意思偏掉(shift、bias) |
考試可能怎麼問:Distinguish out-of-vocabulary from out-of-domain.(區分 OOV 和 OOD。)
要先懂什麼?(IR 和 RAG)
- IR(information retrieval,資訊檢索):從大量文件找出跟問題最相關的幾篇,BM25、向量搜尋都是 IR 方法。投影片最後一句:「Information retrieval is so hot right now!」
- RAG(retrieval-augmented generation,檢索增強生成):先用 IR 找出相關文件,再連同問題交給 LLM 回答,適合公司內部、需要授權這類模型沒學過的資料。
- 模型沒辦法重新學你的語料,只能靠檢索找出資料餵給它,所以逃不掉 IR。老師也說 LLM 越來越強,RAG 不像一年前那麼非用不可,但特定領域還是會用。
老師原話是什麼?
「字典沒有的問題很大」(1:44:15)
「你要做RAG,一定要用IR,你這邊就逃不掉」(1:45:44)
「但是只留下一個很後面會用到的東西,我們要怎麼去學字的表示」(1:46:10)
## 補充:老師直接用、沒解釋的詞
FastText 那段提到 tokenizer,句子向量那段提到拿 LM 當 encoder、decoder。這兩組詞之後講 BERT、GPT 會一直用到。
subword、encoder、decoder 是什麼?
- subword(子詞):比完整的字小、比單一字母大的片段。unhappiness 可以切成 un、happi、ness。FastText 的字元片段是這個想法的前身;之後 BERT、GPT 的 tokenizer 都用子詞切字,所以沒看過的新字也能拆成看過的片段(我補充)。
- encoder(編碼器):把一段文字變成向量。老師說「拿LM來當Encode轉換成Sentence Embedding」(1:37:03),意思是不叫模型生成文字,只拿它算出的整句向量來比相似度,例如 RAG 的向量搜尋。
- decoder(解碼器):反方向,根據前文一個 token 一個 token 生成文字,GPT 就是這種。老師說句子越長、向量越糊,「就是現在用LM當Decoder的問題」(1:38:13),拿來當 encoder 也一樣。
所以對你的影響是:本章「句子向量會糊掉」不是某個模型的 bug,是「把一整句壓成一個固定長度向量」本身的限制。
## Self-check
Q1. What limitation of word2vec does GloVe address, and how?(中文:GloVe 補了 word2vec 哪個缺點?怎麼補?)
**Answer**: word2vec learns from local context windows, so it doesn’t make full use of co-occurrence statistics. GloVe builds a global co-occurrence matrix of the whole corpus and trains vectors whose dot product approximates the log co-occurrence count, i.e., it considers global statistical information.
中文:word2vec 只從局部的小視窗學,一次看一對字,沒有充分利用整個語料的共現統計。GloVe 先把整個語料數成一張共現表(每兩個字一起出現幾次),再訓練向量,讓兩個字向量的內積接近「共現次數取 log」。這就是投影片說的「考慮全域統計資訊」。
Q2. Explain how FastText can generate a vector for an out-of-vocabulary word. Give an example.(中文:FastText 怎麼替字典外的字產生向量?舉例說明。)
**Answer**: FastText considers character-level features: a word is a bag of character n-grams (n = 3 to 6), and its vector is the sum of the n-gram vectors. For an unseen word like "colitis", n-grams such as "itis" were learned from "hepatitis" and "arthritis", so FastText can guess a meaningful vector using patterns in morphology.
中文:FastText 看字元層級:把一個字切成 3 到 6 個字母的片段,每個片段有向量,字向量是片段向量相加。遇到沒看過的 colitis,它的片段 itis 在 hepatitis、arthritis 學過(代表發炎),所以能拼出有意義的向量,這就是利用構詞規則。word2vec、GloVe 遇到同一個字只能給 unknown。
Q3. "BM25 is a strong baseline for search." Why can keyword search beat vector search? Name two weaknesses of vector search.(中文:為什麼關鍵字搜尋有時贏過向量搜尋?說出向量搜尋的兩個弱點。)
**Answer**: BM25 matches exact keywords in a sparse vector, giving rare but crucial keywords high weight. A dense sentence embedding squeezes the whole sentence into one vector, so the keyword is diluted, worse for longer text. Weaknesses: similar does not necessarily mean relevant ("How to fix a faucet" vs. "Where to buy a kitchen faucet"); vector search is not robust to typos.
中文:BM25 用稀疏向量比對字面關鍵字,罕見但關鍵的字權重高,所以關鍵字不會被沖淡。句子向量把整句壓成一個向量,關鍵字被其他共同的字稀釋,句子越長越嚴重。向量搜尋的兩個弱點:第一,相似不一定相關,修水龍頭和買水龍頭向量很近、意圖卻不同;第二,怕打錯字,錯一個字向量可能跑很遠。
Q4. Distinguish static from contextual embeddings, and out-of-vocabulary from out-of-domain.(中文:區分靜態與上下文向量,以及 OOV 與 OOD。)
**Answer**: Static embeddings (e.g., Word2Vec, GloVe) give each word one fixed vector; contextual embeddings (e.g., BERT) give the same word different vectors in different sentences ("bank" of a river vs. a bank account). OOV: the word is not in the vocabulary and becomes an unknown token. OOD: the words may be known, but the domain is new, so their meanings shift.
中文:靜態向量(Word2Vec、GloVe)一個字只有一個固定向量;上下文向量(BERT)依句子給同一個字不同向量,例如河岸的 bank 和銀行的 bank 會分開。OOV 是字典裡沒有這個字,只能變成 unknown 標記;OOD 是字認得,但領域沒看過,意思會偏掉。
讀完了嗎?下一章:[05 作業一說明(1:46–2:02)](https://app.notion.com/p/3e6fc631b03081e59d87d1d5fa01e936)|回到週頁:[W3(9/24)](https://app.notion.com/p/3e6fc631b03081ff9776f36fab3e6e50)