Siamese LSTM解决句子相似度以及扩展(理论篇)

来源:互联网 发布:淘宝双11报名 编辑:程序博客网 时间:2024/05/24 05:04
如果本文观点有不对的地方,欢迎指正! author:佟学强 

  nlp中语义理解一直是业内的难题。汉语不同于英语,同样一个意思,可以有很多种说法,比如你是谁的问题,就可以有如下几种:①你是谁?②你叫什么名字?③您贵姓?④介绍一下你自己 等等。这些句子在语义上是十分接近的,如果做一个智能音响,对音响说出上述任何一句,其结果不应该因为句子形式的不同而不同,也就是说训练出的模型不能对同义语句太敏感。在神经概率语言模型产生之前,解决这个问题(或者nlp领域里比较流行的特征抽取),基本上都是依赖比较传统的TF-IDF算法来构造出一个句子的向量,然后计算向量的相似度。这种方法的能力是非常有限的,最大的问题首先是,不能表示出一个句子。在神经概率语言模型,也就是深度学习引入到nlp中之后,word2vector,lstm,cnn开始逐步占据主导。在最开始的由word2vector表达词向量,扩展到目前的用LSTM表达句子的向量,还有RCNN应用于NLP可以抽取出一个句子的高阶特征,这几年热度一直居高不下。

  word2vector严格来讲,有4层的神经网络构成。input层是one-hot表示,接下来是embedding层,这两层中间的连接参数就是词的embedding表示,有one-hot到embedding的矩阵操作,相当于one-hot在词典中查找出这个词的embedding表示。所以说,word embedding的本质是连接one-hot到embedding层的权重参数,整个训练过程是训练这些参数。后两层是projection layer和output layer,output layer是分类输出层。word2vector之所以能够用表示两个词的向量的差异来衡量两个词的差异,根本原因是在训练过程中,embedding参数和output layer的参数互相推导,两者相互影响,也就是说在训练的过程中,已经兼顾到了上下文。

  在word2vector产生后,情感分析便由word2vector和svm主导,先获取到用户评价句子的每个词的表示,对每个词打分,然后加权求和得出一句话的得分,来判断这句话是好评,中评还是差评。很显然,这种方法只是从词这个局部单元考虑出发,并没有考虑到整句话所表达的意思,很容易陷入局部最优解。lstm产生后,便摒弃了这个方案,先由lstm训练出这句话的向量,然后进入到回归层进行打分。这样就能从整句话出发来判断用户的评价了。尽管如此,研究人员并没有停止语义分析研究的步伐。在nlp中,文章摘要或者信息抽取一直是没有突破的课题,深度学习引入之后,便产生了质的飞跃。文章摘要,不管采用什么样的手段,都离不开三个核心问题:①句子相似度的计算②文摘句抽取③文摘句排序。比较两个方案:一个是比较传统的手段,以句子为单位,运用TF-IDF抽取出每个句子中的重要特征重新组成向量,然后聚类操作,选出每个类别中最具代表性的句子向量,最后排序。这种方案的准确度有待提高!原因是在用TF-IDF抽取特征建立向量时,并没有建立向量间的关联,这是最大的问题。另一种方案,运用业内最先进的技术,Siamese LSTM,训练的时候,输出为两个句子向量的一阶范数的指数函数,代表两个句子的差异程度,让这个值与真实的打分值的损失函数最小。这样训练得出的两个句子的向量与普通的标准的LSTM训练出来的向量是有区别的。标准的LSTm单独训练出来的每个句子向量只能代表一个句子,句子之间是独立的,也就是不同句子向量之间的一阶范数或者余弦夹角不能代表两个句子间的差异。模型训练完毕后,可以对一篇文档的句子对儿进行预测,预测出每个句子的向量(这些向量之间是有关联的),把每个句子的向量累加成文章向量,然后用元智或者元积衡量每个句子和文章向量的差异,选出k个相似度最高的句子作为文章摘要句。关于如何获取整片文章的语意表达,还有另外一个方案,这个思路借鉴了开放式聊天机器人解决上下文多轮对话的方案。

feature1:一篇文章包括A,B,C三段,每段有a,b,c……句子,先用siamese lstm获取到每个句子的语义表示,然后把每个句子作为基本输入单元,输入到siamese lstm中,再把每段作为基本单元输入到siamese lstm。这里的每个siamese lstm是不一样的,需要单独训练好,比如第二个可以衡量段落之间的语义相似性。

  计算句子语义相似度在nlp中不仅限于文章摘要。他可以增强nlp的语义理解能力,在机器翻译中也有重要的应用甚至在nlp的挑战性的场景,比如给你一段话,要求不改变文章思想的情况下把这段话拆分成两段,也就是文章断句分段。这个问题的解决方案可能复杂一些,siamese lstm只是一个基础性的支撑。解决语义问题,首先要解决的是获取语义的表示,通常情况下用dense向量来表达。但是标准的lstm最大的意义是提供了基础学术研究,因为他获取到的语义表达是独立的,不具备语义关联,重要的事情重复三遍,不具备语义关联,不具备语义关联,不具备语义关联!!考察语义相似度,不紧要考虑单个句子或者整片文档的上下文,还要兼顾到语义关联。也就是说,我们用lstm训练得到的语义表达,应该是具备了不同句子之间的语义关联性。标准的lstm有很多改进型,比如GRU,但是他不一定是效果最好的,存疑!

  目前,计算语义关联,或者计算语义相似度,2014~2016年间,有众多学者探索了一下方案:①convnet,cnn引入到nlp中②skip_thought,改进型的w2v③tree_lstm。基于ma结构的siamese lstm已经超越了当下的the state of art,效果已经击败了上述三个方案。他的最大亮点是exp(-||x1 - x2||1),为什么不用L2范数衡量获取到的句子向量的差异,原因得从BPTT说起,用L2范数会存在梯度消失的问题。因为最终获取的向量实际上是两个句子向量的差值,可以看成是一个向量,上述的函数可以看作是激活函数,进行梯度训练时,由于L2函数的特性,只能衡量较短句子的差异,也就是说,当句子很长时,本来语义相似度很低,他却衡量不出来,认为是相似度很高。

  Simase LSTM指的是具有simase结构的LSTM网络,由两个平行双向LSTM构成,结构参考下面两张图:

  以上截图来自2014~2015的学术论文。连体(双胞胎)LSTM输入为句子对儿,分别是上图中的左边和右边的。通过final state获取两个句子的向量,然后通过指数函数衡量差异,由于指数函数的指数为一阶范数的负数,所以取值范围为(0,1]。在构建样本的时候,一般情况给句子对儿打分都是1~5分,所以再通过一个非参数化的回归层映射到这个区间,用MSE作为损失函数,梯度优化方法为AdaDelta。一个典型的样本输入:[“I like playing basketball.”,”My favourite sports is basketball.”, 3.4]。按照作者在论文中提出的,连体的LSTM权重参数不应该一样,因为句子对儿长度是有差异的。另外作者在论文中提出了训练细节问题,经过试验验证,这个模型的准确度对参数初始化非常敏感。作者建议,权重参数初始化为随机的高斯分布参数,然后cell中忘记门的偏置值初始化为2.5,是为了训练更长的记忆能力。



阅读全文
0 0
原创粉丝点击