使用RNN解决NLP中序列标注问题的通用优化思路
?
/*?版權聲明:可以任意轉載,轉載時請標明文章原始出處和作者信息?.*/
?
?????????? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 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在手,全都我有,此言誠不我欺也。
?
我覺得還在堅韌不拔地堅持用傳統方法搞NLP的同志應該好好讀一讀我上面這幾段話,里面有深意,自己去體會。
?
?
|序列標注問題
?
如上文所述,序列標注問題是NLP中最常見的問題,因為絕大多數NLP問題都可以轉化為序列標注問題,雖然很多NLP任務看上去大不相同,但是如果轉化為序列標注問題后其實面臨的都是同一個問題。所謂“序列標注”,就是說對于一個一維線性輸入序列:
?
給線性序列中的每個元素打上標簽集合中的某個標簽
?
?
所以,其本質上是對線性序列中每個元素根據上下文內容進行分類的問題。一般情況下,對于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序列標注任務其實都可以套用這個模型來解決。
?
?
?
掃一掃關注微信號:“布洛卡區” ,深度學習在自然語言處理等智能應用的技術研討與科普公眾號。
?
?
?
?
總結
以上是生活随笔為你收集整理的使用RNN解决NLP中序列标注问题的通用优化思路的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 深度学习与自然语言处理之四:卷积神经网络
- 下一篇: 使用RNN解决句子对匹配问题的常见网络结
