序列標注問題是自然語言中最常見的問題,在深度學習火起來之前,常見的序列標注問題的解決方案都是借助於HMM模型,最大熵模型,CRF模型。尤其是CRF,是解決序列標注問題的主流方法。隨着深度學習的發展,RNN在序列標注問題中取得了巨大的成果。而且深度學習中的end-to-end,也讓序列標注問題變得更簡單了。
序列標注問題包括自然語言處理中的分詞,詞性標注,命名實體識別,關鍵詞抽取,詞義角色標注等等。我們只要在做序列標注時給定特定的標簽集合,就可以進行序列標注。
序列標注問題是NLP中最常見的問題,因為絕大多數NLP問題都可以轉化為序列標注問題,雖然很多NLP任務看上去大不相同,但是如果轉化為序列標注問題后其實面臨的都是同一個問題。所謂“序列標注”,就是說對於一個一維線性輸入序列:
給線性序列中的每個元素打上標簽集合中的某個標簽:
所以,其本質上是對線性序列中每個元素根據上下文內容進行分類的問題。一般情況下,對於NLP任務來說,線性序列就是輸入的文本,往往可以把一個漢字看做線性序列的一個元素,而不同任務其標簽集合代表的含義可能不太相同,但是相同的問題都是:如何根據漢字的上下文給漢字打上一個合適的標簽(無論是分詞,還是詞性標注,或者是命名實體識別,道理都是想通的)。
序列標注問題之中文分詞
以中文分詞任務來說明序列標注的過程。假設現在輸入句子“跟着TFboys學左手右手一個慢動作”,我們的任務是正確地把這個句子進行分詞。首先,把句子看做是一系列單字組成的線性輸入序列,即:
序列標注的任務就是給每個漢字打上一個標簽,對於分詞任務來說,我們可以定義標簽集合為(jieba分詞中的標簽集合也是這樣的):
其中B代表這個漢字是詞匯的開始字符,M代表這個漢字是詞匯的中間字符,E代表這個漢字是詞匯的結束字符,而S代表單字詞。
有了這四個標簽就可以對中文進行分詞了。這時你看到了,中文分詞轉換為對漢字的序列標注問題,假設我們已經訓練好了序列標注模型,那么分別給每個漢字打上標簽集合中的某個標簽,這就算是分詞結束了,因為這種形式不方便人來查看,所以可以增加一個后處理步驟,把B開頭,后面跟着M的漢字拼接在一起,直到碰見E標簽為止,這樣就等於分出了一個單詞,而打上S標簽的漢字就可以看做是一個單字詞。於是我們的例子就通過序列標注,被分詞成如下形式:
在這里我們可以采用雙向LSTM來處理該類問題,雙向會關注上下文的信息。
在NLP中最直觀的處理問題的方式就是要把問題轉換為序列標注問題,思考問題的思維方式也就轉換為序列標注思維,這個思維很重要,決定你能否真的處理好NLP問題。
序列標注之命名實體識別(NER)
我們再來看看命名實體識別問題中的序列標注,命名實體識別任務是識別句子中出現的實體,通常識別人名、地名、機構名這三類實體。現在的問題是:假設輸入中文句子
我們要識別出里面包含的人名、地名和機構名。如果以序列標注的角度看這個問題,我們首先得把輸入序列看成一個個漢字組成的線性序列,然后我們要定義標簽集合,標簽集合如下(在這里的標簽用什么代表不重要,重要的是它代表的含義):
其中,BA代表這個漢字是地址首字,MA代表這個漢字是地址中間字,EA代表這個漢字是地址的尾字;BO代表這個漢字是機構名的首字,MO代表這個漢字是機構名稱的中間字,EO代表這個漢字是機構名的尾字;BP代表這個漢字是人名首字,MP代表這個漢字是人名中間字,EP代表這個漢字是人名尾字,而O代表這個漢字不屬於命名實體。
有了輸入漢字序列,也有了標簽集合,那么剩下的問題是訓練出一個序列標注ML系統,能夠對每一個漢字進行分類,假設我們已經學好了這個系統,那么就給輸入句子中每個漢字打上標簽集合中的標簽,於是命名實體就被識別出來了,為了便於人查看,增加一個后處理步驟,把人名、地名、機構名都明確標識出來即可。
除了上面的分詞和命名實體標注,很多其他的NLP問題同樣可以轉換為序列標注問題,比如詞性標注、CHUNK識別、句法分析、語義角色識別、關鍵詞抽取等。
傳統解決序列標注問題的方法包括HMM/MaxEnt/CRF等,很明顯RNN很快會取代CRF的主流地位,成為解決序列標注問題的標准解決方案,那么如果使用RNN來解決各種NLP基礎及應用問題,我們又該如何處理呢,下面我們就歸納一下使用RNN解決序列標注問題的一般優化思路。
對於分詞、詞性標注(POS)、命名實體識別(NER)這種前后依賴不會太遠的問題,可以用RNN或者BiRNN處理就可以了。而對於具有長依賴的問題,可以使用LSTM、RLSTM、GRU等來處理。關於GRU和LSTM兩者的性能差不多,不過對於樣本數量較少時,有限考慮使用GRU(模型結構較LSTM更簡單)。此外神經網絡在訓練的過程中容易過擬合,可以在訓練過程中加入Dropout或者L1/L2正則來避免過擬合。
CRF和LSTM在序列標注上的優劣
LSTM:像RNN、LSTM、BILSTM這些模型,它們在序列建模上很強大,它們能夠capture長遠的上下文信息,此外還具備神經網絡擬合非線性的能力,這些都是crf無法超越的地方,對於t時刻來說,輸出層yt受到隱層ht(包含上下文信息)和輸入層xt(當前的輸入)的影響,但是yt和其他時刻的yt`是相互獨立的,感覺像是一種point wise,對當前t時刻來說,我們希望找到一個概率最大的yt,但其他時刻的yt`對當前yt沒有影響,如果yt之間存在較強的依賴關系的話(例如,形容詞后面一般接名詞,存在一定的約束),LSTM無法對這些約束進行建模,LSTM模型的性能將受到限制。
CRF:它不像LSTM等模型,能夠考慮長遠的上下文信息,它更多考慮的是整個句子的局部特征的線性加權組合(通過特征模版去掃描整個句子)。關鍵的一點是,CRF的模型為p(y | x, w),注意這里y和x都是序列,它有點像list wise,優化的是一個序列y = (y1, y2, …, yn),而不是某個時刻的yt,即找到一個概率最高的序列y = (y1, y2, …, yn)使得p(y1, y2, …, yn| x, w)最高,它計算的是一種聯合概率,優化的是整個序列(最終目標),而不是將每個時刻的最優拼接起來,在這一點上CRF要優於LSTM。
HMM:CRF不管是在實踐還是理論上都要優於HMM,HMM模型的參數主要是“初始的狀態分布”,“狀態之間的概率轉移矩陣”,“狀態到觀測的概率轉移矩陣”,這些信息在CRF中都可以有,例如:在特征模版中考慮h(y1), f(yi-1, yi), g(yi, xi)等特征。
參考文章: