文章首發於(zhkun的小窩)

自然語言推理作為自然語言理解的一個重要組成部分,在整個自然語言理解中扮演著重要的角色,接下里我將對自然語言推理的現狀做一簡單總結,以下內容是我的小組分享的記錄版。

自然語言推理簡介

自然語言推理主要是判斷兩個句子(Premise, Hypothesis)或者兩個詞之間的語義關係,為了保證模型能夠集中在語義理解上,該任務最終退化為一個分類任務,目前類別主要是三分類(Entailment,Contradiction,Neutral)。目前對這三類有各種各樣的定義,但是我認為這三類的分類依據還是要落在語義理解上,通過語義關係來確定類別。

那為什麼要研究自然語言推理呢?簡單來講,機器學習的整個系統可以分為兩塊,輸入,輸出。輸入要求我們能夠輸入一個機器能理解的東西,並且能夠很好的表現出數據的特點,輸出就是根據需要,生成我們需要的結果。也可以說整個機器學習可以分為Input Representation和Output Generation。因此,如何全面的表示輸入就變得非常重要了。而自然語言推理是一個分類任務,使用準確率就可以客觀有效的評價模型的好壞;這樣我們就可以專註於語義理解和語義表示。並且如果這部分做得好的話,例如可以生成很好的句子表示的向量,那麼我們就可以將這部分成果輕易遷移到其他任務中,例如對話,問答等。這一切都說明了研究自然語言推理是一個非常重要但是非常有意義的事情。

以下是自然語言推理推理的發展歷程

相關數據

上一部分對自然語言推理進行了一個大致的介紹。眾所周知,數據對模型非常重要,而且深度神經網路也是高度依賴數據的,那麼我們來對目前的數據進行一個簡單的梳理

這是自然語言推理領域一個非常重要的數據集,相關信息如上圖所示,斯坦福大學通過眾包的方式生成了這個自然語言推理領域第一個大規模人工標註的數據集,從此自然語言推理進入深度學習時代。

這個數據集和SNLI比較類似,但是它的前提句子來自真實場景的數據,因此在數據上更貼近現實一些,同時,每一條數據包含了類別信息。

這個數據集就更加貼近現實了,前提句和假設句全都來自真實場景,人工的作用放到了對每一條數據打標籤,因此數據本身的人工影響就變小了。但是該數據全部來自科學問答,因此在類別上可能略顯單一。

該數據集和前邊不同的地方在於它是四個前提句對應一個假設句,這樣在進行推理分類時,不僅需要考慮前提句和假設句的關係,還需要考慮前提句之間的相關關係,因此推理難度更大,但是這些文本句子全都來自image captioning工作,文本本身人工較少,因此文本質量上可能不如前者。但這也是一個很有意思的方向。

當然,還有很多其他的數據集,例如SICK, Add-one RTE, JOCI等,都是從不同角度對語義理解提出了一個要求。可以說自然語言推理領域目前正是百花齊放,十分繁榮。

一些方法

詞級別的推理

該方法主要研究的是詞級別的推理。有研究表明,詞具有不同方面的語義信息,例如book在名詞角度可以表示為:書,但在動詞角度可以表示為:預定;因此使用單一的向量可能無法有效區分這些內容,因此作者提出利用不同的上下文來獲取詞在不同角度的語義信息,例如:選取中心詞周圍的名詞來表示它的topic信息,選取中心詞周圍的動詞來表示它的function信息。這樣對每個詞就都有不同的語義向量表示,然後通過網路結構對相關信息進行拼接,最後考慮到不同的推理關係可能需要的信息時不同的,例如:上下位關係:狗-動物,可能需要的是topic相關的信息,因果關係:攻擊-受傷,可能需要的更多的是function的信息,因此作者通過一個門結構計算出每種語義表示對推理關係的影響程度,然後進行加權求和,最後進行分類。並且該方法的可擴展性非常好,從網路結構上看,我們可以增加不同的語義表示,模型的結構和參數規模並不會有太大的提升,這也可以認為是模型的一個優點。

句子級別的推理

句子級別的推理可以分為兩部分,基於句子語義編碼的方法和基於詞匹配的方法,前者是首先將一個句子編碼為向量,然後分析兩個向量之間的關係;後者考慮更多的是詞之間的匹配關係,不一定有句子的語義向量表示。

