目錄
- CRF簡介
- 序列標注問題
- tensorflow里的條件隨機場
- 總結
上一篇介紹了隱馬爾科夫模型(HMM)在詞性標注任務中的應用,但HMM 引入了馬爾科夫假設:即當前時刻的狀態只與其前一時刻的狀態有關。但是,在序列標注任務中,當前時刻的狀態,應該同該時刻的前后的狀態均相關。於是,在很多序列標注任務中,引入了條件隨機場。本文詳細介紹條件隨機場在實體識別中的應用和tensorflow中的實現。
一、CRF簡介
在NLP中,常用的是線性鏈的條件隨機場,下面做一個簡單介紹:
條件隨機場(Conditional Random Fields, 以下簡稱CRF)是給定一組輸入序列條件下另一組輸出序列的條件概率分布模型(是給定隨機變量X條件下,隨機變量Y的馬爾科夫隨機場。)。在自然語言處理中得到了廣泛應用,和HMM很相似,去掉了HMM中的齊次Markov假設和觀測序列的獨立假設。具體可見其他文章系列。
設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)均相關。
二、條件隨機場的參數化表現形式
我們先列出來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如何確定和學習?在實際中我們如何使用?
下面我們看看在tensorflow里,CRF是怎么實現的,以及我們如何使用的 。
三、tensorflow里的條件隨機場
常見命名實體識別任務特征提取的網路結構如下:
自然語言的句子經過神經網絡(雙向LSTM)進行特征提取之后,會得到一個特征輸出。訓練時,將這個特征和相應的標記(label)輸入到條件隨機場中,就可以計算損失了。預測時,將自然語言輸入到該網絡,經CRF就可以識別該句子中的實體了,這里重點關注CRF計算損失部分。具體的代碼:
3.1 CRF用於損失函數
這是項目中的一小部分:定義的損失層,主要依據crf_log_likelihood函數,我們來看下其參數:
inputs=logits:由神經網絡最后一層的輸出project_logits變換后得到,該矩陣的shape為[batch_size, num_steps, num_tags],第一個是batch size,第二個是輸入的句子的長度,第三個標記的個數,即命名實體識別總標記的類別數。
tag_indices=targets:targets是輸入句子的label,即每個字的label,它的維度為[batch_size, num_steps]。
transition_params=self.trans:狀態轉移矩陣:大小是[num_tags+1, num_tags+1]加1是因為還有一個類別是未定義。
sequence_lengths=lengths+1:句子中字的個數
3.2 crf_log_likelihood的源碼
crf_log_likelihood函數中分為兩步,最終得到scores:
(1) 調用crf_sequence_score函數計算sequence_scores。
(2) 將sequence_scores進行歸一化處理。
3.3 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矩陣中取得。它最開始是按照我們初始化的方式初始化的,然后會隨着訓練的過程優化。
四、總結
CRF是一個在給定某一個隨機序列的情況下,求另一個隨機序列的概率分布的概率圖模型,在序列標注的問題中有廣泛的應用。
在tensorflow中,實現了crf_log_likelihood函數。在本文講的命名實體識別項目中:
自然語言經過特征提取過后的logits(the inputs of CRF),是發射矩陣,對應着t_k函數;
隨機初始化的self.trans矩陣是狀態轉移矩陣,對應着參數s_l,隨着訓練的過程不斷的優化。
【將第二章節的公式放下來,方便查看】
另外: 條件隨機場(CRF)在現今NLP中序列標記任務中是不可或缺的存在。太多的實現基於此,例如LSTM+CRF,CNN+CRF,BERT+CRF。因此,這是一個必須要深入理解和吃透的模型。
主要參考
【1】來源: 用於語音識別、分詞的CRF