先把論文放出來: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文章
3293瀏覽量
49034 -
代碼
+關注
關注
30文章
4819瀏覽量
68874 -
eSIM
+關注
關注
3文章
243瀏覽量
26646
原文標題:【語義相似度】ESIM:語義相似度領域小模型的尊嚴
文章出處:【微信號:zenRRan,微信公眾號:深度學習自然語言處理】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論