http://blog.csdn.net/malefactor/article/details/50725480網絡
/* 版權聲明:能夠任意轉載,轉載時請標明文章原始出處和做者信息 .*/
框架
author: 張俊林 工具
序列標註問題應該說是天然語言處理中最多見的問題,並且極可能是最而沒有之一。在深度學習沒有普遍滲透到各個應用領域以前,傳統的最經常使用的解決序列標註問題的方案是最大熵、CRF等模型,尤爲是CRF,基本是最主流的方法。隨着深度學習的不斷探索和發展,極可能RNN模型會取代CRF的傳統霸主地位,會成爲解決序列標註問題的標配解決方案。性能
本文主要抽象出利用RNN解決序列標註問題的通用優化思路。這個RNN優化思路應該說是使用場景很是普遍,目前NLP中絕大多數問題均可以套用這套優化思路來統一解決問題。它有個獨特的好處,就是說只要你構建好完整的這一套優化模型,絕大多數NLP的問題,包括分詞、詞性標註、命名實體識別、關鍵詞抽取、語義角色標註等等,等於說問題已經被解決了,只須要你使用不一樣問題對應的訓練數據跑一遍,就等於說上面問題的實際解決工具你就擁有了,而不用像傳統模型同樣還須要不判定義問題特徵模板等,這就是End-to-End的好處。學習
再囉嗦兩句,爲何說RNN必定會取代CRF?固然這不表明CRF徹底會被拋棄,之後必定有人去研究怎麼結合RNN和CRF,這個估計也沒有疑問。可是RNN取代CRF得到主流地位是必定的,緣由就是上面說的DL的End-to-End的優點。意思是,即便RNN只能取得和CRF方法相似的效果,可是因爲End-to-End的優點,你不須要對研究領域有任何領域知識也能把它幹好,由於有用的領域特徵DL本身會去學,這個好處是巨大的(可是對於傳統依靠NLP經驗混飯吃的NLP老手們來講,這是個壞消息),何況目前看RNN在很多領域已經得到了最好的結果。結合這些特色,這就是爲什麼說RNN會取代CRF成爲新的主流模型的緣由。優化
若是看未來的技術發展趨勢,從目前狀況看,若是再把Encoder-Decoder框架引進來,加上這篇文章講的RNN解決序列標註問題,以及後面可能會寫的用RNN解決句子分類問題的通用思路,我相信NLP中90%以上的問題均可以被這兩個模型覆蓋(固然Encoder-Decoder實際上和RNN不是一個層級的模型,這個咱們暫且放一邊,但且把它們並列來提)。所謂:RNN在手,全都我有,此言誠不我欺也。spa
我以爲還在堅韌不拔地堅持用傳統方法搞NLP的同志應該好好讀一讀我上面這幾段話,裏面有深意,本身去體會。.net
|序列標註問題code
如上文所述,序列標註問題是NLP中最多見的問題,由於絕大多數NLP問題均可以轉化爲序列標註問題,雖然不少NLP任務看上去大不相同,可是若是轉化爲序列標註問題後其實面臨的都是同一個問題。所謂「序列標註」,就是說對於一個一維線性輸入序列:blog
給線性序列中的每一個元素打上標籤集合中的某個標籤
因此,其本質上是對線性序列中每一個元素根據上下文內容進行分類的問題。通常狀況下,對於NLP任務來講,線性序列就是輸入的文本,每每能夠把一個漢字看作線性序列的一個元素,而不一樣任務其標籤集合表明的含義可能不太相同,可是相同的問題都是:如何根據漢字的上下文給漢字打上一個合適的標籤。
咱們以中文分詞任務來講明序列標註的過程。圖1給出了個例子,假設如今輸入句子「跟着TFboys學左手右手一個慢動做」,咱們的任務是正確地把這個句子進行分詞。首先,把句子看作是一系列單字組成的線性輸入序列,即:
「跟 着 Tfboys 學 左 手 右 手 一 個 慢 動 做」
序列標註的任務就是給每一個漢字打上一個標籤,對於分詞任務來講,咱們能夠定義標籤集合爲:
其中B表明這個漢字是詞彙的開始字符,M表明這個漢字是詞彙的中間字符,E表明這個漢字是詞彙的結束字符,而S表明單字詞。
圖1. 中文分詞序列標註過程
有了這四個標籤就能夠對中文進行分詞了。這時你看到了,中文分詞轉換爲對漢字的序列標註問題,假設咱們已經訓練好了序列標註模型,那麼分別給每一個漢字打上標籤集合中的某個標籤,這就算是分詞結束了,由於這種形式不方便人來查看,因此能夠增長一個後處理步驟,把B開頭,後面跟着M的漢字拼接在一塊兒,直到遇見E標籤爲止,這樣就等於分出了一個單詞,而打上S標籤的漢字就能夠看作是一個單字詞。因而咱們的例子就經過序列標註,被分詞成以下形式:
{跟着 Tfboys 學 左手 右手 一個 慢動做}
要學習NLP,首先要把面對問題時的思惟意識轉換一下,就是如上所示,把你直觀感受的問題轉換爲序列標註思惟,這個思惟意識轉換過程很重要,若是你沒有這種意識,那很明顯屬於業餘選手,專業選手看NLP問題確定首先是把它們看作一個序列標註問題的。
爲了促進意識轉換,下面再用命名實體識別(NER)問題舉個序列標註解決問題的例子,命名實體識別任務是識別句子中出現的實體,一般識別人名、地名、機構名這三類實體。如今的問題是:假設輸入中文句子
{花園北路的北醫三院裏,昏迷三年的我聽楊冪的愛的供養時起身關了收音機。}
咱們要識別出裏面包含的人名、地名和機構名。若是以序列標註的角度看這個問題,應該怎麼解決呢?圖2給出了整個流程的說明。
首先,咱們把輸入序列當作一個個漢字組成的線性序列,這是基礎。
而後,咱們定義標籤集合以下(這個標籤用什麼表明不重要,重要的是它們表明的含義):
其中,BA表明這個漢字是地址首字,MA表明這個漢字是地址中間字,EA表明這個漢字是地址的尾字;BO表明這個漢字是機構名的首字,MO表明這個漢字是機構名稱的中間字,EO表明這個漢字是機構名的尾字;BP表明這個漢字是人名首字,MP表明這個漢字是人名中間字,EP表明這個漢字是人名尾字,而O表明這個漢字不屬於命名實體。
圖2. 命名實體(NER)序列標註過程
有了輸入漢字序列,也有了標籤集合,那麼剩下的問題是訓練出一個序列標註ML系統,可以對每個漢字進行分類,假設咱們已經學好了這個系統,那麼就給輸入句子中每一個漢字打上標籤集合中的標籤,因而命名實體就被識別出來了,爲了便於人查看,增長一個後處理步驟,把人名、地名、機構名都明確標識出來便可。
不少NLP中的其它任務一樣能夠轉換爲序列標註問題,好比詞性標註、CHUNK識別、句法分析、語義角色識別,甚至包括關鍵詞抽取等不少應用問題也是如此。
傳統解決序列標註問題的方法包括HMM/MaxEnt/CRF等,很明顯RNN很快會取代CRF的主流地位,成爲解決序列標註問題的標準解決方案,那麼若是使用RNN來解決各類NLP基礎及應用問題,有什麼優化軌跡可循嗎?有的,下面咱們就概括一下使用RNN解決序列標註問題的通常優化思路。
|使用RNN解決序列標註問題的通常優化思路
首先,咱們能夠說,對於序列標註問題,均可以用RNN來替代傳統解決方案,這個目前看沒什麼問題,也是大勢所趨。
而後,若是概括的話,通常的優化流程是:首先用RNN來解決序列標註問題,而後能夠上LSTM或者GRU來替代RNN中的隱層單元,由於LSTM或GRU對於解決長距離依賴的場景明顯要優於RNN自己,接着能夠上BLSTM,即雙向LSTM,由於雙向RNN或者雙向LSTM相對RNN來講,可以看到下文特徵,因此明顯引入了更多的特徵,若是你以爲效果仍是不夠好,那麼能夠增長BLSTM的深度,不斷疊加網絡造成深度BLSTM網絡,固然,這裏要注意,隨着優化的進行,模型愈來愈複雜,若是訓練數據規模不夠的話,極可能會出現過擬合現象,因此使用LSTM的時候,記得用上DropOut以及L1/L2正則來避免過擬合,可是若是模型相對訓練數據規模確實複雜,你加上這些可能也沒用。至於GRU和LSTM二者相比,到底哪一個更好目前並沒有定論,傾向於認爲二者性能差很少,可是GRU是LSTM的簡化模型,因此一樣結構的神經網絡其參數要少,在訓練數據不太大狀況下,優先考慮使用GRU。
固然,根據NLP的不一樣任務特色,是先上BiRNN好仍是先上LSTM好這個可能不一樣任務狀況不同,好比對於分詞、POS、NER這種依賴不會太遠的任務,RNN應該就夠了,可是BiRNN確定是要上的,由於下文特徵有重要參考意義,可是對於語義級別的任務好比指代消解、語義角色標註等,估計確定是要上LSTM的。因此要根據具體狀況具體分析,不過通用的優化手段也不外乎以上幾種。
下面給出深層雙向LSTM來作NER的神經網絡結構示意圖:
圖3. 深層雙向LSTM作NER
圖比較直觀,就不解釋了,其它的NLP序列標註任務其實均可以套用這個模型來解決。