聊一下Glove

本文大概需要阅读 4.75 分钟
先问大家两个问题,看能不能解答

  1. Glove 中词向量的表达是使用的中心词向量还是背景词向量还是有其他方法?

  2. 能不能分别用一句话概括出Glove和Fasttext 的核心要点?

先来谈Glove。中文全称 Global Vectors for Word Representation。它做的事情概括出来就是:基于全局语料,获得词频统计,学习词语表征。

我们从语料之中,学习到X共现词频矩阵,词频矩阵中的每个元素 x i j x_{ij} xij,代表的是词

x j x_{j} xj出现在 x i x_{i} xi的环境中的次数。注意,对于共现词频矩阵来说,它是一个对称矩阵。

这一点非常的重要,也很容易理解,词A出现在词B周围的次数肯定是等价于词B出现在词A周围的次数的。

类比于Word2vec,对于词 x i x_{i} xi,就是中心词,对于词 x j x_{j} xj也就是背景词。

理论上,一个词作为中心词向量和一个词作为背景学到的两种向量应该是完全相同的。

但是现实中,由于我们初始化的不同,所以我们最终学习到的两种词向量是有些许不同。

为了增加模型的鲁棒性,在Glove中,使用两个词向量的和作为我们一个词的词向量的表达。

这一点是区别于Word2vec,对于Word2vec,中心词向量和背景词向量是不等价的,我们一般使用中心词向量代表一个词最终的语义表达。

Glove 论文中的推导过程其实不是很严谨,大致流程就是从大语料中发现了一个规律,即条件概率的比值可以比较直观的表达出词与词之间的关系。

随后可以构建词向量函数去拟合条件概率的比值。基于此一步步的进行延伸推导,在我看了就是在基于一些假设,寻找出一种可能性的存在。

在这里就不细说,直接给出Glove的损失函数:

∑ i ∈ V ∑ j ∈ V h ( x i j ) ( u j T v i + b i + b j − l o g ( x i j ) ) 2 \sum_{i \in V} \sum_{j \in V} h(x_{ij})(u_{j}^Tv_{i}+b_{i}+b_{j}-log(x_{ij}))^2 iVjVh(xij)(ujTvi+bi+bjlog(xij))2

详细讲一下这个损失函数,它是一个平方损失函数,很值得琢磨。

我把它分为了三个部分,权重函数h(x),词向量表达是 u j T v i + b i + b j u_{j}^Tv_{i}+b_{i}+b_{j} ujTvi+bi+bj,共现词频的对数 l o g ( x i j ) log(x_{ij}) log(xij)

从这里,我插一句我的理解,就是GLove基于的是无标签的语料,属于无监督的训练过程,但是从损失函数看,我觉得可以认为它是一个有监督的过程。

标签就是 l o g ( x i j ) log(x_{ij}) log(xij),这个是我们从语料之中计算出来的,换句话说,在模型训练之前,我们可以对语料的计算,得到相应的标签数据,所以我自己认为这个可以看做是一个有监督的过程。

我们使用一句话去描述这个损失函数可以这么去说:随着模型不停的优化,词向量的表达在不断的拟合共现词频的对数。

h(x)是权重函数,代表的含义是表达一个词对的重要性,在值域[0,1]上单调递增。直观上理解就是一对词语共现的词频越多,那么它的重要性也就越大。

论文中给出的函数是这样的,在x

我们看这个损失函数,有一个很有意思的点,就是h(0)=0。想一下,这个代表着什么?
也就是说,当我们一对词的共现词频为0的时候,损失函数是为0,换句话讲,我们的损失函数的复杂度是和共现词频矩阵中的非零元素是线性关系。

所以在训练的时候,我们只需要对非零元素采样,使用随机梯度就可以对词向量和两个偏置项进行学习更新。

这里还有一个细节点,需要注意,偏置项是不可以省略的。为什么呢?因为如果去掉,在公式推导中的对称性假设就不满足,感兴趣的同学可以自己推导一系。

参考链接:

视频:

https://www.bilibili.com/video/BV154411S7Tf?p=17

文档:http://zh.d2l.ai/chapter_natural-language-processing/glove.html

你可能感兴趣的:(机器学习,人工智能)