1. 程式人生 > >用BLSTM+CRF進行序列標註

用BLSTM+CRF進行序列標註

前言:
2015年,百度幾位研究員發表了一篇名為Bidirectional LSTM-CRF Models for Sequence Tagging的論文,意思是用神經網路中的RNN所衍生出的LSTM與CRF相結合來進行序列標註。由於本最近在處理序列標註的問題,所以拜讀了一下這篇文章,思想比較樸素簡單,但卻非常有效且具有簡約的美感,讓我由衷地欽佩,所以在此對這篇文章中比較關鍵的部分進行一個翻譯記錄,並附上自己的理解。閱讀該文章並不需要對LSTM和CRF的細節有很深刻的理解(當然不是說細節不重要,只是說不清楚這兩個模型的細節也能夠比較流暢的閱讀,但如果是想更深一步進行研究,那當然建議分別弄清楚LSTM和CRF的原理和細節)。接下來就進入正文,本文主要以命名實體識別作為例子,當然其他的序列標註問題也可以用這個模型,但對於命名實體識別真是尤其的合適。

一.LSTM和CRF的簡介

1.1 LSTM
這裡寫圖片描述
其中中間的隱藏層進行了這麼一波操作:
這裡寫圖片描述
這裡我就不贅訴它具體是怎麼操作了,有興趣的同學可以自己去看看寫LSTM專題的文章。我們這裡需要明白的事情只有一個,那就是:詞是一個個分開輸入的,每個輸入經過中間層的一次LSTM的處理後,終得到了輸出,中間層之間,總是受之前時刻的影響,但是最終的輸出之間並沒有互相影響。大家如果覺得這裡講的比較粗略的話,可以先看看原文,再來看看這句話是否合理。
由此我們便可以很輕鬆的推廣到B-LSTM,如下圖所示:
這裡寫圖片描述
可以看到,中間層由以前的一層變成了2層,需要注意的是,這兩層之間的引數肯定是不同的哦,並不會公用相同的矩陣引數什麼的,它們是相互獨立的,而且方向是相反的,想表達的思想就是說當前字不僅受前文的影響,也受後文的影響。
1.2 CRF


這裡寫圖片描述
條件隨機場也不是一兩句話能講清的,但我們還是簡要的概括一下它想做的事:我們有一個輸入的序列,我們想由輸入的序列來預測輸出的序列,輸出的序列的每一個值不僅和輸入有關,還和它的前後輸出有關(滿足馬爾科夫性),也就是這幅圖中的無向連線表達的思想。(之前的LSTM的連線是單向的。)

二. BLSTM-CRF networks

還是老規矩,先上圖讓大家直觀感受一下它的流向圖:
這裡寫圖片描述
是不是感覺很熟悉,沒錯,他其實就是完完全全把BLSTM和CRF放在了一塊,也就是先過一下BLSTM層,再用CRF進行預測,關鍵之處在於我們如何來確定這些引數,也就是我們怎麼設計出一個合理的損失函式,然後最小化損失函式,從而得到引數。
首先我們需要設計出損失函式,
這裡寫圖片描述


我們首先定義[x]1T,[i]1T分別是輸入的序列和輸出的序列,一共有T個詞,θ~表示的是所有未知引數的集合,[fθ][i]t,t,表示 [x]1T中的第t個詞通過BLSTM層後,預測結果為[i]t的得分,而[A][i]t1,[i]t表示的是標籤[i]t1[i]t的轉移概率,其中BLSTM網路層總的引數θ和轉移矩陣A都是待求的。

具體如何計算這些引數呢?
我們可以先確定一個batch_size(不清楚的同學可以搜尋 批量梯度下降法),對於每個batch,我們先用這個模型進行前向傳播,首先算出BLSTM的f值,然後再由此進入CRF層計算轉移矩陣的值。然後對LSTM進行後向傳播,最後同時對A和θ進行更新。

以上就是大體的一個步驟,有希望更加深刻理解的同學可以參照原文進行對照著學習。

**

%———————7.27更新———————–%

**
更新預定,下面將在tensorflow框架下,從程式碼層面來實現BLSTM_CRF