本文主要用于记录Facebook AI研究中心于2017年提出的一种基于监督学习的句向量表达方式。该文也是业界最先一批提出句向量预训练概念的论文。本笔记主要为方便初学者快速入门,以及自我回顾。
论文链接:https://arxiv.org/pdf/1705.02364.pdf
Github:https://github.com/facebookresearch/InferSent
基本目录如下:
- 摘要
- 核心思想
- 总结
------------------第一菇 - 摘要------------------
1.1 论文摘要
当代比较成熟的NLP系统的底层特征都仅仅依赖于从大规模语料库中训练出来的词向量。而对于那些长句或是段落的特征向量的表达,目前的研究还远远不够。仅有的一些依赖于非监督学习得到的句向量表达,也因为未能达到预期效果而被弃用。本论文提出了一种基于SNLI语料库预训练出来的通用的句向量的表达,且经过实验验证,该种方法训练得到的句向量,在多个NLP基础任务中都表现出了卓越的效果。同时,本论文还希望效仿ImageNet数据集(多数现今模型都在其上面预训练)在CV领域的地位一样,基于推理的数据集(SNLI),也能成为NLP领域的标杆(即通用的预训练数据集)
------------------第二菇 - 核心思想------------------
2.1 句向量的表达
自从word2vec词向量训练方法被提出以后,在NLP学术界就仿佛打开了潘多拉魔盒一般,各种基于分布式表达的词向量的训练如雨后春笋一般冒出,比较著名的都有(glove,fasttext。。等)。但是,如何去捕获在一句话或一个段落中词与词之间的关联关系,即如何去表达一个完整的句向量,始终是一个未解决的问题。
本文就是想去尝试,推出一种通用的句向量模型的有监督的训练方法。其中有俩个问题需要去解决,
1)选用哪一种神经网络模型?
2)选用哪一种数据集去训练该网络模型?
因此,说白了,该论文就是用多种模型在多种数据集上去训练得到一个句向量模型,再将训练得到的句向量模型运用于其他各个NLP的下游任务,通过比较在下游任务中的表现,来反推出,哪一种句向量模型是更具有通用性的~当然,从论文的标题我们也应该能看出来,训练的语料库其实就是SNLI(该语料库是斯坦福大学所维护的)。
简单来说,该语料库就是去推理判断每一组句子的关系(一共有570k个句子对),其中,对应的标签有3个,分别为(entailment, contradiction, neutral)。相信,在读的各位,如果是对句向量或是句句匹配任务有研究的同学,应该对该数据集并不陌生(甚至可以说是,检验新的模型的必测数据集哈哈)。而论文中,对该数据集训练出来的句向量效果最佳的表现,解释为,high-level understanding task that involves reasoning about the semantic relationship within sentences。意思就是,必须要完全理解了句子的意思,才能对俩句话的关系作出准确的判断。(而不像其他简单的任务,可能就是词词匹配,或是距离匹配)
2.2 预训练方法
有了训练语料,那就是选择神经网络模型的问题了。因为,该SNLI语料库中是句子对的形式,因此,有两种方式来生成最终的特征向量
1)单独分别对每一个句子生成句向量。
2)对俩个句子同时生成句向量。
基于本文的目标,是提出一种通用的句向量的表达模型,显然第一种方法更合适,而对于生成的每一组句向量,我们也会进行concact处理,整合生成特征句子,再输入到最后一层分类器中。基础的训练模型架构如下图所示,
因此,本文其实是着重实验了多个(7个)句向量的生成模型架构。主要的模型架构阐述如下
1)LSTM +GRU
该模型架构就是最普通最简单的LSTM模型,当然是双向的。同时也参考了SkipThought中的方法,即将BI-GRU的,前向最后时刻状态与后向最后时刻状态相叠加。
2)BiLSTM with mean/max pooling
这个就是取BiLSTM结果的时候的处理方式不同,mean pooling就是把所有时刻的状态值取平均,max pooling就是取最大值。具体的示意图如下,也比较简单,
- Self-attentive network
该方法可以参考我的另一篇论文笔记。思路也比较简单,就是对句子中对每一个词都计算得出一个权重,再相加得出句向量。
4)Hierarchical ConvNet
其实就是一个4层的卷积网络,每一层经过max pooling都会得到一个句向量的表达,最后将4层得出的concact就是最终的句向量表达,思路也比较简单,示意图如下,
2.3 实验方法
之后,就是具体的实验部分,作者将上述训练得到的句向量,分别运用于12项NLP任务之中,在比较上述几种模型的同时,也比较了其他各种生成句向量的方法。当然,结论肯定是上述利用SNLI的句向量表达要优于其他网络训练出的句向量,且最佳的模型为BiLSTM + Max Pooling。具体的实验过程本文不作展开,有兴趣的同学可以参考原论文,当然本文也有开源代码(基于pytorch),大家可以仔细研读,作为入门的baseline也是相当不错的。
------------------第三菇 - 总结------------------
3.1 总结
到这里,整篇论文的核心思想及其创新点已经说清楚了。本文主要是推出了一种预训练句向量的思路,并且给出了最佳的预训练数据及最佳的预训练模型,并且通过实验论证了其可行性。当然,不得不承认,离通用的句向量模型还有很长的路要走~哈哈~
简单总结一下本文就是先罗列了一下该论文的摘要,再具体介绍了一下本文作者的思路,也简单表述了一下,其中的模型细节及训练细节。希望大家读完本文后能进一步加深对该论文的理解。有说的不对的地方也请大家指出,多多交流,大家一起进步~😁