隱馬爾可夫模型與命名實體識別

搬運自:https://www.bilibili.com/video/BV1MJ411w7xR

我們今天要解決的問題是自然語言處理中的序列標註問題, 在目前, 比較主流的技術是語言模型(如LSTM, BERT)+CRF(條件隨機場), 爲什麼這樣組合模型呢? 我稍後會講到. 但想要了解CRF(條件隨機場), 我想首先讓大家瞭解一下隱馬爾可夫模型(Hidden Markov Model), 是一種概率圖模型, 只要理解了HMM模型和維特比解碼算法(viterbi algorothm), 理解條件隨機場就成了分分鐘的事.
在這節課中, 你不需要有概率圖模型的基礎, 只要有基本的概率論知識即可.
首先, 先來看一下今天的課程安排:

  1. NER(命名實體識別)問題概述;
  2. 什麼是隱馬爾可夫模型(HMM);
  3. HMM模型的參數;
  4. 用HMM解決序列標註問題, HMM的學習算法;
  5. 維特比算法(Viterbi Algorithm)(HMM的預測算法).

0. named entity recognition(命名實體識別)問題概述:

命名實體識別(英語:Named Entity Recognition,簡稱NER), 是指識別文本中具有特定意義的實體,主要包括人名、地名、機構名、專有名詞等等, 並把我們需要識別的詞在文本序列中標註出來。
例如有一段文本: 濟南市成立自由貿易試驗區.
我們要在上面文本中識別一些區域和地點, 那麼我們需要識別出來內容有:
濟南市(地點), 自由貿易試驗區(地點).
在我們今天使用的NER數據集中, 一共有7個標籤:

  1. “B-ORG”: 組織或公司(organization)
  2. “I-ORG”: 組織或公司
  3. “B-PER”: 人名(person)
  4. “I-PER”: 人名
  5. “O”: 其他非實體(other)
  6. “B-LOC”: 地名(location)
  7. “I-LOC”: 地名

文本中以每個字爲單位, 每個字必須分別對應上面的任一標籤.
但爲什麼上面標籤除了"O"(其他)之外都是一個實體類型對應兩個標籤呢?
請小夥伴們仔細看標籤前面有分爲"B"和"I"的不同, "B"表示begin, 實體開頭的那個字使用"B"對應的標籤來標註, 在實體中間或結尾的部分, 用"I"來標註.
比如說"自貿區"對應的標註是: 自(B-LOC)貿(I-LOC)區(I-LOC), 這三個字都對應一個"地名"的標籤, 但是第一個字屬於實體開頭的字, 所以使用"B"開頭的標籤, 後面兩個字的標籤都是"I"開頭.
注意, "B"後面是不可以跟其他類型的"I"的, 例如: 自(B-PER)貿(I-LOC)區(I-LOC) 就是屬於錯誤的標註, 因爲實體開頭"B"標註成了人名, 即使實體中間標註成了地名, 這個實體的標註方法也是非法的.
上面的原因就是我們要從語言模型(例如BERT, LSTM)後面再加上概率圖模型, 例如條件隨機場, 用來約束模型的輸出, 防止出現不合規的標註輸出.

1. 什麼是隱馬爾可夫模型 a.k.a.HMM?a.k.a.HMM?

HMM模型是概率圖模型的一種, 屬於生成模型, 籠統的說, 我們上面說的"BIO"的實體標籤, 就是一個不可觀測的隱狀態, 而HMM模型描述的就是由這些隱狀態序列(實體標記)生成可觀測狀態(可讀文本)的過程.
在我們今天的問題當中, 隱狀態序列是實體標記序列, 而可觀測序列是我們可讀的原始語料文本序列.
例如:
隱藏狀態序列: BLOCILOCILOCB-LOC | I-LOC | I-LOC
觀測狀態序列: 貿自 \quad \quad \quad \quad 貿 \quad \quad \quad \quad 區
設我們的可觀測狀態序列是由所有漢字組成的集合, 我們用VObsevationV_{Obsevation}來表示:
Vobs.={v1,v2,...,vM}V_{obs.}=\{v_1, v_2, ... , v_M \}
上式中, vv表示字典中單個字, 假設我們已知的字數爲MM.
設所有可能的隱藏狀態集合爲QhiddenQ_{hidden}, 一共有NN種隱藏狀態, 例如我們現在的命名實體識別數據裏面只有7種標籤:
Qhidden={q1,q2,...,qN}Q_{hidden} = \{ q_1, q_2, ... , q_N\}
設我們有觀測到的一串自然語言序列文本OO, 一共有TT個字, 又有這段觀測到的文本所對應的實體標記, 也就是隱狀態II:
I={i1,i2,...,iT}()O={o1,o2,...,oT}()I=\{i_1, i_2, ... , i_T \}(隱狀態) \quad O=\{o_1, o_2, ... , o_T \}(觀測)
注意上式中, 我們常稱tt時刻, 如上式中一共有TT個時刻(TT個漢字).
在這裏插入圖片描述
HMM模型有兩個基本假設(非常重要):

  1. tt個隱狀態(實體標籤)只跟前一時刻的t1t-1隱狀態(實體標籤)有關, 與除此之外的其他隱狀態(如t2, t+3t-2,\ t+3)無關.
    例如上圖中: 藍色的部分指的是iti_t只與it1i_{t-1}有關, 而與藍色區域之外的所有內容都無關, 而P(itit1)P(i_{t}|i_{t-1})指的是隱狀態iit1t-1時刻轉向tt時刻的概率, 具體轉換方式下面會細講.
  2. 觀測獨立的假設, 我們上面說過, HMM模型中是由隱狀態序列(實體標記)生成可觀測狀態(可讀文本)的過程,
    觀測獨立假設是指在任意時刻觀測oto_t只依賴於當前時刻的隱狀態iti_t, 與其他時刻的隱狀態無關.
    例如上圖中: 粉紅色的部分指的是it+1i_{t+1}只與ot+1o_{t+1}有關, 跟粉紅色區域之外的所有內容都無關.

2. HMM模型的參數:

  1. HMM的轉移概率(transition probabilities):
    我們上面提到了P(itit1)P(i_{t}|i_{t-1})指的是隱狀態iit1t-1時刻轉向tt時刻的概率, 比如說我們現在實體標籤一共有77種, 也就是N=7N=7(注意NN是所有可能的實體標籤種類的集合), 也就是Qhidden={q0,q1,...,q6}Q_{hidden} = \{ q_0, q_1, ... , q_6\}(注意我們實體標籤編號從00算起), 假設在t1t-1時刻任何一種實體標籤都可以在tt時刻轉換爲任何一種其他類型的實體標籤, 則總共可能的轉換的路徑一共有N2N^2種, 所以我們可以做一個NNN*N的矩陣來表示所有可能的隱狀態轉移概率.
    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-ujfyZy0o-1588296618210)(./imgs/transition.jpg)]

上圖就是轉移概率矩陣, 也就是transition matrixtransition \ matrix, 我們設這個矩陣爲AA矩陣, 則AijA_{ij}表示矩陣中第i行第j列:
Aij=P(it+1=qjit=qi)qiQhiddenA_{ij}=P(i_{t+1}= q_j | i_{t} = q_i) \quad q_i \in Q_{hidden}
上式表示指的是在tt時刻實體標籤爲qiq_i, 而在t+1t+1時刻實體標籤轉換到qjq_j的概率.

  1. HMM的發射概率(emission probabilities):
    我們之前提到了任意時刻觀測oto_t只依賴於當前時刻的隱狀態iti_t, 也就是P(otit)P(o_t | i_t), 也叫做發射概率, 指的是隱狀態生成觀測結果的過程.
    設我們的字典裏有MM個字, Vobs.={v0,v1,...,vM1}V_{obs.}=\{v_0, v_1, ... , v_{M-1} \}(注意這裏下標從0算起, 所以最後的下標是M1M-1, 一共有MM種觀測), 則每種實體標籤(隱狀態)可以生成MM種不同的漢字(也就是觀測), 這一過程可以用一個發射概率矩陣來表示, 他的維度是NMN*M.
    在這裏插入圖片描述

