簡體   English   中英

Gensim Word2vec 模型在增加訓練期間不會更新前一個詞的嵌入權重

[英]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.3model.wv.vectors_norm = None )以確保獲得新的單位歸一向量或新的most_similar() (和相關方法)結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM