本文被收錄于深度學(xué)習(xí)知識(shí)庫相關(guān)背景維基百科對(duì)自動(dòng)摘要生成的定義是, “使用計(jì)算機(jī)程序?qū)σ欢挝谋具M(jìn)行處理, 生成一段長度被壓縮的摘要, 并且這個(gè)摘要能保留原始文本的大部分重要信息”. 摘要生成算法主要分為抽取型(Extraction-based)和概括型(Abstraction-based)兩類. 傳統(tǒng)的摘要生成系統(tǒng)大部分都是抽取型的, 這類方法從給定的文章中, 抽取關(guān)鍵的句子或者短語, 并重新拼接成一小段摘要, 而不對(duì)原本的內(nèi)容做創(chuàng)造性的修改. 這類抽取型算法工程上已經(jīng)有很多開源的解決辦法了, 例如Github上的項(xiàng)目sumy, pytextrank, textteaser等. 本文重點(diǎn)講概括型摘要生成系統(tǒng)的算法思想和tensorflow實(shí)戰(zhàn), 算法思想源于A Neural Attention Model for Abstractive Sentence Summarization這篇論文. 本文希望幫助讀者詳細(xì)的解析算法的原理, 再結(jié)合github上相關(guān)的開源項(xiàng)目textsum講解工程上的實(shí)際應(yīng)用.本文由PPmoney大數(shù)據(jù)算法團(tuán)隊(duì)撰寫,PPmoney是國內(nèi)領(lǐng)先的互聯(lián)網(wǎng)金融公司,旗下PPmoney理財(cái)總交易額超過700億元。此外,若對(duì)TensorFlow的使用技巧和方法感興趣,歡迎閱讀本團(tuán)隊(duì)負(fù)責(zé)人黃文堅(jiān)所著的《TensorFlow實(shí)戰(zhàn)》。 2 算法原理下面對(duì)A Neural Attention Model for Abstractive Sentence Summarization這篇文章, 的算法原理進(jìn)行講解. 我們將這個(gè)模型簡稱為NAM. 主要分為模型訓(xùn)練(train)和生成摘要(decode)兩部分講解. 2.1 模型訓(xùn)練(train) NAM這個(gè)模型是純數(shù)據(jù)驅(qū)動(dòng), 我們喂給它的訓(xùn)練集數(shù)據(jù)是由一系列{正文: 摘要}對(duì)組成. 假設(shè)正文是x=[x1...xM], M是正文詞符的數(shù)量, 對(duì)應(yīng)的摘要為y=[y1...yN], N是摘要單詞的數(shù)量. 對(duì)于給定的數(shù)據(jù), 我們希望給定x生成摘要為y的概率最大, 即maxθlogp(y|x;θ), θ是模型的參數(shù). 但這個(gè)很難求解, 實(shí)際中我們用序列化的方式實(shí)例化這個(gè)目標(biāo), 原來的目標(biāo)函數(shù)變?yōu)? maxθ∑i=0N?1logp(yi+1|xyc;θ)這里 yi+1是要預(yù)測(cè)的下一個(gè)詞, yc?y[i?C+1...i]是已知的序列, C是已知序列窗口的長度. 后面會(huì)提到, 這個(gè)窗口的位置也是注意力關(guān)注的位置, 在后面的訓(xùn)練過程中會(huì)根據(jù)學(xué)習(xí)到的權(quán)重調(diào)整不同位置注意力的概率大小. 這個(gè)窗口是隨著i的迭代來滑動(dòng)的. 參數(shù)說明: y: 參考摘要所有單詞向量組成的序列 x: 正文的所以單詞向量組成的序列 i: 當(dāng)前評(píng)估函數(shù)所對(duì)應(yīng)的位置 yc: 當(dāng)前訓(xùn)練的窗口對(duì)應(yīng)的局部摘要序列 yi+1: 模型要預(yù)測(cè)的下一個(gè)單詞 下面我們舉一個(gè)例子來說明訓(xùn)練的過程: 打開應(yīng)用保存高清大圖 打開應(yīng)用保存高清大圖
感興趣的同學(xué)可以結(jié)合原文中的公式理解: 上圖(a)中對(duì)應(yīng)的公式: p(yi+1|xyc;θ)∝exp(Vh+Wenc(xyc))yc~=[Eyi?C+1...Eyi]h=tanh(Uyc~)參數(shù)是: θ=(EUVW) E∈?D×V, 是一個(gè)詞嵌入矩陣; U∈?(CD)×HV∈?V×HW∈?V×H, 是權(quán)重矩陣. 上圖(b)中對(duì)應(yīng)的公式:enc3(xyc)=pTxˉp∝exp(x? Pyc~′)x? =[Fx1...FxM]yc~′=[Gyi?C+1...Gyi]?ixˉi=∑q=i?Qi+Qx? i/Q這里G∈?D×V是一個(gè)內(nèi)容的嵌入, P∈?H×(CD)是一個(gè)新的權(quán)重矩陣參數(shù), Q是一個(gè)平滑窗口. Mini-batch訓(xùn)練 這個(gè)模型是純數(shù)據(jù)驅(qū)動(dòng)的, 只要給它{正文: 摘要}訓(xùn)練集就能完成訓(xùn)練. 一旦我們已經(jīng)定義了局部條件模型p(yi+1|xyc;θ), 我們就能估計(jì)參數(shù)來最小化摘要集合的負(fù)對(duì)數(shù)似然函數(shù). 假設(shè)訓(xùn)練集由J個(gè)輸入-摘要對(duì)組成(x(1)y(1))...(x(J)y(J)). 負(fù)對(duì)數(shù)似然函數(shù)作用到摘要的每一個(gè)詞, 即 NLL(θ)=?∑j=1Jlogp(y(j)|x(j);θ)=?∑j=1J∑i=1N?1logp(y(j)i+1|x(j)yc;θ)我們通過使用mini-batch和隨機(jī)梯度下降最小化NLL. 2.2 Beam Search生成摘要(decode) 我們現(xiàn)在回到生成摘要的問題. 回顧前面, 我們的目標(biāo)是找到: y?=argmaxy∈∑i=0N?1logp(yi+1|xyc;θ)是長度為N的序列y組成的集合, 如果字典中的單詞數(shù)量是V的話, 我們要生成的這個(gè)摘要就有VN種可能性. 因?yàn)槲覀冞@里已經(jīng)做了處理, 只根據(jù)前面的C個(gè)已經(jīng)預(yù)測(cè)出的單詞yc來預(yù)測(cè)下一個(gè)詞yi+1. 這樣算法復(fù)雜度變成了O(NVC). 但是即使是這樣, 這個(gè)算法也太復(fù)雜了. 使用維特比譯碼需要O(NVC).復(fù)雜度獲得精確的解. 然而在實(shí)際中V太大使得問題難解. 一個(gè)替代方法是使用貪婪解來近似獲得argmax, 只保證每次前進(jìn)的一小步是概率最大的. 在精確解和貪婪解方法之間取一個(gè)折中, 就是beam-search束搜索解碼器(Algorithm1), 它在保持全量字典V的同時(shí), 在輸出摘要的每一個(gè)位置上將自己限制在K個(gè)潛在的假設(shè)內(nèi). 這種beam-search方法在神經(jīng)機(jī)器翻譯模型NMT也很常用. Beam search算法展示如下: 打開應(yīng)用保存高清大圖 Beam search案例 下面舉一個(gè)簡單的例子來說明beam search算法的運(yùn)行過程. 在這個(gè)例子里, 摘要長度N=4, beam的大小K=6, 注意力窗口大小C=2, 模型最理想的結(jié)果是‘i am a chinese’. Beamsearch的每一次迭代都從字典V里找K個(gè)最大的可能. 打開應(yīng)用保存高清大圖 打開應(yīng)用保存高清大圖 打開應(yīng)用保存高清大圖 打開應(yīng)用保存高清大圖 打開應(yīng)用保存高清大圖 打開應(yīng)用保存高清大圖 Beam Search算法分析
Beam Search的運(yùn)算復(fù)雜度從O(NVC)變成了O(KNV), 因?yàn)?span>VN和K, 加速效果非常顯著. 束搜索依據(jù)已經(jīng)計(jì)算好的路徑以及當(dāng)前的V個(gè)備選值, 計(jì)算出最優(yōu)的K的值. 最新的K個(gè)最優(yōu)值都保留著相應(yīng)路徑上之前的所有的節(jié)點(diǎn). 3 TensorFlow程序?qū)崙?zhàn)NAM模型的程序最早是由facebook開源的torch版本的程序. 最近谷歌開源了TensorFlow版本的摘要生成程序textsum, Github上的項(xiàng)目. textsum的核心模型就是基于注意力的seq2seq(sequence-to-sequence)模型, textsum使用了LSTM和深度雙向RNN. Github上的textsum首頁給出了此項(xiàng)目在Bazel環(huán)境下的運(yùn)行方式. 如果你不想通過Bazel運(yùn)行, 你可以直接在seq2seq_attention.py中設(shè)定運(yùn)行參數(shù). 設(shè)定完參數(shù)后, 直接運(yùn)行python seq2seq_attention.py即可. 參數(shù)設(shè)定如下圖所示: 打開應(yīng)用保存高清大圖 打開應(yīng)用保存高清大圖 textsum程序解析 Google開源的textsum項(xiàng)目的具體算法是基于Hinton 2014年的Grammar as a Foreign Language這篇論文, 下面給出textsum工程中attention-based seq2seq模型的整體結(jié)構(gòu)圖, 圖中所使用的名字與程序中的變量名一致, Seq2SeqAttentionModel是一個(gè)類, 定義在seq2seq_attention_model.py中; attention_decoder是一個(gè)函數(shù), 定義在/tensorflow/contrib/legacy_seq2seq/python/ops/seq2seq.py中. 為了方便理解, 簡單解釋一下圖中出現(xiàn)的符號(hào), 打開應(yīng)用保存高清大圖 打開應(yīng)用保存高清大圖 打開應(yīng)用保存高清大圖 打開應(yīng)用保存高清大圖 打開應(yīng)用保存高清大圖 為什么attention這個(gè)模塊會(huì)起到效果呢? 因?yàn)閍ttention模塊會(huì)根據(jù)decoder當(dāng)前時(shí)刻的LSTM單元的狀態(tài), 來調(diào)整對(duì)attention_states(encoder輸出)的注意力. Attention_states不同位置獲得的關(guān)注不一樣. 這樣我們就更大程度地, 關(guān)注了原文中, 對(duì)當(dāng)前輸出更為有用的信息, 輸出結(jié)果也就更準(zhǔn)確了. Attention模塊輸出結(jié)果和decoder模塊原本的輸出聯(lián)合起來, 得到最終的輸出結(jié)果. 作者黃文堅(jiān),《TensorFlow實(shí)戰(zhàn)》作者,該書獲得Google TensorFlow工程研發(fā)總監(jiān)Rajat Monga、360首席科學(xué)家顏水成教授、北大長江學(xué)者崔斌教授的推薦,出版后曾獲京東、亞馬遜、當(dāng)當(dāng)計(jì)算機(jī)類圖書銷量第一?,F(xiàn)任職PPmoney大數(shù)據(jù)算法總監(jiān),負(fù)責(zé)集團(tuán)的風(fēng)控、理財(cái)、互聯(lián)網(wǎng)證券等業(yè)務(wù)的數(shù)據(jù)挖掘工作。Google TensorFlow Contributor。本科、研究生畢業(yè)于香港科技大學(xué),在頂級(jí)會(huì)議和期刊SIGMOBILE MobiCom、IEEE Transactions on Image Processing發(fā)表論文,并獲得兩項(xiàng)美國專利和一項(xiàng)中國專利。 知識(shí)庫系列內(nèi)容請(qǐng)?jiān)L問 |
|