搬運自:https://www.bilibili.com/video/BV1MJ411w7xR
我們今天要解決的問題是自然語言處理中的序列標註問題, 在目前, 比較主流的技術是語言模型(如LSTM, BERT)+CRF(條件隨機場), 爲什麼這樣組合模型呢? 我稍後會講到. 但想要了解CRF(條件隨機場), 我想首先讓大家瞭解一下隱馬爾可夫模型(Hidden Markov Model), 是一種概率圖模型, 只要理解了HMM模型和維特比解碼算法(viterbi algorothm), 理解條件隨機場就成了分分鐘的事.
在這節課中, 你不需要有概率圖模型的基礎, 只要有基本的概率論知識即可.
首先, 先來看一下今天的課程安排:
- NER(命名實體識別)問題概述;
- 什麼是隱馬爾可夫模型(HMM);
- HMM模型的參數;
- 用HMM解決序列標註問題, HMM的學習算法;
- 維特比算法(Viterbi Algorithm)(HMM的預測算法).
0. named entity recognition(命名實體識別)問題概述:
命名實體識別(英語:Named Entity Recognition,簡稱NER), 是指識別文本中具有特定意義的實體,主要包括人名、地名、機構名、專有名詞等等, 並把我們需要識別的詞在文本序列中標註出來。
例如有一段文本: 濟南市成立自由貿易試驗區.
我們要在上面文本中識別一些區域和地點, 那麼我們需要識別出來內容有:
濟南市(地點), 自由貿易試驗區(地點).
在我們今天使用的NER數據集中, 一共有7個標籤:
- “B-ORG”: 組織或公司(organization)
- “I-ORG”: 組織或公司
- “B-PER”: 人名(person)
- “I-PER”: 人名
- “O”: 其他非實體(other)
- “B-LOC”: 地名(location)
- “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?
HMM模型是概率圖模型的一種, 屬於生成模型, 籠統的說, 我們上面說的"BIO"的實體標籤, 就是一個不可觀測的隱狀態, 而HMM模型描述的就是由這些隱狀態序列(實體標記)生成可觀測狀態(可讀文本)的過程.
在我們今天的問題當中, 隱狀態序列是實體標記序列, 而可觀測序列是我們可讀的原始語料文本序列.
例如:
隱藏狀態序列: B−LOC∣I−LOC∣I−LOC
觀測狀態序列: 自貿區
設我們的可觀測狀態序列是由所有漢字組成的集合, 我們用VObsevation來表示:
Vobs.={v1,v2,...,vM}
上式中, v表示字典中單個字, 假設我們已知的字數爲M.
設所有可能的隱藏狀態集合爲Qhidden, 一共有N種隱藏狀態, 例如我們現在的命名實體識別數據裏面只有7種標籤:
Qhidden={q1,q2,...,qN}
設我們有觀測到的一串自然語言序列文本O, 一共有T個字, 又有這段觀測到的文本所對應的實體標記, 也就是隱狀態I:
I={i1,i2,...,iT}(隱狀態)O={o1,o2,...,oT}(觀測)
注意上式中, 我們常稱t爲時刻, 如上式中一共有T個時刻(T個漢字).
HMM模型有兩個基本假設(非常重要):
- 第t個隱狀態(實體標籤)只跟前一時刻的t−1隱狀態(實體標籤)有關, 與除此之外的其他隱狀態(如t−2, t+3)無關.
例如上圖中: 藍色的部分指的是it只與it−1有關, 而與藍色區域之外的所有內容都無關, 而P(it∣it−1)指的是隱狀態i從t−1時刻轉向t時刻的概率, 具體轉換方式下面會細講.
- 觀測獨立的假設, 我們上面說過, HMM模型中是由隱狀態序列(實體標記)生成可觀測狀態(可讀文本)的過程,
觀測獨立假設是指在任意時刻觀測ot只依賴於當前時刻的隱狀態it, 與其他時刻的隱狀態無關.
例如上圖中: 粉紅色的部分指的是it+1只與ot+1有關, 跟粉紅色區域之外的所有內容都無關.
2. HMM模型的參數:
- HMM的轉移概率(transition probabilities):
我們上面提到了P(it∣it−1)指的是隱狀態i從t−1時刻轉向t時刻的概率, 比如說我們現在實體標籤一共有7種, 也就是N=7(注意N是所有可能的實體標籤種類的集合), 也就是Qhidden={q0,q1,...,q6}(注意我們實體標籤編號從0算起), 假設在t−1時刻任何一種實體標籤都可以在t時刻轉換爲任何一種其他類型的實體標籤, 則總共可能的轉換的路徑一共有N2種, 所以我們可以做一個N∗N的矩陣來表示所有可能的隱狀態轉移概率.
上圖就是轉移概率矩陣, 也就是transition matrix, 我們設這個矩陣爲A矩陣, 則Aij表示矩陣中第i行第j列:
Aij=P(it+1=qj∣it=qi)qi∈Qhidden
上式表示指的是在t時刻實體標籤爲qi, 而在t+1時刻實體標籤轉換到qj的概率.
- HMM的發射概率(emission probabilities):
我們之前提到了任意時刻觀測ot只依賴於當前時刻的隱狀態it, 也就是P(ot∣it), 也叫做發射概率, 指的是隱狀態生成觀測結果的過程.
設我們的字典裏有M個字, Vobs.={v0,v1,...,vM−1}(注意這裏下標從0算起, 所以最後的下標是M−1, 一共有M種觀測), 則每種實體標籤(隱狀態)可以生成M種不同的漢字(也就是觀測), 這一過程可以用一個發射概率矩陣來表示, 他的維度是N∗M.
上圖就是發射概率矩陣, 也就是emission matrix, 我們設這個矩陣爲B矩陣, 則Bjk表示矩陣中第j行第k列:
Bjk=P(ot=vk∣it=qj)qi∈Qhiddenvk∈Vobs.={v0,v1,...,vM−1}
上式表示指的是在t時刻由實體標籤(隱狀態)qj生成漢字(觀測結果)vk的概率.
3. HMM的初始隱狀態概率: 又稱爲initial probabilities, 我們通常用π來表示, 注意這裏可不是圓周率:
π=P(i1=qi)qi∈Qhidden={q0,q1,...,qN−1}
上式指的是自然語言序列中第一個字o1的實體標記是qi的概率, 也就是初始隱狀態概率.
3. 用HMM解決序列標註問題, HMM的學習算法;
我們現在已經瞭解了HMM的三大參數A, B, π, 假設我們已經通過建模學習, 學到了這些參數, 得到了模型的概率, 我們怎麼使用這些參數來解決序列標註問題呢?
設目前在時刻t, 我們有當前時刻的觀測到的一個漢字ot=vk(指的第t時刻觀測到vk), 假設我們還知道在t−1時刻(前一時刻)對應的實體標記類型it−1=q^it−1(指的t−1時刻標記爲q^it−1). 我們要做的僅僅是列舉所有it可能的實體標記q^jt, 並求可以使下式輸出值最大的那個實體類型qjt(也就是隱狀態類型):
q^jt=argmaxq^jt∈QhiddenP(it=q^jt∣it−1=q^it−1)P(ot=vk∣it=q^jt)
將所有t時刻當前可取的實體標籤帶入下式中, 找出一個可以使下式取值最大的那個實體標籤作爲當前字的標註:
P(當前可取實體標籤∣上一時刻實體標籤)P(測到的漢字∣當前可取實體標籤)
注意: 我們這裏只講到了怎樣求第t時刻的最優標註, 但是在每一時刻進行這樣的計算, 並不一定能保證最後能得出全局最優序列路徑, 例如在第t時刻最優實體標籤是qj, 但到了下一步, 由於從qj轉移到其他某些實體標籤的轉移概率比較低, 而降低了經過qj的路徑的整體概率, 所以到了下一時刻最優路徑就有可能在第t時刻不經過qj了, 所以每一步的局部最優並不一定可以達成全局最優, 所以我們之後會用到維特比算法來找到全局最優的標註序列, 這個後面會有詳細講解.
生成模型與判別模型:
對於生成模型與判別模型, 因爲篇幅問題, 暫不做講述, 網上有很多資料.
這裏稍稍回顧一下, 我們假設x爲數據點, y爲數據標記, 比如說邏輯回歸屬於典型的判別模型, 我們要計算P(y∣x)並形成一條分類邊界, 而在HMM中, 我們計算的是P(x∣y), 而且要計算出所有y可取的類型, 並比較一下所有P(x∣y=yi)的結果, 並取可以使P(x∣y)最大的那個, 而得到預測結果.
HMM參數學習(監督學習):
我們今天要用HMM解決的是序列標註問題, 所以我們解決的是監督學習的問題. 也就是說我們現在有一些文本和與之對應的標註數據, 我們要訓練一個HMM來擬合這些數據, 以便之後用這個模型進行數據標註任務, 最簡單的方式是直接用極大似然估計來估計參數:
- 初始隱狀態概率π的參數估計:
π^qi=count(o1)count(qi1)
上式指的是, 計算在第1時刻, 也就是文本中第一個字, qi1出現的次數佔總第一個字o1觀測次數的比例, qi1上標1指的是第1時刻, 下標i指的是第i種標籤(隱狀態), count是的是記錄次數.
- 轉移概率矩陣A的參數估計:
我們之前提到過transition matrix裏面Aij(矩陣的第i行第j列)指的是在t時刻實體標籤爲qi, 而在t+1時刻實體標籤轉換到qj的概率, 則轉移概率矩陣的參數估計相當與一個二元模型bigram, 也就是把所有的標註序列中每相鄰的兩個實體標籤分成一組, 統計他們出現的概率:
A^ij=P(it+1=qj∣it=qi)=count(qi的次數)count(qi後面出現qj的次數)
- 發射概率矩陣B的參數估計:
我們提到過emission matrix中的Bjk(矩陣第j行第k列)指的是在t時刻由實體標籤(隱狀態)qj生成漢字(觀測結果)vk的概率.
B^jk=P(ot=vk∣it=qj)=count(qj出現的次數)count(qj與vk同時出現的次數)
到此爲止, 我們就可以遍歷所有語料, 根據上面的方式得到模型的參數A, B, π的估計.
注意, 通過上面的計算過程, 我們可以得出HMM的參數(A,B,π)有以下特性:
i∑πqi=1
j∑Aij=j∑P(it+1=qj∣it=qi)=1
k∑Bjk=k∑P(ot=vk∣it=qj)=1
4. 維特比算法(Viterbi Algorithm)(HMM的預測算法).
維特比算法viterbi algorithm使用了動態規劃算法來解決類似HMM和CRF的預測問題, 用維特比算法可以找到概率最大路徑, 也就是最優路徑, 在我們今天要解決的序列標註問題中, 就要通過維特比算法, 來找到文本所對應的最優的實體標註序列.
如果用一句話來概括維特比算法, 那就是:
在每一時刻, 計算當前時刻落在每種隱狀態的最大概率, 並記錄這個最大概率是從前一時刻哪一個隱狀態轉移過來的, 最後再從結尾回溯最大概率, 也就是最有可能的最優路徑. 這話對於沒有學過維特比算法的同學是無法理解的, 但是我覺得今天學完維特比算法之後再來看這句話, 可以加深記憶.
我們這裏爲了學習維特比方便, 所以轉換一下標籤:
- Ai,jt−1,t, 是轉移概率矩陣A中的第i行第j列(下標), 指的是在t−1時刻實體標籤爲qi, 而在t時刻實體標籤轉換到qj的概率.
- Bjk是發射矩陣的第j行第k列, 指的是在第t時刻, 由隱狀態qj生成觀測vk的概率.
- 有了上面兩點, 則q^j=AijBjk表示在t時刻的隱狀態爲qj的概率估計.
在這裏我們直接以實例的方式來說明維特比算法的計算過程(注意我們在這裏下標從0開始算起):
- 假設我們現在有所有可能的觀測結果的集合Vobs.={v0,v1};
- 所有可能的隱狀態的集合Qhidden={q0,q1,q2};
- 已經觀測到的觀測結果序列O=(o1=v0, o2=v1, o3=v0);
- 然後假設我們通過HMM建模並學習, 得到了模型所估計的參數(A,B,π), 注意下面的A,B矩陣按行求和爲1;
- 我們要求出對應當前觀測結果O的最有可能的隱狀態序列I=(i0,i1,i2).
我們現在要初始化兩個暫存表格, 來暫存我們在每一時刻的計算結果, 稍後我們會說明怎麼使用這兩個表, 下面我們看到T1表格和T2表格, 他們的規格都是num_hidden_states∗sequence_length, 這兩個表格在每一時刻t都由3個方塊組成, 3是所有可能隱狀態的個數, 即∣Qhidden∣=3, 注意這裏表格內填充的顏色無意義, 只有好看的作用.
計算過程:
- 首先我們有初始隱狀態概率矩陣π, 和第1時刻的觀測結果o1=v0, 則在第一時刻, 由隱狀態生成觀測結果的概率計算可以寫成qjt=1=πjBjk.
我們現在說明T1,T2表格的用途: 如果T1,T2表格是i∗j的矩陣, 則矩陣中第j列指的是第j時刻, 第i行指的是第i種隱狀態, T1[i, j]指的是在第j時刻, 落到隱狀態i的最大可能的概率是多少(不要着急, 到了下一個時刻就會明白最大是什麼意思), 而T2[i, j]記錄的是這個最大可能的概率是從第j−1時刻(上一時刻)的哪一種隱狀態i轉移過來的, 也就是說我們記錄的是最大可能的概率的轉移路徑.
我們現在將第一時刻的計算結果填入T1,T2表格, 注意在第0時刻的隱狀態是由初始隱狀態概率矩陣提供的, 而不是從上一時刻的隱狀態轉移過來的, 所以我們直接在T2表格上記爲NAN(not a number)
- 我們現在來到第1時刻(時刻下標從0起算), 首先我們先計算T1[i=0,j=1](也就是第j=1時刻, 落到隱狀態i=q0上的最大可能的概率是多少), 我們可以看出, 從上一時刻到當前時刻, 要想讓當前時刻的隱狀態爲i1=q0, 則有3條路徑可走, 分別是: (i0=q0,i1=q0), (i0=q1,i1=q0), (i0=q2,i1=q0),
我們在T1[i=0,j=1]的位置就是要算出, 這三條路徑哪一條是最有可能的路徑, 也就是取概率最大的一條, 這樣的話, 計算公式爲:
T1[0,1]=imax(P(i1=q0∣i0=qi)P(o1=v1∣i1=q0))=T1[qi,time_step=0]∗At−1=qi, t=q0∗Bi1=q0,o1=v1
上式最右邊T1[qi,time_step=0]也就是T1[:, 0]的意思是在t−1時刻(也就是上一時刻), 每個隱狀態對應的概率, 是長度爲3的向量;
At−1=qi, t=q0是A矩陣的第i行第0列, 指的是在t−1時刻隱狀態爲qi, 而在t時刻隱狀態爲q0的概率, 一共有三種可能的路徑, 所以也是長度爲3的向量;
Bi1=q0,o1=v1是B矩陣的第0行第1列, 指的是隱狀態q0生成觀測v1的概率, 是一個數值.
通過查表計算, 我們算出:
T1[0,1]=max{0.10∗0.5∗0.5, 0.16∗0.3∗0.5, 0.28∗0.2∗0.5}=0.028
我們之前說過, 我們還要知道目前計算出來的這個最大可能的概率前一時刻的哪一種隱狀態i轉移過來的, 也就是我們要在T2[0,1]記錄轉移路徑, 計算公式爲:
T2[0,1]=argmax{0.10∗0.5∗0.5, 0.16∗0.3∗0.5, 0.28∗0.2∗0.5}=2
我們把計算結果填到表裏, 注意在下圖中, 紅色的線表示最大的轉移路徑, 是從前一時刻的q2轉移過來的.
- 接下來我們用同樣的方式, 把表填完, 下面我們開始講維特比算法是怎樣通過這些暫存的概率和路徑找到最優路徑的:
最優路徑有以下特性: 假設我們有一條最優路徑在t時刻通過一個隱狀態it, 那麼這一路徑從it到最優路徑的終點iT相對於在這段距離裏所有可能出現的路徑裏, 也必須是最優的. 否則從it到iT就會有更優的一條路徑, 如果把他和從i1到it的路徑(最優路徑it之前的部分)連起來, 等於我們又有一條更優路徑, 這是矛盾的.
利用這一特性, 我們只要按上面的步驟計算直到得出最後一步達到的最大概率的隱狀態, 再確認最大概率是從前一步哪一個隱狀態轉移過來的, 然後從T2表格裏面遞推回溯直到第一時刻(也就是NAN的地方), 就可以找出最優路徑了.
回溯的計算:
- 首先算出最後一步達到最大路徑的隱狀態, 也就是在T1表格的第3列求argmax:
i2=argmax T1[:, time_step=2]=2
- 之後我們通過T2表格向前追溯一步, 當前最大概率是從前一步哪個隱狀態轉移過來的:
i1=T2[i2=2, time_step=2]=2
- 我們到達了倒數第一步, 我們追溯最優路徑是從哪個起始隱狀態轉移過來的:
i0=T2[i1=2, time_step=1]=2
- 至此我們得出了最有可能的隱狀態序列:
I=(q2, q2, q2)
結論:
- 時間複雜度: 假設我們有N種隱狀態, 在每個時刻之間, 一共可能的路徑一共有N2種, 假設我們有T個時刻, 則維特比算法的時間複雜度爲O(TN2).
- 在實際的預測計算當中, 爲了防止計算結果下溢, 我們通常將乘法變爲取對數之後的加法.
- 具體範例代碼見視頻講解.