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
-ing69.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] 完全一樣的設定重畫的(點的位置相同),只多加了圈和顏色,方便你找:

⟦IMG:glove_tsne_marked⟧

怎麼看這張圖:

看圖要小心
t-SNE 只保證「原本很近的點,畫出來也很近」。群跟群之間的距離沒有意義,每次跑形狀也可能不同。所以只能說「這幾個字是一群」,不能說「皇室離複數很遠」。
進階:t-SNE 在做什麼(三步)
  1. 先在 100 維裡,替每個字列出「誰是我的近鄰」(參數 perplexity 大約是「照顧幾個近鄰」,這裡設 15)。
  2. 在 2 維紙上隨便撒點。
  3. 一直挪動點,讓「100 維裡是近鄰的,紙上也靠近」。

所以它只保證「近的還是近」,不保證「遠的有多遠」。perplexity 預設 30,但只有 46 個字,所以調成 15;它必須比點的數量小,不然會報錯。

考試可能問
「為什麼要先轉小寫?」→ GloVe 是小寫字典,不轉會查不到(OOV),整題算答錯。
「most_similar 的 positive 和 negative 各放什麼?」→ positive 放 b、c,negative 放 a。
「哪一類最難?為什麼?」→ 貨幣:字很少見,而且有些字有別的常用意思。
「t-SNE 圖上兩群離很遠,代表意思差很多嗎?」→ 不一定,t-SNE 不保留群與群的距離。
所以對你的影響是:TODO2 的核心只有三件事——轉小寫、檢查查不查得到、most_similar。考試最常問的是 positive/negative 各放什麼。

7 Part III 用自己的字典考試(TODO6 配分 10%、TODO7 配分 10%)

結論:自己用 20% 維基百科訓練的字典(本文叫 Wiki 20% 字典),正確率 ⟦R:w20_overall⟧,比 GloVe 字典低約 15 個百分點。語法類掉得比語意類多。但有一個小類反而贏 GloVe:美國城市在哪州。

程式

跟 TODO2 一模一樣,只是把 model(GloVe 字典)換成 my_wv(程式裡的變數名,就是本文的 Wiki 20% 字典)。另外模板在 TODO6 後面沒有放評分的格子,所以我在同一格(In [23])最後補了印成績的程式(照抄 Part II 評分格的寫法)。不然看不到成績。

先看一題真的題目:從頭到尾怎麼被打分

在看 19,544 題的正確率之前,先跟著一題走完。這題來自筆記本 In [38] 的錯題分析(家人/性別小類):

boy girl father mother
  1. 拆字:a=boy、b=girl、c=father,正確答案 d=mother。
  2. 算 b − a + c:用 Wiki 20% 字典算 girl − boy + father。
  3. 排除題目自己的字:boy、girl、father 不能當答案。
  4. 找最近的字:第 1 名是 stepmother(繼母),mother 排第 2。
  5. 打分:只看第 1 名 → stepmother ≠ mother,這題算錯。(如果改成「前 3 名有就算對」,這題就算對——第 12 節實驗 ④。)
  6. 推廣:19,544 題每一題都照做,答對題數 ÷ 19,544 = 正確率 ⟦R:w20_overall⟧。

跟 GloVe 比一比

⟦R:w20_vs_glove_rows⟧
小類GloVe 字典Wiki 20% 字典差幾個百分點

為什麼比 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] 完全相同的設定重畫、只加了圈和顏色:

⟦IMG:w20_tsne_marked⟧

這一次畫出來的圖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)。
所以對你的影響是:考試問「為什麼比 GloVe 差」,要講三個因素(教材字數、教材種類、方法),並說「作業裡這三個分不開」。