句子語義編碼方法

該方法就是句子編碼的方法,首先左圖展現了這類方法的一般結構,首先通過不同的方法得到每個句子的語義向量表示;在此基礎上,對兩個向量作拼接,相減,點乘來得到兩個語義向量之間的關係,最後通過一個MLP進行分類,右圖就是句子編碼部分可以採用的方法,例如:通過雙向LSTM,得到隱層狀態,對隱層狀態做max-pooling或者做attention,得到的加權表示就只句子的語義向量表示,最右邊的圖示利用了CNN的結構,我們都知道CNN是建立輸入之間的局部關係,那麼作者使用了多層的CNN,通過多層卷積,底層獲取的是local部分的信息,那麼越往上就可以得到更長範圍內的信息,從而對句子語義進行建模,這也是一種很不錯的方法。

這個方法是對注意力機制(Attention Mechanism)的一種有效利用,我們可以清晰看出來,作者先對BiLSTM的隱層狀態進行mean pooling,在此基礎上,利用注意力機製得到句子中那些詞對語義表示比較重要,然後對隱層狀態進行加權求和,就得到了句子表示的向量,最後就是常用的框架。從該方法中我們也可以看到句子編碼模型的基本結構。

詞匹配方法

該方法是詞匹配方法的一個代表工作,首先作者使用兩個LSTM來處理兩個句子,並且後一個LSTM的隱層使用前一個LSTM的最後一個狀態初始化,在此基礎上,作者在求後一個句子的隱層狀態時,使用注意力機制考慮前提句子的每一個詞的隱層狀態,建立詞之間的匹配關係,最後利用最後一個隱層狀態作為最後分類的依據,在這個方法中我們看到,其實並沒有句子語義向量的表示。

該方法在詞匹配上進行了更深入的研究,不僅僅是計算他們的匹配程度,而是先求前提句中的每個詞和假設句中的所有詞之間的attention,並使用假設句中所有詞乘以attention分布,來表示前提句中的每個詞,這樣就使用了對方的語義來表示自己,假設句也是一樣。然後將得到的結果和原始的表示作拼接,通過變換,最後求一個和,得到句子的表示進行分類,該方法也是目前比較流行的方法,通過使用對方的語義來表示自己,從而對語義關係進行更好的建模。

問題

Accuracy

這是第一個也是很重要的問題,目前在SNLI數據集上,最好的結果已經做到89.3%,那麼接下來如何提升準確率呢?這是一個值得思考的問題。

Lexical Knowledge

這個問題很有意思,從數據上考慮,他只是修改了前提句中的一個詞得到假設句,對於我們人類來說,進行這樣的區分十分容易,但是由於兩個句子之間的詞的高重合度,模型可能會認為這兩個輸入是一致的,尤其是不同的兩個詞屬於同一類的時候,他們的詞向量表示會更相似。如果數據中有這樣的例子,那模型肯定沒問題,但如果訓練數據中沒有這樣的例子,但實際上如果模型能夠很好地理解語義,這個應該不是問題,而事實上這對模型來說是一個巨大的問題,對於這些詞級別的不同,模型該如何去衡量呢?

Annotation Artifacts

這也是一個很有意思的問題,如前邊所介紹的,數據集都是使用了人工,尤其是有一些數據集的假設句子全都是人寫的,理論上來說人寫的句子肯定比模型生成的好,但是人寫的句子也有一些特點,例如推理關係是Entailment的時候,可能假設句的一些名詞是前提句的上位詞(woman->people),如果是Contradiction的時候,那麼假設句中可能就有很多否定詞之類的。這些特點其實很好理解,但是如果模型發現了這些特徵,那麼它甚至可以只用假設句就能進行分類,但結果正確並沒有什麼用,模型並沒有真正理解語義。如圖作者進行了一些統計分析,可以看到有一些詞和標籤是有著緊密聯繫了,可以直接用這些詞進行分類,但這些對語義理解並沒有什麼幫助。因此如何避免這些情況,準確理解語義也是一個非常重要的研究內容。

最後

以上就是我針對自然語言推理的一個簡單介紹,作為自然語言理解的一個重要組成部分,這裡邊還是有很多很有意思的內容值得研究的。?(^?^●)?


推薦閱讀:
相关文章