乾貨 | 如何從編碼器和解碼器兩方面改進生成式句子摘要?

微软研究院AI头条發表於2018-03-28

編者按:文字自動摘要是自然語言處理研究中重要的組成部分之一,如何才能獲得高質量的摘要文字是許多研究者非常關心的問題。本文中,哈爾濱工業大學—微軟亞洲研究院聯合培養博士生周青宇向大家講述了他是如何從編碼器和解碼器兩方面改進生成式句子摘要的。一起來學習一下吧!

線上分享影片回顧

(以下為周青宇分享的文字整理)

我們本次的主題是從編碼器端和解碼器端來改進生成式句子摘要,我將主要從以下三個部分來向大家進行講解:

一、對背景知識、句子摘要和一些相關工作的介紹。

二、介紹一下如何從編碼器端改進生成式句子摘要。

三、介紹一下如何從解碼器端改進生成式句子摘要。

一、背景介紹

文字自動摘要是指給出一段文字,我們從中提取出要點,然後再形成一個短的概括性的文字

文字自動摘要可以分成不同的種類。按照輸入文字的類別來分,輸入最短的是句子摘要,輸入稍微長一點的是單文件級的摘要,在單文件級別摘要之上還有多文件的摘要

除了按照輸入文件的類別來分,文字自動摘要還可以按照產生摘要的方式劃分為抽取式摘要生成式摘要。抽取式摘要,顧名思義就是從原始文字中原封不動地抽取單詞或句子,來形成一個摘要。而生成式摘要比較接近於我們先理解文字內容,然後再自己寫出一段話來對給定的文字進行概括的一種方式。除此之外,我們還可以從其它角度來劃分,比如有query focused的摘要,它給定一個查詢,系統給出這個文件針對這個查詢的摘要。針對不同的查詢,系統可以給出不同的摘要。

乾貨 | 如何從編碼器和解碼器兩方面改進生成式句子摘要?

接下來,我分別簡單介紹一下抽取式和生成式摘要。

抽取式摘要主要是做一個序列標註的任務,相當於我們對句子中的每個詞進行0、1的分類。比如標1就是把這個詞選下來,這樣就可以用抽取式的方法從句子中抽一些重點的詞,再將這些重點詞作為句子的摘要。句子摘要過去常被叫做句子壓縮,用於文件摘要中。

那要怎麼用呢?在抽取文件摘要時,我們可能會抽取出一個比較長的句子,然後採用句子壓縮的方法把這個句子“剪短”。把句子“剪短”有什麼好處呢?在過去的DUC任務中,文件對於輸出摘要的長度有所限制,如果選一個特別長的句子達到了它的長度限制,後面就無法選更多的句子了。透過使用句子壓縮的辦法,就可以為接下來選擇更多句子留下更多空間。

生成式摘要基本上都是基於序列到序列(Sequence-to-Sequence)模型的。帶注意力模型的Sequence-to-Sequence的編碼器就是一個雙向的GRU,或者是雙向的LSTM,可以將輸入的句子進行編碼。在解碼的時候,它也是由一個GRU或者是LSTM作為一個解碼器。這個注意力機制實際上是一個匹配的演算法,它可以將當前解碼器的狀態和輸入句子中隱藏的狀態進行匹配。

乾貨 | 如何從編碼器和解碼器兩方面改進生成式句子摘要?

隨著深度學習的發展,近幾年生成式摘要的研究獲得了較多關注,今天我們也主要關注生成式的方法。

二、如何從編碼器端改進生成式的句子摘要

首先介紹一下我們如何從編碼器端改進生成式句子摘要。這是我們2017年在ACL上的一個工作,今天介紹的工作也都是我在微軟亞洲研究院實習期間完成的。

如此前所說,生成式句子摘要是一個序列到序列的模型。之前很多人的相關工作都採用了注意力機制,這個注意力機制實際上提供了一個詞對齊的資訊,就是從輸出端的詞到輸入端的詞中間有一個對齊的表,比如說“我們”就對齊到“we”。但是我們認為在摘要這個過程中,除了被抽取出來的那些原封不動的複製詞,剩下的詞不存在這樣一個詞對齊的關係,因為對於這些詞並沒有可以對齊的地方

