先把论文放出来:Enhanced LSTM for Natural Language Inference,说实话这篇论文不算新了,但是在语义相似度方至今仍流传着他的传说,因此我还是把这篇论文拿着读了起来。近期也是看了很多文章,但是终究不如读论文来的过瘾,大部分博客对这篇论文的模型核心做了很多介绍,但各个操作的出发点和一些独到的见解却写的不多,这次我会在介绍ESIM的过程中讨论一下。
当然,还是建议大家好好品读原论文,更有味道。
另外给点代码,看论文不清楚的看看论文也挺好:
https://blog.csdn.net/wcy23580/article/details/84990923。
https://github.com/weekcup/ESIM。
有关语义匹配和推理
一般地,向量召回主要用的表征模型,但是表征模型没有用到交互特征,因此匹配的准确率上肯定比不过交互模型,所以一般工程上用表征模型召回,然后用交互模型来做精排,这样能保证整个搜索系统的效果更加稳定可靠(看到没,准召分离的思路又来了),而交互模型这块,比较可靠的基线,应该就要数ESIM了。
ESIM里,我比较欣赏的是这几点:
LSTM抽取上下文信息。Tree-LSTM的尝试也为信息抽取带来启发。
把Decomposable attention作为交互特征的思路有机组合起来了。
多种交互形式的特征concat起来。
当然具体阅读后,我还提炼了一些新的idea,在文末。有了这些思路,先让我们来看看具体的模型,其实论文的行文里讨论了很多思路,我们先来看整体论文思路,然后再来提炼里面的独到之处。
模型整体
论文的模型其实没有想象中的困难,在很早就把整篇论文给到了:
输入层是embedding+LSTM的组合。
Local Inference Modeling层,用的Decomposable Attention来体现两者的交互型。
Inference composition层则把上面一层的结果进行多种组合计算,得到多种特征,说白了就是比较。
输出层就不多说了,大家都懂的。
输入层
一般的输入层只会是简单的word2vector,但这里其实加了一个LSTM,还是双向的,就是用来获取各路信息。来看看代码,这个还是比较清晰的:
i1=Input(shape=(SentenceLen,),dtype='float32') i2=Input(shape=(SentenceLen,),dtype='float32') x1=Embedding([CONFIG])(i1) x2=Embedding([CONFIG])(i2) x1=Bidirectional(LSTM(300,return_sequences=True))(x1) x2=Bidirectional(LSTM(300,return_sequences=True))(x2)
Local Inference Modeling
中文翻译应该是局部推理层,我的理解这一层是用于抽取局部信息的,作者用的方法应该来源于这篇论文:A Decomposable Attention Model for Natural Language Inference,这里其实是一个计算交互特征的过程,即一一分析两个句子之间每个位置的相似度,最简单的方式就是点乘,而这篇论文就是使用的这个最简单的方式:
然后再把权重分散到各个位置,其实形态就很像softmax了:
这个其实就是做了一个交叉,计算整个句子的权重,然后用类似softmax的形式整上,非常讨巧,相信ESIM的成功很大程度上就和这个有关。
而这并没结束,作者进行了进一步的强化,对比Decomposable Attention前后的变化,进行了组合。
Inference Composition
推理层应该是进入最终预测之前的最后一层了。这一层的操作同样没那么简单,大部分人可能flatten、maxpool、avgpool之类的就直接全连接了,但是这里并不是,而是做了一系列的再提取和再处理,最终才完成预测向量的:
作者是真的把信息抽取和特征的组合做到了极致,对上面构造的两个组合特征再进行了一次特征提取,用的依旧是熟悉的Bilstm,值得注意的是他操作的维度,来看一个ESIM的开源代码吧:
classInferenceCompositionLayer(object): """ Layertocomposethelocalinferenceinformation. """ def__init__(self,hidden_units,max_length=100,dropout=0.5, activation='tanh',sequences=True): self.hidden_units=hidden_units self.max_length=max_length self.dropout=dropout self.activation=activation self.sequences=sequences def__call__(self,input): composition=Bidirectional(LSTM(self.hidden_units, activation=self.activation, return_sequences=self.sequences, recurrent_dropout=self.dropout, dropout=self.dropout))(input) reduction=TimeDistributed(Dense(self.hidden_units, kernel_initializer='he_normal', activation='relu'))(composition) returnDropout(self.dropout)(reduction)
这里用到另一个我没见过的keras层,即TimeDistributed,有兴趣可以了解下。
此后,非常精髓的使用avg-pool和max-pool的组合,有关池化,max和avg一直打得火热,没有人能给出非常稳定的结论,因此作者就用了两者的组合:
启示
整篇文章其实没有构造出非常高端的结构,只是一些非常朴素的操作,但是综合起来成了现在也非常推荐用的基线,是有很多有借鉴意义的东西的,我这里一一列举,大家可以直接在里面选择需要的来用。
BiLSTM似乎还挺好用的。当然私以为CNN其实也可以尝试的。
花式concat,多种信息抽取方式进行组合,小孩子才做选择,大人全都要。
attention的使用,其实有出处A Decomposable Attention Model for Natural Language Inference,思想其实是两者一一对比得到交互矩阵,利用该交互矩阵构造类似softmax的权重,为各自的关键信息进行加权,重点提取。
信息的对比来自于可以来自减和乘,减直接计算两者的差距,类似欧氏距离,乘的使用则来源于余弦距离,既然要对比特征,那就把这两个用到极致。
avg和max哪个好,别争了,都用,哪个比较重要交给后面的全连接层来决定吧。
我的这篇文章里面没有讲tree-lstm,主要是因为我们平时比较难用到,原因是这个树不好构建,需要依赖依存句法,但是的确是一个挺有意思的思想,只有真的去读论文的人才能知道。
参考资料
论文原文:Enhanced LSTM for Natural Language Inference
论文解读:https://blog.csdn.net/wcy23580/article/details/84990923
keras版本代码:https://github.com/weekcup/ESIM/blob/master/src/model.py
依旧推荐大家直接去读论文,文章对他为什么做这些操作有很明确的思想,其实在我看来这些思想比操作本身还要重要,毕竟思想是需要启发的,在这些思想的指导下,我在思考解决方案的时候就能有参考,方案可以借鉴,但是这个思想的实现并不局限在一个方法上。
责任编辑:lq
-
模型
+关注
关注
1文章
3551浏览量
50760 -
代码
+关注
关注
30文章
4908浏览量
71279 -
eSIM
+关注
关注
3文章
253浏览量
27441
原文标题:【语义相似度】ESIM:语义相似度领域小模型的尊严
文章出处:【微信号:zenRRan,微信公众号:深度学习自然语言处理】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
AI推理的存储,看好SRAM?

信而泰×DeepSeek:AI推理引擎驱动网络智能诊断迈向 “自愈”时代
大模型推理显存和计算量估计方法研究
使用MicroPython部署中的ocrrec_image.py推理得到的输出结果很差,如何解决呢?
详解 LLM 推理模型的现状

利用VLM和MLLMs实现SLAM语义增强

高效大模型的推理综述

FPGA和ASIC在大模型推理加速中的应用

使用语义线索增强局部特征匹配

评论