我很抱歉我的天真,但我不明白为什么NN训练过程(word2vec)导致的嵌入字实际上是向量。
嵌入是降维的过程,在训练过程中,NN将1/0的单词数组减少为较小的数组,该过程不会应用向量算法。
结果我们得到的只是数组而不是向量。为什么我要将这些数组视为向量?
即使我们有矢量,为什么每个人都将它们描述为来自原点的矢量(0,0)?
如果我的问题看起来很愚蠢,我很抱歉。
答案 0 :(得分:4)
该过程不执行任何应用矢量运算
的过程
训练过程与向量算法无关,但是当生成数组时,事实证明它们具有非常好的属性,因此人们可以想到“单词线性空间”。 / p>
例如,在这个空间中哪些单词的嵌入最接近给定单词?
换句话说,具有相似含义的词形成一个云。这是一个2-D t-SNE表示:
另一个例子,“男人”和“女人”之间的距离非常接近“叔叔”和“阿姨”之间的距离:
结果,你有非常合理的算术:
W("woman") − W("man") ≃ W("aunt") − W("uncle")
W("woman") − W("man") ≃ W("queen") − W("king")
因此,将它们称为向量并不遥远。所有图片均来自this wonderful post,我非常推荐阅读。
答案 1 :(得分:4)
什么是嵌入?
Word嵌入是自然语言处理(NLP)中一组语言建模和特征学习技术的统称,其中来自词汇的单词或短语被映射到实数的向量。
从概念上讲,它涉及从每个单词一维的空间到具有更低维度的连续向量空间的数学嵌入。
(资料来源:https://en.wikipedia.org/wiki/Word_embedding)
什么是Word2Vec?
Word2vec是一组用于生成单词嵌入的相关模型。这些模型是浅层的双层神经网络,经过训练可以重建单词的语言环境。
Word2vec将大量文本作为输入,并生成一个通常为几百维的向量空间,其中<strong>语料库中的每个唯一单词在空间中分配了相应的向量。
单词向量位于向量空间中,使得在语料库中共享公共上下文的单词在空间中彼此非常接近。
(资料来源:https://en.wikipedia.org/wiki/Word2vec)
阵列是什么?
在计算机科学中,数组数据结构或简称数组是由元素集合(值或变量)组成的数据结构,每个元素由至少一个数组索引或键标识。
存储一个数组,以便可以通过数学公式从索引元组计算每个元素的位置。
最简单的数据结构类型是线性数组,也称为一维数组。
矢量/矢量空间是什么?
向量空间(也称为线性空间)是一组称为向量的对象,可以将它们相加并乘以(&#34;缩放&#34;)数字,称为标量。
标量通常被认为是实数,但也有一些向量空间,其中标量乘以复数,有理数或通常任何字段。
向量加法和标量乘法的运算必须满足下面列出的某些要求,称为公理。
(资料来源:https://en.wikipedia.org/wiki/Vector_space)
矢量和数组之间的区别是什么?
首先,单词嵌入中的向量并不完全是编程语言数据结构(所以它不是Arrays vs Vectors: Introductory Similarities and Differences)。
以编程方式,单词嵌入向量 IS 某种实数的数组(数据结构)(即标量)
在数学上,任何具有一个或多个维度的元素都填充了实数,为tensor。矢量是标量的单个维度。
回答OP问题:
为什么单词嵌入实际上是向量?
根据定义,单词嵌入是向量(见上文)
为什么我们将单词表示为实数的向量?
要了解单词之间的差异,我们必须以某种方式量化差异。
想象一下,如果我们分配论文&#34; smart&#34;数字到:
>>> semnum = semantic_numbers = {'car': 5, 'vehicle': 2, 'apple': 232, 'orange': 300, 'fruit': 211, 'samsung': 1080, 'iphone': 1200}
>>> abs(semnum['fruit'] - semnum['apple'])
21
>>> abs(semnum['samsung'] - semnum['apple'])
848
我们发现fruit
和apple
之间的距离很近,但samsung
和apple
并非如此。在这种情况下,单个数字&#34;功能&#34;该单词能够捕获有关单词含义的一些信息,但不能完整。
想象一下,我们为每个单词(即向量)提供了两个实数值:
>>> import numpy as np
>>> semnum = semantic_numbers = {'car': [5, -20], 'vehicle': [2, -18], 'apple': [232, 1010], 'orange': [300, 250], 'fruit': [211, 250], 'samsung': [1080, 1002], 'iphone': [1200, 1100]}
为了计算差异,我们可以做到:
>>> np.array(semnum['apple']) - np.array(semnum['orange'])
array([-68, 761])
>>> np.array(semnum['apple']) - np.array(semnum['samsung'])
array([-848, 8])
这不是很有用,它返回一个向量,我们无法得到单词之间距离的确定度量,因此我们可以尝试一些向量技巧并计算向量之间的距离,例如: euclidean distance:
>>> import numpy as np
>>> orange = np.array(semnum['orange'])
>>> apple = np.array(semnum['apple'])
>>> samsung = np.array(semnum['samsung'])
>>> np.linalg.norm(apple-orange)
763.03604108849277
>>> np.linalg.norm(apple-samsung)
848.03773500947466
>>> np.linalg.norm(orange-samsung)
1083.4685043876448
现在,我们可以看到更多&#34;信息&#34; apple
可以比samsung
更接近orange
到samsung
。可能是因为apple
在samsung
而不是orange
的情况下更频繁地出现在语料库中。
最大的问题是,&#34;我们如何得到这些实数来表示单词的向量?&#34; 。这就是Word2Vec /嵌入训练算法(originally conceived by Bengio 2003)的用武之地。
由于在表示单词的向量中添加更多实数会提供更多信息,那么为什么我们不添加更多维度(即每个单词向量中的列数)?
传统上,我们通过在distributional semantics/distributed lexical semantics字段中计算逐字词矩阵来计算单词之间的差异,但是如果单词“不”,则矩阵变得非常稀疏且具有许多零值。发生在另一个。
因此,在计算dimensionality reduction后,word co-occurrence matrix付出了很多努力。恕我直言,它就像一个自上而下的视图,了解单词之间的全局关系,然后压缩矩阵,以获得一个较小的向量来表示每个单词。
所以&#34;深度学习&#34;单词嵌入创建来自另一个思想学派,并从随机(有时不那么随机)开始,为每个单词初始化一层向量,并学习这些向量的参数/权重,并通过最小化一些损失函数来优化这些参数/权重基于一些已定义的属性。
听起来有点含糊不清但具体而言,如果我们看一下Word2Vec学习技巧,它会更清晰,请参阅
这里有更多资源来阅读有关字嵌入的内容:https://github.com/keon/awesome-nlp#word-vectors
答案 2 :(得分:1)
每个单词都映射到d维空间中的一个点(d通常是300或600,虽然不是必需的),因此它被称为向量(d-dim空间中的每个点都只是d-dim中的向量空间)。
这些点有一些很好的属性(具有相似含义的词往往更接近彼此)[接近度使用2 词向量之间的余弦距离来测量]
答案 3 :(得分:1)
着名的Word2Vec实现是CBOW + Skip-Gram
您对CBOW的输入是您的输入词向量(每个都是长度为N的向量; N =词汇量的大小)。所有这些输入字向量一起是大小为M×N的数组; M =单词的长度。)
现在,下图中有趣的是投影步骤,我们强制NN学习输入空间的低维表示,以正确预测输出。所需的输出是我们的原始输入。
该低维表示P由描述单词的抽象特征组成,例如位置,形容词等(实际上这些学到的功能并不是很清楚)。现在,这些功能代表了这些单词的一个视图。
与所有功能一样,我们可以将它们视为高维矢量。 如果需要,可以使用降维技术在2维或3维空间中显示它们。
更多详细信息和图片来源:https://arxiv.org/pdf/1301.3781.pdf