End-to-end Sequence Labeling via Bi-directional LSTM-CNNs-CRF

該文章首先使用卷積神經網絡將單詞的字符級信息編碼成其字符級表示形式, 之後將字符級和單詞級表示形式進行組合, 並將它們輸入到雙向 LSTM 中, 以對每個單詞的上下文信息進行建模. 在 BLSTM 上, 使用順序 CRF 聯合解碼整個句子的標籤. 這個論文很經典, 值得細看.

上圖是用 CNN 提取 字符級信息的示意圖, 首先輸入是一個一個的字符. 如 “Pad, P, l, a, y, i, n, g, Pad”. 通過 lookup embedding 或者預訓練得到的字向量, 將這些字符轉化爲向量表示”$W_{char} = w_{0}^{char}, w_{1}^{char}, w_{2}^{char}, w_{3}^{char}, w_{4}^{char}, w_{5}^{char}, w_{6}^{char}, w_{7}^{char}, w_{8}^{char}$”. 對 $W_{char}$ 做卷積, 卷積核的深度是 $w_{i}^{char}$ 的維度, 寬度自己定, 一般可以取 3, 5 這種. 最終採用 均值池化或最大值池化 來獲取固定維度的輸出. 論文裏卷積核寬度爲3, 採用最大池化. 用了 30 個卷積核.

經過上面方法得到的字符級表示將會和詞級別的表示連接在一起, 作爲整個詞的輸入向量 $W = w_{0}, w_{1}, \dots, w_{8}$, 而後輸入到 BLSTM 和CRF 做預測. 網絡結構如下圖所示

word embedding 用的是 Glove,在 60 億 Wikipedia 和 網絡文本上訓練得到的 100 維詞向量. char 的 embedding 採用的是在

範圍內的隨機初始化. 其中 wordDim 論文裏用的是 30.

對於正向 LSTM, 它從前向後讀取每個時間步的輸入, 我們取得每個時間步的輸出 $H^{正} = ( h_{1}^{正}, h_{2}^{正}, \dots, h_{n}^{正} )$ 作爲正向 LSTM 的輸出. 方向 LSTM 以相反的時間步獲取文本輸入而後得到每個時間步的輸出 $H^{反} = ( h_{1}^{反}, h_{2}^{反}, \dots, h_{n}^{反} )$. 最終我們把對應時間步的正向和反向的 LSTM 輸出拼接得到 BLSTM 層的輸出. $H = {(H_{1}^{正}, H_{1}^{反}), (H_{2}^{正}, H_{2}^{反}), \dots, (H_{n}^{正}, H_{n}^{反}) } $.

CRF 可以利用全局信息進行標記. 充分考慮當前標記受前面標記的影響. 下面介紹 CRF 在 BLSTM 後是怎麼坐的.

BLSTM 的輸出經過 softmax 後得到的是一個 $n\times k$ 的矩陣 P, 其中n 是序列長度, k 是類別數量. 因此 $P_{i, j}$ 表示第 i 個詞的 第 j 個預測標籤. 對於某一預測序列 $ y = (y_{1}, y_{2}, \dots, y_{n}) $, 可以定義如下分數:

其中 A 是轉移分數, 其中 $ A_{i, j}$ 表示從標籤 i 轉移到 標籤 j 的分數. $y_{0}$ 和 $y_{n+1}$ 表示 start 和 end 標籤. 因此轉移矩陣 A 是一個 $k+2$ 的方陣. 將每個可能的序列得分 s 綜合起來 輸入到 softmax 中, 得到每個序列對應的概率

在訓練期間, 將會最大化正確標籤的對數概率, 即

其中 $Y_{X}$ 表示輸入序列 X 對應的所有可能的標籤序列. 通過最大化上式, 模型將會學習有效正確的標籤順序, 避免如(IOB) 這樣的輸出. 在解碼時, 求解使得分數 s 最高的標籤序列

因爲這裏的轉移矩陣只考慮了 bigram 的相互作用. 所以在優化和解碼時可以直接用 DP 計算.

Leveraging linguistic structures for named entity recognition with bidirectional recursive neural networks

