word2vec 模型有兩種: Continuous Skip-gram Model 和 Continuous Bag of Words Model (CBOW)。關於這兩個模型的描述能夠參考大神Mikolov的論文Efficient Estimation of Word Representations in Vector Space。python
本文不詳細介紹 Word2vec 的機制, 關於這方面的內容推薦查看 Stanford CS224N 的公開課, 結合視屏和PPT, 將課後做業作一遍,對 word2vec的理解會很深入。 另外推薦 Word2Vec Tutorial - The Skip-Gram Model, 文章直觀地講解了如何從神經網絡中獲得詞向量。linux
對於一個初步入門了深度學習的小夥伴, 交叉熵要容易理解一點。交叉熵就是讓模型(好比神經網絡)的分佈儘量地擬合真實數據的分佈, 提及來也挺玄乎的, 這裏面有很多的奇技淫巧(調參數), 相信作過深度學習的小夥伴必定有深入的體會。然而對於Word2vec這樣的任務, 一個Vocabulary(不知道詞典 Vocabulary 爲什麼物的小夥伴, 第一次接觸到這個英文單詞的時候, 我也是一臉懵逼 :), Vocabulary 就是一個集合, 集合的內容是一個個單詞)中有hundreds or billions of words, 當有幾萬到幾個億的單詞時, 使用交叉熵是費時間的, 由於每一次計算交叉熵都要遍歷整個Vocabulary, 計算量很大。面試
Negative Sampling Loss (負採樣) 就是用來解決交叉熵比較慢這個問題的。 仔細觀察負採樣函數的形式, 我對它的粗略理解是讓word pairs (詞對)中的兩個單詞的向量儘量的接近,其它詞向量與中心詞向量儘量的遠。負採樣中最難理解的是 noise distribution(噪聲分佈)函數, 至今仍然沒有Get到其中的精髓。 不過大佬說了, 這是根據實驗結果來肯定的。 ubuntu
課堂做業的提示代碼是爲linux環境寫的, 用的是python 2.0版本。然而個人電腦用的是windows系統, 裝的是python 3.0版本。在實現做業的時候, 發如今對字符串進行編碼和解碼操做的時候, 老是不對, 改了一個下午和一個晚上, 也沒有改爲功。 尚未在虛擬機裏面試過, 不過聽說虛擬機裏面不能用顯卡。此次下定決心搭建一個ubuntu系統, 寫代碼方便一點。windows
sentences += [[w.lower().decode("utf-8").encode('latin1') for w in splitted]]
這行代碼在 treebank.py 裏面。網絡
在python 3.0 版本下面運行這行代碼的時候會報錯, 由於在python 3.0 當中, 字符串是沒有解碼操做的。 在 python 2.0 當中字符串等於 bytes, 能夠進行 decode(解碼操做)。哪位大佬要是成功解決了這個問題, 請留言,感激涕零。函數
今天就暫時說這麼多, 之後想到別的,再添加。學習