ALBERT BiLSTM CRF實現序列標註

2022-05-18 18:52:16 字數 2408 閱讀 8207

一、模型框架圖

二、分層介紹

1)albert層

albert是以單個漢字作為輸入的(本次配置最大為128個,短句做padding),兩邊分別加上開始標識cls和結束標識sep,輸出的是每個輸入word的embedding。在該框架中其實主要就是利用了預訓練模型albert的詞嵌入功能,在此基礎上fine-tuning其後面的連線引數,也就是albert內部的訓練引數不參與訓練。

2)bilstm層

該層的輸入是albert的embedding輸出,一般中間會加個project_layer,保證其輸出是[batch_szie,num_steps, num_tags]。batch_size為模型當中batch的大小,num_steps為輸入句子的長度,本次配置為最大128,num_tags為序列標註的個數,如圖中的序列標註一共是5個,也就是會輸出每個詞在5個tag上的分數,由於沒有做softmax歸一化,所以不能稱之為概率值。

3)crf層

如果沒有crf層,直接按bilstm每個詞在5個tag的最大分數作為輸出的話,可能會出現【b-person,o,i-person,o,i-location】這種序列,顯然不符合實際情況。crf層可以加入一些約束條件,從而保證最終**結果是有效的。

例如

句子的開頭應該是「b-」或「o」,而不是「i-」。

「b-label1 i-label2 i-label3…」,在該模式中,類別1,2,3應該是同一種實體類別。比如,「b-person i-person」 是正確的,而「b-person i-location」則是錯誤的。

「o  i-label」是錯誤的,命名實體的開頭應該是「b-」而不是「i-」。

這些約束可以在訓練資料時被crf層自動學習得到,這種異常的序列出現概率就會大大降低。

三、如何訓練?

在從bilstm層進入到crf層時,會有多種路徑選擇,像上圖中會有5x5x5x5x5種路徑可能,假設s是我們要尋找的正確路徑,其出現的概率如下:

是當前序列的分數,分母是所有序列分數的和,這也是我們的求解loss function。es

'>傳統crf主要由特徵函式組成,乙個是狀態特徵函式,乙個是轉移特徵函式,函式的值要麼為1,要麼為0,通過訓練其權重λ來改變特徵函式的貢獻。而這裡對路徑s的訓練沒有權重,但也是由兩部分組成:es

'>1)emissionscore(發射分數):由bilstm層訓練輸出的每個位置對各個tag的分數,就是上圖中輸出的紅色字型分數。es

'>2)

transitionscore**移分數): 這部分主要由crf層訓練得到,如下圖

所以,s=emissionscore+transitionscore

舉例:

對於序列來說,比如有乙個序列是「start b-person i-person o b-location o end」,則

emissionscore=x0,s

tart

+x1,b-p

erso

n+x2,i-

pers

on+x3,

o+x4,b-

location

+x5,

o+x6,end

transitionscore=tsta

rt−>b-p

erso

n+tb−p

erso

n−>i-p

erso

n+ti-pe

rson

−>

o+t0

−>

b-location

+tb-

location

CoordinatorLayout實現標題欄的隱藏

coordinatorlayout是design包裡面的乙個控制項。所以在使用時需要導包。compile com.android.support design 24.1.1 layout scrollflags中的幾個值 scroll 所有想滾動出螢幕的view都需要設定這個flag,沒有設定這個f...

GridView實現多標頭

1 建立乙個類,public class multtitle title 為乙個自定義的titles類陣列,其有兩個屬性,乙個為span 要合併的列數 乙個是text 單元格中內容。關於titles類請自己定義,很容易的。public static void createtitle object s...

HTML基礎第八講 序列卷標

什麼叫做序列卷標?其實,這是乙個大家都蠻熟悉的東西,只是在網頁中換個名稱來稱呼罷了,序列卷標的功能在word裡面叫做 專案符號及編號 也就是將每一要點以數字,如 1.2.3.4 或符號一條一條的清楚的列出的功能。無序卷標 其中 有序卷標 其中卷標即為 有序列表卷標 每增加一列內容,就必須加乙個。和無...