論文使用基於文本語言學結構(linguistic structures)的 BRNN-CNN 網絡(一個附加了卷積神經網絡的特殊 RNN)來提升 NER 性能. 這種改進的動機是NER 和 語言學組分高度相關. 與傳統的序列標註系統不同, 系統首先確定文本塊是否是語言成分來識別哪些文本塊是可能的命名實體. 然後通過句法和語義信息遞歸地傳播到每個組成節點, 使用成分結構樹(constituency tree) 對這些塊進行分類. 該方法獲得了當時的最優性能.

NER 可以看做是查找命名實體塊和命名實體塊分類兩個任務的組合. 經典的順序標註方法幾乎不瞭解句子的短語結構。 但是,根據改論文的分析,大多數命名實體塊實際上是語言成分,例如 名詞短語。 這促使作者專注於NER的基於成分的方法,其中NER問題被轉換爲成分結構的每個節點上的命名實體分類任務。

標記流程爲:

  • 從選取結構中提取特徵
  • 遞歸的對每個選取結構進行分類
  • 解決預測衝突

這裏記一下成分分析. 所謂成分分析, 簡單來說就是識別句子中的 如名詞短語, 動詞短語, 並以樹結構的形式展現出來, 也就是成分結構樹. 下圖是一個例子

葉子節點就是輸入的句子中的每個詞, NP 是名詞短語, VP 是動詞短語.

改論文就對輸入的句子通過啓發式規則等方法整理成類似成分樹的樣子. 其中每個節點包含: POS, word 和 head 信息. 對於每個word, 通過 Glove 得到嵌入向量. 同時爲了捕捉形態學信息, 又通過一系列的卷積和 highway 層來生成利用了 char level 的表示, 最終把 char level 和 word level 的表示連接在一起作爲 word 的最終表示.

遺憾的是論文裏沒找到具體是怎麼處理 char level 的, 只有上面那句話….有種被騙了的感覺….

給定一個成分分析樹,其中每個節點代表一個組成部分. 網絡爲每個節點遞歸計算兩個隱藏狀態特徵: $H_{bot}$, $H_{top}$. 如下圖所示

最終對於每個節點, 根據 H 計算 NER 標記的概率分佈預測類別.

Neural Reranking for Named Entity Recognition

Reranking 是通過利用更多抽象特徵來提高系統性能的框架。Reranking 系統可以充分利用全局特徵,而在使用精確解碼的基線序列標記系統中這是很難處理的。 重排序方法已用於許多NLP任務中, 如 parsing, 機器翻譯, QAs.

在沒有用深度學習進行 NER 的rerank 之前, Colins (2002) 嘗試使用增強算法和投票感知器算法作爲命名實體邊界(沒有實體分類)的 Reranking 模型. Nguyen(2010) 將帶有內核的支持向量機 SVM 應用於模型重新排序, 從而在 CoNLL03 數據集上獲得了較高的 F 值. Yoshida 和 Tsujii 在生物醫學 NER 任務上使用了簡單的對數線性模型重新排名模型, 也獲得了一些改進. 但前面的這些方法均採用稀疏的人工特徵, 因此該論文是深度學習用於 NER Reranking 的一次嘗試.

改論文首先選擇了兩個 baseline 模型: CRF 和 BLSTM-CRF 模型來做 NER. 其中 CRF 採用瞭如下特徵:

其中 shape 表示字符是否爲數字/字母, captial 表示單詞是否以大寫開頭. connect words 包含5個類型: “of”, “and”, “for”, “-“, other. Prefix 和 suffix 包含每個詞的 4-level 前綴和後綴.

至於模型方面, 則比較基礎, 它們的結構如下圖所示:

有了 baseline 模型, 接下來將獲取它的輸出作爲排序模型的輸入. 設 baseline 模型的 n-best 序列輸出爲 ${L_{1}, L_{2}, \dots, L_{n}}$. 其中的每個序列 ${l_{i1}, l_{i2}, \dots, l_{it}}$. 舉個例子, 輸入爲 “Barack Obama was born in hawaii .”, 那麼$L_{i}$ 就是 “B-PER I-PER O O O B-LOC O .”$C_{2}$ 或者 “LOC O O O O .” (C3) 這種. 接下來將 NER 的實體合併,並將 O 標記的用對應的單詞替換掉. 如 C2 就可以得到 “PER was born in LOC .”. 這樣得到 rerank 模型的輸入$C_{1}, C_{2}, \dots, C_{n}$.

模型採用固定窗口大小的 CNN 來獲取詞的字符級表示(和第一個論文裏的一樣), CNN 窗口大小爲3, 池化採用最大池化, 卷積核的數量爲 50. 通過該方式得到的 word 表示和 SENNA 得到的 word 嵌入表示連接得到最終的 word 表示. 對於未登錄詞, 在

範圍內進行隨機初始化.

模型分別用 LSTM 和 CNN 來提取輸入序列的特徵. 對於 LSTM , 選取最後時間步的輸出 $h_{LSTM}$ 作爲 LSTM 的特徵, CNN 的話, 就是普通的 CNN 對輸入序列進行卷積和池化操作得到 $h_{CNN}$.

接下來 LSTM 特徵和 CNN 特徵將會連接到一起得到 $h(C_{i})$, 而後通過 $s(C_{i}) = \sigma(Wh(C_{i}) + b)$ 得到該序列的分數.

解碼通過聯合 baseline 的輸出概率$p(L_{i})$ 和 rerank 模型的得分的加權和作爲輸入序列的最終分數. 最終選取綜合得分最高的序列作爲 rerank 解碼的序列.

損失函數採用平方誤差損失函數加 L2 正則項.

Neural Architectures for Named Entity Recognition

傳統的 NER 解決方案是把它當做一個序列標註問題來解決. 但在改論文中, 借鑑了 Dyer 的基於 轉移的依存句法分析模型套路. 並將其用到了 NER 中.

舉個例子, 現在我們有輸入 “ Mark Watney visited Mars”, 想對它進行 NER 標記.

首先定義兩個棧: stack 和 output. 其中 stack 用來存儲存儲待分類的 chunk, output 存儲已經標記好的輸出序列. 再定義一個緩存區 Buffer, 它裏面裝着沒被處理的詞. 再定義一些動作. 其中 SHIFT 表示將詞從 Buffer 移動到 stack, OUT 表示將詞從 Buffer 移動到 output. REDUCE(y) 表示將 stack 中的所有詞打包成一個實體, 並賦予標記 y. 同時將該實體的表示放到 output 中. 算法處理的流程如下圖所示

  • 首先開始時, output 和 stack 爲空. Buffer 存了全部的詞.
  • 第一步模型輸出 SHIFT, Buffer 頂端元素 Mark 出棧, Stack 將該元素入棧.
  • 第二步模型輸出 SHIFT, Buffer 頂端元素 Watney 出棧, Stack 將該元素入棧.
  • 第三步模型輸出 REDUCE(PER), Stack 元素被打包成一個實體, (Mark Watney), 賦予類別 PER, 從 Stack 出棧, output 將該(Mark Watney)-PER 入棧
  • 第四步模型輸出OUT, Buffer 頂端元素 visited 出棧, output 將該元素入棧
  • 第五步模型輸出 SHIFT, Buffer 頂端元素 Mars 出棧, Stack 將該元素入棧.
  • 第六步模型輸出 REDUCE(LOC), Stack 元素被打包成一個實體, (Mars), 賦予類別 PER, 從 Stack 出棧, output 將該(Mras)-LOC 入棧
  • Buffer 和 Stack 都爲空, 算法終止.

給定當前 stack, buffer, output 和 動作的歷史記錄, 採用堆疊(stack) LSTMs 來分別計算它們的固定維度嵌入, 而後把它們四個連接起來作爲綜合的表示. 模型根據該綜合表示得到每個時間步的概率分佈, 並選貪婪的取概率最大那個作爲當前動作, 儘管這種得到的結果不是最優的, 但論文裏說, 效果還不錯. 當輸入序列長度爲 n 時, 那麼輸出最多的時間步 爲 2n.

那麼怎麼獲得它們的向量表示呢? 論文分爲兩個部分 , 一個是基於字符的詞表示, 另一個是基於 word 的表示. 對於 word 的表示, 論文采用 Word2vec 得到預訓練的詞向量. 對於 字符級表示, 論文采用 雙向的 LSTM 來得到. 模型結構如下圖所示(和前面 RNN 提取字符綜述那的一樣….):

論文認爲, 以往雖然有用 CNN 提取字符級特徵的, 但 LSTM 由於時間序列中最後輸入的那些時間步影響更大, 因此前向 LSTM 可以獲取後綴特徵, 後向 LSTM 可以獲取前向特徵. 而這些特徵是嚴重位置相關的, 所以 LSTM 在這時做的更好.

相關文章