NLP 作業一|一條龍說明(從看懂到交出去)
2026-10-05|根據在你電腦上實際跑完的繳交版筆記本寫成,程式與報告經三輪、共 8 位獨立審查員對照老師原始資料檢查;這份說明另依教學文件規範審查|清大高宏宇老師《自然語言處理》115-1(TAICA)
一句話結論
這份作業就是「讓電腦讀文章、自己編一本字典,再考它『國王之於女王,等於男人之於__』」。
全文用一個比喻貫穿:電腦讀的文章叫教材 → 電腦自己編出一本字典(每個字查得到一串數字,叫詞向量)→ 拿考卷(19,544 題類比題)考這本字典。 我在你的電腦上完整做了一次:現成的 GloVe 字典考 63.11%,自己用 20% 維基百科訓練的字典考 48.39%。 這份文件把每一步「在做什麼、為什麼、結果怎麼看、報告怎麼寫、考試可能怎麼問」全部用白話講一遍。
這份文件怎麼用(三個階段)
| 階段 | 做什麼 | 讀哪幾節 |
|---|---|---|
| 1. 看懂框架 | 作業在幹嘛、我做了什麼、整門課的邏輯、核心觀念 | 第 0 節、用語表、第 1 節、我做了什麼、邏輯框架、課堂補充 |
| 2. 看實作 | 一步一步看怎麼做、結果是什麼、為什麼是這樣 | 第 2~12 節,對照筆記本 |
| 3. 看結論、交出去 | 總結論;照實補上你做的部分;打包上傳 | 總結論、第 13、15 節;考前讀第 14 節 |
示範的成果在哪裡
| 東西 | 位置 |
|---|---|
| 繳交版筆記本(全部執行結果+報告) | HW1\示範實作\NLP_HW1_submission_draft.ipynb(用 VS Code 或 Jupyter 打開;交之前改檔名) |
| 套件清單 | HW1\示範實作\requirements.txt |
| 上一份「作業介紹」(規定、扣分、說法打架、繳交檢查清單) | HW1\HW1_作業介紹.html |
① 程式和報告是 Claude 做的,報告第 6 題已經照實寫出來;最後一行「你做了什麼」要你自己照實填(第 13 節)。
② 這份筆記本和報告不要給任何同學,兩份太像雙方 −100。
③ 考試是閉書、考作業的過程,所以這份文件一定要讀懂。
0 全貌:整份作業一張圖看完
結論:作業分三段:讀考卷 → 借別人的字典考試 → 自己編字典再考一次。報告的 6 題,其實是在問「字典好不好,取決於什麼」。
流程圖
所有實驗的成績總表
表裡的名詞(語意類、語法類、維基對照組⋯)先不用懂,用語表和第 1 節會解釋。現在只看「哪一列最高、哪一列最低」。數字都是正確率(%)。
| 字典 | 讀了什麼教材 | 整體 | 語意類 | 語法類 | 在哪一節 |
|---|---|---|---|---|---|
| GloVe 字典(現成) | 維基+新聞約 60 億字 | 63.11 | 65.34 | 61.26 | 第 4 節 |
| Wiki 20% 字典 | 維基 6.66 億字 | 48.39 | 56.70 | 41.48 | 第 7 節 |
| Wiki 10% | 維基 3.33 億字 | 47.15 | 55.60 | 40.13 | 第 9 節 |
| Wiki 5%(基準設定) | 維基 1.66 億字 | 46.12 | 55.35 | 38.45 | 第 9 節 |
| 維基對照組 | 維基 7,292 萬字 | 41.46 | 45.77 | 37.87 | 第 10 節 |
| 論壇 | 卡達論壇 7,292 萬字 | 25.78 | 12.84 | 36.53 | 第 10 節 |
進階:加分實驗的 6 列(第 12 節才會講)
| 字典 | 讀了什麼教材 | 整體 | 語意類 | 語法類 | 在哪一節 |
|---|---|---|---|---|---|
| Wiki 5% 換種子(共 4 次,含原本的 42) | 同 5% | 46.05~47.10 | 54.18~55.98 | 38.45~39.72 | 第 12 節 ① |
| Wiki 5% 刪停用詞 | 同 5% | 45.25 | 55.41 | 36.81 | 第 12 節 ② |
| Wiki 5% CBOW | 同 5% | 52.58 | 58.60 | 47.58 | 第 12 節 ③ |
| Wiki 5% window=10 | 同 5% | 41.75 | 51.22 | 33.87 | 第 12 節 ③ |
| Wiki 5% 300 維 | 同 5% | 57.44 | 68.54 | 48.22 | 第 12 節 ③ |
| Wiki 20% 字典換 3CosMul 公式 | 同 20% | 44.66 | 54.12 | 36.80 | 第 12 節 ⑥ |
每一部分的配分與難度
| 部分 | 配分 | 難不難 | 花最多時間的是 |
|---|---|---|---|
| TODO1~3 | 20% | 簡單,照模板填 | 下載 GloVe |
| TODO4~7 | 35% | 中等,要注意記憶體 | 電腦訓練(TODO5 整格約 42 分鐘,其中訓練 37.9 分鐘) |
| 報告 6 題 | 45% | 最花腦力 | 想原因、寫解釋 |
用語表:同一個東西,全文只用一個名字
結論:這份說明裡,每個概念只有一個名字。看到不懂的詞,回來這張表查。
為什麼要有這張表:課本、老師、程式碼對同一件事常常有好幾種叫法(例如「模型」「字典」「my_wv」都是同一個東西)。叫法一多,讀的人會以為是不同的東西。所以這裡先把名字定死。
先記住全文的比喻
教材(電腦讀的文章)→ 電腦自己編出一本字典(每個字一串數字)→ 拿考卷(19,544 題類比題)考這本字典。
教材、字典、考卷
| 全文只用這個名字 | 英文/程式裡的叫法 | 一句白話(照做的意思) |
|---|---|---|
| 教材 | corpus(語料) | 拿來訓練字典的文章。例:維基百科抽 20%。 |
| 教材字數 | tokens | 教材裡一共有幾個字。例:Wiki 20% 教材 6.66 億字。 |
| 詞向量 | word embedding、vector | 一個字對應的一串數字(本作業是 100 個數字)。 |
| 字典 | model、model、my_wv | 一整組訓練好的詞向量:查一個字,拿到它的詞向量。本文主要有兩本:GloVe 字典(別人做好的)和 Wiki 20% 字典(我們用 20% 維基訓練的)。 |
| 字典收的字 | vocabulary(vocab) | 字典裡有詞向量的那些字。本作業最多收 30 萬個。 |
| 收錄門檻 | min_count | 一個字在教材裡出現至少幾次,才收進字典。程式設 5,但 gensim 會自動調高(第 6 節講為什麼)。 |
| 查不到的字(OOV) | out-of-vocabulary | 字典沒收的字。題目只要有一個字查不到,那題直接算答錯。 |
| 考卷 | Google analogy 資料集 | 19,544 題類比題。 |
| 類比題 | analogy question | 給 a、b、c 三個字,叫電腦猜第四個字 d。例:a=king、b=queen、c=man,d 應該是 woman。 |
| 語意類/語法類 | Semantic/Syntactic | 考卷的兩大類。語意類考「意思的關係」(首都、貨幣、家人);語法類考「字形變化」(比較級、過去式)。 |
| 小類 | SubCategory | 大類底下再分 14 小類,名字見下一張表。 |
成績怎麼算
| 全文只用這個名字 | 英文 | 一句白話 |
|---|---|---|
| 正確率 | accuracy | 答對題數 ÷ 總題數 × 100%。例(假設的整數):100 題答對 48 題 → 48%。 |
| 百分點 | percentage point | 兩個正確率直接相減。46.12% → 48.39% 是「多 2.27 個百分點」。 |
| 配分 | — | 作業每一部分佔總成績多少。例:報告第 3 題配分 15%。跟正確率是兩回事。 |
| 相似度 | cosine similarity | 兩個詞向量方向有多一致,介於 −1~1。第 1 節有手算例子。 |
| b − a + c | 3CosAdd | 答類比題的公式:用 b 的詞向量減 a、加 c,算出一個點,再找最像的字。 |
| 前 k 名正確率 | top-k accuracy | 電腦列出最像的 k 個字,正確答案在裡面就算對。 |
| 覆蓋率 | coverage | 某小類的題目裡,「四個字全部查得到」的題數 ÷ 該小類題數。 |
| 雜訊 | noise | 教材和設定完全一樣,只換亂數種子(42、1、2、3)各訓練一次,共 4 次;4 個正確率的「最高 − 最低」。 |
| 超過雜訊 | beyond noise | 兩個結果的差(不管正負)大於雜訊,才說「真的有差」。 |
| 明顯超過 | — | 差距至少是雜訊的 1.5 倍。只超過一點點(1~1.5 倍)的,本文寫「超過,只當參考」。 |
訓練時的用語
| 全文只用這個名字 | 英文 | 一句白話 |
|---|---|---|
| 中心字 | center word | 訓練時正在看的那個字。 |
| 前後文的字 | context words | 中心字前後各 window 個字以內的字(作業設 5)。 |
| 鄰居 | nearest neighbors | 只用在一個意思:在字典裡跟某個字相似度最高的前幾個字(第 4 題用)。不是前後文的字。 |
| 維基對照組 | Wiki control (same size) | 從維基切出跟論壇教材一樣多字(約 7,292 萬字)的教材,用來公平比較。 |
| 基準設定 | baseline | 第 5 題所有實驗的起點:5% 維基、Skip-gram、window 5、100 維、種子 42。 |
| 壓成 2 維 | t-SNE、PCA | 為了畫圖,把 100 個數字壓成 2 個。 |
| 人工詞庫(WordNet) | WordNet | 人手編的同義字、上下位字詞庫。叫「詞庫」是為了不跟「字典」撞名。 |
| In [n] | cell execution count | Jupyter 畫面左邊的編號。本文找筆記本的格子一律用它。 |
14 個小類的固定名字
| 大類 | 小類(括號是筆記本上的英文) |
|---|---|
| 語意類(5 個) | 常見國家首都(capital-common-countries)、全世界首都(capital-world)、貨幣(currency)、美國城市在哪州(city-in-state)、家人/性別(family) |
| 語法類(9 個) | 形容詞→副詞(gram1)、反義字首(gram2)、比較級(gram3)、最高級(gram4)、-ing(gram5)、國名→國籍(gram6)、過去式(gram7)、名詞複數(gram8)、動詞第三人稱(gram9) |
注意:「國名→國籍」(例 China → Chinese)雖然跟國家有關,但它考的是字形變化,所以屬於語法類。
加分實驗的編號(第 12 節)
| 本文編號 | 做什麼 | 筆記本 |
|---|---|---|
| 實驗 ① | 先量雜訊(換種子) | 第 5 題 (a),In [34] |
| 實驗 ② | 刪停用詞 | 第 5 題 (b),In [35] |
| 實驗 ③ | CBOW、window、維度 | 第 5 題 (c),In [36] |
| 實驗 ④ | 前 k 名正確率 | 第 5 題 (d),In [37] |
| 實驗 ⑤ | 錯誤分析 | 第 5 題 (e),In [38] |
| 實驗 ⑥ | 換 3CosMul 公式 | 第 5 題 (f),In [39] |
| 實驗 ⑦ | PCA 和 t-SNE 比較 | 第 5 題 (g),In [40] |
| 實驗 ⑧ | 覆蓋率 | 第 5 題 (h),In [41] |
1 開始之前:先懂 4 個觀念
結論:整份作業只建立在 4 個觀念上。這 4 個懂了,後面每一步都只是「把觀念寫成程式」。考試也最可能從這裡出題。
為什麼要先學這 4 個:後面每一節都會用到「詞向量」「相似度」「b − a + c」「前後文」這四個詞。先用小例子手算一次,後面看到 19,544 題的正確率才知道它是怎麼來的。
觀念 1:電腦只看得懂數字,所以要把字變成一串數字
電腦不知道 cat 是什麼。它只會做數學。
所以我們幫每個英文字準備一串數字,例如 100 個數字。這串數字叫 詞向量(word embedding)。
可以把這 100 個數字想成這個字在「意思地圖」上的座標。平常的地圖只有 2 個數字(經度、緯度),這張地圖有 100 個數字,所以人畫不出來,但電腦算得出來。(「座標」只是比喻,後面一律叫詞向量。)
把每個字的詞向量收集起來,就是一本字典:查一個字,得到它的詞向量。
觀念 2:詞向量方向越一致,意思越像
一份好的字典,會把 cat(貓)和 dog(狗)放得很近,把 cat 和 truck(卡車)放得很遠。
「多近」用相似度(cosine similarity,餘弦相似度)來量。它看的是兩個詞向量的「方向」有多一致。
| 相似度 | 意思 |
|---|---|
| 接近 1 | 方向幾乎一樣 → 很像 |
| 接近 0 | 方向垂直 → 沒什麼關係 |
| 負的 | 方向相反(注意:方向相反 ≠ 意思相反。反義詞的相似度可能很高,例如 good/bad 在 Wiki 20% 字典裡是 0.70,In [33],第 11 節) |
手算一次相似度(拿紙筆跟著算)
前提:真的詞向量有 100 個數字,算不動。所以這裡假設每個字只有 2 個數字(我自己編的):cat=(3, 4)、dog=(4, 3)、truck=(4, −3)。步驟跟 100 個數字時完全一樣,只是數字少。
第 1 小步:乘起來再加總(叫「內積」)。兩個字的第 1 個數字相乘,加上第 2 個數字相乘。
cat 和 dog: 3×4 + 4×3 = 12 + 12 = 24
cat 和 truck:3×4 + 4×(−3) = 12 − 12 = 0
第 2 小步:算每個字的「長度」。兩個數字各自平方、加起來、開根號。
cat: √(3×3 + 4×4) = √25 = 5
dog: √(4×4 + 3×3) = √25 = 5
truck:√(4×4 + 3×3) = √25 = 5
第 3 小步:內積 ÷(兩個長度相乘)。
相似度(cat, dog) = 24 ÷ (5×5) = 0.96 → 很像
相似度(cat, truck)= 0 ÷ (5×5) = 0 → 沒關係
為什麼要除以長度:只想比「方向」,不想讓「數字比較大的字」佔便宜。除掉長度之後,結果一定在 −1~1 之間。
在相似度、鄰居、b − a + c 這些地方,本文說的「近」「最像」都是指方向(夾角小),不是兩點之間的距離。(例外:看 t-SNE/PCA 圖時——第 4、7 節、第 12 節實驗 ⑦、總結論第 1 條、第 14 節 Q17——說的「近」「黏在一起」「貼得很緊」,是圖上兩點的距離。)所以下面手算時,★ 跟 woman 位置不完全一樣,但方向幾乎一樣,相似度就接近 1。
這幾個數字由 make_toy_figures.py 算出來核對過。老師上課講的是同一個公式(W2 02:00:40「兩個向量之間算 cos 就是這個公式」)。
進階:程式怎麼寫
import numpy as np
cat, dog = np.array([3, 4]), np.array([4, 3])
print(cat @ dog / (np.linalg.norm(cat) * np.linalg.norm(dog))) # 0.96
# gensim 裡直接寫:model.similarity("cat", "dog")
報告第 4 題「找最像的 5 個字」,就是把一個字跟字典裡每個字都算一次相似度,取最高的 5 個。這 5 個字本文叫「鄰居」(只用在這個意思)。
觀念 3:詞向量可以加減,加減代表「關係」
這是整份作業最核心的一點。看這張圖:
從 man 走到 woman 的那一步(紅色箭頭),跟從 king 走到 queen 的那一步,方向和長度大致一樣(老師原話:「不是這麼 exactly 是一樣的 pattern,但是趨勢非常的 close」,W3 00:32:03)。四個點大約排成一個平行四邊形。
所以只要知道三個點,就能推出第四個點:
queen − king + man ≈ woman
(b) (a) (c) (d)
白話:「把 king 變成 queen 的那一步」,套到 man 身上,就會走到 woman。這個公式本文叫 b − a + c(論文叫 3CosAdd)。
注意:作業規格 PDF 第 2 頁寫成「King + Queen − Man ≈ Woman」,那是筆誤。正確是 b − a + c(程式模板的提示寫的才對)。
作業的考卷 19,544 題,每一題都是這樣:給 a、b、c,叫電腦算出 d。
手算一次 b − a + c(拿紙筆跟著算)
前提:
- 字典裡只有 6 個字:man、woman、king、queen、girl、apple。每個字只有 2 個數字(下圖括號裡,我自己編的)。
- 題目:king 之於 queen,等於 man 之於 __?所以 a=king、b=queen、c=man,正確答案 d=woman。
第 1 小步:做加減,算出一個新的點 ★。公式是 b − a + c,也就是 queen − king + man。兩個數字各自算:
第 1 個數字:3.2 − 1 + 1 = 3.2
第 2 個數字:4.1 − 4 + 1 = 1.1
所以 ★ = (3.2, 1.1)
圖上兩條紅色箭頭幾乎一樣長、一樣方向:「king 變 queen」和「man 變 woman」是同一步。從 man 走同一步,就走到 ★。
第 2 小步:算 ★ 跟每個候選字的相似度。照上面「手算相似度」的三小步做:
| 候選字 | ① 內積 | ② 長度 | ③ 相似度 |
|---|---|---|---|
| woman (3, 1) | 3.2×3 + 1.1×1 = 10.70 | ★ 3.384;woman 3.162 | 10.70 ÷ (3.384×3.162) = 1.000 |
| girl (3, 0.3) | 3.2×3 + 1.1×0.3 = 9.93 | ★ 3.384;girl 3.015 | 9.93 ÷ (3.384×3.015) = 0.973 |
| apple (−2, 3) | 3.2×(−2) + 1.1×3 = −3.10 | ★ 3.384;apple 3.606 | −3.10 ÷ (3.384×3.606) = −0.254 |
數字由 make_toy_figures.py 算出,四捨五入到小數點後 2~3 位。woman 的 1.000 是四捨五入後的值,實際比 1 小一點點。
第 3 小步:相似度最高的就是答案。woman 1.000 最高,所以電腦答 woman,答對。
邊界情況 1:答案不能是題目自己的字
king、queen、man 是題目給的字,規定不能拿來當答案,所以第 2 小步只算剩下的字。gensim 的 most_similar 會自動排除它們。
為什麼要排除:★ 是從 man 出發走一小步得到的,所以 ★ 有可能離 man 自己很近。這個玩具例子裡 man 的相似度是 0.899(比 woman 低,沒有搶走第一名);但在真的 100 維字典裡,★ 不會剛好落在 woman 上,題目自己的字就可能排到前面。
邊界情況 2:題目的字不在字典裡
如果 a、b、c 有一個字典裡查不到(叫 OOV,查不到的字),第 1 小步就算不出來。這種題目在作業裡直接算答錯。
真的作業就是把這 3 小步,對 19,544 題每一題做一遍(候選字是字典收的所有字,Wiki 20% 字典約 30 萬個)。girl 0.973 也很接近 woman——在真的字典裡,「很像但不是答案」的字很多,所以不少題的正確答案排在第 2、3 名(第 12 節實驗 ④:前 3 名正確率比第 1 名多 13.14 個百分點)。
觀念 4:詞向量是電腦自己「看前後文」學出來的
沒有人一個一個去設定詞向量。電腦是讀了大量文章(教材)之後,自己算出來的。
它根據一句很有名的話:「看一個字的朋友,就知道它是什麼字。」常常出現在同樣前後文的字,意思通常很像。
例如「我養了一隻__,牠很可愛」,空格可以填貓、狗、兔子。這些字前後文很像,所以詞向量會很近。
這個「讀教材、看前後文、算詞向量」的過程叫 訓練。作業用的方法叫 Word2Vec,裡面又分兩種:
| 方法 | 它在練習什麼 | 例子 |
|---|---|---|
| Skip-gram(老師投影片的重點) | 給中心字,猜前後文會出現哪些字 | 看到「貓」,猜前後可能有「養」「可愛」 |
| CBOW | 給前後文的字,猜中心字是什麼 | 看到「養了一隻__很可愛」,猜中間是「貓」 |
練習的過程中,電腦會一直微調每個字的詞向量,讓猜測越來越準。練完之後,這些數字就是詞向量。
字典好不好,取決於兩件事:電腦讀了什麼教材(讀多少、讀什麼種類、怎麼整理),和怎麼學(Skip-gram 或 CBOW、維度、window)。 報告第 2 題(讀多少)、第 3 題(讀什麼種類)、第 1 題(怎麼整理)、第 5 題(怎麼學),全部都是在問這件事。
電腦學的是「誰出現在相似的前後文」,不是「意思」。good(好)和 bad(壞)意思相反,但前後文很像(「這部電影很__」,推論),Wiki 20% 字典裡兩者相似度 0.70(In [33])。 還有:apple 不管是水果還是公司,都只有一個詞向量。這就是後面幾週要教 BERT(會看整句前後文,給同一個字不同的詞向量)的原因。
① 相似度接近 1、0、負的,各代表什麼?(本節觀念 2 的表)
② 用 b − a + c 答「king : queen = man : ?」,a、b、c 各是哪個字?為什麼要排除這三個字?(本節兩個邊界情況;第 14 節 Q1)
③ 詞向量是怎麼學出來的?(觀念 4;第 14 節 Q3、Q6、Q7、Q8)
我(Claude)做了什麼:完整工作清單
結論:這份作業的程式、執行、報告文字都是我做的,在你的電腦上實際跑完。下面照時間順序列出每一步、每一個我自己下的決定和理由。你要交出去,就要知道這些,因為報告第 6 題要如實寫出來,考試也可能問「你為什麼這樣做」。
八個階段
| 階段 | 做了什麼 | 產出 |
|---|---|---|
| 1 讀規定 | 讀完作業 PDF 37 頁、程式模板 32 格、助教說明影片(24 分鐘,轉成逐字稿)、老師 W2/W3 上課逐字稿;把 2025 和 2026 兩版 PDF 逐行比對,找出 6 個說法互相打架的地方。 | HW1_作業介紹.html |
| 2 準備環境與資料 | 建一個獨立的 Python 3.12.3 環境;裝 gensim 4.4.0 等套件;下載維基百科 11 個壓縮檔(6.93 GB)、GloVe 字典(128 MB)、卡達論壇教材(234 MB)。 | .venv\、data\、requirements.txt |
| 3 寫程式 | 把老師的模板複製一份,只改 TODO 格和載入資料的格子(其他格一字不差);在報告下面加上報告第 2~5 題的實驗程式。 | 第一版筆記本 |
| 4 彩排+第一次正式執行 | 先用很少的資料把整本跑一遍,修掉 4 個問題;再用完整資料跑完整本(第一版,0 錯誤)。 | 第一版結果 |
| 5 第一輪審查 | 派 4 位互不相干的審查員,只給他們老師的原始資料(PDF、模板、助教影片、投影片、逐字稿),各自從一個角度挑毛病:①老師規章 ②課程內容正確性 ③假扮助教打分 ④數字逐一核對(728 個數字)。 | 審查紀錄 05a~05d |
| 6 依審查修正 | AI 標註改成如實寫法;把模板的提示說明放回去;改正 4 處講錯的觀念(apple、冷門字、拿兩本字典的相似度互比、min_count);新增 6 組證據實驗(雜訊量測、冷門字次數、只看常見字的鄰居、apple 前 15 名、回教材查 sourpuss、只算兩本字典都有的題目)。 | 繳交版程式 |
| 7 繳交版從頭重跑 | 整本從第一格跑到最後一格,執行編號連續,報告每一個說法都有自己的輸出當證據。 | NLP_HW1_submission_draft.ipynb |
| 8 寫報告、說明、再審查 | 用最終數字寫報告 6 題;用自動工具核對報告裡每一個數字都能在輸出找到;寫這份說明;再換兩批新審查員各檢查一次(三輪共 8 位,紀錄 05a~05h);最後依教學文件規範再審這份說明。 | 報告、本文件、審查紀錄 |
我改了模板的哪些格子
老師規定:只准改「載入資料」的部分,亂改扣 5 分。所以我把每一格都分類清楚(下面用 Jupyter 畫面左邊的 In [n] 標示;報告格是文字格,沒有 In 編號):
| 格子 | 原本是什麼 | 我改成什麼 | 屬於 |
|---|---|---|---|
| In [2] | !wget 下載考卷 | Python 的 urllib 下載同一個網址(Windows 沒有 wget) | 載入資料 |
| In [15]~In [19] | !gdown、!gunzip、!cat、!head | Python 下載;不解壓不合併、直接讀壓縮檔(省硬碟) | 載入資料 |
| In [5](TODO1)、In [12](TODO2)、In [14](TODO3)、In [20](TODO4)、In [21](TODO5)、In [23](TODO6)、In [24](TODO7) | TODO1~7 的空格 | 填入答案程式;模板原本的註解和 Hints 說明全部保留,程式接在後面 | TODO |
| In [23](TODO6) | — | 多印了成績(模板在 TODO6 後面沒有評分格,不印看不到結果) | TODO 格內 |
| 報告格(In [24] 下面那一格文字) | 報告題目 | 填入答案 | 報告 |
| In [25] | # Write your code here | 第一行保留,下面接第 3 題的共用工具 | 第 3 題程式區 |
| 每一格我寫的程式 | — | 最上面加 # [Generative AI] The code in this cell was generated by Claude (Anthropic).(資料載入格另外保留模板原本的說明註解) | 規定要求的 AI 標註 |
| In [26]~In [43] | (模板沒有) | 第 2~5 題的實驗、總表、執行環境 | 報告下面新增 |
我自己下的技術決定(每一個都有理由)
表裡有些詞(window、雜訊、前 k 名⋯)要到第 6、12 節才會詳細講;看不懂先查用語表,或先跳過。
| 決定 | 選了什麼 | 為什麼 |
|---|---|---|
| 在哪裡跑 | 你的筆電,不用 Colab | 你的 CPU 16 執行緒,Colab 免費版通常 2 核;Colab 跑久會斷線、輸出會不見(後兩項是外部知識)。 |
| 怎麼讀維基 | 直接讀壓縮檔、一行一行讀 | 不吃硬碟、不吃記憶體(老師課堂上提醒過不要整份載入再挑,W3 01:55:49)。 |
| 怎麼抽樣 | 以篇為單位、固定亂數種子、5%⊂10%⊂20% | 結果能重現;三份教材只差在字數,第 2 題比較才公平。 |
| 大小寫 | 題目全部轉小寫 | GloVe 字典和維基教材都是小寫,不轉會查不到字。 |
| 前處理 | 只留英文字母;不刪停用詞、不做詞形還原 | 停用詞和字形變化就是考卷的答案。停用詞有實驗(第 12 節實驗 ②);詞形還原沒有做實驗,是看考卷內容推的(例:bigger 還原成 big,比較級的答案就不見了)。 |
| 怎麼學 | Skip-gram、100 維、window 5、5 輪 | 老師投影片的重點是 Skip-gram;100 維跟 GloVe 一樣,比較才公平。 |
| 字典大小 | 最多 30 萬字 | 作業規格 PDF p28 建議的「只保留最高頻的字」;字典太大會變慢、容易猜到冷門字。 |
| 第 3 題的教材 | 卡達生活論壇問答 | 跟維基差很多(推論:口語問答 vs 百科;沒有跟其他候選教材比較過)、大小適中、可直接下載。 |
| 第 3 題怎麼比 | 多做一份維基對照組(跟論壇一樣多字) | 把「教材字數」和「教材種類」兩個因素分開(控制變因)。 |
| 加分實驗 | 停用詞、調參數、前 k 名正確率、錯題分析、換公式、PCA 對照、另外換 3 個種子重跑(連同原本共 4 次,量雜訊) | 每一個都回答一個老師上課提過或考試可能問的問題。 |
產出的檔案
| 檔案 | 用途 |
|---|---|
HW1\示範實作\NLP_HW1_submission_draft.ipynb | 繳交版筆記本(程式+輸出+報告);交之前改成 NLP_HW1_學校_學號.ipynb |
HW1\示範實作\NLP_HW1_DEMO_示範.ipynb | 第一版(審查前),留作對照,不交 |
HW1\示範實作\requirements.txt | 套件清單 |
HW1\HW1_一條龍說明.html | 本文件 |
HW1\HW1_作業介紹.html | 規定、扣分、繳交檢查清單 |
HW1\_work\2026-10-04-nlp-hw1-submission\ | 審查紀錄 |
邏輯框架:這份作業在整門課的哪裡、到底在證明什麼
結論:這門課前三週在回答一個問題:「怎麼讓電腦知道字的意思?」這份作業就是讓你親手驗證課堂上的答案(詞向量),並找出「什麼決定詞向量好不好」。整份作業的實驗,都是在一次改一個因素、看結果怎麼變。
第一層:這份作業在課程地圖上的位置
老師前三週的投影片,是一條「表示字的方法越來越好」的路。下表照「想法一步一步變好」的順序排(老師 W3 開頭口頭回顧,也是從 one-hot 講到 TF-IDF):
| 站 | 方法 | 白話 | 問題在哪 | 投影片 |
|---|---|---|---|---|
| 1 | one-hot、Bag of Words | 每個字一個格子,有出現就打勾 | cat 和 dog、cat 和 truck 一樣「不像」,電腦看不出誰跟誰相近 | W1 p55–58 |
| 2 | TF-IDF(替每個字打分數) | 還是一字一格,但常出現、又不是到處都有的字,分數比較高 | 「計程車」和「的士」還是對不起來(同義字問題) | W1 p48–53、p60–61 |
| 3 | 人工詞庫(WordNet) | 請人手編一份同義字、上下位字的詞庫 | 不看前後文、缺新字、要人維護 | W1 p62–63 |
| 4 | 分布假說+數共現次數 | 「看一個字出現在什麼前後文,就知道它是什麼字」(Firth 1957);數每兩個字一起出現幾次,再壓縮 | 表格有「字數 × 字數」那麼大,加一個字就要全部重算 | W1 p70–80、W2 p24–27 |
| 5 | 神經網路語言模型(Bengio 2003) | 讓神經網路練習猜「下一個字」,順便學出每個字的詞向量 | — | W1 p64–68 |
| 6 | Word2Vec(Skip-gram)← 作業自己訓練的 | 用中心字猜前後文,練出詞向量(第 1 節觀念 4) | 一個字只有一個詞向量 | W1 p81–90、W2 p32–38 |
| 7 | GloVe← 作業借來用的;FastText | GloVe 用整份教材的共現統計;FastText 看字的拼法片段 | 同上 | W1 p91–93 |
| 8 | 上下文詞向量(BERT、GPT)← 之後的課 | 同一個字在不同句子給不同的詞向量 | — | W2 p39–40 |
站 4、站 5 在投影片上的頁序是反過來的(Bengio 在 p64、分布假說在 p70);這裡照「先有想法、再用神經網路做」的順序排。
進階:站 2、站 4 的專有名詞
- BM25:TF-IDF 的改良版,搜尋引擎常用。TF-IDF、BM25 這種「一字一格的向量」合稱向量空間模型。
- 稀疏:一字一格的向量,大部分格子都是 0。
- 共現矩陣:站 4 那張「字數 × 字數」的表,每一格記兩個字一起出現幾次。
- LSA:把共現矩陣用 SVD(一種把大表格壓小的數學方法)壓成每個字幾百個數字。
- PPMI:另一種替共現次數打分數的方法,把「本來就很常見的字」的分數壓低。
所以作業的位置是:站 6、7。你在作業裡看到的缺點(apple 的鄰居全是公司或科技產品、bank 的兩種意思可能混在同一個詞向量裡),正是站 8 要解決的問題。考試如果問「詞向量的限制是什麼、後來怎麼解決」,就是要你把這條路講出來。
第二層:作業在證明什麼——一張「因素圖」
左邊是會影響字典好壞的 4 個因素,右邊是檢查字典好壞的 3 種方法。報告的每一題,都是「動左邊一個因素,從右邊看結果」。
第三層:怎樣的實驗才算數——控制變因
想知道「某個因素有沒有影響」,就要一次只改那一個,其他全部一樣。這叫控制變因。這份作業每個實驗都照這個原則設計:
| 想知道 | 只改了 | 其他保持一樣 |
|---|---|---|
| 教材字數的影響 | 5% → 10% → 20% | 同一批文章(5% 包含在 10% 裡)、同參數設定(但 gensim 自動把收錄門檻調成 9/16/30 次,見第 6 節例外 1) |
| 教材種類的影響 | 維基 → 論壇 | 字數一樣(各 7,292 萬字)、同前處理、同參數設定(但兩本字典收的字數不同:10 萬 vs 22 萬,見第 10 節) |
| 停用詞的影響 | 刪 / 不刪 | 同一份 5% 維基、同參數 |
| 訓練設定的影響 | CBOW、window、維度(一次改一個) | 同一份 5% 維基 |
| 算答案公式的影響 | 3CosAdd → 3CosMul | 同一本字典 |
最後還要確認一件事:同樣設定換 4 個亂數種子各跑一次,正確率差多少?這個差叫「雜訊」;差距比雜訊還小的,就不能下結論(第 9 節有手算,第 12 節實驗 ①)。
考試如果問「你的實驗怎麼設計的」,答「我一次只改一個因素,例如第 3 題我讓論壇和維基的字數一樣,這樣差異主要來自教材種類(兩本字典收的字數不同,這個因素沒有完全排除)」——這就是作業要的分析。
課堂補充:老師上課強調、考試可能考的 12 個觀念
結論:作業只用到 Word2Vec 的「結果」(訓練好的字典),但老師上課講了它「怎麼來的」。閉書考試會考你能不能把作業跟上課內容串起來。
怎麼讀:12 點分成四組——A 怎麼學出來、B 怎麼用和評估、C 有什麼限制、D 前處理。每一點都附投影片頁碼或上課時間,可以回去對照。
A 組:詞向量怎麼學出來(5 點)
1. 為什麼不用 one-hot:因為所有字都一樣「不像」
one-hot 是每個字一個格子,cat=[1,0,0…]、dog=[0,1,0…]。任兩個不同的字,相似度都是 0:cat 跟 dog 和 cat 跟 truck 一樣不像。
詞向量(英文 dense vector,跟 one-hot 那種大多是 0 的向量相對)的數字是學出來的,不是數出來的,所以相近的字可以有相近的數字。個別的數字(例如第 37 個數字代表什麼)不需要、也很難解釋。
依據:W1 p57–58、p64;W2 02:38:30–02:43:47(數字是學出來的、個別維度不需要解釋);W3 00:03:20。
2. 分布假說:前後文相似 → 意思相似
「A word is characterized by the company it keeps」(Firth 1957)。注意定義是出現在相似的前後文,不是「兩個字常一起出現」:
- enjoy 和 like 很少出現在同一句,但「I ___ coding」兩個都能填,所以詞向量很近(W2 p24 的例子)。
- cat 和 dog 都出現在 lick、fur、eat、run 附近(W1 p70 的例子)。
依據:W1 p70、W2 p24。
3. Skip-gram 的訓練資料是「自己做出來的」
拿一句話,每個字輪流當中心字,跟它前後 window 範圍內的字配成一對:
句子:the cat licked its fur window = 1
(the, cat) (cat, the) (cat, licked) (licked, cat) (licked, its) (its, licked) (its, fur) (fur, its)
這樣沒有人標註的文章,也能變成「給輸入、猜輸出」的訓練資料。老師說這是「訓練上的一種巧思」,後來 BERT 的克漏字也是同一個想法。window 越大,配對越多。
依據:W1 p82;W3 01:13:00–01:16:05。
4. Word2Vec 的網路長什麼樣:詞向量就是第一層的權重
結論:網路的第一層是一張表(矩陣 V),每個字一列。訓練完,這張表的每一列就是那個字的詞向量。
手算一次「查表」(前提:字典只收 4 個字 the、cat、licked、fur;每個詞向量只有 2 個數字;V 的數字是我編的):
| V 的第幾列 | 字 | 這一列的 2 個數字 |
|---|---|---|
| 1 | the | (0.1, 0.3) |
| 2 | cat | (0.8, 0.5) |
| 3 | licked | (0.2, 0.9) |
| 4 | fur | (0.7, 0.4) |
第 1 小步:中心字 cat 寫成 one-hot:[0, 1, 0, 0](第 2 格是 1,其他是 0)。
第 2 小步:one-hot 乘 V,就是「每一列乘上對應的那一格,再加起來」:
0×(0.1, 0.3) + 1×(0.8, 0.5) + 0×(0.2, 0.9) + 0×(0.7, 0.4) = (0.8, 0.5)
乘 0 的列全部消失,只剩第 2 列。所以「one-hot 乘 V」其實就是把 V 的第 2 列拿出來——查表。
第 3 小步:網路拿 (0.8, 0.5) 去猜「cat 的前後文會出現哪些字」,猜錯就微調 V 的這一列。訓練完,V 的第 2 列就是 cat 的詞向量。
進階:第二層和怎麼學(softmax、cross-entropy)
| 步驟 | 在做什麼 |
|---|---|
| 第二層(矩陣 U) | 拿查到的那一列,跟每個字的「輸出向量」做內積,得到每個字一個分數 |
| softmax | 把分數變成機率(全部加起來是 1):每個字出現在中心字前後文的機率 |
| cross-entropy | 看「真正出現的前後文字」被分到多少機率;機率越低,懲罰越大,就調整 V 和 U |
依據:W1 p83–90、W2 p37;W3 01:17:01–01:27:48。
5. Negative sampling(負取樣):把「猜 30 萬選 1」改成「是不是真的前後文」
為什麼要它:第 4 點的 softmax 要對整本字典(30 萬字)每個字都算機率,非常慢。
手算例子(句子「the cat licked its fur」,中心字 cat):
- 正例:(cat, licked) 是真的出現在前後文 → 標「是」。
- 負例:照字頻隨機抽幾個字(作業設 5 個,這裡用 2 個好算),例如 (cat, piano)、(cat, river) → 標「不是」。
- 練習:電腦只練習判斷「這一對是不是真的前後文」(二元分類,叫 logistic regression)。每次只調 cat、licked、piano、river 這 4 個字的數字,不用碰其他 30 萬字,所以快很多。
依據:W2 p33、p38。作業設定 negative=5 就是這個。piano、river 是我舉的例子。
「Word2Vec 訓練完,詞向量在網路的哪裡?」→ 第一層權重 V 的每一列(第 4 點的查表;第 14 節 Q7)。
「negative sampling 在解決什麼問題?」→ softmax 要算 30 萬個字太慢;改成每次只判斷 1 個正例+幾個負例(第 14 節 Q8)。
B 組:怎麼用、怎麼評估(3 點)
6. 類比看的是「相對關係」,不是「絕對位置」
老師原話:「我們看的並不是字的向量的絕對的向量的東西,而是一種對比的關係」。man→woman 和 king→queen 那條線「方向斜率」很一致,但不是完全一樣。
所以可能同時出現兩件事:類比題答得不錯(相對關係很好),但某個字的鄰居不是你想的(絕對位置不可靠)。老師說做完作業會發現「你所熟知的字」附近的向量不是你想的(W3 00:04:34–00:05:43)。
這次的結果:Wiki 20% 字典的 cat 前 5 名有 4 個是動物(rabbit、dog、mouse、pet),只有 sourpuss 一個怪字(推論:它是冷門字,見第 11 節觀察 ①、④)。所以這個現象在 cat 身上不明顯,在 king、bank 身上比較明顯(第 11 節)。
依據:W3 00:27:56–00:29:34、00:04:34–00:05:43、00:25:54;In [32]。
7. 維度、模型怎麼選:It depends
- 維度:通常幾百維,最多約 1K。老師:「設一萬好不好?可以,但是效果不會比較好」——不是越大越好,是預算問題(W2 02:40:08「我只有 Budget 的概念」;W3 01:04:18–01:05:33、01:22:16–01:22:22)
- CBOW vs Skip-gram:老師說 CBOW 訓練比較不直覺,「我們會做 Skip-gram」。(W3 01:12:12)
- GloVe vs Word2Vec:GloVe 用整份教材的共現統計(Global),Word2Vec 用局部視窗(Local);老師說「一般來講我們會覺得 GloVe 比 word2vec 好」。(W1 p91;W3 01:28:57、01:32:25)
- 用哪一份:投影片寫「It depends」——有很多查不到的字或特殊領域(例如文言文)才自己訓練,而且要在自己的任務上試。(W1 p93)
- 怎麼評估:詞類比只是其中一種(直接測詞向量本身,叫 intrinsic evaluation);還有 WordSim353(人工打分的字對相似度)、MTEB。(W1 p93–94;W3 01:33:03–01:33:39)
8. 相似不等於相關;領域外不等於字典外
投影片 W1 p94 列了兩句很適合拿來解釋作業的話:
- "Similar does not necessarily mean relevant."——詞向量很像,不代表真的相關。作業裡 good 跟 bad 相似度 0.70(In [33]),但意思相反。
- "Out-of-domain is not the same as out-of-vocabulary."——字典裡查得到,不代表學得好。第 3 題的公平比較就是例子:只看兩本字典都查得到的題目,論壇字典的語意類還是只有 22.10%(維基對照組 52.80%)。原因可能是論壇很少在「首都/國家」的前後文用這些字(推論)。
依據:W1 p94。
「類比題答得好,為什麼某些字的鄰居還是怪怪的?」→ 類比看相對關係(兩個詞向量的差),鄰居看絕對位置;前者可以好、後者不一定好。
C 組:限制與後來的解法(3 點)
9. 字典裡沒有的字(OOV)、字首字尾、錯字 → FastText
Word2Vec、GloVe 每個字一個詞向量,沒看過的字就沒有。FastText 把字拆成字元片段(例如 un-、-ly、-ness),沒看過的字也能用片段拼出詞向量。老師說「這也會在 Assignment 1 討論」。
剛好對上作業:表現最差的小類裡(最差的是貨幣),有兩個就是反義字首(un-)和形容詞→副詞(-ly),論壇字典的鄰居也常常是錯字(slary)——這些都是看拼法可能幫得上忙的情況(推論:本作業沒有實際跑 FastText)。
依據:W1 p92、p94(Vector search is not robust to typos);W3 01:29:49–01:32:55。
10. 一字多義 → 上下文詞向量(BERT、GPT)
bank(銀行/河岸)是老師投影片的例子。Word2Vec、GloVe 一個字只有一個詞向量,叫靜態詞向量;BERT、GPT 會看整句話給不同的詞向量,叫上下文詞向量。
依據:W1 p60、W2 p39–40。
11. 字的意思會隨時間改變
投影片 W2 p31 用 broadcast、network 舉例:同一個字在不同年代的鄰居不一樣(network 從電報、電線,變成網路、社群媒體)。所以用很久以前的教材訓練的字典(GloVe 是 2014 年的資料,外部知識),不一定符合現在的用法。我們自己訓練的 Wiki 20% 字典裡,apple 的鄰居有 iphone、tvos,反映這份維基教材的年代(推論)。
依據:W2 p31。
「靜態詞向量有哪些限制?後來怎麼解決?」→ 沒看過的字沒有詞向量(FastText 用字元片段);一字多義只有一個詞向量(BERT 看整句);意思會隨時間變。
D 組:前處理(1 點)
12. 停用詞:老師說「現在一點都不重要,也不會去做」
老師原話:以前移除停用詞「很重要,但是現在一點都不重要也不會去做」(老師是在講搜尋引擎建索引時說的;本作業的停用詞實驗也支持同樣的結論)。以前是為了省 20~30% 的索引空間,而且「搞不好有一些很重要的東西被拿掉」。投影片也寫:「When to remove stop words? Avoid to broke the semantics.」
這是報告第 1 題「為什麼不刪停用詞」最好的課程依據。
依據:W2 01:39:50–01:40:54;W1 p47。
2 準備工作:要在哪裡跑、要裝什麼
結論:你有兩個選擇:Google Colab(老師推薦)或自己的電腦(我這次用的)。你的筆電比 Colab 免費版強很多,我建議在自己電腦跑,但交作業時要多附 requirements.txt、報告要寫電腦規格。
兩種做法比一比
| Google Colab(免費版) | 自己的電腦(你的筆電) | |
|---|---|---|
| 要不要安裝 | 不用,開瀏覽器就能用 | 要裝 Python 和套件(下面有指令) |
| CPU(訓練詞向量只用 CPU) | 通常只有 2 核心 | i7-11800H,8 核心 16 執行緒 |
| 記憶體 | 約 12 GB(外部知識,依 Colab 免費版一般配置) | 16 GB(系統顯示 15.7 GB) |
| 斷線風險 | 閒置太久或跑太久會被中斷,畫面上的結果會不見(外部知識) | 不會 |
| 模板指令能不能直接用 | 可以(!wget、!gdown、!cat 都是 Linux 指令) | 不行,要改成 Python(我已經改好,見第 5 節) |
| 交作業要多做什麼 | 報告寫「Colab」+Python 版本 | 報告寫作業系統、CPU、Python 版本;一定要附 requirements.txt |
「Colab 通常只有 2 核心、訓練會慢很多」是我根據 Colab 免費版一般配置推的,這次沒有實際在 Colab 上計時。
顯示卡用不用得到?
用不到。這份作業用的 Gensim 只用 CPU 算。你的 RTX 3060、Colab 的免費 GPU,對這份作業都沒有幫助。
在自己電腦上準備環境(照抄就好)
在作業資料夾打開終端機,一行一行貼:
py -3.12 -m venv .venv
.venv\Scripts\python.exe -m pip install gensim pandas scikit-learn matplotlib tqdm gdown nltk jupyter
.venv\Scripts\python.exe -m jupyter notebook
這三行在做什麼:
- 建一個獨立的 Python 環境(
.venv資料夾)。好處是作業用的套件跟電腦裡其他東西分開,不會互相打架。 - 裝作業要用的套件。
- 打開 Jupyter(跟 Colab 長得很像的筆記本介面,只是在你電腦上跑)。
硬碟要準備多少空間
| 東西 | 大小 |
|---|---|
| 維基百科 11 個壓縮檔 | 6.93 GB(Windows 檔案總管會顯示約 6.45 GB,因為它用 1024 進位) |
| 抽樣出來的 5%、10%、20% 文字檔,加上整理過的版本 | 約 15 GB(抽樣原檔 7.28 GB+整理後約 7.2 GB+論壇與對照組約 0.8 GB) |
| GloVe 字典+論壇教材 | 約 0.4 GB(放在 C:\Users\你\gensim-data) |
模板的做法是先解壓縮(而且保留壓縮檔),再把 11 個檔合併成一個。同一份教材等於存三份。 我改成「直接讀壓縮檔、邊讀邊抽樣」,不解壓、不合併,結果完全一樣。規定允許改「載入資料」的部分,所以這樣改不扣分。
requirements.txt、報告寫電腦規格。這兩件第 13 節都已經做好了。
3 Part I:讀考卷、整理成表格(TODO1,配分 5%)
結論:把考卷的純文字檔,整理成一張三欄的表格:題目、大類(語意/語法)、小類。這一步沒有難度,重點是看懂考卷的格式。
為什麼要整理成表格:後面 TODO2、TODO6 要按大類、小類分開算正確率,所以每一題都要先標好它屬於哪一類。
考卷原本長這樣
: capital-common-countries ← 冒號開頭:小類的「標題」,不是題目
Athens Greece Baghdad Iraq ← 一行一題,四個字,第四個是答案
Athens Greece Bangkok Thailand
...
: capital-world ← 下一個小類開始
...
整份檔案有 14 個冒號標題。前 5 個屬於語意(Semantic),後 9 個屬於語法(Syntactic)。模板的註解已經提示了這件事。
程式(逐行講解)
questions, categories, sub_categories = [], [], [] # 準備三個空籃子
n_headers = 0 # 數「目前讀到第幾個標題」
current_sub = None # 記住「目前在哪個小類」
for line in data: # 一行一行看
if line.startswith(": "): # 冒號開頭 → 這是標題
n_headers += 1 # 標題數 +1
current_sub = line # 記住新的小類名稱
continue # 標題不是題目,跳過
questions.append(line) # 題目放進籃子
categories.append("Semantic" if n_headers <= 5 else "Syntactic") # 第 1~5 個標題底下 → 語意
sub_categories.append(current_sub) # 小類就是最近一次看到的標題
跑出來的結果
Question Category SubCategory
0 Athens Greece Baghdad Iraq Semantic : capital-common-countries
1 Athens Greece Bangkok Thailand Semantic : capital-common-countries
2 Athens Greece Beijing China Semantic : capital-common-countries
3 Athens Greece Berlin Germany Semantic : capital-common-countries
4 Athens Greece Bern Switzerland Semantic : capital-common-countries
我另外比對過:這張表跟老師在 GitHub 上提供的 questions-words.csv 一模一樣(19,544 列)。所以這一步做對了。
「考卷(Google analogy 資料集)分哪兩大類?各舉一個例子。」 → 語意類(king queen man woman)、語法類(big bigger small smaller)。
4 Part II:借別人的字典考試(TODO2 配分 10%、TODO3 配分 5%)
結論:用史丹佛做好的 GloVe 字典去考 19,544 題,答對 63.11%。首都、國名→國籍很準(將近九成),貨幣、反義字首、形容詞→副詞很差(14%~24%)。t-SNE 圖上,有些男女配對黏在一起(boy/girl、man/woman),也有分很開的(brother/sister)。
TODO2 的程式
for analogy in tqdm(data["Question"]): # 一題一題做(tqdm 只是顯示進度條)
word_a, word_b, word_c, word_d = analogy.lower().split() # ① 先轉小寫,再切成四個字
golds.append(word_d) # 正確答案先記下來,等一下對答案
if all(w in model.key_to_index for w in (word_a, word_b, word_c)): # 邊界情況 2:三個字都查得到嗎?
preds.append(model.most_similar(positive=[word_b, word_c], # ② b − a + c,③ 找最近的字
negative=[word_a], topn=1)[0][0])
else:
preds.append(None) # 查不到 → 這題算答錯
主流程:三小步
| # | 在做什麼 | 為什麼 |
|---|---|---|
| ① | 先轉小寫 | GloVe 字典裡的字全部是小寫。考卷有 Athens、Greece 這種大寫字,不轉的話這些字查不到,整題會被算成答錯。正確答案也要轉小寫,不然 iraq 和 Iraq 會被判成不一樣。 |
| ② | 算 b − a + c | 就是第 1 節的手算第 1 小步。positive=[b, c] 是「加」,negative=[a] 是「減」。 |
| ③ | 找相似度最高的字 | 就是第 1 節的手算第 2、3 小步。topn=1 只拿第 1 名當答案。most_similar 回傳一串「(字, 相似度)」,例如 [('woman', 0.71)](數字是舉例);第一個 [0] 拿第一組,第二個 [0] 拿這一組裡的字 'woman'。 |
邊界情況 2(同第 1 節):題目的字查不到
字典裡沒有的字叫 OOV(查不到的字)。a、b、c 有一個查不到,就沒辦法算 b − a + c,所以程式先檢查(model.key_to_index 是字典收的所有字,w in model.key_to_index 就是問「這個字查得到嗎?」);查不到就記 None,這題算答錯。
如果沒有這個檢查,most_similar 遇到查不到的字會直接報錯、整個程式停下來。GloVe 字典收了 40 萬字(外部知識),這次 0 題查不到(In [12] 印的)。
邊界情況 1(同第 1 節):答案不能是題目自己的字
most_similar 會自動排除題目裡的 a、b、c 三個字。原因見第 1 節「邊界情況 1」:算出來的點有可能離題目自己的字很近(外部知識:gensim 的設計)。
一題怎麼打分
電腦答的第 1 名跟正確答案 d 一樣,這題就算對。19,544 題全部做完,答對題數 ÷ 19,544 就是正確率。一題真題從頭到尾的完整例子在第 7 節(用 Wiki 20% 字典,因為筆記本只對它印了錯題)。
考出來的正確率
| 小類 | 正確率 | 例題 |
|---|---|---|
| 整體 | 63.11% | (語意類 65.34%、語法類 61.26%) |
| 常見國家首都 | 93.87% | Athens : Greece = Baghdad : ? |
| 全世界首都 | 88.95% | |
| 國名→國籍 | 87.87% | Albania : Albanian |
| 家人/性別 | 81.62% | boy : girl |
| 比較級 | 79.13% | bad : worse |
| 名詞複數 | 72.00% | banana : bananas |
| -ing | 69.51% | code : coding |
| 動詞第三人稱 | 58.39% | decrease : decreases |
| 過去式 | 55.45% | dancing : danced |
| 最高級 | 54.28% | bad : worst |
| 美國城市在哪州 | 30.81% | Chicago : Illinois |
| 形容詞→副詞 | 24.40% | amazing : amazingly |
| 反義字首 | 20.07% | aware : unaware |
| 貨幣 | 14.20% | Algeria : dinar |
為什麼有的很準、有的很差
| 情況 | 原因(白話) |
|---|---|
| 首都、國名→國籍很準 | 新聞和維基百科裡天天寫「某國首都某某」「某國人」,而且這些字都很常見,詞向量學得很穩。 |
| 貨幣很差 | kwanza(安哥拉的錢)、dram(亞美尼亞的錢)這些字一年也出現不了幾次,詞向量學不準。而且 won(韓圜)、real(巴西的錢)這種字平常是別的意思(贏了、真的),詞向量被平常的意思拉走。 |
| 反義字首、形容詞→副詞很差 | aware 和 unaware 的前後文常常一樣(「I was __ of it」),所以詞向量很近,但「加上 un-」這個方向不夠一致。詞向量只看前後文,看不到字的拼法。 |
| 美國城市在哪州普通 | 很多美國城市名同時出現在好幾個州(例如好多州都有 Springfield,外部知識),不好學。 |
上面的原因是根據詞向量的原理推論的;要真的確認,要看錯題分析(第 12 節)。
TODO3:t-SNE 圖
把家人/性別小類(筆記本上叫 family)的 46 個字,從 100 維壓成 2 維畫出來。下圖是用跟筆記本 In [14] 完全一樣的設定重畫的(點的位置相同),只多加了圈和顏色,方便你找:
怎麼看這張圖:
- 有些男女配對黏在一起(灰線):boy/girl、man/woman、dad/mom,還有 bride/groom、policeman/policewoman。但 brother/sister、uncle/aunt、son/daughter 沒有黏在一起。
- 有按「角色」分的群:皇室(藍圈)、「繼」字輩(綠圈)、代名詞(紅圈)、複數(褐圈)各一群。中間那一大塊則大致是左邊男性(son、brother、uncle)、右邊女性(daughter、mother、aunt);例外是 husband,它在右邊跟 wife 黏在一起。
- 這張圖上「角色」和「性別」都看得到分群(推論:t-SNE 每次跑可能不同,這裡只看這一次)。另外,這是 2 維的圖,不能直接拿來推論 100 維裡的加減法。
t-SNE 只保證「原本很近的點,畫出來也很近」。群跟群之間的距離沒有意義,每次跑形狀也可能不同。所以只能說「這幾個字是一群」,不能說「皇室離複數很遠」。
進階:t-SNE 在做什麼(三步)
- 先在 100 維裡,替每個字列出「誰是我的近鄰」(參數
perplexity大約是「照顧幾個近鄰」,這裡設 15)。 - 在 2 維紙上隨便撒點。
- 一直挪動點,讓「100 維裡是近鄰的,紙上也靠近」。
所以它只保證「近的還是近」,不保證「遠的有多遠」。perplexity 預設 30,但只有 46 個字,所以調成 15;它必須比點的數量小,不然會報錯。
「為什麼要先轉小寫?」→ GloVe 是小寫字典,不轉會查不到(OOV),整題算答錯。
「most_similar 的 positive 和 negative 各放什麼?」→ positive 放 b、c,negative 放 a。
「哪一類最難?為什麼?」→ 貨幣:字很少見,而且有些字有別的常用意思。
「t-SNE 圖上兩群離很遠,代表意思差很多嗎?」→ 不一定,t-SNE 不保留群與群的距離。
most_similar。考試最常問的是 positive/negative 各放什麼。
5 Part III 準備教材:下載維基百科、抽 20%(TODO4,配分 5%)
結論:維基百科有 5,623,655 篇文章,太多了,所以隨機抽 20% 來當教材。重點是一篇一篇讀、讀到就決定要不要留,不要整份讀進記憶體。
助教給的資料長什麼樣
助教已經把維基百科「洗乾淨」了:拿掉網頁語法、標點,全部轉小寫,字和字之間用空白隔開。每一行就是一整篇文章。
0 anarchism is political philosophy and movement that is against all forms of authority and seeks to abolish the institutions ...
3 alabama is state in the southeastern region of the united states it borders tennessee to the north georgia to the east ...
5 abraham lincoln february april was an american lawyer politician and statesman who served as the th president of the united states from until his assassination in he led the united states through the ...
分成 11 個壓縮檔,加起來 6.93 GB(筆記本 In [18] 那一格印的)。前 10 個檔各 562,365 篇(模板註解寫的),最後一個只有 5 篇(推算:5,623,655 − 10 × 562,365 = 5)。
注意上面第 5 行(abraham lincoln):「february april was」「the th president」中間的日期和數字被拿掉了;第 0 行「anarchism is political philosophy」、第 3 行「alabama is state」少了單一字母的 a。原因是助教用 gensim WikiCorpus 的預設參數清資料:模板在 TODO4 前面寫「words with one character were discarded」(只有一個字母的字被丟掉);筆記本 In [27] 的註解也寫了這個預設「只留 2~15 個字母的英文字」,所以數字(不是字母)也會被拿掉。
抽樣的程式(逐段講解)
SAMPLE_RATIO = 0.20
random.seed(42) # ① 固定亂數種子
...
for part in wiki_parts: # ② 11 個壓縮檔依序讀
with gzip.open(part, "rt", encoding="utf-8") as f:
for line in f: # ③ 一次只讀一行(一篇文章)
n_total += 1
r = random.random() # ④ 擲一個 0~1 的亂數
if r < SAMPLE_RATIO: # 小於 0.2 就留下
output_file.write(line)
for ratio, fh in extra_outputs.items(): # ⑤ 同一個亂數,順便做 5%、10%
if r < ratio:
fh.write(line)
| # | 在做什麼 | 為什麼要這樣 |
|---|---|---|
| ① | 固定亂數種子 | 亂數其實是「照公式算出來的」,起點(種子)固定,每次跑抽到的文章就一樣。結果才能重現,報告的數字才不會每次跑都不同。 |
| ② | 直接讀壓縮檔 | 不用先解壓縮、合併,省下大量硬碟空間。解壓後約 3 倍大(推算:20% 樣本解壓後 4.16 GB,全部約 4.16 ÷ 0.2 ≈ 20.8 GB,是壓縮檔 6.93 GB 的約 3 倍)。 |
| ③ | 一行一行讀 | 老師在課堂上特別提醒過:以前有同學說 Colab 記憶體不夠,通常是程式寫法有問題——「你不要把百分之百的 wikidump 都載入,然後自己再選」(W3 01:55:49–01:56:07)。一行一行讀,記憶體裡永遠只有一篇文章。 |
| ④ | 擲亂數決定留不留 | 每篇文章有 20% 的機會被留下,所以最後大約留下 20%。是「以篇為單位」抽(助教影片 00:13:26「每一行代表一篇 Wikipedia 的文章,因此我們是以文章為單位進行取樣」)。 |
| ⑤ | 同一個亂數順便做 5%、10% | 亂數小於 0.05 的文章,一定也小於 0.10、0.20。所以 5% 的文章一定包含在 10% 裡、10% 一定包含在 20% 裡。這樣三份教材只差在「多少」,內容種類一樣,報告第 2 題的比較才公平。而且讀一趟 11 個壓縮檔要幾分鐘,這樣省掉兩趟。 |
第 ⑤ 步畫成圖:同一個亂數決定三份樣本
每篇文章只擲一次亂數 r。下圖四顆星是四篇文章的例子(r 是我編的):
- 文章 A:r=0.03,比 0.05、0.10、0.20 都小 → 三份樣本都有它。
- 文章 B:r=0.08,比 0.05 大、比 0.10 小 → 只進 10%、20%。
- 文章 C:r=0.15 → 只進 20%。
- 文章 D:r=0.62 → 都不進。
所以「5% 裡的每一篇,一定也在 10% 裡」,不可能有例外。
跑出來的結果
articles: total 5,623,655, sampled 1,124,733 (20.00%)
wiki_sampled_5.txt 1.04 GB
wiki_sampled_10.txt 2.08 GB
wiki_sampled_20.txt 4.16 GB
花了 約 3 分鐘(186 秒,執行紀錄 run_cells.log)。
「抽樣時為什麼不能先把整份資料讀進來再隨機挑?」→ 資料比記憶體大,會爆掉;要用串流(一行一行讀)的方式。
「為什麼要設定 random seed?」→ 讓結果可以重現。
6 Part III 自己編字典:前處理+訓練 Word2Vec(TODO5,配分 10%)
結論:前處理只做一件事(只留純英文字母的字),而且刻意不做「移除停用詞」和「詞形還原」,因為它們會把考卷的答案弄不見。訓練用 Skip-gram,參數盡量跟 GloVe 一樣,比較才公平。
前處理:做了什麼、沒做什麼
| 作業規格建議的做法(PDF p28) | 我有沒有做 | 為什麼 |
|---|---|---|
| 移除非英文字 | 有(只留 a~z 組成的字) | 不過效果很小:筆記本 TODO5 的輸出顯示只刪掉 0.72% 的字,因為助教已經清過了。 |
| 移除停用詞(the、of、he、she…) | 刻意不做 | 考卷裡有 206 題含有停用詞,例如家人/性別小類(筆記本上叫 family)的 he she his her,刪掉之後這些題目必錯。老師上課也說停用詞「現在一點都不重要也不會去做」(W2 01:39:50)(老師是在講搜尋引擎建索引時說的;本作業的停用詞實驗也支持同樣的結論)。第 12 節有實驗。 |
| 詞形還原(rocks → rock) | 刻意不做 | 語法類的考題就是在考字形變化(bigger、biggest、cars、danced)。還原成原形,答案就不見了。 |
| 更好的斷詞 | 不需要 | 助教的資料已經斷好字了。 |
| 只保留常見字 | 有(最多 30 萬字) | 見下面參數表的 max_final_vocab。 |
作業規定寫「不是每個技巧都會更好,你要自己試」(作業規格 PDF p28「Recommended data pre-processing steps」那頁,原文:Note that not every tricks yield better performance. You should try on your own.)。所以報告不要只列「我做了 A、B、C」,要寫「我沒做 D,因為它會讓考卷的哪些題目答不出來」。能說出「為什麼不做」,比做了一堆更有說服力。
訓練參數:每一個在調什麼
W2V_PARAMS = dict(vector_size=100, window=5, sg=1, negative=5, sample=1e-3,
min_count=5, max_final_vocab=300_000, epochs=5, workers=15, seed=42)
| 參數 | 我設多少 | 白話 | 為什麼這樣設 |
|---|---|---|---|
vector_size | 100 | 每個字用幾個數字表示(詞向量有幾個數字) | 跟 GloVe-100 一樣,比較才公平。第 12 節有試 300。 |
window | 5 | 「前後文的字」算多遠:最多前後各 5 個字(每次實際在 1~5 之間隨機取,所以近的字被看到的次數比較多;外部知識:gensim 的預設做法) | 常見預設。第 12 節有試 10。 |
sg | 1 | 1 = Skip-gram,0 = CBOW | 老師投影片的重點是 Skip-gram。第 12 節有比較 CBOW。 |
negative | 5 | 每一組真的(中心字, 前後文的字)配 5 個隨機抽的假字,讓電腦練習分辨「這一對是不是真的前後文」 | 這叫 negative sampling(負取樣):取代「對 30 萬字算機率」,所以快很多。預設值。手算例子見課堂補充第 5 點。 |
sample | 0.001 | 太常見的字(the、of)隨機跳過一些 | 加速,也讓少見字學得比較好(外部知識:Mikolov 2013 原論文)。預設值。注意:它的效果有點像「部分刪掉停用詞」,第 12 節停用詞實驗要考慮這點。 |
min_count | 5(實際被調成 30) | 收錄門檻:出現次數低於門檻的字不收進字典 | 出現太少,詞向量學不準。實際被自動調高,見下面例外 1。 |
max_final_vocab | 300,000 | 字典最多收 30 萬個字 | 作業規格 PDF p28 建議的「只保留最高頻的字」(Retain the most frequent words)。字典太大會讓答題變很慢、也比較容易猜到冷門字。 |
epochs | 5 | 整份教材讀幾遍 | 預設值。讀越多遍越準,但越久。 |
workers | 15 | 同時用幾個 CPU 執行緒 | 你的電腦有 16 個,留 1 個給系統。Colab 要改成 2。 |
seed | 42 | 亂數種子 | 固定初始值。但結果仍會小幅變動,見下面例外 2。 |
例外 1:收錄門檻被自動調高(設 5,實際 30)
因為 max_final_vocab 規定字典最多收 30 萬字,出現 5 次以上的字卻超過 30 萬個。gensim 就自動把門檻往上調,直到字數壓到 30 萬以內。
結果:20% 維基實際是出現 30 次以上才收(TODO5 輸出有印);10% 是 16 次、5% 是 9 次(In [31])。教材越大,門檻被調得越高。
例外 2:種子固定了,結果還是會小幅變動
用 15 個執行緒同時訓練時,大家更新詞向量的先後順序每次不同,所以就算種子一樣,結果也會差一點點。差多少,第 12 節實驗 ① 有量(整體約 1 個百分點)。
抽樣用的 random.seed(42) 只有一條執行緒,可以完全重現。
跑出來的結果
wiki_sampled_20.txt: removed non-[a-z] tokens 4,828,696 of 670,881,822 (0.72%)
20% wiki tokens after preprocessing: 666,053,126
trained on wiki_sampled_20_clean.txt: 37.9 min, vocab 299,405, effective min_count 30
「Skip-gram 和 CBOW 差在哪?」→ Skip-gram 用中心字猜前後文;CBOW 用前後文猜中心字。
「window 調大會怎樣?」→ 一般的說法是:看比較遠的前後文,比較偏向「主題」相關,而不是「用法」相關(這是文獻上的說法,本作業只做了一次實驗,見第 12 節)。
「為什麼你沒有移除停用詞?」→ 考卷答案裡有停用詞(he、she、his、her),刪了就答不到。
7 Part III 用自己的字典考試(TODO6 配分 10%、TODO7 配分 10%)
結論:自己用 20% 維基百科訓練的字典(本文叫 Wiki 20% 字典),正確率 48.39%,比 GloVe 字典低約 15 個百分點。語法類掉得比語意類多。但有一個小類反而贏 GloVe:美國城市在哪州。
程式
跟 TODO2 一模一樣,只是把 model(GloVe 字典)換成 my_wv(程式裡的變數名,就是本文的 Wiki 20% 字典)。另外模板在 TODO6 後面沒有放評分的格子,所以我在同一格(In [23])最後補了印成績的程式(照抄 Part II 評分格的寫法)。不然看不到成績。
先看一題真的題目:從頭到尾怎麼被打分
在看 19,544 題的正確率之前,先跟著一題走完。這題來自筆記本 In [38] 的錯題分析(家人/性別小類):
boy girl father mother
- 拆字:a=boy、b=girl、c=father,正確答案 d=mother。
- 算 b − a + c:用 Wiki 20% 字典算 girl − boy + father。
- 排除題目自己的字:boy、girl、father 不能當答案。
- 找最近的字:第 1 名是 stepmother(繼母),mother 排第 2。
- 打分:只看第 1 名 → stepmother ≠ mother,這題算錯。(如果改成「前 3 名有就算對」,這題就算對——第 12 節實驗 ④。)
- 推廣:19,544 題每一題都照做,答對題數 ÷ 19,544 = 正確率 48.39%。
跟 GloVe 比一比
| 小類 | GloVe 字典 | Wiki 20% 字典 | 差幾個百分點 |
|---|---|---|---|
| 整體 | 63.11 | 48.39 | −14.72 |
| 語意類 | 65.34 | 56.70 | −8.64 |
| 語法類 | 61.26 | 41.48 | −19.78 |
| 常見國家首都 | 93.87 | 77.87 | −16.00 |
| 全世界首都 | 88.95 | 72.81 | −16.14 |
| 貨幣 | 14.20 | 10.28 | −3.92 |
| 美國城市在哪州 | 30.81 | 35.51 | +4.70 |
| 家人/性別 | 81.62 | 74.31 | −7.31 |
| 形容詞→副詞 | 24.40 | 15.93 | −8.47 |
| 反義字首 | 20.07 | 16.01 | −4.06 |
| 比較級 | 79.13 | 49.10 | −30.03 |
| 最高級 | 54.28 | 24.33 | −29.95 |
| -ing | 69.51 | 31.34 | −38.17 |
| 國名→國籍 | 87.87 | 80.49 | −7.38 |
| 過去式 | 55.45 | 43.85 | −11.60 |
| 名詞複數 | 72.00 | 41.67 | −30.33 |
| 動詞第三人稱 | 58.39 | 40.92 | −17.47 |
為什麼比 GloVe 差
| 原因 | 說明 |
|---|---|
| 教材少很多 | 我們的教材 6.66 億字。GloVe 讀的是維基百科全部+大量新聞(Gigaword),共約 60 億字,大約 9 倍(外部知識:GloVe 官方公布)。 |
| 方法不同 | GloVe 用整份教材的共現統計(Global),Word2Vec 用局部視窗(Local)。老師說「一般來講我們會覺得 GloVe 比 word2vec 好」(W3 01:32:25)。 |
| 教材種類不同 | GloVe 混了新聞,我們只有維基。 |
語法類為什麼掉比較多?(推論)比較級、最高級、-ing 這些字形,在百科全書裡比較少用(百科很少寫「最好的」「正在跑」);GloVe 混了新聞,可能因此比較多。第 10 節的論壇實驗顯示「文體會影響語法類」,但論壇是網友口語,不是新聞,所以不能直接證明新聞的效果。而且 GloVe 跟我們同時差了方法、教材字數、教材種類,無法分開。
美國城市在哪州為什麼反而贏?維基百科每一個美國城市都有一篇文章,開頭常常是「X 是 Y 州的一個城市」,這種句型很多(推論,沒有數過)。我們讀的 100% 是維基百科,GloVe 混了新聞,所以這一類我們的比例比較高。(這是推論,沒有直接驗證。)
TODO7:Wiki 20% 字典的 t-SNE 圖
一樣是用跟筆記本 In [24] 完全相同的設定重畫、只加了圈和顏色:
| 這一次畫出來的圖 | GloVe 字典 | Wiki 20% 字典 |
|---|---|---|
| 有些男女配對黏在一起 | 有(boy/girl、man/woman、dad/mom、bride/groom、husband/wife;但 brother/sister、uncle/aunt 分很開) | 有(boy/girl、man/woman、dad/mom、bride/groom、husband/wife,還有 king/queen;但 brother/sister、uncle/aunt 分很開) |
| 皇室一群 | 有 | 有(king、queen、prince、princess 在右下自成一群) |
| 代名詞一群、複數一群 | 有 | 有 |
| 「繼」字輩自成一群 | 有 | 這次沒有看到,綠色字散在 father、mother、sister 中間 |
可能的解釋:stepfather 這類字在維基百科出現得不多,我們的教材又只有 GloVe 的九分之一,還學不出「繼父」跟「父親」的差別。(推論;t-SNE 每次跑可能不同,這只是一次的圖。)
「你自己訓練的詞向量為什麼比 GloVe 差?」→ 教材字數少(約九分之一)、只有維基百科沒有新聞、方法不同(全域共現統計 vs 局部視窗);三個因素混在一起,作業裡無法分開。
「哪一類下降最多?」→ 這次是 -ing(−38.17)、名詞複數(−30.33)、比較級(−30.03)、最高級(−29.95)這些語法類;美國城市在哪州反而比 GloVe 高(35.51 vs 30.81)。
8 報告怎麼寫:總原則+第 1 題(配分 5%)
結論:報告每一題都照「數字 → 觀察 → 原因」三步寫。第 1 題要交代三件事:用了哪本字典、做了哪些前處理(和刻意沒做的)、參數怎麼設。
為什麼要照這三步:助教說明報告時,要求先「展示結果」,再「解釋、分析為什麼會有效能上的差別」(助教影片 00:18:56–00:19:16,以第 3 題為例)。
總原則:每一題都這樣寫
| 步驟 | 寫什麼 | 例子 |
|---|---|---|
| 1. 數字 | 貼表格或寫出成績 | 「論壇的語意類 12.84%,維基對照組 45.77%」 |
| 2. 觀察 | 用一句話說你看到什麼 | 「論壇在語意類大輸,但比較級反而贏」 |
| 3. 原因 | 解釋為什麼,最好有證據 | 「better 在論壇出現的次數是維基的 8.5 倍」 |
只有數字沒有解釋,就沒有回答「為什麼」;只有解釋沒有數字,就沒辦法證明你的說法(推論)。
繳交版筆記本的報告已經寫好。第 8~12 節是在解釋「每一題為什麼這樣寫、數字從哪裡來、原因是什麼」,讓你看得懂、考試答得出來。
第 1 題:要點
| 要交代的 | 我的示範 |
|---|---|
| Part II 用的模型(=本文的 GloVe 字典) | glove-wiki-gigaword-100:史丹佛 GloVe,用維基百科+Gigaword 新聞約 60 億字訓練,40 萬字、每字 100 維、全部小寫(外部知識:GloVe 官方說明)。 |
| Part III 用的模型(=本文的 Wiki 20% 字典) | Gensim Word2Vec,Skip-gram。 |
| 做了的前處理 | 只留 a~z 組成的字(教材已經是小寫、去標點);字典只留最常見的 30 萬字。 |
| 刻意沒做的前處理(加分重點) | 沒移除停用詞:考卷有 he/she/his/her、won(韓圜)等答案;沒做詞形還原:語法類就是考字形變化(這點沒有做實驗,是看考卷推的)。停用詞的部分,第 12 節實驗 ② 有數據。 |
| 超參數 | vector_size=100(跟 GloVe 一樣,公平比較)、window=5、sg=1、negative=5、sample=1e-3、min_count=5(gensim 因 max_final_vocab 自動調成 30)、max_final_vocab=300,000、epochs=5、seed=42。每一個都寫一句「為什麼」(見第 6 節的表)。 |
| 抽樣方式 | 以文章為單位、random.seed(42)、5%⊂10%⊂20%(同一個亂數)。 |
| 答題方式 | 3CosAdd(b − a + c,Gensim most_similar),題目先轉小寫,查不到的字算答錯。 |
9 報告第 2 題:讀 5%、10%、20%,差多少?(配分 10%)
結論:教材越多,整體正確率越高,但教材字數每多一倍,正確率只多約 1 個百分點(46.12% → 47.15% → 48.39%)。語法類的進步超過雜訊;語意類加總的進步比雜訊小,分不出來。
先學會一把尺:雜訊
為什麼要先有這把尺:同樣的教材、同樣的設定,只換亂數種子重新訓練,正確率也不會一模一樣(第 6 節例外 2)。如果兩個結果的差,比「換種子造成的差」還小,就分不出是真的有差、還是換種子造成的。
定義(照做):5% 教材、設定全同,只換種子(42、1、2、3)各訓練一次,共 4 次。4 個正確率的最高 − 最低,就叫「雜訊」。
手算一次(數字來自 In [34])
第 1 小步:4 次的整體正確率是 46.12、46.05、47.10、46.34。最高 47.10,最低 46.05。
第 2 小步:相減:雜訊 = 47.10 − 46.05 = 1.05 個百分點。
第 3 小步:拿來比:5% → 20% 整體差 48.39 − 46.12 = 2.27。2.27 > 1.05,所以算「超過雜訊」。
反例(語意類):4 次是 55.35、54.18、55.98、54.72,雜訊 = 55.98 − 54.18 = 1.80。5% → 20% 只差 56.70 − 55.35 = 1.35。1.35 < 1.80,所以不算。
規則:兩個結果的差(不管變好或變壞),要比雜訊大,才說「超過雜訊」。每個小類各有自己的雜訊(In [34] 最右欄)。
看成績之前的前提:三份教材不只差在字數
5%、10%、20% 是同一批文章抽出來的(第 5 節),但有兩個附帶差異,也會影響正確率:
- 收錄門檻不同:9 次、16 次、30 次(第 6 節例外 1)。
- 5% 有 107 題查不到字,直接算答錯;10%、20% 是 0 題。107 題佔 19,544 題的 0.55%,所以 +2.27 個百分點裡,最多 0.55 個百分點可能來自「查得到的字變多」(推算的上限:假設這 107 題到了 20% 全部答對)。
正確率(全部 14 個小類都列出來)
| 5% | 10% | 20% | 5%→20% | 雜訊 | 判斷 | |
|---|---|---|---|---|---|---|
| 教材字數 | 1.66 億 | 3.33 億 | 6.66 億 | |||
| 收錄門檻 | 9 次 | 16 次 | 30 次 | |||
| 訓練時間 | 9.1 分 | 19.7 分 | 37.9 分 | |||
| 整體 | 46.12 | 47.15 | 48.39 | +2.27 | 1.05 | 明顯超過 |
| 語意類 | 55.35 | 55.60 | 56.70 | +1.35 | 1.80 | 沒超過 |
| 語法類 | 38.45 | 40.13 | 41.48 | +3.03 | 1.26 | 明顯超過 |
| 常見國家首都 | 81.82 | 76.48 | 77.87 | −3.95 | 2.77 | 超過,只當參考 |
| 全世界首都 | 69.83 | 71.07 | 72.81 | +2.98 | 2.39 | 超過,只當參考 |
| 貨幣 | 7.62 | 9.58 | 10.28 | +2.66 | 1.50 | 明顯超過 |
| 美國城市在哪州 | 37.37 | 35.47 | 35.51 | −1.86 | 1.66 | 超過,只當參考 |
| 家人/性別 | 68.77 | 73.32 | 74.31 | +5.54 | 4.74 | 超過,只當參考 |
| 形容詞→副詞 | 12.70 | 10.99 | 15.93 | +3.23 | 3.02 | 超過,只當參考 |
| 反義字首 | 11.82 | 14.29 | 16.01 | +4.19 | 2.22 | 明顯超過 |
| 比較級 | 44.14 | 46.92 | 49.10 | +4.96 | 4.73 | 超過,只當參考 |
| 最高級 | 17.02 | 22.37 | 24.33 | +7.31 | 2.76 | 明顯超過 |
| -ing | 29.92 | 34.28 | 31.34 | +1.42 | 4.73 | 沒超過 |
| 國名→國籍 | 78.42 | 76.11 | 80.49 | +2.07 | 1.69 | 超過,只當參考 |
| 過去式 | 44.29 | 44.87 | 43.85 | −0.44 | 2.44 | 沒超過 |
| 名詞複數 | 38.59 | 40.77 | 41.67 | +3.08 | 2.63 | 超過,只當參考 |
| 動詞第三人稱 | 37.82 | 41.49 | 40.92 | +3.10 | 2.07 | 超過,只當參考 |
| 查不到字的題目 | 107 | 0 | 0 |
判斷欄的讀法:「明顯超過」=差距至少是雜訊的 1.5 倍;「超過,只當參考」=有超過雜訊,但不到 1.5 倍(雜訊只用 4 個種子、只在 5% 量過,剛好超過的不太可靠);「沒超過」=分不出來。這條 1.5 倍是本說明額外加的保守讀法,變好、變壞一律照同一條;第 10、12 節的表照筆記本的 beyond noise?,只看有沒有超過;剛好超過(不到 1.5 倍)的,會在文中註明「只當參考」。數字來自 In [31]、In [34]。(邊界例:動詞第三人稱 3.10 ÷ 2.07 = 1.498,差一點才到 1.5 倍,所以判「只當參考」。)
報告要點:數字 → 觀察 → 原因
| 觀察 | 原因 |
|---|---|
| 教材每多一倍,整體約多 1 個百分點(+1.03、+1.24),訓練時間卻跟著加倍。 | (推論)常見的字在 5% 就出現很多次了,多出來的教材主要幫到少見的字。 |
| 語法類超過雜訊:+3.03,比雜訊 1.26 大;最高級 +7.31、反義字首 +4.19 也明顯超過。 | (推論)biggest、worst、unaware 這些字形本來就少見,要多讀一點才學得穩。 |
| 語意類加總沒超過雜訊:+1.35,比雜訊 1.80 小。 | 五個語意小類都超過各自的雜訊,但方向不一:家人/性別、全世界首都、貨幣上升,常見國家首都、美國城市在哪州下降,加總後互相抵消。其中只有貨幣超過 1.5 倍,其他四個(不管上升或下降)都只當參考。 |
| 5% 有 107 題查不到字,10% 以後沒有。 | 有些考題的字在 5% 裡出現不到 9 次(收錄門檻),沒收進字典。 |
雜訊是用 5% 量的,20% 的雜訊可能不一樣。所以報告只說「在 5% 量到的雜訊下」。而且每份教材只訓練了一次(單次實驗)。
「教材變多,結果一定變好嗎?」→ 整體會小幅變好,但要跟雜訊比;語法類超過雜訊;語意類加總沒超過雜訊,小類有升有降。
「什麼叫實驗的雜訊?怎麼量?」→ 同設定換亂數種子重跑幾次,看最高與最低正確率差多少。
10 報告第 3 題:換一種教材(配分 15%,最高)
結論:同樣字數下,論壇教材讓語意類大輸(12.84% vs 45.77%)、部分語法小類反而贏——教材種類決定字典學到什麼(單次實驗)。
為什麼:百科全書一直寫地理和國家,網友一直講「最便宜、比較好、正在找」。細節和數字在下面 3.1、3.3。
這一題在問什麼
拿一份「不是維基百科」的文字來訓練字典,考同一張考卷,然後回答三件事:
- 3.1 成績如何(配分 5%)
- 3.2 你選的教材是什麼、跟維基差在哪:大小、主題、結構(配分 5%)
- 3.3 成績為什麼變好或變差(配分 5%)
程式一定要放在報告下面,沒放這題 0 分(作業規格 PDF p31)。
3.2 我選的教材:卡達生活論壇(Qatar Living)
| 維基百科 | 卡達論壇 | |
|---|---|---|
| 是什麼 | 百科全書 | 住在卡達的外籍人士互相問問題:簽證、租房、薪水、買車 |
| 誰寫的 | 編輯,有人校稿(外部知識) | 一般網友,隨手打 |
| 文字風格 | 正式、完整句子 | 口語、縮寫、錯字很多、很多問句 |
| 主題 | 什麼都有:歷史、地理、科學、人物 | 很集中:卡達的生活大小事 |
| 結構 | 一篇很長的文章(20% 樣本平均每篇約 592 字;推算:666,053,126 字 ÷ 1,124,733 篇) | 一則發問+很多短留言(平均每段約 34 字;推算:72,919,300 字 ÷ 2,118,254 段) |
| 大小 | 都是 7,292 萬字(見下面「維基對照組」) | |
來源:SemEval 2016/2017 Task 3 的公開資料(外部知識),Gensim 可以直接下載。共 189,941 個討論串;標題、內文、每則留言各算一段,刪掉少於 3 個字的段落後,留下 2,118,254 段(筆記本輸出寫作 posts)。
關鍵設計:為什麼要多做一個「維基對照組」
論壇只有 7,292 萬字,維基 20% 有 6.66 億字,差了 9 倍(推算:6.66 億 ÷ 7,292 萬 ≈ 9.1)。如果直接拿論壇跟維基 20% 比,論壇輸了,你分不出是:
- 因為教材字數少(量的問題),還是
- 因為內容不一樣(種類的問題)。
所以我從維基裡切出剛好一樣多字(7,292 萬字)的一份當「維基對照組」,用一模一樣的參數訓練。這樣兩邊主要只差在教材種類,比較才公平。
大部分人會直接拿「另一份教材」跟「維基 20%」比,然後說「因為教材比較少所以比較差」。能想到「要控制教材字數」的人,報告 3.3 題就有說服力。這種「一次只改一個變數」的想法,叫控制變因,考試也很可能問。
下面三張表各回答一個問題:① 論壇字典考幾分?(3.1 成績)② 論壇字典是不是很多字根本沒收?(覆蓋率)③ 把「有字沒收」的題目拿掉,只比兩本字典都查得到的 15,684 題,論壇還是輸嗎?(公平比較)③ 的答案是「語意類還是輸」,所以差別不只是缺字。
3.1 成績
| 小類 | 維基對照組 | 論壇 | 誰贏 |
|---|---|---|---|
| 整體 | 41.46 | 25.78 | 維基 |
| 語意類 | 45.77 | 12.84 | 維基(大勝) |
| 語法類 | 37.87 | 36.53 | 論壇略低(−1.34,超過雜訊 1.26 但不到 1.5 倍,只當參考) |
| 常見國家首都 | 76.48 | 33.60 | 維基 |
| 全世界首都 | 54.00 | 12.51 | 維基 |
| 貨幣 | 6.93 | 1.27 | 維基 |
| 美國城市在哪州 | 33.81 | 2.92 | 維基 |
| 家人/性別 | 66.21 | 63.24 | 差距小於雜訊 4.74,不判 |
| 形容詞→副詞 | 10.28 | 13.10 | 差距小於雜訊 3.02,不判 |
| 反義字首 | 8.87 | 14.04 | 論壇 |
| 比較級 | 53.08 | 64.94 | 論壇 |
| 最高級 | 17.20 | 40.55 | 論壇 |
| -ing | 31.82 | 51.33 | 論壇 |
| 國名→國籍 | 76.55 | 21.70 | 維基 |
| 過去式 | 40.96 | 33.78 | 維基 |
| 名詞複數 | 36.26 | 41.97 | 論壇 |
| 動詞第三人稱 | 32.99 | 41.49 | 論壇 |
| 查不到字的題目 | 169 | 3,510 |
「誰贏」照筆記本 beyond noise? 的規則:差距超過該小類的雜訊才判(只看有沒有超過,不分是不是 1.5 倍)。但雜訊是在 5% 維基(1.66 億字)量的;論壇和維基對照組的教材更小,雜訊可能更大,所以「剛好超過雜訊」的語法類 −1.34 只當參考。
答案覆蓋率:字典裡有沒有這些字
「覆蓋率」=這個小類的題目裡,四個字全部都在字典裡的比例。答案不在字典裡,再聰明也答不出來。
小例子(假設的):4 題全世界首都,其中 2 題的四個字論壇字典都收了 → 覆蓋率 = 2 ÷ 4 = 50%。另外 2 題一定答錯。
| 小類 | 維基對照組 | 論壇 |
|---|---|---|
| 常見國家首都 | 100.0% | 100.0% |
| 全世界首都 | 98.3% | 48.6% |
| 貨幣 | 86.8% | 39.0% |
| 美國城市在哪州 | 100.0% | 68.3% |
| 家人/性別 | 100.0% | 91.3% |
| 形容詞→副詞 | 100.0% | 100.0% |
| 反義字首 | 100.0% | 100.0% |
| 比較級 | 100.0% | 100.0% |
| 最高級 | 94.1% | 100.0% |
| -ing | 100.0% | 100.0% |
| 國名→國籍 | 100.0% | 95.1% |
| 過去式 | 100.0% | 100.0% |
| 名詞複數 | 100.0% | 100.0% |
| 動詞第三人稱 | 100.0% | 100.0% |
公平比較:只算兩本字典都查得到的題目
論壇字典比較小、很多字查不到,這本身就會讓論壇正確率變低。為了把這個因素排除,筆記本另外只算「四個字在兩本字典都查得到」的 15,684 題:
| 維基對照組 | 論壇 | |
|---|---|---|
| 整體 | 42.80 | 32.12 |
| 語意類 | 52.80 | 22.10 |
| 語法類 | 37.91 | 37.01 |
| 最高級 | 18.28 | 42.90 |
| -ing | 31.82 | 51.33 |
| 國名→國籍 | 77.12 | 22.81 |
| 過去式 | 40.96 | 33.78 |
學到什麼:就算字都查得到,論壇語意類還是大輸、最高級和 -ing 還是大贏。所以差異不只是「論壇字典小、查不到字」,而是兩份教材的內容真的不一樣。
同一個字,兩本字典學到的鄰居
| 字 | 維基對照組的 5 個鄰居 | 論壇的 5 個鄰居 |
|---|---|---|
| visa | visas, passport, bdtc, passports, zwartendijk | rp, viza, iqama, residance, vissa |
| salary | salaries, remuneration, wages, repayment, paid | slary, salry, salery, sallary, salaray |
| doha | qatar, manama, abbasiyyin, dhabi, dubai | qatar, doah, qata, qatat, qutar |
| family | father, relatives, phyllanthaceae, grandparents, parents | familly, fmaily, rescidence, pernament, husbant |
| king | queen, prince, monarch, harthacnut, eystein | queen, ypsilanti, edsel, bhumibol, edshel |
| paris | fontainebleau, marseille, bercy, brussels, reims | amsterdam, cancun, france, bangkok, london |
| computer | computers, software, mainframe, hardware, computing | soundcard, desktop, pc, computers, hardware |
證據:同樣的字,在兩份教材裡出現幾次
猜原因之前,先算數字。下面是「每 100 萬個字裡出現幾次」(兩份教材一樣大,可以直接比)。
怎麼換成次數(推算,筆記本只印每 100 萬字):cheapest 在論壇每 100 萬字 27.50 次,論壇教材共 72.92 個「100 萬字」,所以大約出現 27.50 × 72.92 ≈ 2,005 次;維基對照組 0.96 × 72.92 ≈ 70 次。27.50 ÷ 0.96 ≈ 28.6 倍。
| 字 | 維基對照組 | 論壇 | 論壇是維基的幾倍 |
|---|---|---|---|
| cheapest(最便宜) | 0.96 | 27.50 | 28.64 倍 |
| biggest(最大) | 37.26 | 59.97 | 1.61 倍 |
| best(最好) | 553.01 | 988.65 | 1.79 倍 |
| looking(正在找) | 56.31 | 680.74 | 12.09 倍 |
| cheaper(更便宜) | 7.78 | 80.27 | 10.32 倍 |
| going | 104.22 | 914.05 | 8.77 倍 |
| better(更好) | 116.98 | 990.40 | 8.47 倍 |
| bigger | 13.12 | 53.58 | 4.08 倍 |
| husband/wife | 104.85/212.38 | 418.87/605.50 | 3.99/2.85 倍 |
| goes | 66.47 | 235.33 | 3.54 倍 |
| capital(首都) | 160.38 | 43.23 | 0.27 倍 |
| brazilian(巴西人) | 42.43 | 33.46 | 0.79 倍 |
| albanian(阿爾巴尼亞人) | 13.37 | 0.75 | 0.06 倍 |
| illinois(伊利諾州) | 90.02 | 1.10 | 0.01 倍 |
這張表在筆記本第 3 題的程式區(「第 3 題補充證據」那一格,畫面上是 In [30]),數字照抄筆記本輸出。
頻率能解釋一部分,但不是全部:biggest 在論壇只多 1.61 倍、best 只多 1.79 倍,最高級卻贏 23.35 個百分點;brazilian 在論壇也有維基的 0.79 倍,國名→國籍卻輸 54.85 個百分點。(推論)關鍵可能不只是「單字出現幾次」,而是「國家–國籍」「原級–最高級」這種成對關係,有沒有在同樣的前後文裡反覆出現。把反例也寫進報告,會比只放支持的數字更有說服力。
3.3 為什麼(這段就是報告要寫的內容)
| 發現 | 原因 |
|---|---|
| 首都、城市、貨幣:論壇慘輸 | 網友很少聊非洲國家的首都或美國的州(推論)。覆蓋率表顯示,論壇字典裡連字都沒有:全世界首都只有 48.6% 的題目四個字都查得到,貨幣只有 39.0%。就算字有(常見國家首都覆蓋率 100%),(推論)出現次數太少、也很少出現在「首都是…」這種前後文,關係學不起來;capital 一字在論壇只有維基的 0.27 倍可以間接支持。 |
| 國名→國籍:論壇大輸 | (推論)albanian 在論壇只有維基的 0.06 倍;但 brazilian 也有 0.79 倍,國名→國籍仍大輸——可能是「巴西–巴西人」這種成對關係,在論壇裡很少出現在相同的前後文。 |
| 比較級、最高級、-ing、動詞第三人稱:論壇反而贏 | 上面的字頻表顯示,網友用 cheapest、looking、better、goes 的頻率是維基的 3.5~28.6 倍。(推論)字形出現越多次、前後文越一致,詞向量越準。 另一個可能的因素:論壇字典只有維基對照組字典的一半大(100,310 vs 224,050 字,In [28]),干擾的候選字比較少。「公平比較」排除查不到的題目後論壇仍然贏,但字典大小的影響沒有完全排除。 |
| 家人/性別:差不多 | 差 2.97 個百分點,小於這個小類的雜訊 4.74,不下結論。 |
| 論壇的鄰居常常是錯字 | 上面 7 個字裡,salary、family、doha、visa 四個字的論壇鄰居大多是錯字(salary 的鄰居是 slary、salry、salery、sallary、salaray);king、paris、computer 則不是。錯字的前後文跟正確的字高度相似,詞向量用前後文學,所以把錯字當成最像的字。維基有人校稿,比較少這樣(推論)。老師投影片 W1 p94 也寫「Vector search is not robust to typos」。 |
| 論壇學到了在地用語 | visa 的鄰居有 iqama(卡達居留證)、rp(residence permit)(這兩個字的意思是外部知識);doha(卡達首都)的鄰居有 doah(doha 的錯字)、qata、qatat、qutar(qatar 的錯字)。 |
「用不同教材訓練,結果為什麼不同?」→ 字典學的是每個字出現在什麼樣的前後文;教材的主題和文體不同,常出現的字和句型就不同。
「要怎麼公平地比較兩種教材?」→ 控制教材字數一樣(維基對照組),其他參數也都一樣,只改一個變數。
「網路論壇資料有什麼問題?」→ 錯字、縮寫、HTML、網址,要清理;錯字會變成「最像的字」。
11 報告第 4 題:挑字,各找最像的 5 個字(配分 10%)
結論:「最像的字」(鄰居)常常不是人想的那樣,原因可以分成四種(下面觀察 ①~④);觀察 ⑤ 是兩個比較「正常」的字,當對照。
挑字的原則(這也是加分點)
| 字 | 為什麼挑它 |
|---|---|
| king | 考卷裡的字,當比較的起點 |
| cat | 老師說做完作業會發現熟悉的字附近不是你想的(W3 00:04:34–00:05:43),驗證看看 |
| apple、bank | 一字多義(水果/公司;銀行/河岸) |
| good | 看反義詞會不會跑進來 |
| taiwan | 專有名詞 |
| computer | 一般名詞,當比較基準 |
結果
| 字 | GloVe 字典 | Wiki 20% 字典 |
|---|---|---|
| king | prince, queen, son, brother, monarch | nangklao, chlothar, queen, suryavarman, bodawpaya |
| cat | dog, rabbit, cats, monkey, pet | rabbit, dog, sourpuss, mouse, pet |
| apple | microsoft, ibm, intel, software, dell | blackberry, iphone, goldieblox, tvos, raspberry |
| bank | banks, banking, credit, investment, financial | guaranty, savings, ameriprise, indymac, onewest |
| good | better, sure, really, kind, very | sure, decent, lovely, bad, thankful |
| taiwan | mainland, china, taiwanese, taipei, hong | taipei, china, guangdong, hainan, fujian |
| computer | computers, software, technology, pc, hardware | computing, computers, software, mainframe, hardware |
兩本字典的相似度尺度不同,只能比「各自的排名」,不能拿相似度互相比大小。
觀察 ①:冷門字會擠進鄰居名單
筆記本印出了每個鄰居在 20% 維基裡出現幾次:
| 字 | 鄰居(出現次數) |
|---|---|
| king | nangklao(34,泰國國王,外部知識)、chlothar(76)、queen(92,609)、suryavarman(53)、bodawpaya(77) |
| bank | guaranty(330)、savings(8,467)、ameriprise(49)、indymac(86)、onewest(38) |
其中 nangklao、chlothar、suryavarman、bodawpaya、ameriprise、indymac、onewest 只出現 34~86 次,在 30 萬字的字典裡屬於最冷門的一群(收錄門檻是 30 次)。(推論)一個字只出現幾十次,而且幾乎每次都在國王或銀行的文章裡,它的詞向量就被拉到 king、bank 旁邊。
證據:只在「最常見的 5 萬個字」裡找鄰居,冷門字被排除,king 變成 queen, throne, prince, reigned, ruler;bank 變成 savings, bancorp, banking, lenders, jpmorgan——合理多了。
觀察 ②:反義詞很近
good 的鄰居有 bad,相似度 0.70(In [33])。「這部電影很 ___」兩個字都能填,前後文相似,詞向量分不出正反(推論)。
觀察 ③:一字多義被常見的意思蓋掉
- apple:前 15 名全部是公司或科技產品(blackberry、iphone、tvos、ipad、android……;goldieblox 是玩具公司,外部知識;raspberry 在這裡是 Raspberry Pi 小電腦,外部知識)。apple 跟 banana 只有 0.41、跟 fruit 0.37,跟 microsoft 卻有 0.65。
- bank:前 5 名都是金融,但 bank 跟 river(河)0.49,反而比跟 money(錢)的 0.40 還高。(推論)所以河岸的意思可能沒有消失,而是跟銀行的意思混在同一個詞向量裡,只是排不進前 5。money 是很泛用的字,這組比較只是旁證。
這就是「一個字只有一個詞向量」的限制。老師投影片 W1 p60 正是用 bank 舉例;要解決要用上下文詞向量(BERT,W2 p39)。
觀察 ④:鄰居反映教材內容
先講 cat 的驗證結果:cat 的鄰居大多還是動物(rabbit、dog、mouse、pet),只有 sourpuss 一個怪字。所以老師說的現象在 cat 身上不明顯,在 king、bank 身上比較明顯(觀察 ①)。
那 sourpuss 是什麼?筆記本回到教材搜尋,印出的前 5 處前後文裡,有 2 處是卡通角色名單(「toon characters including … gandy goose sourpuss dinky duck …」),其餘是字源說明、電視集名、樂團名。(Sourpuss 是老卡通 Terrytoons 裡的一隻貓——這點是外部知識,教材裡沒寫。)它只出現 64 次、而且(推論)5 處裡有 2 處和動物卡通角色並列,可能因此被拉到 cat 旁邊。
觀察 ⑤:taiwan 和 computer
taiwan 的鄰居兩本字典都有 taipei、china;GloVe 字典另外是 mainland、taiwanese、hong,Wiki 20% 字典另外是 guangdong、hainan、fujian 三個中國沿海省份(省份是外部知識)。(推論)教材常把台灣和兩岸、華南地區放在同樣的前後文裡寫,所以詞向量很近。computer 的鄰居兩邊都是同類詞(computers、software、hardware),是 7 個字裡最「乖」的一組(推論:一般名詞、用法單一時,詞向量比較符合直覺;這裡只看了 computer 一個字)。
「為什麼 good 跟 bad 會很像?」→ 前後文相似;詞向量學的是分布,不是意思。
「一個字兩種意思,詞向量怎麼處理?」→ 只有一個詞向量,兩種意思混在一起,常見的意思主導排名(推論:少見的意思可能還在,例如 bank–river 0.49 高於 bank–money 0.40)。
「鄰居名單出現怪字,可能的原因?」→ 冷門字只出現幾十次、前後文單一,詞向量被拉到特定字旁邊。
12 報告第 5 題:加分實驗(配分 5%,但最能拉開差距)
結論:我做了 8 個加分實驗(實驗 ①~⑧,對照筆記本第 5 題 (a)~(h),見用語表)。最有價值的是:①先量雜訊(讓後面每個比較都知道算不算數);②停用詞實驗(整體沒超過雜訊、家人/性別卻掉 14.82 個百分點,證明只看整體會被騙);③調參數(300 維只用 5% 教材就贏過 Wiki 20% 字典);⑤錯題分析(45% 的錯題,正確答案就在第 2~10 名)。實驗 ⑧ 覆蓋率在第 10 節用到。
每個實驗都照同一個格式:想知道什麼 → 怎麼做 → 結果 → 學到什麼。
實驗 ①:先量雜訊——同樣的設定,正確率會差多少?(第 5 題 (a),In [34])
| 想知道什麼 | 同樣的設定再跑一次,結果會不會一樣?差多少? |
|---|---|
| 怎麼做 | 5% 維基、參數全部一樣,只換亂數種子(42、1、2、3),訓練 4 次。第 9 節有一步一步的手算。 |
| 種子 42 | 種子 1 | 種子 2 | 種子 3 | 雜訊(最高−最低) | |
|---|---|---|---|---|---|
| 整體 | 46.12 | 46.05 | 47.10 | 46.34 | 1.05 |
| 語意類 | 55.35 | 54.18 | 55.98 | 54.72 | 1.80 |
| 語法類 | 38.45 | 39.30 | 39.72 | 39.37 | 1.26 |
| 各小類 | (見 In [34]) | 1.50~4.74(家人/性別、比較級、-ing 最大,約 4.7) | |||
學到什麼:整體的雜訊約 1 個百分點,小類的雜訊最大到 4.74 個百分點。所以後面每個比較,筆記本都自動印一欄「beyond noise?」,差距沒超過雜訊的,不下結論。這是讓報告可信的關鍵。
下圖把後面實驗 ②③ 的整體正確率放到這把尺上看:粉紅帶子是「基準 46.12 ± 雜訊 1.05」,落在帶子裡的分不出來,落在帶子外的才算真的有差。
實驗 ②:移除停用詞到底會怎樣?(第 5 題 (b),In [35])
| 想知道什麼 | 作業規格 PDF p28 建議可以試「移除停用詞」(Remove stop words),我沒做。真的做了會怎樣? |
|---|---|
| 怎麼做 | 先數考卷有幾題含停用詞(NLTK 的英文停用詞表),再拿同一份 5% 維基,一份保留、一份刪掉停用詞,一樣的參數各訓練一次。 |
考卷裡有 206 題含停用詞:家人/性別 86 題(he、she、his、her)、形容詞→副詞 62 題、貨幣 58 題(Korea won 的 won——NLTK 把它當成 won't 的一部分,外部知識)。
| 保留 | 刪掉 | 差 | 超過雜訊? | |
|---|---|---|---|---|
| 整體 | 46.12 | 45.25 | −0.87 | 否 |
| 語意類 | 55.35 | 55.41 | +0.06 | 否 |
| 語法類 | 38.45 | 36.81 | −1.65 | 是 |
| 家人/性別 | 68.77 | 53.95 | −14.82 | 是 |
| 動詞第三人稱 | 37.82 | 26.55 | −11.26 | 是 |
| 比較級 | 44.14 | 37.01 | −7.13 | 是 |
| 名詞複數 | 38.59 | 41.89 | +3.30 | 是 |
| 國名→國籍 | 78.42 | 80.61 | +2.19 | 是 |
| 過去式 | 44.29 | 41.09 | −3.21 | 是 |
| 查不到字的題目 | 107 | 284 | 多 177 題 |
表裡列了 In [35] 所有「超過雜訊」的小類,加上整體、語意類;其他沒超過雜訊的小類見 In [35]。查不到字只多 177 題、不是 206 題:206 題裡有些在保留版本就已經查不到了(推論,筆記本沒有印重疊題數)。
超過多少(用第 9 節的讀法):語法類 1.31 倍、名詞複數 1.25 倍、國名→國籍 1.30 倍、過去式 1.32 倍只是剛好超過(只當參考);家人/性別 3.13 倍、動詞第三人稱 5.44 倍、比較級 1.51 倍是明顯超過。(推算:差距 ÷ 該列雜訊。)
| 學到什麼 |
整體的變化沒超過雜訊,底下卻有明顯的此消彼長。只看整體會以為「刪不刪都沒差」。
|
|---|
實驗 ③:調參數——一次只改一個設定(第 5 題 (c),In [36])
| 想知道什麼 | Skip-gram 換 CBOW、視窗變大、向量變長,各會怎樣? |
|---|---|
| 怎麼做 | 都用 5% 維基,以「Skip-gram、window 5、100 維」為基準,每次只改一個(控制變因)。 |
| 設定 | 訓練時間 | 整體 | 語意類 | 語法類 | 整體差 |
|---|---|---|---|---|---|
| 基準 | 9.1 分 | 46.12 | 55.35 | 38.45 | — |
| CBOW | 9.3 分 | 52.58 | 58.60 | 47.58 | +6.46 |
| window=10 | 15.2 分 | 41.75 | 51.22 | 33.87 | −4.37 |
| vector_size=300 | 17.9 分 | 57.44 | 68.54 | 48.22 | +11.32 |
三個整體差距(4.37~11.32 個百分點)都遠大於雜訊 1.05。
| 學到什麼 |
|
|---|
改成 300 維或 CBOW 都會大幅提高正確率。但作業評分看的是分析,不是正確率;而且改了 Wiki 20% 字典,報告其他題的數字都要重跑重寫。我維持 100 維 Skip-gram(跟 GloVe-100 同維度、是老師教的重點),把這個發現放在加分題。
實驗 ④:前 k 名正確率(第 5 題 (d),In [37])
定義(照做):電腦列出相似度最高的 k 個字,正確答案只要在這 k 個裡面,這題就算對。k=1 就是原本的正確率。
用第 7 節那一題走一次:boy girl father mother,電腦第 1 名 stepmother(錯)、第 2 名 mother(對)。
| 規則 | 這一題算 |
|---|---|
| 只看第 1 名(k=1) | 錯 |
| 前 3 名(k=3) | 對 |
19,544 題都這樣算,就得到下表:
| 第 1 名 | 前 3 名 | 前 5 名 | 前 10 名 | |
|---|---|---|---|---|
| GloVe 字典 | 63.11 | 73.68 | 77.73 | 82.01 |
| Wiki 20% 字典 | 48.39 | 61.53 | 66.32 | 71.74 |
學到什麼:Wiki 20% 字典從第 1 名到前 3 名,正確率多了 13.14 個百分點(GloVe 多 10.57)。很多題不是「完全不懂」,而是「差一點」——呼應老師說 queen「可能在前三名」(W3 00:31:24)。
實驗 ⑤:錯題分析——電腦答錯時猜了什麼?(第 5 題 (e),In [38])
Wiki 20% 字典答錯 10,087 題。其中 0 題是因為查不到字,4,563 題(45%)正確答案在第 2~10 名。錯法很有規律:
| 錯法 | 例子(題目第三個字 → 電腦答 / 考卷答案) | 說明 |
|---|---|---|
| 拼法不同 | Argentina → argentinian / argentinean Belarus → belarusian / belorussian Slovakia → slovak / slovakian | 電腦其實答對了,是考卷用另一種拼法(外部知識:兩種拼法都有人用)。考卷本身也有限制。 |
| 方向相反 | large → smaller / larger long → shorter / longer | 反義詞的詞向量太近,加減時走到對面(推論)。 |
| 同類、選錯一個 | Baghdad → syria / iraq Armenia → hryvnia(烏克蘭的錢,外部知識)/ dram Cambodia → kyat(緬甸的錢,外部知識)/ riel | 知道答案是「一個國家」「一種貨幣」,但對不到正確那個。 |
| 近親字 | father → stepmother / mother groom → bridesmaid / bride | 用法太像(推論)。 |
| 被別的意思帶走 | great → britain / greater child → childbearing / children | (推論)great 常出現在 Great Britain 這類專有名詞裡,詞向量被這個用法拉走;沒有回教材驗證。 |
學到什麼:錯題分析把「正確率低」拆成好幾種原因:有的是詞向量的缺點(反義詞),有的是教材的偏差,有的根本是考卷的問題(拼法)。這種拆解,就是老師說考試要看的「做作業的過程跟 insight」(W3 02:48:55)。
實驗 ⑥:換一種算答案的公式(3CosMul)(第 5 題 (f),In [39])
| 想知道什麼 | b − a + c(3CosAdd)之外,學術界還提過 3CosMul(用乘除,Levy & Goldberg 2014)。會更好嗎? |
|---|---|
| 結果 | 同一份 Wiki 20% 字典:48.39 → 44.66,14 個小類全部下降。 |
| 學到什麼 | 論文說常常比較好的方法(外部知識:Levy & Goldberg 2014),換到你的教材不一定成立。原因沒驗證(推論:可能跟字典裡很多冷門字有關)。 |
進階:3CosMul 的公式(外部知識)
3CosAdd 是「算出 ★ = b − a + c,找最靠近 ★ 的字」。
3CosMul 是對每個候選字 d 算:相似度(d, b) × 相似度(d, c) ÷(相似度(d, a) + 一個很小的數),挑最大的。gensim 會先把相似度換到 0~1。
白話:要「像 b、也像 c,但不像 a」,用乘除而不是加減。
實驗 ⑦:同一批字,PCA 和 t-SNE 畫出來一樣嗎?(第 5 題 (g),In [40])
| PCA(左) | t-SNE(右) | |
|---|---|---|
| 它在做什麼 | 找「點分布最長的方向」,用前兩個方向當畫圖的座標(線性) | 盡量讓「原本是鄰居的點」畫出來還是鄰居(非線性) |
| 圖上看到什麼 | 上下方向只有微弱的男女傾向:he、his、king 在最上;mom、grandma、aunt 在下。但分不乾淨(she、her、queen 在上半;dad、grandpa、husband 在下半) | 沒有明顯的男女軸;有些配對貼得很緊(boy/girl、groom/bride、dad/mom、king/queen),但 brother/sister、uncle/aunt、stepfather/stepmother 分得很開 |
| 適合看什麼 | 有沒有一條「關係方向」 | 誰跟誰是一群 |
進階:PCA 怎麼找方向(三步)
- 把所有點畫出來,找出點分布最長的方向,那條線就是第 1 主成分。
- 跟它垂直的方向就是第 2 主成分。
- 把每個點投影到這兩條線上,得到的兩個數字就是 PCA 圖上的位置。
因為只是「換個角度看」(線性),原本平行的線投影後還是平行;t-SNE 會把空間扭曲,所以不保證。
實驗 ⑧:覆蓋率(第 5 題 (h),In [41])
每個小類有多少題「四個字都在字典裡」。GloVe 字典和 Wiki 20% 字典的貨幣都是 100%,所以它們答錯貨幣題不是因為查不到字。這個量法在第 10 節比論壇時最有用(論壇字典的貨幣只有 39.0%)。
「雜訊怎麼量?為什麼要量?」→ 同設定換種子跑 4 次,最高減最低;差距要比它大才算數(第 9 節手算)。
「前 k 名正確率是什麼?為什麼前 3 名比第 1 名高很多?」→ 正確答案在前 k 個就算對;很多題正確答案排第 2、3 名,例如 boy girl father mother 的 mother 排第 2。
總結論:整份作業學到的 8 件事
結論:詞向量真的能抓到字的關係,但它是從「前後文相似」學來的,所以讀多少、讀什麼、怎麼整理、怎麼學都可能改變它學到的東西;它也有一字一向量的根本限制。下面 8 件事,每一件都有筆記本的數字當證據。
| # | 結論 | 證據(繳交版筆記本的數字) | 對應投影片/上課 |
|---|---|---|---|
| 1 | 字可以變成有意義的詞向量,關係大致可以用加減算出來 | GloVe 字典正確率 63.11%;t-SNE 圖上部分男女配對貼在一起(boy/girl、man/woman)、有幾個按角色分的群 | W2 p30(Washington − U.S. + U.K. = London);W3 00:28 老師:看的是「對比關係」 |
| 2 | 詞向量是從「前後文相似」學來的,不是從「意思」 | good 的鄰居有 bad(0.70);論壇裡 salary 的鄰居是錯字 slary;king 的鄰居第一名是只出現 34 次的 nangklao(冷門字效應) | W1 p70、W2 p24(分布假說) |
| 3 | 教材越多越好,但幅度小;語法類的進步超過雜訊、語意類加總沒有(推論:語法類的字形比較少見,更需要教材) | 5%→10%→20%:46.12→47.15→48.39;語法類 +3.03(超過雜訊)、語意類 +1.35(沒超過雜訊) | 課程沒有直接講,是本作業的實驗結果(W1 p93 的「It depends」是最接近的說法) |
| 4 | 教材種類決定學到哪些關係(單次實驗) | 一樣大小下,論壇語意類 12.84 vs 維基對照組 45.77,但最高級 40.55 vs 17.20;只算兩邊都查得到的題目,結果方向不變。cheapest 在論壇的頻率是維基的 28.64 倍,illinois 只有 0.01 倍 | W1 p93(It depends) |
| 5 | 前處理沒有絕對的好壞,要看任務(單次實驗) | 刪停用詞:整體 −0.87(沒超過雜訊),但家人/性別 −14.82、動詞第三人稱 −11.26(明顯超過雜訊);國名→國籍反而 +2.19(超過雜訊但不到 1.5 倍,只當參考) | W1 p47;W2 01:39:50(停用詞「現在不會去做」) |
| 6 | 在這份作業的設定下,訓練設定的影響比教材字數大 | 300 維只用 5% 教材(57.44)就贏過 100 維的 Wiki 20% 字典(48.39);CBOW +6.46;window 10 −4.37。但每個只做一次 | W3 01:22:17(維度不是越大越好)、01:12:12(老師用 Skip-gram) |
| 7 | 評估方式本身也有限制 | Wiki 20% 字典的前 3 名正確率比第 1 名高 13.14 個百分點;45% 的錯題正確答案在第 2~10 名;有些「錯」只是拼法不同(argentinian/argentinean);同設定換種子重跑,整體雜訊 1.05、小類雜訊最大 4.74;3CosMul 反而較差 | W3 00:31 老師:queen「可能在前三名」 |
| 8 | 一字一向量是根本限制 | apple 前 15 名全是公司或科技產品;bank 前 5 名都是金融,但 bank–river 0.49 仍高於 bank–money 0.40(推論:兩種意思可能混在同一個詞向量裡) | W1 p60(bank 一詞多義)、W2 p39(上下文詞向量) |
考前背這一句
詞向量根據「分布假說」,從前後文學出每個字的詞向量,能用加減做類比;但它學的是前後文而不是意思,所以會受教材的量、種類、前處理與訓練設定影響,分不出反義詞和一字多義,冷門字也會擠進鄰居——這就是後來需要 FastText(處理沒看過的字)和 BERT(看整句前後文)的原因。
13 報告第 6 題(AI 使用說明)+怎麼交出去
結論:老師允許用 AI,沒寫 AI 使用說明扣 10 分(用了不扣)。所以第 6 題要如實寫出「程式和報告由 Claude 完成」,程式每一格也要標註。最後把 .ipynb 和 requirements.txt 壓成 zip,檔名照規定,上傳 NTU COOL。
規定怎麼說
| 規定 | 出處 |
|---|---|
| 用了生成式 AI,要在程式註解和報告兩個地方都寫明 | PDF p35;助教影片 22:32 |
| 報告沒寫 AI 使用說明 −10;沒用也要寫「沒有使用」 | PDF p36;助教影片 20:13 |
| 用了 AI 卻沒註明、網路程式沒附連結、抄襲,都會扣分 | PDF p35 |
| 跟其他同學的程式或報告高度相似:雙方 −100 | PDF p36 |
繳交版已經做好的
- 每一格 AI 寫的程式,最上面都有
# [Generative AI] The code in this cell was generated by Claude (Anthropic).(資料載入的格子也有,並保留模板原本的說明註解)。 - 報告第 6 題已經照實寫好(見下面),並且附上教材和論文的出處連結。
報告第 6 題的內容(繳交版)
I used Claude (Anthropic) through Claude Code on my own computer for this assignment.
• Code: All code added to the template was generated by Claude — TODO1–TODO7, the data-loading changes, the code for Question 3, all extra experiments below the report, and the section headings below the report. Every AI-generated code cell has a# [Generative AI]comment at the top.
• Experiment design: The choice of the forum corpus, the same-size Wikipedia control, the noise measurement and the other extra experiments were proposed by Claude.
• Execution: Claude ran the whole notebook on my computer (environment above). All numbers and figures in the report come from the outputs of this notebook.
• Report: The report text, including the analysis and tables, was written by Claude based on these outputs.
• What I did: (這一行要你自己照實填,例如「I read the explanation document and checked each section against the notebook outputs.」——只寫真的做過的事)
例如你真的讀完了這份說明、對照過筆記本,就寫上去;沒做的不要寫。揭露寫得不實,比沒寫更嚴重。
執行環境(報告開頭,已填好)
Running environment: Local — Windows 11 (10.0.26200), CPU: Intel Core i7-11800H (8 cores / 16 threads), RAM 16 GB
Python version: 3.12.3
requirements.txt
gdown==6.4.1
gensim==4.4.0
matplotlib==3.11.2
nltk==3.10.3
numpy==2.5.3
pandas==3.0.6
scikit-learn==1.9.1
scipy==1.18.1
smart_open==8.0.2
tqdm==4.70.1
打包上傳
- 把
NLP_HW1_submission_draft.ipynb改名成NLP_HW1_學校_學號.ipynb(學校代碼和學號見拍板卡——HW1\_work\2026-10-04-nlp-hw1-submission\06-decision-card.html,是我列給你回答的 6 個問題)。 - 把它和
requirements.txt一起壓縮,壓縮檔叫NLP_HW1_學校_學號.zip。zip 裡只放這兩個檔。 - 上傳前用 VS Code 打開那個 .ipynb,確認每一格下面都有輸出、圖都在。
- 上傳 NTU COOL。
14 考試可能怎麼問(從作業出題)
結論:老師說考試「可能會有很大部分是從作業你做的過程跟你的 insight」,「不太會去考叫你算 BM25」(W3 02:48:36–02:49:09)。下面是從這份作業整理出來的題目,每一題都附「答案要點」。先自己想答案,再打開看。
這些是我根據老師上課說的方向和作業內容推測的,不是考古題。
觀念題
Q1. 什麼是 word analogy?怎麼用詞向量做?
「a 之於 b,等於 c 之於 d」的題目。用 b − a + c 算出一個點,在字典裡找相似度最高的字(排除 a、b、c)當答案。例:queen − king + man ≈ woman。
Q2. 為什麼詞向量可以做加減?
訓練目標是「用一個字預測它的前後文」。king 和 queen 前後文的差別(例如 he/his 換成 she/her,推論),跟 man 和 woman 前後文的差別很像,所以兩組「差向量」的方向接近。這只是近似:老師說「不是這麼 exactly 是一樣的 pattern,但是趨勢非常的 close」(W3 00:32:03),所以答題要排除 a、b、c,正確答案也常排第 2~3 名。
Q3. Skip-gram 和 CBOW 差在哪?你的實驗哪個比較好?
Skip-gram:用中心字猜前後文;CBOW:用前後文猜中心字(像克漏字)。老師上課說 CBOW 訓練比較不直覺,「我們會做 Skip-gram」(W3 01:12:12)。我的實驗(5% 維基、單次):CBOW 52.58% 比 Skip-gram 46.12% 好(差 6.46,超過雜訊 1.05),語法類差最多(比較級 +25.00)。 這是「本設定」的結果,換資料或題型可能不同。
Q4. 詞向量最大的限制是什麼?舉作業裡的例子。
①一個字只有一個詞向量,bank(銀行/河岸)分不開;作業裡 apple 的鄰居全是公司或科技產品、bank 前 5 名全是金融義 → 這是上下文詞向量(BERT、GPT)要解決的。②學的是「前後文相似」不是「意思」:反義詞(good/bad)會很近;論壇的錯字(slary)會變成 salary 最像的字。③沒看過的字(OOV)、字首字尾、錯字 → FastText 用字元片段拼出詞向量(老師說「這也會在 Assignment 1 討論」)。
Q5. GloVe 和 Word2Vec 差在哪?
Word2Vec 一次看一小段文字(視窗)來學;GloVe 先統計整份教材「哪兩個字一起出現幾次」,再用這張統計表來學。名稱裡的 Global 就是對比 word2vec 的 Local(W3 01:28:57);老師說「一般來講我們會覺得 GloVe 比 word2vec 好」(W3 01:32:25),細節請看論文(W3 01:29:33)。
Q6. 給「the cat licked its fur」、window=1,Skip-gram 的訓練資料是什麼?
(the, cat)、(cat, the)、(cat, licked)、(licked, cat)、(licked, its)、(its, licked)、(its, fur)、(fur, its)。每個字當中心字,跟前後 1 個字配對。這樣不用人工標註就能做出「給輸入、猜輸出」的訓練資料(W1 p82、W3 01:13:00)。
Q7. Word2Vec 訓練完,我們拿來用的詞向量是哪個部分?
第一層的權重矩陣 V(輸入 one-hot 乘上 V 就是查表取出一列)。網路只有一層隱藏層,大小就是詞向量的數字個數(W1 p83–90)。課堂補充第 4 點有手算。
Q8. Negative sampling 在做什麼?為什麼比較快?
原本每次要對整本字典(例如 30 萬字)算 softmax 機率。改成:真的(中心字, 前後文的字)當正例,照字頻隨機抽幾個字當負例,訓練「是不是真的前後文」的二元分類(logistic regression),每次只更新少數幾個字(W2 p33、p38)。
作業過程題
Q9. 為什麼答題前要先轉小寫?
GloVe 字典和助教清好的維基教材都是小寫。考卷有大寫字(Athens),不轉會查不到(OOV),整題算答錯。
Q10. 抽樣時怎麼避免記憶體不夠?
一行一行讀(串流),每讀一篇就擲亂數決定留不留,留的直接寫到檔案。不要整份讀進來再挑。
Q11. 你有移除停用詞嗎?為什麼?
沒有。①考卷有 206 題含停用詞(he、she、his、her、won…),移除後這些題目必錯;②老師上課說停用詞「以前很重要,但是現在一點都不重要也不會去做」(老師是在講搜尋引擎建索引時說的;本作業的停用詞實驗也支持同樣的結論),以前是為了省索引空間,而且可能刪掉重要的東西(W2 01:39:50);③投影片 W1 p47:「Avoid to broke the semantics」。我實際試過:整體 46.12→45.25(−0.87,沒超過雜訊),但家人/性別 −14.82、動詞第三人稱 −11.26(都超過雜訊)。整體正確率會掩蓋小類的變化。
Q12. 教材從 5% 增加到 20%,結果怎麼變?
5%→10%→20%:46.12→47.15→48.39,教材每多一倍約多 1 個百分點。語法類 +3.03 超過雜訊(1.26),語意類 +1.35 沒超過雜訊(1.80);語意類的五個小類都超過雜訊,但只有貨幣明顯超過(1.5 倍以上),其他四個只當參考;而且有升有降,加總後互相抵消(推論)。
Q13. 用論壇教材訓練,結果跟維基差在哪?為什麼?
一樣大小下,論壇語意類大輸(capital 只有維基的 0.27 倍、illinois 0.01 倍);國名→國籍也大輸(但 brazilian 有 0.79 倍,不只是頻率問題);語法類加總略低 1.34(超過雜訊 1.26 但不到 1.5 倍,只當參考),其中比較級、最高級、-ing 還贏(網友常說 better、cheapest、looking)。教材的主題和文體決定字典學到什麼。
Q14. 為什麼要做「維基對照組」?
為了控制變因:讓兩份教材只差在種類、不差在字數,才能說差異主要是「種類」造成的(兩本字典收的字數不同,這點沒有完全排除)。
Q15. 為什麼有些小類特別差(例如貨幣)?
①字很少見(kwanza、dram),詞向量學不準;②有些字平常有別的意思(won、real);③(只在小教材時)字根本不在字典裡,例如論壇的貨幣覆蓋率只有 39%。GloVe 和 Wiki 20% 的貨幣覆蓋率都是 100%,所以它們錯在 ① ②。
Q16. 只算「第一名猜對」公平嗎?
很嚴格。我算過:Wiki 20% 字典從第 1 名 48.39% 升到前 3 名 61.53%、前 10 名 71.74%(GloVe 字典:63.11% → 82.01%)。正確答案排第二、第三的題目不少:Wiki 20% 字典的前 3 名正確率比第 1 名多 13.14 個百分點。
Q17. t-SNE 圖可以怎麼看?有什麼要注意?
看「誰跟誰是一群」:部分男女配對黏在一起、有幾個按角色分的群(但不是每一對都黏在一起,例如 brother/sister 分得很開)。注意:群與群之間的距離沒有意義,每次跑圖形可能不同;PCA 是線性投影,保留整體方向(原本平行的差向量,例如 man→woman、king→queen,投影後仍然平行),但比較擠;t-SNE 是非線性的,只保證「原本很近的點,畫出來也很近」。
Q18. 訓練參數裡,window 和 vector_size 代表什麼?調大會怎樣?
window:看前後幾個字當前後文;vector_size:每個字用幾個數字表示。我的實驗:window=10 變差(46.12→41.75,家人/性別 −18.18);vector_size=300 大幅變好(→57.44)。都只做一次,而且老師說維度不是越大越好。
15 你接下來要做的事
結論:程式和報告已經做好,也經過三輪、共 8 位獨立審查員檢查。你要做的是三件事:看懂、照實補上你做的部分、打包交出去。最重要的是看懂——考試會考。
步驟清單
| # | 做什麼 | 大概多久 | 看哪裡 |
|---|---|---|---|
| 1 | 讀「全貌」「用語表」「4 個觀念」(拿紙筆跟著手算) | 40 分鐘 | 第 0 節、用語表、第 1 節 |
| 2 | 讀「我做了什麼」「邏輯框架」「課堂補充」 | 40 分鐘 | 第 1 節後面三節 |
| 3 | 對照示範筆記本,讀每一步怎麼做、結果怎麼看 | 1~2 小時 | 第 2~12 節 |
| 4 | 讀總結論,試著用自己的話講一遍 | 20 分鐘 | 總結論 |
| 5 | 回拍板卡的問題(學校代碼、學號等) | 5 分鐘 | 拍板卡 |
| 6 | 在報告第 6 題最後一行,照實寫你做了什麼 | 5 分鐘 | 第 13 節 |
| 7 | 改檔名、壓 zip、打開檢查、上傳 | 15 分鐘 | 第 13 節+「作業介紹」的繳交檢查清單 |
| 8 | 考前:讀考試題、課堂補充、總結論 | 1 小時 | 第 14 節 |
① 這份筆記本和報告不要給任何同學看。兩份太像,雙方都 −100。
② 考試是閉書,考作業的過程和 insight(W3 02:48:36)。作業是我做的,但考試要你自己答——所以第 1~4 步一定要做。
16 我實際做的時候遇到的問題(你可能也會遇到)
結論:真的會卡住的地方都不是演算法,而是「環境」和「資料」:下載、舊程式不相容、Windows 指令不同。每一個都有簡單的解法。
| # | 遇到什麼 | 為什麼 | 怎麼解決 |
|---|---|---|---|
| 1 | 模板的 !wget、!cat、!gunzip、!head 在 Windows 上不能跑 | 這些是 Linux 指令,Colab 是 Linux 所以能跑 | 改成 Python 寫法(urllib、gzip)。屬於「載入資料」,規定允許改。 |
| 2 | GloVe 下載很慢(128 MB 下載了 20 幾分鐘) | Gensim 從 GitHub 下載,那時我同時在下載維基百科,搶網路 | 耐心等;或先下載 GloVe,再下載維基百科。下載過一次就會存在 gensim-data 資料夾,之後秒開。 |
| 3 | 最後一個維基檔只有 2.8 KB,以為下載壞了 | 不是壞了,它本來就只有 5 篇文章 | 用 gzip -t 檢查壓縮檔是否完整。模板註解也有寫「except the last file」。 |
| 4 | 論壇教材讀取時 ImportError: cannot import name 'smart_open' | 那份資料附的讀檔程式是幾年前寫的,用到的套件後來改名了 | 只用 Gensim 下載(return_path=True),自己用 gzip+json 讀。老師上課也提到 Gensim 有些套件一直沒在更新(W3 02:50:15)。 |
| 5 | 論壇教材裡有使用者名稱、日期、網址、網頁語法 | 原始檔就是網頁 | 只取發問標題、內容、留言三個欄位,再用正規表示式刪掉網址和 HTML。 |
| 6 | 正式版跑了好幾個小時,中途關機就得整本重跑 | 訓練好的字典只在記憶體裡,程式中斷就不見了 | 挑一個電腦能一直開著的時段跑;跑的期間不睡眠、不闔螢幕;先用小資料「彩排」確認每一格都能跑。 |
| 7 | 同時跑別的重運算,訓練從約 38 分鐘變成 109 分鐘 | 兩個程式搶 CPU | 跑作業時不要同時跑其他吃 CPU 的程式。 |
| 8 | 同樣設定跑兩次,小類成績不一樣 | 多執行緒訓練的計算順序每次不同 | 不是 bug。先量雜訊,差距要比雜訊大才下結論(第 12 節實驗 ①)。 |
| 9 | 硬碟空間估太多 | 以為 11 個檔每個都 1.4 GB,其實後面的檔小很多 | 實際只有 6.93 GB。先看檔案大小再估。 |
本文件的每一項判斷都來自實際查證(在本機實際執行完整筆記本、讀每一格的輸出、回查訓練語料、對照老師投影片與上課逐字稿),程式與報告經三輪、共 8 位獨立審查員檢查後修正;這份說明另依教學文件規範審查四輪(07a 全面審查、07b/07c/07d 逐輪驗證修正),事實錯誤與前後矛盾都已修正並經最後一位審查員確認為 0;最後一輪指出的 3 個小問題也已修正。文中標「推論」的地方,是根據原理推的解釋,沒有另外做實驗驗證;標「外部知識」的地方,是筆記本和課程以外的一般知識;標「推算」的數字,是用筆記本輸出的數字相除得到的。