乾貨 | 如何從編碼器和解碼器兩方面改進生成式句子摘要?

另外,之前一些模型其實都沒有對摘要這個任務進行一些建模。我們可以考慮一下為什麼要做摘要?做摘要的目的是要抽取出輸入中比較重要的部分。基於這一點,我們提出了一個模型,它能決定輸入中哪個詞是重要的。

我們提出的這個模型叫“選擇性編碼模型”,它對輸入句子中的每個詞都會進行建模,這個建模的方法是基於一個已經編碼好的句子,我們利用這個句子的資訊來判斷句中的詞是否重要,由此來構建一個輸入句子中詞的新的表示。我們把這樣一個選擇的過程稱之為選擇性編碼,而這個模型就叫做選擇性編碼模型”。

乾貨 | 如何從編碼器和解碼器兩方面改進生成式句子摘要?

首先,我們看一下這個模型的框架,它還是一個基於序列到序列的模型。區別在於我們提出了選擇性門網路它選擇輸入句子當中哪一部分是重要的。例如我們的模型示例圖中畫了6個詞。讀了一遍句子之後,我們可以感覺到這個句子中的哪些詞比較重要,然後就由這個網路來判定句子中哪些詞比較重要,由此我們對這6個詞分別構建出來一個新的表示。接下來我們使用了一個解碼器,但不是基於它原始的表示,而是基於我們新構建的這一層表示來進行解碼的。

乾貨 | 如何從編碼器和解碼器兩方面改進生成式句子摘要?

這個模型當中的第一層的基礎編碼器實際上跟之前序列到序列的模型一樣,使用一個GRU來作為我們的RNN。這個解碼器跟機器翻譯當中的解碼器差不多,但不同的點在於它用來解碼的這些向量表示不是我們解碼器直接給出來的,而是透過選擇性編碼給出來的。我們先讀完一個句子,知道它的意思,然後構造出來這個句子含義的表示。在這裡我們採取了一種最簡單的方法——將雙向GRU的正向最後一個隱藏和反向最後一個隱藏給拼起來,也就是h1和hn它的正向和反向拼起來,把這個作為整個句子含義的表示。有了這個句子的含義表示,我們就可以根據這個句子的含義表示來選擇輸入的詞,從而判斷這個句子中的哪個詞更重要。

乾貨 | 如何從編碼器和解碼器兩方面改進生成式句子摘要?

如何從解碼器端改進生成式的句子摘要

那我們從解碼器端該怎麼改進呢?這個是我們發表在今年AAAI上的一篇文章,叫做“Sequential Copying Networks”,改進了一下現在的CopyNet。如果大家感興趣的話可以在這個網址上下載poster:

https://res.qyzhou.me/AAAI2018_poster.pdf

人在做句子摘要的時候會先讀句子,然後選重點詞,然後把它寫下來。人在寫的時候是怎麼樣寫的呢?其實可以用一個記號筆把重要的部分直接copy過來。我們給了一個在Gigaword這個資料集上找的例子,可以看到它複製的部分是比較多的,比如說把“安全機制”、“海外大使館”兩個詞都複製了過來。

乾貨 | 如何從編碼器和解碼器兩方面改進生成式句子摘要?

我們推測在生成句子摘要的時候複製的地方會比較多。然後想在資料集上統計一下這個推測是否是正確的,所以就在Gigaword這個訓練集上統計了一下生成詞和複製詞的百分比。可以看到生成的詞佔了42.5%,剩下的詞全都是複製出來的。我們還分別統計了複製一個詞、複製兩個詞和複製三個詞的情況。可以看到,複製兩個詞以上的複製大概能佔到三分之一。這其實也驗證了我們的觀點,序列複製在很多工中都是存在的

乾貨 | 如何從編碼器和解碼器兩方面改進生成式句子摘要?

基於這個觀察,我們就提出了一個序列複製模型。序列複製模型要做的事情比較簡單,它是在序列到序列模型當中將序列化的複製結合進來。

