我想了解词嵌入中的“维度”是什么意思。
当我为 NLP 任务以矩阵的形式嵌入单词时,维度起什么作用?有没有可以帮助我理解这个概念的视觉示例?
我想了解词嵌入中的“维度”是什么意思。
当我为 NLP 任务以矩阵的形式嵌入单词时,维度起什么作用?有没有可以帮助我理解这个概念的视觉示例?
词嵌入只是从词到向量的映射。词嵌入中的维度是指这些向量的长度。
这些映射有不同的格式。大多数预训练的嵌入都可以作为空格分隔的文本文件使用,其中每一行在第一个位置包含一个单词,其向量表示位于它旁边。如果要拆分这些行,您会发现它们的长度为1 + dim
,其中dim
是词向量的维数1
,并且对应于所表示的词。有关真实示例,请参阅GloVe 预训练向量。
例如,如果您下载glove.twitter.27B.zip
,解压缩它,然后运行以下 python 代码:
#!/usr/bin/python3
with open('glove.twitter.27B.50d.txt') as f:
lines = f.readlines()
lines = [line.rstrip().split() for line in lines]
print(len(lines)) # number of words (aka vocabulary size)
print(len(lines[0])) # length of a line
print(lines[130][0]) # word 130
print(lines[130][1:]) # vector representation of word 130
print(len(lines[130][1:])) # dimensionality of word 130
你会得到输出
1193514
51
people
['1.4653', '0.4827', ..., '-0.10117', '0.077996'] # shortened for illustration purposes
50
有点不相关但同样重要的是,这些文件中的行是根据在训练嵌入的语料库中找到的词频排序的(最常见的词在前)。
您还可以将这些嵌入表示为字典,其中键是单词,值是表示单词向量的列表。这些列表的长度将是您的词向量的维度。
一种更常见的做法是将它们表示为矩阵(也称为查找表),维度为(V x D)
,其中V
是词汇量大小(即,您有多少单词),并且D
是每个词向量的维度。在这种情况下,您需要保留一个单独的字典,将每个单词映射到矩阵中的相应行。
关于您关于维度所扮演角色的问题,您需要一些理论背景。但总而言之,嵌入单词的空间呈现出很好的特性,可以让 NLP 系统表现得更好。这些属性之一是具有相似含义的单词在空间上彼此接近,即具有相似的向量表示,如欧几里得距离或余弦相似度等距离度量所测量的那样。
您可以在此处可视化几个词嵌入的 3D 投影,例如,在嵌入中与“roads”最接近的词是“highways”、“road”和“routes” 。 Word2Vec 10K
有关更详细的解释,我建议阅读Christopher Olah的这篇文章的“词嵌入”部分。
有关为什么使用作为分布式表示的一个实例的词嵌入比使用例如单热编码(局部表示)更好的更多理论,我建议阅读Geoffrey Hinton 等人 的分布式表示的第一部分。
像 word2vec 或 GloVe 这样的词嵌入不会将词嵌入到二维矩阵中,它们使用一维向量。“维度”是指这些向量的大小。它与词汇量的大小是分开的,词汇量是您实际保留向量而不是仅仅丢弃的单词数。
理论上,更大的向量可以存储更多信息,因为它们具有更多可能的状态。在实践中,超过 300-500 的大小并没有太大的好处,在某些应用程序中,甚至更小的向量也能正常工作。
这是GloVe 主页上的图片。
向量的维数显示在左轴上;例如,减少它会使图表更短。每列是一个单独的向量,每个像素的颜色由向量中该位置的数字确定。
词嵌入中的“维数”表示它编码的特征总数。实际上,这是对定义的过度简化,但稍后会谈到这一点。
特征的选择通常不是手动的,而是在训练过程中使用隐藏层自动进行的。根据文献的语料库选择最有用的维度(特征)。例如,如果文学是关于浪漫小说的,那么与数学文学相比,性别维度更有可能被表现出来。
一旦你有了由神经网络为100,000 个唯一词生成的100 维(例如)词嵌入向量,研究每个维的目的并尝试通过“特征名称”标记每个维通常没有多大用处。因为每个维度代表的特征可能不是简单和正交的,而且由于过程是自动的,所以没有人确切知道每个维度代表什么。
为了更深入地了解这个主题,您可能会发现这篇文章很有用。
在输入任何机器学习算法之前,必须将文本数据转换为数字数据。Word Embedding 是一种方法,其中每个单词都映射到一个向量。
在代数中,向量是具有比例和方向的空间点。用更简单的术语来说,向量是一维垂直数组(或者说是具有单列的矩阵),维数是该一维垂直数组中元素的数量。
Glove、Word2vec 等预训练的词嵌入模型为每个词提供了多维选项,例如 50、100、200、300。每个词代表 D 维空间中的一个点,同义词是彼此更接近的点。维度越高,精度越高,但计算需求也越高。
我不是专家,但我认为维度仅代表已分配给单词的变量(也称为属性或特征),尽管可能还有更多。每个维度的含义和维度总数将特定于您的模型。
我最近从 Tensor Flow 库中看到了这个嵌入可视化: https ://www.tensorflow.org/get_started/embedding_viz
这尤其有助于将高维模型降低到人类可感知的程度。如果您有三个以上的变量,则很难将聚类可视化(除非您显然是斯蒂芬霍金)。
这篇关于降维的维基百科文章和相关页面讨论了特征如何在维度中表示,以及维度过多的问题。
根据 的书Neural Network Methods for Natural Language Processing
,in ( ) 是指嵌入算法的第一个权重矩阵(输入层和隐藏层之间的权重)中的列数Goldenberg
,例如。图像中是词嵌入:
dimensionality
word embeddings
demb
word2vec
N
dimensionality
有关更多信息,您可以参考此链接: https ://blog.acolyer.org/2016/04/21/the-amazing-power-of-word-vectors/
如果我们考虑 Word2Vec 嵌入的情况,则首先从共现矩阵构造密集的数值嵌入向量。共现矩阵ncol
通常是词汇表的维度 |V|,并且nrow
作为维度 d,我们要考虑的总共有 d 个单词。每个条目是出现在每个列词的上下文中的每个行词(w_i,对于 i = 1,...,d)的计数。
Word2Vec 对这个稀疏 (d by |V|) 矩阵执行奇异值分解。我们利用分解结果中的密集 (d by d) 矩阵。
这个密集矩阵的每一行都是单词 w_i 的长度为 d 的嵌入向量,我们总共有 d 个向量。这些向量连接起来形成网络中的嵌入层。