自然语言处理—详解Skip-Gram
Posted 机器学习算法与自然语言处理
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自然语言处理—详解Skip-Gram相关的知识,希望对你有一定的参考价值。
重磅干货,第一时间送达
https://zhuanlan.zhihu.com/p/73970347
单位:华东理工大学
神经网络中embedding层的作用——本质就是word2vec,数据降维,同时可以很方便计算同义词(各个word之间的距离),底层实现是2-gram(词频)+神经网络。
如何将一段文章的单词通过词向量来表示呢?
提取文章中所有的单词,把其按照出现的次数降序(这里取50000个不同的单词),比如单词“xx”出现次数最多,就编号ID为0,以此类推....
每个编号ID都可以使用50000维的二进制(onehot)表示。
最后会产生一个矩阵M,行大小为词的个数50000,列大小为词向量的维度(通常取128或300),比如矩阵第一行就是编号ID=0,“xx”对应的词向量。
在Skip-Gram模型中,会随机初始化它,然后使用神经网络来训练这个权重矩阵
输入数据和标签是什么呢?输入数据是中间蓝色的词所对应的onehot编码,标签是它附近词的one-hot编码(windown_size=2,左右各取2个)
就上述的Word2Vec中的demo而言,它的单词表大小为1000,词向量维度为300,所以embedding的参数input_dim=10000,output_dim=300。
假如单词表的大小为1000,词向量维度为2,经单词频数统计后,tom对应的id=4,而Jerry对应的id=20,经过转换,可以得到一个矩阵,tom对应矩阵第4行,取出该行的数据就是词向量。嵌入层就是将正整数(下标)转换为具有固定大小的向量,比如[[4],[20]]->[[0.25,0.1],[0.6,-0.2]]
训练过程
假设有个句子“The dog barked at the mailman”。
首先选句子中间的一个词作为输入词,比如“dog”作为input word
有了input word,再定义一个叫做skip_window的参数,它代表着从当前input word的一侧选取词的量。如果设置skip_window=2,最终获得窗口中的词就是["The","dog","barked","at"]。skip_window意味着选取左右各2个词加入窗口。另一个参数叫num_skips,代表着从整个窗口中选取多少个不同的词作为我们的output word,当skip_window=2,num_skip=2时将会得到两组(input word,output word)形式的训练数据,即("dog","barked"),("dog","the")。
神经网络基于这些训练数据将会输出一个概率分布,这个概率代表词典中的每个词是output word的可能性。举个例子,第二步中在设置了skip_window=2,num_skip=2情况下获得了2组训练数据。加入先拿一组数据("dog","barked")来训练神经网络,那么模型通过学习这个训练样本,会告诉我们词汇表中每个单词是“barked”的概率大小。
模型的输出概率代表着到我们词典中每个词有多大可能性跟input word同时出现。
如果向神经网络模型中输入一个单词“Soviet”,那么最终模型的输出概率中,像“Union”,“Russia”这种相关词的概率将远高于其他单词的概率,因为“Union”,“Russia”在文本中更大可能再“Soviet”的窗口中出现。通过给神经网络输入文本中成对的单词来训练它完成上面所说的概率计算。
选定句子“The quick brown fox jumps over lazy dog”,设定窗口大小为2(window_size=2),也就是说仅选输入词前后各两个词和输入词进行组合。下图中,蓝色代表input word,方框内代表位于窗口内的单词。
模型将会从每对单词出现的次数中习得统计结果。例如,我们的神经网络可能会得到更多类似(“Soviet“,”Union“)这样的训练样本对,而对于(”Soviet“,”Sasquatch“)这样的组合却看到的很少。因此,当我们的模型完成训练后,给定一个单词”Soviet“作为输入,输出的结果中”Union“或者”Russia“要比”Sasquatch“被赋予更高的概率。
模型细节
神经网络只能接受数值输入,我们不可能把一个单词字符串作为输入。最常用的办法就是基于训练文档来构建我们自己的词汇表(vocabulary)再对单词进行one-hot编码。
“The dog barked at the mailman”,那么我们基于这个句子,可以构建一个大小为5的词汇表(忽略大小写和标点符号):("the", "dog", "barked", "at", "mailman"),我们对这个词汇表的单词进行编号0-4。那么”dog“就可以被表示为一个5维向量[0, 1, 0, 0, 0]。
模型的输入如果是10000维的向量(词汇表有10000个单词),输出也是一个10000维的向量,包含了10000个概率,每一个概率代表着当前词是输入样本中output word的概率大小。
隐层没有使用任何激活函数,但是输出层使用了sotfmax。
我们基于成对的单词来对神经网络进行训练,训练样本是 ( input word, output word ) 这样的单词对,input word和output word都是one-hot编码的向量。最终模型的输出是一个概率分布。
input word和output word都会被我们进行one-hot编码。输入被one-hot编码后大多数维度上都是0(实际上仅有一个位置为1),所以向量稀疏,如果我们将一个1 x 10000的向量和10000 x 300的矩阵相乘,它会消耗相当大的计算资源,为了高效计算,隐层权重矩阵看成了一个”查找表“(lookup table),进行矩阵计算时,直接去查输入向量中取值为1的维度下对应的那些权重值。隐层的输出就是每个输入单词的“嵌入词向量”。
经过神经网络隐层的计算,词从一个1 x 10000的向量变成1 x 300的向量,再被输入到输出层。输出层是一个softmax回归分类器,它的每个结点将会输出一个0-1之间的值(概率),这些所有输出层神经元结点的概率之和为1。
训练样本为 (input word: “ants”, output word: “car”) 的计算示意图。
https://www.jianshu.com/p/af8f20fe7dd3
https://www.cnblogs.com/bonelee/p/7904495.html
推荐阅读:
以上是关于自然语言处理—详解Skip-Gram的主要内容,如果未能解决你的问题,请参考以下文章
自然语言处理Word2Vec 词向量模型详解 + Python代码实战
利用Tensorflow进行自然语言处理(NLP)系列之二高级Word2Vec
tensorflow在文本处理中的使用——skip-gram模型
计算语言学实验基于 Skip-Gram with Negative Sampling (SGNS) 的汉语词向量学习和评估