寫在之前的話
這是第一次翻譯英文博客文章氢惋,連文檔/論文都算不上,真的很困難=.=… 以及Google翻譯真的很厲害稽犁,整個文章丟進去焰望,對照原文還是能看懂的…
原文在這里,作者McCormick, C.已亥,所有圖片均來自于原博主熊赖。
Word2Vec Tutorial - The Skip-Gram Model
這篇教程是關于Word2Vec的skip gram神經(jīng)網(wǎng)絡結構的。我的寫這篇教程的初衷是想跳過關于Word2Vec常規(guī)的介紹和抽象的見解虑椎,并深入更多的細節(jié)震鹉。具體來說我正深入探索skip gram神經(jīng)網(wǎng)絡模型。
The Model
skip-gram神經(jīng)網(wǎng)絡模型最基本的形式實際上驚人的簡單捆姜。我們從微調(diào)和強化開始解釋這個模型传趾。
我們從高層次的見解(宏觀?)開始泥技。Word2Vec使用了一個你可能在其他機器學習見過的技巧浆兰。我們將訓練一個簡單的帶有一個隱藏層(hidden-layer)的神經(jīng)網(wǎng)絡來完成某個任務,但是我們實際上沒有將這個神經(jīng)網(wǎng)絡用于我們的任務零抬。我們的目標實際上只是為了學習隱藏層的權重(weights)镊讼,我們會看到這些權重實際上就是我們嘗試學習的“詞向量(word vector)”。
另外一個你可能見過這個技巧的地方是在非監(jiān)督特征學習——訓練一個自動編碼器(auto-encoder)在隱藏層壓縮輸入向量平夜,然后在輸出層(output layer)解壓縮回原來的樣子蝶棋。訓練完之后,我們會去掉輸出層(解壓縮的步驟)忽妒,只使用隱藏層玩裙。這是一個學習圖片特征而不標記訓練數(shù)據(jù)(圖片)的技巧。
The Fake Task
所以我們現(xiàn)在需要講一下這個要用來建立神經(jīng)網(wǎng)絡的“假”任務("fake" task)段直,然后我們再回來看看這是如何間接地給到我們以后要用到的詞向量的吃溅。
我們將要訓練神經(jīng)網(wǎng)絡來做以下的事情。給定一個在句子中間部分出現(xiàn)的特定單詞(就是神經(jīng)網(wǎng)絡的輸入鸯檬,the input word)决侈,在這個單詞臨近(nearby)的單詞中隨機選一個(a nearby word)。這個神經(jīng)網(wǎng)絡將要告訴我們每一個在詞匯表(vocabulary)中的單詞成為這個nearby word的概率喧务。
我們說的“臨近(nearby)”赖歌,實際上是這個算法的一個參數(shù)枉圃,叫窗口大小(window size)庐冯。一個常見的窗口大小可能是5孽亲,意思是特定單詞的前后各5各單詞(總共10個)。
神經(jīng)網(wǎng)絡輸出的概率將關聯(lián)每個詞匯表中的單詞臨近我們輸入的單詞的概率展父。比如說返劲,如果你給訓練完的網(wǎng)絡輸入單詞"Soviet",輸出的概率中栖茉,"Union"和"Russia"的值要比不相關的單詞如"watermelon"和"kangaroo"要高得多篮绿。
我們將通過提供訓練文本中找到的單詞對(word pairs)來訓練神經(jīng)網(wǎng)絡。下面的是一些我們從句子"The quick bron fox jumps over the lazy doe."中取出的訓練樣本(training samples)的例子(word pairs)衡载,在這個例子中搔耕,我使用了一個較小的窗口大小的值:2隙袁,藍色高亮的是我們輸入的單詞痰娱。
這個網(wǎng)絡將要從每一個組合出現(xiàn)的次數(shù)來學習統(tǒng)計。因此菩收,比如梨睁,相比("Soviet", "Sasquatch"),網(wǎng)絡會得到更多的("Soviet", "Union")訓練樣本娜饵,如果你輸入單詞"Soviet"作為網(wǎng)絡的輸入坡贺,那么網(wǎng)絡輸出"Union"或者"Russia"的概率值會比
"Sasquatch"更高。
Model Details
那么這是如何表示的呢箱舞?
首先遍坟,我們知道不能直接把單詞用字符串的形式輸入到神經(jīng)網(wǎng)絡中,所以我們需要找到一個在給網(wǎng)絡“表達”單詞的方法晴股。為了實現(xiàn)這一點愿伴,我們首先從訓練文本中創(chuàng)建一個詞匯表(vocabulary),假設我們這個詞匯表中有10000個不同的單詞电湘。
我們要把單詞比如"ants"表達成一個獨熱向量(one-hot vector)隔节。這個向量有10000個元素,每個分別表示詞匯表中的一個單詞寂呛,我們把單詞"ants"在向量中對應的位置的值設為"1"怎诫,其余的設為"0"。
網(wǎng)絡的輸出是一個同樣有10000個元素的向量贷痪,每個都是對應一個概率值幻妓,指隨機選擇一個這個輸入單詞"ants"的臨近單詞(nearby word)就是這個元素對應的單詞的概率棉浸。
這是這個神經(jīng)網(wǎng)絡的結構煞赢。
這里在隱藏層神經(jīng)元中使用沒有激活函數(shù),但是在輸出層中使用了softmax激活,我們后面再來說這個毅该。
使用單詞對訓練這個神經(jīng)網(wǎng)絡的時候,輸入和輸出都是one-hot vector反番,但是當拿一個單詞來驗證這個訓練完的網(wǎng)絡時灭红,輸出實際上是一個概率分布(即一堆浮點數(shù),而不是獨熱向量)
The Hidden Layer
對于這個例子初烘,我們可以說我們在學習有300個特征的詞向量涡真。所以隱藏層將由一個有10000行(每行指詞匯表中的一次單詞)和300列(300個隱藏層神經(jīng)元)的權重矩陣(weights matrix)來表示。
300個特征值這個“300”的數(shù)字肾筐,是Google曾經(jīng)用來在Google news數(shù)據(jù)集上訓練后發(fā)布的模型的特征值數(shù)量哆料。特征的數(shù)量是一個根據(jù)你的應用調(diào)整的超參數(shù)(hyper parameter)(就是說嘗試不同的值,看看哪個會得到最好的結果)
如果你看這個權重矩陣的行吗铐,實際上就是我們的詞向量东亦!
所以,所有這些的最終目標其實就是學習這個隱藏層中的權重矩陣——當我們完成后唬渗,我們會扔掉輸出層(output layer)典阵!
但是,讓我們回來看看我們要訓練的模型的定義镊逝。
現(xiàn)在壮啊,你可能會問你自己——“那個獨熱向量幾乎是全0的,有什么用呢撑蒜?”當你拿一個110000的獨熱向量乘以一個10000300的矩陣的時候歹啼,它會非常有效率地只選擇在矩陣中對應行是1的來計算。下面是一個小例子:
這意味著這個模型中的隱藏層只是相當于查表操作座菠,隱藏層的輸出只是輸入單詞的詞向量狸眼。(This means that the hidden layer of this model is really just operating as a lookup table. The output of the hidden layer is just the “word vector” for the input word.)
The Output Layer
單詞"ants"的1*300的詞向量會被送到輸出層。輸出層是一個softmax回歸分類器(softmax regression classifier)浴滴。這里有一個關于softmax回歸的深入教程拓萌,但這里的要點是,每一個輸出神經(jīng)元(代表詞匯表中的每個單詞)會產(chǎn)生0和1之間的輸出巡莹,這些輸出的值加起來等于1司志。
每個輸出層的神經(jīng)元有一個權重向量,它與隱藏層中的詞向量相乘降宅,然后把得到的結果應用到函數(shù)exp(x)
中骂远。最后,為了讓輸出值加起來等于1腰根,我們除以所有10000個輸出的值的和激才。
下面是計算單詞"car"的輸出神經(jīng)元的輸出的圖:
要注意,神經(jīng)網(wǎng)絡不知道任何輸出單詞對于輸入單詞的offset。在輸入單詞之前和之后的單詞之前它沒有學到一組不同的概率(It does not learn a different set of probabilities for the word before the input versus the word after)瘸恼。為了理解這個含義劣挫,假設在我們的訓練語料庫中,每一個"York"都出現(xiàn)在"New"之前东帅。這意味著压固,至少在訓練數(shù)據(jù)中,"New"有100%的可能出現(xiàn)在"York"附近靠闭。然而帐我,如果我們在"York"附近的10個單詞中隨機取一個,是"New"的可能性不是100%愧膀;你可能選擇了附近的其它的一個詞拦键。
Intuition
ok,下面要深入了解這個網(wǎng)絡一個令人興奮的點檩淋。
如果兩個不同的單詞有相似的“上下文(contexts)”(也就是說芬为,他們附近可能出現(xiàn)的單詞相似),那么我們的模型需要為這兩個單詞提供輸出相似的結果蟀悦。讓網(wǎng)絡輸出相似的上下文預測的一種情況是媚朦,詞向量是相似的(原文直譯會很奇怪…)。所以熬芜,如果兩個單詞有相似的上下文莲镣,那么我們的網(wǎng)絡就有動機去學習這兩個單詞的詞向量!嘿嘿涎拉!
兩個單詞有相似的上下文是什么意思呢?你可以認為像"intelligent"和"smart"這樣的同義詞會有非常相似的上下文的圆」呐。或者有關聯(lián)的單詞,比如"engine"和"transmission"也很有可能有相似的上下文越妈。
這網(wǎng)絡也能幫你處理詞干提燃玖(stemming)的任務——網(wǎng)絡可能會從單詞"ant"和"ants"學習到相似的詞向量,因為他們有相似的上下文(語境)梅掠。
Next Up
你可能留意到skip-gram神經(jīng)網(wǎng)絡包含大量的weights…就我剛剛的例子而言酌住,有300個特征和10000個單詞的詞匯表,那么在隱藏層和輸出層中分別有3,000,000個weights阎抒!在一個大數(shù)據(jù)集上訓練這個網(wǎng)絡會非常困難酪我,所以word2vec的作者介紹了一些微調(diào)的方法來讓訓練變得可行。這些在part 2 of this tutorial里面會有介紹且叁。
Other Resources
I've also created a post with links to and descriptions of other word2vec tutorials, papers, and implementations.
Cite
McCormick, C.(2016, April 19). Word2Vec Tutorial - The Skip-Gram Model. Retrieved from http://www.mccormickml.com