Gensim Word2Vec 实现中的时期数

数据挖掘 gensim word2vec 收敛
2021-10-10 01:41:26

Word2Vec 实现中有一个iter参数gensim

class gensim.models.word2vec.Word2Vec(sentences=None, size=100,
alpha=0.025, window=5, min_count=5, max_vocab_size=None, sample=0,
seed=1, workers=1, min_alpha=0.0001, sg=1, hs=1, negative=0,
cbow_mean=0, hashfxn=<built-in function hash>, **iter=1**, null_word=0,
trim_rule=None, sorted_vocab=1)

指定 epoch 的数量,即:

iter = number of iterations (epochs) over the corpus.

有谁知道这是否有助于改进语料库的模型?

有什么理由iter默认设置为 1 吗?增加数量没有太大影响吗?时代?

是否有任何关于如何设置编号的科学/经验评估。时代?

与分类/回归任务不同,网格搜索方法不会真正起作用,因为向量是以无监督的方式生成的,并且目标函数只是通过分层 softmax 或负采样。

是否有提前停止机制来缩短否。向量收敛后的时代?分层softmax或负采样目标能否收敛?

4个回答

增加 epoch 的数量通常有利于单词表示的质量。在我执行的实验中,目标是使用词嵌入作为文本分类的特征,将 epoch 设置为 15 而不是 5,提高了性能。

我看了一下这里,发现默认值从 1 变为 5。显然作者认为更多的 epoch 会改善结果

我还不能从经验中判断。

我在 google news 300 上对我的 w2v 模型进行了 [2、10、100] 个时期的训练,而最好的模型是在 10 个时期上。在等待了这么久之后,我很震惊 100 个 epoch 是不好的。

epoch   wall                    
------ ------                    
2       56 s                    
10      4m 44s (284s)           
100     47m 27s (2847 s)    

您可以使用回调来输出每个时期的损失,以帮助您决定使用多少:

import gensim
from gensim.models.callbacks import CallbackAny2Vec

# Your model params:
CONTEXT_WINDOW = 5
NEGATIVES = 5
MIN_COUNT = 5
EPOCHS = 20

class LossLogger(CallbackAny2Vec):
    '''Output loss at each epoch'''
    def __init__(self):
        self.epoch = 1
        self.losses = []

    def on_epoch_begin(self, model):
        print(f'Epoch: {self.epoch}', end='\t')

    def on_epoch_end(self, model):
        loss = model.get_latest_training_loss()
        self.losses.append(loss)
        print(f'  Loss: {loss}')
        self.epoch += 1

loss_logger = LossLogger()
mod = gensim.models.word2vec.Word2Vec(sentences=sentences,
                                      sg=1,
                                      window=CONTEXT_WINDOW,
                                      negative=NEGATIVES,
                                      min_count=MIN_COUNT,
                                      callbacks=[loss_logger],
                                      compute_loss=True,
                                      iter=EPOCHS)

...并且您可以loss_logger.losses稍后使用它们来检索它们(例如,如果您想绘制它们...)