首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Gensim Doc2Vec --为什么infer_vector()使用alpha?

Gensim Doc2Vec --为什么infer_vector()使用alpha?
EN

Stack Overflow用户
提问于 2018-05-07 10:50:07
回答 1查看 2.6K关注 0票数 1

我试图将句子映射到向量,以便使句子相互比较。为了测试gensim的Doc2Vec模型,我下载了sklearn的新闻组数据集,并对模型进行了培训。

为了比较两句话,我使用了model.infer_vector(),我想知道为什么使用同一个句子的两个调用传递给我不同的向量:

代码语言:javascript
复制
model = Doc2Vec(vector_size=100, window=8, min_count=5, workers=6)
model.build_vocab(documents)

epochs=10
for epoch in range(epochs):
    print("Training epoch %d" % (epoch+1))
    model.train(documents,  total_examples=len(documents), epochs=epochs)

    v1 = model.infer_vector("I feel good")
    v2 = model.infer_vector("I feel good")
    print(np.linalg.norm(v1-v2)) 

输出:

训练时代1 0.41606528 训练时代2 0.43440753 训练时代3 0.3203116 训练时代4 0.3039317 训练时代5 0.68224543 训练时代6 0.5862567 训练时代7 0.5424634 训练时代8 0.7618142 训练时代9 0.8170159 训练时代10 0.6028216

如果我设置了alpha和min_alpha =0,我得到了“我感觉很好”和“我感觉很好”的一致向量,但是模型在每个时代给出了相同的向量,因此它似乎没有学到任何东西:

训练时代1 0.043668125 训练时代2 0.043668125 训练时代3 0.043668125 训练时代4 0.043668125 训练时代5 0.043668125 训练时代6 0.043668125 训练时代7 0.043668125 训练时代8 0.043668125 训练时代9 0.043668125 训练时代10 0.043668125

所以我的问题是:

  1. 为什么我甚至有可能指定一个学习率进行推理?我希望模型只是在训练期间而不是在推理过程中才会改变。
  2. 如果我指定alpha=0作为推断,为什么这两个向量之间的距离在不同的时期不发生变化?
EN

回答 1

Stack Overflow用户

发布于 2018-05-07 17:56:00

推理使用alpha,因为它与训练是相同的迭代调整过程,仅限于更新一个新文本示例的一个新向量。

所以是的,模型的各种重量都被冻结了。但是,一个新向量的权重(维)从小的随机值开始,就像其他向量也开始一样,然后在多个训练周期中得到增量的推进,从而使向量作为预测文本单词的doc向量工作得更好。然后返回最后一个新向量。

这些提示从更大的起始alpha值开始,最后作为可忽略的min_alpha结束。当alpha为0.0时,就不会发生任何训练/推断,因为对可更新权重的每一个提示修正都会在应用之前乘以0.0,这意味着不会发生任何更改。

与此不同的是,您的代码存在许多问题,可能会阻止期望的结果:

  • 通过在循环中调用train() epochs times,然后为epochs提供大于1的值,您实际上正在执行epochs * epochs总训练传递。
  • 此外,通过不指定alphamin_alpha,每个对train()的调用都会将有效α从其高值降到每个调用的低值--这是一种不适合于这种随机梯度下降优化的锯齿形状。(您的日志中应该有关于此错误的警告。)

很少需要在一个循环中多次调用train()。只要用正确的epochs值调用它一次,它就会做正确的事情:很多次传递,alpha的学习速率都在平稳衰减。

分别在调用infer_vector()

  • 它需要一个令牌列表,就像documents中的训练示例的documents属性一样--而不是字符串。(通过提供一个字符串,它看起来像一个字符列表,因此它将推断文档['I', ' ', 'f', 'e', 'e', 'l', ' ', 'g', 'o', 'o', 'd']而不是['I', 'feel', 'good']的文档向量。)
  • 这些令牌应该与培训文档一样进行预处理--例如,如果它们在那里被降低,则在传递到infer_vector()之前应该将它们降低。
  • 默认参数passes=5是非常小的,特别是对于简短的文本-许多报告的结果更好,其值为数十或数百。
  • 与默认的0.025相比,默认参数alpha=0.1稍微大一些;使用训练值(特别是使用更多的passes)通常会得到更好的结果。

最后,就像训练过程中的算法一样(调整单词预测上下文窗口,或随机抽样负数示例,或随机降样本高频度单词),推理也是如此。因此,即使提供完全相同的标记,也不会自动产生完全相同的推断向量。

然而,如果模型经过了充分的训练,并按照上面的推理进行了调整以获得更好的结果,那么同一文本的向量应该非常非常接近。因为这是一种随机算法,在运行之间存在一些固有的“抖动”,所以最好进行下游评估,并使用容忍如此小的差异的方法。(而且,如果您看到的是较大的差异,请更正其他模型/推断问题,通常需要更多的数据或其他参数调整。)

如果您想强制执行决定论,在gensim项目问题中有一些关于如何做到这一点的讨论。但是,理解和容忍小方差往往更符合这样一个随机影响的算法的选择。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50212449

复制
相关文章

相似问题

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