Word2Vec之外的词向量训练方法(fastText,Glove)

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=gGwzg
和Word2Vec相比,fastText的优势在于:

  • 考虑到了构词规律,使得相同词根的词比较接近
  • 对生僻词比较友好

Glove

对于Word2Vec的skip-gram模型来说,条件概率 P ( w j ∣ w i ) P(w_j|w_i) P(wjwi)的值为 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=kVexp(ukvi)exp(ujvi)
其中 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} iVjVpijlogqij
但其实一个词在词典里不止出现一次,因此上式正确表示应该为
∑ 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} iVxijVpijlogqij
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=(logxijlogexp(ujTvi))=(ujTvilogxxj)

  • 为**每个词 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=iVjVh(xij)(ujvi+bi+cjlogxij)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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值