我正在使用Word2vec通过gensim与Google在Google新闻上培训的预训练矢量。我注意到我可以通过对Word2Vec
对象进行直接索引查找来访问的单词vector不是单位向量:
>>> import numpy
>>> from gensim.models import Word2Vec
>>> w2v = Word2Vec.load_word2vec_format('GoogleNews-vectors-negative300.bin', binary=True)
>>> king_vector = w2v['king']
>>> numpy.linalg.norm(king_vector)
2.9022589
但是,在most_similar
方法中,不使用这些非单位向量;相反,标准化版本用于未记录的.syn0norm
属性,该属性仅包含单位向量:
>>> w2v.init_sims()
>>> unit_king_vector = w2v.syn0norm[w2v.vocab['king'].index]
>>> numpy.linalg.norm(unit_king_vector)
0.99999994
较大的向量只是单位向量的放大版本:
>>> king_vector - numpy.linalg.norm(king_vector) * unit_king_vector
array([ 0.00000000e+00, -1.86264515e-09, 0.00000000e+00,
0.00000000e+00, -1.86264515e-09, 0.00000000e+00,
-7.45058060e-09, 0.00000000e+00, 3.72529030e-09,
0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
... (some lines omitted) ...
-1.86264515e-09, -3.72529030e-09, 0.00000000e+00,
0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
0.00000000e+00, 0.00000000e+00, 0.00000000e+00], dtype=float32)
鉴于Word2Vec中的单词相似性比较是由cosine similarity完成的,对我来说,非标准化向量的长度意味着什么并不明显 - 尽管我认为它们意味着某些,因为gensim将它们暴露给我,而不是仅在.syn0norm
中公开单位向量。
如何生成这些非规范化的Word2vec向量的长度,它们的含义是什么?对于使用标准化向量有意义的计算,我何时应该使用非标准化向量?
答案 0 :(得分:16)
我认为你正在寻找的答案在Adriaan Schakel和Benjamin Wilson的2015年论文Measuring Word Significance using Distributed Representations of Words中有所描述。关键点:
出现单词时 在不同的上下文中,它的向量被移入 更新期间的不同方向。最终的载体 然后代表某种加权平均值 在各种情况下。对向量求平均值 这个点在不同的方向通常会导致 随着数量的增加而变得越来越短的向量 这个词出现的不同语境。 对于在许多不同背景下使用的单词, 它们必须带有一点意义。主要的例子 这种微不足道的话语是高频停止的 单词,确实由短向量表示 尽管它们的频率很高......
对于给定的学期频率, 向量长度看起来仅在a中取值 狭窄的间隔。该间隔最初向上移动 随着频率的增加。围绕一个频率 约30,这种趋势逆转和间隔 向下移动。
...
两种力量决定一个单词的长度 矢量在这里工作。小频率 单词倾向于一致地使用,以便 更频繁地出现这样的词,时间越长 他们的载体。这种趋势反映在向上 图3中的低频趋势。高频 另一方面,话语往往是 在许多不同的背景下使用,更是如此 它们经常发生。平均结束 越来越多的不同背景缩短了 代表这些词的向量。这种倾向 向下趋势清楚地反映了这一点 在图3中,在高频率,最终标点符号 用短矢量标记和停止单词 最后。
...
图3:字向量长度 v 与术语频率的关系 tf 在词汇表中的所有单词。 请注意频率上使用的对数标度 轴。黑暗的符号表示bin意味着 k 包含间隔中的频率的bin [2
1 ,2 k - 1] k = 1 ,2,3,.... 。 ..这些意思 包括作为眼睛的指南。横向的 line表示长度 v = 1.37的平均值 向量
4讨论
分布式表示的大多数应用程序 到目前为止通过word2vec获得的单词集中 围绕语义。大量的实验都有 证明了方向的程度 单词向量捕获语义。在这份简短的报告中, 有人指出,不仅方向, 而且单词向量的长度也很重要 信息。具体来说,它表明了 单词矢量长度配,与 术语频率,一个有用的衡量词的意义。
答案 1 :(得分:2)
我会因提前详细而道歉。
单词嵌入模型的目标函数是在模型下最大化数据对数似然。在word2vec中,这是通过最小化给定单词context的单词dot product
(用softmax
标准化)预测向量(使用上下文)和实际向量(当前表示)来实现的。
请注意,训练单词向量的任务是预测给定单词的上下文,或给定上下文的单词(skip-gram
vs cbow
)。 单词向量的长度没有含义,但是向量本身被发现具有有趣的属性/应用。
要查找相似的单词,您会发现具有最大余弦相似度的单词(相当于在单位规范化向量后找到欧几里德距离最小的单词,检查link),{{3}功能正在做。
为了找到类比,我们可以简单地使用单词向量的原始向量表示之间的差异(或方向)向量。例如,
在gensim
,
model = gensim.models.Word2Vec.load_word2vec_format('GoogleNews-vectors-negative300.bin', binary=True)
model.most_similar(positive=['good', 'sad'], negative=['bad'])
[(u'wonderful', 0.6414928436279297),
(u'happy', 0.6154338121414185),
(u'great', 0.5803680419921875),
(u'nice', 0.5683973431587219),
(u'saddening', 0.5588893294334412),
(u'bittersweet', 0.5544661283493042),
(u'glad', 0.5512036681175232),
(u'fantastic', 0.5471092462539673),
(u'proud', 0.530515193939209),
(u'saddened', 0.5293528437614441)]
参考文献:
most_similar
:用于Word表示的全局向量将答案复制到相关(但尚未答复Word2Vec)