一文輕鬆搞懂條件隨機場

  • 2019 年 10 月 11 日
  • 筆記

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

總說

CRF(Conditional Random Field),中文被翻譯為條件隨機場。經常被用於序列標註,其中包括詞性標註,分詞,命名實體識別等領域。但是為什麼叫這個名字呢?下面看完了基本也就明白了!那我們繼續吧。

理論

我們以命名實體識別NER為例,先介紹下NER的概念:

這裡的label_alphabet中的b代表一個實體的開始,即begin;m代表一個實體的中部,即mid;e代表一個實體的結尾,即end;o代表不是實體,即None;<start>和<pad>分表代表這個標註label序列的開始和結束,類似於機器翻譯的<SOS>和<EOS>。

這個就是word和label數字化後變成word_index,label_index。最終就變成下面的形式:

因為label有7種,每一個字被預測的label就有7種可能,為了數字化這些可能,我們從word_index到label_index設置一種分數,叫做發射分數emit:

看這個圖,有word_index 的 1 -> 到label_index 的 4的小紅箭頭,像不像發射過來的?此時的分數就記作emit[1][4]。

另外,我們想想,如果單單就這個發射分數來評價,太過於單一了,因為這個是一個序列,比如前面的label為o,那此時的label被預測的肯定不能是m或s,所以這個時候就需要一個分數代表前一個label到此時label的分數,我們叫這個為轉移分數,即T:

如圖,橫向的label到label箭頭,就是由一個label到另一個label轉移的意思,此時的分數為T[4][4]。

此時我們得出此時的word_index=1到label_index=4的分數為emit[1][4]+T[4][4]。但是,CRF為了全局考慮,將前一個的分數也累加到當前分數上,這樣更能表達出已經預測的序列的整體分數,最終的得分score為:

score[1][4] = score[0][4]+emit[1][4]+T[4][4]

所以整體的score就為:

最後的公式為這樣的:

其中X為word_index序列,y為預測的label_index序列。

因為這個預測序列有很多種,種類為label的排列組合大小。其中只有一種組合是對的,我們只想通過神經網絡訓練使得對的score的比重在總體的所有score的越大越好。而這個時候我們一般softmax化,即:

其中分子中的s為label序列為正確序列的score,分母s為每中可能的score。

這個比值越大,我們的預測就越准,所以,這個公式也就可以當做我們的loss,可是loss一般都越小越好,那我們就對這個加個負號即可,但是這個最終結果手機趨近於1的,我們實驗的結果是趨近於0的,這時候log就派上用場了,即:

當然這個log也有平滑結果的功效。

計算所有路徑的得分

就是為了求得所有預測序列可能的得分和。我們第一種想法就是每一種可能都求出來,然後累加即可。可是,比如word長為10,那麼總共需要計算累加10^7次,這樣的計算太耗時間了。那麼怎麼計算的時間快呢?這裡有一種方法:

因為剛開始為<start>即為5,然後word_index為0的時候的所有可能的得分,即s[0][0],s[0][1]…s[0][6]中間的那部分。然後計算word_index為1的所有s[1][0],s[1][1]…s[1][6]的得分,這裡以s[1][0]為例,即紅箭頭的焦點處:這裡表示所有路徑到這裡的得分總和。

這裡每個節點,都表示前面的所有路徑到當前節點路徑的所有得分之和。所以,最後的s[4][6]即為最終的得分之和,即:

計算gold分數,即:

這事只要通過此時的T和emit函數計算就能得出,計算公式上面已經給出了:

訓練過程

就是重複上述的求解所有路徑的過程,將總和和gold的得分都求出來,得到loss,然後進行更新T,emit即可。(實現的話,其實emit是隱層輸出,不是更新的對象,之後的實現會講)

Decoder

這個過程,就是動態規劃,但是在這種模型中,通常叫做維特比算法。如圖:

大概思路就是這次的每個節點不是求和,而是求max值和記錄此max的位置。就是這樣:

最後每個節點都求了出來,結果為:

最後,根據最後的節點,向前選取最佳的路徑。過程為:

就這樣,我們計算出來了預測路徑。

The End