2016-09-23 26 views
3

代碼是在Python中。我把python中的二進制模型加載到gensim中,01​​使用「init_sims」選項來加快執行速度。操作系統是OS X. 裝載它需要將近50-60秒。和相當的時間找到「most_similar」。這是正常的嗎?在使用init_sims選項之前,花費了將近兩倍的時間!我有一種感覺可能是OS RAM分配問題。Word2Vec:使用Gensim和Google新聞數據集 - 非常慢的執行時間

model=Word2Vec.load_word2vec_format('GoogleNewsvectorsnegative300.bin',binary=True) 
model.init_sims(replace=True) 
model.save('SmallerFile') 
#MODEL SAVED INTO SMALLERFILE & NEXT LOAD FROM IT 
model=Word2Vec.load('SmallerFile',mmap='r') 
#GIVE RESULT SER! 
print model.most_similar(positive=['woman', 'king'], negative=['man']) 
+0

嘗試在你訓練時在cbow和ngram之間切換。 – AbtPst

回答

4

注意的init_sims(replace=True)節省記憶效應不會在保存/負載循環持續,因爲節省總是保存在「原始」的載體(從該單元歸一化的矢量可以重新計算)。因此,即使在您重新加載之後,當您第一次致電most_similar()時,init_sims()將在幕後調用,並且內存使用量將翻倍。

而且,GoogleNews數據集非常大,即使在單位標準化之前可能需要3+ GB才能加載內存使用。因此,根據您運行的是什麼以及機器的RAM,您可能會在運行most_similar()計算時使用交換內存 - 這對計算對每個向量和排序結果的相似性來說非常慢歡聲笑語。 (不過,1日之後的任何most_similar()檢查不會需要重新填充單元法矢緩存,所以應該不是第一個呼叫更快。)

既然你已經init_sims(replace=True)後保存的模型,其原始向量已經被單位歸一化。所以,你可以手動補丁的模式跳過重新計算,只是你load()後:

model.syn0norm = model.syn0 

那麼即使你的第一個most_similar()只會諮詢(單,內存映射)組向量,而不會觸發init_sims()

如果仍然太慢,則可能需要更多的內存或將向量修剪爲子集。 GoogleNews向量似乎被排序爲最早出現最頻繁的單詞,因此拋出最後的10%,50%甚至90%仍然可能爲您留下一組最常用的單詞。 (您需要通過查看模型對象和源代碼自己執行此修剪。)

最後,您可以使用最近鄰居索引來獲得更快的top-N匹配,但需要額外的內存和近似的結果(可能會錯過一些真正的頂級N匹配)。在最近的gensim版本中,IPython筆記本的annoytutorial.ipynb IPython筆記本在gensim docs/notebooks目錄中有一個IPython筆記本教程。