[英]Gensim Word2vec model is not updating the previous word's embedding weights during increased training
我想以增加的方式訓練一個先前訓練過的 word2vec 模型,如果該詞在先前的訓練過程中見過,則更新該詞的權重,並創建和更新先前訓練中未見過的新詞的權重過程。 例如:
from gensim.models import Word2Vec
# old corpus
corpus = [["0", "1", "2", "3"], ["2", "3", "1"]]
# first train on old corpus
model = Word2Vec(sentences=corpus, size=2, min_count=0, window=2)
# checkout the embedding weights for word "1"
print(model["1"])
# here comes a new corpus with new word "4" and "5"
newCorpus = [["4", "1", "2", "3"], ["1", "5", "2"]]
# update the previous trained model
model.build_vocab(newCorpus, update=True)
model.train(newCorpus, total_examples=model.corpus_count, epochs=1)
# check if new word has embedding weights:
print(model["4"]) # yes
# check if previous word's embedding weights are updated
print(model["1"]) # output the same as before
似乎即使前一個詞的上下文在新語料庫中發生了變化,前一個詞的嵌入也沒有更新。 有人能告訴我如何更新以前的嵌入權重嗎?
回答原始問題
嘗試在前后打印它們(甚至只是幾個主要尺寸,例如print(model['1'][:5])
)以查看它們是否已更改。
或者,在開始時,使preEmbed
成為值的正確副本(例如: preEmbed = model['1'].copy()
)。
我想你會看到價值觀真的發生了變化。
您當前的preEmbed
變量將只是隨底層數組更改的數組的視圖,因此將始終返回True
以供以后檢查。
查看關於Numpy Copies & Views 的文章將有助於解釋更多示例中發生的情況。
更新代碼的答案
很可能在您隨后的單輪訓練中, '1'
所有示例都通過sample
下采樣功能被跳過,因為'1'
在您的小語料庫中是一個非常頻繁的詞:占所有詞的 28.6%。 (在現實的自然語言語料庫中,最常用的詞不會超過所有詞的百分之幾。)
我懷疑如果您使用sample=0
禁用此下采樣功能,您將看到您期望的更改。
(請注意,此功能對於足夠的訓練數據確實很有幫助,更一般地說,關於Word2Vec
和相關算法的很多事情,尤其是它們的核心優勢,需要大量不同的數據——並且不會很好地工作,或者以預期的方式運行,使用玩具大小的數據集。)
另請注意:您的第二個.train()
應該對newCorpus
使用明確准確的計數。 (當您提供額外數據時,使用total_examples=model.corpus_count
重新使用緩存的語料庫計數可能並不總是合適的,即使它在這里工作正常。)
另一件需要注意的事情:一旦你開始使用一個模型進行更復雜的操作,比如.most_similar()
,它就會緩存一些計算數據以進行向量到向量的比較,並且這些數據不會總是(至少通過gensim-3.8.3
)通過更多的培訓來更新。 因此,您可能必須丟棄該數據(在gensim-3.8.3
由model.wv.vectors_norm = None
)以確保獲得新的單位歸一向量或新的most_similar()
(和相關方法)結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.