首页 文章

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

提问于
浏览
4

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

嵌入是降维的过程,在训练过程中,NN将1/0的单词数组减少为较小的数组,该过程不会应用向量算法 .

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

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

如果我的问题看起来很愚蠢,我很抱歉 .

4 回答

  • 2

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

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

  • 0

    What are embeddings?

    Word嵌入是自然语言处理(NLP)中一组语言建模和特征学习技术的统称,其中词汇表中的单词或短语被映射到实数的向量 . 从概念上讲,它涉及从每个单词一维的空间到具有更低维度的连续向量空间的数学嵌入 .

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

    What is Word2Vec?

    Word2vec是一组用于生成单词嵌入的相关模型 . 这些模型是浅层的双层神经网络,经过训练可以重建语言的语言环境 . Word2vec将大量文本作为其输入,并产生通常为几百维的向量空间,语料库中的每个唯一单词在空间中被分配相应的向量 . 单词向量位于向量空间中,使得在语料库中共享共同上下文的单词在空间中彼此非常接近 .

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

    What's an array?

    在计算机科学中,数组数据结构或简称数组是由元素集合(值或变量)组成的数据结构,每个元素由至少一个数组索引或键标识 . 存储数组,以便可以通过数学公式从其索引元组计算每个元素的位置 . 最简单的数据结构类型是线性阵列,也称为一维阵列 .

    What's a vector / vector space?

    向量空间(也称为线性空间)是一组称为向量的对象,可以将它们相加并乘以(“缩放”)数字,称为标量 . 标量通常被认为是实数,但是也存在矢量空间,其中标量乘以复数,有理数或通常任何字段 . 向量加法和标量乘法的运算必须满足下面列出的某些要求,称为公理 .

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

    What's the difference between vectors and arrays?

    首先,单词嵌入中的向量并不完全是编程语言数据结构(因此它不是Arrays vs Vectors: Introductory Similarities and Differences) .

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

    在数学上,具有一个或多个用实数填充的维度的任何元素都是tensor . 矢量是标量的单个维度 .


    回答OP问题:

    Why are word embedding actually vectors?

    根据定义,字嵌入是向量(见上文)

    Why do we represent words as vectors of real numbers?

    要了解单词之间的差异,我们必须以某种方式量化差异 .

    想象一下,如果我们将“智能”数字分配给单词:

    >>> 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 不是 . 在这种情况下,单词的单个数字"feature"能够捕获关于单词含义但不完全的一些信息 .

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

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

    现在,我们可以看到更多"information" apple 可以更接近 samsung 而不是 orangesamsung . 可能这是因为 applesamsung 中与 orange 共同出现在语料库中 .

    最重要的问题来了, "How do we get these real numbers to represent the vector of the words?" . 这就是Word2Vec /嵌入训练算法(originally conceived by Bengio 2003)的用武之地 .


    绕道而行

    由于在表示单词的向量中添加更多实数更具信息性,那么为什么我们不添加更多维度(即每个单词向量中的列数)?

    传统上,我们通过计算来计算单词之间的差异distributional semantics/distributed lexical semantics字段中的逐字矩阵,但如果字不与另一个字共同出现,则矩阵变得非常稀疏,有许多零值 .

    因此,在计算word co-occurrence matrix之后,已经在dimensionality reduction中付出了很多努力 . 恕我直言,这就像一个自上而下的视图,说明单词之间的全局关系,然后压缩矩阵,以获得一个较小的向量来表示每个单词 .

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

    听起来有点模糊,但具体来说,如果我们看一下Word2Vec学习技巧,它会更清晰,见

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

  • 0

    该过程不会应用矢量算法

    训练过程与向量算法无关,但是当生成数组时,事实证明它们具有非常好的属性,因此人们可以想到"word linear space" .

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

    closest-words

    换句话说,具有相似含义的词形成一个 Cloud . 这是一个2-D t-SNE表示:

    tsne

    另一个例子,“男人”和“女人”之间的距离非常接近“叔叔”和“阿姨”之间的距离:

    word-distance

    结果,你有相当合理的算术:

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

    所以称它们为矢量并不遥远 . 所有图片均来自this wonderful post,我非常推荐阅读 .

  • 3

    着名的Word2Vec实现是CBOW Skip-Gram

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

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

    该较低维度表示P由描述例如单词的抽象特征组成 . 位置,形容词等(实际上这些学到的功能并不是很清楚) . 现在,这些功能代表了这些单词的一个视图 .

    和所有功能一样,我们可以将它们视为高维矢量 . 如果需要,可以使用降维技术在2维或3维空间中显示它们 .

    enter image description here

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

相关问题