上圖就是發射概率矩陣, 也就是emission matrixemission \ matrix, 我們設這個矩陣爲BB矩陣, 則BjkB_{jk}表示矩陣中第jj行第kk列:
Bjk=P(ot=vkit=qj)qiQhiddenvkVobs.={v0,v1,...,vM1}B_{jk}=P(o_{t}= v_k | i_{t} = q_j) \quad q_i \in Q_{hidden} \quad v_k \in V_{obs.}=\{v_0, v_1, ... , v_{M-1} \}
上式表示指的是在tt時刻由實體標籤(隱狀態)qjq_j生成漢字(觀測結果)vkv_k的概率.
3. HMM的初始隱狀態概率: 又稱爲initial probabilitiesinitial \ probabilities, 我們通常用π\pi來表示, 注意這裏可不是圓周率:
π=P(i1=qi)qiQhidden={q0,q1,...,qN1}\pi=P(i_1=q_i) \quad q_i \in Q_{hidden} = \{ q_0, q_1, ... , q_{N-1}\}
上式指的是自然語言序列中第一個字o1o_1的實體標記是qiq_i的概率, 也就是初始隱狀態概率.

3. 用HMM解決序列標註問題, HMM的學習算法;

我們現在已經瞭解了HMM的三大參數A, B, πA, \ B, \ \pi, 假設我們已經通過建模學習, 學到了這些參數, 得到了模型的概率, 我們怎麼使用這些參數來解決序列標註問題呢?
設目前在時刻tt, 我們有當前時刻的觀測到的一個漢字ot=vko_t=v_k(指的第tt時刻觀測到vkv_k), 假設我們還知道在t1t-1時刻(前一時刻)對應的實體標記類型it1=q^it1i_{t-1} = \hat{q}^{t-1}_i(指的t1t-1時刻標記爲q^it1\hat{q}^{t-1}_i). 我們要做的僅僅是列舉所有iti_{t}可能的實體標記q^jt\hat{q}^{t}_{j}, 並求可以使下式輸出值最大的那個實體類型qjtq^{t}_{j}(也就是隱狀態類型):
q^jt=argmaxq^jtQhiddenP(it=q^jtit1=q^it1)P(ot=vkit=q^jt)\hat{q}_j^{t} = argmax_{\hat{q}_j^{t} \in Q_{hidden}} P(i_t = \hat{q}_j^{t} | i_{t-1} = \hat{q}^{t-1}_i) P(o_t=v_k| i_t = \hat{q}_j^{t})
將所有tt時刻當前可取的實體標籤帶入下式中, 找出一個可以使下式取值最大的那個實體標籤作爲當前字的標註:
P()P()P(當前可取實體標籤|上一時刻實體標籤)P(測到的漢字|當前可取實體標籤)
注意: 我們這裏只講到了怎樣求第tt時刻的最優標註, 但是在每一時刻進行這樣的計算, 並不一定能保證最後能得出全局最優序列路徑, 例如在第tt時刻最優實體標籤是qjq_j, 但到了下一步, 由於從qjq_j轉移到其他某些實體標籤的轉移概率比較低, 而降低了經過qjq_j的路徑的整體概率, 所以到了下一時刻最優路徑就有可能在第tt時刻不經過qjq_j了, 所以每一步的局部最優並不一定可以達成全局最優, 所以我們之後會用到維特比算法來找到全局最優的標註序列, 這個後面會有詳細講解.
生成模型與判別模型:
對於生成模型與判別模型, 因爲篇幅問題, 暫不做講述, 網上有很多資料.
這裏稍稍回顧一下, 我們假設xx爲數據點, yy爲數據標記, 比如說邏輯回歸屬於典型的判別模型, 我們要計算P(yx)P(y|x)並形成一條分類邊界, 而在HMM中, 我們計算的是P(xy)P(x|y), 而且要計算出所有yy可取的類型, 並比較一下所有P(xy=yi)P(x|y=y_{i})的結果, 並取可以使P(xy)P(x|y)最大的那個, 而得到預測結果.
HMM參數學習(監督學習):
我們今天要用HMM解決的是序列標註問題, 所以我們解決的是監督學習的問題. 也就是說我們現在有一些文本和與之對應的標註數據, 我們要訓練一個HMM來擬合這些數據, 以便之後用這個模型進行數據標註任務, 最簡單的方式是直接用極大似然估計來估計參數:

  1. 初始隱狀態概率π\pi的參數估計:
    π^qi=count(qi1)count(o1)\hat{\pi}_{q_i}=\frac{count(q^{1}_{i})}{count(o_1)}
    上式指的是, 計算在第11時刻, 也就是文本中第一個字, qi1q^{1}_{i}出現的次數佔總第一個字o1o_1觀測次數的比例, qi1q^{1}_{i}上標1指的是第1時刻, 下標ii指的是第ii種標籤(隱狀態), countcount是的是記錄次數.
  2. 轉移概率矩陣AA的參數估計:
    我們之前提到過transition matrixtransition \ matrix裏面AijA_{ij}(矩陣的第i行第j列)指的是在tt時刻實體標籤爲qiq_i, 而在t+1t+1時刻實體標籤轉換到qjq_j的概率, 則轉移概率矩陣的參數估計相當與一個二元模型bigrambigram, 也就是把所有的標註序列中每相鄰的兩個實體標籤分成一組, 統計他們出現的概率:
    A^ij=P(it+1=qjit=qi)=count(qiqj)count(qi)\hat{A}_{ij}=P(i_{t+1}= q_j | i_{t} = q_i)=\frac{count(q_i後面出現q_j的次數)}{count(q_i的次數)}
  3. 發射概率矩陣BB的參數估計:
    我們提到過emission matrixemission \ matrix中的BjkB_{jk}(矩陣第j行第k列)指的是在tt時刻由實體標籤(隱狀態)qjq_j生成漢字(觀測結果)vkv_k的概率.
    B^jk=P(ot=vkit=qj)=count(qjvk)count(qj)\hat{B}_{jk}=P(o_{t}= v_k | i_{t} = q_j)=\frac{count(q_j與v_k同時出現的次數)}{count(q_j出現的次數)}
    到此爲止, 我們就可以遍歷所有語料, 根據上面的方式得到模型的參數A, B, πA, \ B, \ \pi的估計.
    注意, 通過上面的計算過程, 我們可以得出HMM的參數(A,B,π)(A, B, \pi)有以下特性:
    iπqi=1\sum_{i}\pi_{q_i} = 1
    jAij=jP(it+1=qjit=qi)=1\sum_{j}A_{ij} = \sum_{j}P(i_{t+1}= q_j | i_{t} = q_i) = 1
    kBjk=kP(ot=vkit=qj)=1\sum_{k}B_{jk} = \sum_{k}P(o_{t}= v_k | i_{t} = q_j) =1

4. 維特比算法(Viterbi Algorithm)(HMM的預測算法).

維特比算法viterbi algorithmviterbi \ algorithm使用了動態規劃算法來解決類似HMM和CRF的預測問題, 用維特比算法可以找到概率最大路徑, 也就是最優路徑, 在我們今天要解決的序列標註問題中, 就要通過維特比算法, 來找到文本所對應的最優的實體標註序列.
如果用一句話來概括維特比算法, 那就是:
在每一時刻, 計算當前時刻落在每種隱狀態的最大概率, 並記錄這個最大概率是從前一時刻哪一個隱狀態轉移過來的, 最後再從結尾回溯最大概率, 也就是最有可能的最優路徑. 這話對於沒有學過維特比算法的同學是無法理解的, 但是我覺得今天學完維特比算法之後再來看這句話, 可以加深記憶.
我們這裏爲了學習維特比方便, 所以轉換一下標籤:

  1. Ai,jt1,tA_{i, j}^{t-1, t}, 是轉移概率矩陣AA中的第ii行第jj列(下標), 指的是在t1t-1時刻實體標籤爲qiq_i, 而在tt時刻實體標籤轉換到qjq_j的概率.
  2. BjkB_{jk}是發射矩陣的第j行第k列, 指的是在第tt時刻, 由隱狀態qjq_j生成觀測vkv_k的概率.
  3. 有了上面兩點, 則q^j=AijBjk\hat{q}_j = A_{ij}B_{jk}表示在tt時刻的隱狀態爲qjq_j的概率估計.

