前言
word2vec的目的是通过探索文字之间的关系,产出牛逼的词向量
一、连续词袋模型CROW 和跳字模型Skip-gram
1、定义字典D:w1、w2、。。。、wN。 2、定义 w_t的上下文context(w_t) = 序列 {w_t-c, …w_t-1,w_t+1, …,w_t+c} 序列长度为2c。 3、word2vec的两个世界观:上下文决定中心词(context(w_t) →w_t) 为CROW, 中心词决定上下文(w_t → context(w_t)) 为Skip-gram模型。 4、CROW模型的流程就是 step1 将context(w_t)经过方法v()映射成2c个m维的词向量; step2 映射层将2c个m维的词向量相加成1个m维的词向量Xw (可以视为特征汇总、葫芦小金刚) step3 将葫芦小金刚经过一层神经网络输出一个N维的向量 step4 N维向量softmax一下输出概率最高的就是预测的中心词 5、上述流程中N的维度通常很大,直接对N维向量softmax的复杂度太高O(N)。所以这里必须要引入简化的方法层序softmax和负采样方法。
二、层序softmax方法
1、层序softmax是为了解决直接对N维向量softmax复杂度过高的问题,因此利用哈夫曼树将计算复杂度从O(N)降低到O(logN)。 2、哈夫曼树是预先构建好的利用贪心算法以极小化编码数量的最优化编码树。这里是根据词频构建,词频越大的单词离根节点越近(词频最大的哈夫曼编码为0)。哈夫曼树是从下向上构建的一个二叉树,每一个叶子节点对应着一个单词。 3、我们用
p
w
p_w
pw?代表单词
w
w
w的路径,每一个我们用
θ
w
\theta_w
θw?代表路径上节点对应的参数(不含叶子节点),用
d
w
d_w
dw?代表路径上节点的哈夫曼编码值(左子树为1,右子树为0,不含根节点)。 那么,已知中心词
w
w
w的上下文,以及语料库哈夫曼树。预测的中心词为w的概率
p
(
w
∣
c
o
n
t
e
x
t
(
w
)
)
=
∏
p
(
d
w
∣
X
w
,
θ
w
)
p(w|context(w)) = \prod p(d_w|X_w, \theta_w)
p(w∣context(w))=∏p(dw?∣Xw?,θw?) 其中
X
w
X_w
Xw?是映射层的特征向量,葫芦小金刚,
θ
\theta
θ是随机初始化的
m
m
m维的参数。每一步路径选择0或者1的概率可以定义为:
p
(
d
w
∣
X
w
,
θ
w
)
=
{
σ
(
X
w
T
θ
w
)
d
w
=
0
1
?
σ
(
X
w
T
θ
w
)
?
d
w
=
1
?
p(d_w|X_w, \theta_w) = \begin{cases} \sigma(X_w^{T}\theta_w)& \text{$d_w= 0 $} \\ 1-\sigma(X_w^{T}\theta_w)& \text{ $ d_w= 1$ } \end{cases}
p(dw?∣Xw?,θw?)={σ(XwT?θw?)1?σ(XwT?θw?)?dw?=0?dw?=1??
接下来就可以极小化对数损失函数,也就是最大化对数似然函数。分别对
X
w
X_w
Xw?和
θ
w
\theta_w
θw?求偏导数,然后设定一个学习率更新两个参数。接下来可以根据链式法则更新
w
w
w的上下文词向量。最终我们的目标是学习语料库中所有单词的
m
m
m维词向量编码。 4、基于层次softmax的跳字模型(skip-gram)几乎一致,有2点区别,第一,映射层这里和输入层是相等的都是中心词的词向量表示
v
(
w
)
v(w)
v(w),第二,条件概率多了一层2c个的累乘(c是上下文窗口大小)。
三、负采样方法
1、负采样算法。首先根据语料库中每个词的词频为权重画一条长度为1的线段,也就是建立一个带权的不等距划分。再建立一个精度足够的等距划分。在等距划分中随机采样N个样本,属于哪个不等距划分的区间就能对应出语料库中的一个单词。这么做的目的是让抽样更符合语料库中词语的分布。 2、利用负采样抽样出的样本作为负样本和唯一真中心词作为正样本组合出新的语料库。进行训练,可以大大减小计算量。
总结
Word2vec的目的是通过对上下文和中心词的关联关系的学习和训练得到一个包含语义的词向量。这里的词向量的特点是同义词一般相距比较近。业务中尽量使用业务场景比较近的预料进行与训练。
|