我正在測試用相同的整體詞匯量喂養 gensim 的 Word2Vec 不同句子,看看是否有些句子比其他句子攜帶“更好”的信息。我訓練 Word2Vec 的方法是這樣的def encode_sentences(self, w2v_params, sentences): model = Word2Vec(sentences, **w2v_params) idx_order = torch.tensor([int(i) for i in model.wv.index2entity], dtype=torch.long) X = torch.zeros((idx_order.max()+1, w2v_params['size']), dtype=torch.float) # Put embeddings back in order X[idx_order] = torch.tensor(model.wv.vectors) return X, y我在這里希望的是,每次運行 w2v 時,它都會從一個新模型開始并從頭開始訓練。但是,我正在測試 3 種句子,所以我的測試代碼如下所示:def test(sentence): w2v = {'size': 128, 'sg': 1} X = encode_sentences(w2v, sentence) evaluate(X) # Basic cluster analysis stuff here# s1, s2 and s3 are the 3 sets of sentences with the same vocabulary in different order/frequency[print(test(s) for s in [s1, s2, s3]]但是,我注意到如果我刪除其中一個測試集,并且只測試s1和s2(或三者中的兩組的任意組合),則聚類的整體質量會下降。如果我在調用之前返回encode_sentences并添加,整體集群質量也會下降,但無論測試多少數據集都保持一致。del modelreturn是什么賦予了?構造函數實際上不是每次都使用新權重構建新模型嗎?文檔和源代碼沒有說明這一點。我很確定這不是我的評估方法,因為del model添加后一切都已修復。我在這里不知所措......這些運行實際上是獨立的,還是每次調用都Word2Vec(foo, ...)相當于用新數據重新訓練以前的模型foo?在你問之前,nomodel不在變量范圍之外encode_sentence;那是整個程序中唯一一次使用變量名。很奇怪。
1 回答

UYOU
TA貢獻1878條經驗 獲得超4個贊
每次調用Word2Vec()
構造函數都會創建一個全新的模型。
但是,由于各種原因,在正常情況下運行并不是完全確定的,因此下游評估(如未顯示的聚類)的結果質量會在運行之間抖動。
如果相同的數據重復跑的方差很大,那很可能是其他問題,比如過大的模型容易過擬合。(運行之間的穩定性可以是一個指標,表明您的過程已充分指定,數據和模型選擇正在驅動結果,而不是算法使用的隨機性。)
如果此解釋不令人滿意,請嘗試在您的問題中添加更多信息 - 例如您的評估分數的實際大小,在重復運行中,無論是否有您推測的影響結果的變化。(我懷疑您認為有效的步驟的變化不會大于重新運行或不同seed
值的變化。)
(更一般地說,Word2Vec
通??释M可能多的不同訓練數據;只有當文本不代表相關領域時,它們才可能導致更糟糕的模型。所以我通常不希望對哪個子集有更多選擇句子最好是一項重要的技術,除非某些句子完全是垃圾/噪音,但當然總會有變化,您會發現對您的特定數據/目標有一些影響。)
添加回答
舉報
0/150
提交
取消