GloVe损失函数的理解

 

简介

GloVe是一种很是简单快速的训练词向量的算法。与复杂的word2vec相比,其是一个log双线性模型,仅经过一个简单的损失函数就可以获得很好的结果。 算法

(1)J=∑i,jNf(Xi,j)(viTvj+bi+bj−log(Xi,j))2


其中,vivj是i和j的词向量,bibj是两个误差项,f是一个权重函数,N为词汇表大小
可是这个损失函数的意义却不是很直观,这里参照一篇博客写了一下对于这个损失函数的分析函数

思路

Glove首先会经过设置定义的窗口大小,进行统计获得词的共现矩阵。如Xi,j表示词ij同时出现的次数。共现矩阵是一个N×N的矩阵spa

而后咱们须要计算一些条件几率
定义.net

Xi=∑j=1NXi,j

 

Pi,k=Xi,kXi

 

ratioi,j,k=Pi,kPj,k


而后咱们分析这里的ratio会发现一些规律code


因此咱们想到,若是可以经过词向量vi,vjvk获得类似的规律的,那么说明咱们的词向量是很不错的。即咱们想作的是获得函数g(),使之知足 orm

ratioi,j,k=Pi,kPj,k=g(vi,vj,vk)


那么为了使两者尽可能想近,对于损失函数,一个直观的想法就是MSE,即 xml

(2)J=∑i,j,kN(Pi,kPj,k−g(vi,vj,vk))2


不过这里的计算复杂度是N3,过于复杂,咱们须要进一步分析。咱们能够开始猜测一下g(vi,vj,vk)是一个什么样的形式,由于其衡量了单词i,j之间的关系,那么咱们能够猜测其中含有vi−vj,又由于其中还有对k的关系且最终是一个标量,那么咱们假设其存在一个内积,即(vi−vj)Tvk
那么如今咱们有blog

Pi,kPj,k=g(vi,vj,vk)=(vi−vj)Tvk=viTvk−vjTvk


能够看到这里咱们和上面的损失函数有点相似了,可是仍是缺乏一个exp,咱们能够加上它看看,即 ip

Pi,kPj,k=exp⁡(viTvk−vjTvk)=exp⁡(viTvk)exp⁡(vjTvk)


能够看到,加上exp以后分子分母的形式就彻底同样了,咱们能够将其一块儿考虑,即如今只须要知足ci

Pi,j=exp(viTvj)


两边取对数,咱们的损失函数就可以转化为

(3)J=∑i,jN(log(Pi,j)−viTvj)2

这个损失函数已经更像一些了,可是仍是不太同样。这是由于咱们前面是存在一点问题的。根据前面咱们有

log(Pi,j)=viTvj和log(Pj,i)=vjTvi


可是实际上,上面的式子右边是相等的,但左边并不相等(而且对于这个问题来讲,咱们能够想到target和context实际上是能够互换的,因此存在对称),即原有的对称性不知足了。咱们须要进一步处理一下。咱们将上面(3)的中的条件几率log(Pi,j)展开,获得

log(Pi,j)=log(Xi,j)−log(Xi)=viTvj


这里的log(Xi)是独立于j的,因此能够被吸取进bi变为

log(Xi,j)=viTvj+bi+bj


这样代价函数就变成了

J=∑i,jN(viTvj+bi+bj−log(Xi,j))2


而后加上词频越高权重越大(共现次数不多的实际上极可能是异常值,而且共现次数少的通常来讲含的信息也少)

(4)J=∑i,jNf(Xi,j)(viTvj+bi+bj−log(Xi,j))2


权重函数

f(x)={(x/xmax)0.75,if x<xmax1,if x>=xmax


引用

  1. Pennington J, Socher R, Manning C. Glove: Global vectors for word representation[C]//Proceedings of the 2014 conference on empirical methods in natural language processing (EMNLP). 2014: 1532-1543.
  2. https://blog.csdn.net/codertc/article/details/73864097

<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">



相关文章
相关标签/搜索