在這裏我們直接以實例的方式來說明維特比算法的計算過程(注意我們在這裏下標從00開始算起):

  1. 假設我們現在有所有可能的觀測結果的集合Vobs.={v0,v1}V_{obs.}=\{v_0, v_1\};
  2. 所有可能的隱狀態的集合Qhidden={q0,q1,q2}Q_{hidden}=\{q_0, q_1, q_2\};
  3. 已經觀測到的觀測結果序列O=(o1=v0, o2=v1, o3=v0)O=(o_1=v_0, \ o_2=v_1, \ o_3 = v_0);
  4. 然後假設我們通過HMM建模並學習, 得到了模型所估計的參數(A,B,π)(A, B, \pi), 注意下面的A,BA, B矩陣按行求和爲11;
    在這裏插入圖片描述
  5. 我們要求出對應當前觀測結果OO的最有可能的隱狀態序列I=(i0,i1,i2)I=(i_0, i_1, i_2).
    我們現在要初始化兩個暫存表格, 來暫存我們在每一時刻的計算結果, 稍後我們會說明怎麼使用這兩個表, 下面我們看到T1表格和T2表格, 他們的規格都是num_hidden_statessequence_lengthnum\_hidden\_states * sequence\_length, 這兩個表格在每一時刻tt都由33個方塊組成, 33是所有可能隱狀態的個數, 即Qhidden=3|Q_{hidden}|=3, 注意這裏表格內填充的顏色無意義, 只有好看的作用.
    在這裏插入圖片描述

