[自然語言處理](https://app.notion.com/p/3e6fc631b03081b4a9e8f91f3411f61f) › [W3(9/24)](https://app.notion.com/p/3e6fc631b03081ff9776f36fab3e6e50) › 03|影片 [1:02:56–1:28:24](https://www.youtube.com/watch?v=g0QE6O17BWE&t=3776s)|投影片 W1_NLP_brief p.81–90|上一章 [02 分布假說與 LSA/LSI(0:36–0:53)](https://app.notion.com/p/3e6fc631b030815a90adc80645bf2668)|下一章 [04 GloVe、FastText 與向量檢索(1:28–1:46)](https://app.notion.com/p/3e6fc631b03081c5b27ce6cbad0d3d3a)
## 重點
- 人類寫的文字有機率規律,所以可以讓電腦練習「看到這個字,猜它旁邊會出現什麼字」,藉此學到字義。unigram 完全不管字序,bigram 只看前一個字,word2vec 用一個視窗(window)看更多上下文。
- word2vec 有兩種學法:CBOW 用上下文猜中間的字,Skip-gram 用中間的字猜上下文(投影片主講 Skip-gram)。Skip-gram 把語料掃一遍,就能自己造出「中心字+上下文字」的訓練配對,不用人工標註。老師強調這是 NLP 很常用的巧思。
- 模型只有一層隱藏層、兩個矩陣 V 和 U。one-hot 乘 V 等於查表取出詞向量,再跟 U 裡每個字的輸出向量做內積、經過 softmax 變成整個字典的機率;用 cross entropy 算誤差、反向傳播更新。訓練完,V 的每一列就是詞向量。
## Exam-ready
- **Unary language model**: "P(w₁, …, wₙ) = ∏ᵢ P(wᵢ)" — "Ridiculous not to consider word order"(W1_NLP_brief p.81)
- **Binary language model**: "P(w₁, …, wₙ) = ∏ᵢ P(wᵢ | wᵢ₋₁)" — "Better but still limited by short context distance"(W1_NLP_brief p.81)
- **CBOW vs. Skip-Gram**: "word2vec models (using window m to get more context)": "Continuous Bag of Words (CBOW)" P(w_c | w_c−m, …, w_c−1, w_c+1, …, w_c+m); "Skip-Gram (which we will focus on)" P(w_c−m, …, w_c−1, w_c+1, …, w_c+m | w_c)(W1_NLP_brief p.81)
- **Skip-Gram training data**: "Context window size = 1" … "What if context size > 1? More word pairs. Only pass two words to the model at a time"(W1_NLP_brief p.82)【老師強調】(1:13:44)
- **Model parameters**: "word2vec uses a single hidden layer feedforward neural network. Input to hidden layer matrix has our target word embeddings vᵢ. Hidden to output layer matrix has another set of word embeddings called output embeddings uᵢ"(W1_NLP_brief p.83)
- **Recap**: "Iterative process: 1. Generate probability estimates 2. Calculate the error in the estimates 3. Update the parameters until optimized"(W1_NLP_brief p.84)
- **One-hot**: "We imagine the words are encoded as “one-hot” vectors (all zeros except a one at the word index in the embedding matrix)"(W1_NLP_brief p.86)
- **Embedding lookup**: "In practice we don’t do matrix multiplication, but just use the word index to pick out the vector."(W1_NLP_brief p.87)
- **Probability over vocab**: "Our word vector does a dot product with every word’s output embedding, then applying softmax gives a probability distribution over the vocabulary": ŷᵢ = P(wᵢ | v_c, U) = exp(u_wᵢᵀ v_c) / Σⱼ₌₁ⱽ exp(u_wⱼᵀ v_c)(W1_NLP_brief p.88)
- **Loss function**: "Cross entropy measures the distance between probability distributions": CE(ŷ, y) = −Σᵢ₌₁ⱽ yᵢ log(ŷᵢ)(W1_NLP_brief p.90)
## [1:02:56](https://www.youtube.com/watch?v=g0QE6O17BWE&t=3776s) 課間 Slido 問答
休息回來,老師先回答 Slido(課堂線上提問)上的問題。BM25 只是 TF-IDF 的變形,設計都是 heuristic(經驗法則,試出來效果好就用)。詞向量通常只有幾百維,不會超過 1,000 維;以前的文件向量則是字典有多大就有幾維。word vector 還有一個根本限制:一個字只有一個向量,分不出「蘋果(水果)」和「蘋果(電腦)」,所以後面才需要會看上下文的 contextual vector。(行政:NTU COOL 加選是分批處理,下週還沒生效就再問。)
**注意:老師兩次口頭說預設是 700 多維 (1:05:29、1:22:11),投影片 p.83 的例子是 300 維。查證:Gensim 預設 vector_size=100,Google News 預訓練向量 300 維;768 是 BERT-base 的長度,老師可能想到這個(推測)。考試寫投影片的版本。維度也不是越大越好,設一萬維「可以但是效果不會比較好」(1:22:19)。**
BM25 跟 TF-IDF 差在哪?
TF-IDF:字在這篇出現越多、在所有文件越少見,分數越高。BM25 多做兩個調整:
1. 詞頻會飽和:出現 1 次和 2 次差很多,20 次和 21 次幾乎沒差(參數 k1)。
2. 文件長度校正:長文件本來就容易出現很多字,要扣一點分(參數 b)。
**注意:老師說 BM25 的式子沒有要細講,知道它精神上是 TF-IDF 的變形就好 (1:03:42)。**
用生活例子講,為什麼一個字只有一個向量不夠?
「我吃了一顆 apple」和「Apple 發表了新手機」,word2vec 給兩個 apple 同一個向量,結果變成水果和公司的「平均」,兩邊都不像。contextual vector(依上下文決定的向量)讓同一個字在不同句子得到不同向量,W2 投影片 p.39 起才會講。
所以對你的影響是:作業一找多義字(apple、bank)的相似字時,兩種意思的鄰居會混在一起,這正好可以寫成報告的觀察。
老師原話是什麼?
- 「他就是一個變形的 TF-IDF 這樣子」(1:03:54)
- 「一般後來在做這邊的每一個字的 Embedding,其實都不會太多,就是了不起到 1K」(1:04:54)
- 「所以所謂這種 Contextual Vector 還是很重要」(1:05:57)
## [1:06:49](https://www.youtube.com/watch?v=g0QE6O17BWE&t=4009s) 無限猴子:語言有機率規律
老師用「無限猴子」說明為什麼要把語言當成機率。讓很多猴子亂敲鍵盤,猴子夠多,總有一隻會剛好打出莎士比亞,因為任何一段文字的機率都算得出來,只是很小。重點要反過來看:人類的文字不是亂敲的,一個字後面接什麼字,有固定的模式(pattern)和機率。所以讓電腦從大量文章學會「看到這幾個字,下一個字應該是什麼」,它學到的東西就某種程度代表了語言和字義。
手算一次:要幾隻猴子才打得出 "cat"?
鍵盤只有 26 個字母,每鍵都亂按。
1. 打出 "cat" 的機率 = 1/26 × 1/26 × 1/26 = 1/17,576。
2. 老師說「把期望值變成 1」:N 隻猴子的預期成功隻數 = N × 1/17,576 = 1,所以 N = 17,576 隻。
3. 打 "to be"(5 個字元,加空白鍵共 27 鍵)機率是 1/27⁵ = 1/14,348,907,要一千四百多萬隻。
猴子是「每個字機率都一樣」的模型,不懂語言;語言模型要學的,正是人類文字「不平均」的地方,例如 "to" 後面接 "be" 遠比接亂碼常見。
老師原話是什麼?
- 「所以他是有一個 pattern,有一個機率的」(1:08:44)
- 「讓電腦學會說啊,你看到這幾個字,下一個字應該是什麼」(1:08:52)
## [1:09:40](https://www.youtube.com/watch?v=g0QE6O17BWE&t=4180s) unigram 與 bigram 語言模型
語言模型(language model,算「一串字出現機率」的模型)有粗有細。投影片 p.81 的 unary language model(一般叫 unigram)假設字跟字完全獨立,一句話的機率就是每個字的機率相乘,投影片直接說不管字序「很荒謬」。binary language model(一般叫 bigram)讓每個字只看前一個字,好一些,但看的距離太短。再延伸就是 trigram、n-gram(第 06 章細講)。GPT 一次產生一個 token(詞元,模型處理文字的最小單位),挑機率高的下一個字,精神也一樣。
要先懂什麼?條件機率與連乘
- P(B | A):已知 A 發生,B 發生的機率。P(licked | cat) 是「前一個字是 cat,下一個字是 licked」的機率,用數的估:count(cat licked) ÷ count(cat 後面有接字)。
- ∏ 是「全部乘起來」,跟 Σ(全部加起來)是一對。
- 互相獨立才能直接相乘:P(A 且 B) = P(A) × P(B)。unigram 就是硬把每個字當成獨立。
它到底怎麼運作?用三句話的小語料手算一次
語料:the cat licked its fur/the dog licked its paw/the cat saw the dog,共 15 個字(the 4、cat 2、dog 2、licked 2、its 2、fur 1、paw 1、saw 1)。bigram 要知道句子從哪開始,所以每句前面加句首記號 START。下表只算這三個字。
| 字串 | unigram | bigram |
| the cat licked | 4/15 × 2/15 × 2/15 ≈ 0.0047 | P(the | START) × P(cat | the) × P(licked | cat) = 3/3 × 2/4 × 1/2 = **0.25** |
| cat the licked | 2/15 × 4/15 × 2/15 ≈ 0.0047(一樣) | P(cat | START) = 0/3,整串 = **0** |
unigram 分不出哪一串是人話,bigram 立刻分得出來。但 bigram 看不到 "dog … its paw" 這種隔好幾個字的關係,就是投影片說的 "limited by short context distance"。
老師原話是什麼?
- 「字跟字之間是完全獨立的」(1:09:53)
- 「就是我下一個字只跟前一個字有關」(1:10:15)
## [1:11:20](https://www.youtube.com/watch?v=g0QE6O17BWE&t=4280s) CBOW 與 Skip-gram
word2vec 論文提出兩種學法,都用大小為 m 的視窗(中心字左右各看 m 個字)取上下文。CBOW(Continuous Bag of Words,連續詞袋)像克漏字:看前後文,猜中間的字。Skip-gram 反過來:看中間的字,猜前後會出現哪些字。投影片寫明只講 Skip-gram,老師也說 CBOW 訓練起來比較不直覺,一般用 Skip-gram。
| CBOW | Skip-gram |
| 輸入 | 周邊的字(context words) | 中間的字(center word) |
| 要猜 | 中間的字 | 周邊的字 |
| 機率式(p.81) | P(w_c | w_c−m, …, w_c+m) | P(w_c−m, …, w_c+m | w_c) |
| 投影片例子 | The cat [?] its fur → 猜 licked | [?] licked [?] → 猜 cat、its |
| 原作者的比較 | 訓練快 | 比較慢,但罕見字學得比較好 |
作業一用 Gensim 時要注意什麼?
Gensim(作業一用的 Python 詞向量套件)的 Word2Vec 預設 sg=0,也就是 CBOW;要用 Skip-gram 必須設 sg=1。其他預設:window=5、vector_size=100。報告要寫模型與超參數(占 5%),記得寫清楚這三個設多少、為什麼。
查證來源:[Gensim 官方文件 models.word2vec](https://radimrehurek.com/gensim/models/word2vec.html);表格最後一列出自 Google 原始 word2vec 專案說明("skip-gram (slower, better for infrequent words) vs CBOW (fast)")。
老師原話是什麼?
- 「CBOW 其實是比較有點像克漏字的」(1:11:48)
- 「你看到這個字的時候,你前面聯想到什麼,後面聯想到什麼」(1:12:33)
## [1:13:00](https://www.youtube.com/watch?v=g0QE6O17BWE&t=4380s) 從語料自己造訓練資料
Skip-gram 需要「輸入一個字、答案是另一個字」的訓練資料,但沒人幫忙標。做法是把語料從頭掃一遍:每個字輪流當中心字(center word),window 範圍內的字就是答案(context word),每一對都是一筆訓練資料;window 越大,配對越多。【老師強調】(1:13:44) 這一步看似理所當然,其實是訓練上的巧思:不靠人工標註,直接從沒標註的語料自動產生監督式學習的資料。這叫 self-supervised learning(自監督學習),後來 BERT 的遮字訓練(masked language model,把字遮起來讓模型猜)也是同一招。
手算一次:一句話能造出幾組配對?
投影片 p.82 的語料:"The cat licked its fur. The truck moved."(轉小寫,每句分開掃)。window = 1 時,第一句:
- the → cat
- cat → the、licked
- licked → cat、its
- its → licked、fur
- fur → its
第一句 8 組,第二句 (the, truck)、(truck, the)、(truck, moved)、(moved, truck) 4 組,合計 12 組。window = 2 時,licked 的答案變成 the、cat、its、fur;第一句 14 組、第二句 6 組,合計 20 組。
不管 window 多大,每次送進模型的都只有一個中心字+一個上下文字,這就是 "Only pass two words to the model at a time"。
用生活例子講,什麼是 self-supervised?
沒有老師出題,你就拿一本小說,自己塗掉一些字再猜回來;答案就在原文裡,不用人批改。Skip-gram 和 BERT 都是這樣。
老師舉的反例:廠商只標十筆資料就要很厲害的模型,不可能;人工標註又貴又慢,所以 NLP 大量用這種方法。
所以對你的影響是:作業一用 Wikipedia 訓練詞向量就是這個原理,不用準備任何標註。
**注意:老師口頭說成 unsupervised training (1:15:54),W2 投影片 p.62 的用詞是 self-supervised training,考試寫 self-supervised。**
老師原話是什麼?
- 「其實你會覺得很 trivial,但是這個動作其實是一個非常,你說有創意嗎,或是說一個人類的一個,我覺得是一個訓練上的一種巧思」(1:13:44)
- 「自動化的方式,產生一個這樣的監督式,這樣的學習,這其實都是後來,一個在 NLP 非常常用的概念」(1:15:28)
## [1:16:18](https://www.youtube.com/watch?v=g0QE6O17BWE&t=4578s) 一層隱藏層的神經網路
word2vec 只是一層隱藏層的前饋神經網路(feedforward neural network,資料只往前流),所以只有兩個權重矩陣:V 接在輸入和隱藏層之間,存的就是我們要的詞向量;U 接在隱藏層和輸出之間,是另一組「輸出詞向量」(output embeddings)。投影片的例子:字典 10,000 字,輸入是長度 10,000 的 one-hot,隱藏層 300 個神經元,輸出層 10,000 個,代表每個字是鄰居的機率。老師提醒,這背後是很強的假設:「猜得準鄰居,就代表懂字義」。
[[IMG: C:\D槽\TAICA課程\_work\notes-v2\nlp-w3\img\nlp_brief_p083.png | word2vec 的網路(p.83):輸入 one-hot(10,000 格)→ 隱藏層 300 個線性神經元(矩陣 V)→ 輸出層 10,000 個 softmax(矩陣 U)]]
**注意:老師說不會講神經網路,要自己補 (1:16:41)。下面「要先懂什麼?」是最短版;老師推薦投影片 p.83 附的 McCormick 教學,說它很平易近人。**
要先懂什麼?神經網路最少要知道的事
- 神經元(neuron):把每個輸入乘上各自的權重(weight)再加起來(weighted sum)。一整層一起算就是「輸入向量 × 權重矩陣」,所以一層=一個矩陣。
- 一般神經元還會過一個非線性函數(activation function);word2vec 的隱藏層沒有,是純線性(圖上的 Linear Neurons),只有輸出層用 softmax。
- 前向計算(forward pass):從輸入算到輸出,得到模型的猜測。
- 訓練:猜測跟答案比出誤差(loss),用反向傳播(backpropagation,從輸出往回算每個權重該往哪調)修正權重。訓練好的模型就是調好的矩陣;word2vec 要的是 V。
用生活例子講,為什麼「會猜鄰居」就等於「懂字義」?
派對上有個人,你不知道他的工作,但他身邊的話題總是 "patient"、"hospital"、"surgery",你大概猜得到他是醫生。一個字的意思,就藏在它常跟誰一起出現(第 02 章的分布假說)。模型能準確猜出某字的鄰居,表示它替這個字記下的 300 個數字,已經抓到「這個字常出現在哪種場合」。後來 BERT 用克漏字學整句的表示,也是同一個想法。
別人怎麼教這個?
- [Word2Vec Tutorial - The Skip-Gram Model(McCormick)](http://mccormickml.com/2016/04/19/word2vec-tutorial-the-skip-gram-model/):投影片 p.83 附的連結,同樣用 10,000 字、300 維的例子。
- [The Illustrated Word2vec(Jay Alammar)](https://jalammar.github.io/illustrated-word2vec/):圖解滑動視窗怎麼造資料、兩個矩陣怎麼更新。
- 3Blue1Brown [神經網路是什麼](https://www.youtube.com/watch?v=aircAruvnKk)、[反向傳播](https://www.youtube.com/watch?v=Ilg3gGewQ5U)
老師原話是什麼?
- 「的確我不會講 NN 的東西,所以你可能要自己 catch 一下這些概念」(1:16:41)
- 「這是一個非常 strong 的假設」(1:19:33)
- 「你的 embedding 就是前面第一個 v」(1:20:21)
## [1:22:29](https://www.youtube.com/watch?v=g0QE6O17BWE&t=4949s) 一步步拆解:one-hot、查表、輸出權重
用投影片 8 個字的字典(the、cat、licked、its、fur、truck、dog、moved)走一次。每個字先變成 one-hot:長度 8,只有自己的位置是 1,例如 cat = [0 1 0 0 0 0 0 0]。one-hot 乘 V,結果剛好是 V 的第 2 列,所以實務上不做乘法,直接用編號去 V 取出那一列(embedding lookup,查表),這就是 cat 的詞向量。再拿它跟 U 裡每個字的輸出向量做內積,得到 8 個分數,用 softmax 轉成加起來等於 1 的機率:真正的鄰居要高,其他要低。
要先懂什麼?內積、one-hot 乘矩陣、softmax
- 內積(dot product):對應位置相乘再加總。[0.8, 0.2]·[0.6, 0.3] = 0.48 + 0.06 = 0.54。方向越像,內積越大。
- one-hot 乘矩陣:[0 1 0] 乘 3 列的矩陣,第 1、3 列都乘到 0,只剩第 2 列。「乘 one-hot」就是「挑一列」。
- softmax:每個分數取 e 的次方(變正數),再除以總和(加起來變 1)。分數越高,機率越高。
它到底怎麼運作?用 4 個字、2 維手算一次
字典縮成 the、cat、licked、its,詞向量 2 維。V 裡 cat 那一列是 [0.8, 0.2];U 裡的輸出向量是 the [0.2, 0.5]、cat [0.1, −0.4]、licked [0.6, 0.3]、its [0.9, 0.8]。訓練配對是 (cat, licked)。
| 字 | 內積分數 | e 的次方 | softmax 機率 |
| the | 0.8×0.2 + 0.2×0.5 = 0.26 | 1.297 | 0.202 |
| cat | 0.8×0.1 + 0.2×(−0.4) = 0.00 | 1.000 | 0.156 |
| licked | 0.8×0.6 + 0.2×0.3 = 0.54 | 1.716 | 0.267 |
| its | 0.8×0.9 + 0.2×0.8 = 0.88 | 2.411 | 0.375 |
e 的次方總和 6.424,每格除以它就是機率。模型目前覺得 cat 旁邊最可能是 its(0.375),正確答案 licked 只有 0.267,下一段要算錯多少並修正。
V 和 U 各有多大?為什麼 U 裡標的不是「cat 的詞向量」?
p.83 的例子:V 是 10,000 × 300(每個字一列),U 是 300 × 10,000(每個字一行),各 300 萬個參數,一樣大。V 的一列=這個字當「中心字」的樣子;U 的一行=這個字當「被猜的鄰居」的樣子。老師特別澄清:p.88 標 "Output weight for cat" 的那一行不是 cat 的詞向量,而是「猜 cat 是不是鄰居」用的輸出權重(p.85 的 ability 同理)。訓練完一般只拿 V 當詞向量。
**注意:p.87 的 one-hot 只畫了 7 格,但字典有 8 個字(p.86),是投影片少畫一格。**
老師原話是什麼?
- 「所以當我看到 cat 的時候,我就 Output 第二個 Row」(1:23:25)
- 「他其實是對 cat 來講的 Output Weight」(1:23:57)
## [1:25:36](https://www.youtube.com/watch?v=g0QE6O17BWE&t=5136s) 算誤差:cross entropy 與反向傳播
前向算出機率後,要跟正確答案比。正確答案也寫成 one-hot(licked 那格是 1),用 cross entropy(交叉熵,量兩個機率分布差多遠)算出 loss,再用反向傳播調整 V 和 U。所有配對反覆訓練到 loss 降下來,把 V 拿出來就是詞向量。老師說這不是深度學習,只是一層的小模型;【老師強調】(1:27:09) 希望大家想通,為什麼這麼小的網路、只做「猜鄰居」,就能學出詞向量。作業一做的就是這件事,用現成套件就好,不用自己刻。
要先懂什麼?cross entropy 和反向傳播
- cross entropy:CE(ŷ, y) = −Σ yᵢ log(ŷᵢ)。y 是正確答案(one-hot),ŷ 是模型的猜測。y 只有一格是 1,所以整式只剩「−log(給正確答案的機率)」:機率 1 時 loss = 0,機率越小 loss 越大。
- 梯度(gradient):loss 對每個參數的斜率,告訴你參數往哪動 loss 會變小。
- 反向傳播:用連鎖律從輸出往回算每個參數的梯度,再讓參數往 loss 變小的方向走一小步(梯度下降)。
- softmax 接 cross entropy 時,loss 對每個分數的梯度剛好是 ŷ − y。
手算一次:投影片的 loss 是多少?更新一步會怎樣?
1. p.89 的配對是 (cat, licked)。ŷ = [0.1 0.0 0.1 0.3 0.2 0.1 0.1 0.1](依 p.86 順序 the、cat、licked、its、fur、truck、dog、moved),y = [0 0 1 0 0 0 0 0]。
2. CE = −(1 × log 0.1) = −ln 0.1 ≈ 2.30(用 log₂ 是 3.32)。其他格 y 是 0,都不算。
3. licked 的機率升到 0.6,loss ≈ 0.51;升到 1,loss = 0。
4. 梯度 ŷ − y = [0.1 0.0 −0.9 0.3 0.2 0.1 0.1 0.1]:licked 的分數要往上推,其他往下壓,尤其是猜錯的 its。
5. 上一段的小例子用學習率 0.5 更新一步:cat 的詞向量從 [0.8, 0.2] 變成約 [0.82, 0.14],licked 的機率從 0.267 升到 0.343,loss 從 1.32 降到 1.07。這就是 p.84 的三步:算機率、算誤差、更新參數,重複到最佳。
為什麼一層的網路就能學出字義?(老師要你想通的問題)
關鍵是 U 由所有字共用。假設 cat 和 dog 都常出現在 "the"、"licked"、"its" 旁邊,訓練時 cat 的詞向量被推向「跟 licked、its 的輸出向量內積要大」的方向,dog 也被推向同一個方向,最後兩者很像,cosine similarity(向量夾角的餘弦,越接近 1 越像)很高;鄰居是 "moved" 的 truck 被拉往別處,就離 cat 比較遠。
「猜鄰居」本身沒教字義,但上下文相似的字,向量會被擠到一起,這就是分布假說的數學版本。
所以對你的影響是:作業一找「最像的 5 個字」時,出來的是常出現在相同位置的字,不一定是同義字。想清楚這點,就是報告和考試要的 insight。
老師原話是什麼?
- 「它其實是一個非常小的模型」(1:26:37)
- 「但是希望你可以去了解說,為什麼人家這個一層的 NN 就可以搞這麼厲害的事情」(1:27:09)
- 「當然你不用自己刻這些模型」(1:27:59)
## Self-check
Q1. Write the probabilistic objectives of CBOW and Skip-gram with a window of size m. Which one predicts the context words from the center word?
**Answer**: CBOW: P(w_c | w_c−m, …, w_c−1, w_c+1, …, w_c+m), predicting the center word from its context. Skip-gram: P(w_c−m, …, w_c−1, w_c+1, …, w_c+m | w_c), predicting the context words from the center word. Skip-gram is the one that predicts the context.
中文重點:CBOW 用上下文猜中間字;Skip-gram 用中間字猜上下文。
Q2. Given the corpus "The cat licked its fur." and a context window size of 1, list the Skip-gram training word pairs. What changes if the window size is larger than 1?
**Answer**: (the, cat), (cat, the), (cat, licked), (licked, cat), (licked, its), (its, licked), (its, fur), (fur, its): 8 pairs. A larger window gives more word pairs (14 for size 2), but only two words are passed to the model at a time. The pairs come from unlabeled text automatically (self-supervised).
中文重點:掃一遍語料就自動造出配對;window 越大配對越多,但每次只送兩個字。
Q3. In word2vec's single-hidden-layer network, what do the matrices V and U store? Why is multiplying a one-hot vector by V called an embedding lookup?
**Answer**: The input-to-hidden matrix V (e.g., 10,000 × 300) has the target word embeddings vᵢ; the hidden-to-output matrix U (e.g., 300 × 10,000) has the output embeddings uᵢ. A one-hot vector is all zeros except a one at the word index, so multiplying it by V just selects that word's row; in practice we use the index to pick out the vector. After training, V is used as the word embeddings.
中文重點:V 存輸入詞向量(最後要的產品),U 存輸出詞向量;one-hot 乘 V 就是挑一列。
Q4. For the pair (cat, licked), the model outputs ŷ = [0.1, 0.0, 0.1, 0.3, 0.2, 0.1, 0.1, 0.1] over (the, cat, licked, its, fur, truck, dog, moved). Compute the cross-entropy loss and explain how the parameters are updated.
**Answer**: The target is y = [0, 0, 1, 0, 0, 0, 0, 0], so CE(ŷ, y) = −Σ yᵢ log(ŷᵢ) = −log(0.1) ≈ 2.30 (natural log). The error is backpropagated: the gradient on the output scores is ŷ − y, which raises the score of "licked" and lowers the others. V and U are updated, and the three steps repeat until optimized.
中文重點:loss 只看正確答案那格,−ln 0.1 ≈ 2.30;反向傳播把正確答案的機率推高。