在常见的自然语言处理系统中,词的编码是任意的,因此无法为系统提供有关词之间可能关系的有用信息符号。同时也带来了数据稀疏性的问题。使用向量表示单词克服了其中的一些障碍。本文介绍了Word2Vec,这是一种通过推理、示例和数学公式从原始文本中学习“词嵌入”的模型。该模型通常用于预处理阶段以提高计算效率。让我们通过推理、示例和数学公式来介绍Word2Vec。IntroductionWord2Vec模型用于学习称为“词嵌入”的词向量表示,通常用于预处理阶段,之后可以将学习到的词向量输入判别模型(通常是RNN)以生成预测或用于其他有趣的任务。为什么要学习词嵌入?图像和音频处理系统使用丰富的高维数据集。处理后的图像数据被编码为单个原始像素强度的向量,因此所有信息都被编码在数据中,可以很容易地建立系统中各个实体(例如猫和狗)之间的关系。然而,在常见的自然语言处理系统中,单词被视为离散的原子符号,因此“猫”可以表示为Id537,“狗”可以表示为Id143。这些编码是任意的,不会为系统提供有关符号之间可能关系的有用信息。这意味着该模型在处理有关“狗”的数据时无法充分利用有关“猫”的知识(例如,它们都是动物、宠物、有四条腿等)。将单词表示为唯一、离散的序列号也会导致数据稀疏性问题,这通常意味着我们可能需要更多数据才能成功训练统计模型,而使用向量表示单词可以克服其中的一些障碍。例如:传统的自然语言处理方法涉及到很多语言学本身的知识。理解音素和语素等术语是相当基本和必要的,因为有许多语言学分支致力于此类研究。让我们看看传统的自然语言处理是如何尝试理解下面的单词的。假设我们的目标是收集关于这个词的一些信息(表征它的情感,找到它的定义等)。使用我们的语言知识,我们可以将这个词分解为3个部分。深度学习最基本的层次是表征学习。在这里,我们将使用相同的方法在大规模数据集上为单词构建向量表示。词向量我们将每个词表示为一个d维向量。这里d=6。从这句话开始,我们想为每个单词构建一个向量表示。现在让我们考虑如何填充这些值。我们希望这些值能够在一定程度上代表单词及其上下文、含义或语义信息。一种方法是构建共现矩阵。共现矩阵包含语料库(或训练集)中的每个词与下一个词共现的统计信息。下表是上面显示的句子的共现矩阵。通过这个简单的矩阵,我们可以获得非常有用的信息。例如,单词“love”和“like”对于名词(NLP和狗)的计数都是1。他们对“我”的计数也为1,这表明这些词可能是某种动词。对于比单个句子大得多的数据集,可以预期这种相似性会更清楚地显示出来,因为“like”、“love”和其他具有相似上下文的同义词将开始具有相似的向量表示。这是一个好的开始,但需要注意的是每个词的维度会随着语料库的大小线性增加。如果我们有一百万个单词(在NLP任务中不是很多),我们最终会得到一个非常稀疏(很多0)的100万乘100万的矩阵,这将是非常低效的内存。后来,人们在探索更好的词向量表示方面取得了很大进展。其中最著名的是Word2Vec。正式引入的向量空间模型(VSM)表示(嵌入)连续向量空间中的词,其中语义相似的词被映射到相邻点(“都嵌入在彼此附近”)。向量空间模型在自然语言处理方面有着悠久而丰富的历史,但所有方法都在某种程度上依赖于分布假设,即出现在相同上下文中的单词具有相似的语义。基于这一原理的方法可以分为两类:基于计数的方法(如隐式语义分析)和预测方法(如神经概率语言模型)。统计语料库中单词与其相邻单词同时出现的频率,然后将这些统计数据映射到每个单词的小而密集的向量。预测模型直接尝试基于学习到的相邻词的小密集嵌入向量来预测词(考虑模型的参数)。Word2vec是一种从计算效率高的原始文本中学习词嵌入的模型。它主要有两种实现方式,一种是连续词袋模型(CBOW),另一种是Skip-Gram模型。这两种方法在算法上是相似的,唯一的区别是CBOW是根据源上下文词来预测目标词,而Skip-Gram则相反,它是根据目标词来预测源上下文词。接下来,我们将重点关注skip-gram模型。应用数学神经概率语言模型一般使用最大似然原理训练,目标是最大化下一个词wt(for"history")给定前面的词h(for"history")target")wherescore(wt,h)计算目标词wt和上下文h(公共点积)之间的兼容性。我们通过最大化其在训练集上的对数似然来训练该模型。因此,我们希望最大化以下损失函数:这提供了一个合适的归一化概率模型用于语言建模。我们可以用另一种形式更好地展示这种方法,它清楚地展示了在训练过程中不断变化的选择变量(或参数)以最大化目标函数。我们的目标是找到周围词汇的向量表示,可以用于预测当前词。特别是,我们想要最大化整个语料库的平均对数概率:这个等式的主要含义是有is单词wt在当前单词的某个窗口范围c内出现的某个概率p。这个概率跟当前词wt和我们设置的参数theta有关。我们希望通过设置参数theta来最大化整个语料库的上述概率。基本参数化:Softmax模型基本的skip-gram模型定义了由softmax函数计算的概率p。如果我们的词汇表中有N个词,我们想要学习的嵌入向量的维度是k,那么我们可以将wi设置为一个N维的ont-hot向量,将theta设置为一个N×K的嵌入矩阵,sothat:值得注意的是,经过学习,矩阵theta可以认为是一个embeddinglookupmatrix。在架构上,它是一个简单的三层神经网络。使用3层神经网络(1个输入层+1个隐藏层+1个输出层)。输入一个词并训练模型以预测其邻居。移除最后一层(输出层)并保留输入层和隐藏层。现在,从词汇表中输入一个词。隐藏层给出的输出是输入词的“词嵌入”。限制这种参数化方法适用于大规模语料库的一个主要缺点是计算效率。具体来说,为了计算单个前向传播过程,我们需要统计整个语料库的词汇量来计算softmax函数。这对于大型数据集来说是非常昂贵的,所以我们希望在这个模型和计算效率之间找到一个平衡点。提高计算效率对于word2vec中的特征学习,我们不需要完整的概率模型。CBOW和skip-gram模型使用二元分类目标(逻辑回归)进行训练,目标是在同一上下文中区分真实目标词(wt)和k个假(噪声)词-w。当模型将较高的概率分配给真实词,将较低的概率分配给噪声词时,我们可以获得优化的目标函数。从技术上讲,我们一般称之为负采样,它提出的更新近似于softmax函数的更新极限。但从计算的角度来看,它是非常高效的,因为那时损失函数的复杂度只取决于我们选择的噪声词的数量(k)而不是词汇表中的所有词(V)。这样可以大大提高训练速度。像Tensorflow这样的软件包使用一种非常相似的损失函数,称为噪声对比估计(NCE)损失。SKIP-GRAM模型的直觉以这个数据集为例:thequickbrownfoxjumpedoverthelazydog我们首先构建一个包含所有单词及其上下文的数据集。现在,让我们保留原来的定义,将“上下文”定义为目标词左右两侧的窗口词。将窗口大小设置为1,我们可以获得(context,target)对形式的数据集。([the,brown],quick),([quick,fox],brown),([brown,jumped],fox),...回想一下skip-gram反转上下文和目标,试图预测每个上下文词,所以任务变成了从“quick”预测“the”和“brown”,从“brown”预测“quick”和“fox”等。这样,我们的数据集可以组织成(输入,输出)对,如下所示:(quick,the),(quick,brown),(brown,quick),(brown,fox),...目标函数根据定义它依赖于整个数据集,但我们通常使用随机梯度下降(SGD)优化模型的方法,即一次只有一个例子(或一次一小批数据,每批的数量通常为16到512)。接下来让我们看看训练过程的每一步。让我们想象一下上面例子的训练过程。这里的目标是快速预测。我们从噪声分布P(w)(通常是一元分布)中选择num_noise噪声样本(一元分布假设每个词的出现独立于所有其他词,即我们可以将生成过程视为顺序掷骰子过程)为了简单起见,我们设置num_noise=1,我们选择绵羊作为噪声样本。接下来我们计算观察到的样本和噪声样本的损失,即时间“t”的目标函数变为:我们的目标是更新嵌入参数theta以最大化该目标函数。我们通过推导与之相关的损失梯度来实现这一点。然后我们通过在梯度方向上迈出一小步来更新嵌入。当我们在整个训练集上重复这个过程时,我们可以产生“移动”每个词的嵌入向量的效果,直到模型成功区分真实词和噪声词。我们可以通过将学习到的向量向下投影到二维来可视化它们。当我们查看这些可视化时,很明显这些向量捕获了有关单词和单词之间关系的一些语义信息,这在实践中非常有用。原文链接:https://towardsdatascience.com/word2vec-a-baby-step-in-deep-learning-but-a-giant-leap-towards-natural-language-processing-40fe4e8602ba《心》的原译,微信公众号《机器之心(id:almosthuman2014)》】点此查看作者更多好文
