1 回答

TA貢獻(xiàn)1807條經(jīng)驗 獲得超9個贊
Word2Vec
一旦單詞被“切入”包含范圍,就沒有官方支持從 Gensim 模型中刪除單詞。
即使添加單詞的能力也沒有很好的基礎(chǔ),因為該功能并不基于任何經(jīng)過驗證/已發(fā)布的模型更新方法Word2Vec
,并且通過學(xué)習(xí)選擇掩蓋了更新批次如何影響模型的困難權(quán)衡-速率或批次是否完全代表現(xiàn)有詞匯。最安全的做法是定期從頭開始重新訓(xùn)練模型,使用包含所有相關(guān)單詞的足夠示例的完整語料庫。
因此,我的主要建議是定期用經(jīng)過所有仍然相關(guān)數(shù)據(jù)訓(xùn)練的新模型替換您的模型。這將確保它不再在過時的術(shù)語上浪費模型狀態(tài),并且所有仍然有效的術(shù)語都接受了同等的交錯訓(xùn)練。
經(jīng)過這樣的重置后,詞向量將無法與之前“模型時代”的詞向量相比較。(同一個詞,即使它的有形含義沒有改變,也可能處于任意不同的位置 - 但與其他向量的相對關(guān)系應(yīng)該保持良好或更好。)但是,同樣的比較漂移任何一組小批量更新也會發(fā)生這種情況,這些更新不會平等地“接觸”每個現(xiàn)有單詞,只是以某種無法量化的速度。
OTOH,如果您認(rèn)為需要保持這種增量更新,即使知道注意事項,您也可以修補(bǔ)模型結(jié)構(gòu)以保留舊模型中盡可能多的合理內(nèi)容并繼續(xù)訓(xùn)練。
到目前為止,您的代碼是一個合理的開始,缺少正確功能的一些重要注意事項:
由于刪除較早的單詞會更改較晚的單詞的索引位置,因此您需要更新
vocab[word].index
每個幸存單詞的值,以匹配新的index2word
排序。例如,完成所有刪除后,您可以執(zhí)行以下操作:
for?i,?word?in?enumerate(m.wv.index2word): ????m.wv.vocab[word].index?=?i
因為在您的(默認(rèn)負(fù)采樣)
Word2Vec
模型中,還有另一個與模型輸出層相關(guān)的每個單詞權(quán)重數(shù)組,它也應(yīng)該同步更新,以便每個單詞檢查正確的輸出值。粗略地說,每當(dāng)您從 中刪除一行時m.wv.vectors
,您都應(yīng)該從 中刪除同一行m.traininables.syn1neg
。因為幸存的詞匯具有不同的相對詞頻,負(fù)采樣和下采樣(由參數(shù)控制
sample
)函數(shù)都應(yīng)該處理不同的預(yù)先計算的結(jié)構(gòu)來幫助他們的選擇。對于負(fù)采樣使用的累積分布表,這非常簡單:
m.make_cum_table(m.wv)
如果這些內(nèi)部結(jié)構(gòu)與您現(xiàn)有的操作同步正確更新,則模型可能處于一致的狀態(tài)以進(jìn)行進(jìn)一步的訓(xùn)練。(但請注意:這些結(jié)構(gòu)在即將發(fā)布的版本中發(fā)生了很大變化gensim-4.0.0
,因此在升級時任何自定義篡改都需要更新。)
另一項效率說明:np.delete()
每次調(diào)用該操作時,該操作都會創(chuàng)建一個新數(shù)組,即幸存數(shù)組的完整大小,并復(fù)制舊值。因此,使用它從非常大的原始數(shù)組中一次刪除多行可能需要大量冗余分配/復(fù)制/垃圾收集。您也許可以在最后調(diào)用它一次,并列出要刪除的所有索引。
但實際上:更簡單、更有根據(jù)的方法,也可能產(chǎn)生明顯更好的連續(xù)可比向量,是在可能的情況下或發(fā)生大量變化時使用所有當(dāng)前數(shù)據(jù)進(jìn)行重新訓(xùn)練。
添加回答
舉報