word2vec梳理--part1--skip gram架构

本文主要介绍Word2Vec的skip-gram神经网络结构。目的是跳过通常关于Word2Vec的介绍性和抽象的见解,深入了解更多细节。

skip-gram神经网络模型在其最基本的形式上实际上非常简单;一开始过多的关注于各种优化会影响理解。

 

初步理解:

抽象来看,Word2Vec使用了一个机器学习中常用的技巧:训练一个简单的神经网络,用一个隐藏层来执行一个特定的任务(伪任务, fake task),但其目标产出不是这个任务!相反,我们的目标实际上只是学习隐藏层的权重——我们将看到这些权重实际上是我们试图学习的“词向量”(word vectors)。

类似的技巧也会应用于无监督的特征学习中。例如训练一个自动编码器(auto-encoder),隐藏层压缩一个输入向量,输出层将它解压回原来的状态。在训练之后,丢掉输出层(解压步骤),只使用隐藏层——这是一个在没有标记训练数据的情况下,学习图像特征的重要技巧。

 

word2vec的伪任务:

首先我们要说明这个“伪”任务,是什么样的网络架构;之后我们再回来讨论,它如何间接地给我们那些真正想要的词向量。

我们要设计训练的网络做以下的事情:选定句子中一个特定的词(输入词),在其附近的词中随机挑选一个,网络输出将告诉我们,每个单词成为我们选择的“邻近单词”的概率。

当提到“附近”时,算法实际上有一个“窗口大小”参数。一个典型的窗口大小是5,意味着后面5个字,前面5个字(总共10个字)。

输出概率与在输入词附近找到每个词的可能性有关。例如,如果你给训练过的网络输入单词“苏维埃”,那么像“联盟”和“俄罗斯”这样的单词输出概率会更高,而不相关的单词“西瓜”和“袋鼠”要更低。

在实际训练中,训练数据会被组织成“单词对”(word pairs)。下面的例子是从“The quick brown fox jumps over the lazy dog”这句话中提取的一些训练样本(单词对)。以蓝色突出显示的单词是输入单词。(为了方便,这里窗口大小取值为2)

网络将从单词对的出现中学习统计规律。举例来说,网络可能会得到更多的(“苏维埃”,“联盟”)样本,而很少得到(“苏维埃”,“南极洲”)样本。所以,当训练结束时,如果你给它输入“苏维埃”这个词,它输出“联盟”的概率要比“南极洲”的概率大得多。

 

模型细节:

那么每个词是如何表示的呢?

首先,我们不能把一个文本字符串直接输入到一个神经网络。我们需要一种词表示的方法。为此,首先根据训练文档构建一个词汇表——假设词典大小为10000。

对于任意一个词,如“蚂蚁(ants)”,就可以表示成一个独热向量(one-hot vector)。这个向量将有10000维(词汇表中的每个单词对应一维),单词“ants”对应的维度为“1”,其他维度均为0。

网络的输出也是一个向量(10000维),它包含了词典中的所有单词,单词所在维度对应的值就是相应的概率。

下面是网络结构:

 

注意到隐层没有激活函数,输出层使用的softmax。我们稍后再讨论这个。

使用“单词对”训练网络时,输入是表示输入词的独热向量,训练输出也是表示输出词的一个独热向量。但是在对输入词评估误差时,输出向量实际上是一个概率分布(即一堆浮点值,而不是一个独热向量)。

 

隐层:

方便起见,假设正在学习的词向量是300维。此时,隐藏层将由一个权重矩阵表示,大小为10000行(词汇表大小)和300列(隐层神经元个数)。

300维是谷歌发布的模型中使用的参数,它是在Google新闻数据集上训练的(您可以从这里下载(https://code.google.com/archive/p/word2vec/))。这个词向量维度是一个“超参数”,需要根据不同程序调整(即尝试不同的值,搜寻最佳结果)。

如果取出权重矩阵的行,得到的实际就是词向量!

 

所以,我们的最终目标其实只是学习这个隐藏层权重矩阵!而输出层,训练完就可丢了!

让我们回到要训练的这个模型的定义上来。输入是独热编码!

你可能会问,“独热向量几乎都是零…这有什么影响?”如果你将一个1×10000的独热向量乘以一个10000×300的矩阵,它实际是在选择对应于“1”的矩阵行。举例如下:

 

这意味着模型的隐藏层实际上只是一个查表操作,隐藏层的输出就是输入词的“词向量”。

 

输出层:

假设已经得到了“ants”的隐藏层输出,接下来就需要将这个1x300字向量输入到输出层。输出层是一个softmax分类器,这里有一个关于Softmax回归的教程(http://ufldl.stanford.edu/tutorial/supervised/SoftmaxRegression/)。其重点是每个输出神经元对应词汇表的每个词。每个神经元将产生一个介于0和1之间的输出,所有这些输出值之和为1。

具体来说,每个输出神经元都有权向量。在每个神经元重,权向量会与来自隐藏层的词向量相乘,然后对结果应用指数函数exp(x)。最后,为了使输出之和为1,每个神经元的输出会除以所有10000个神经元的结果之和。

下面例子,输入是“ants”,计算单词“car”的输出概率。

 

值得注意的是,这种架构完全忽略了输出词相对于输入词的偏移量(即位置关系)。它不会因为输出词相对于输入词的前后位置,而学习一组不同的概率。例如,假设训练语料库中,“York”这个词之前都有“New”这个词。也就是说,至少在训练数据种,“New”在“York”附近的概率是100%。然而,如果在“York”附近的10个单词中随机挑选一个,那么它是“New”的概率并不是100%,你可能挑选其他词;更进一步,模型并不知道“New”一直出现在"York"之前。

 

直观理解:

下面是对这种网络架构的一些更直观,深入的理解。

如果两个不同的词有非常相似的“上下文”(即它们周围的词相似),那么这两个词在模型中的输出也要非常相似。网络能够达到这种相似性的方式是,两个词的词向量相似。所以,如果两个词有相似的上下文,那么网络就有动力学习,使这两个词的词向量相似!

两个词有相似的上下文意味着什么?可以想象一下,像“聪明”和“聪明”这样的同义词会有非常相似的上下文。或者相关的词,比如“引擎”和“变速器”,也可能有相似的上下文。

这也可以用来做词干分析——网络可能会学到“ant”和“ants”的词向量相似,因为它们有相似的上下文。

 

更进一步?

你可能已经注意到,skip-gram架构包含了大量的权!例如前面给出的例子,有300维和10000个词,即隐藏层和输出层各有3M个权值!如果词典特别大,例如到了百万级别,则根本无法计算。因此word2vec的作者引入了一些调整,使训练变得可行。具体请看下一部分()。

 

其他相关:

word2vec模型不仅可以处理文本,也可以应用于推荐和广告的非文本数据,例如从一系列用户操作中学习向量。这一部分后面再补充。

翻译自:

http://mccormickml.com/2016/04/19/word2vec-tutorial-the-skip-gram-model/

 

 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值