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,2K−1)=(d,2K−1)
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,2K−1)=(d,1)
如上图右边的红色方框中,我们除去了target的词向量,对剩下的
n
u
m
−
1
num-1
num−1个向量做平均值求解。
第四步:将隐藏层向量乘以 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,num−1)=(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