假設你有許多小明同窗一天內不一樣時段的照片,從小明提褲子起牀到脫褲子睡覺各個時間段都有(小明是照片控!)。如今的任務是對這些照片進行分類。好比有的照片是吃飯,那就給它打上吃飯的標籤;有的照片是跑步時拍的,那就打上跑步的標籤;有的照片是開會時拍的,那就打上開會的標籤。問題來了,你準備怎麼幹?函數
一個簡單直觀的辦法就是,無論這些照片之間的時間順序,想辦法訓練出一個多元分類器。就是用一些打好標籤的照片做爲訓練數據,訓練出一個模型,直接根據照片的特徵來分類。例如,若是照片是早上6:00拍的,且畫面是黑暗的,那就給它打上睡覺的標籤;若是照片上有車,那就給它打上開車的標籤。3d
這樣可行嗎?orm
乍一看能夠!但實際上,因爲咱們忽略了這些照片之間的時間順序這一重要信息,咱們的分類器會有缺陷的。舉個例子,假若有一張小明閉着嘴的照片,怎麼分類?顯然難以直接判斷,須要參考閉嘴以前的照片,若是以前的照片顯示小明在吃飯,那這個閉嘴的照片極可能是小明在咀嚼食物準備下咽,能夠給它打上吃飯的標籤;若是以前的照片顯示小明在唱歌,那這個閉嘴的照片極可能是小明唱歌瞬間的抓拍,能夠給它打上唱歌的標籤。it
因此,爲了讓咱們的分類器可以有更好的表現,在爲一張照片分類時,咱們必須將與它相鄰的照片的標籤信息考慮進來。這——就是條件隨機場(CRF)大顯身手的地方!io
從例子提及——詞性標註問題
啥是詞性標註問題?form
很是簡單的,就是給一個句子中的每一個單詞註明詞性。好比這句話:「Bob drank coffee at Starbucks」,註明每一個單詞的詞性後是這樣的:「Bob (名詞) drank(動詞) coffee(名詞) at(介詞) Starbucks(名詞)」。class
下面,就用條件隨機場來解決這個問題。file
以上面的話爲例,有5個單詞,咱們將:(名詞,動詞,名詞,介詞,名詞)做爲一個標註序列,稱爲l,可選的標註序列有不少種,好比l還能夠是這樣:(名詞,動詞,動詞,介詞,名詞),咱們要在這麼多的可選標註序列中,挑選出一個最靠譜的做爲咱們對這句話的標註。序列化
怎麼判斷一個標註序列靠譜不靠譜呢?im
就咱們上面展現的兩個標註序列來講,第二個顯然不如第一個靠譜,由於它把第2、第三個單詞都標註成了動詞,動詞後面接動詞,這在一個句子中一般是說不通的。
假如咱們給每個標註序列打分,打分越高表明這個標註序列越靠譜,咱們至少能夠說,凡是標註中出現了動詞後面仍是動詞的標註序列,要給它負分!!
上面所說的動詞後面仍是動詞就是一個特徵函數,咱們能夠定義一個特徵函數集合,用這個特徵函數集合來爲一個標註序列打分,並據此選出最靠譜的標註序列。也就是說,每個特徵函數均可以用來爲一個標註序列評分,把集合中全部特徵函數對同一個標註序列的評分綜合起來,就是這個標註序列最終的評分值。
定義CRF中的特徵函數
如今,咱們正式地定義一下什麼是CRF中的特徵函數,所謂特徵函數,就是這樣的函數,它接受四個參數:
它的輸出值是0或者1,0表示要評分的標註序列不符合這個特徵,1表示要評分的標註序列符合這個特徵。
Note:這裏,咱們的特徵函數僅僅依靠當前單詞的標籤和它前面的單詞的標籤對標註序列進行評判,這樣創建的CRF也叫做線性鏈CRF,這是CRF中的一種簡單狀況。爲簡單起見,本文中咱們僅考慮線性鏈CRF。
從特徵函數到機率
定義好一組特徵函數後,咱們要給每一個特徵函數f_j賦予一個權重λ_j。如今,只要有一個句子s,有一個標註序列l,咱們就能夠利用前面定義的特徵函數集來對l評分。
上式中有兩個求和,外面的求和用來求每個特徵函數f_j評分值的和,裏面的求和用來求句子中每一個位置的單詞的的特徵值的和。
對這個分數進行指數化和標準化,咱們就能夠獲得標註序列l的機率值p(l|s),以下所示:
幾個特徵函數的例子
前面咱們已經舉過特徵函數的例子,下面咱們再看幾個具體的例子,幫助加強你們的感性認識。
當l_i是「副詞」而且第i個單詞以「ly」結尾時,咱們就讓f1 = 1,其餘狀況f1爲0。不難想到,f1特徵函數的權重λ1應當是正的。並且λ1越大,表示咱們越傾向於採用那些把以「ly」結尾的單詞標註爲「副詞」的標註序列
若是i=1,l_i=動詞,而且句子s是以「?」結尾時,f2=1,其餘狀況f2=0。一樣,λ2應當是正的,而且λ2越大,表示咱們越傾向於採用那些把問句的第一個單詞標註爲「動詞」的標註序列。
當l_i-1是介詞,l_i是名詞時,f3 = 1,其餘狀況f3=0。λ3也應當是正的,而且λ3越大,說明咱們越認爲介詞後面應當跟一個名詞。
若是l_i和l_i-1都是介詞,那麼f4等於1,其餘狀況f4=0。這裏,咱們應當能夠想到λ4是負的,而且λ4的絕對值越大,表示咱們越不承認介詞後面仍是介詞的標註序列。
好了,一個條件隨機場就這樣創建起來了,讓咱們總結一下:
爲了建一個條件隨機場,咱們首先要定義一個特徵函數集,每一個特徵函數都以整個句子s,當前位置i,位置i和i-1的標籤爲輸入。而後爲每個特徵函數賦予一個權重,而後針對每個標註序列l,對全部的特徵函數加權求和,必要的話,能夠把求和的值轉化爲一個機率值。
CRF與邏輯迴歸的比較
觀察公式:
是否是有點邏輯迴歸的味道?
事實上,條件隨機場是邏輯迴歸的序列化版本。邏輯迴歸是用於分類的對數線性模型,條件隨機場是用於序列化標註的對數線性模型。
CRF與HMM的比較
對於詞性標註問題,HMM模型也能夠解決。HMM的思路是用生成辦法,就是說,在已知要標註的句子s的狀況下,去判斷生成標註序列l的機率,以下所示:
這裏:
p(l_i|l_i-1)是轉移機率,好比,l_i-1是介詞,l_i是名詞,此時的p表示介詞後面的詞是名詞的機率。
p(w_i|l_i)表示發射機率(emission probability),好比l_i是名詞,w_i是單詞「ball」,此時的p表示在是名詞的狀態下,是單詞「ball」的機率。
那麼,HMM和CRF怎麼比較呢?
答案是:CRF比HMM要強大的多,它能夠解決全部HMM可以解決的問題,而且還能夠解決許多HMM解決不了的問題。事實上,咱們能夠對上面的HMM模型取對數,就變成下面這樣:
咱們把這個式子與CRF的式子進行比較:
不難發現,若是咱們把第一個HMM式子中的log形式的機率看作是第二個CRF式子中的特徵函數的權重的話,咱們會發現,CRF和HMM具備相同的形式。
換句話說,咱們能夠構造一個CRF,使它與HMM的對數形式相同。怎麼構造呢?
對於HMM中的每個轉移機率p(l_i=y|l_i-1=x),咱們能夠定義這樣的一個特徵函數:
該特徵函數僅當l_i = y,l_i-1=x時纔等於1。這個特徵函數的權重以下:
一樣的,對於HMM中的每個發射機率,咱們也均可以定義相應的特徵函數,並讓該特徵函數的權重等於HMM中的log形式的發射機率。
用這些形式的特徵函數和相應的權重計算出來的p(l|s)和對數形式的HMM模型幾乎是同樣的!
用一句話來講明HMM和CRF的關係就是這樣:
每個HMM模型都等價於某個CRF
每個HMM模型都等價於某個CRF
每個HMM模型都等價於某個CRF
可是,CRF要比HMM更增強大,緣由主要有兩點:
若是i=1,l_i=動詞,而且句子s是以「?」結尾時,f2=1,其餘狀況f2=0。