包含Word是文档词汇表中最常用的表示形式之一。您可以捕获文档中单词的上下文、含义和短语相似性以及与其他单词的关系。
什么是嵌入?粗略地说,它们是特定单词的矢量表达。下一步怎么生成?更重要的是,他们如何捕捉上下文?
Word2Vec是目前最流行的利用浅神经网络学习单词的技术。它是2013年Tomas Mikolov在谷歌开发的。
我们为什么需要他们?
请考虑以下类似句子:Have a good day和Have a great day。它们几乎意义相同。如果我们制作详细的词汇表(我们称之为V),它就会有V={Have,a,good,great,day}。
现在,让我们为v中的每个单词创建一个圈-hot编码的矢量。圆-热编码向量的长度等于V(=5)的大小。除了索引中的元素表示词汇表中的相应单词外,还有零矢量。这个特定的因子是1。以下代码更好地说明了这一点。
Have=[1,0,0,0]`;A=[0,1,0,0,0]`;Good=[0,0,1,0,0]`;Great=[0,0,0,1,0]`;Day=[0,0,0,0,1]`(`表示旋转)
如果想可视化这些代码,可以想象出每个单词占据一个维度的五维空间,而不考虑其他维度(不会沿其他维度投影)。这意味着“good”和“great”与“day”和“have”一样不同。这是不对的。
我们的目标是让上下文相似的单词占据相似的空间位置。在数学上,这些向量之间角度的余弦值必须接近1。也就是说,角度必须接近于0。
以下是生成分布式表示的想法。直觉上,我们引入了一个词对另一个词的依赖性。这个单词上下文中的单词会受到更多的依赖。如前所述,one-hot编码表示中的所有单词彼此独立。
Word2Vec是如何工作的?
Word2Vec是构成这种嵌入式方式的方法。可以使用Skip Gram和Common Bag of Words(CBOW)两种方法(全部包括神经网络)获得。
CBOW模型:此方法尝试使用每个单词的上下文作为输入来预测与上下文相对应的单词。考虑一下我们的例子:Have a great day。
在这里,我们想使用单个上下文输入单词来预测大象单词(day)。更具体地说,我们使用输入单词的one-hot代码,并测量与大象单词(day)的one-hot代码相比的输出错误。在预测目标语的过程中,我们学习目标语的矢量表达。
让我们详细了解一下实际体系结构。
输入或上下文词是V大小的one-hot编码向量,隐藏层有N个神经元,输出是V长度的向量,元素是softmax值。
让我们看看图中的:
-Wvn是将输入x映射到隐藏层的权重矩阵(V*N维矩阵)
-W 'nv是将隐藏层输出映射到最终输出层的权重矩阵(N*V维矩阵)
隐藏层神经元会将输入的权重复制到下一层。没有激活,例如Sigmoid、tanh或ReLU。唯一的非线性是输出层的softmax计算。
然而,上述模型使用单个上下文词预测目标。我们可以使用多个上下文单词来做同样的事情。
上述模型使用c上下文词。使用Wvn计算隐藏层输入时,将采用所有这些C上下文词输入的平均值。
因此,我们看到了如何使用上下文词生成单词表达。但是我们还有另一种方法可以这样做。可以使用大象单词(希望生成表示法)预测上下文。在此过程中创建表示。另一个被称为Skip Gram model的变体是这样做的。
Skip-Gram model:
这看起来像是multiple-context CBOW模型刚刚翻转。从某种程度上说,这是事实。
我们把目标语输入网络。模型输出了c个概率分布。那是什么意思?
对每个上下文位置,得到V概率的C概率分布。每个单词一个。
在这两种情况下,网络都是使用神经网络的反向传播来学习的。
你更喜欢哪个?
两者各有利弊。据Mikolov称,Skip Gram能很好地处理少量数据,能很好地表示罕见的单词。
相反,CBOW对更快、更频繁的单词表达得更好。
最后,
上面的说明很基本。你可以知道包含的单词是什么,以及Word2Vec是如何工作的。
有很多东西。例如,使用Hierarchical Softmax和Skip-Gram Negative Sampling等技术更有效地计算算法。