計算過程:

  1. 首先我們有初始隱狀態概率矩陣π\pi, 和第1時刻的觀測結果o1=v0o_1=v_0, 則在第一時刻, 由隱狀態生成觀測結果的概率計算可以寫成qjt=1=πjBjkq_j^{t=1} = \pi_{j}B_{jk}.
    我們現在說明T1,T2T1, T2表格的用途: 如果T1,T2T1, T2表格是iji*j的矩陣, 則矩陣中第jj列指的是第jj時刻, 第ii行指的是第ii種隱狀態, T1[i, j]T1[i, \ j]指的是在第jj時刻, 落到隱狀態ii的最大可能的概率是多少(不要着急, 到了下一個時刻就會明白最大是什麼意思), 而T2[i, j]T2[i, \ j]記錄的是這個最大可能的概率是從第j1j-1時刻(上一時刻)的哪一種隱狀態ii轉移過來的, 也就是說我們記錄的是最大可能的概率的轉移路徑.
    我們現在將第一時刻的計算結果填入T1,T2T1, T2表格, 注意在第00時刻的隱狀態是由初始隱狀態概率矩陣提供的, 而不是從上一時刻的隱狀態轉移過來的, 所以我們直接在T2T2表格上記爲NAN(not a number)NAN(not \ a \ number)
    在這裏插入圖片描述
  2. 我們現在來到第11時刻(時刻下標從00起算), 首先我們先計算T1[i=0,j=1]T1[i=0, j=1](也就是第j=1j=1時刻, 落到隱狀態i=q0i=q_0上的最大可能的概率是多少), 我們可以看出, 從上一時刻到當前時刻, 要想讓當前時刻的隱狀態爲i1=q0i_1=q_0, 則有3條路徑可走, 分別是: (i0=q0,i1=q0), (i0=q1,i1=q0), (i0=q2,i1=q0)(i_0=q_0, i_1=q_0), \ (i_0=q_1, i_1=q_0), \ (i_0=q_2, i_1=q_0),
    我們在T1[i=0,j=1]T1[i=0, j=1]的位置就是要算出, 這三條路徑哪一條是最有可能的路徑, 也就是取概率最大的一條, 這樣的話, 計算公式爲:
    T1[0,1]=maxi(P(i1=q0i0=qi)P(o1=v1i1=q0))=T1[qi,time_step=0]At1=qi, t=q0Bi1=q0,o1=v1T1[0, 1]=\max_{i} (P(i_1 = q_0 | i_0 = q_i) P(o_1=v_1| i_1 = q_0)) = T1[q_i, time\_step=0] * A_{t-1=q_i, \ t=q_0} * B_{i_1 = q_0, o_1=v_1}
    上式最右邊T1[qi,time_step=0]T1[q_i, time\_step=0]也就是T1[:, 0]T1[:, \ 0]的意思是在t1t-1時刻(也就是上一時刻), 每個隱狀態對應的概率, 是長度爲33的向量;
    At1=qi, t=q0A_{t-1=q_i, \ t=q_0}AA矩陣的第ii行第00列, 指的是在t1t-1時刻隱狀態爲qiq_i, 而在tt時刻隱狀態爲q0q_0的概率, 一共有三種可能的路徑, 所以也是長度爲33的向量;
    Bi1=q0,o1=v1B_{i_1 = q_0, o_1=v_1}BB矩陣的第00行第11列, 指的是隱狀態q0q_0生成觀測v1v_1的概率, 是一個數值.
    通過查表計算, 我們算出:
    T1[0,1]=max{0.100.50.5, 0.160.30.5, 0.280.20.5}=0.028T1[0,1]=max\{0.10 * 0.5 * 0.5, \ 0.16 * 0.3* 0.5, \ 0.28*0.2* 0.5\}=0.028
    我們之前說過, 我們還要知道目前計算出來的這個最大可能的概率前一時刻的哪一種隱狀態ii轉移過來的, 也就是我們要在T2[0,1]T2[0,1]記錄轉移路徑, 計算公式爲:
    T2[0,1]=argmax{0.100.50.5, 0.160.30.5, 0.280.20.5}=2T2[0,1]=argmax\{0.10 * 0.5 * 0.5, \ 0.16 * 0.3* 0.5, \ 0.28*0.2* 0.5\}=2
    我們把計算結果填到表裏, 注意在下圖中, 紅色的線表示最大的轉移路徑, 是從前一時刻的q2q_2轉移過來的.
    在這裏插入圖片描述
  3. 接下來我們用同樣的方式, 把表填完, 下面我們開始講維特比算法是怎樣通過這些暫存的概率和路徑找到最優路徑的:
    在這裏插入圖片描述
    最優路徑有以下特性: 假設我們有一條最優路徑在tt時刻通過一個隱狀態iti_t, 那麼這一路徑從iti_t到最優路徑的終點iTi_T相對於在這段距離裏所有可能出現的路徑裏, 也必須是最優的. 否則從iti_tiTi_T就會有更優的一條路徑, 如果把他和從i1i_1iti_t的路徑(最優路徑iti_t之前的部分)連起來, 等於我們又有一條更優路徑, 這是矛盾的.
    利用這一特性, 我們只要按上面的步驟計算直到得出最後一步達到的最大概率的隱狀態, 再確認最大概率是從前一步哪一個隱狀態轉移過來的, 然後從T2T2表格裏面遞推回溯直到第一時刻(也就是NANNAN的地方), 就可以找出最優路徑了.

回溯的計算:

  1. 首先算出最後一步達到最大路徑的隱狀態, 也就是在T1T1表格的第33列求argmaxargmax:
    i2=argmax T1[:, time_step=2]=2i_2 = argmax \ T1[:, \ time\_step = 2] = 2
  2. 之後我們通過T2T2表格向前追溯一步, 當前最大概率是從前一步哪個隱狀態轉移過來的:
    i1=T2[i2=2, time_step=2]=2i_1 = T2[i_2 = 2, \ time\_step = 2] = 2
  3. 我們到達了倒數第一步, 我們追溯最優路徑是從哪個起始隱狀態轉移過來的:
    i0=T2[i1=2, time_step=1]=2i_0 = T2[i_1 = 2, \ time\_step = 1] = 2
  4. 至此我們得出了最有可能的隱狀態序列:
    I=(q2, q2, q2)I=(q_2, \ q_2, \ q_2)

結論:

  1. 時間複雜度: 假設我們有NN種隱狀態, 在每個時刻之間, 一共可能的路徑一共有N2N^2種, 假設我們有TT個時刻, 則維特比算法的時間複雜度爲O(TN2)O(TN^2).
  2. 在實際的預測計算當中, 爲了防止計算結果下溢, 我們通常將乘法變爲取對數之後的加法.
  3. 具體範例代碼見視頻講解.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章