法研杯參賽總結:“抽取-生成”式長文字摘要

語言: CN / TW / HK

©PaperWeekly 原創 · 作者|蘇劍林

單位|追一科技

研究方向|NLP、神經網路

“法研杯” [1] 算是近年來比較知名的 NLP 賽事之一,今年是第三屆,包含四個賽道,其中有一個“司法摘要”賽道引起了我們的興趣。經過了解,這是面向法律領域裁判文書的長文字摘要生成,這應該是國內第一個公開的長文字生成任務和資料集。過去一年多以來,我們在文字生成方面都有持續的投入和探索,所以決定選擇該賽道作為檢驗我們研究成果的“試金石”。很幸運,我們最終以微弱的優勢獲得了該賽道的第一名。在此,我們對我們的比賽模型做一個總結和分享。

▲ 比賽榜單截圖

在該比賽中,我們跳出了純粹煉丹的過程,通過新型的 Copy 機制、Sparse Softmax 等頗具通用性的新方法提升了模型的效能。整體而言,我們的模型比較簡潔有效,而且可以做到端到端執行。竊以為我們的結果對工程和研究都有一定的參考價值。

賽題分析

觀察、分析任務資料是 NLP 的第一步,也是相當重要的一步,它關係到我們後面的模型選擇,也關係到後面的提升方向。

1.1 統計資訊

這次比賽官方共提供了 9484 個標註樣本,以“(原文, 摘要)”這樣的資料對形式出現,原訓練資料還附帶了其他的一些輔助標註資訊,但為了模型的通用性,我們沒有用這些輔助資訊,所以我們的模型原則上適用於所有單條樣本格式為“(原文, 摘要)”的監督式摘要任務。

下面是訓練資料的一些統計資訊:

1、總量:9484;

2、輸入:平均字數 2568,字數標準差 1122,最大字數 13064,最小數字 866;

3、輸出:平均字數 283,字數標準差 36,最大字數 474,最小數字 66;

4、指標:以詞為單位的加權 Rouge。

因此,簡單來說這大概就是一個“輸入 3000 字、輸出 300 字”的文字生成任務,其難度在於兩千多的平均長度遠遠超出了我們平時處理的文字長度。

1.2 樣本預覽

▲ 法研杯2020司法摘要賽道樣本演示

上圖演示的是訓練集的某個樣本,其中上面是輸入(裁判文書原文),下面是輸出(人工標註的摘要),其中綠色部分標註的是兩者的“最長公共子序列”。可以看到,輸出跟輸入是高度重合的。

1.3 建模思路

綜合上述資料特性,我們不難想到應該採取“抽取+生成”相結合的方式進行摘要,並配合一些新方法來保證摘要的忠實程度與提升最終的效果。最終的模型筆者我們命名為 SPACES:

S:Sparse Softmax(新設計的 Softmax 替代品);

P:Pretraiend Language Model(預訓練模型);

A:Abstractive(抽象式,即生成式);

C:Copy Mechanism(新設計的 Copy 機制);

E:Extractive(抽取式);

S:Special Words(將特殊詞新增到預訓練模型)。

很顯然,這是筆者“煞費苦心”強行拼湊的(捂臉),對應於本人部落格的域名之一“spaces.ac.cn”。不過,上述縮寫確實已經把我們的模型的主要技術點都羅列出來了。下面我們將仔細介紹 SPACES 為何物。

抽取模型

這一節我們將對抽取模型部分做一個簡要介紹。抽取模型的思路是先通過規則將原始的生成式語料轉化為序列標註式語料,然後用筆者常用的 DGCNN 模型來建模。

2.1 語料轉換

首先,我們需要記住的是,抽取模型只是過程而不是結果,我們還要把抽取的結果送入到 Seq2Seq 模型優化。因此,抽取模型的原則是“求全”,即儘量把最終摘要所需要的資訊覆蓋到。為此,我們按照如下規則將原始訓練語料轉換為抽取式語料:

1、自行構建分句函式,使得句子的顆粒度更細;

2、人工摘要的每個句子,都在原文中匹配與之相似度最高的那個句子(可以重複匹配);

3、將所有匹配到的原文句子作為抽取句子標籤;

4、刪掉部分匹配出來的句子,使得與人工摘要的 Rouge 得分最高。

注意,我們在最終模型中刪掉了第 4 點,而它本來是我們最初版模型的預設選擇。事實上,加上第 4 點有利於提高抽取模型的指標,但是綜合生成模型後最終得分反而下降了。

這不難理解,生成模型本來有刪改功能,而且比抽取模型做得更好;如果抽取模型意外地把本應該抽取的關鍵句子刪掉了的話,那麼生成模型就很難把它恢復出來了,從而導致效能下降。也就是說,第 4 點不滿足抽取模型的“求全”原則,我們應該把刪改工作教程生成模型來做,不應該放到抽取模型中。

2.2 指標問題

上述轉換流程涉及到一個“相似度”的選擇,根據前面的介紹,本次比賽選擇“以詞為單位的加權 Rouge”作為評測指標,因此我們可以直接選擇這個加權 Rouge 作為相似度指標。事實上,我們一開始確實是這樣做的,但是後來在除錯的時候發現,這樣並不是一個好的選擇,我們最終選擇的是“以字為單位的加權 Rouge”。

這兩者有什麼區別呢?對於以詞為單位來算評測指標的做法,我們也不難理解其目的,就是為了使得專有名詞能夠完全匹配上。比如本來是“中華人民共和國未成年人保護法”,你預測成了“中華人民共和國文物保護法”,如果以字為單位的話,最長公共子序列為“中華人民共和國xxx保護法”,至少還是算對了大部分,但是如果以詞為單位的話,兩者就是不同的詞,因此算全錯。因此,以詞為單位有利於專有名詞匹配得更精準

然而,以詞為單位會帶來一個嚴重的副作用,那就是降低了長詞的權重。比如“根據 《 中華人民共和國未成年人保護法 》 的 有關 規定”中,核心詞“中華人民共和國未成年人保護法”的權重僅為 1,剩下的“根據”、“《”、“》”、“的”等我們認為無關緊要的詞權重分別都為 1,佔了大部分,這樣一來,模型寧願去匹配“根據”、“《”、“》”、“的”等詞,也不願意去擬合核心詞“中華人民共和國未成年人保護法”了。說白了,以詞為單位的話,得分高的摘要未必是有什麼關鍵資訊的摘要。 

那怎麼調和兩者呢?事實上,最好的方案應該還是以詞為單位,但是算指標的時候,按照字數跟每個詞加權,比如“中華人民共和國未成年人保護法”,匹配不上就給 0 分,匹配對了就給 14 分(因為有 14 個字)而不是 1 分才好。不過,這需要自己來實現 Rouge 計算函式,有點麻煩,我們最終是直接選擇以字為單位來算加權 Rouge,這也勉強夠用,因為在轉換語料的時候,我們知道摘要和原文都是在描述同一件案子,因此基本不會出現“中華人民共和國未成年人保護法”預測成“中華人民共和國文物保護法”的情況。

2.3 模型結構

回到模型方面,我們使用的是以句為單位的序列標註模型作為抽取模型,句向量部分用“BERT+平均池化”來生成,並固定不變,標註模型主體方面則用 DGCNN 模型構建。關於 DGCNN 模型,請參考基於 CNN 的閱讀理解式問答模型:DGCNN、開源一版 DGCNN 閱讀理解問答模型(Keras版)[2] 、基於DGCNN和概率圖的輕量級資訊抽取模型等。

▲ SPACES的抽取模型示意圖

值得指出的一個細節是,在訓練抽取模型的時候,我們是以 0.3 為閾值做 EarlyStop 的,但最終以  0.2  為閾值構建生成模型的資料,依據還是前面說的抽取模型的原則是要“求全”。

2.4 輸出資料

我們需要將原文作為輸入,通過抽取模型輸出抽取摘要,然後把抽取摘要作為生成模型的輸入,來輸出最終摘要。但是,這有一個問題,訓練的資料我們都是見過的,但我們真正預測的是未見過的資料,如果直接訓練一個抽取模型,然後用該模型抽取訓練集的摘要,那麼很明顯由於都被訓練過了,抽取出來的摘要分數肯定會偏高,而新樣本的效果則會偏低,造成訓練預測的不一致性。

這時候的解決方案就是交叉驗證了。具體來說,我們將標註資料分為 n 份,其中 n-1 份訓練抽取模型,然後用這個抽取模型預測剩下的那份資料的抽取摘要,如此重複 n 遍,就得到全部資料的抽取摘要,並且儘可能地減少了訓練和預測階段的不一致性。

生成模型

生成模型是我們投入主要時間的部分,也是我們的主要貢獻點。生成模型就是一個Seq2Seq 模型,以抽取模型的輸出結果作為輸入、人工標註的摘要作為輸出進行訓練,我們可以理解為是對抽取結果做進一步的“潤色”。

3.1 模型總覽

如果用一張圖概括我們的生成模型,那麼大概如下:

▲ SPACES的生成模型示意圖

接下來我們會介紹模型的各個模組。

3.2 基礎架構

Seq2Seq模型依然選擇了經典的UniLM(參考從語言模型到 Seq2Seq:Transformer 如戲,全靠 Mask),並且考慮到“輸入+輸出”的總長度基本上都超過 512 了,所以選擇華為的 NEZHA 模型作為基礎模型架構,因為 NEZHA 使用了相對位置編碼,不限長度。

當然,這是當時的選擇,現在的話我們至少還有如下兩個選擇:

1、參考層次分解位置編碼,讓 BERT 可以處理超長文字中的直接延拓絕對位置編碼的做法,使得 BERT 有能力直接處理更長序列(理論上可達 26 萬),自然也可以用於“BERT+UniLM”中;

2、使用那個屠榜的 T5 模型,現在可以在中文上玩玩了 [3] 的多國語言版 T5 模型(mT5),它用的也是相對位置編碼,不限長度,但要注意 T5 用的 tokenizer 會將全形逗號轉為半形逗號,這會導致評測分數下降。

此外,在使用預訓練模型方面,我們首創地將部分詞語加入到了 NEZHA 模型中,改變了中文預訓練模型以字為單位的通用選擇,這使得模型的效果和速度都有一定的提升。這部分結果已經發布在之前的文章提速不掉點:基於詞顆粒度的中文 WoBERT [4] 之中,讀者可以移步參考。

3.3 BIO Copy

Copy機制在摘要生成模型中並不新鮮,甚至可以說已經成為了生成式摘要的標配了。常規的 Copy 機制一般就是 PointerNet [5] 的做法,但這種做法有兩個不足之處:1)每次只能 Copy 一個 token,不能保證 Copy 一個連續片段(n-gram)出來;2)實現起來比較複雜,不夠即插即用。為此,我們構思了一種新型的 Copy 機制,暫時稱為 BIO Copy,它實現起來非常簡單,而且具有 Copy 連續片段的能力。

其實前面的圖示已經展示了這種 Copy 機制,它其實就是在 Decoder 部分多加一個序列預測任務,即原來 Decoder 建模的是每個 Token 的分佈 ,現在多預測一個標籤分佈,變為:

其中 ,含義如下:

B:表示該 token 複製而來;

I:表示該 token 複製而來且跟前面 Token 組成連續片段;

O:表示該 token 不是複製而來的。

那麼,訓練時 z 的標籤哪裡來呢?這裡直接採用一種比較簡單的方法:算摘要與原文的“最長公共子序列”,只要是出現在最長公共子序列的 token,都算是 Copy 過來的,根據 BIO 的具體含義設定不同的標籤。比如前面圖片中的例子,“我 真的 非常 熱愛 我 的 祖國”與“我 愛 我 的 祖國”的最長公共子序列“我 我 的 祖國”,其中第一個“我”是單字,標籤為 B,後面“我 的 祖國”是一個連續片段,標籤為“B I I”,其他標籤為 O,所以總的標籤為“B O B I I”。

所以,在訓練階段,其實就是多了一個序列預測任務,並且標籤都是已知的,實現起來很容易,也不增加什麼計算成本。至於預測階段,對於每一步,我們先預測標籤 z_t,如果 z_t 是 O,那麼不用改變,如果 z_t 是B,那麼在 token 的分佈中 mask 掉所有不在原文中的 token,如果 z_t 是 I,那麼在 token 的分佈中 mask 掉所有不能組成原文中對應的 n-gram 的 token。也就是說,解碼的時候還是一步步解碼,並不是一次性生成一個片段,但可以通過 mask 的方式,保證 BI 部分位置對應的 token 是原文中的一個片段。

需要指出的是,Copy 機制的引入未必能明顯提高分數,印象中好像只提升了 0.5% 左右,但是 Copy 機制可以保證摘要與原始文字的忠實程度,避免出現專業性錯誤,這在實際使用中是相當必要的。

3.4 稀疏Softmax

在這次比賽中,我們還發現了一個 Softmax 及交叉熵代替品,我們稱之為 Sparse Softmax,我們發現 Sparse Softmax 可以在相當多的分類問題(包括常規分類問題和文字生成等)中替換掉 Softmax,並且效果能得到一定的提升。

Sparse Softmax的思想源於 From Softmax to Sparsemax: A Sparse Model of Attention and Multi-Label Classification [6]、Sparse Sequence-to-Sequence Models [7] 等文章,裡邊作者提出了將 Softmax 稀疏化的做法來增強其解釋性乃至提升效果。但筆者嫌裡邊的設計太麻煩,於是自己想了一個更簡單的版本:

其中 是將 從大到小排列後前 k 個元素的下標集合。說白了,我們提出的 Sparse Softmax 就是在計算概率的時候,只保留前 k 個,後面的直接置零,k 是人為選擇的超引數,這次比賽中我們選擇了 k=10。在算交叉熵的時候,則將原來的對全體類別 操作,改為只對最大的 k 個類別進行,其中 t 代表目標類別。

為什麼稀疏化之後會有效呢?我們認為這是因為避免了 Softmax 的過度學習問題。假設已經成功分類,那麼我們有 (目標類別的分數最大),此時我們可以推導原始交叉熵的一個不等式:

假設當前交叉熵值為 ,那麼解得:

我們以 為例,這時候 ,那麼 。也就是說,為了要 loss 降到 0.69,那麼最大的 logit 和最小的 logit 的差就必須大於 ,當 n 比較大的時候,對於分類問題來說這是一個沒有必要的過大的間隔,因為我們只希望目標類的 logit 比所有非目標類都要大一點就行,但是並不一定需要大 那麼多,因此常規的交叉熵容易造成過度學習而導致過擬合,而截斷之後就不會有這個問題。

在這次比賽中,Sparse Softmax 帶來的提升可能(沒有細測)有 2% 左右!通過,我們私下還補充做了很多實驗,包括 NLP 和 CV 的,發現它在大多數任務上都有 1% 的提升,所以非常歡迎大家嘗試!不過,我們也發現,Sparse Softmax 只適用於有預訓練的場景,因為預訓練模型已經訓練得很充分了,因此 finetune 階段要防止過擬合;但是如果你是從零訓練一個模型,那麼 Sparse Softmax 會造成效能下降,因為每次只有 k 個類別被學習到,反而會存在學習不充分的情況(欠擬合)。

