版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhq9695/article/details/86527539
这是斯坦福大学2017年课程CS224n: Natural Language Processing with Deep Learning
笔者学习完之后,简单做个笔记
如果这篇文章对你有一点小小的帮助,请给个关注,点个赞喔,我会非常开心的~
0. 前言
本篇中,我们将介绍两种训练模型的方法:
- negative sampling
- hierarchical softmax
1. negative sampling
由之前的计算得知,每次更新参数需要遍历词汇表
V中的所有词汇,时间复杂度为
O(∣V∣)。
替代遍历整个词汇表,可以仅从一个噪声分布
Pn(w)中采样,这个分布与词汇表的分布相匹配。
以下以skip-gram为例子:
考虑一对
(w,c),
w表示中间单词,
c表示上下文单词,如果
(w,c)在语料库中出现,则表示为
P(D=1∣w,c),如果
(w,c)在语料库中没有出现,则表示为
P(D=0∣w,c),其中:
P(D=1∣w,c,θ)=σ(ucTvw)=1+exp(−ucTvw)1
优化目标为最大化如果
(w,c)出现在语料库中并且确实出现的概率和如果
(w,c)没有出现在语料库中并且确实没有出现的概率:
θ=argmaxθ(w,c)∈D∏P(D=1∣w,c,θ)(w,c)∈D~∏P(D=0∣w,c,θ)=argmaxθ(w,c)∈D∏P(D=1∣w,c,θ)(w,c)∈D~∏(1−P(D=1∣w,c,θ))=argmaxθ(w,c)∈D∑logP(D=1∣w,c,θ)+(w,c)∈D~∑log(1−P(D=1∣w,c,θ))=argmaxθ(w,c)∈D∑log1+exp(−ucTvw)1+(w,c)∈D~∑log(1−1+exp(−ucTvw)1)=argmaxθ(w,c)∈D∑log1+exp(−ucTvw)1+(w,c)∈D~∑log1+exp(ucTvw)1
其中,
θ表示矩阵
V和
U,
D表示语料库,
D~表示错误的语料库,可以通过随机采样获得。
对于skip-gram,新的损失函数表示为:
−logσ(uc−m+jTvc)−k=1∑Klogσ(−u~kTvc)
对于CBOW,新的损失函数表示为:
−logσ(ucTv^)−k=1∑Klogσ(−u~kTv^)
2. hierarchical softmax
负采样对于频繁词和低维度的向量效果更好,而分层softmax对于不频繁的词效果更好。
分层softmax采用二叉树的表示,每个叶子节点表示一个单词,仅有唯一的路径从树根到叶子节点,其余每个节点都对应着模型需要学习的一个向量。
输出单词的概率定义为从树根随机行走到此叶子节点的概率,计算代价为路径的长度
O(log(∣V∣))。
在分层softmax中,每个单词只有一种向量表示。
如下图所示(图源:CS224n-2017):
分层softmax的符号定义如下:
-
L(w):从树根到叶子节点
w所经过的节点,例如
L(w2)=3
-
n(w,i):叶子节点
w路径上的第
i的节点,例如
n(w,1)是树根
-
vn(w,i):节点
n(w,i)的向量
-
ch(n):节点
n的孩子节点(一般指左子节点)
给出向量
wi,预测单词
w的概率表示为:
P(w∣wi)=j=1∏L(w)σ([n(w,j+1)=ch(n(w,j))]⋅vn(w,j)Tvwi)[x]={1 if x is true−1 otherwise
其中,因为
ch(n(w,j))始终代表着
n(w,j)的左子节点,而路径上的
n(w,j+1)有可能是右子节点,所以相当于随机行走的概率判断,满足:
σ(vnTvwi)+σ(−vnTvwi)=1w=1∑∣V∣P(w∣wi)=1
例如:
P(w2∣wi)=p(n(w2,1),left)⋅p(n(w2,2),left)⋅p(n(w2,3),right)=σ(vn(w2,1)Tvwi)⋅σ(vn(w2,2)Tvwi)⋅σ(−vn(w2,3)Tvwi)
通过最大负对数似然训练模型,更新从树根到叶子节点路径上每个节点的向量。
如果这篇文章对你有一点小小的帮助,请给个关注,点个赞喔,我会非常开心的~