這是我們模型整個的總覽。可以看到它也是由一個編碼器和解碼器構成的,在解碼器的階段會有一個複製的操作。在之前的複製模型中,由於每次複製都要有一個決策的過程——複製還是不複製,如果要複製三個詞,機器就要做三個決策,有可能在中間的某一次決策中它犯錯了,或者它這次沒有選擇複製,它選擇了生成,或者它複製錯了,這種情況下就可能導致這三個連續的詞沒有被複製過來。而我們的方法是如果機器決定要複製了,則直接複製一段。比如說三個詞,直接把這三個詞整個複製過來,這樣就省去了要做三次決策的過程。

乾貨 | 如何從編碼器和解碼器兩方面改進生成式句子摘要?

細緻一點來介紹,我們的模型主要是做一個片斷的選擇,用三個模組來做這個片斷的預測。

第一,我們做了一個門,這個門是用來控制是否要複製的,它會產生一個在0、1之間的機率值來決定當前是複製還是不複製。

第二,我們做了一個pointer network,我們用這個pointer network來選擇要複製的這個片語的起始位置和結束位置

第三,我們設計了一個copy state transducer。它的主要作用是幫助pointer network來進行一個片斷的選擇

乾貨 | 如何從編碼器和解碼器兩方面改進生成式句子摘要?

首先我們定義了一個解碼器的狀態。這個狀態包含很多資訊,比如前一時刻的詞、當前時刻的上下文等。利用這個狀態,我們來預測複製的機率。這個G是一個MLP,我們用一個MLP來把這個mt對映到一個實數,在MLP後面加了一個sigmoid函式,來預測當前複製的機率。生成的機率很自然的就是1減去這個複製的機率。

乾貨 | 如何從編碼器和解碼器兩方面改進生成式句子摘要?

有了機率之後,我們就可以進行預測了。假如說模型目前是複製模式,我們就要預測到底複製了哪個片斷出來。第一步就是要選擇複製片斷的起始位置,我們是透過下面這個方式算的。先構建了一個起始位置查詢的向量,叫qs。qs就是把解碼器當前定義的狀態過了一個MLP,我們獲得了這樣一個起始位置的查詢向量qs

乾貨 | 如何從編碼器和解碼器兩方面改進生成式句子摘要?

有了qs之後,我們直接把它作為一個pointer network的輸入。在整個句子中做了一個Attention,可以看到COPYs是取機率最大的位置。從這個圖例中我們看到系統用qs在輸入當中進行了一個Attention,最大的位置我們假設是12,它就選擇出來COPY的起始位置是12。

接下來要預測這個片斷結尾的位置。我們構建了一個結尾位置的查詢向量叫qe。這個qe的構建方法就用到了剛才提到的copy state transducer。它的作用實際上是把qs轉到qe。為什麼要把qs轉到qe呢?因為它在預測起始位置和預測結束位置的時候,結束位置肯定是要考慮到初始位置的一些資訊以及當前解碼器的資訊,它才能根據當前解碼器的狀態以及選擇的起始位置來選擇一個正確的結束位置,進而把這個正確的片斷選擇出來。

乾貨 | 如何從編碼器和解碼器兩方面改進生成式句子摘要?

我們在這個地方使用了一個GRU來實現copy state transducer。將預測開始位置的上下文向量cs,作為GRU的輸入。這個GRU的起始狀態是用一個MLP進行初始化的,這個初始化的輸入是解碼器的狀態mt。透過這兩種方式,我們就獲得了結束位置的查詢向量qe。得到結束位置的查詢向量之後,再採用與預測開始位置相同的方法即可得到結束位置。

總結一下,我們在序列到序列的模型基礎上引入了序列複製機制。與之前的CopyNet相比,我們提出的SeqCopyNet則可以進行多個詞的複製。在這個過程中並不需要多步複製,而是一步複製,這樣可以減少一些在複製過程中由於進行多次決策來引入的錯誤。除此之外,我們還發現一些比較有趣的現象,就是我們的SeqCopyNet模型在檢測邊界方面也有著很好的表現。

關於生成式句子摘要,你有不同的想法或者問題麼?歡迎在評論區跟我們留言互動!

相關文章