[自然語言處理](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_v2 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)
跳過提示:(1:16:32–1:27:07) 老師在逐步推導 word2vec 的神經網路訓練細節(矩陣、forward pass、backpropagation),聽不懂可以直接跳到 [1:27:07](https://www.youtube.com/watch?v=g0QE6O17BWE&t=5227s),接著會用白話總結訓練完得到的字向量是什麼。
跳過的這段在做什麼:老師把 word2vec 的網路一層一層拆開,講一個字怎麼變成一排數字、怎麼算出「誰是它鄰居」的機率、猜錯了又怎麼修正。這些在下面「一層隱藏層的神經網路」到「算誤差」三段都有白話版,跳過也不會漏。
## 重點
- 人類的文字有機率規律,所以可以讓電腦練習「看到這個字,猜旁邊會出現什麼字」來學字義。unigram 不管字序,bigram 只看前一個字,word2vec 用視窗(window)看左右更多字。
- word2vec 有兩種學法:CBOW 用上下文猜中間的字,Skip-gram 用中間的字猜上下文(本課主講)。把語料掃一遍就能自己造出訓練配對,不用人工標註;老師強調這是 NLP 很常用的巧思。
- 模型只有一層隱藏層、兩個矩陣 V 和 U。訓練重複三步:算機率、用 cross entropy 算誤差、反向傳播更新。訓練完,V 的每一列就是一個字的詞向量。
## Exam-ready
讀公式前先認得幾個符號:P(A | B) 讀作「已知 B,出現 A 的機率」(第 1 週學過:[語言模型就是在算接龍的條件機率](https://app.notion.com/p/3e7fc631b03081f5bf0bf5126d7f9472))。∏ 是「全部乘起來」,Σ 是「全部加起來」。exp(x) 是 e(約 2.718)的 x 次方,用來把任何分數都變成正數;log 是它的反過來,這章只要記得「機率越小,−log 越大」。uᵀv 是兩個向量的內積,v、u 加下標指某一個字的向量。
- **Unary language model, P(w₁, …, wₙ) = ∏ᵢ P(wᵢ)**: "Ridiculous not to consider word order"(W1_NLP_brief p.81)
- 中文:unigram 假設字跟字互相獨立,一句話的機率=每個字的機率相乘。投影片說不考慮字序(word order)很荒謬:「貓舔毛」和「毛舔貓」機率一樣。
- **Binary language model, P(w₁, …, wₙ) = ∏ᵢ P(wᵢ | wᵢ₋₁)**: "Better but still limited by short context distance"(W1_NLP_brief p.81)
- 中文:bigram 讓每個字只看前一個字。比 unigram 好,但看的距離太短(short context distance),隔好幾個字的關係抓不到。
- **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)
- 中文:word2vec 用大小 m 的視窗(中心字左右各看 m 個字)拿更多上下文。CBOW(連續詞袋)用上下文猜中間字;Skip-gram 用中間字猜上下文,本課主講它。
- **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)
- 中文:視窗 1 時,每個字只跟緊鄰的字配對。視窗大於 1 時配對變多,但每次送進模型的仍只有兩個字(中心字+上下文字)。
- **Model parameters, V (vᵢ) and U (uᵢ)**: "word2vec uses a single hidden layer feedforward neural network" … "Input to hidden layer matrix has our target word embeddings" … "Hidden to output layer matrix has another set of word embeddings called output embeddings"(W1_NLP_brief p.83)
- 中文:word2vec 是只有一層隱藏層的前饋(feedforward,資料只往前流)神經網路。輸入到隱藏層的矩陣 V 存目標字的詞向量 vᵢ(我們要的);隱藏層到輸出的矩陣 U 存另一組輸出詞向量 uᵢ。
- **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)
- 中文:訓練重複三步:1. 算出機率;2. 算有多錯;3. 更新參數,直到最佳。同頁的三樣材料:機率模型、訓練配對、參數 V 和 U。
- **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)
- 中文:每個字編成 one-hot 向量(獨熱向量):長度=字典大小,只有這個字的編號位置是 1,其他全是 0。
- **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)
- 中文:one-hot 乘 V 等於取出 V 的某一列,所以實務上不做乘法,直接用字的編號去 V 拿那一列(查表)。
- **Probability over vocab, ŷᵢ = P(wᵢ | v_c, U) = exp(u_wᵢᵀ v_c) / Σⱼ₌₁ⱽ exp(u_wⱼᵀ v_c)**: "Our word vector does a dot product with every word’s output embedding, then applying softmax gives a probability distribution over the vocabulary"(W1_NLP_brief p.88); "This should be high for context words, low for others"(W1_NLP_brief p.85)
- 中文:中心字的詞向量跟每個字的輸出向量做內積(dot product,對應位置相乘再加總),再經過 softmax 變成整個字典上加起來=1 的機率。真正的鄰居要高,其他要低。
- **Loss function, CE(ŷ, y) = −Σᵢ₌₁ⱽ yᵢ log(ŷᵢ)**: "Cross entropy measures the distance between probability distributions"(W1_NLP_brief p.90)
- 中文:cross entropy(交叉熵)量「模型猜的機率分布」跟「正確答案」差多遠。答案是 one-hot 時只剩 −log(正確答案的機率):猜越準,loss 越小。
## [1:02:56](https://www.youtube.com/watch?v=g0QE6O17BWE&t=3776s) 課間 Slido 問答
老師先回答 Slido(課堂線上提問)。第一,BM25 只是 TF-IDF 的變形,設計靠 heuristic(經驗法則)。第二,詞向量通常幾百維,了不起到 1,000 維;以前的文件向量則是字典多大就幾維。第三,word vector 一個字只有一個向量,「吃 apple」和「Apple 出新手機」拿到同一個向量,所以後面需要會看上下文的 contextual vector(上下文相關向量,W2 p.39 起)。
(第 2 週學過:[TF-IDF](https://app.notion.com/p/3e6fc631b0308121891cc1705fe5be4a) 替每個字打分數,在這篇出現越多、在別篇越少見的字分數越高;把一篇文章寫成「字典每個字一格」的長向量,就是老師說的文件向量。[word embedding](https://app.notion.com/p/3e6fc631b03081b1aab8f5c4fc716850) 則是把每個字變成幾百個數字的短向量,意思相近的字數字也相近。)
生活比喻:word vector 像每人只有一張名片,到哪都拿同一張;contextual vector 是看場合換名片。
考試可能怎麼問:Why can't a word2vec vector tell "apple" the fruit from "Apple" the company?(為什麼 word2vec 分不出兩種 apple?)
所以對你的影響是:作業一找多義字(apple、bank)的相似字,兩種意思的鄰居會混在一起,可寫成報告的觀察。
注意:老師兩次口頭說預設 700 多維 (1:05:31、1:22:11),投影片 p.83 的例子是 300 維,以投影片為準。查證:Gensim 預設 100 維、Google News 預訓練向量 300 維;768 是 BERT-base 的長度(推測老師想到這個)。設一萬維「可以但是效果不會比較好」(1:22:19)。
(行政:NTU COOL 加選分批處理,下週還沒生效就再問。)
BM25 跟 TF-IDF 差在哪?
BM25 在 TF-IDF 上多兩個調整:詞頻會飽和(出現 20 次和 21 次幾乎沒差,參數 k1);長文件要扣一點分(參數 b)。老師說式子不用細講,知道是 TF-IDF 的變形就好 (1:03:42)。
老師原話是什麼?
- 「他就是一個變形的 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)和機率。所以讓電腦從大量文章學會「看到這幾個字,下一個字是什麼」,學到的東西就某種程度代表了字義。
生活比喻:像手機輸入法,打「早」就建議「安」,因為它從大家的打字習慣學到了機率。
考試可能怎麼問:Why can we model language with probabilities?(為什麼可以用機率描述語言?)
下面的進階摺疊在算「亂打字要多幸運才會碰巧打對」:連三個字母的 cat 都要一萬多隻猴子,說明亂打出來的東西幾乎沒有意義,人類文字裡的規律才是值得電腦去學的。
要幾隻猴子才打得出 "cat"?(進階,可跳過)
26 個字母亂按,打出 "cat" 的機率 = (1/26)³ = 1/17,576。老師說「把期望值變成 1」:N × 1/17,576 = 1,所以要 17,576 隻。語言模型要學的,正是人類文字「不平均」的地方:"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,算「一串字有多像人話」的模型)有粗有細。unigram(投影片寫 unary language model)假設字跟字完全獨立,一句話的機率就是每個字的機率相乘,投影片說不管字序「很荒謬」。bigram(binary language model)讓每個字只看前一個字,好一些,但看得太近。再延伸就是 n-gram(第 06 章細講)。GPT 一次產生一個 token(詞元),挑機率高的下一個字,精神也一樣。
生活比喻:unigram 像把一句話的字倒進袋子搖一搖,只數每個字出現幾次;bigram 像文字接龍,只看上一個字。
下圖比的是「每種模型看多少上下文」,越往右看得越多:
```mermaid
flowchart LR
A["unigram:不看前文"] --> B["bigram:看前 1 個字"]
B --> C["n-gram:看前 n−1 個字"]
C --> D["word2vec:看左右各 m 個字"]
```
最後一格不同:word2vec 的視窗前後都看。
考試可能怎麼問:Why is the unary language model "ridiculous", and what does the binary model improve?(unigram 哪裡荒謬?bigram 改進了什麼?)
下面的進階摺疊用三句話的小語料實際算一次,想讓你看到兩件事:unigram 把字序打亂,機率也不變;bigram 會把不通順的字序算成 0。
用三句話的小語料算一次(進階,可跳過)
語料:the cat licked its fur/the dog licked its paw/the cat saw the dog,共 15 個字。bigram 的 P(B | A) = count(A B) ÷ count(A),句首記成 START。
- unigram:P(the cat licked) = 4/15 × 2/15 × 2/15 ≈ 0.0047,打亂成 cat the licked 也一樣。
- bigram:3/3 × 2/4 × 1/2 = 0.25;cat the licked 因為 P(cat | START) = 0,整串是 0。
老師原話是什麼?
- 「字跟字之間是完全獨立的」(1:09:53)
- 「就是我下一個字只跟前一個字有關」(1:10:15)
## [1:11:20](https://www.youtube.com/watch?v=g0QE6O17BWE&t=4280s) CBOW 與 Skip-gram
word2vec 論文提出兩種學法,都用大小 m 的視窗取上下文。CBOW(Continuous Bag of Words,連續詞袋)像克漏字:看前後文,猜中間的字。Skip-gram 反過來:看中間的字,猜前後會出現哪些字。投影片只講 Skip-gram;老師也說 CBOW 訓練起來比較不直覺,一般用 Skip-gram。原作者的經驗是 CBOW 訓練快,Skip-gram 慢一些但罕見字學得比較好(Google word2vec 專案說明)。
(第 2 週學過:[詞袋](https://app.notion.com/p/3e6fc631b03081b1aab8f5c4fc716850)(bag of words)是只數每個字出現幾次、不管順序的表示法。CBOW 名字裡的「詞袋」也是這個意思:上下文那幾個字不管順序,混在一起當輸入。)
生活比喻:CBOW 像考卷的克漏字,看整句填空格;Skip-gram 像聯想遊戲,聽到「舔」就猜旁邊有「貓」「毛」。
下圖用投影片的句子 "The cat licked its fur"(視窗 m = 2)對照兩種方向:
```mermaid
flowchart LR
A["上下文:the、cat、its、fur"] -->|"CBOW"| B["猜中間字:licked"]
C["中間字:licked"] -->|"Skip-gram"| D["猜上下文:the、cat、its、fur"]
```
兩者用同一批字,只是箭頭方向相反。
考試可能怎麼問:Compare CBOW and Skip-gram: what is the input and what is predicted?(比較兩者的輸入和要猜的東西。)
作業一用 Gensim 時要注意什麼?
Gensim(作業一用的詞向量套件)的 Word2Vec 預設 sg=0,也就是 CBOW;要用 Skip-gram 必須設 sg=1。其他預設 window=5、vector_size=100,報告要寫清楚設多少、為什麼([Gensim 文件](https://radimrehurek.com/gensim/models/word2vec.html))。
老師原話是什麼?
- 「CBOW 其實是比較有點像克漏字的」(1:11:48)
- 「你看到這個字的時候,你前面聯想到什麼,後面聯想到什麼」(1:12:33)
## [1:13:00](https://www.youtube.com/watch?v=g0QE6O17BWE&t=4380s) 從語料自己造訓練資料
Skip-gram 需要「輸入一個字、答案是另一個字」的訓練資料,但沒人幫忙標。做法用文字說:
1. 每個字輪流當中心字(center word)。
2. 視窗內的每個字都是它的答案(context word),各配成一對。
3. 整份語料掃完,所有配對就是訓練資料;視窗越大,配對越多。
【老師強調】(1:13:44) 這一步看似理所當然,其實是訓練上的巧思:不靠人工標註,從沒標註的語料自動產生監督式學習的資料。老師舉例:廠商只標十筆資料就要很厲害的模型,不可能;請語言學家標「這個字前後該是什麼」更不可能。這叫 self-supervised learning(自監督學習),後來 BERT 的遮字訓練(masked language model)也是同一招。
監督式學習(supervised learning)是「每一題都附標準答案」的學法,像有解答的習題本,麻煩在答案要人來寫。自監督學習則是讓答案從資料本身產生,不用人寫。
生活比喻:沒人出題,就拿一本小說自己塗掉一些字再猜回來,答案就在原文裡。
下圖是投影片的例子:左邊一句話,掃過去就變成右邊的配對表。

圖上重點:1. Skip-Gram: Training Data=Skip-gram 的訓練資料;Corpus=語料(一大堆文章)。2. Context window size = 1=視窗大小 1,中心字左右各看 1 個字。3. 右邊表格 Training Word Pairs=訓練配對,Center=中心字(題目),Context=上下文字(答案)。4. What if context size > 1?=視窗大於 1 會怎樣?More word pairs=配對變多;Only pass two words to the model at a time=每次只送兩個字進模型。這張圖在講:把一句話從頭掃到尾,就自動變成一張「題目→答案」的題庫。
每一列只有兩個字,視窗再大也一樣,這就是 "Only pass two words to the model at a time"。
考試可能怎麼問:How does Skip-gram get training data without human labels? Why is this important?(怎麼不靠人工標註拿到資料?為什麼重要?)
注意:老師口頭說 unsupervised training (1:15:54),W2 投影片 p.62 寫 self-supervised training,以投影片為準。所以對你的影響是:作業一用 Wikipedia 訓練詞向量,不用準備任何標註。
下面的進階摺疊在數「一句話能造出幾筆訓練資料」,結論是視窗從 1 變成 2,兩句話的配對從 12 筆變成 20 筆,資料量自己就變多了。
一句話能造出幾組配對?(進階,可跳過)
p.82 的兩句話分開掃,window = 1:the → cat;cat → the、licked;licked → cat、its;its → licked、fur;fur → its,共 8 組;加第二句 4 組,合計 12 組。window = 2 時 licked 的答案變成 the、cat、its、fur,兩句合計 14 + 6 = 20 組。
老師原話是什麼?
- 「其實你會覺得很 trivial,但是這個動作其實是一個非常,你說有創意嗎,或是說一個人類的一個,我覺得是一個訓練上的一種巧思」(1:13:44)
- 「自動化的方式,產生一個這樣的監督式,這樣的學習,這其實都是後來,一個在 NLP 非常常用的概念」(1:15:28)
## [1:16:18](https://www.youtube.com/watch?v=g0QE6O17BWE&t=4578s) 一層隱藏層的神經網路
word2vec 只是一層隱藏層的前饋神經網路(那時還沒有深度學習),所以只有兩個權重矩陣:V 接在輸入和隱藏層之間,存我們要的詞向量;U 接在隱藏層和輸出之間,是另一組輸出詞向量。投影片的例子是 10,000 字的字典、300 個隱藏神經元(見下圖)。老師提醒,這背後是很強的假設:「猜得準鄰居,就代表懂字義」;後來 BERT 做克漏字學整句的表示,也是這個味道。
矩陣(matrix)就是一張數字表格。V 有 10,000 列(橫排,一個字一列)、300 行(直排),所以每個字用 300 個數字描述,這就叫「300 維的詞向量」(第 2 週學過:[word embedding](https://app.notion.com/p/3e6fc631b03081b1aab8f5c4fc716850) 就是把字變成這樣一排短短的數字)。
生活比喻:派對上有個人,身邊的話題總是「病人」「手術」,你大概猜得到他是醫生。字的意思就藏在它常跟誰一起出現(第 02 章的分布假說)。
下圖是 p.83 的網路,由左到右是資料流動的方向:

圖上重點:1. word2vec uses a single hidden layer feedforward neural network=word2vec 用只有一層隱藏層、資料只往前流的神經網路。2. Input Vector=輸入向量,10,000 positions(10,000 格)裡只有 "ants" 那個字的位置是 1,其他是 0(one-hot)。3. Hidden Layer Linear Neurons=隱藏層,300 個只做乘法加總的神經元;Output Layer Softmax Classifier=輸出層,10,000 個神經元用 softmax 變成機率,每格是「隨機挑一個附近的字,剛好是 abandon、ability…的機率」。4. 右邊兩句:輸入到隱藏層的矩陣存我們要的目標詞向量 vᵢ;隱藏層到輸出的矩陣存另一組輸出詞向量 uᵢ。這張圖在講:一個字從左邊進來,經過兩個矩陣,右邊吐出「字典裡每個字是它鄰居的機率」。
中間那 300 個數字,就是模型替輸入的字記下的特徵;訓練完,把 V 整個拿出來就是詞向量表。
考試可能怎麼問:Describe the word2vec network. Which matrix holds the word embeddings?(描述 word2vec 的網路;詞向量存在哪個矩陣?)
注意:老師說不會講神經網路,要自己補 (1:16:41);有同學問沒學過機器學習會不會辛苦,老師覺得還好,推薦 p.83 附的 [McCormick 教學](http://mccormickml.com/2016/04/19/word2vec-tutorial-the-skip-gram-model/)。
要先懂什麼?神經網路最少要知道的事
- 神經元(neuron):把每個輸入乘上權重(weight)再加總。一整層一起算就是「輸入向量 × 權重矩陣」,所以一層=一個矩陣。word2vec 的隱藏層是純線性,只有輸出層用 softmax。
- 前向計算(forward pass):從輸入算到輸出,得到模型的猜測。
- 訓練:猜測跟答案比出誤差(loss),用反向傳播(backpropagation,從輸出往回算每個權重該往哪調)修正權重。
- 圖解版:[The Illustrated Word2vec](https://jalammar.github.io/illustrated-word2vec/)。
老師原話是什麼?
- 「的確我不會講 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 乘 V 只是「挑出 V 的一列」,所以直接查表;U 裡每個字的輸出向量,負責算「這個字是不是鄰居」的分數。
(第 2 週學過:[內積](https://app.notion.com/p/3e6fc631b0308121891cc1705fe5be4a)=兩個向量對應位置相乘再加總。兩個向量方向越接近,內積越大,所以內積可以當「像不像」的分數。)
生活比喻:查表像知道頁碼就直接翻過去,不用一頁頁比對;softmax 像把得票數換成百分比,加起來剛好 100%。
下圖是 cat 進入網路後的五個步驟:
```mermaid
flowchart LR
A["cat 的 one-hot:長度 8,第 2 格是 1"] --> B["查表:取出 V 的第 2 列=cat 的詞向量"]
B --> C["跟 U 裡每個字的輸出向量做內積=8 個分數"]
C --> D["softmax:分數變成加起來=1 的機率"]
D --> E["真正的鄰居 licked 要高,其他要低"]
```
這就是 p.85 的 (1) 輸入向量選出詞向量、(2) 乘輸出矩陣再做 softmax。
考試可能怎麼問:What is an embedding lookup, and why don't we multiply the one-hot vector by V?(什麼是查表?為什麼不做乘法?)
下面第一個進階摺疊用很小的數字實際走一次:算出來的是「模型目前覺得每個字是 cat 鄰居的機率」。結果它猜錯了,正確答案 licked 的機率不夠高,這就是下一段要修正的地方。
用 4 個字、2 維算一次(進階,可跳過)
字典縮成 4 個字。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)。
1. 內積:the 0.26、cat 0.00、licked 0.54(= 0.8×0.6 + 0.2×0.3)、its 0.88。
2. softmax(取 e 的次方再除以總和 6.424):the 0.202、cat 0.156、licked 0.267、its 0.375。
模型最看好 its,正確答案 licked 只有 0.267,下一段修正。
老師特別澄清的是什麼?V 和 U 各有多大?
V 的一列=這個字當「中心字」的樣子;U 的一行=這個字當「被猜的鄰居」的樣子。老師澄清:p.88 的 "Output weight for cat" 不是 cat 的輸入詞向量,而是「猜 cat 是不是鄰居」用的輸出權重(p.85 的 ability 同理)。
注意: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。老師說這不是深度學習,只是一層的小模型;【老師強調】(1:27:09) 希望大家想通,為什麼這麼小的網路、只做「猜鄰居」,就能學出詞向量。作業一做的就是這件事,用現成套件就好,不用自己刻。
log 在這裡的作用:正確答案拿到的機率越接近 1,−log 越接近 0,幾乎不罰;越接近 0,−log 越大,重罰。反向傳播靠的是梯度(人工智慧導論第 3 週學過:[梯度](https://app.notion.com/p/3e6fc631b030812a99d4eb793b437690)指出「往哪個方向調,數值變化最快」),這裡朝讓 loss 下降最快的方向調,所以叫梯度下降。
生活比喻:像練射飛鏢,每次看偏了多少(cross entropy),就往反方向修正手勢(反向傳播),直到夠準。
下圖是 p.84 的三步訓練循環:
```mermaid
flowchart LR
A["1. 算機率:中心字經過 V、U 和 softmax"] --> B["2. 算誤差:跟答案算 cross entropy"]
B --> C["3. 更新:反向傳播調整 V 和 U"]
C -->|"換下一筆配對"| A
C -->|"loss 夠低"| D["把 V 拿出來=詞向量"]
```
一筆配對只讓參數動一點點,靠大量配對反覆修正,V 才有意義。
考試可能怎麼問:Describe the three-step training process of Skip-gram. Why can a one-layer network learn word meaning?(描述三步訓練;為什麼一層網路學得到字義?)
最後一個進階摺疊「投影片的 loss 是多少?」在算:模型給正確答案 licked 的機率只有 0.1 時 loss 有多大,以及更新一次之後,licked 的機率真的變高、loss 真的變小。
為什麼一層的網路就能學出字義?(老師要你想通的問題)
關鍵是 U 由所有字共用。cat 和 dog 都常出現在 "licked"、"its" 旁邊,訓練時兩者的詞向量都被推向「跟這些字的輸出向量內積要大」的同一方向,最後很像,cosine similarity(向量夾角的餘弦,越接近 1 越像)很高;鄰居是 "moved" 的 truck 被拉往別處。「猜鄰居」沒直接教字義,但上下文相似的字會被擠到一起,這就是分布假說的數學版本。
所以對你的影響是:作業一找「最像的 5 個字」時,出來的是常出現在相同位置的字,不一定是同義字。
投影片的 loss 是多少?(進階,可跳過)
p.89–90:配對 (cat, licked),ŷ = [0.1 0.0 0.1 0.3 0.2 0.1 0.1 0.1],y = [0 0 1 0 0 0 0 0]。
1. y 只有 licked 那格是 1,所以 CE = −log 0.1 ≈ 2.30(自然對數);licked 升到 0.6 時 loss ≈ 0.51,升到 1 時是 0。
2. 每個分數該調的方向是 ŷ − y:licked 那格 −0.9,往上推;其他往下壓,尤其是猜錯的 its。
3. 上一段的小例子把 V 和 U 一起更新一步(學習率 0.5),licked 的機率 0.267 → 0.343,loss 1.32 → 1.07。
老師原話是什麼?
- 「它其實是一個非常小的模型」(1:26:37)
- 「但是希望你可以去了解說,為什麼人家這個一層的 NN 就可以搞這麼厲害的事情」(1:27:09)
- 「當然你不用自己刻這些模型」(1:27:59)
## 補充:老師直接用、沒解釋的詞
這一章老師順口用了 token、decode、收斂三個詞,後面幾週會一直出現,這裡補白話。
token、decode、收斂是什麼?
- token(詞元):模型讀文字的最小單位,不一定是一個完整的字。例:unbelievable 可能被切成 un、believ、able 三個 token;中文「自然語言」可能切成「自然」「語言」。
- decode(解碼):模型一次吐一個 token 的過程:算出下一個 token 的機率 → 挑一個接上去 → 把它當成新的前文,再算下一個。老師講 bigram 時說 GPT 產生文字就是這樣:「GPT要decode下一個token」(1:11:06),之後算 perplexity「其實精神上也是這樣」(1:10:58)。
- 收斂(converge):訓練一直更新參數,直到 loss 不再明顯下降,就叫收斂,可以停了。老師講 word2vec 訓練時說「收斂完之後loss變低了之後」(1:21:15),模型就能準確猜出鄰居。
所以對你的影響是:以前數 n-gram 次數、現在 GPT 挑下一個 token,做的是同一件事:看前文,算下一個字的機率。考試寫 insight 時,可以用這條線把語言模型串起來(我的判斷)。
## Self-check
Q1. What is the difference between CBOW and Skip-gram? Write their probabilistic objectives with a window of size m.(中文:CBOW 和 Skip-gram 差在哪?寫出視窗 m 時的機率式。)
**Answer**: CBOW predicts the center word from the 2m surrounding words: P(w_c | w_c−m, …, w_c+m). Skip-gram predicts the surrounding words from the center word: P(w_c−m, …, w_c+m | w_c). The slides focus on Skip-gram.
中文:CBOW 拿中心字左右各 m 個字當輸入猜中間字,機率式是「已知上下文,中心字的機率」。Skip-gram 反過來,拿中心字猜左右各 m 個字,機率式是「已知中心字,上下文的機率」。投影片主講 Skip-gram。
Q2. Given "The cat licked its fur." and a context window size of 1, list the Skip-gram training pairs. What changes with a larger window, and why is this step a clever idea?(中文:用視窗 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 pairs (14 for size 2), but only two words are passed to the model at a time. The pairs come automatically from unlabeled text (self-supervised), so no human annotation is needed; BERT's masked language model uses the same idea.
中文:每個字當中心字,跟左右緊鄰的字各配一對,共 8 組。視窗 2 時增加到 14 組,但每次仍只送兩個字進模型。巧妙在於答案直接來自原文,電腦自己就能從沒標註的語料造出大量「題目+答案」,不用請人標,這就是自監督學習;BERT 的遮字訓練也是同一招。
Q3. What do the matrices V and U store in word2vec? Why is multiplying a one-hot vector by V called an embedding lookup?(中文:V 和 U 各存什麼?為什麼 one-hot 乘 V 叫查表?)
**Answer**: V (input to hidden, e.g., 10,000 × 300) has the target word embeddings vᵢ; U (hidden to output) 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 只有一格是 1,乘 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, explain the update, and explain why such a small network learns word meaning.(中文:算 cross entropy loss、說明怎麼更新,以及為什麼小網路學得到字義。)
**Answer**: y = [0, 0, 1, 0, 0, 0, 0, 0], so CE = −Σ yᵢ log(ŷᵢ) = −log(0.1) ≈ 2.30. Backpropagation uses the gradient ŷ − y to raise the score of "licked" and lower the others, updating V and U until optimized. Because U is shared, words with similar contexts are pushed the same way, so their rows in V become similar (distributional hypothesis).
中文:答案只有 licked 那格是 1,所以 loss 只看模型給 licked 的機率:−ln 0.1 ≈ 2.30。反向傳播把 licked 的分數往上推、其他往下壓,更新 V 和 U,重複到最佳。小網路學得到字義,是因為所有字共用 U:常出現在相同上下文的字(如 cat 和 dog)被推往同一方向,詞向量就變得很像,這就是分布假說。
讀完了嗎?下一章:[04 GloVe、FastText 與向量檢索(1:28–1:46)](https://app.notion.com/p/3e6fc631b03081c5b27ce6cbad0d3d3a)|回到週頁:[W3(9/24)](https://app.notion.com/p/3e6fc631b03081ff9776f36fab3e6e50)