Machine learning 为什么单词嵌入实际上是向量?
我为我的天真感到抱歉,但我不明白为什么NN训练过程(word2vec)的结果所产生的单词嵌入实际上是向量 嵌入是降维的过程,在训练过程中,NN将1/0的单词数组降维为更小的数组,该过程不采用向量算法 所以我们得到的是数组,而不是向量。为什么我要把这些数组看作向量 即使我们有向量,为什么每个人都把它们描述成来自原点(0,0)的向量 再一次,如果我的问题看起来很愚蠢,我很抱歉 该过程不执行任何应用向量算法的操作 训练过程与向量算法无关,但当生成数组时,结果表明它们具有非常好的特性,因此人们可以想到“单词线性空间” 例如,在此空间中,哪些单词与给定单词最接近 换言之,意思相似的词会形成一团云。这是一个二维t-SNE表示: 再比如,“男人”和“女人”之间的距离非常接近“叔叔”和“阿姨”之间的距离: 因此,您的算法非常合理:Machine learning 为什么单词嵌入实际上是向量?,machine-learning,neural-network,nlp,word2vec,embedding,Machine Learning,Neural Network,Nlp,Word2vec,Embedding,我为我的天真感到抱歉,但我不明白为什么NN训练过程(word2vec)的结果所产生的单词嵌入实际上是向量 嵌入是降维的过程,在训练过程中,NN将1/0的单词数组降维为更小的数组,该过程不采用向量算法 所以我们得到的是数组,而不是向量。为什么我要把这些数组看作向量 即使我们有向量,为什么每个人都把它们描述成来自原点(0,0)的向量 再一次,如果我的问题看起来很愚蠢,我很抱歉 该过程不执行任何应用向量算法的操作 训练过程与向量算法无关,但当生成数组时,结果表明它们具有非常好的特性,因此人们可以想到“
W("woman") − W("man") ≃ W("aunt") − W("uncle")
W("woman") − W("man") ≃ W("queen") − W("king")
所以称它们为向量并不牵强。所有的图片都是我非常推荐阅读的。每个单词都映射到d维空间中的一个点(d通常是300或600,虽然不是必需的),因此它被称为向量(d维空间中的每个点都是该d维空间中的向量)
这些点有一些很好的特性(意思相似的词往往出现得更近)[接近度是用两个词向量之间的余弦距离来衡量的]什么是嵌入? 单词嵌入是自然语言处理(NLP)中一组语言建模和特征学习技术的总称,其中词汇表中的单词或短语映射到实数向量 从概念上讲,它涉及从每个单词一个维度的空间到一个维度更低的连续向量空间的数学嵌入 (来源:) 什么是Word2Vec? Word2vec是一组用于生成单词嵌入的相关模型。这些模型是浅层的两层神经网络,经过训练可以重建单词的语言上下文 Word2vec将大量文本作为输入,并生成一个向量空间,通常有几百个维度,其中为语料库中的每个唯一单词分配一个相应的向量 词向量被放置在向量空间中,使得在语料库中共享公共上下文的词在空间中彼此非常接近 (来源:) 什么是数组? 在计算机科学中,数组数据结构,或简称数组,是由元素(值或变量)集合组成的数据结构,每个元素至少由一个数组索引或键标识 存储一个数组,这样每个元素的位置就可以通过一个数学公式从其索引元组中计算出来 最简单的数据结构类型是线性阵列,也称为一维阵列。 什么是向量/向量空间? 向量空间(也称为线性空间)是一组称为向量的对象,这些对象可以加在一起并用称为标量的数字相乘(“缩放”) 标量通常被视为实数,但也有向量空间中的复数、有理数或一般任何域的标量乘法 向量加法和标量乘法运算必须满足某些要求,称为公理,如下所列 (来源:) 向量和数组之间有什么区别? 首先,单词嵌入中的向量并不完全是编程语言的数据结构(所以它不是) 通过编程,单词嵌入向量是某种实数数组(数据结构)(即标量) 从数学上讲,任何具有一个或多个维度的元素都是实数填充的。向量是一个一维的标量
回答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
之间的距离不远。在这种情况下,单词的单个数字“特征”能够捕获关于单词含义的一些信息,但不能完全捕获
假设每个单词有两个实数值(即向量):
为了计算差异,我们可以做:
>>> np.array(semnum['apple']) - np.array(semnum['orange'])
array([-68, 761])
>>> np.array(semnum['apple']) - np.array(semnum['samsung'])
array([-848, 8])
这不是很有用,它返回一个向量,我们无法获得单词之间距离的确定度量,因此我们可以尝试一些向量技巧并计算向量之间的距离,例如:
现在,我们可以看到更多的“信息”apple
比orange
更接近samsung
。这可能是因为apple
co在语料库中与samsung
的出现频率高于orange
一个大问题来了,“我们如何让这些实数代表单词的向量?”。这就是Word2Vec/嵌入训练算法的作用
>>> 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