我正在嘗試將 word2vec (Skipgram) 運行到一組用于訓練網路嵌入模型的步行,在我的圖中我有 169343 個節點,即;word 在 Word2vec 的背景關系中,對于每個節點,我運行長度為 80 的隨機游走。因此,我有 (169343,80) 次游走,即;Word2vec 中的句子。在運行 SkipGram 3 個時期后,我只得到 28015 個向量而不是 169343。這是我的網路嵌入的代碼。
def run_skipgram(walk_path):
walks = np.load(walk_path).tolist()
skipgram = Word2Vec(sentences=walks, vector_size=128, negative=5, window=8, sg=1, workers=6, epochs=3)
keys = list(map(int, skipgram.wv.index_to_key))
keys.sort()
vectors = [skipgram.wv[key] for key in keys]
return np.array(vectors)
uj5u.com熱心網友回復:
您確定您的walks語料庫是您所期望的,以及 Gensim 所Word2Vec期望的嗎?
比如len(walks)等于169343?是len(walks[0])等于80?是walks[0]80 個字串標記的串列嗎?
另請注意:默認情況下Word2Vec使用min_count=5- 因此在訓練期間會忽略出現次數少于 5 次的任何標記。在大多數情況下,這個最小值——甚至更高!– 是有道理的,因為在通常的自然語言訓練資料中只有 1 個或幾個用法示例的標記無法獲得好的詞向量(但總的來說,它可以作為稀釋噪聲,使其他向量惡化)。
根據您的圖表,每個節點的一次步行可能無法確保該節點在所有步行中至少出現 5 次。所以你可以試試min_count=1。
但是最好從每個起點進行5次步行,或者進行足夠的步行以確保所有節點至少出現 5 次。169,343 * 80 * 5仍然只有 67,737,200 個訓練詞,可管理的 169,343 個計數詞匯。(如果將整個訓練集擴展為一個串列時出現問題,您可以制作一個迭代,根據需要逐個生成步行,而不是全部預先生成。)
或者,像每個起始節點 5 次行走,但每個只有 20 步,將使語料庫保持大致相同的大小,但保證每個節點至少出現 5 次。
甚至:自適應地不斷添加游走,直到您確定每個節點都被表示足夠多次。例如,選擇一個隨機節點,進行一次步行,保持到目前為止每個節點出現的運行記錄 - 并不斷增加每個節點的凈總數您還可以嘗試一個自適應語料庫,該語料庫不斷添加步行,直到每個節點都表示為最小值次數。
可以想象,對于某些遠程節點,這可能需要很長時間才能發生在它們身上,因此另一個改進可能是:進行一些初始步行或步行,然后計算每個節點獲得的訪問次數,而頻率最低的節點低于目標min_count,從它開始另一次步行 - 保證至少再訪問一次。
這可能有助于對連接較少的區域進行過采樣,這可能是好的也可能是壞的。值得注意的是,對于自然語言文本,該Word2Vec sample引數非常有助于丟棄某些過度表示的詞,防止它們多余地獨占訓練時間,確保頻率較低的詞也能得到良好的表示。(這是一個引數,有時可以提供更少的訓練時間和更好的結果的雙重打擊!)確保您的步行花費更多時間在連接較少的區域可能會提供類似的優勢,特別是如果您對向量的下游使用同樣感興趣在較少訪問區域的向量中。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/323195.html
