BILSTM-CRF
- 2.6 推斷新句子的标簽
- 參考
聲明:本系列轉載自createmomo大神的部落格https://createmomo.github.io,并在其中加入一些新的内容,如有侵權請及時聯系。
2.6 推斷新句子的标簽
在前面的部分中,我們學習了BiLSTM-CRF模型的結構和CRF損失函數的細節。您可以通過各種開源架構(Keras,Chainer,TensorFlow等)實作您自己的BiLSTM-CRF模型。最重要的事情之一是在這些架構上自動計算模型的反向傳播,是以您不需要自己實作反向傳播來訓練模型(即計算梯度和更新參數)。此外,一些架構已經實作了CRF層,是以隻需添加一行代碼就可以非常輕松地将CRF層與您自己的模型相結合。
在本節中,我們将探讨在模型準備好時如何在測試期間推斷出句子的标簽。
第1步:BiLSTM-CRF模型的emission和transition score
我們有一個3個字的句子: x = [ w 0 , w 1 , w 2 ] x=[w_0, w_1, w_2] x=[w0,w1,w2]。此外,假設我們已經獲得了BiLSTM模型的emission score和CRF層的transition score:
l 1 l_1 l1 | l 2 l_2 l2 | |
---|---|---|
w 0 w_0 w0 | w 01 w_{01} w01 | w 02 w_{02} w02 |
w 1 w_1 w1 | w 11 w_{11} w11 | w 12 w_{12} w12 |
w 2 w_2 w2 | w 21 w_{21} w21 | w 22 w_{22} w22 |
x i j x_{ij} xij表示 w i w_i wi的分數被标記為 l j l_j lj。
l 1 l_1 l1 | l 2 l_2 l2 | |
---|---|---|
l 1 l_1 l1 | t 11 t_{11} t11 | t 12 t_{12} t12 |
l 2 l_2 l2 | t 21 t_{21} t21 | t 22 t_{22} t22 |
t i j t_{ij} tij是标簽 i i i轉移到标簽 j j j的分數
第2步:開始推理
如果您熟悉Viterbi算法,這部分對您來說很容易。但如果你不是,請不要擔心。與前一節類似,我将逐漸解釋算法。我們将從句子的左側到右側運作推理算法,如下所示:
w 0 w_0 w0
w 0 w_0 w0–> w 1 w_1 w1
w 0 w_0 w0–> w 1 w_1 w1–> w 2 w_2 w2
您将看到兩個變量: o b s obs obs和 p r e v i o u s previous previous。 p r e v i o u s previous previous存儲前面步驟的最終結果。 o b s obs obs表示來自目前單詞的資訊。
a l p h a 0 alpha_0 alpha0是成績最好的曆史, a l p h a 1 alpha_1 alpha1是其對應的索引。這兩個變量的細節将在它們出現時進行解釋。請看下圖:您可以将這兩個變量視為狗在探索森林時沿路行駛的“标記”,這些“标記”将有助于幫助他找到回家的路。
圖2.2:狗需要找到最好的路徑來獲得他最喜歡的骨頭玩具并按照他來的方式回家
w 0 w_0 w0:
o b s = [ x 01 , x 02 ] obs=[x_{01}, x_{02}] obs=[x01,x02]
p r e v i o u s = N o n e previous=None previous=None
目前,我們正在觀察第一個詞 w 0 w_0 w0。到目前為止, w 0 w_0 w0的最佳标簽很簡單。例如,如果 o b s = [ x 01 = 0.2 , x 02 = 0.8 ] obs=[x_{01}=0.2, x_{02}=0.8] obs=[x01=0.2,x02=0.8],顯然, w 0 w_0 w0的最佳标簽應該是 l 2 l_2 l2,由于标簽之間隻有一個單詞且沒有轉換,是以不使用轉換分數。
w 0 w_0 w0 --> w 1 w_1 w1:
o b s = [ x 11 , x 12 ] obs=[x_{11, x_{12}}] obs=[x11,x12]
p r e v i o u s = [ x 01 , x 02 ] previous=[x_{01}, x_{02}] previous=[x01,x02]
1).擴充 p r e v i o u s previous previous:
p r e v i o u s = ( p r e v i o u s [ 1 ] p r e v i o u s [ 1 ] p r e v i o u s [ 0 ] p r e v i o u s [ 0 ] ) = ( x 02 x 02 x 01 x 01 ) previous=\left(^{previous[0] \quad previous[0]}_{previous[1] \quad previous[1]}\right)=\left(^{x_{01} \quad x_{01}}_{x_{02} \quad x_{02}}\right) previous=(previous[1]previous[1]previous[0]previous[0])=(x02x02x01x01)
2).擴充 o b s obs obs
o b s = ( o b s [ 0 ] o b s [ 1 ] o b s [ 0 ] o b s [ 1 ] ) = ( x 11 x 12 x 11 x 12 ) obs=\left(^{obs[0] \quad obs[1]}_{obs[0] \quad obs[1]}\right)=\left(^{x_{11} \quad x_{12}}_{x_{11} \quad x_{12}}\right) obs=(obs[0]obs[1]obs[0]obs[1])=(x11x12x11x12)
3).計算 p r e v i o u s previous previous, o b s obs obs, t r a n s i t i o n transition transition分數和
s c o r e s = ( x 02 x 02 x 01 x 01 ) + ( x 11 x 12 x 11 x 12 ) + ( t 21 t 22 t 11 t 12 ) scores=\left(^{x_{01} \quad x_{01}}_{x_{02} \quad x_{02}}\right) + \left(^{x_{11} \quad x_{12}}_{x_{11} \quad x_{12}}\right) + \left(^{t_{11} \quad t_{12}}_{t_{21} \quad t_{22}}\right) scores=(x02x02x01x01)+(x11x12x11x12)+(t21t22t11t12)
然後:
s c o r e s = ( x 02 + x 11 + t 21 x 02 + x 12 + t 22 x 01 + x 11 + t 11 x 01 + x 12 + t 12 ) scores=\left(^{x_{01}+x_{11}+t_{11} \quad x_{01}+x_{12}+t_{12}}_{x_{02}+x_{11}+t{21} \quad x_{02}+x_{12}+t_{22}}\right) scores=(x02+x11+t21x02+x12+t22x01+x11+t11x01+x12+t12)
當我們計算所有路徑的總分時,您可能會發現這與前面的部分沒有差別,并對此産生疑惑。請耐心細緻,您很快就會看到差異。
更改下一次疊代的 p r e v i o u s previous previous值:
p r e v i o u s = [ max ( s c o r e s [ 00 ] , s c o r e s [ 10 ] ) , max ( s c o r e s [ 01 ] , s c o r e s [ 11 ] ) ] previous=[\max (scores[00], scores[10]),\max (scores[01],scores[11])] previous=[max(scores[00],scores[10]),max(scores[01],scores[11])]
例如,如果你的分數是:
s c o r e s = ( x 02 + x 11 + t 21 x 02 + x 12 + t 22 x 01 + x 11 + t 11 x 01 + x 12 + t 12 ) = ( 0.5 0.4 0.2 0.3 ) scores=\left(^{x_{01}+x_{11}+t_{11} \quad x_{01}+x_{12}+t_{12}}_{x_{02}+x_{11}+t{21} \quad x_{02}+x_{12}+t_{22}}\right)=\left( ^{0.2 \quad 0.3}_{0.5 \quad 0.4}\right) scores=(x02+x11+t21x02+x12+t22x01+x11+t11x01+x12+t12)=(0.50.40.20.3)
我們下一次疊代的 p r e v i o u s previous previous将是:
p r e v i o u s = [ max ( s c o r e s [ 00 ] , s c o r e s [ 10 ] ) , max ( s c o r e s [ 01 ] , s c o r e s [ 11 ] ) ] = [ 0.5 , 0.4 ] previous=[\max (scores[00], scores[10]),\max (scores[01],scores[11])] = [0.5, 0.4] previous=[max(scores[00],scores[10]),max(scores[01],scores[11])]=[0.5,0.4]
p r e v i o u s previous previous是什麼意思? p r e v i o u s previous previous清單存儲目前單詞對每個标簽的最大分數。
[示例開始]
例如:
在我們的語料庫中,我們總共有2個标簽, l a b e l 1 ( l 1 ) label1(l_1) label1(l1)和 l a b e l 2 ( l 2 ) label2(l_2) label2(l2),這兩個标簽的索引分别為0和1。
p r e v i o u s [ 0 ] previous[0] previous[0]是以第0個标簽 l 1 l_1 l1結束的路徑的最大分數,類似的 p r e v i o u s [ 1 ] previous[1] previous[1]是以 l 2 l_2 l2結束的路徑的分數。在每次疊代過程中,我們僅僅保留每個标簽對應的最優路徑的資訊( p r e v i o u s = [ max ( s c o r e s [ 00 ] , s c o r e s [ 10 ] ) , max ( s c o r e s [ 01 ] , s c o r e s [ 11 ] ) ] previous=[\max(scores[00], scores[10]),\max( scores[01], scores[11])] previous=[max(scores[00],scores[10]),max(scores[01],scores[11])])。分數較少的路徑資訊将被丢棄。
[示例結束]
回到我們的主要任務:
同時,我們還有兩個變量來存儲曆史資訊(分數和索引),即 a l p h a 0 alpha_0 alpha0和 a l p h a 1 alpha_1 alpha1。
本次疊代,我們将添加最好的分數到 a l p h a 0 alpha_0 alpha0。為友善起見,每個标簽的最高分都有下劃線。
s c o r e s = ( x 02 + x 11 + t 21 ‾ x 02 + x 12 + t 22 ‾ x 01 + x 11 + t 11 x 01 + x 12 + t 12 ) = ( 0.5 ‾ 0.4 ‾ 0.2 0.3 ) scores=\left(^{x_{01}+x_{11}+t_{11} \quad x_{01}+x_{12}+t_{12}}_{\underline{x_{02}+x_{11}+t{21}} \quad \underline{x_{02}+x_{12}+t_{22}}}\right)=\left( ^{0.2 \quad 0.3}_{\underline{0.5} \quad \underline{0.4}}\right) scores=(x02+x11+t21x02+x12+t22x01+x11+t11x01+x12+t12)=(0.50.40.20.3)
a l p h a 0 = [ ( s c o r e s [ 10 ] , s c o r e s [ 11 ] ) ] = [ ( 0.5 , 0.4 ) ] alpha_0=[(scores[10],scores[11])]=[(0.5,0.4)] alpha0=[(scores[10],scores[11])]=[(0.5,0.4)]
另外,相應的列的索引被儲存在 a l p h a 1 alpha_1 alpha1:
a l p h a 1 = [ ( C o l u m n I n d e x ( s c o r e s [ 10 ] ) , C o l u m n I n d e x ( s c o r e s [ 11 ] ) ) ] = [ ( 1 , 1 ) ] alpha_1=[(ColumnIndex(scores[10]),ColumnIndex(scores[11]))]=[(1,1)] alpha1=[(ColumnIndex(scores[10]),ColumnIndex(scores[11]))]=[(1,1)]
其中, l 1 l_1 l1的索引是0, l 2 l_2 l2的索引是1,是以 ( 1 , 1 ) = ( l 2 , l 2 ) (1, 1)=(l_2, l_2) (1,1)=(l2,l2),這意味着對于目前的單詞 w i w_i wi和标簽 l ( i ) l^(i) l(i):
( 1 , 1 ) = ( l 2 , l 2 ) = ( 當 路 徑 是 l ( i − 1 ) = l 2 ‾ − > l ( i ) = l 1 ‾ 時 我 們 可 以 得 到 最 大 分 數 0.5 , 當 路 徑 是 l ( i − 1 ) = l 2 ‾ − > l ( i ) = l 2 ‾ 時 我 們 可 以 得 到 最 大 分 數 0.4 ) (1, 1)=(l_2, l_2)=(當路徑是\underline{l^{(i-1)}=l_2} -> \underline{l^{(i)}=l_1}時我們可以得到最大分數0.5, 當路徑是\underline{l^{(i-1)}=l_2} -> \underline{l^{(i)}=l_2}時我們可以得到最大分數0.4) (1,1)=(l2,l2)=(當路徑是l(i−1)=l2−>l(i)=l1時我們可以得到最大分數0.5,當路徑是l(i−1)=l2−>l(i)=l2時我們可以得到最大分數0.4)
l ( i − 1 ) l^{(i-1)} l(i−1)是前一個單詞 w i − 1 w_{i-1} wi−1對應的标簽
w 0 w_0 w0 --> w 1 w_1 w1 --> w 2 w_2 w2:
o b s = [ x 21 , x 22 ] obs=[x_{21}, x_{22}] obs=[x21,x22]
p r e v i o u s = [ 0.5 , 0.4 ] previous=[0.5, 0.4] previous=[0.5,0.4]
1).擴充 p r e v i o u s previous previous:
p r e v i o u s = ( p r e v i o u s [ 1 ] p r e v i o u s [ 1 ] p r e v i o u s [ 0 ] p r e v i o u s [ 0 ] ) = ( 0.4 0.4 0.5 0.5 ) previous=\left(^{previous[0] \quad previous[0]}_{previous[1] \quad previous[1]}\right)=\left(^{0.5 \quad 0.5}_{0.4 \quad 0.4}\right) previous=(previous[1]previous[1]previous[0]previous[0])=(0.40.40.50.5)
2).擴充 o b s obs obs
o b s = ( o b s [ 0 ] o b s [ 1 ] o b s [ 0 ] o b s [ 1 ] ) = ( x 21 x 22 x 21 x 22 ) obs=\left(^{obs[0] \quad obs[1]}_{obs[0] \quad obs[1]}\right)=\left(^{x_{21} \quad x_{22}}_{x_{21} \quad x_{22}}\right) obs=(obs[0]obs[1]obs[0]obs[1])=(x21x22x21x22)
3).計算 p r e v i o u s previous previous, o b s obs obs, t r a n s i t i o n transition transition分數和
s c o r e s = ( 0.4 0.4 0.5 0.5 ) + ( x 21 x 22 x 21 x 22 ) + ( t 21 t 22 t 11 t 12 ) scores=\left(^{0.5 \quad 0.5}_{0.4 \quad 0.4}\right) +\left(^{x_{21} \quad x_{22}}_{x_{21} \quad x_{22}}\right)+ \left(^{t_{11} \quad t_{12}}_{t_{21} \quad t_{22}}\right) scores=(0.40.40.50.5)+(x21x22x21x22)+(t21t22t11t12)
然後:
s c o r e s = ( 0.4 + x 21 + t 21 0.4 + x 22 + t 22 0.5 + x 21 + t 11 0.5 + x 22 + t 12 ) scores=\left(^{0.5+x_{21}+t_{11} \quad 0.5+x_{22}+t_{12}}_{0.4+x_{21}+t{21} \quad 0.4+x_{22}+t_{22}}\right) scores=(0.4+x21+t210.4+x22+t220.5+x21+t110.5+x22+t12)
更改下一次疊代的 p r e v i o u s previous previous值:
p r e v i o u s = [ max ( s c o r e s [ 00 ] , s c o r e s [ 10 ] ) , max ( s c o r e s [ 01 ] , s c o r e s [ 11 ] ) ] previous=[\max (scores[00], scores[10]),\max (scores[01],scores[11])] previous=[max(scores[00],scores[10]),max(scores[01],scores[11])]
比方說,我們在這次疊代中得到的分數是:
s c o r e s = ( 0.8 ‾ 0.7 0.6 0.9 ‾ ) scores=\left( ^{0.6 \quad \underline{0.9}}_{\underline{0.8} \quad 0.7}\right) scores=(0.80.70.60.9)
是以,我們可以獲得最新的 p r e v i o u s previous previous:
p r e v i o u s = [ 0.8 , 0.9 ] previous=[0.8, 0.9] previous=[0.8,0.9]
實際上, p r e v i o u s p [ 0 ] previousp[0] previousp[0]和 p r e v i o u s [ 1 ] previous[1] previous[1]之間的較大的一個是最好的預測結果的分數。與此同時,每個标簽的最大分數和索引将被添加到 a l p h a 0 alpha_0 alpha0和 a l p h a 1 alpha_1 alpha1中:
a l p h a 0 = [ ( 0.5 , 0.4 ) , ( s c o r e s [ 10 ] , s c o r e s [ 01 ] ) ‾ ] alpha_0=[(0.5,0.4),\underline{(scores[10],scores[01])}] alpha0=[(0.5,0.4),(scores[10],scores[01])]
= [ ( 0.5 , 0.4 ) , ( 0.8 , 0.9 ) ‾ ] \quad \quad \quad=[(0.5,0.4),\underline{(0.8,0.9)}] =[(0.5,0.4),(0.8,0.9)]
a l p h a 1 = [ ( 1 , 1 ) , ( 1 , 0 ) ‾ ] alpha_1=[(1,1),\underline{(1,0)}] alpha1=[(1,1),(1,0)]
第3步:找出得分最高的最佳路徑
在該步驟中, p r e v i o u s p [ 0 ] previousp[0] previousp[0]和 p r e v i o u s [ 1 ] previous[1] previous[1]将被将被用于找到最高的分數。我們将從最後一個到第一個元素去查找最優路線。
w 1 w_1 w1 --> w 2 w_2 w2:
首先,檢查 a l p h a 0 alpha_0 alpha0和 a l p h a 1 alpha_1 alpha1最後一個元素:(0.8, 0.9)和(1, 0)。0.9是最高分數,其對應的位置是1,是以對應的标簽是 l 2 l_2 l2。繼續從 a l p h a 1 alpha_1 alpha1中對應位置獲得 w 1 w_1 w1對應的标簽索引, 即(1, 0)[1]=0。索引0表示 w 1 w_1 w1對應的标簽是 l 1 l_1 l1。是以我們可以得到 w 1 − > w 2 w_1 -> w_2 w1−>w2的最佳路徑是 l 1 − > l 2 l_1 -> l_2 l1−>l2。
w 0 w_0 w0 --> w 1 w_1 w1:
第二,我們繼續向前移動并獲得 a l p h a 1 alpha_1 alpha1的上一個元素:(1, 1)。從上面可知 w 1 w_1 w1的标簽是 l 1 l_1 l1(标簽對應的索引為0),是以我們可以得到 w 0 w_0 w0對應的标簽索引為(1,1)[0]=1。是以我們可以得到 w 0 − > w 1 w_0 -> w_1 w0−>w1的最佳路徑是 l 2 − > l 1 l_2 -> l_1 l2−>l1。
最終可以得到 w 0 − > w 1 − > w 2 w_0 -> w_1 -> w_2 w0−>w1−>w2的最佳路徑是 l 2 − > l 1 − > l 2 l_2 -> l_1 -> l_2 l2−>l1−>l2
參考
[1] Lample, G., Ballesteros, M., Subramanian, S., Kawakami, K. and Dyer, C., 2016. Neural architectures for named entity recognition. arXiv preprint arXiv:1603.01360. https://arxiv.org/abs/1603.01360