[自然語言處理](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 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)
- **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)
- **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)
- **Evaluation**: "Evaluation: Example dataset: WordSim353"(W1_NLP_brief p.93)
- **BM25**: "BM25 is a strong baseline for search"(W1_NLP_brief p.94)【老師強調】(1:34:36)
- **MTEB**: "MTEB (Massive Text Embedding Benchmark, ...)"(W1_NLP_brief p.94)
- **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)
- **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)
- **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)
## [1:28:24](https://www.youtube.com/watch?v=g0QE6O17BWE&t=5304s) GloVe:從局部到全域統計
word2vec 每次只看小視窗(context window)裡的一對字,是 local(局部)的:很會學相似,卻沒把整個語料的共現統計用完。GloVe(Global Vectors,2014,Stanford 的 Pennington、Socher、Manning)先把整個語料數成一張共現表,再訓練向量,讓兩個字向量的內積逼近「它們一起出現次數的 log」。老師只點到為止,說論文值得自己讀。
**注意:老師口頭先說 GloVe 是 2013 年,接著改口 2014 年;投影片寫 2014,考試寫 2014(word2vec 才是 2013)。**
它到底怎麼運作?(用第 2 章 p.72 的小語料手算)
語料是「I like deep learning.」「I like NLP.」「I enjoy programming.」,視窗大小 1。
1. word2vec:一對一對餵。三句總共 14 組(中心字, 旁邊字),例如 (I, like)、(like, deep),看一組更新一次。
2. GloVe:先把 14 組整理成共現表 X(p.72 那張)。X(I, like) = 2,因為兩句都有「I like」;X(like, deep) = 1。
3. 訓練向量:讓「I · like」接近 log 2 ≈ 0.693,「like · deep」接近 log 1 = 0。一起出現越多次,兩個向量被拉得越對齊。
4. 表上是 0 的格子(例如 I 和 programming)不拿來訓練。
論文的目標函數(投影片沒有,知道概念就好):
J = Σ f(Xᵢⱼ) · (wᵢ · w̃ⱼ + bᵢ + b̃ⱼ − log Xᵢⱼ)²
白話:每一格算「預測值 − log 次數」的平方,全部加起來越小越好(加權最小平方法)。f 是權重:0 次的格子權重 0,次數很大的格子權重有上限,免得 the、of 這種高頻字霸佔訓練。
為什麼「整體統計」會帶出字的意思?
GloVe 官網用 60 億字的語料,算測試字 k 的比值 P(k | ice) ÷ P(k | steam):
- solid(固體):8.9,遠大於 1,跟 ice 有關。
- gas(氣體):0.085,遠小於 1,跟 steam 有關。
- water(水)1.36、fashion(時尚)0.96:接近 1,兩個都有關或都無關。
單看一個機率看不出來,看比值就清楚。GloVe 就是把這種整體統計塞進向量。
要先懂什麼?
- 共現矩陣(co-occurrence matrix):第 2 章 LSA 那張表,格子是兩個字在同一視窗出現幾次。
- log:把大數字壓小,log 1 = 0、log 100 ≈ 4.6。
- 內積(dot product):對應位置相乘再相加,方向越一致值越大。(1, 2) · (3, 1) = 5。
- 所以 GloVe 像兩家合體:LSA 的整張共現表+word2vec 的用訓練學向量。
老師原話是什麼?
「你看到這個 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)學:一個字拆成好幾個字元片段,每個片段有向量,整個字的向量=片段向量加總。所以沒看過的字也能用看過的片段拼出來,特別適合醫學這種字首、字尾拼成的字(利用 morphology,構詞規則)。老師說它是今天 tokenizer(把文字切成小單位的工具)的雛形。
它到底怎麼運作?(手拆一次)
以 n = 3 為例:字前後加邊界符號(論文用角括號,這裡寫成 ⟨ ⟩),再用長度 3 的窗口滑過去。
- where → ⟨wh、whe、her、ere、re⟩,再加上整個字 ⟨where⟩(FastText 論文的例子)。論文實際用 n = 3 到 6 全部的片段。
手算一個 OOV:模型看過 hepatitis(肝炎)、gastritis(胃炎)、arthritis(關節炎),沒看過 colitis(結腸炎)。
- colitis 的 3-gram:⟨co、col、oli、lit、iti、tis、is⟩。其中 iti、tis、is⟩ 另外三個字都有。
- n = 3 到 6 全算,colitis 有 22 個片段,6 個看過(iti、tis、is⟩、itis、tis⟩、itis⟩),全來自字尾 -itis。
- 所以 colitis 的向量帶到「-itis=發炎」的成分,模型猜得出它是某種發炎;word2vec 只能給 unknown。
中文也能這樣拆嗎?
英文能拆字首(in-、pre-)和字尾(-ly、-ness);中文一個字就是一個單位,很難再拆,所以多半用字組成的 n-gram(2 字、3 字片段)。投影片列了兩個中文專用方法:CW2Vec、Stroke-rich FastText,思路是把字拆成筆畫,讓長得像的字共用資訊(例如「林」「森」都含「木」)。老師說這塊學問很大。
老師原話是什麼?
「因為他有現在的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 組字打相似度分數,拿來跟你的向量比;它很小、很舊,但還能用。
**注意:老師口頭說「當然一般來講我們會覺得GloVe比word2vec好」(1:32:25),投影片 p.93 寫的是「It depends」,考試寫投影片的版本:看任務,實際試不同向量。**
| 模型 | 從哪裡學 | 最小單位 | 沒看過的字 | 什麼時候用 |
| **word2vec**(2013) | 局部:視窗裡的字對 | 整個字 | 沒有向量 | OOV 很多,拿自己的語料訓練 |
| **GloVe**(2014) | 全域:整個語料的共現表 | 整個字 | 沒有向量 | 通用,用的人最多 |
| **FastText** | 視窗,但字拆成片段 | 字元 n-gram | 用片段拼出來 | 新字、拼湊字多 |
它到底怎麼運作?(用 WordSim353 評估一次)
投影片上的幾列(人給的分數 0–10):car–automobile 8.6、cell–phone 6.06、century–year 4.73、car–flight 2.66、century–nation 1.65。
1. 用你的向量算每組的 cosine similarity,假設得到 0.78、0.52、0.61、0.30、0.25。
2. 各自排名次。人:1、2、3、4、5;模型:1、3、2、4、5(模型覺得 century–year 比 cell–phone 還像)。
3. 算 Spearman 等級相關:名次差 d = 0、−1、1、0、0,Σd² = 2,n = 5,ρ = 1 − 6 × 2 ÷ (5 × 24) = 0.9。
ρ 越接近 1,你的向量排出的「誰比較像」越接近人的判斷。
要先懂什麼?
- cosine similarity:cos(a, b) = (a · b) ÷ (|a| |b|),只看方向像不像,範圍 −1 到 1。例:a = (1, 0)、b = (1, 1),cos = 1 ÷ 1.414 ≈ 0.707。
- Spearman 等級相關(rank correlation):不比分數,只比名次一不一致。人給 0–10 分、模型給 −1 到 1,尺度不同,比名次最公平。ρ = 1 − 6Σd² ÷ (n(n² − 1)),d 是名次差。
## [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)
**注意:老師在 2:49:09 說考試不太會叫你算 BM25;要記的是它為什麼強、什麼時候比向量搜尋好。**
| keyword-based search(例:BM25) | vector-based search(dense embedding) |
| 向量長相 | 稀疏:維度=字典大小,大部分是 0 | 稠密:幾百到上千維,每格都有值 |
| 比對什麼 | 字面關鍵字,罕見字權重高 | 整體意思 |
| 擅長 | 明確的關鍵字、專有名詞、型號 | 換句話說、同義詞(car 和 automobile) |
| 弱點 | 字面不同就找不到 | 關鍵字被沖淡、相似不等於相關、怕打錯字 |
要先懂什麼?(BM25 複習)
BM25 在 W2 講過(brief p.53):搜尋引擎替文件打分數的公式,改良版 TF-IDF。三個直覺:
1. 查詢字在文件出現越多次越相關(TF),但會飽和,參數 k 控制飽和速度。
2. 越少文件有的字越有鑑別力(IDF);「的」「課」這種到處都有的字幾乎不加分。
3. 長文件本來就容易出現各種字,要扣回來(長度正規化,參數 b)。投影片寫一般 k = 2、b = 0.75。
別人怎麼教這個?
- [投影片引用的原文(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 更複雜,但道理一樣)。3 個維度代表「日常動作」「NLP」「機器學習」:
- 我、今天、去、上 都是 (1, 0, 0);課 = (1, 0.2, 0.2);NLP = (0, 1, 0);機器學習 = (0, 0, 1)。
- 兩個關鍵字完全不像:cos(NLP, 機器學習) = 0。
- 句子 A「我 今天 去 上 NLP 課」平均 = (0.83, 0.20, 0.03);句子 B「我 今天 去 上 機器學習 課」= (0.83, 0.03, 0.20)。
- cos(A, B) = 0.962,整句幾乎一樣。兩句都再加「早上 八點 跟 同學 一起」,cos 變 0.990,更分不開。
對照關鍵字比對,查詢「NLP 課」:「課」兩句都有,IDF = log(2/2) = 0;「NLP」只有 A 有,IDF = log(2/1) ≈ 0.69。A 得 0.69、B 得 0,一刀切開。
用生活例子講?
像把顏料倒進杯子攪勻:每個字一種顏色,句子向量是攪完的顏色。兩三種還看得出偏紅偏藍,倒進二十種就每杯都是灰褐色。老師的例子:叫 AI 用一句話摘要每週上課影片,搞不好 16 週都是「老師在教 NLP」。
老師原話是什麼?
「他就會糊掉,所以通常我會講模糊就是這樣,因為他會跟其他字的概念混在一起」(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 模型公平比較。排行榜可以依語言、任務、領域(例如程式碼)篩選。以後做了自己的 embedding,就到 leaderboard(排行榜)上跟別人比。
MTEB 比 WordSim353 多了什麼?
WordSim353 只測「兩個字像不像」,只有 353 組。MTEB 原始論文涵蓋 8 類任務(分類、分群、檢索、語意相似度等)、58 個資料集、112 種語言,並發現沒有哪種 embedding 在所有任務都最強,又呼應 p.93 的「It depends」。
別人怎麼教這個?
- [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 維)。另外,相似不等於相關:修水龍頭和買水龍頭用字很像、向量可能很近,意圖卻完全不同;向量搜尋又對打錯字很敏感,所以老師說 BM25 還是乖乖用一下。
**注意:老師口頭說「我該用768維度還是1000多維度」(1:41:16),投影片寫的是 768 dimensions vs. 1536 dimensions,考試寫投影片的版本。**
static 和 contextual 差在哪?
- 「我去銀行(bank)存錢」和「我們坐在河岸(bank)野餐」:static 的 bank 兩句同一個向量,意思被平均成「一半錢、一半河」;contextual 依前後文給兩個不同向量。
- 中文也一樣:「蘋果很好吃」和「蘋果發表新手機」。
維度越大越好嗎?(手算儲存成本)
維度越大能裝越多細節,但每個向量都要存。每一維 4 bytes(32 位元浮點數),存 100 萬篇文件:
- 768 維:1,000,000 × 768 × 4 = 3.07 GB
- 1536 維:1,000,000 × 1536 × 4 = 6.14 GB
原文作者的提醒:選 1536 前先想值不值得,儲存量直接翻倍。768 是 BERT-base 的維度,老師說這跟後面 Transformer 的維度有關。
用生活例子講,相似不等於相關?
你家水龍頭漏水,搜「水龍頭怎麼修」。向量搜尋覺得「哪裡買廚房水龍頭」很像(都在講水龍頭),排在前面;但你要的是修理教學,不是購物。像,不代表有用。這就是第 2 章 p.74「有出現不見得是相關」的老問題。
為什麼打錯字對向量搜尋很傷?
對 word2vec、GloVe 來說,faucet 打成 fuacet 就是沒看過的字,直接變 OOV。FastText、BERT 會拆片段,打錯一個字母還有部分對得上,可能好一些;但老師提醒,很多時候整個向量空間還是會跑掉。老師建議學完 BERT 後自己試:把句子故意打錯一個字,看 CLS token(BERT 代表整句的特殊位置)的向量差多少。
老師原話是什麼?
「有時候你覺得相似的,相似他其實不見得是相關」(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 是字典裡根本沒有這個字,只能給 unknown 標記,所有沒看過的字都長一樣;OOD 是字認得,但換到新領域意思變了,向量會偏掉。老師補充,兩者技術上的症狀很像,因為都是訓練時沒看過的東西。最後老師說做 RAG 一定逃不掉 IR(資訊檢索);傳統 NLP 這段只留下「怎麼學字的表示」(p.95 的 word vector),W2 投影片從這裡接下去。
| OOV(out-of-vocabulary) | OOD(out-of-domain) |
| 是什麼 | 字典裡沒有這個字 | 字有,但沒看過這個領域的用法 |
| 例子 | 新創字、罕見醫學字、打錯的字 | virus 在醫學是病毒、在資安是電腦病毒;cell 在生物是細胞、在通訊是手機 |
| 模型怎麼表現 | 變成 unknown 標記,大家同一個向量 | 有向量,但意思偏掉(shift、bias) |
要先懂什麼?(IR 和 RAG)
- IR(information retrieval,資訊檢索):從大量文件找出跟問題最相關的幾篇,BM25、向量搜尋都是 IR 方法。
- RAG(retrieval-augmented generation,檢索增強生成):先用 IR 找出相關文件,再連同問題交給 LLM 回答,適合公司內部、需要授權這類模型沒學過的資料。
- 模型沒辦法重新學你的語料,只能靠檢索找出資料餵給它,所以逃不掉 IR。老師也說 LLM 越來越強,RAG 不像一年前那麼非用不可,但特定領域還是會用。
老師原話是什麼?
「字典沒有的問題很大」(1:44:15)
「你要做RAG,一定要用IR,你這邊就逃不掉」(1:45:44)
「但是只留下一個很後面會用到的東西,我們要怎麼去學字的表示」(1:46:10)
## Self-check
Q1. What limitation of word2vec does GloVe address, and how?
**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 用整個語料的共現統計。
Q2. Explain how FastText can generate a vector for an out-of-vocabulary word. Give an example.
**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.
中文重點:字拆成字元片段、片段向量相加,用看過的片段拼出沒看過的字。
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.
中文重點:關鍵字不會被沖淡;向量搜尋有「相似不等於相關」和「怕打錯字」兩個弱點。
Q4. Distinguish static from contextual embeddings, and out-of-vocabulary from out-of-domain.
**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.
中文重點:static 一字一個固定向量、contextual 看上下文;OOV 是字典沒有,OOD 是領域沒看過。