繁体   English   中英

为什么词嵌入实际上是向量?

[英]Why are word embedding actually vectors?

我很抱歉我的天真,但我不明白为什么作为 NN 训练过程(word2vec)结果的词嵌入实际上是向量。

嵌入是降维的过程,在训练过程中,NN 将 1/0 的单词数组缩减为更小的数组,该过程不执行向量算法。

因此,我们得到的只是数组而不是向量。 为什么我应该将这些数组视为向量?

即使我们得到了向量,为什么每个人都将它们描述为来自原点 (0,0) 的向量?

再次,如果我的问题看起来很愚蠢,我很抱歉。

该过程不执行任何应用向量算术的操作

训练过程与向量运算无关,但是当数组生成时,结果证明它们具有非常好的属性,因此可以想到“词线性空间”。

例如,在这个空间中,哪些词的嵌入最接近给定的词?

最接近的词

换句话说,意思相近的词形成一片云。 这是一个二维 t-SNE 表示:

tsne

再比如,“男人”和“女人”之间的距离非常接近“叔叔”和“阿姨”之间的距离:

词距

结果,你有非常合理的算术:

W("woman") − W("man") ≃ W("aunt") − W("uncle")
W("woman") − W("man") ≃ W("queen") − W("king")

所以称它们为vector并不牵强。 所有图片都来自 这篇精彩的帖子,我非常推荐阅读。

什么是嵌入?

词嵌入是自然语言处理 (NLP) 中一组语言建模和特征学习技术的统称,其中词汇表中的单词或短语映射到实数向量

从概念上讲,它涉及从每个单词一维的空间到维度低得多的连续向量空间的数学嵌入。

(来源: https : //en.wikipedia.org/wiki/Word_embedding

什么是 Word2Vec?

Word2vec 是一组用于生成词嵌入的相关模型。 这些模型是浅层的两层神经网络,经过训练可以重建单词的语言上下文

Word2vec 将大型文本语料库作为其输入,并生成一个向量空间,通常有数百个维度,语料库中的每个唯一单词都被分配到空间中的相应向量

词向量被定位在向量空间中,使得在语料库中共享公共上下文的词在空间中彼此靠近

(来源: https : //en.wikipedia.org/wiki/Word2vec

什么是数组?

在计算机科学中,数组数据结构,或简称为数组,是由一组元素(值或变量)组成的数据结构,每个元素由至少一个数组索引或键标识。

存储一个数组,以便可以通过数学公式从其索引元组计算每个元素的位置。

最简单的数据结构类型是线性数组,也称为一维数组。

什么是向量/向量空间?

向量空间(也称为线性空间)是称为向量的对象的集合,这些对象可以加在一起并乘以(“缩放”)数字,称为标量。

标量通常被认为是实数,但也有标量乘以复数、有理数或任何域的向量空间。

矢量加法和标量乘法的运算必须满足某些要求,称为公理,如下所列。

(来源: https : //en.wikipedia.org/wiki/Vector_space

向量和数组有什么区别?

首先,词嵌入中的向量不完全是编程语言数据结构(所以它不是数组 vs 向量:介绍相似性和差异性)。

以编程方式,词嵌入向量某种实数(即标量)数组(数据结构)

从数学上讲,任何具有一维或多维实数的元素都是张量 向量是一个单一维度的标量。


要回答 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

我们看到fruitapple之间的距离很近,但samsungapple之间的距离却不是。 在这种情况下,单词的单个数字“特征”能够捕获有关单词含义的一些信息,但不能完全捕获。

想象一下,对于每个单词(即向量),我们有两个实数值:

>>> 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])

这不是很有用,它返回一个向量,我们无法获得单词之间距离的明确度量,因此我们可以尝试一些向量技巧并计算向量之间的距离,例如欧几里德距离

>>> 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可以更接近samsung不是orange更接近samsung 可能那是因为apple在语料库中与samsung共同出现频率高于orange

最大的问题来了, “我们如何得到这些实数来表示单词的向量?” . 这就是 Word2Vec / 嵌入训练算法(最初由 Bengio 2003 构想)的用武之地。


绕道而行

既然向表示单词的向量添加更多实数会提供更多信息,那么为什么我们不添加更多维度(即每个单词向量中的列数)?

传统上,我们通过计算分布语义/分布式词法语义领域中的逐词矩阵来计算单词之间的差异,但是如果单词不与另一个同时出现,矩阵会变得非常稀疏,有许多零值。

因此在计算词共现矩阵后,在降维方面投入了大量精力。 恕我直言,这就像一个自上而下的视图,了解单词之间的全局关系如何,然后压缩矩阵以获得更小的向量来表示每个单词。

所以“深度学习”词嵌入的创建来自另一个学派,从随机(有时不是那么随机)为每个词初始化一层向量并学习这些向量的参数/权重并优化这些参数/通过基于一些定义的属性最小化一些损失函数来权重。

听起来有点含糊,但具体来说,如果我们看一下 Word2Vec 学习技术,就会更清楚,参见

这里有更多关于词嵌入的阅读资源: https : //github.com/keon/awesome-nlp#word-vectors

每个词都映射到 d 维空间中的一个点(d 通常是 300 或 600,尽管不是必需的),因此它被称为向量(d-dim 空间中的每个点只不过是该 d-dim 空间中的一个向量)。

这些点有一些很好的属性(具有相似含义的词往往彼此更接近)[使用两个词向量之间的余弦距离来测量接近度]

著名的 Word2Vec 实现是 CBOW + Skip-Gram

您对 CBOW 的输入是您的输入词向量(每个词向量都是一个长度为 N 的向量;N = 词汇量)。 所有这些输入词向量一起是一个大小为 M x N 的数组; M=单词的长度)。

现在下图中有趣的是投影步骤,我们强制神经网络学习输入空间的低维表示以正确预测输出。 所需的输出是我们的原始输入。

这个低维表示 P 由描述单词的抽象特征组成,例如位置、形容词等(实际上这些学习的特征并不是很清楚)。 现在这些特征代表了对这些词的一种看法。

和所有特征一样,我们可以将它们视为高维向量。 如果需要,您可以使用降维技术将它们显示在 2 维或 3 维空间中。

在此处输入图片说明

更多细节和图形来源: https : //arxiv.org/pdf/1301.3781.pdf

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM