传统神经网络语言模型与word2vec 篇(二)

本篇介绍语言模型word2vec,大部分摘抄自博客:https://blog.csdn.net/huanghaocs/article/details/77935556与https://www.cnblogs.com/ooon/p/5558119.html
word2vec的网络结构其实和神经概率语言模型(NPLM)是基本类似的,word2vec的训练方法有两种,一种是CBOW根据上下文,预测中间的词。另一种是Skip-gram,输入某个词,预测这个词的上下文。其实都是在发现语料中局部词汇之间的共现关系。
在这里插入图片描述
我们先来介绍一下模型的整体思想,之后会分析模型运算过程中各个参数矩阵的维度变化
CBOW:
CBOW模型在语料中设置一个窗口,根据窗口中除中心词的其他词,来预测当前的中心词。
原始doc = “我最喜欢机器学习了”,分词后 words = [“我”, “最”, “喜欢”, “机器”, “学习”, “了”]。
例子1:
如果窗口window_size = 3, 则window1 = [“我”, “最”, “喜欢”],其中输入input为[“我”, “喜欢”],需要预测输出的为[“最”]。window2 = [“最”, “喜欢”, “机器”],,其中输入input为[“最”, “机器”],需要预测输出的为[“喜欢”]。
例子2:
如果窗口window_size = 5, 则window1 = [“我”, “最”, “喜欢”, “机器”, “学习”],其中输入input为[“我”, “最”, “机器”, “学习”],需要预测输出的为[“喜欢”]。window2 = [ “最”, “喜欢”, “机器”, “学习”, “了”],,其中输入input为[ “最”, “喜欢”, “学习”, “了”],需要预测输出的为[“机器”]。
整体计算的思想是获得每个输入词的向量表示,然后求和取平均值,最后完成词汇表大小的分类任务。
下面要开始介绍公式了,假设当前是为w,当前词的上下文则为context(w),context(w)由w前后各c个词组成,那么window_size=2c+1
输入层:
2c个输入one hot 向量x乘以矩阵w。也就是对输入进行一个线性映射,得到每个词的词向量 v ( c o n t e x t ( w ) 1 ) , v ( c o n t e x t ( w ) 2 ) , . . . , v ( c o n t e x t ( w ) 2 c ) v(context(w)_{1}), v(context(w)_{2}),...,v(context(w)_{2c}) v(context(w)1),v(context(w)2),...,v(context(w)2c)
维度为(2Cx|V|, |V|xN) = (2CxN),2Cx|V|为输入的one hot向量,V为词典的大小, |V|xN为线性映射矩阵的W的大小。
投影层:
对输入的2c个向量做求和累加,公式标识如下, 其中 x w = R m x_{w}=R^m xw=Rm
x w = ∑ i = 1 2 c v ( Context ( w ) i ) x_{w}=\sum_{i=1}^{2 c} v\left(\text {Context}(w)_{i}\right) xw=i=12cv(Context(w)i)
求和后维度为 (输入2CxN -----> 求和输出1xN)
输出层
投影层得到的 x w x_{w} xw直接乘以一个和词表大小一样的权重矩阵,然后过一层softmax函数得到词表大小的一个概率分布向量,取其中概率最大的为预测结果词。
p ( w ∣ c o n t e x t ( w ) ) = s o f t m a x ( U x w + b ) p(w|context(w))=softmax(Ux_{w}+b) p(wcontext(w))=softmax(Uxw+b)
用概率分布p(w|context(w))与真实label的交叉熵作为损失函数,来训练模型。这里理论上可行,但是训练速度很慢,一般词表大小v都在几十万,每次求softmax是非常耗时。所以word2vec就在这个输出还用层次softmax来优化,从而加速模型训练过程。
维度为(1xN, Nx|V|) = (1x|V|),1xN为投影层求和后的输出矩阵,Nx|V|为和词表大小一样的权重矩阵W‘, 1x|V|为经过softmax函数得到的概率分布
在这里插入图片描述

Hierarchical Softmax(层次Softmax)

具体就是根据词表中词的出现频率作为权重来构造Huffman树,这样树的叶子节点对应的就是每个词,按照叶子节点对应的路径就能找到每个词,简单理解就是我们用这样一颗树来存储我们的词表,可以加速输出层的计算。
在这里插入图片描述
p w p^w pw从根节点出发到词w对应叶子节点的路径; l w l^w lw表示路径 p w p^w pw中所包含的节点个数
d w d^w dw表示词语w的Huffman编码值,编码值只能取0或1; θ w \theta^w θw 表示路径 p w p^w pw中非叶子节点对应的向量;
计算概率的方法是对词w所在路径每个节点进行二分类,并把节点二分类的概率进行相乘,从而得到词w的概率p(w|context(w))。对应的二分类可以用逻辑回归,假设0代表正类,1代表负类
在这里插入图片描述

Skip-gram
Skip-gram模型也要设置一个窗口,每次滑动窗口,根据窗口中心词预测窗口内其他词,就是根据当前词预测上下文窗口词。还是以例子先理解一下。
原始doc = “我最喜欢机器学习了”,分词后 words = [“我”, “最”, “喜欢”, “机器”, “学习”, “了”]。
例子1:
如果窗口window_size = 3, 则window1 = [“我”, “最”, “喜欢”],input输入为[ “最”],output输出为[“我”, “喜欢”]。window2 = [“最”, “喜欢”, “机器”],对应input输入为[ “喜欢”],output输出为[“最”, “机器”]
例子2:
如果窗口window_size = 5, 则window1 = [“我”, “最”, “喜欢”, “机器”, “学习”],input输入为[ “喜欢”],output输出为[“我”, “最”, “机器”, “学习”]。
window2 = [“最”, “喜欢”, “机器”, “学习”, “了”],input输入为[ “机器”],output输出为[“最”, “喜欢”, “学习”, “了”]。
Skip-gram中给出当前词w,需要预测它的上下文词Context(w),概率表示如下:
p ( Context ( w ) ∣ w ) = ∏ u ∈ Context ( w ) p ( u ∣ w ) p(\text {Context}(w) | w)=\prod_{u \in \text {Context}(w)} p(u | w) p(Context(w)w)=uContext(w)p(uw)
这里的w就是上面表格中的input,u就是input对应的context中的词,这里取的时context中的词概率相乘。
比如对上面的例子input=“喜欢”, context =[“我”, “最”, “机器”, “学习”],概率计算如下:
p(Context(喜欢)|喜欢) = p(我|喜欢) x p(最|喜欢) x p(机器|喜欢) x p(学习|喜欢)

在这里插入图片描述
隐层的激活函数其实是线性的,相当于没做任何处理(这也是 Word2vec 简化之前语言模型的独到之处),我们要训练这个神经网络,用反向传播算法,本质上是链式求导,在此不展开说明了。
当模型训练完后,最后得到的其实是神经网络的权重,比如现在输入一个 x 的 one-hot encoder: [1,0,0,…,0],则在输入层到隐含层的权重里,只有对应 1 这个位置的权重被激活,这些权重的个数,跟隐含层节点数是一致的,从而这些权重组成一个向量 vx 来表示x,而因为每个词语的 one-hot encoder 里面 1 的位置是不同的,所以,这个向量 vx 就可以用来唯一表示 x。

注意:上面这段话说的就是 Word2vec 的精髓!!
输出 y 也是用 V 个节点表示的,对应V个词语,所以其实,我们把输出节点置成 [1,0,0,…,0],但是激活的是隐含层到输出层的权重,这些权重的个数,跟隐含层一样,也可以组成一个向量 vy,跟上面提到的 vx 维度一样,并且可以看做是词语『吴彦祖』的另一种词向量。而这两种词向量 vx 和 vy,正是 Mikolov 在论文里所提到的,『输入向量』和『输出向量』,一般我们用『输入向量』。

需要提到一点的是,这个词向量的维度(与隐含层节点数一致)一般情况下要远远小于词语总数 V 的大小,所以 Word2vec 本质上是一种降维操作——把词语从 one-hot encoder 形式的表示降维到 Word2vec 形式的表示
维度变化
输入 ( x 1 , x 2 . . . x v ) (x_{1},x_{2}...x_{v}) (x1,x2...xv)为1xV,乘以权重矩阵 W V ∗ N W_{V*N} WVN(也就是上文说到的Vx『输入向量』),得到隐藏层的输出为1xN,再乘以权重矩阵 W N ∗ V ′ W'_{N*V} WNV(也就是上文说到的Vy『输出向量』)

当 y 有多个词时,网络结构如下:
在这里插入图片描述
对应的层次softmax
在这里插入图片描述

负采样技术(negative sampling)

相比分层softmax,负采样的思想更加直观:为了解决数量太过庞大的输出向量的更新问题,我们就不更新全部向量,而只更新他们的一个样本。
显然正确的输出单词(也就是正样本)应该出现在我们的样本中,另外,我们需要采集几个单词作为负样本(因此该技术被称为“负采样”)
对给定的词语 w , 给出负样本集 Neg(w) 的选取方法,负样本选取遵循的规律是频率高则被选择的概率较大,反之较小,对于词典 V ,每个词语的权重可以表示为:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值