結論:作業只用到 Word2Vec 的「結果」(訓練好的字典),但老師上課講了它「怎麼來的」。閉書考試會考你能不能把作業跟上課內容串起來。
怎麼讀:12 點分成四組——A 怎麼學出來、B 怎麼用和評估、C 有什麼限制、D 前處理。每一點都附投影片頁碼或上課時間,可以回去對照。
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。
「A word is characterized by the company it keeps」(Firth 1957)。注意定義是出現在相似的前後文,不是「兩個字常一起出現」:
依據:W1 p70、W2 p24。
拿一句話,每個字輪流當中心字,跟它前後 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。
結論:網路的第一層是一張表(矩陣 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 的詞向量。
| 步驟 | 在做什麼 |
|---|---|
| 第二層(矩陣 U) | 拿查到的那一列,跟每個字的「輸出向量」做內積,得到每個字一個分數 |
| softmax | 把分數變成機率(全部加起來是 1):每個字出現在中心字前後文的機率 |
| cross-entropy | 看「真正出現的前後文字」被分到多少機率;機率越低,懲罰越大,就調整 V 和 U |
依據:W1 p83–90、W2 p37;W3 01:17:01–01:27:48。
為什麼要它:第 4 點的 softmax 要對整本字典(30 萬字)每個字都算機率,非常慢。
手算例子(句子「the cat licked its fur」,中心字 cat):
依據:W2 p33、p38。作業設定 negative=5 就是這個。piano、river 是我舉的例子。
老師原話:「我們看的並不是字的向量的絕對的向量的東西,而是一種對比的關係」。man→woman 和 king→queen 那條線「方向斜率」很一致,但不是完全一樣。
所以可能同時出現兩件事:類比題答得不錯(相對關係很好),但某個字的鄰居不是你想的(絕對位置不可靠)。老師說做完作業會發現「你所熟知的字」附近的向量不是你想的(W3 00:04:34–00:05:27)。
這次的結果: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]。
投影片 W1 p94 列了兩句很適合拿來解釋作業的話:
依據:W1 p94。
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。
bank(銀行/河岸)是老師投影片的例子。Word2Vec、GloVe 一個字只有一個詞向量,叫靜態詞向量;BERT、GPT 會看整句話給不同的詞向量,叫上下文詞向量。
依據:W1 p60、W2 p39–40。
投影片 W2 p31 用 broadcast、network 舉例:同一個字在不同年代的鄰居不一樣(network 從電報、電線,變成網路、社群媒體)。所以用很久以前的教材訓練的字典(GloVe 是 2014 年的資料,外部知識),不一定符合現在的用法。我們自己訓練的 Wiki 20% 字典裡,apple 的鄰居有 iphone、tvos,反映這份維基教材的年代(推論)。
依據:W2 p31。
老師原話:以前移除停用詞「很重要,但是現在一點都不重要也不會去做」(老師是在講搜尋引擎建索引時說的;本作業的停用詞實驗也支持同樣的結論)。以前是為了省 20~30% 的索引空間,而且「搞不好有一些很重要的東西被拿掉」。投影片也寫:「When to remove stop words? Avoid to broke the semantics.」
這是報告第 1 題「為什麼不刪停用詞」最好的課程依據。
依據:W2 01:39:50–01:40:54;W1 p47。