成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

徹底了解 BiLSTM 和 CRF 算法

開(kāi)發(fā) 前端 算法
BiLSTM+CRF 是目前比較流行的序列標(biāo)注算法,其將 BiLSTM 和 CRF 結(jié)合在一起,使模型即可以像 CRF 一樣考慮序列前后之間的關(guān)聯(lián)性,又可以擁有 LSTM 的特征抽取及擬合能力。

 CRF 是一種常用的序列標(biāo)注算法,可用于詞性標(biāo)注,分詞,命名實(shí)體識(shí)別等任務(wù)。BiLSTM+CRF 是目前比較流行的序列標(biāo)注算法,其將 BiLSTM 和 CRF 結(jié)合在一起,使模型即可以像 CRF 一樣考慮序列前后之間的關(guān)聯(lián)性,又可以擁有 LSTM 的特征抽取及擬合能力。

[[329170]]

1.前言

在之前的文章《CRF 條件隨機(jī)場(chǎng)》中,介紹了條件隨機(jī)場(chǎng) CRF,描述了 CRF 和 LSTM 的區(qū)別。我們以分詞為例,每個(gè)字對(duì)應(yīng)的標(biāo)簽可以是 s, b, m, e 四種。

給定一個(gè)句子 "什么是地?cái)偨?jīng)濟(jì)",其正確的分詞方式是 "什么 / 是 / 地?cái)?/ 經(jīng)濟(jì)",每個(gè)字對(duì)應(yīng)的分詞標(biāo)簽是 "be / s / be / be"。從下面的圖片可以看出 LSTM 在做序列標(biāo)注時(shí)的問(wèn)題。

 

徹底了解 BiLSTM 和 CRF 算法

 

BiLSTM 分詞

BiLSTM 可以預(yù)測(cè)出每一個(gè)字屬于不同標(biāo)簽的概率,然后使用 Softmax 得到概率最大的標(biāo)簽,作為該位置的預(yù)測(cè)值。這樣在預(yù)測(cè)的時(shí)候會(huì)忽略了標(biāo)簽之間的關(guān)聯(lián)性,如上圖中 BiLSTM 把第一個(gè)詞預(yù)測(cè)成 s,把第二個(gè)詞預(yù)測(cè)成 e。但是實(shí)際上在分詞時(shí) s 后面是不會(huì)出現(xiàn) e 的,因此 BiLSTM 沒(méi)有考慮標(biāo)簽間聯(lián)系。

因此 BiLSTM+CRF 在 BiLSTM 的輸出層加上一個(gè) CRF,使得模型可以考慮類(lèi)標(biāo)之間的相關(guān)性,標(biāo)簽之間的相關(guān)性就是 CRF 中的轉(zhuǎn)移矩陣,表示從一個(gè)狀態(tài)轉(zhuǎn)移到另一個(gè)狀態(tài)的概率。假設(shè) CRF 的轉(zhuǎn)移矩陣如下圖所示。

徹底了解 BiLSTM 和 CRF 算法

CRF 狀態(tài)轉(zhuǎn)移矩陣

則對(duì)于前兩個(gè)字 "什么",其標(biāo)簽為 "se" 的概率 =0.8×0×0.7=0,而標(biāo)簽為 "be" 的概率=0.6×0.5×0.7=0.21。

因此,BiLSTM+CRF 考慮的是整個(gè)類(lèi)標(biāo)路徑的概率而不僅僅是單個(gè)類(lèi)標(biāo)的概率,在 BiLSTM 輸出層加上 CRF 后,如下所示。

 

徹底了解 BiLSTM 和 CRF 算法

 

BiLSTM+CRF 分詞

最終算得所有路徑中,besbebe 的概率最大,因此預(yù)測(cè)結(jié)果為 besbebe。

2.BiLSTM+CRF 模型

CRF 包括兩種特征函數(shù),不熟悉的童鞋可以看下之前的文章。第一種特征函數(shù)是狀態(tài)特征函數(shù),也稱(chēng)為發(fā)射概率,表示字 x 對(duì)應(yīng)標(biāo)簽 y 的概率。

 

徹底了解 BiLSTM 和 CRF 算法

CRF 狀態(tài)特征函數(shù)

在 BiLSTM+CRF 中,這一個(gè)特征函數(shù) (發(fā)射概率) 直接使用 LSTM 的輸出計(jì)算得到,如第一小節(jié)中的圖所示,LSTM 可以計(jì)算出每一時(shí)刻位置對(duì)應(yīng)不同標(biāo)簽的概率。

CRF 的第二個(gè)特征函數(shù)是狀態(tài)轉(zhuǎn)移特征函數(shù),表示從一個(gè)狀態(tài) y1 轉(zhuǎn)移到另一個(gè)狀態(tài) y2 的概率。

徹底了解 BiLSTM 和 CRF 算法

CRF 狀態(tài)轉(zhuǎn)移特征函數(shù)

