为什么词嵌入实际上是矢量?
我很抱歉,我的天真,但我不明白为什么字符嵌入是神经网络训练过程(word2vec)的结果实际上是矢量。为什么词嵌入实际上是矢量?
嵌入是降维的过程,在训练过程中,NN将字的1/0数组减少为更小的数组,该过程没有采用任何适用矢量算术的处理。
因此,我们得到的只是数组而不是矢量。为什么我应该将这些数组看作向量?尽管我们得到了矢量,为什么每个人都将它们描述为来自原点(0,0)的矢量?
再次,如果我的问题看起来很愚蠢,我很抱歉。
过程做什么,应用矢量运算
训练过程无关,与矢量运算,但是当阵列生产的,事实证明,他们有相当不错的性能,所以人们可以想到“文字线性空间”。
例如,哪个单词在这个空间中有最接近给定单词的嵌入?
换种方式,用类似含义的词语形成云。这里有一个2-d T-SNE表示:
又如,“男人”和“女人”之间的距离非常接近“叔叔”和“阿姨”之间的距离:
其结果是,你有非常合理的算术:
W("woman") − W("man") ≃ W("aunt") − W("uncle")
W("woman") − W("man") ≃ W("queen") − W("king")
所以它不是遥不可及给他们打电话vectors。所有图片都来自this wonderful post,我非常推荐阅读。
每个单词都映射到d维空间中的一个点(d通常是300或600,尽管不是必需的),因此它被称为向量(d-dim空间中的每个点都不过是d-昏暗的空间)。
的点有一些很好的性能(单词,类似含义趋于发生彼此接近)
什么的嵌入[接近使用2个字矢量之间余弦距离测量]?
Word中嵌入的一组语言建模的集体名称和功能,使从词汇或短语被映射到实数的载体在自然语言处理学习技术(NLP)。
从概念上讲,它涉及从每个单词一个维度的空间到具有更低维度的连续向量空间的数学嵌入。
(来源:https://en.wikipedia.org/wiki/Word_embedding)
什么是Word2Vec?
Word2vec是一组相关模型,用于生成字嵌入。这些模型是浅层的双层神经网络,其经过训练以重建语言上下文。
Word2vec以文本的大型文集为输入,并生成一个向量空间,通常为几百个维度,其中语料库中的每个唯一字都被分配了空间中的对应向量。
将词向量放置在向量空间中,以便在语料库*享公共上下文的词在空间中彼此非常接近。
(来源:https://en.wikipedia.org/wiki/Word2vec)
什么是数组?
在计算机科学中,一个阵列,或简单的阵列,是由元素(值或变量),集合中的每个由至少一个数组索引或关键字标识的数据结构。
存储数组,以便每个元素的位置可以通过数学公式从其索引元组中计算出来。
最简单的数据结构类型是线性数组,也称为一维数组。
什么是矢量/矢量空间?
矢量空间(也称为线性空间)是称为矢量对象的集合,其可以由数字加在一起,并乘以(“缩放”),所谓的标量。
标量经常被视为实数,但也有标量乘以复数,有理数或任何字段的向量空间。
矢量加法运算和标量乘法运算必须满足下面列出的某些要求,称为公理。
(来源:https://en.wikipedia.org/wiki/Vector_space)
什么是矢量和阵列之间的区别?
首先,字嵌入中的矢量并不完全是编程语言的数据结构(所以它不是Arrays vs Vectors: Introductory Similarities and Differences)。
编程,一个字嵌入矢量IS某种实数的数组(数据结构)的(即,标量)
在数学上,用一个或多个维填入实数的任何元件是tensor。矢量是标量的一个维度。
要回答这个问题,OP:
为什么字嵌入实际上引导?
根据定义,文字的嵌入是矢量(见上文)
为什么我们代表字作为实数的载体?
要学习单词之间的差异,我们必须以某种方式量化差异。
试想一下,如果我们指定的论文“智能”的数字的话:
>>> 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
不是。在这种情况下,单词的单个数字“特征”能够捕获关于单词意义的一些信息,但不完全。
试想一下,我们为每个单词(即矢量)两个实数的值:
>>> 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
,我们可以看到更多的 “信息” apple
可以比orange
到samsung
接近samsung
。可能这是因为apple
更频繁地与语料库共同出现samsung
比orange
。
最大的问题来了,“我们如何得到这些实数来表示词的向量?”。这就是Word2Vec /嵌入式训练算法(originally conceived by Bengio 2003)进来的地方。
采取绕道
由于加入了更多实数来表示的话向量更多的信息,那么为什么我们不只是增添了不少的尺寸(列的数量,即在每个字矢量) ?
传统上,我们通过计算distributional semantics/distributed lexical semantics字段中的逐字矩阵来计算单词之间的差异,但是如果单词不与另一单词共同出现,则矩阵变得真的稀疏并且有许多零值。
因此,在计算word co-occurrence matrix之后,已经投入dimensionality reduction的很多努力。恕我直言,它就像是自上而下的单词之间的全局关系,然后压缩矩阵以得到一个更小的向量来表示每个单词。
因此,“深度学习”的词嵌入创作来自另一派思想,并开始于随机(有时不是如此随机)为每个词初始化一层矢量,并学习这些矢量的参数/权重,通过基于一些定义的属性最小化一些损失函数来优化这些参数/权重。
这听起来有点含糊,但具体地讲,如果我们看一下Word2Vec学习技术,它会更清楚,看到
- https://rare-technologies.com/making-sense-of-word2vec/
- http://colah.github.io/posts/2014-07-NLP-RNNs-Representations/
- https://arxiv.org/pdf/1402.3722.pdf(更多数学)
这里有更多资源来读取字嵌入:https://github.com/keon/awesome-nlp#word-vectors
着名的Word2Vec实现方式是CBOW + Skip-Gram
您对CBOW的输入是您的输入单词向量(每个向量都是长度为N的向量; N =词汇大小)。所有这些输入字向量一起是一个大小为M×N的数组; M =单词的长度)。
下图中有趣的是投影步骤,我们迫使NN学习输入空间的低维表示以正确预测输出。所需的输出是我们的原始输入。
该较低维度表示P由描述词的抽象特征组成,例如,位置,形容词等(实际上这些学习功能并不十分清楚)。现在这些特征代表了这些词的一个观点。
就像所有的功能一样,我们可以将它们视为高维向量。 如果您想要,您可以使用维度降低技术在2维或3维空间中显示它们。
更多细节及图形的源:https://arxiv.org/pdf/1301.3781.pdf
我没有深刻的数学背景,但不你混合编程术语与数学酮(矢量为数学(数组作为数据结构)概念)? – lenz
调用word2vec的输出“矢量”的一个很好的理由是,您可以通过测量它们相应矢量的余弦距离来估计两个单词的相似度。 – lenz
@lenz,谢谢你的评论。我只是试图说出什么是嵌入字。我认为你的推理“他们是向量,因为我们计算余弦距离是不正确的”,实际上我们使用余弦距离是因为它们是向量。但为什么他们是矢量,我仍然不知道。 – com