上課筆記系列(1):word2vec:lookup table和矩陣權重的關聯性
大家好,這是上課筆記系列。未來如果有一些觀念在課程中有特別提出來討論的,有空我會記在這裡。有CV和NLP兩個系列,編號則隨意。次分類會根據神經網路模型,或者是大觀念來進行。
今天就開始第一篇筆記吧。沒想到是從NLP開始,而不是我現在著重的CV~不過無妨,萬事起頭難,只要克服了最大靜摩擦力,推動起來就比較輕鬆啦。會討論這個,是因為在講到word2vec的時候,提到「怎麼把文字轉成向量」的問題。文字就一個一個,怎麼轉成對應的向量表現其關聯性呢?
圖片轉成向量
這個比較好理解,我們可以用畫素來標定圖片中的每個點,給他一個數值,這樣整張圖就轉成一個矩陣了。如果是二維的話就是向量。例如LeNet的MNIST資料集:
挺直觀的,對吧?我就覺得CV簡單的多,幹嘛跑去做NL…(被拖走)
咳咳。總之,向量化是運算的基礎,也才能進到神經網路,什麼乘積啦、CNN啦、各種神奇的架構啦,如果沒有最前面這一步,那就什麼花樣也變不出來。
那文字呢?
One-hot encoding
One-hot encoding的定義就是「將對應位置的值標為1,其他為0」。例如在MNIST資料集,我們可以在最後輸出時也使用one-hot encoding。假設辨認結果是3,那就把第四個位置的值標為1,其他為0,寫成[0,0,0,1,0,0,0,0,0]。
應用在文字上,假設我們的語料庫裡有1萬個字,這1萬個字當然彼此不重複。那我們也可以用one-hot encoding來標記每個字,這樣一來每個字都變成1*10000的向量,第一個字是在0號位是1,其他是0;以此類推。
但是這樣實在太長了,而且也看不出這些字的關聯性。
矩陣權重
我們使用單層的神經網路隱藏層「映射」這些one-hot encoding的向量到y軸空間,以了解其彼此之間的關聯性。就我的理解,這文字間的關聯性受到其訓練的文章影響很大。例如在科學類文章常常一起出現的兩個字,放到文學類文章就不見得一起出現。所以這是可以改變的。
為什麼要做映射?因為one-hot encoding只是單軸(x),是扁平的、單向的。我們無法看出最頭和最尾端兩個字的關聯,也看不出相鄰兩個字的確實距離。映射之後進入二維以上的空間,我們才有能力去製造一個一個向量,才能比較精確的掌握文字之間的距離。
先看圖左半部。藉由隱藏層的映射,這一萬個字,現在變成一萬個單元,會和右邊的三百個單元有交互作用。彼此的連結是權重;如果把這些權重列下來,會成為圖右半部。從最左上角開始是第1/10000個單元對應第1/300個單元,往右則是1/10000對2/300,以此類推,最右上角是1/10000對應300/300。第二行則是2/10000的對應權重,往右是2/10000對2/300,直到300/300。以此往下推,最下面一列是10000/10000的對應權重。如此,就構成一個由權重所組成的矩陣(weight matrix)。
那這跟lookup table有什麼關係呢?有,因為one-hot encoding。
One-hot encoding和乘積
現在,按照神經網路的原理,我們試著對第一個單元進行運算。第一個單元是[1,0,0,0,…0],是一個1*10000的矩陣。單元要和權重乘積,所以這個矩陣要和權重矩陣相乘。
所以其實最後會得到的是權重矩陣的第一列,一個1*300的矩陣:[w1–1,…,w1–300]。以此類推,第二個單元會得到第二列,第三個,第四個…最後到第一萬個,都是1*300的矩陣。
這和一開始的one-hot encoding也什麼差別呢?首先,光容量就不同了,從10000變成300。其次,這300個數字大部分都不是0,整個矩陣立體化了,向量化了。根據向量,我們可以判斷任兩個字的距離(可能是歐式距離,或者看評估方法),可以更好的掌握其關聯性,而不再是單調的1和0。這就是權重矩陣圖右邊寫的word vector的意義了。
最後再回到權重矩陣本身。他是所有word vector的集合,其實不就是一張查表嗎?就像九九乘法表一樣的意思,所以把他稱作lookup table。
這就是lookup table和權重矩陣的關聯性了。我們下個筆記再會。