天天看點

如何用TensorFlow訓練詞向量

這裡僅僅收集了網上關于房産新聞的文章,并且将全部文章拼湊到一起形成一個語料庫。

skip-gram核心思想可以通過下圖來看,假設我們的視窗大小為2,則對于文本”The quick brown fox jumps over the lazy dog.”,随着視窗的滑動将産生訓練樣本。比如剛開始是(the,quick)(the,brown)兩個樣本,右移一步後訓練樣本為(quick,the)(quick,brown)(quick,fox),繼續右移後訓練樣本為(brown,the)(brown,quick)(brown,fox)(brown,jumps),接着不斷右移産生訓練樣本。skip-gram模型的核心思想即是上面所說。

如何用TensorFlow訓練詞向量

實作對語料庫檔案的加載并且對其進行分詞。filename指定語料庫檔案,而分詞使用jieba來實作,最後傳回一個包含語料庫所有詞的list。

這裡我們是要建立一個大小為50000的詞彙,vocabulary是從語料集中擷取的所有單詞,統計vocabulary每個單詞出現的次數,而且是取出現頻率最多的前49999個詞,count詞典友善後面查詢某個單詞對應出現的次數。接着我們建立dictionary詞典,它是單詞與索引的詞典,友善後面查詢某個單詞對應的索引位置。接着我們将vocabulary所有單詞轉換成索引的形式儲存到data中,凡是不在頻率最高的49999個詞當中的我們都當成是unknown詞彙并且将其索引置為0,此過程順便統計vocabulary包含了多少個unknown的詞彙。另外還要建立一個反向索引詞典reversed_dictionary,可以通過位置索引得到單詞。

提供一個生成訓練批資料的函數,batch_size是我們一次取得一批樣本的數量,num_skip則可以看成是我們要去某個詞視窗内的詞的數量,比如前面我們說到的視窗大小為2,則某個詞附近一共有4個詞最終最多可以組成4個訓練樣本,但如果你隻需要組成2個樣本的話則通過num_skip來設定。skip_window則用于設定視窗的大小。取樣本時是在整個vocabulary通過滑動視窗進行的,得到的batch和labels都是單詞對應的詞典索引,這對後面運算提供了友善。

train_inputs是一個[batch_size]形狀的輸入占位符,它表示一批輸入資料的索引。train_labels是一個[batch_size, 1]形狀的正确的分類标簽,它表示一批輸入對應的正确的分類标簽。

embeddings變量用來表示詞典中所有單詞的128維詞向量,這些向量是會在訓練過程中不斷被更新的,它是一個[vocabulary_size, embedding_size]形狀的矩陣,這裡其實是[50000,128],因為我們設定詞彙一共有50000個單詞,且它的元素的值都在-1到1之間。

然後通過embedding_lookup函數根據索引train_inputs擷取到一批128維的輸入embed。

接着使用NCE作為損失函數,根據詞彙量數量vocabulary_size以及詞向量次元embedding_size建構損失函數即可,NCE是負采樣損失函數,也可以試試用其他的損失函數。nce_weights和nce_biases是NCE過程的權重和偏置,取平均後用梯度下降法優化損失函數。

最後對embeddings進行标準化,得到标準的詞向量,再計算所有詞向量與我們選來校驗的詞的相似性(距離)。

建立會話開始訓練,設定需要訓練多少輪,由num_steps指定。然後通過generate_batch擷取到一批輸入及對應标簽,指定優化器對象和損失函數對象開始訓練,每訓練2000輪輸出看下具體損失,每10000輪則使用校驗資料看看他們最近距離的8個是什麼詞。

選取300個詞彙并使用TSNE對其進行降維然後畫圖。

如何用TensorFlow訓練詞向量

<a href="https://github.com/sea-boat/DeepLearning-Lab">https://github.com/sea-boat/DeepLearning-Lab</a>

========廣告時間========

<a href="http://blog.csdn.net/wangyangzhizhou/article/details/74080321">為什麼寫《Tomcat核心設計剖析》</a>

=========================

歡迎關注:

如何用TensorFlow訓練詞向量
上一篇: GRU神經網絡
下一篇: LSTM神經網絡

繼續閱讀