乾貨 | NLP序列標註之條件隨機場

跟着博主的腳步,每天進步一點點640640

上一篇介紹了隱馬爾科夫模型,隱馬爾科夫模型引入了馬爾科夫假設,即當前時刻的狀態只與其前一時刻的狀態有關。但是,在序列標註任務中,當前時刻的狀態,應該同該時刻的前後的狀態均相關。於是,在很多序列標註任務中,引入了條件隨機場。

今天詳細介紹條件隨機場的理論和及其在實體識別中的應用和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兩個隨機變量的概率分佈滿足如下的條件:

640?wx_fmt=jpeg

則稱在給定隨機變量序列X的情況下,隨機變量序列Y的條件概率P(Y,X)構成條件隨機場。

簡單說明一下上面的條件概率公式:

v表示G中的任一節點,例如Y1,v~V。n(v)表示與v有邊連接的節點的集合。上式的含義就是,Y在i時刻的狀態,僅與其有邊連接的節點有關。

在NLP中,常用的是線性鏈的條件隨機場,下面着重介紹下線性鏈條件隨機場以加深理解。

640?wx_fmt=png

設X={x1,x2,x3,....xn},Y={y1,y2,y3,....yn}均爲線性鏈表示的隨機變量序列,若在給定隨機變量序列X的情況下,隨機變量序列Y的條件概率P(Y,X)構成條件隨機場,即滿足如下的條件:

640?wx_fmt=png

從上面的定義可以看出,條件隨機場與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具有如下關係:

640?wx_fmt=jpeg

式中

640?wx_fmt=jpeg

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)。

命名實體識別與分詞一樣,是一個序列標註的問題,因爲篇幅問題,這裏就不展開,不清楚的同學可以先出門百度一下,以後我們再找機會,好好講一下命名實體識別的項目。

該命名實體識別任務特徵提取的網路結構如下:

640?wx_fmt=png

其他的我們先不看,我們只用知道,自然語言的句子經過神經網絡(雙向LSTM)進行特徵提取之後,會得到一個特徵輸出。訓練時,將這個特徵和相應的標記(label)輸入到條件隨機場中,就可以計算損失了。預測時,將自然語言輸入到該網絡,經CRF就可以識別該句子中的實體了。

我們來看看具體的代碼:

640?wx_fmt=png

這是我定義的損失層,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是怎麼實現的:

640?wx_fmt=png

crf_log_likelihood函數中分爲兩步,最終得到scores:

(1) 調用crf_sequence_score函數計算sequence_scores。

(2) 將sequence_scores進行歸一化處理。

CRF參數的學習及score計算過程主要在crf_sequence_score中進行,我們好好看看這個函數。

640?wx_fmt=png

從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.

640?wx_fmt=png

我們看一下,得分分爲兩項,第一項:

640?wx_fmt=jpeg

表示輸入句子中,第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矩陣中相應的值,這一點交叉熵有點像,同學們體會一下。

第二項:

640?wx_fmt=jpeg

它代表的是整個序列從一個標記轉化到下一個標記的損失值。它用每一項值從self.trans矩陣中取得。它最開始是按照我們初始化的方式初始化的,然後會隨着訓練的過程優化。

好了,tensorflow中crf就是這麼實現的,是不是有種豁然開朗的感覺??

我們來做一個總結,CRF是一個在給定某一個隨機序列的情況下,求另一個隨機序列的概率分佈的概率圖模型,在序列標註的問題中有廣泛的應用。

在tensorflow中,實現了crf_log_likelihood函數。在本文講的命名實體識別項目中,自然語言是已知的序列,自然語言經過特徵提取過後的logits,是發射矩陣,對應着t_k函數;隨機初始化的self.trans矩陣是狀態轉移矩陣,對應着參數s_l,隨着訓練的過程不斷的優化。

總結

條件隨機場(CRF)在現今NLP中序列標記任務中是不可或缺的存在。太多的實現基於此,例如LSTM+CRF,CNN+CRF,BERT+CRF。因此,這是一個必須要深入理解和吃透的模型。

The End

640?wx_fmt=gif
往期精彩回顧



640?wx_fmt=gif
640?wx_fmt=gif
640?wx_fmt=gif

長按二維碼關注AI小白入門

ID:StudyForAI

學習AI學習ai(愛)

期待與您的相遇~

640?wx_fmt=png
你點的每個贊,我都認真當成了喜歡
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章