CRF 的狀態(tài)轉(zhuǎn)移特征函數(shù)可以用一個(gè)狀態(tài)轉(zhuǎn)移矩陣表示,在訓(xùn)練時(shí)需要調(diào)整狀態(tài)轉(zhuǎn)移矩陣的元素值。因此 BiLSTM+CRF 需要在 BiLSTM 的模型內(nèi)增加一個(gè)狀態(tài)轉(zhuǎn)移矩陣。在代碼中如下。

  1. class BiLSTM_CRF(nn.Module): 
  2.     def __init__(self, vocab_size, tag2idx, embedding_dim, hidden_dim): 
  3.         self.word_embeds = nn.Embedding(vocab_size, embedding_dim) 
  4.         self.lstm = nn.LSTM(embedding_dim, hidden_dim // 2, 
  5.                             num_layers=1, bidirectional=True
  6.  
  7.         # 對(duì)應(yīng) CRF 的發(fā)射概率,即每一個(gè)位置對(duì)應(yīng)不同類(lèi)標(biāo)的概率 
  8.         self.hidden2tag = nn.Linear(hidden_dim, self.tagset_size) 
  9.          
  10.         # 轉(zhuǎn)移矩陣,維度等于標(biāo)簽數(shù)量,表示從一個(gè)標(biāo)簽轉(zhuǎn)移到另一標(biāo)簽的概率 
  11.         self.transitions = nn.Parameter( 
  12.             torch.randn(len(tag2idx), len(tag2idx)) 

給定句子 x,其標(biāo)簽序列為 y 的概率用下面的公式計(jì)算。

徹底了解 BiLSTM 和 CRF 算法

 

p(y|x)

公式中的 score 用下面的式子計(jì)算,其中 Emit 對(duì)應(yīng)發(fā)射概率 (即 LSTM 輸出的概率),而 Trans 對(duì)應(yīng)了轉(zhuǎn)移概率 (即 CRF 轉(zhuǎn)移矩陣對(duì)應(yīng)的數(shù)值)

 

徹底了解 BiLSTM 和 CRF 算法

 

score 的計(jì)算公式

BiLSTM+CRF 采用最大似然法訓(xùn)練,對(duì)應(yīng)的損失函數(shù)如下:

徹底了解 BiLSTM 和 CRF 算法

損失函數(shù)

其中 score(x,y) 比較容易計(jì)算,而 Z(x) 是所有標(biāo)簽序列 (y) 打分的指數(shù)之和,如果序列的長(zhǎng)度是 l,標(biāo)簽個(gè)數(shù)是 k,則序列的數(shù)量為 (k^l)。無(wú)法直接計(jì)算,因此要用前向算法進(jìn)行計(jì)算。

用目前主流的深度學(xué)習(xí)框架,對(duì) loss 進(jìn)行求導(dǎo)和梯度下降,即可優(yōu)化 BiLSTM+CRF。訓(xùn)練好模型之后可以采用 viterbi 算法 (動(dòng)態(tài)規(guī)劃) 找出最優(yōu)的路徑。

3.損失函數(shù)計(jì)算

計(jì)算 BiLSTM+CRF 損失函數(shù)的難點(diǎn)在于計(jì)算 log Z(x),用 F 表示 log Z(x),如下公式所示。

 

徹底了解 BiLSTM 和 CRF 算法

 

我們將 score 拆分,變成發(fā)射概率 p 和轉(zhuǎn)移概率 T 的和。為了簡(jiǎn)化問(wèn)題,我們假設(shè)序列的長(zhǎng)度為3,則可以分別計(jì)算寫(xiě)出長(zhǎng)度為 1、2、3 時(shí)候的 log Z 值,如下所示。

 

徹底了解 BiLSTM 和 CRF 算法

 

上式中 p 表示發(fā)射概率,T 表示轉(zhuǎn)移概率,Start 表示開(kāi)始,End 表示句子結(jié)束。F(3) 即是最終得到的 log Z(x) 值。通過(guò)對(duì)上式進(jìn)行變換,可以將 F(3) 轉(zhuǎn)成遞歸的形式,如下。

 

徹底了解 BiLSTM 和 CRF 算法

 

可以看到上式中每一步的操作都是一樣的,操作包括 log_sum_exp,例如 F(1):

  • 首先需要計(jì)算 exp,對(duì)于所有 y1,計(jì)算 exp(p(y1)+T(Start,y1))
  • 求和,對(duì)上一步得到的 exp 值進(jìn)行求和
  • 求 log,對(duì)求和的結(jié)果計(jì)算 log

因此可以寫(xiě)出前向算法計(jì)算 log Z 的代碼,如下所示:

  1. def forward_algorithm(self, probs): 
  2.     def forward_algorithm(probs): 
  3.     ""
  4.     probs: LSTM 輸出的概率值,尺寸為 [seq_len, num_tags],num_tags 是標(biāo)簽的個(gè)數(shù) 
  5.     ""
  6.  
  7.     # forward_var (可以理解為文章中的 F) 保存前一時(shí)刻的值,是一個(gè)向量,維度等于 num_tags 
  8.     # 初始時(shí)只有 Start 為 0,其他的都取一個(gè)很小的值 (-10000.) 
  9.     forward_var = torch.full((1, num_tags), -10000.0)  # [1, num_tags] 
  10.     forward_var[0][Start] = 0.0 
  11.  
  12.     for p in probs:  # probs [seq_len, num_tags],遍歷序列 
  13.         alphas_t = []  # alphas_t 保存下一時(shí)刻取不同標(biāo)簽的累積概率值 
  14.         for next_tag in range(num_tags): # 遍歷標(biāo)簽 
  15.  
  16.             # 下一時(shí)刻發(fā)射 next_tag 的概率 
  17.             emit_score = p[next_tag].view(1, -1).expand(1, num_tags) 
  18.  
  19.             # 從所有標(biāo)簽轉(zhuǎn)移到 next_tag 的概率, transitions 是一個(gè)矩陣,長(zhǎng)寬都是 num_tags 
  20.             trans_score = transitions[next_tag].view(1, -1) 
  21.  
  22.             # next_tag_ver = F(i-1) + p + T 
  23.             next_tag_var = forward_var + trans_score + emit_score 
  24.  
  25.             alphas_t.append(log_sum_exp(next_tag_var).view(1)) 
  26.  
  27.         forward_var = torch.cat(alphas_t).view(1, -1) 
  28.  
  29.     terminal_var = forward_var + self.transitions[Stop] # 最后轉(zhuǎn)移到 Stop 表示句子結(jié)束 
  30.     alpha = log_sum_exp(terminal_var) 
  31.     return alpha 

4.viterbi 算法解碼

訓(xùn)練好模型后,預(yù)測(cè)過(guò)程需要用 viterbi 算法對(duì)序列進(jìn)行解碼,感興趣的童鞋可以參看《統(tǒng)計(jì)學(xué)習(xí)方法》。下面介紹一下 viterbi 的公式,首先是一些符號(hào)的意義,如下:

徹底了解 BiLSTM 和 CRF 算法

然后可以得到 viterbi 算法的遞推公式

徹底了解 BiLSTM 和 CRF 算法

最終可以根據(jù) viterbi 計(jì)算得到的值,往前查找最合適的序列

徹底了解 BiLSTM 和 CRF 算法

最后推薦大家閱讀 pytorch 官網(wǎng)的 BiLSTM+CRF 代碼,通過(guò)代碼更容易理解。

5.參考文獻(xiàn)

ADVANCED: MAKING DYNAMIC DECISIONS AND THE BI-LSTM CRF

 

責(zé)任編輯:武曉燕 來(lái)源: 今日頭條
相關(guān)推薦

2021-04-30 07:23:02

人工智能AI深度學(xué)習(xí)

2019-02-25 09:20:53

2022-04-25 09:03:16

JavaScript代碼

2023-10-27 08:15:45

2018-10-22 08:14:04

2023-05-16 08:35:22

2023-05-29 08:11:42

@Value注解Bean

2010-01-12 13:15:01

VDSL交換機(jī)

2024-01-17 08:18:14

RPAJava技術(shù)

2009-11-17 14:23:30

路由器結(jié)構(gòu)

2010-01-18 17:58:49

軟交換技術(shù)

2019-12-22 06:04:53

IP內(nèi)網(wǎng)外網(wǎng)

2021-08-31 07:02:20

Diff算法DOM

2020-10-16 09:34:39

漏桶令牌桶限流

2013-10-10 10:34:47

哈希算法

2014-10-30 14:19:13

本文由簡(jiǎn)單的字符串匹配

2021-09-14 07:06:12

Android磁盤(pán)緩存

2009-11-23 11:08:21

ADSL寬帶路由器設(shè)置

2019-12-27 09:29:46

負(fù)載均衡算法哈希算法

2024-07-03 11:23:14

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 亚洲成人一区 | 国产成人综合在线 | 蜜桃视频在线观看免费视频网站www | 天堂成人av | 日本免费视频在线观看 | 老妇激情毛片免费 | 久久新 | 人人鲁人人莫人人爱精品 | 五十女人一级毛片 | 国产精品视频一 | yiren22综合网成人 | 久草.com | 91精品国产乱码久久蜜臀 | 亚洲国产一区视频 | 久久综合伊人一区二区三 | 6996成人影院网在线播放 | 91国产精品| 日韩精品久久久久 | 欧美在线一区二区三区 | 亚洲精品 在线播放 | 97人人超碰 | 精品日韩一区 | 日韩精品一区二区三区 | 中文字幕亚洲精品在线观看 | 中文字幕成人在线 | 免费观看av网站 | 国产一区成人 | 91精品国产91综合久久蜜臀 | 免费av观看 | 四虎最新视频 | 久久免费视频观看 | 九色av| 精品乱码久久久久 | 毛片入口 | 欧美久久久网站 | 一级毛片视频免费观看 | 亚洲国产网站 | 一区二区在线不卡 | 在线精品一区二区三区 | 精品一二三区视频 | 国产成人综合一区二区三区 |