版权声明:本文为博主原创文章,转载请注明出处。 https://cloud.tencent.com/developer/article/1437727
word2vec
为什么要进行embedding
word2vec
就是对word
进行embedding
首先,我们知道,在机器学习
和深度学习
中,对word
的最简单的表示就是使用one-hot
(0,0,1,0,0…..来表示一个word
). 但是用one-hot
表示一个word
的话,会有一些弊端:从向量中无法看出word
之间的关系((wworda)Twwordb=0(w^{word_a})^Tw^{word_b}=0),而且向量也太稀疏. 所以一些人就想着能否用更小的向量来表示一个word
,希望这些向量能够承载一些语法
和语义
上的信息, 这就产生了word2vec
Language Model(Unigrams, Bigrams, Trigrams..etc)
language model
对序列
的概率建模
Unigram:
假设句子中,各个word
是独立的
P(w_1,_w_2,_w_3..,_wn)=∏ni=1P(wi) P(w_1,w_2,w_3..,w_n) = prod_{i=1}^{n}P(w_i)
Bigram
假设句子中,每个word
只和之前的一个word
有关系
P(w_1,_w_2,_w_3..,_wn)=∏ni=2P(wi|wi−1) P(w_1,w_2,w_3..,w_n) = prod_{i=2}^{n}P(w_i|w_{i-1})
Trigram
假设句子中,每个word
和前两个word
有关系
P(w_1,_w_2,_w_3..,_wn)=∏ni=1P(wi|wi−1,wi−2) P(w_1,w_2,w_3..,w_n) = prod_{i=1}^{n}P(w_i|w_{i-1},w_{i-2})
上面的模型都基于很强的假设,而实际上,句子中的每个word
,是和整个句子有关系的,不仅仅只是考虑前一个或前两个
Continuous Bags of Words Model (CBOW)
这个模型是上面几种模型的扩展.CBOW
不是简单的只考虑前一个词或前两个词,它是考虑了单词的上下文(context
).在CBOW
,我们的目标是maxP(w|context(w))max P(w|context(w)).
首先,模型的输入(context)是one-hot
’s ,模型的输出(w)是one-hot
,one_hot∈R|V|onehotin R^{|V|},这个是已知的.我们要创建两个矩阵_E=Matrix(embedding)∈R|V|∗embedding_size_E=Matrix(embedding)in R^{|V|* {embedding_size}} , _P=Matrix(projection)∈Rembedding_size∗|V|P=Matrix(projection)in R^{{embeddingsize}* |V|}, 这两个矩阵是需要训练的.|_V||V|是字典的大小,embedding__size_embedding_size是任意值(代表你想把onehot压缩成几维表示).
context=01⋮0000000010⋯⋯⋯⋯10000001∈R|context(w)|∗|V|
context = begin{matrix} 0 & 0 & 0 &cdots & 1 & 0 1 & 0 & 0 &cdots & 0 & 0 vdots 0 & 0 & 1 &cdots & 0 & 0 0 & 0 & 0 &cdots & 0 & 1 end{matrix} in R^{|context(w)|* |V|}
Embed=0.10.10.10.1⋮0.10.10.10.10.30.10.30.10.30.10.30.10.20.00.20.00.20.00.20.0⋯⋯⋯⋯⋯⋯⋯⋯0.10.60.10.60.10.60.10.60.30.50.30.50.30.50.30.5∈R|V|∗embedding_size
Embed = begin{matrix} 0.1 & 0.3 & 0.2 &cdots & 0.1 & 0.3 0.1 & 0.1 & 0.0 &cdots & 0.6 & 0.5 0.1 & 0.3 & 0.2 &cdots & 0.1 & 0.3 0.1 & 0.1 & 0.0 &cdots & 0.6 & 0.5 vdots 0.1 & 0.3 & 0.2 &cdots & 0.1 & 0.3 0.1 & 0.1 & 0.0 &cdots & 0.6 & 0.5 0.1 & 0.3 & 0.2 &cdots & 0.1 & 0.3 0.1 & 0.1 & 0.0 &cdots & 0.6 & 0.5 end{matrix} in R^{|V|* embedding_size}
Proj=0.10.10.10.1⋮0.10.10.10.10.30.10.30.10.30.10.30.10.20.00.20.00.20.00.20.0⋯⋯⋯⋯⋯⋯⋯⋯0.10.60.10.60.10.60.10.60.30.50.30.50.30.50.30.5∈Rembedding_size∗|V|
Proj = begin{matrix} 0.1 & 0.3 & 0.2 &cdots & 0.1 & 0.3 0.1 & 0.1 & 0.0 &cdots & 0.6 & 0.5 0.1 & 0.3 & 0.2 &cdots & 0.1 & 0.3 0.1 & 0.1 & 0.0 &cdots & 0.6 & 0.5 vdots 0.1 & 0.3 & 0.2 &cdots & 0.1 & 0.3 0.1 & 0.1 & 0.0 &cdots & 0.6 & 0.5 0.1 & 0.3 & 0.2 &cdots & 0.1 & 0.3 0.1 & 0.1 & 0.0 &cdots & 0.6 & 0.5 end{matrix} in R^{embedding_size*|V|}
模型运作步骤:
(1) 生成context
的one-hot
矩阵
(2) 计算出context
的embedding matrix
, context∗E∈Rcontext(w)∗|V|context * E in R^{context(w)* |V|}
(3) 将获取的matrix
平均, v̂ =reducemean(context∗E,1)hat v=reduce_mean(context*E, 1)
(4) 生成评分向量 z=reduce_mean(context∗E,1)∗P∈R|V|z=reduce_mean(context*E,1)* P in R^{|V|}
(5) 将评分向量转成概率分布 ŷ =softmax(z)hat y = softmax(z)
ŷ hat y 的分布和实际分布y_y越相近,则模型学习的越好, 如何描述两个分布的相似性呢?借用信息论中的交叉熵_H(ŷ ,y)=−∑|V|i=1yilog(ŷ i)H(hat y,y)=-sum_{i=1}^{|V|}y_ilog(hat y_i)作为目标函数, 然后使用梯度下降来更新参数.
minimize J=−logP(wc|wc−m,wc−m 1,...,wc−1,wc 1,...,wc m)=−logP(projc|v̂ )=−logexp(projcv̂ T)∑|V|i=1projiv̂ T
begin{aligned} minimizespace J &= -logP(w_c|w_{c-m},w_{c-m 1},...,w_{c-1},w_{c 1},...,w_{c m}) &= -logP(proj_c|hat v) &= -logfrac{exp(proj_chat v^T)}{sum_{i=1}^{|V|}proj_ihat v^T} end{aligned}
m
:窗口大小
skip-gram Model
skip-gram model
和CBOW
结构相反, CBOW
输入上下文, 输出中间的word
.skip-gram
输入中间的word
,输出上下文.
需要学习的依旧是两个矩阵, Embed∈R|V|∗embedding_size_Embedin R^{|V|* embedding_size}和_Proj∈Rembedding_size∗|V|Projin R^{embedding_size* |V|}
minimize J=−logP(wc−m,wc−m 1,...,wc−1,wc 1,...,wc m|wc)=−log∏i=c−m,i≠cc mP(wi|wc)=−log∏i=c−m,i≠cc mP(proji|embedc)
begin{aligned} minimizespace J&=-logP(w_{c-m},w_{c-m 1},...,w_{c-1},w_{c 1},...,w_{c m}|w_c) &= -log prod_{i=c-m,i neq c}^{c m}P(w_i|w_c) &= -logprod_{i=c-m,i neq c}^{c m}P(proj_i|embed_c) end{aligned}
Negtive Sampling
看公式∑|V|i=1projiv̂ Tsum_{i=1}^{|V|}proj_ihat v^T,如果|V||V|很大,那么运算量是相当大的,为了减少运算量,就提出了Negtive Sampling
.
Negtive Sampling
基于skip-gram model
.
考虑一个(w,c)对,其中w
是中心单词,c
为w
上下文中的一个单词,P(D=1|w,c,θ)P(D=1|w,c,theta)表示c
是w
上下文中单词的概率,P(D=0|w,c,θ)P(D=0|w,c,theta)表示c
不是w
上下文中单词的概率.我们先对P(D=1|w,c,θ)P(D=1|w,c,theta)进行建模:
P(D=1|w,c,θ)=11 exp(−(projc)(embedTw)) embedw∈Rembedding_size
P(D=1|w,c,theta)=frac{1}{1 exp(-(proj_c)(embed_w^T))} spacespace embed_win R^{embedding_size}
相比CBOW
和skip-gram
,Negtive Sampling
思想是,如果c
是w
的上下文中的单词,就最大P(D=1|w,c,θ)P(D=1|w,c,theta),如果不是,就最大化P(D=0|w,c,θ)P(D=0|w,c,theta),θtheta就是Embed,_Proj_Embed, Proj
θ=argmaxθ∏(w,c)∈DP(D=1|w,c,θ)∏(w,c)∉DP(D=0|w,c,θ)=argmaxθ∑(w,c)∈DlogP(D=1|w,c,θ) ∑(w,c)∉Dlog(1−P(D=0|w,c,θ))=argmaxθ∑(w,c)∈Dlog_11 _exp(−(projc)(embedTw)) ∑(w,c)∉Dlog(1−11 exp(−(projc)(embedTw)))
begin{aligned} theta &= argmax_{theta} prod_{(w,c)in D}P(D=1|w,c,theta)prod_{(w,c)notin D}P(D=0|w,c,theta) &= argmax_{theta} sum_{(w,c)in D}logP(D=1|w,c,theta) sum_{(w,c)notin D}log(1-P(D=0|w,c,theta)) &= argmax_{theta}sum_{(w,c)in D}logfrac{1}{1 exp(-(proj_c)(embed_w^T))} sum_{(w,c)notin D}log(1-frac{1}{1 exp(-(proj_c)(embed_w^T)))} end{aligned}
这样运算量就被减小了.
x训练之后,对_Embed_Embed和_Proj_Proj有多种处理方式:
(1) 求和
(2)平均
(3)连接起来
问题:
(1): Negtive Sampling
只考虑了上下文关系,没有考虑单词之间的顺序关系,如果考虑进去的话,效果会不会更好?
(2): word2vec
,优化的都是proj_c
和embed_w
的距离,让这两个向量尽量的近,这个代表了什么?
(3):对于_Embed_Embed,感觉更新的频率不够