Hac*_*rds 6 python nlp gensim doc2vec
我尝试在600000行句子上应用doc2vec:代码如下:
from gensim import models
model = models.Doc2Vec(alpha=.025, min_alpha=.025, min_count=1, workers = 5)
model.build_vocab(res)
token_count = sum([len(sentence) for sentence in res])
token_count
%%time
for epoch in range(100):
#print ('iteration:'+str(epoch+1))
#model.train(sentences)
model.train(res, total_examples = token_count,epochs = model.iter)
model.alpha -= 0.0001 # decrease the learning rate`
model.min_alpha = model.alpha # fix the learning rate, no decay
Run Code Online (Sandbox Code Playgroud)
通过上述实现,我的结果非常糟糕.我从教程中建议的更改改变了以下行:
model.train(sentences)
Run Code Online (Sandbox Code Playgroud)
如:
token_count = sum([len(sentence) for sentence in res])
model.train(res, total_examples = token_count,epochs = model.iter)
Run Code Online (Sandbox Code Playgroud)
goj*_*omo 18
不幸的是,您的代码是误导性做法的荒谬混合.所以不要关注你所关注的在线示例!
从上到下依次处理问题:
不要做min_alpha同样的alpha.在alpha看到许多不同的例子的过程中,随机梯度下降优化过程需要从较大的学习率逐渐下降到较小的学习率,并且通常应该以可忽略的近零值结束.(代码尝试以alpha这种方式显式递减还存在其他问题,我们将在下面进行说明.)只有已经有工作设置,理解算法并且正在进行实验性调整的专家用户应该更改alpha/ min_alpha默认值.
不要设置min_count=1.只出现一次或几次的稀有单词通常对Word2Vec/Doc2Vec培训没有帮助.它们的少数发生意味着它们自己相应的模型权重没有得到太多的训练,并且与相应的单词"真实含义"(可能反映在测试数据或后来的生产数据中)相比,少数事件更可能不具代表性.因此,模型对这些罕见单词的表示不太可能变得非常好.但总体而言,所有这些生僻字争夺了很多与其他词做有机会成为有意义的-如此"草率"的生僻字反对换句话说主要随机干扰.或许,这些词语意味着额外的模型词汇参数,这有助于模型在训练数据上表现得更好,因为记忆那里的非泛化特性,但在未来的测试/生产数据上更糟糕.那么,min_count另一个默认值(5)应该只有在你有一个工作基线后才能改变 - 如果你以后严格地对这个参数进行元优化,在一个大尺寸的数据集(比如你的600K文档)上,你很可能会发现更高 min_count而不是更低可以改善最终结果.
为什么要做token_count?以后没有需要总令牌数的地方.该total_examples参数稍后期望文本示例的计数 - 即,单个文档/句子的数量 - 而不是总单词.通过提供(大得多)字数,train()将无法alpha正确管理或估计记录输出的进度.
不要train()使用自己的明确alpha管理在循环中多次调用,除非你肯定你知道你在做什么.大多数人都弄错了.通过在model.iter此处提供默认值(其值为5)作为参数,您实际上对语料库执行了500次总传递,这不太可能是您想要的.通过alpha在100个循环alpha中将初始0.025 值减少0.0001,您将结束最终0.015 - 小于起始值的一半.相反,只需调用train()一次,使用正确total_examples且选择良好的epochs值(在Doc2Vec发布的工作中通常使用10到20个值).然后,它将执行完全正确的显式迭代次数,并alpha智能地进行管理,并在日志记录中打印准确的进度估计.
最后,接下来的事情不一定是你的代码中的一个问题,因为你没有显示你的语料库res是如何构建的,但是要注意一个常见的错误:确保你的语料库可以多次迭代(就好像它一样)是内存列表,或者是来自IO的东西的可重新启动的可迭代对象.通常人们提供一次性使用的迭代器,一次通过(如在build_vocab())中没有返回任何其他东西 - 导致即时训练和无用的仍然随机和未经训练的模型.(如果您已启用日志记录,并注意每个步骤的记录输出和时间,那么这是一个问题就很明显了.)