我正在用Gensim在几个不同的语料库上对单词进行矢量化处理,并且获得的结果使我重新思考Word2Vec的功能。我的理解是Word2Vec是确定性的,并且单词在向量空间中的位置不会因训练而改变。如果语料库中的两个句子是“我的猫在跑”和“你的狗在跑”,那么“正在跑”(或其茎)的值似乎一定是固定的。
但是,我发现该值确实在各个模型中确实有所不同,并且当我训练模型时,单词会不断改变它们在向量空间中的位置。差异并不总是很有意义,但是它们确实表明存在一些随机过程。我在这里想念什么?
答案 0 :(得分:2)
这在Gensim FAQ中有很好的介绍,我在这里引用:
Q11:我已经使用完全相同的文本语料库反复训练了
Word2Vec
/Doc2Vec
/ etc模型,但是每次的向量都不相同。是否有错误或我做错了? (* 2vec训练不确定性)答案: * 2vec模型(word2vec,fasttext,doc2vec…)以随机初始化开始,然后大多数模式使用附加的随机化 在训练中。 (例如,训练窗口是随机的 截断是加权较高的较近单词的有效方法。的 选择默认负采样模式下的负样本 随机地。以及对高频词的降采样 由
sample
参数决定,由随机选择决定。这些 行为均在原始Word2Vec论文的算法中定义 说明。)即使所有这些随机性都来自于 伪随机数生成器已被播种以提供一个 可重现的随机数流(gensim默认情况下会执行此操作), 通常多线程训练可以进一步改变 文本示例的训练顺序,以及最终的模型状态。 (此外,在Python 3.x中,每个字符串的哈希值都是随机的 重新启动Python解释器-更改迭代顺序 从头到尾的词汇量,因此甚至相同 随机数字符串绘制以不同的方式选择不同的单词 发射。)
因此,可以预见的是,每个运行阶段的模型也会有所不同,甚至 在相同的数据上训练。没有任何一个“正确的地方” 要结束的词向量或doc向量:仅位于 与其他向量的距离和方向逐渐有用 在同一模型中共同训练。 (通常,只有 在相互对照的用法交织在一起的过程中一起训练 在坐标上具有可比性。)
合适的训练参数应产生大致如下的模型 彼此之间非常有用。测试与评估 过程应容忍矢量位置的任何变化,以及 在模型的整体效用中产生小的“抖动”,这是由于 固有算法随机性。 (如果观察到的质量来自 运行之间的差异很大,可能还有其他问题:数据太少, 参数调整不良或评估中的错误/不足 方法。)
您可以尝试使用
workers=1
来限制确定性 训练到单个线程–如果在Python 3.x中使用PYTHONHASHSEED
环境变量以禁用其通常的字符串哈希 随机化。但是训练会比增加训练慢得多 线程。而且,您会掩盖内在的 基础算法的随机性/近似性 可能会使结果更脆弱,并取决于运气 特定的设置。最好容忍一点抖动,并使用 过多的抖动表明数据中其他地方存在问题,或者 模型设置–而不是施加肤浅的确定性。
答案 1 :(得分:1)
虽然我不知道gensim中Word2Vec的任何实现细节,但我确实知道,一般来说,Word2Vec是由一个简单的神经网络训练的,该神经网络具有嵌入层作为第一层。该嵌入层的权重矩阵包含我们感兴趣的词向量。
这就是说,随机初始化神经网络的权重通常也很普遍。这样便有了随机性的起源。
但是无论起始条件不同(随机)如何,结果如何都不同?
训练有素的模型将为具有相似含义的单词分配相似的向量。这种相似性是通过两个向量之间的角度的余弦值来衡量的。从数学上讲,如果v
和w
是两个非常相似的单词的向量,则
dot(v, w) / (len(v) * len(w)) # this formula gives you the cosine of the angle between v and w
将接近1
。
此外,它将允许您执行著名的算术运算
king - man + woman = queen
出于说明目的,请想象2D向量。如果您将这些算术属性丢失,例如围绕原点旋转所有角度?有了一点数学背景,我就可以向您保证:不,他们不会!
所以,你的假设
如果“我的猫正在跑步”和“你的狗无法跑步”是两个 语料库中的句子,然后是“ running”(或其词干)的值 似乎一定是固定的。
是错误的。 “运行”的值根本不是固定的。但是,(固定)固定的是与其他单词的相似度(余弦)和算术关系。