man*_*veg 10 nlp terminology dimensionality-reduction word-embedding
我想理解单词嵌入中"维度"的含义.
当我以NLP任务的矩阵形式嵌入一个单词时,维度扮演什么角色?有没有一个可以帮助我理解这个概念的视觉例子?
jab*_*azs 11
词嵌入只是词到向量的映射。词嵌入中的维数是指这些向量的长度。
这些映射有不同的格式。大多数经过预训练的嵌入都可以用空格分隔的文本文件使用,其中每行的第一个位置都包含一个单词,其旁边是矢量表示。如果要拆分这些行,您会发现它们的长度为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
Run Code Online (Sandbox Code Playgroud)
你会得到输出
1193514
51
people
['1.4653', '0.4827', ..., '-0.10117', '0.077996'] # shortened for illustration purposes
50
Run Code Online (Sandbox Code Playgroud)
无关紧要但同样重要的是,这些文件中的行是根据在训练嵌入的语料库中找到的词频来排序的(最常见的词在前)。
您也可以将这些嵌入表示为字典,其中键是单词,值是表示单词向量的列表。这些列表的长度将是单词向量的维数。
一种更常见的做法是将它们表示为维的矩阵(也称为查找表),(V x D)其中V的词汇量(即,您有多少个单词),以及每个单词向量D的维数。在这种情况下,您需要保留一个单独的字典,将每个单词映射到矩阵中相应的行。
关于维度作用的问题,您需要一些理论背景。但是,用几句话来说,嵌入单词的空间具有不错的属性,可以使NLP系统更好地执行。这些特性之一是,具有相似含义的词在空间上彼此接近,也就是说,具有相似的向量表示形式,如通过距离度量(例如欧几里得距离或余弦相似度)所测量的。
您可以在此处可视化几个单词嵌入的3D投影,例如,在嵌入中,最接近“道路”的单词是“公路”,“道路”和“路线” 。 Word2Vec 10K
有关更详细的解释,我建议阅读Christopher Olah 的这篇文章的“单词嵌入”部分。
要获得更多关于为什么使用单词嵌入(作为分布式表示形式的实例)比使用单热编码(局部表示)更好的理论,我建议阅读Geoffrey Hinton等人的“ 分布式表示形式”的第一部分。
像 word2vec 或 GloVe 这样的词嵌入不会将单词嵌入到二维矩阵中,它们使用一维向量。“维度”是指这些向量的大小。它与词汇量的大小是分开的,词汇量是你实际保留向量而不是直接扔掉的单词数量。
理论上,较大的向量可以存储更多的信息,因为它们有更多可能的状态。在实践中,超过 300-500 的大小并没有太大的好处,并且在某些应用中,甚至更小的向量也可以正常工作。
这是GloVe 主页上的图片。
向量的维数显示在左轴上;例如,减少它会使图表变短。每列都是一个单独的向量,每个像素的颜色由向量中该位置的数字确定。
词嵌入中的“维度”表示其编码的特征总数。实际上,这是对定义的过度简化,但稍后会谈到这一点。
特征的选择通常不是手动的,而是通过在训练过程中使用隐藏层来自动选择。根据文献语料库,选择最有用的维度(特征)。例如,如果文学是关于浪漫小说的,那么与数学文学相比,性别维度更有可能得到体现。
一旦你有了神经网络为100,000 个独特单词生成的100 个维度的单词嵌入向量(例如),研究每个维度的用途并尝试通过“特征名称”来标记每个维度通常没有多大用处。因为每个维度代表的特征可能并不简单和正交,并且由于该过程是自动的,所以没有人确切地知道每个维度代表什么。
为了更深入地了解这个主题,您可能会发现这篇文章很有用。
我不是专家,但我认为维度只是代表分配给单词的变量(又名属性或特征),尽管可能不止于此。每个维度的含义和维度总数将特定于您的模型。
我最近从 Tensor Flow 库中看到了这个嵌入可视化: https://www.tensorflow.org/get_started/embedding_viz
这尤其有助于将高维模型简化为人类可感知的模型。如果您有三个以上的变量,则很难可视化聚类(除非您显然是斯蒂芬·霍金)。
这篇关于降维的维基百科文章和相关页面讨论了特征如何以维度表示,以及维度过多的问题。