fastText
在Word2Vec训练词向量时忽略了英文单词单复数以及时态的变化。“dog”和“dogs”表示不同的单词但是具有相同的词根。我们在背单词的时候也会注意到,具有相同词根的单词在词义上会比较接近。而在Word2Vec的训练中,我们忽略了这些,将不同单词的单复数以及时态当作了不同的单词进行处理。
基于Word2Vec存在的以上问题,fastText提出了子词替换的概念,在Word2Vec的skip-gram模型中考虑进了构词信息,fastText在训练的时候会将每个中心词表示为子词的集合。
fastText采用基于字符的n-gram来划分子词。意思就是从原有单词中提取出长度大于1且小于等于n的子词。比如对于单词where来说,划分后得到的**<wh, whe, her, ere, re>,当然还需要附带上一个额外的子词即<where>**本身。
在fastText训练过程中,将中心词
w
w
w长度在3-6的子词集合记为
G
w
G_w
Gw,fastText的词典时所有词的子词的并集。如果假设词的词向量为
z
g
z_g
zg,那么
w
w
w的词向量
v
w
v_w
vw的表示为:
v
w
=
∑
g
∈
G
w
z
g
v_w = \sum_{g \in G_w}z_g
vw=g∈Gw∑zg
和Word2Vec相比,fastText的优势在于:
- 考虑到了构词规律,使得相同词根的词比较接近
- 对生僻词比较友好
Glove
对于Word2Vec的skip-gram模型来说,条件概率
P
(
w
j
∣
w
i
)
P(w_j|w_i)
P(wj∣wi)的值为
q
i
j
q_{ij}
qij:
q
i
j
=
exp
(
u
j
⊤
v
i
)
∑
k
∈
V
exp
(
u
k
⊤
v
i
)
q_{ij}=\frac{\exp(\boldsymbol{u}_j^\top \boldsymbol{v}_i)}{ \sum_{k \in \mathcal{V}} \text{exp}(\boldsymbol{u}_k^\top \boldsymbol{v}_i)}
qij=∑k∈Vexp(uk⊤vi)exp(uj⊤vi)
其中
v
v
v指的是中心词向量,
u
u
u指的是背景词向量,
V
\mathcal{V}
V是词典索引集。
因此skip-gram想要最大化的是
∑
i
∈
V
∑
j
∈
V
p
i
j
l
o
g
q
i
j
\sum_{i \in \mathcal V}\sum_{j \in \mathcal V} p_{ij}logq_{ij}
i∈V∑j∈V∑pijlogqij
但其实一个词在词典里不止出现一次,因此上式正确表示应该为
∑
i
∈
V
x
i
∑
j
∈
V
p
i
j
l
o
g
q
i
j
\sum_{i \in \mathcal V} x_i \sum_{j \in \mathcal V} p_{ij}logq_{ij}
i∈V∑xij∈V∑pijlogqij
x
i
x_i
xi是词
w
i
w_i
wi在词典内出现的次数
上式在实际中存在的问题有:
- 计算开销太大
- 交叉熵损失对生僻词不友好
因此Glove模型对上述Word2Vec做出了如下的改变:
- 采用了平方损失,公式如下
l = ( l o g x i j − l o g e x p ( u j T v i ) ) = ( u j T v i − l o g x x j ) l = (log\,x_{ij} - log\,exp(u_j^Tv_i)) = (u_j^Tv_i - log \, x_{xj}) l=(logxij−logexp(ujTvi))=(ujTvi−logxxj)
- 为**每个词 w i w_i wi**增加了两个模型参数:中心词偏差项 b i b_i bi和背景词偏差项 c i c_i ci
- 为每个损失项添加一个权重
L = ∑ i ∈ V ∑ j ∈ V h ( x i j ) ( u j ⊤ v i + b i + c j − log x i j ) 2 L = \sum_{i\in\mathcal{V}} \sum_{j\in\mathcal{V}} h(x_{ij}) \left(\boldsymbol{u}_j^\top \boldsymbol{v}_i + b_i + c_j - \log\,x_{ij}\right)^2 L=i∈V∑j∈V∑h(xij)(uj⊤vi+bi+cj−logxij)2
权重函数 h ( x ) h(x) h(x)的一个建议选择是:当 x < c x < c x<c时(如 c = 100 c = 100 c=100),令 h ( x ) = ( x / c ) α h(x) = (x/c)^\alpha h(x)=(x/c)α(如 α = 0.75 \alpha = 0.75 α=0.75),反之令 h ( x ) = 1 h(x) = 1 h(x)=1。因为 h ( 0 ) = 0 h(0)=0 h(0)=0,所以对于 x i j = 0 x_{ij}=0 xij=0的平方损失项可以直接忽略。
相比于Word2Vec,Glove的优势在于:
- 中心词向量和背景词向量等价
- Glove使用中心词向量和背景词向量之和作为最终词向量
参考链接:https://github.com/ShusenTang/Dive-into-DL-PyTorch