- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我尝试在 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
model.train(sentences)
token_count = sum([len(sentence) for sentence in res])
model.train(res, total_examples = token_count,epochs = model.iter)
最佳答案
不幸的是,您的代码是被误导的实践的荒谬组合。所以不要遵循你正在遵循的任何在线示例!
从上到下依次解决问题:
不做min_alpha
同 alpha
.随机梯度下降优化过程需要从大到小逐渐下降alpha
在看到许多不同示例的过程中学习率,并且通常应以可忽略的接近零的值结束。 (代码尝试以这种方式显式递减 alpha
还存在其他问题,我们将在下面讨论。)只有已经有工作设置、很好地理解算法并正在执行实验性调整的专家用户才应该更改 alpha
/min_alpha
默认值。
不设min_count=1
.只出现一次或几次的稀有词通常对 Word2Vec/Doc2Vec 训练没有帮助。它们很少出现意味着它们自己对应的模型权重没有得到太多训练,并且与相应单词的真实含义相比,少数出现更有可能没有代表性(这可能反射(reflect)在测试数据或以后的生产数据中)。因此,模型对这些个别罕见词的表示不太可能变得非常好。但总的来说,所有这些生僻词都与其他有机会变得有意义的词竞争很多——所以“粗”生词主要是对其他词的随机干扰。或者,这些词可能意味着额外的模型词汇参数,有助于模型在训练数据上从表面上变得更好,因为在那里记住了不可概括的特性,但在 future 的测试/生产数据上会更糟。所以,min_count
是另一个默认值 (5),只有在您拥有工作基线后才应更改 - 如果您稍后在大型数据集(如您的 600K 文档)上严格元优化此参数,您很可能会发现更高 min_count
而不是降低改善最终结果。
为什么要做 token_count
?没有以后需要总 token 计数的地方。 total_examples
参数稍后需要文本示例的计数——即单个文档/句子的数量——而不是总字数。通过提供(更大的)字数,train()
将无法管理 alpha
正确或估计记录输出的进度。
不要打电话train()
在循环中多次使用您自己的显式 alpha
管理,除非你是肯定的,否则你知道你在做什么。大多数人都弄错了。通过提供默认 model.iter
(其值为 5)作为此处的参数,实际上您总共对语料库执行了 500 次传递,这不太可能是您想要的。通过减少初始 0.025 alpha
值在 100 次循环中增加 0.0001,您最终会得到一个 alpha
0.015 - 不到起始值的一半。相反,请调用 train()
恰好一次,正确 total_examples
,和精心挑选的epochs
值(在 Doc2Vec 发表的作品中通常使用 10 到 20)。然后它将执行正确数量的显式迭代,并管理 alpha
智能,并在日志中打印准确的进度估计。
最后,接下来的事情不一定是您代码中的问题,因为您没有显示您的语料库 res
已构造,但有一个常见错误需要注意:确保您的语料库可以迭代多次(就像它是内存中的列表,或者是来自 IO 的东西上的可重新启动的可迭代对象)。通常人们提供一个一次性迭代器,它在一次通过后(如 build_vocab()
)不返回其他任何东西——导致即时训练和无用的仍然随机和未经训练的模型。 (如果您启用了日志记录,并注意记录的输出和每个步骤的时间,这是否是一个问题就很明显了。)
关于python - 改进 Gensim Doc2vec 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47890052/
假设我有一个组织 ID 向量 let orgs = vec![1, 3, 14, 12]; 然后我调用 .iter()在 each 上获取每个组织的事件,其中函数 get_events_for()返回
这个问题已经有答案了: What are Rust's exact auto-dereferencing rules? (4 个回答) 已关闭 3 年前。 我很困惑为什么这个函数 get适用于 Vec
let a = vec![ vec![1, 2], vec![3, 4], vec![5, 6] ]; 怎么才能聚成一个Vec包含在所有 Vec 中的所有值s 在 a ? 最佳答案 您可以使用 fla
我在HashMap, Vec>中有数据,我想将该数据作为字节缓冲区(单个Vec)写入文件,然后从文件中读取回去并重建HashMap结构。 是否有建立像这样的平坦化和恢复 map 的算法?我可以将元数据
我正在寻找一种“使用rust ”的方式来将 Vec 累积到 Vec 中,以便将每个内部 Vec 的第一个元素加在一起,将每个 Vec 的每个第二个元素加在一起,等等......,并将结果收集到 Vec
我正在寻找一种“使用rust ”的方式来将 Vec 累积到 Vec 中,以便将每个内部 Vec 的第一个元素加在一起,将每个 Vec 的每个第二个元素加在一起,等等......,并将结果收集到 Vec
我正在尝试使用 selection_sort 创建一个已排序的向量,同时保留原始未排序的向量: fn main() { let vector_1: Vec = vec![15, 23, 4,
在 https://doc.rust-lang.org/std/vec/struct.Vec.html#method.iter , 我只能在页面左侧的索引侧边栏中找到iter。但是,找不到 iter_
我正在尝试从 Vec> 创建一个集合向量 ( Vec> ) .这是我目前的进展: use std::collections::BTreeSet; fn main() { // The data
我错过了向量向量初始化的一些东西。在第一种方法中,我尝试了这段代码: let mut landFirst: Vec> = Vec::with_capacity(width); for v in lan
我想设计一个类似于示例 here 的函数除了我的情况,iproduct 的参数数量在编译时是未知的。正如 here 所解释的那样,这在 python 中很容易完成。 . 我已经尝试使用 itertoo
我有一个我不明白的问题: fn cipher_with(key: &[u8], data: &[u8]) -> Vec { let data_len = 16; let mut dat
我刚开始学习 Rust,我偶然发现了这个愚蠢的问题: error: mismatched types: expected `&[u8]` but found `&collections::vec::V
这个问题在这里已经有了答案: How to filter a vector of custom structs? (1 个回答) 关闭 4 年前。 我有一个接受 &Vec 的函数(其中 Word 是
试图创建一个 HashMap 的数据库结构向量。每个Vec包含 Box . use std::collections::HashMap; trait Model { fn id(&self)
我正在编写一个使用 Vec> 的库类型以按列优先顺序存储数据(每个内部 Vec 代表一列)。用户可以创建 Vec>具有任何行和列长度,但所有列都被限制为相同的长度。 有时我需要高效地遍历 Vec>按行
在 GLSL 中我不明白什么是“in”和“out”变量,这是什么意思?这是我从教程中复制的代码示例。 // Shader sources const GLchar* vertexSource =
例如 [[5,6][2,3][2,5][2,9][1,6]]先按第一个元素升序排序,当一个元素相等时,按第二个元素降序排序,得到[1,6],[2,9],[2,5],[2,3] ],[5,6] 最佳答案
我正在尝试为类型为Vec>的向量创建可变的迭代器 迭代器代码: pub struct IterMut { iter: &'a mut Vec>, ix: usize, inne
我是 rust 编程的新手。我想用递归实现合并排序。这是我的代码: fn merge(a: &mut Vec, b: &mut Vec) -> Vec { let mut temp: Vec
我是一名优秀的程序员,十分优秀!