首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么由gensim训练的Word2Vec模型的损失在几个时期先增加后减少?

为什么由gensim训练的Word2Vec模型的损失在几个时期先增加后减少?
EN

Stack Overflow用户
提问于 2022-09-29 06:31:06
回答 1查看 105关注 0票数 0

实际上这是帖子的续集

我正在使用gensim训练一个Word2Vec模型,参数为hs=1、sg=0和negative=0。代码修改后需要的培训时间较少,但损失似乎出了问题,一开始会增加,然后减少,我不知道发生了什么。

守则如下:

代码语言:javascript
运行
复制
from gensim.models.keyedvectors import KeyedVectors
from gensim.models import word2vec
import logging

logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', 
level=logging.INFO)
sentences = word2vec.Text8Corpus("text8")   # loading the corpus




from gensim.models.callbacks import CallbackAny2Vec
loss_list = []
    
class Callback(CallbackAny2Vec):
def __init__(self):
    self.epoch = 0

def on_epoch_end(self, model):
    loss = model.get_latest_training_loss()
    loss_list.append(loss)
    print('Loss after epoch {}:{}'.format(self.epoch, loss))
    model.running_training_loss = 0.0
    self.epoch = self.epoch + 1




from gensim.models import KeyedVectors,word2vec,Word2Vec
import time

start_time = time.time()

model = word2vec.Word2Vec(sentences, hs=1, sg=0, negative=0, compute_loss=True, epochs=30, callbacks=[Callback()])

end_time = time.time()

print('Running time: %s seconds' % (end_time - start_time))

代码实际上是用jupyter编写的,如屏幕截图所示:

输出结果如下:

关于输出的更多详细信息:

代码语言:javascript
运行
复制
Loss after epoch 0:39370848.0
Loss after epoch 1:43579636.0
Loss after epoch 2:45213772.0
Loss after epoch 3:46132356.0
Loss after epoch 4:46788412.0
Loss after epoch 5:47218508.0
Loss after epoch 6:47553520.0
Loss after epoch 7:47793332.0
Loss after epoch 8:47995616.0
Loss after epoch 9:48134664.0
Loss after epoch 10:48224960.0
Loss after epoch 11:48326640.0
Loss after epoch 12:48371072.0
Loss after epoch 13:48405980.0
Loss after epoch 14:48437804.0
Loss after epoch 15:48417612.0
Loss after epoch 16:48415112.0
Loss after epoch 17:48396260.0
Loss after epoch 18:48349064.0
Loss after epoch 19:48301088.0
Loss after epoch 20:48247328.0
Loss after epoch 21:48167340.0
Loss after epoch 22:48053500.0
Loss after epoch 23:47937300.0
Loss after epoch 24:47810964.0
Loss after epoch 25:47669088.0
Loss after epoch 26:47500524.0
Loss after epoch 27:47300488.0
Loss after epoch 28:47044920.0
Loss after epoch 29:46747080.0

Running time: 259.9046218395233 seconds
EN

回答 1

Stack Overflow用户

发布于 2022-10-01 23:28:01

我不期望这种涨跌模式;我认为通常的SGD优化通常从一开始就会出现全天候的损失。

然而,如果最终结果向量仍然表现良好,我不会太担心次级进展指标中的意外,比如损失数字,原因如下:

  • 正如我在前面的回答中所指出的(在Gensim项目公开发行#2617中进一步讨论),Gensim的外部损失报告存在一些已知的错误和不一致之处。在观察到的损失报告中的任何奇怪之处都可能是这些问题的副作用,而不一定表明实际的培训更新存在任何问题。
  • 看来你将在260秒内完成30个训练阶段--每一次完整的训练都在9秒内通过。这表明您的培训数据非常小--可能太小,不足以成为word2vec功能的一个好例子,或者对于默认的100维向量来说太小了。这种小规模,或培训数据中的其他特性,可能会导致非典型的损失趋势,或者使用当前计算损失代码的一些其他弱点。如果同样的难以解释的模式发生在一个更典型的训练语料库中,比如一个100倍大的训练语料库,那么做一次深潜调查来了解正在发生的事情会更有趣。但是,对于微小/不寻常/不典型的训练跑来说,意外的结果可能仅仅是因为这样的跑步远非通常的直觉所适用,而找出它们的根源比获得足够的数据来以更典型的/可靠的方式运行算法要低得多。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73891182

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档