還記得以前介紹過的命名實體識別系列文章嗎,能夠從句子中提取出人名、地址、公司等實體字段,當時只是簡單提到了BERT+CRF模型,BERT已經在上一篇文章中介紹過了,本文將對CRF作一個基本的介紹。本文儘量不涉及複雜晦澀的數學公式,目的只是快速瞭解CRF的基本概念以及其在命名實體識別等天然語言處理領域的做用。html
CRF,全稱 Conditional Random Fields,中文名:條件隨機場。是給定一組輸入序列的條件下,另外一組輸出序列的條件機率分佈模型。算法
當輸出序列的每個位置的狀態,須要考慮到相鄰位置的狀態的時候。舉兩個例子:
一、假設有一堆小明平常生活的照片,可能的狀態有吃飯、洗澡、刷牙等,大部分狀況,咱們是可以識別出小明的狀態的,可是若是你看到一張小明露出牙齒的照片,在沒有相鄰的小明的狀態爲條件的狀況下,是很難判斷他是在吃飯仍是刷牙的。這時,就能夠用crf。
二、假設有一句話,這裏假設是英文,咱們要判斷每一個詞的詞性,那麼對於一些詞來講,若是不知道相鄰詞的詞性的狀況下,是很難準確判斷每一個詞的詞性的。這時,也能夠用crf。網絡
咱們先來講什麼是隨機場。
The collection of random variables is called a stochastic process.A stochastic process that is indexed by a spatial variable is called a random field.
隨機變量的集合稱爲隨機過程。由一個空間變量索引的隨機過程,稱爲隨機場。
也就是說,一組隨機變量按照某種機率分佈隨機賦值到某個空間的一組位置上時,這些賦予了隨機變量的位置就是一個隨機場。好比上面的例子中,小明的一系列照片分別是什麼狀態組成了一組位置,咱們從一組隨機變量{吃飯、洗澡、刷牙}中取值,隨機變量遵循某種機率分佈,隨機賦給一組照片的某一張的輸出位置,並完成這組照片的全部輸出位置的狀態賦值後,這些狀態和所在的位置全體稱爲隨機場。dom
回答這個問題須要先來看看什麼是馬爾可夫隨機場,若是一個位置的賦值只和與它相鄰的位置的值有關,與和它不相鄰的位置的值無關,那麼這個隨機場就是一個馬爾可夫隨機場。這個假設用在小明和詞性標註的例子中都是合適的,由於咱們經過前一張照片就能夠判斷當前露牙的照片是刷牙仍是吃飯,根據前一個詞的詞性就能夠判斷當前詞的詞性是否符合語法。
馬爾可夫模型是根據隱含變量(詞性)生成可觀測狀態(詞),而條件隨機場是根據觀測狀態(詞)判別隱含變量(詞性)。或者說條件隨機場是給定了觀測狀態(輸入序列)集合這個先驗條件的馬爾科夫隨機場。上面例子中的給定的小明照片,給定的英文句子,這些都是隨機場的先驗條件。函數
設X與Y是隨機變量,P(Y|X)是給定X時Y的條件機率分佈,若隨機變量Y構成的是一個馬爾科夫隨機場,則稱條件機率分佈P(Y|X)是條件隨機場。在實際的應用中,好比上面的兩個例子,咱們通常都要求X和Y有相同的結構,以下:
X=(X1,X2,...Xn),Y=(Y1,Y2,...Yn)
好比詞性標註,咱們要求輸出的詞性序列和輸入的句子中的每一個詞是一一對應的。
X和Y有相同的結構的CRF就構成了線性鏈條件隨機場(Linear chain Conditional Random Fields,簡稱 linear-CRF)。
上面的例子中沒有提到命名實體識別,但其實命名實體識別的原理和上面的例子是同樣的,也是用到了linear-CRF,後面會提到。學習
CRF中有兩類特徵函數,分別是狀態特徵和轉移特徵,狀態特徵用當前節點(某個輸出位置可能的狀態中的某個狀態稱爲一個節點)的狀態分數表示,轉移特徵用上一個節點到當前節點的轉移分數表示。其損失函數定義以下:
CRF損失函數的計算,須要用到真實路徑分數(包括狀態分數和轉移分數),其餘全部可能的路徑的分數(包括狀態分數和轉移分數)。這裏的路徑用詞性來舉例就是一句話對應的詞性序列,真實路徑表示真實的詞性序列,其餘可能的路徑表示其餘的詞性序列。
這裏的分數就是指softmax以前的機率,或稱爲未規範化的機率。softmax的做用就是將一組數值轉換成一組0-1之間的數值,這些數值的和爲1,這樣就能夠表示機率了。spa
對於詞性標註來講,給定一句話和其對應的詞性序列,那麼其似然性的計算公式(CRF的參數化公式)以下,圖片出自條件隨機場CRF:
3d
在只有CRF的狀況下,上面說的2類特徵函數都是人工設定好的。通俗的說就是人工設定了觀測序列的特徵。
人爲設定狀態特徵模板,好比設定「某個詞是名詞」等。
人爲設定轉移特徵模板,好比設定「某個詞是名詞時,上一個詞是形容詞」等。
給定一句話的時候,就根據上面設定的特徵模板來計算這句話的特徵分數,計算的時候,若是這句話符合特徵模板中的特徵規則,則那個特徵規則的值就爲1,不然就爲0。
實體識別的表現取決於2種特徵模板設定的好壞。
因此若是咱們能使用深度神經網絡的方式,特徵就能夠由模型本身學習獲得,這就是使用BERT+CRF的緣由。htm
由BERT學習序列的狀態特徵,從而獲得一個狀態分數,該分數直接輸入到CRF層,省去了人工設置狀態特徵模板。
這裏的狀態特徵是說序列某個位置可能對應的狀態(命名實體識別中是指實體標註),
狀態分數是每一個可能的狀態的softmax前的機率(又稱非規範化機率,或者直接稱做分數),
實體標註一般用BIO標註,B表示詞的開始,I表示詞的延續,O表示非實體詞,好比下面的句子和其對應的實體標註(假設咱們要識別的是人名和地點):
小 明 愛 北 京 的 天 安 門 。
B-Person I-Person O B-Location I-Location O B-Location I-Location I-Location Oblog
也就是說BERT層學到了句子中每一個字符最可能對應的實體標註是什麼,這個過程是考慮到了每一個字符左邊和右邊的上下文信息的,可是輸出的最大分數對應的實體標註依然可能有誤,不會100%正確的,出現B後面直接跟着B,後者標註以I開頭了,都是有可能的,而下降這些明顯不符規則的問題的狀況的發生機率,就能夠進一步提升BERT模型預測的準確性。此時就有人想到用CRF來解決這個問題。
CRF算法中涉及到2種特徵函數,一個是狀態特徵函數,計算狀態分數,一個是轉移特徵函數,計算轉移分數。前者只針對當前位置的字符能夠被轉換成哪些實體標註,後者關注的是當前位置和其相鄰位置的字符能夠有哪些實體標註的組合。BERT層已經將狀態分數輸出到CRF層了,因此CRF層還須要學習一個轉移分數矩陣,該矩陣表示了全部標註狀態之間的組合,好比咱們這裏有B-Person I-Person B-Location I-Location O 共5種狀態,有時候還會在句子的開始和結束各加一個START 和 END標註,表示一個句子的開始和結束,那麼此時就是7種狀態了,那麼2個狀態(包括本身和本身)之間的組合就有7*7=49種,上面說的轉移分數矩陣中的元素就是這49種組合的分數(或稱做非規範化機率),表示了各個組合的可能性。這個矩陣一開始是隨機初始化的,經過訓練後慢慢會知道哪些組合更符合規則,哪些更不符合規則。從而爲模型的預測帶來相似以下的約束:
矩陣示意以下:
爲何不能經過人工來判斷標註規則並編寫好修正邏輯呢?
由於人工雖然能判斷出預測的標註先後關係是否符合規則,可是沒法知道如何對不符合規則的預測進行調整,好比咱們知道句子的開頭應該是「B-」或「O」,而不是「I-」,可是到底是B-仍是O呢?並且對於標註狀態很是多的場景下,人工編寫的工做量和邏輯是很是大且複雜的。
CRF損失函數的計算,須要用到真實路徑分數(包括狀態分數和轉移分數),其餘全部可能的路徑的分數(包括狀態分數和轉移分數)。其中真實路徑的狀態分數是根據訓練獲得的BERT模型的輸出計算出來的,轉移分數是從CRF層提供的轉移分數矩陣獲得的。其餘路徑的狀態分數和轉移分數其實也是這樣計算的。
最後咱們來看下真實路徑的計算原理,實際上是使用了維特比算法。
概念:用相鄰兩個層的最優路徑來組成最終從起始層到結束層的最優路徑。最優路徑是指從上一層的各個節點到達當前層的某個節點的全部路徑中,機率最大 or 距離最短(或者其餘理由,具體自行定義) 的路徑。
核心理念:從上一層的各個節點到達當前層的某個節點的路徑的機率最大,則該節點必定在最大路徑上。由於後續再計算狀態轉移的時候,該節點到下一個某狀態節點(或稱爲目標節點)的機率必定也是大於其餘節點到下一個某狀態節點的機率的,至於會到哪個目標節點,只取決於當前節點到目標節點的轉移分數以及目標節點的狀態分數,但不管到哪一個節點,當前節點在最優路徑上這個判斷是毋庸置疑的了。以下圖:
H,F之間的轉移機率是固定的,包括H->H和F->F,都來自於轉移分數矩陣,好比上圖藍色框中的0.084 * 0.3 * 0.6是來自H0.084節點,該節點是上一層計算獲得的最大機率的路徑上的節點,你可能會想,若是這一層計算H->F的機率比F->F的機率小怎麼辦,維特比算法是否是就不是全局最優解了?其實這一層計算H->F的機率比F->F的機率小的狀況不會出現,咱們來看這一層(藍色框)兩個狀態轉移機率的計算:
這裏的第一項的0.3和0.04分別表示上一層的H和F節點的狀態分數,咱們分別設爲a和b,如今已知a * 0.3 * 0.3=0.084,b * 0.6 * 0.3=0.027,0.084>0.027,因此後面再來一次轉移,也就是0.084 * 0.3也必定是大於0.027 * 0.6的,若是還有更多層的話,後面的計算仍是一個乘以0.3,一個乘以0.6嗎,固然是的,由於0.3是H轉移到F的轉移機率,0.6是F轉移到F的轉移機率,這個轉移機率是固定的。
因此當前層狀態分數最大的節點,必定在最優路徑上,以此遞推到最後一層後,反過來追溯每次記錄下來的機率最大的節點,就能夠獲得一條最優的路徑了。
上圖的最優路徑是:Start-H-H-F
命名實體識別中,BERT負責學習輸入句子中每一個字和符號到對應的實體標籤的規律,而CRF負責學習相鄰實體標籤之間的轉移規則。
ok,本篇就這麼多內容啦~,感謝閱讀O(∩_∩)O。