word2vec训练词向量的转换过程


看了关于w2v的很多文章,讲的都是他的大致原理,介绍了CBOW和SKIP GRAM两种方式,再介绍霍夫曼树和负采样。。。
都是在边界上介绍他,却没有告诉我他具体是怎么计算的?怎么就训练出词向量来?最终的结果是怎么取的?都没有介绍,于是今天做一个总结

CBOW为例

在这里插入图片描述

CBOW是通过window size内的上下文来预测当前字的概率,在后面BERT的预训练用的同样也是类似的思路,可以看文章

那词向量预训练是什么样的过程呢?
所以定义几个参数:
num:词表中的文字数。可以是我们常见的1万多字,或者词。
d:向量维度。w2v是设置成300维,这个太低表达能力低下,太高训练要求高,而且效果会边际收紧。
另外我们要训练的是两个权重,就是在上图中的Hidden Layer的左右两个 W W W W ′ W^{'} W 。其中
W W W :是 d × n u m d\times num d×num形状的矩阵;
W ′ W^{'} W :是 n u m × d num\times d num×d 形状的矩阵。
案例
假设我们要训练一段话 I   d r i n k   c o f f e e   e v e r y d a y I\ drink \ coffee\ everyday I drink coffee everyday 中每个词的词向量,我们要做一下几步。
此时我们可以知道num=4,表示4个字;d可以假设3维。
同时选coffee作为中心词,window size设为2,用K表示,也就是说,我们要根据单词”I”,”drink”和”everyday”来预测一个单词,并且我们希望这个单词是coffee。

第一步:把每个字用one-hot的形式表示出来

在这里插入图片描述

这里的运算转换过程为:字表示成向量shape=(1,num),然后每个字concat在一起为shape=(2K,num),K表示window size。
这一步很关键,表示的是图中最左边的任务,把每个字用位置表示出来。
这里也让我们知晓了为什么要用词向量,因为这里用的num是4,如果词表很多呢?几万字,那我们就要用几万维来表示,那就太大,太稀疏了,所以我们的目的就是用低维比如300维,准确的表述这个词的含义,同时还会有相似词的效果。

第二步:初始化左边的权重。作用是分别得到向量V(代表一个单词),做法是利用输入的单词的onehot向量X和W相乘

在这里插入图片描述

这里的运算转换过程为:
W × 字 T = ( d , n u m ) × ( , n u m , 2 K − 1 ) = ( d , 2 K − 1 ) W\times 字^T=(d,num)\times (,num,2K-1)=(d,2K-1) W×T=(d,num)×(,num,2K1)=(d,2K1)
K表示window size, 2K-1 是因为target是不计入的,这里只有content的。
如上图右边的红色方框中,这个 W 是用来表示每个字的向量的,也是我们最后想要用的词向量。

第三步:将得到的三个单词的V向量相加作为隐藏层的矩阵(隐藏层也就代表周围词的一个集合(即符合由周围的词来预测中心的词))

在这里插入图片描述

这里的运算转换过程为:
v h i d d e n = m e a n ( d , 2 K − 1 ) = ( d , 1 ) v_{hidden}=mean(d,2K-1)=(d,1) vhidden=mean(d,2K1)=(d,1)
如上图右边的红色方框中,我们除去了target的词向量,对剩下的 n u m − 1 num-1 num1个向量做平均值求解。

第四步:将隐藏层向量乘以 W ′ W' W

在这里插入图片描述

这里的运算转换过程为:
W ′ × v h i d d e n = ( n u m , d ) × ( d , 1 ) = ( n u m , 1 ) W^{'}\times v_{hidden}=(num,d)\times (d,1)=(num,1) W×vhidden=(num,d)×(d,1)=(num,1)
如上图右边的红色方框,这一步从维度d变成词表的num,方便后续得到每个字的可能概率。

第五步:激活函数处理得到V-dim概率分布 {PS: 因为是onehot嘛,其中的每一维都代表着一个单词},概率最大的index所指示的单词为预测出的中间词(target word)。与true label的onehot做比较,误差越小越好

在这里插入图片描述

这里的运算转换过程为:
s o f t m a x ( n u m , 1 ) = ( n u m , 1 ) softmax(num,1)= (num,1) softmax(num,1)=(num,1)
这里就只是做一步激活,得到概率值后做反向传播。
至此我们已经理解了整个过程,矩阵变换的过程如下:
1、字表示成向量shape=(1,num),然后每个字concat在一起为shape=(num,num)。
2、在第一个初始化的权重矩阵 W 中取出每个字的初始化词向量: W × 字 T = ( d , n u m ) × ( n u m , n u m ) = ( d × n u m ) W\times 字^T=(d,num)\times (num, num)=(d\times num) W×T=(d,num)×(num,num)=(d×num)
3、对除target字之外的向量求平均值, v h i d d e n = m e a n ( d , n u m − 1 ) = ( d , 1 ) v_{hidden}=mean(d,num-1)=(d,1) vhidden=mean(d,num1)=(d,1)
4、用第二个初始化的权重矩阵 W^{’} 做个全连接层,从维度d变成词表的num,方便后续得到每个字的可能概率: W ′ × v h i d d e n = ( n u m , d ) × ( d , 1 ) = ( n u m , 1 ) W^{'}\times v_{hidden}=(num,d)\times (d,1)=(num,1) W×vhidden=(num,d)×(d,1)=(num,1)
5、用激活函数得到每个字可能的概率, s o f t m a x ( n u m , 1 ) = ( n u m , 1 ) softmax(num,1)= (num,1) softmax(num,1)=(num,1);然后再做反向传播。

了解更多和AI、金融相关的知识,请关注公众号:卓拾书非卓师叔
作者:卓师叔,爱书爱金融的NLPer

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值