3.5 其他細節

在訓練生成模型的時候,我們加入了 EMA(權重滑動平均),這能使得訓練過程更加穩定,甚至可能提升模型效果。事實上,EMA 基本是筆者打比賽的標配,它能讓我們省一些除錯訓練策略的心。

其外,在談到 BIO Copy 機制時,我們說到理論上只需要在 Decoder 處新增一個 BIO 預測,不過在實際訓練的時候,我們同時在 Encoder 和 Decoder 處都加了,我們發現這樣能提升模型的最終效果。直觀來想的話,起作用的原因應該是同時加的話增強了 Encoder 和 Decoder 之間的同步性,能夠引導 Decoder 更精準地 Attention 到 Encoder 的合理的位置。

至於其他要補充的,還在想,想到了再補充吧。

程式碼開源

SPACES 模型的原始碼已經發布在 Github 上:

SPACECS:https://github.com/bojone/SPACES

使用說明在 Github 上也有介紹,這裡就不重複了,有問題可以提 issue 或者留言。開源是技術進步的動力,在非利益相關的情況下,筆者會盡量做到開源,也鼓勵大家開源。

可能有讀者想看看當前的自動摘要能生成到什麼程度了,這裡演示一個例子吧(驗證集的樣本,無人工修改,第一行是原文,第二行是標準摘要,第三行是模型摘要,綠色部分是標準摘要與模型摘要的最長公共子序列):

▲ 最終生成效果演示(一)

▲ 最終生成效果演示(二)

文章小結

本文總結了我們做法研杯司法摘要任務的經驗,提出了一個名為 SPACES 的長文字摘要模型,它通過“先抽取後生成”的方式,結合了我們自研的 BIO Copy 機制、Sparse Softmax 等方法,最終可以得到比較靠譜的摘要結果,歡迎大家交流使用。

參考文獻

[1] http://cail.cipsc.org.cn/

[2] https://kexue.fm/archives/6906

[3] https://kexue.fm/archives/7867

[4] https://kexue.fm/archives/7758

[5] https://arxiv.org/abs/1506.03134

[6] https://arxiv.org/abs/1602.02068

[7] https://arxiv.org/abs/1905.05702

更多閱讀

#投 稿 通 道#

 讓你的論文被更多人看到 

如何才能讓更多的優質內容以更短路徑到達讀者群體,縮短讀者尋找優質內容的成本呢?答案就是:你不認識的人。

總有一些你不認識的人,知道你想知道的東西。PaperWeekly 或許可以成為一座橋樑,促使不同背景、不同方向的學者和學術靈感相互碰撞,迸發出更多的可能性。 

PaperWeekly 鼓勵高校實驗室或個人,在我們的平臺上分享各類優質內容,可以是最新論文解讀,也可以是學習心得技術乾貨。我們的目的只有一個,讓知識真正流動起來。

???? 來稿標準:

• 稿件確係個人原創作品,來稿需註明作者個人資訊(姓名+學校/工作單位+學歷/職位+研究方向) 

• 如果文章並非首發,請在投稿時提醒並附上所有已釋出連結 

• PaperWeekly 預設每篇文章都是首發,均會新增“原創”標誌

???? 投稿郵箱:

• 投稿郵箱:[email protected] 

• 所有文章配圖,請單獨在附件中傳送 

• 請留下即時聯絡方式(微信或手機),以便我們在編輯釋出時和作者溝通

????

現在,在「知乎」也能找到我們了

進入知乎首頁搜尋「PaperWeekly」

點選「關注」訂閱我們的專欄吧

關於PaperWeekly

PaperWeekly 是一個推薦、解讀、討論、報道人工智慧前沿論文成果的學術平臺。如果你研究或從事 AI 領域,歡迎在公眾號後臺點選「交流群」,小助手將把你帶入 PaperWeekly 的交流群裡。