基於Gensim的Word2Vec增量式訓練方法

        Word2Vec訓練好以後,隨着時間的積累,出現一些新詞,此時可能需要在已有的模型基礎上重新訓練,以補充這些新詞彙,亦即增量式訓練。本文分析了基於Gensim的Word2Vec的增量式訓練方法。
        數據: 以小說《人民的名義》,《明朝那些事兒》作爲語料庫,小說中出現的詞語相對集中,且很容易找到未出現詞,便於觀察增量式訓練效果。
        過程:首先以小說《人民的名義》作爲語料庫進行初次訓練,共得到17821個詞(含標點符號)。分別將模型保存爲完整的gensim的Word2Vec形式以及簡單的詞-向量的字典形式。核心代碼爲:

model = Word2Vec(sentences, hs=1,min_count=1,window=3,size=100,iter=20)
model.save("people.bin")#保存完整的模型,除包含詞-向量,還保存詞頻等訓練所需信息
model.wv.save_word2vec_format("people.dict")#保存的模型僅包含詞-向量信息


        然後嘗試將《明朝那些事兒》作爲新增語料進行增量式訓練,結果如下: 
對於模型“people.bin”,可方便地進行增量式訓練,通過以下三個主要步驟即可完成:

model = gensim.models.Word2Vec.load("people.bin")
model.build_vocab(new_sentences, update=True)
model.train(new_sentences,epochs=50,total_examples=model.corpus_count)


        經觀察,進行增量式訓練後,新模型不但補充新出現的詞,而且會同時更新原模型中詞向量表示。
        對於模型“people.dict”經嘗試,如下方法具有可行性:

model = word2vec.Word2Vec(size=100,min_count=1,window=3, hs=1)
new_sentences = word2vec.LineSentence(file_name)
model.build_vocab(new_sentences)
model.intersect_word2vec_format(pretrained_w2v_format_model)
model.train(new_sentences,epochs=50,total_examples=model.corpus_count)


        方法首先構建一個全新的Word2Vec模型,其次加載新補充的語料庫,然後通過intersect_word2vec_format函數初始化模型,最後進行訓練。
        但需要注意:intersect_word2vec_format函數僅對model中存在的詞進行初始化,不存在的詞會不自動加入模型。因此,new_sentences中需要包含儘可能豐富的詞彙,這樣才能充分利用預訓練模型的權重。此外,通過intersect_word2vec_format加載的預訓練權重再次進行訓練時保持不變。
        結論:無論模型保存爲哪種形式,都存在增量式訓練的方法,但都需要準備充足的語料庫以保證訓練效果。

        結果:top5相似度
             

“高育良”: [('侯亮平', 0.8233), ('沙瑞金', 0.7584), ('李達康', 0.7556), ('祁同偉', 0.72695), ('高小琴', 0.71649)]
“朱元璋”:[('朱棣', 0.7497), ('朱祁鎮', 0.6280), ('朱允炆', 0.6159), ('陳友諒', 0.6068), ('文天祥', 0.6003)]
“的”:[('。', 0.70286), (',', 0.64858), ('是', 0.5866), ('和', 0.5827), ('在', 0.5667)]


        “高育良”一詞是首次訓練後得到的詞,“朱元璋”一詞是增量式訓練後新添加的詞。“的”在兩次訓練中語料庫中均出現過,對於保存完整的模型,增量式訓練會改變“的”的向量表示,但對於詞-向量形式的模型,因爲通過intersect_word2vec_format進行了初始化,增量訓練前後,該詞的詞向量不會該變。
參考資料:

1. word2vec大規模語料庫及模型初始化

2. gensim官方文檔

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章