【NLP】用于序列标注问题的条件随机场(Conditional Random Field, CRF)
上一篇介紹了隱馬爾科夫模型,隱馬爾科夫模型引入了馬爾科夫假設,即當前時刻的狀態只與其前一時刻的狀態有關。但是,在序列標注任務中,當前時刻的狀態,應該同該時刻的前后的狀態均相關。于是,在很多序列標注任務中,引入了條件隨機場。
今天詳細介紹條件隨機場的理論和及其在實體識別中的應用和tensorflow中的實現。
作者&編輯 | 小Dream哥
1 條件隨機場是什么?
機器學習最重要的任務,是根據一些已觀察到的證據(例如訓練樣本)來對感興趣的未知變量(例如類別標記)進行估計和推測。
概率模型提供這樣一種描述的框架,將學習任務歸結于計算變量的概率分布。在概率模型中,利用已知變量推測未知變量的分布稱為“推斷”,其核心是如何基于可觀測變量推測出未知變量的條件分布。具體來說,假定所關心的變量集合為Y,可觀測變量集合為X,“生成式”模型直接通過訓練樣本基本聯合概率分布P(Y,X);“判別式”模型通過先計算條件分布P(Y|X)。
我們前面講的HMM是一種生成式概率圖模型,條件隨機場(CRF)與HMM不同,是一種判別式的概率圖模型。CRF是在給定一組變量的情況下,求解另一組變量的條件概率的模型。
設X與Y是一組隨機變量,P(Y,X)是給定隨機變量X情況下,隨機變量Y的條件概率。若隨機變量Y構成一個無向圖G(V,E),當X與Y兩個隨機變量的概率分布滿足如下的條件:
則稱在給定隨機變量序列X的情況下,隨機變量序列Y的條件概率P(Y,X)構成條件隨機場。
簡單說明一下上面的條件概率公式:
v表示G中的任一節點,例如Y1,v~V。n(v)表示與v有邊連接的節點的集合。上式的含義就是,Y在i時刻的狀態,僅與其有邊連接的節點有關。
在NLP中,常用的是線性鏈的條件隨機場,下面著重介紹下線性鏈條件隨機場以加深理解。
設X={x1,x2,x3,....xn},Y={y1,y2,y3,....yn}均為線性鏈表示的隨機變量序列,若在給定隨機變量序列X的情況下,隨機變量序列Y的條件概率P(Y,X)構成條件隨機場,即滿足如下的條件:
從上面的定義可以看出,條件隨機場與HMM之間的差異在于,HMM中,Y在i時刻狀態與其前一時刻,即y(i-1)相關。而在CRF中,Y在i時刻的狀態與其前后時刻,即y(i-1)與y(i+1)均相關。
上面大致講了條件隨機場的定義,有什么樣的性質。如果讀過小Dream哥上一篇HMM講解文章的同學,此刻對CRF應該就有了大致的了解。
在介紹CRF的實際應用之前,還有一些概念需要介紹,就是條件隨機場的參數化形式。
2 條件隨機場的參數化表現形式
我們先列出來CRF的參數化形式。假設P(Y,X)是隨機序列Y在給定隨機序列X情況下的條件隨機場,則在隨機變量X取值為x的情況下,隨機變量Y的取值y具有如下關系:
式中
t_k和s_l是特征函數,v_k和u_l是對應的權值
t_k是狀態轉移函數,v_k是對應的權值;s_l是發射函數,u_l是對應的權值。好的,假如所有的t_k,s_l 和v_k,u_l都已知,我們要算的P(Yi =yi|X)是不是就可以算出來啦?
在給定隨機序列X的情況下,計算概率最大Y序列可以用維特比算法,維特比算法在上一章節HMM中有詳細的介紹,沒看的同學可以在點擊鏈接查看。
大家應該還有一大堆的疑問,t_k,s_l 和v_k,u_l如何確定和學習?在實際中我們如何使用?小Dream如果只講到這里,就會太讓大家失望了。下面我們看看在tensorflow里,CRF是怎么實現的,以及我們如何使用他,經過這一段,大家對條件隨機場應該就會有一個較為完整的認識了。
3 tensorflow里的條件隨機場
這一節我們以命名實體識別為例,來介紹在tensorflow里如何使用條件隨機場(CRF)。
命名實體識別與分詞一樣,是一個序列標注的問題,因為篇幅問題,這里就不展開,不清楚的同學可以先出門百度一下,以后我們再找機會,好好講一下命名實體識別的項目。
該命名實體識別任務特征提取的網路結構如下:
其他的我們先不看,我們只用知道,自然語言的句子經過神經網絡(雙向LSTM)進行特征提取之后,會得到一個特征輸出。訓練時,將這個特征和相應的標記(label)輸入到條件隨機場中,就可以計算損失了。預測時,將自然語言輸入到該網絡,經CRF就可以識別該句子中的實體了。
我們來看看具體的代碼:
這是我定義的損失層,project_logits是神經網絡最后一層的輸出,該矩陣的shape為[batch_size, num_steps, num_tags],第一個是batch size,第二個是輸入的句子的長度,第三個標記的個數,即命名實體識別總標記的類別數。targets是輸入句子的label,即每個字的label,它的維度為[batch_size, num_steps]。損失層定義了一個self.trans矩陣,大小是[num_tags+1, num_tags+1], 加1是因為還有一個類別是未定義。
將project_logit,targets以及self.trans交給tensorflow的系統函數crf_log_likelihood即可求得損失了。
下面我們進一步來看看crf_log_likelihood是怎么實現的:
crf_log_likelihood函數中分為兩步,最終得到scores:
(1) 調用crf_sequence_score函數計算sequence_scores。
(2) 將sequence_scores進行歸一化處理。
CRF參數的學習及score計算過程主要在crf_sequence_score中進行,我們好好看看這個函數。
從crf_sequence_score函數的實現中,我們看出,tf中的損失值包括一元損失和二元損失。其中unary_scores表示的是輸入序列之間轉化的損失,unary_scores表示的轉化矩陣的損失值。那這兩項到底是什么呢?都是兩項,是不是和CRF的參數化形式感覺有點像?我們看看相關論文是怎么說的。
LampleG, Ballesteros M, Subramanian S, et al. Neural architectures for named entity recognition[J]. arXiv preprint arXiv:1603.01360, 2016.
我們看一下,得分分為兩項,第一項:
它表示輸入句子中,第i個詞,取某個標記的概率。
舉個例子,假如輸入的句子是“Mark Watney visit Mars”, 相應的label是[B-PER,E-PER,O,S-LOC],則P(1,“B-PER”)表示的是第一個詞的標記是B-PER的概率。所以第一項會是P(1,“B-PER”)+P(2,“E-PER”)+P(3,“O”)+P(4,“S-LOC”)。
前面提到過,project_logits是神經網絡最后一層的輸出,該矩陣的shape為[batch_size, num_steps, num_tags]。所以在tensorflow的實現中,該矩陣的值會取到project_logits矩陣中相應的值,這一點交叉熵有點像,同學們體會一下。
第二項:
它代表的是整個序列從一個標記轉化到下一個標記的損失值。它用每一項值從self.trans矩陣中取得。它最開始是按照我們初始化的方式初始化的,然后會隨著訓練的過程優化。
好了,tensorflow中crf就是這么實現的,是不是有種豁然開朗的感覺??
我們來做一個總結,CRF是一個在給定某一個隨機序列的情況下,求另一個隨機序列的概率分布的概率圖模型,在序列標注的問題中有廣泛的應用。
在tensorflow中,實現了crf_log_likelihood函數。在本文講的命名實體識別項目中,自然語言是已知的序列,自然語言經過特征提取過后的logits,是發射矩陣,對應著t_k函數;隨機初始化的self.trans矩陣是狀態轉移矩陣,對應著參數s_l,隨著訓練的過程不斷的優化。
CRF相關的理論及其在tensorflow中的實現,就差不多講完了。但是有一個很關鍵的點,需要讀者們思考一下。在這個實體識別的任務中,經過LSTM完成特征提取之后,為什么要接一層CRF再得到scores和損失值?
關于這個問題,讀者們可以留言,或者加入我們的NLP群進行討論。感興趣的同學可以微信搜索jen104,備注"加入有三AI NLP群"。
總結
條件隨機場(CRF)在現今NLP中序列標記任務中是不可或缺的存在。太多的實現基于此,例如LSTM+CRF,CNN+CRF,BERT+CRF。因此,這是一個必須要深入理解和吃透的模型。
下期預告:樸素貝葉斯原理及應用
有三AI知識星球推薦
為了更加自由的進行內容輸出,也讓大家可以跟各行各業的大佬們交流,有三AI開設了星球,內容與公眾號完全不重合,相互補充,下面是知識星球的內容介紹,大家可以關注。
有三AI知識星球官宣,BAT等大咖等你來撩
轉載文章請后臺聯系
侵權必究
往期精選
【NLP】自然語言處理專欄上線,帶你一步一步走進“人工智能技術皇冠上的明珠”。
【NLP】用于語音識別、分詞的隱馬爾科夫模型HMM
【知識星球】每日干貨看圖猜技術,你都會嗎?
【知識星球】千奇百怪的網絡結構板塊更新到哪里了?
總結
以上是生活随笔為你收集整理的【NLP】用于序列标注问题的条件随机场(Conditional Random Field, CRF)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Python进阶】Python进阶专栏
- 下一篇: 【NLP】 NLP专栏栏主自述,说不出口