Skip-Thought Vectors阅读笔记

论文原文 Skip-Thought Vectors
论文信息 NIPS2015
个人解读 Wang & Hytn Chen
更新时间 2020-02-17

句子表示简介

句子分布式表示:将一句话用固定长度的向量进行表示,向量往往高维,因此也可看作将一句话嵌入进高维空间中去,也叫做句嵌入,让句子的语义更准确地编码到有限维的向量中,在向量子空间中保持句子的语义关系,更好地利用语言模型以及无监督上下文信息。

BERT出来之后,句表示领域就很少出来工作了,而这篇文章是BERT借鉴的一篇工作。

早期一点的句表示值得一提的是TF-IDF,中心思想是认为一句话每一个词对于这句话的语义都是有不同程度的贡献的,因此有了权重的概念,那么在已经有词向量的基础上如何通过计算每个词适合的权重,加权求和得到句表示呢?由此就引入了TF-IDF方法,TF代表词频,IDF代表逆文件频率指数,通过这两个特征来计算得出权重,从而得到句表示。

基于神经网络的句表示之前的阅读笔记中已经提及,在此不多加赘述。

基于复述句匹配的句表示,其训练的中心思想就是两句话互为复述句的话句向量应该更加相似,不为复述句的话句向量之间的距离应该更加远。复述句的训练集很容易获取,通过一个已训练好的翻译模型,将翻译结果和标签就可以当做一对复述句。

这里总结一下,上面的种种模型有什么优缺点呢?

基于语言模型的句表示

优点就是利用词与词的共现信息可以抓取到一部分特征,无监督的语料更加降低了成本,但缺点是词与词之间的共现信息还是太片面太模糊了,仅仅抓取这样的信息是不准确不够智能的,而且并未使用句与句之间的语义联系来做一些什么。

基于复述句对的句表示

优点是建模了句对之间的相似性关系,通过这个关系来训练模型,同时训练集的获取成本也低。但是缺点就是仅仅建模了相关性,相似性也还是比较偏面。

当时的skip-gram训练词向量的时候,主导的思想就是,要想了解一个词应该去了解它的上下文到底是什么。而skip thought的中心思想就是认为,当前句子总是会与其上下句之间存在语义联系的,那么就可以利用这样的语义联系来预测上下文的句子,就像skip-gram做的那样。

而skip thought的主要目标就是解决这样一个问题:如何利用大规模无监督语料来完整建模句子间的关系?

skip thought模型

模型简图如下所示:

Skip-Thought Vectors阅读笔记_第1张图片

编码器就是GRU,拿到最后时刻的隐层状态作为当前句子的表示。而解码器也是GRU,与编码器不同的是,在编码器已经得到中间句语义信息的时候,解码器要把这个信息融入进decoder中。原始GRU的原理图如下

Skip-Thought Vectors阅读笔记_第2张图片

对GRU原理理解之前,先看看LSTM的原理。在此不多赘述,其公式如下
r t = σ ( W r x t + U r h t − 1 ) z t = σ ( W z x t + U z h t − 1 ) h ‾ t = tanh ⁡ ( W x t + U ( r t ⊙ h t − 1 ) ) h t = ( 1 − z t ) ⊙ h t − 1 + z t ⊙ h ‾ t \begin{aligned} \mathbf{r}^{t} &=\sigma\left(\mathbf{W}_{r} \mathbf{x}^{t}+\mathbf{U}_{r} \mathbf{h}^{t-1}\right) \\ \mathbf{z}^{t} &=\sigma\left(\mathbf{W}_{z} \mathbf{x}^{t}+\mathbf{U}_{z} \mathbf{h}^{t-1}\right) \\ \overline{\mathbf{h}}^{t} &=\tanh \left(\mathbf{W} \mathbf{x}^{t}+\mathbf{U}\left(\mathbf{r}^{t} \odot \mathbf{h}^{t-1}\right)\right) \\ \mathbf{h}^{t} &=\left(1-\mathbf{z}^{t}\right) \odot \mathbf{h}^{t-1}+\mathbf{z}^{t} \odot \overline{\mathbf{h}}^{t} \end{aligned} rtzththt=σ(Wrxt+Urht1)=σ(Wzxt+Uzht1)=tanh(Wxt+U(rtht1))=(1zt)ht1+ztht
这就是编码器的GRU,而解码器的GRU加入编码器的结果之后公式变成如下所示
r t = σ ( W r d x t − 1 + U r d h t − 1 + C r h i ) z t = σ ( W z d x t − 1 + U z d h t − 1 + C z h i ) h ‾ t = tanh ⁡ ( W d x t − 1 + U d ( r t ⊙ h t − 1 ) + C h i ) h i + 1 t = ( 1 − z t ) ⊙ h t − 1 + z t ⊙ h ‾ t \begin{aligned} \mathbf{r}^{t} &=\sigma\left(\mathbf{W}_{r}^{d} \mathbf{x}^{t-1}+\mathbf{U}_{r}^{d} \mathbf{h}^{t-1}+\mathbf{C}_{r} \mathbf{h}_{i}\right) \\ \mathbf{z}^{t} &=\sigma\left(\mathbf{W}_{z}^{d} \mathbf{x}^{t-1}+\mathbf{U}_{z}^{d} \mathbf{h}^{t-1}+\mathbf{C}_{z} \mathbf{h}_{i}\right) \\ \overline{\mathbf{h}}^{t} &=\tanh \left(\mathbf{W}^{d} \mathbf{x}^{t-1}+\mathbf{U}^{d}\left(\mathbf{r}^{t} \odot \mathbf{h}^{t-1}\right)+\mathbf{C h}_{i}\right) \\ \mathbf{h}_{i+1}^{t} &=\left(1-\mathbf{z}^{t}\right) \odot \mathbf{h}^{t-1}+\mathbf{z}^{t} \odot \overline{\mathbf{h}}^{t} \end{aligned} rtzththi+1t=σ(Wrdxt1+Urdht1+Crhi)=σ(Wzdxt1+Uzdht1+Czhi)=tanh(Wdxt1+Ud(rtht1)+Chi)=(1zt)ht1+ztht
上面公式中的 ⊙ \odot 代表按位乘,也就是对于向量每一维度上的控制。

那损失函数也就可以相应得出了,对于预测的两个句子中的两个当前词是正确的概率最大化,表达式表达如下
∑ t log ⁡ P ( w i + 1 t ∣ w i + 1 < t , h i ) + ∑ t log ⁡ P ( w i − 1 t ∣ w i − 1 < t , h i ) \sum_{t} \log P\left(w_{i+1}^{t} | w_{i+1}^{tlogP(wi+1twi+1<t,hi)+tlogP(wi1twi1<t,hi)
实验效果论文里面已经给出,在有一些任务中可能不能达成最好的效果,但是那些最好的效果可能是针对某些任务设计的,甚至加入了较多的特征工程。

后续工作

Quick Thought(ICLR2018)

认为skip thought的训练目标太过严苛,quick thought将任务要求适当放宽,将训练目标更改为从一些句子集中找到是当前句上下文的句子。模型采用了两个函数,分别用来对当前中心句和上下文句进行编码,最后优化目标就是令正确上下文句的概率越大越好。模型结构简图如下:
Skip-Thought Vectors阅读笔记_第3张图片

你可能感兴趣的:(NLPer阅读笔记)