1.CRF++的詳細解析
完成的是學習和解碼的過程:訓練即為學習的過程,預測即為解碼的過程。
模板的解析:
具體參考hanlp提供的:
http://www.hankcs.com/nlp/the-crf-model-format-description.html
Unigram和Bigram模板分別生成CRF的狀態特征函數和轉移特征函數。其中是標簽,x是觀測序列,i是當前節點位置。每個函數還有一個權值。
注意:一般定義CRF++的模板只定義Unigram即為CRF的狀態特征函數(對於觀測狀態不同的組合即為其區別於HMM的觀測獨立性假設的地方,是對上下文的充分利用),一般只有一個單獨的B,很多情況B模版只有一個“B”字符,此時就不考慮觀測值,只有“前面一個token”對“當前token”的特征函數。(Only one bigram template ('B') is used. This means that only combinations of previous output token and current token are used as bigram features.)
crf++模板定義里的U01%x[row,col],即是特征函數的參數x.U代表Unigram,01只是一個用於作為標識的ID。方括號里的編號用於標定特征來源,row表示相對當前位置的行,0即是當前行;col對應訓練文件中的列。
舉個例子。假設有如下用於分詞標注的訓練文件:
北 N B
京 N E
歡 V B
迎 V M
你 N E
其中第3列是標簽,也是測試文件中需要預測的結果,有BME 3種狀態。第二列是詞性,不是必須的。
特征模板格式:%x[row,col]。方括號里的編號用於標定特征來源,row表示相對當前位置的行,0即是當前行;col對應訓練文件中的列。這里只使用第1列(編號0),即文字。
1)Unigram類型
每一行模板生成一組狀態特征函數,數量是L*N 個,L是標簽狀態數。N是此行模板在訓練集上展開后的唯一樣本數,在這個例子中,第一列的唯一字數是5個,所以有L*N = 3*5=15。
例如:U01:%x[0,0],生成如下15個函數:
func1 = if (output = B and feature=U01:"北") return 1 else return 0
func2 = if (output = M and feature=U01:"北") return 1 else return 0
func3 = if (output = E and feature=U01:"北") return 1 else return 0
func4 = if (output = B and feature=U01:"京") return 1 else return 0
...
func13 = if (output = B and feature=U01:"你") return 1 else return 0
func14 = if (output = M and feature=U01:"你") return 1 else return 0
func15 = if (output = E and feature=U01:"你") return 1 else return 0
這些函數經過訓練后,其權值表示函數內文字對應該標簽的概率(形象說法,概率和可大於1)。
每個模板會把所有可能的標記輸出都列一遍,然后通過訓練確定每種標記的權重,合理的標記在訓練樣本中出現的次數多,對應的權重就高,不合理的標記在訓練樣本中出現的少,對應的權重就少,但是在利用模板生成轉移特征函數是會把所有可能的特征函數都列出來,由模型通過訓練決定每個特征的重要程度。
U05:%x[-1,0]/%x[0,0]表示一元復合特征,即當前行的第一列與其前一行的第一列的復合特征
假如我們訓練的語料句子是:我是中國人(下標:-2,-1,0,1,2),我們考慮的當前位置為:“中”
U0--U4特征模板:表示某個位置與當前位置的信息之間的關系,比如說U00,就是指的“我”和“中”之間的聯系
U5--U7特征模板:表示某三個位置與當前位置的信息之間的關系,比如說U05,就是指的“我”、“是”、“中”和“中”之間的聯系
U8--U9特征模板:表示某兩個位置與當前位置的信息之間的關系,比如說U08,就是指的“是”、“中”和“中”之間的聯系
又如 U02:%x[-1,0],訓練后,該組函數權值反映了句子中上一個字對當前字的標簽的影響。
對某一個特征函數的具體解析:
func1 = if (output = B and feature="U02:那") return 1 else return 0
它是由U02:%x[0,0]在輸入文件的第一行生成的點函數.將輸入文件的第一行"代入"到函數中,函數返回1,同時,如果輸入文件的某一行在第1列也是“那”,並且它的output(第2列)同樣也為B,那么這個函數在這一行也返回1。
2)Bigram類型
與Unigram不同的是,Bigram類型模板生成的函數會多一個參數:上個節點的標簽 。
生成函數類似於:
func1 = if (prev_output = B and output = B and feature=B01:"北") return 1 else return 0
這樣,每行模板則會生成 L*L*N 個特征函數。經過訓練后,這些函數的權值反映了上一個節點的標簽對當前節點的影響。
每行模版可使用多個位置。例如:U18:%x[1,1]/%x[2,1]
字母U后面的01,02是唯一ID,並不限於數字編號。如果不關心上下文,甚至可以不要這個ID。
2.Bi-LSTM+CRF中CRF層的詳細解析
https://blog.csdn.net/buppt/article/details/82227030
https://blog.csdn.net/bobobe/article/details/80489303
https://www.jianshu.com/p/97cb3b6db573
我們已知lstm的輸出就是每個字標注的概率。假設lstm輸出概率如下所示。這里為了方便,只寫了 BMEO 4種標注結果。更多的話也是相同的。
而crf首先在每句話的前面增加一個<start>字,在每句話的結尾增加一個<end>字。
然后定義了一個轉移矩陣,轉移矩陣中的數值代表前面一個字標注結果到下一個字的標注結果的概率。比如下面矩陣中的第一行,代表的含義就是前一個字標注為start,下一個字標注為B 的概率是0.6,標注為O的概率就是0.4。這個矩陣是隨機初始化的,里面的數值也是通過梯度下降自動更新的。
然后又定義了“路徑”這個概念,一句話的每一種標注結果就代表一個路徑。下圖就代表兩條路徑。
每條路徑的分數 P=e^s
s = 初始分數 + 轉換分數
初始分數 = 路徑上lstm輸出分數和
轉換分數 = 路徑上轉換矩陣分數和
具體用數學公式進行如下表示:
對於每一個序列輸入,我們得到一個預測label序列,定義這個預測的得分為:
其中Pi,yi為第i個位置網絡結構的預測輸出為yi的概率,即為初始分數。Ayi,yi+1為從yi到yi+1的轉移概率,即為轉換分數。轉移概率矩陣為(n+2)*(n+2),因為額外增加了一個開始位置和結束位置。這個得分函數S就很好地彌補了傳統BiLSTM的不足。
由此可得每條路徑的得分,我們的目標是使得正確的路徑在所有路徑中所占的概率最大化,因此可以用對數最大似然函數。
我們的目標是最大化上式,(即真實標記應該對應最大概率值),因為叫損失函數,所以我們也可以對上式取負然后最小化之,這樣我們就可以使用梯度下降等優化方法來求解參數。在這個過程中,我們要最大化真實標記序列的概率,也就訓練了轉移概率矩陣A和BiLSTM中的參數。
BiLSTM+crf的預測
當模型訓練完畢后,就可以去測試了。
預測的時候,根據訓練好的參數求出所有可能的y序列對應的s得分(這里應該也可以利用維特比算法),然后取:
做為預測結果輸出。
3.Bi-LSTM后加CRF的原因
具體參考:
https://blog.csdn.net/bobobe/article/details/80489303
雙向lstm后接一個softmax層,輸出各個label的概率。那為何還要加一個crf層呢?
我的理解是softmax層的輸出是相互獨立的,即雖然BiLSTM學習到了上下文的信息,但是輸出相互之間並沒有影響,它只是在每一步挑選一個最大概率值的label輸出,最后的標注是各個序列位置標注的拼接,這樣只是獲得的局部最優解而沒有考慮到全局。因此,就會導致所獲得的標注出現不合規則的情況(如B-person后再接一個B-person的問題)。但是在加上CRF之后它是在所有可能的標注結果中選擇整體概率做大的標注結果。每條可能標注的概率是lstm的輸出概率和標注轉換概率之和,這個轉換概率是隨機初始化的並能夠通過訓練進行更新,通過此方法能夠得到的整體最優解通過還能夠避免出現不合理標注的情況。
4.Bert+Bi-LSTM+CRF
“測試輸入文本”
絕對位置信息為[0,1,2,3,4,5]
相對位置信息:以入為中心為[-3,-2,-1,0,1,2]
關於相對位置信息和絕對位置信息的介紹參考:https://zhuanlan.zhihu.com/p/92017824
對比bi-lstm依靠其循環機制,結合t 時刻的輸入和前一時刻的隱層狀態 計算出
,直接通過其順序結構沿時間維度能夠捕獲相對和絕對位置信息。對於序列標注任務而言相對位置信息非常重要,例如:
(需要注意的是,相對位置是具有方向性的(Inc. 與 in 的相對距離為 -1,1854 與 in 的相對距離為 1)
而對於Bert而言,其Position-Encoding輸入的為絕對位置信息,希望通過self-attention來獲得相對位置信息,但是由於Q、K、V都需要先進行線性變換,使得Transformer無法獲得相對位置信息。因此引入Bi-lstm是為了獲得相對位置信息。
具體應用代碼參考
https://blog.csdn.net/luoyexuge/article/details/84728649
個人的github:https://github.com/dylgithub/BERT-BiLSTM-CRF-NER (其中有三個txt文件提供更細致的使用細節描述)
5.CRF和Bi-LSTM+CRF優化目標的區別
對於CRF:在linear-CRF模型參數學習問題中,我們給定訓練數據集X和對應的標記序列Y,K個特征函數fk(x,y),我們優化的目標是最大化條件概率Pw(y|x),以對數似然函數作為損失函數,通過梯度下降法求解模型參數wk。
對於Bi-LSTM+CRF:我們把每種可能的標記序列記為一條路徑,每條路徑的概率值得分一部分由softmax的輸出概率值組成,另一部分由轉移矩陣的概率值組成,我們優化的目標是使得正確的路徑所對應的概率值得分在所有路徑中所占的概率最大化。