[自然語言處理](https://app.notion.com/p/3e6fc631b03081b4a9e8f91f3411f61f) › [W3(9/24)](https://app.notion.com/p/3e6fc631b03081ff9776f36fab3e6e50) › 02|影片 [0:36:38–0:53:48](https://www.youtube.com/watch?v=g0QE6O17BWE&t=2198s)|投影片 W1_NLP_brief p.70–80|上一章 [01 詞向量的起源與類比(0:02–0:36)](https://app.notion.com/p/3e6fc631b0308169a5ebc6aa047ff58d)|下一章 [03 word2vec 的訓練方式(1:02–1:28)](https://app.notion.com/p/3e6fc631b03081f1b4bfe71efbd2cd7a)
跳過提示:(0:46:54–0:49:56) 老師在推導 LSA 用 SVD 拆解矩陣、取前 K 維再乘回去的完整過程,聽不懂可以直接跳到 [0:49:56](https://www.youtube.com/watch?v=g0QE6O17BWE&t=2996s),接著會用白話解釋 LSI 學到的效果。
跳過的這段在做什麼(白話):老師把十篇文章的「字 × 文章」次數表拆成幾個看不見的大主題,只留最重要的 2 個主題再組回去,看原本是 0 的格子會不會被補上數字。結果和意義,下面「只留前 K 個奇異值再乘回去」那段有白話版。
## 重點
- 分布假說(distributional hypothesis):看一個字身邊常出現哪些字,就知道它的意思。cat 和 dog 身邊的字幾乎一樣,所以意思相近。
- 神經網路出現以前的做法是 LSA:先數「字跟字」或「字跟文章」一起出現幾次,做成一張大表,再用 SVD 只留最重要的 K 個「隱藏概念」。這樣一來,從沒一起出現、但鄰居相同的字也會被拉近。
- LSA 的致命傷:表格跟詞表一樣大(可能 10 萬 × 10 萬),SVD 算不動;多一篇新文章就要整個重算。所以後來改成「用學的」,也就是下一章的 word2vec。
## Exam-ready
- **Distributional hypothesis**: "A word is characterized by the company it keeps." (Firth 1957) "In other words, similar words will appear in similar contexts"(brief p.70)
- 中文:一個字的特徵由它的「同伴」(company,身邊常出現的字)決定;也就是意思相近的字,會出現在相似的上下文(context)。白話:看鄰居就知道字義。
- **Latent Semantic Analysis**: "Words with similar meanings tend to appear in similar textual contexts or co-occur across similar documents."(brief p.71)
- 中文:意思相近的字,常出現在相似的上下文,或常一起出現在相似的文章裡。這是 LSA(潛在語意分析)的出發點。
- **Co-occurrence matrix**: "Using a corpus of text as input, draw a window of a defined length around each word and count co-occurrence statistics. The resulting matrix contains our word vectors."(brief p.71)
- 中文:拿語料(corpus)當輸入,在每個字周圍畫固定長度的窗口(window),數哪些字一起出現幾次;數完的表格每一列就是一個字的向量。
- **SVD on co-occurrence**: "SVD on this co-occurrence matrix … Reduce dimension … Use the 2 biggest singular value to represent words"(brief p.73)
- 中文:對共現矩陣做 SVD(奇異值分解)降低維度,只用最大的 2 個奇異值(最重要的 2 個方向)表示每個字。白話:長向量壓成 2 個數字,就能畫在平面上。
- **Why LSA**: "serious problems for retrieval methods based on term matching … vector-space similarity approach works only if the terms of the query are explicitly presented in the relevant documents"(brief p.74)
- 中文:靠關鍵字比對(term matching)的搜尋有嚴重問題:向量空間的相似度方法,只有查詢的字「明確出現」在相關文章裡才有用。白話:字面沒對到就找不到。
- **LSI**: "Uses a linear algebra technique called singular value decomposition (SVD) … attempts to estimate the hidden structure that generates terms given concepts … discovers the most important associative patterns between words and concepts"(brief p.75)
- 中文:LSI 用 SVD 估計「由概念產生出字」的隱藏結構(hidden structure),找出字和概念間最重要的關聯(associative patterns);它靠大量句子或文章(data driven)。白話:從字的出現規律,反推看不見的「主題」。
- **Term-document matrix**: "each row is the vector-space representation of a document … each column contains occurrences of a term in each document in the dataset"(brief p.76)
- 中文:詞-文件矩陣 X 的每一列(row,橫的)是一篇文章的向量;每一行(column,直的)是某個字在每篇文章出現幾次。
- **LSI steps (X = UΣVᵀ, then X̂ = UΣ̂Vᵀ)**: "compute the SVD of X … singular value matrix (diagonal matrix) … set to zero all but largest K singular values … obtain the reconstruction of X by"(brief p.76)
- 中文:對 X 做 SVD 拆成 UΣVᵀ(Σ 只有對角線有值);最大的 K 個奇異值以外設成 0,得到 Σ̂;再乘回去得到重建(reconstruction)的 X̂。白話:拆開、只留最重要的 K 個、再組回去。
- **Problems**: "The original matrix still has the same dimension as our vocabulary size - potentially 100,000 x 100,000 … The matrix is extremely sparse … We can perform Singular Value Decomposition (SVD) for dimensionality reduction, however at a quadratic computational cost … Adding a new word changes the entire matrix"(brief p.80)
- 中文:矩陣跟詞表一樣大,可能 10 萬 × 10 萬;極度稀疏(sparse,幾乎都是 0);SVD 能降維,但計算量平方(quadratic)成長;多一個新字,整個矩陣都變。白話:太大、太貴、不能只補新的。
## [0:36:38](https://www.youtube.com/watch?v=g0QE6O17BWE&t=2198s) 分布假說:看一個字的鄰居
一個字的意思,由它的鄰居決定。這是語言學家 Firth(1957)的想法。投影片的例子是 "The cat licked its fur" 和 "The dog licked its fur":cat 和 dog 身邊都是 licked、fur,也常碰到 eat、run、bite,卻很少碰到 read、sophisticated、wheel,所以兩個字意思相近。投影片下方的 banking 也一樣:前後的 government debt、crises、regulation、system,合起來就描繪出它的意思。
生活比喻:看一個人平常跟誰混在一起,大概就知道他是什麼樣的人。
為什麼這樣電腦就能懂字?因為「一起出現幾次」可以直接從大量文章數出來,不用人工標註。老師說目標是讓電腦學出一種表示(representation,用一串數字代表一個字),剛好反映共現機率(co-occurrence probability,字跟字一起出現的機率)。
要先懂的一個詞:向量(vector)就是「一串排好順序的數字」,例如 (1, 0, 2)。兩個字的向量越像,就代表兩個字越像。(第 2 週學過:一個字用一串數字表示,比方向像不像就知道字像不像,見 [08 從詞袋到詞向量](https://app.notion.com/p/3e6fc631b03081b1aab8f5c4fc716850)。)
下面這張圖在看:cat 和 dog 接到同一群鄰居,truck 接到另一群。
```mermaid
flowchart LR
cat["cat"] --> N1["licked、fur、eat、run、bite"]
dog["dog"] --> N1
truck["truck"] --> N2["wheel、road 這類字"]
```
鄰居重疊的 cat 和 dog 會得到相近的向量;你不會看到「卡車舔牠的貓」,truck 的鄰居不同,就離得遠。所以對你的影響是:這章的 LSA、下一章的 word2vec、之後的 GloVe,全都在做同一件事:把「鄰居很像」變成「向量很近」。
考試可能怎麼問:用 cat 和 dog 的例子說明 distributional hypothesis,並解釋為什麼它們的向量會相近。
老師原話是什麼?
「就是有點像你去讀一個英文句子,這個字你不知道,但是你可以看出前後文在講,這個字大概是什麼意思」(0:37:19)
「如果這兩個字 cat 跟 dog,他的周邊的字幾乎都一樣,在我眾多語料裡面,他們旁邊發生的字都一樣,你大概可以猜出他們兩個字的概念是一樣」(0:37:30)
「你不會看到一個文章在描述卡車舔他的貓」(0:37:41)
「能不能讓電腦去學會一個表示,這個表示剛好可以 hit 到這個 co-occurrence probability」(0:37:57)
## [0:38:09](https://www.youtube.com/watch?v=g0QE6O17BWE&t=2289s) 以前的做法:共現矩陣小例子
講 word2vec 之前,老師先看神經網路以前的做法。第一步是共現矩陣(co-occurrence matrix):定一個窗口(每個字左右各看幾個字),數每兩個字在窗口裡一起出現幾次,做成「字 × 字」的對稱表,每一列就是那個字的向量。投影片用 Stanford 課程的三句話:I like deep learning./I like NLP./I enjoy programming.,只看緊鄰的字;I 後面接 like 出現兩次,(I, like) 那格就是 2。
要先懂的一個詞:矩陣(matrix)就是排成方格的數字表。橫的一排叫「列」(row),直的一排叫「行」(column)。這裡每一列代表一個字,那一列的數字就是這個字的向量。
生活比喻:像統計班上誰常跟誰坐隔壁;記久了,就看得出誰跟誰是同一掛。
步驟:準備語料 → 每個字左右畫固定大小的窗口 → 窗口裡每出現一對字,對稱的兩格各加 1 → 每一列就是字向量,兩列越像,意思越近。
老師說 LSI 現在不實用,但當年很厲害:只靠讀語料、不用人工標註,就能學出貓和狗的關係。
考試可能怎麼問:說明共現矩陣怎麼建、為什麼能代表字義,或給小段語料算共現次數。
下面「手算一次」摺疊在做什麼(白話):把三句話的共現表真的數出來,再用一個「兩個字的鄰居重疊多少」的分數比較字和字像不像。算出來的意思是:deep 和 NLP 從沒相鄰,分數卻很高,因為它們的鄰居一樣。
它到底怎麼運作?手算一次(進階,可跳過)
投影片 p.72 的共現矩陣,只列不是 0 的格子:
- I:like 2、enjoy 1
- like:I 2、deep 1、NLP 1
- enjoy:I 1、programming 1
- deep:like 1、learning 1
- learning:deep 1;NLP:like 1;programming:enjoy 1
比兩個字像不像,用 cosine similarity(餘弦相似度,看兩個向量方向多接近;1 是同方向,0 是毫無交集):cos = (a·b) / (|a| × |b|)。
- deep 對 NLP:共同鄰居是 like,cos = 1/√2 ≈ 0.71。兩個字從沒相鄰,卻很像。
- deep 對 learning:cos = 0。明明相鄰,但鄰居完全不同。
- I 對 NLP:cos ≈ 0.89,語料太少造成的怪結果。
重點:分布假說比的是「鄰居像不像」,不是「兩個字有沒有一起出現」。
老師原話是什麼?
「老師現在也不會用 LSI…但是他不 practical,也不好用,也不好算,然後算出來也不是那麼準」(0:38:19)
「我不用做監督式學習的資料,我就可以 train 這種貓跟狗的關係」(0:38:40)
## [0:40:26](https://www.youtube.com/watch?v=g0QE6O17BWE&t=2426s) 用 SVD 降維
共現矩陣有幾個字就有幾維,又大又幾乎都是 0。第二步是 SVD(singular value decomposition,奇異值分解):把矩陣拆開,找出最重要的幾個「隱藏方向」,只留最大的幾個,每個字就從幾萬個數字縮成幾個。投影片只留 2 個,剛好畫在平面上。
要先懂的一個詞:維度(dimension)就是「一個字用幾個數字描述」。詞表有 1 萬個字,每個字的向量就有 1 萬個數字,叫 1 萬維;降維(reduce dimension)就是把它縮成少少幾個數字。(第 2 週學過:一個字佔一格的長向量幾乎全是 0,叫稀疏向量,量不出字有多像,見 [08 從詞袋到詞向量](https://app.notion.com/p/3e6fc631b03081b1aab8f5c4fc716850)。)
生活比喻:像把上百題的性向測驗,濃縮成「外向」「理性」兩個分數;細節少了,但還分得出誰跟誰像。
步驟:對共現矩陣做 SVD,拆成三個矩陣相乘 → 中間那個只有對角線有值,值越大、方向越重要 → 只留最大的 K 個(這裡 K = 2)→ 每個字在這 K 個方向上的座標,就是它的新向量。
下面是投影片 p.73 的結果。重點看紅框:deep 和 NLP 靠在一起。

圖上重點:(1)標題 Simple example for word co-occurrence usage=共現矩陣的簡單用法示範;(2)SVD on this co-occurrence matrix/Reduce dimension=對共現矩陣做 SVD,降低維度;(3)Use the 2 biggest singular value to represent words=只用最大的 2 個奇異值(最重要的 2 個方向)來表示每個字;(4)兩條橘色箭頭就是這 2 個方向(橫軸、縱軸),7 個字照新座標放上去,紅色虛線框圈出靠在一起的字:deep 和 NLP、learning 和 programming。這張圖在講:共現表經過 SVD 壓成 2 個數字之後,鄰居相似的字在平面上會靠近。
為什麼 deep 和 NLP 會靠近?因為兩個都接在 like 後面,鄰居一樣。learning 和 programming 也被圈起來,老師沒解釋;他提醒只有三句話很難講統計 (0:41:04),看趨勢就好。
注意:老師不講 SVD 怎麼算 (0:40:27、0:44:39),但假設你線性代數學過 (0:44:16)。短版在下面。
考試可能怎麼問:為什麼要對共現矩陣做 SVD?(降維:長而稀疏的向量變短,鄰居相似的字靠近。)
下面「SVD 短版」摺疊在講什麼(白話):SVD 把一張大表拆成三塊:每個字偏向哪些隱藏主題、每個主題有多重要、每個上下文偏向哪些主題。只留最重要的幾個主題,就是「用最少的數字,最接近原本那張表」;字的新向量,就是它在這幾個主題上的分數。
要先懂什麼?SVD 短版(進階,可跳過)
任何矩陣 X 都能拆成 X = UΣVᵀ。若 X 每一列是一個字:(Vᵀ 右上角的 T 是轉置 transpose:把表格的列和行對調。對角矩陣:只有左上到右下那條斜線上有數字、其他格都是 0 的方陣。)
- U:每一列是一個字在各個「隱藏概念」上的座標。
- Σ:對角矩陣,對角線是奇異值 σ1 ≥ σ2 ≥ … ≥ 0;越大,那個概念越重要。
- Vᵀ:每一行是一篇文件(或上下文字)在各概念上的座標。
只留前 K 個奇異值、其餘設成 0,得到的是「只用 K 個概念時,最接近原本 X 的矩陣」(誤差平方和最小,我補充)。
老師說乘回去就得到每個字的向量,再映射到平面 (0:40:47);平面座標就是 U 的前 K 行乘上 σ1…σK,p.73 是 K = 2。
老師補充:SVD 在推薦系統也很常用;計算量很大,實務上常用逼近、訓練的方式算 (0:48:06)。
## [0:43:49](https://www.youtube.com/watch?v=g0QE6O17BWE&t=2629s) 為什麼需要 LSA
傳統搜尋靠關鍵字比對(term matching):查詢的字要「明確出現」(explicitly presented)在文章裡才找得到。這會出兩種方向相反的錯(p.74):有出現不見得是相關,沒出現不見得是無關。根本原因是自然語言的表達力太豐富(the rich expressive power of natural language):查詢的字其實在表達一個「概念」(concept)。LSA 就是想抓出字背後的概念,讓查詢不必一字不差。老師把接下來的內容比喻成「參觀博物館」:看看前人在神經網路出現前怎麼做,核心就是 SVD。
生活比喻:在圖書館查「腳踏車」,只比對字面的系統會漏掉寫「自行車」「單車」的書;查「蘋果」,卻跑出一堆講 iPhone 的書。
下表把 p.74 的兩句話對到英文術語(例子是我補充的):
| p.74 的說法 | 英文術語 | 例子 | 關鍵字比對會怎樣 |
| 有出現不見得是相關 | **polysemy**(一詞多義) | 查 apple 手機,找到講水果的文章 | 找到不相關的(誤判) |
| 沒出現不見得是無關 | **synonymy**(同一個意思有很多說法) | 查 car,漏掉只寫 automobile 的文章 | 漏掉相關的(漏找) |
兩種錯方向相反:一種是找太多,一種是找太少。(我補充)LSA 對同義詞特別有效;一詞多義只能部分改善,因為每個字還是只有一個向量。
(第 2 週學過:同義詞讓該找的找不到、一詞多義讓意思不對的也被找回來,只比對字面的搜尋兩種錯都會犯,見 [08 從詞袋到詞向量](https://app.notion.com/p/3e6fc631b03081b1aab8f5c4fc716850)。)
注意:0:42:31–0:43:48 錄音受干擾,約 1 分鐘聽不清楚,這段照投影片 p.74。
考試可能怎麼問:Why do term-matching retrieval methods fail?(舉一詞多義和同義詞各一個例子。)
老師原話是什麼?
「因為有一詞多義」(0:43:49)
「沒有出現也不見得是無關,因為本來就是一個意思可以用很多種的方式來表示」(0:43:51)
「就是參觀一下博物館,說以前這些古人用的這樣的技術到底長什麼樣子」(0:44:04)
## [0:45:00](https://www.youtube.com/watch?v=g0QE6O17BWE&t=2700s) 十篇文章範例:Linux 與基因體
投影片用十篇新聞標題:d1–d5 講 Linux 作業系統,d6–d10 講基因體(genome)。兩組主題無關,唯一的橋是 database:d5 寫 mySQL database,d8 寫 genome database。做成詞-文件矩陣(term-document matrix,列是關鍵字、行是文章、格子是出現次數)。因為兩組用字完全分開,搜尋 Dolly(複製羊桃莉)時,前五篇絕對找不到。
這張表跟前面的共現矩陣不同(前面是「字 × 字」,這裡是「字 × 文章」),但老師說精神一樣 (0:40:08)。
生活比喻:兩個互不認識的朋友圈,只靠一個共同朋友連起來。
下面這張圖在看:database 是兩組文章之間唯一的連結。
```mermaid
flowchart LR
L["Linux 新聞 d1–d4"] --- D5["d5:open-source mySQL database"]
D5 --- DB(("database"))
DB --- D8["d8:genome database"]
D8 --- G["基因體新聞 d6、d7、d9、d10"]
```
一起出現的字就有關係,所以 database 同時串起兩邊的字;下一段的 LSI 就順著這座橋把兩邊拉近。
考試可能怎麼問:在 LSI 的例子裡,為什麼搜尋 Dolly 本來找不到 Linux 的文章?哪個字把兩組文章連起來?
下面「詞-文件矩陣」摺疊放的是那張表的實際內容(哪個字出現在哪幾篇),沒有計算;看完只要記得一件事:database 是唯一兩組文章都有的字。
這張詞-文件矩陣長什麼樣?(進階,可跳過)
十篇標題在 p.77,當橋的是這兩篇:d5 Gentoo servers running at open-source mySQL database;d8 Malaria-parasite genome database on the Web。
矩陣(p.78,每列一個字,只列出現的文章):
- open-source:d1、d5;software:d1、d4;Linux:d4
- released:d2、d3、d4;Debian:d2、d3;Gentoo:d3、d5
- database:d5、d8(唯一跨兩組的字)
- Dolly:d6、d10;sheep:d6;genome:d7、d8、d9;DNA:d7(2 次)、d10
注意:p.76 的 X 每列是一篇文章,p.78 畫的是轉置 Xᵀ(每列一個字);做 SVD 只是 U、V 角色互換。
老師原話是什麼?
「當我要搜尋這個 Dolly 羊的時候,我絕對不會找到前五篇的東西,因為關鍵字都沒有出現」(0:47:05)
## [0:48:40](https://www.youtube.com/watch?v=g0QE6O17BWE&t=2920s) 只留前 K 個奇異值再乘回去
對詞-文件矩陣做 SVD,得到 10 個奇異值(2.57、2.49、1.99……0.10)。只留最大的 2 個(K = 2),其餘設成 0,再乘回去,得到重建矩陣 X̂。原本是 0 的格子,現在出現小小的正值或負值:database 這一列在十篇文章裡都有值了。老師的說法是:靠 database 這個字,把概念傳(propagate)到另一群文章去。
生活比喻:像壓縮照片,只留主要輪廓:抹掉「這篇用 car 還是 automobile」,留下「這篇在講車」,所以用 car 查也找得到寫 automobile 的文章。
下面這張圖是 LSI 的四個步驟:
```mermaid
flowchart LR
A["詞-文件矩陣 X"] --> B["SVD 拆成 U、Σ、Vᵀ"]
B --> C["Σ 只留最大 K 個,其餘設 0"]
C --> D["乘回去得到 X̂"]
D --> E["0 的格子變非 0:概念傳到別的文章"]
```
為什麼 0 會變成非 0?只留 K 個概念,等於強迫每篇文章都只能用這幾個大主題描述;「剛好用了哪個字」的細節被抹掉,同主題的字就互相補上:d1 原本沒有 released,重建後是 0.63。負數讀成「方向相反」:DNA 在 Linux 文章 d1–d4 是 −0.03 到 −0.06,老師說這能把概念拉得更開。
d5 這篇 Linux 文章也跟 Dolly、genome、DNA 沾上邊,老師承認這有點怪;但語料更多、共現更複雜時,LSI 的結果其實不錯,在沒有大模型的年代是「神乎其技」。
考試可能怎麼問:Describe the steps of LSI. Why can a 0 entry become non-zero (even negative) after reconstruction?
下面「用四個字手算一次」摺疊在做什麼(白話):用三篇超短文章真的跑一次 LSI 的四步。算出來的意思是:丟掉「用 car 還是 automobile」這個小差別之後,兩個字變成一模一樣的向量,所以搜 car 也會找到只寫 automobile 的文章。
它到底怎麼運作?用四個字手算一次(進階,可跳過)
三篇文章:d1「car engine」、d2「automobile engine」、d3 提到 flower 兩次。原矩陣(每列一個字,依序 d1、d2、d3):car (1, 0, 0);automobile (0, 1, 0);engine (1, 1, 0);flower (0, 0, 2)。
SVD 拆出三個概念:σ = 2 是「花」;σ ≈ 1.73 是「車」;σ = 1 是「用 car 還是 automobile」的差別。
K = 2 就是丟掉「用詞的差別」。乘回去後,car 變成 (0.5, 0.5, 0),automobile 也是 (0.5, 0.5, 0),engine 還是 (1, 1, 0),flower 不變。
結果:搜尋 car 時,沒寫 car 的 d2 從 0 分變成 0.5 分,這就是「沒出現不見得是無關」的解法。
(我補充)用 p.78 的矩陣重算,奇異值是 2.55、2.40、1.94……,跟 p.79 不完全一樣,原因不確定;「0 變非 0、出現負數」的現象相同。考試照投影片寫。
老師原話是什麼?
「我就靠這個 Database 去 propagate 這個 concept 出去了」(0:50:02)
「但是如果你的語料更多一點,你的關聯 co-occurrence 更複雜一點的時候,你就發現這個 LSI 做出來的東西其實還不錯」(0:50:46)
「在沒有這種大模型的年代的時候,誒這個技巧其實是非常神乎其技的」(0:50:59)
## [0:51:20](https://www.youtube.com/watch?v=g0QE6O17BWE&t=3080s) LSA 與 LSI 的差別和致命傷
這整套方法叫 LSA(latent semantic analysis,潛在語意分析);拿去做檢索(retrieval)、建索引(index)時叫 LSI(latent semantic indexing,潛在語意索引)。它證明了不用神經網路、只靠計算,也能拉近貓和狗。
但它有兩個致命傷。第一,SVD 太貴:老師說直接叫 Python 做十萬維的 SVD,電腦就卡住。第二,不能增量更新(incremental update,只補新的部分):多一篇新文章,尤其是沒看過的新領域,就要整個重算。老師也提到,方法發表後常有人研究怎麼增量更新、怎麼刪掉某個概念,但 SVD 很難做到。所以後來改成「用學的」、能算多少算多少,走向機率和語言模型的想法,也就是下一章的 word2vec。
要先懂的一個詞:語言模型(language model)就是「看前面的字,猜下一個字最可能是什麼」的模型,它替每種接法算一個機率。(第 1 週學過:語言模型就像接龍,算的是條件機率,見 [03 NLP 層次、語言模型與發展史](https://app.notion.com/p/3e7fc631b03081f5bf0bf5126d7f9472)。)
生活比喻:LSI 像照「全館藏書」排書架的圖書館,進一本新領域的書就得全館重排;word2vec 比較像店員,新書來了看一眼、微調印象就好。
下表是 p.80 列的四個問題:
| p.80 的問題 | 白話 |
| same dimension as our vocabulary size | 詞表多大,矩陣就多大:10 萬 × 10 萬 = 100 億格 |
| extremely sparse | 幾乎都是 0:p.78 的小例子 110 格只有 22 格不是 0 |
| SVD at a quadratic computational cost | 字數變 10 倍,計算量至少變 100 倍 |
| Adding a new word changes the entire matrix | 不能增量更新:多一個字或一篇文章,整個 SVD 重算 |
四個問題可以濃縮成兩個:太大太貴、不能只補新的。
考試可能怎麼問:Give two limitations of LSA that motivated learning-based embeddings like word2vec.
下面「quadratic cost」摺疊在講什麼(白話):詞表變大時,SVD 的計算時間漲得比詞表快很多(詞表變 10 倍,時間至少變 100 倍),這就是「算不動」的原因。
quadratic cost 是什麼意思?(進階,可跳過)
quadratic(平方)成長:從 1 萬維到 10 萬維,計算量變 100 倍。老師先問 1 萬 × 1 萬的矩陣做 SVD 成本多少 (0:48:32),再說十萬維電腦直接卡住 (0:52:15)。
(我補充)課本通常說 m × n 矩陣(m ≥ n)完整 SVD 約 O(mn²),方陣就是 O(n³),比平方還貴;考試照投影片寫 quadratic。
老師原話是什麼?
「那這個方法其實就叫 LSA…所以這樣的一個技術我們叫 LSI」(0:51:20)
「你就發現做一個十萬維,十萬維的電腦就卡在那就做不出來這樣子」(0:52:15)
「他沒辦法 incremental 去 update」(0:52:36)
「那我們就用學的用算的,能夠算多少就算多少」(0:53:22)
「所以後面就有這種比較 probability 的想法,其實比較像是 language 的 model 的想法」(0:53:31)
## Self-check
Q1. State the distributional hypothesis. Using "The cat licked its fur" and "The dog licked its fur", explain why "cat" and "dog" should get similar vectors.(中文:說明分布假說,並用這兩句解釋為什麼 cat 和 dog 的向量應該相近。)
**Answer**: The distributional hypothesis says "a word is characterized by the company it keeps" (Firth 1957): similar words appear in similar contexts. "cat" and "dog" share the same context words (licked, its, fur, and also eat, run, bite), so their co-occurrence vectors point in similar directions and have high cosine similarity, while words such as "wheel" or "sophisticated" rarely appear in those contexts.
中文:分布假說:字的意思由鄰居決定(Firth 1957),意思相近的字出現在相似的上下文。cat 和 dog 的鄰居一樣(licked、its、fur,還有 eat、run、bite),所以共現向量方向相近、cosine 相似度高;wheel、sophisticated 很少出現在這些上下文,就離得遠。
Q2. Corpus: "I like deep learning." "I like NLP." "I enjoy programming." With a window size of 1, what is the co-occurrence count of (I, like)? Compute the cosine similarity of "deep" and "NLP" from their rows and explain why it is non-zero.(中文:窗口大小 1 時 (I, like) 共現幾次?算 deep 和 NLP 的 cosine 相似度,並解釋為何不是 0。)
**Answer**: count(I, like) = 2. deep = (like: 1, learning: 1) and NLP = (like: 1), so cos = 1 / (√2 × 1) ≈ 0.71. It is non-zero although "deep" and "NLP" never co-occur, because both share the neighbor "like". Distributional similarity measures shared contexts, not direct co-occurrence (e.g. cos(deep, learning) = 0).
中文:I 後面接 like 出現兩次,所以是 2。deep 的鄰居是 like 和 learning,NLP 只有 like,兩者共享 like,cos = 1/(√2 × 1) ≈ 0.71。deep 和 NLP 從沒相鄰,相似度卻不是 0,因為比的是「共同鄰居」,不是「有沒有直接一起出現」;反例是 deep 和 learning 明明相鄰,cos 卻是 0。
Q3. Describe the steps of Latent Semantic Indexing on a term-document matrix X. Why can an entry that is 0 in X become non-zero, even negative, in the reconstruction?(中文:說明 LSI 對詞-文件矩陣 X 的步驟;為什麼 X 裡是 0 的格子,重建後會變成非 0,甚至是負數?)
**Answer**: (1) Build the term-document matrix X. (2) Compute the SVD X = UΣVᵀ, where Σ is the diagonal singular value matrix. (3) Set to zero all but the largest K singular values to get Σ̂. (4) Reconstruct X̂ = UΣ̂Vᵀ. X̂ is a rank-K approximation built from only K latent concepts, so a term's value in a document is estimated from the concepts they share. Terms linked by co-occurrence (e.g. "database" bridging Linux and genome news) spread to documents where they never appeared (positive values), and documents far from a concept can get small negative values.
中文:四步:(1) 建詞-文件矩陣 X;(2) 做 SVD,X = UΣVᵀ,Σ 是對角的奇異值矩陣;(3) 只留最大的 K 個奇異值、其餘設 0,得到 Σ̂;(4) 乘回去 X̂ = UΣ̂Vᵀ。X̂ 只用 K 個潛在概念近似原矩陣,字在文章裡的值是從共享的概念估出來的。靠共現連起來的字(例如 database 串起 Linux 和基因體新聞)會把值傳到從沒出現過的文章(正值);跟某個概念方向相反的文章,會得到小小的負值。
Q4. Give two limitations of SVD-based methods such as LSA that motivated learning-based word embeddings like word2vec.(中文:舉出 LSA 這類 SVD 方法的兩個限制,說明為什麼後來改用 word2vec 這種用學的詞向量。)
**Answer**: (1) The matrix has the same dimension as the vocabulary (potentially 100,000 × 100,000) and is extremely sparse. (2) SVD has a quadratic computational cost, so it does not scale to large corpora. (3) Adding a new word changes the entire matrix, so the SVD must be recomputed; it cannot be updated incrementally.
中文:(1) 矩陣跟詞表一樣大(可能 10 萬 × 10 萬),幾乎全是 0;(2) SVD 計算量平方成長,大語料算不動;(3) 多一個新字就改變整個矩陣,必須整個重算,不能增量更新。所以後來改用「用學的」word2vec。
讀完了嗎?下一章:[03 word2vec 的訓練方式(1:02–1:28)](https://app.notion.com/p/3e6fc631b03081f1b4bfe71efbd2cd7a)|回到週頁:[W3(9/24)](https://app.notion.com/p/3e6fc631b03081ff9776f36fab3e6e50)