筆記轉(zhuǎn)載于GitHub項(xiàng)目:https://github.com/NLP-LOVE/Introduction-NLP
5. 感知機(jī)分類與序列標(biāo)注
第4章我們利用隱馬爾可夫模型實(shí)現(xiàn)了第一個(gè)基于序列標(biāo)注的中文分詞器,然而效果并不理想。事實(shí)上,隱馬爾可夫模型假設(shè)人們說的話僅僅取決于一個(gè)隱藏的{B.M,E,S序列,這個(gè)假設(shè)太單純了,不符合語言規(guī)律。語言不是由這么簡(jiǎn)單的標(biāo)簽序列生成,語言含有更多特征,而隱馬彌可夫模型沒有捕捉到。隱馬彌可夫模型能捕捉的特征僅限于兩種: 其一,前一個(gè)標(biāo)簽是什么;其二,當(dāng)前字符是什么。
為了利用更多的特征,線性模型( linear model )應(yīng)運(yùn)而生。線性模型由兩部分構(gòu)成: 一系列用來提取特征的特征函數(shù) φ,以及相應(yīng)的權(quán)重向量 w。
本章將深人講解感知機(jī)算法的原理,以及在分類和序列標(biāo)注上的應(yīng)用。在序列標(biāo)注應(yīng)用部分,我們將實(shí)現(xiàn)基于感知機(jī)的中文分詞器。由于感知機(jī)序列標(biāo)注基于分類,并且分類問題更簡(jiǎn)單,所以我們先學(xué)習(xí)分類問題。
5.1 分類問題
-
定義
分類指的是預(yù)測(cè)樣本所屬類別的一類問題。二分類也可以解決任意類別數(shù)的多分類問題(one vs rest)。
將類型class1看作正樣本,其他類型全部看作負(fù)樣本,然后我們就可以得到樣本標(biāo)記類型為該類型的概率 p1。
然后再將另外類型class2看作正樣本,其他類型全部看作負(fù)樣本,同理得到 p2。
以此循環(huán),我們可以得到該待預(yù)測(cè)樣本的標(biāo)記類型分別為類型 class i 時(shí)的概率 pi,最后我們?nèi)?pi 中最大的那個(gè)概率對(duì)應(yīng)的樣本標(biāo)記類型作為我們的待預(yù)測(cè)樣本類型。
總之還是以二分類來依次劃分,并求出最大概率結(jié)果。
image
-
應(yīng)用
在NLP領(lǐng)域,絕大多數(shù)任務(wù)可以用分類來解決。文本分類天然就是一個(gè)分類問題。關(guān)鍵詞提取時(shí),對(duì)文章中的每個(gè)單詞判斷是否屬于關(guān)鍵詞,于是轉(zhuǎn)化為二分類問題。在指代消解問題中,對(duì)每個(gè)代詞和每個(gè)實(shí)體判斷是否存在指代關(guān)系,又是一個(gè)二分類問題。在語言模型中,將詞表中每個(gè)單詞作為一種類別,給定上文預(yù)測(cè)接下來要出現(xiàn)的單詞。
5.2 線性分類模型
線性模型是傳統(tǒng)機(jī)器學(xué)習(xí)方法中最簡(jiǎn)單最常用的分類模型,用一條線性的直線或高維平面將數(shù)據(jù)一分為二。

直線將平面分割為兩部分,分別對(duì)應(yīng)男女。對(duì)于任何姓名,計(jì)算它落入哪個(gè)區(qū)域,就能預(yù)測(cè)它的性別。這樣的區(qū)域稱為決策區(qū)域,它們的邊界稱為決策邊界。二維空間中,如果決策邊界是直線,則稱為線性分類模型: Y = Wx + b。
如果是任意維度空間中的線性決策邊界統(tǒng)稱為分離超平面

推廣到 D 維空間,分離超平面的方程為:
其中,w 是權(quán)重,b 偏置(截距),可以寫成向量的形式:
5.3 感知機(jī)算法
找出這個(gè)分離超平面其實(shí)就是感知機(jī)算法。感知機(jī)算法則是一種迭代式的算法:在訓(xùn)練集上運(yùn)行多個(gè)迭代,每次讀入一個(gè)樣本,執(zhí)行預(yù)測(cè),將預(yù)測(cè)結(jié)果與正確答案進(jìn)行對(duì)比,計(jì)算誤差,根據(jù)誤差更新模型參數(shù),再次進(jìn)行訓(xùn)練,直到誤差最小為止。

- 損失函數(shù): 從數(shù)值優(yōu)化的角度來講,迭代式機(jī)器學(xué)習(xí)算法都在優(yōu)化(減小)一個(gè)損失函數(shù)( loss function )。損失函數(shù) J(w) 用來衡量模型在訓(xùn)練集上的錯(cuò)誤程度,自變量是模型參數(shù) w,因變量是一個(gè)標(biāo)量,表示模型在訓(xùn)練集上的損失的大小。
- 梯度下降: 給定樣本,其特征向量 x 只是常數(shù),對(duì) J(w) 求導(dǎo),得到一個(gè)梯度向量 Δw,它的反方向一定是當(dāng)前位置損失函數(shù)減小速度最快的方向。如果參數(shù)點(diǎn) w 反方向移動(dòng)就會(huì)使損失函數(shù)減小,叫梯度下降。
- 學(xué)習(xí)率: 梯度下降的步長(zhǎng)叫做學(xué)習(xí)率。
- 隨機(jī)梯度下降(SGD): 如果算法每次迭代隨機(jī)選取部分樣本計(jì)算損失函數(shù)的梯度,則稱為隨機(jī)梯度下降。

這時(shí)候問題來了,假如數(shù)據(jù)本身線性不可分,感知機(jī)損失函數(shù)不會(huì)收斂,每次迭代分離超平面都會(huì)劇烈振蕩。這時(shí)可以對(duì)感知機(jī)算法打補(bǔ)丁,使用投票感知機(jī)或平均感知機(jī)。
-
投票感知機(jī)和平均感知機(jī)
投票感知機(jī):每次迭代的模型都保留,準(zhǔn)確率也保留,預(yù)測(cè)時(shí),每個(gè)模型都給出自己的結(jié)果,乘以它的準(zhǔn)確率加權(quán)平均值作為最終結(jié)果。
投票感知機(jī)要求存儲(chǔ)多個(gè)模型及加權(quán),計(jì)算開銷較大,更實(shí)際的做法是取多個(gè)模型的權(quán)重的平均,這就是平均感知機(jī)。
5.4 基于感知機(jī)的人名性別分類
解決人名性別分類的監(jiān)督學(xué)習(xí)流程:
- 標(biāo)注人名分類語料庫
- 利用感知機(jī)算法訓(xùn)練線性模型
- 利用線性模型給人名分類,評(píng)估準(zhǔn)確率。
-
人名性別語料庫
筆者整理了一份人名性別語料庫 cnname
運(yùn)行下面代碼后會(huì)自動(dòng)下載。
預(yù)料格式為逗號(hào)分隔的 .csv,第一列為姓名,第二列為性別:
趙伏琴,女 錢沐楊,男 孫竹珍,女 李潮陽,男 -
訓(xùn)練
代碼詳見:classify_name.py
https://github.com/NLP-LOVE/Introduction-NLP/tree/master/code/ch05/classify_name.py
運(yùn)行結(jié)果如下:
下載 http://file.hankcs.com/corpus/cnname.zip 到 /usr/local/lib/python3.7/site-packages/pyhanlp/static/data/test/cnname.zip 100.00%, 1 MB, 256 KB/s, 還有 0 分 0 秒 =====樸素感知機(jī)算法===== 訓(xùn)練集準(zhǔn)確率: P=85.44 R=85.06 F1=85.25 特征數(shù)量: 9089 趙建軍=男 沈雁冰=男 陸雪琪=女 李冰冰=女 測(cè)試集準(zhǔn)確率: P=82.85 R=82.90 F1=82.88 =====平均感知機(jī)算法===== 訓(xùn)練集準(zhǔn)確率: P=93.62 R=83.06 F1=88.02 特征數(shù)量: 9089 趙建軍=男 沈雁冰=男 陸雪琪=女 李冰冰=女 測(cè)試集準(zhǔn)確率: P=90.92 R=80.39 F1=85.33
5.5 結(jié)構(gòu)化預(yù)測(cè)問題
自然語言處理問題大致可分為兩類,一種是分類問題,另一種就是結(jié)構(gòu)化預(yù)測(cè)問題,序列標(biāo)注只是結(jié)構(gòu)化預(yù)測(cè)的一個(gè)特例,對(duì)感知機(jī)稍作拓展,分類器就能支持結(jié)構(gòu)化預(yù)測(cè)。
-
定義
信息的層次結(jié)構(gòu)特點(diǎn)稱作結(jié)構(gòu)化。那么結(jié)構(gòu)化預(yù)測(cè)(structhre,prediction)則是預(yù)測(cè)對(duì)象結(jié)構(gòu)的一類監(jiān)督學(xué)習(xí)問題。相應(yīng)的模型訓(xùn)練過程稱作結(jié)構(gòu)化學(xué)習(xí)(stutured laming )。分類問題的預(yù)測(cè)結(jié)果是一個(gè)決策邊界, 回歸問題的預(yù)測(cè)結(jié)果是一個(gè)實(shí)數(shù)標(biāo)量,而結(jié)構(gòu)化預(yù)測(cè)的結(jié)果則是一個(gè)完整的結(jié)構(gòu)。
自然語言處理中有許多任務(wù)是結(jié)構(gòu)化預(yù)測(cè),比如序列標(biāo)注預(yù)測(cè)結(jié)構(gòu)是一整個(gè)序列,句法分析預(yù)測(cè)結(jié)構(gòu)是一棵句法樹,機(jī)器翻譯預(yù)測(cè)結(jié)構(gòu)是一段完整的譯文。這些結(jié)構(gòu)由許多部分構(gòu)成,最小的部分雖然也是分類問題(比如中文分詞時(shí)每個(gè)字符分類為{B,M,E,S} ),但必須考慮結(jié)構(gòu)整體的合理程度。
-
結(jié)構(gòu)化預(yù)測(cè)與學(xué)習(xí)流程
結(jié)構(gòu)化預(yù)測(cè)的過程就是給定一個(gè)模型 λ 及打分函數(shù) score,利用打分函數(shù)給一些備選結(jié)構(gòu)打分,選擇分?jǐn)?shù)最高的結(jié)構(gòu)作為預(yù)測(cè)輸出,公式如下:
其中,Y 是備選結(jié)構(gòu)的集合。既然結(jié)構(gòu)化預(yù)測(cè)就是搜索得分最高的結(jié)構(gòu) y,那么結(jié)構(gòu)化學(xué)習(xí)的目標(biāo)就是想方設(shè)法讓正確答案 y 的得分最高。不同的模型有不同的算法,對(duì)于線性模型,訓(xùn)練算法為結(jié)構(gòu)化感知機(jī)。
5.6 線性模型的結(jié)構(gòu)化感知機(jī)算法
-
結(jié)構(gòu)化感知機(jī)算法
要讓線性模型支持結(jié)構(gòu)化預(yù)測(cè),必須先設(shè)計(jì)打分函數(shù)。打分函數(shù)的輸入有兩個(gè)缺一不可的參數(shù): 特征 x 和結(jié)構(gòu) y。但之前介紹的線性模型的“打分函數(shù)”只接受一個(gè)自變量 x。
做法是定義新的特征函數(shù) ?(x,y),把結(jié)構(gòu) y 也作為一種特征,輸出新的“結(jié)構(gòu)化特征向量”。新特征向量與權(quán)重向量做點(diǎn)積后,就得到一個(gè)標(biāo)量,將其作為分?jǐn)?shù):
打分函數(shù)有了,取分值最大的結(jié)構(gòu)作為預(yù)測(cè)結(jié)果,得到結(jié)構(gòu)化預(yù)測(cè)函數(shù):
預(yù)測(cè)函數(shù)與線性分類器的決策函數(shù)很像,都是權(quán)重向量點(diǎn)積特征向量。那么感知機(jī)算法也可以拓展復(fù)用,得到線性模型的結(jié)構(gòu)化學(xué)習(xí)算法。讀入樣本 (x,y),進(jìn)行結(jié)構(gòu)化預(yù)測(cè)
-
與正確答案相比,若不相等,則更新參數(shù): 獎(jiǎng)勵(lì)正確答案觸發(fā)的特征函數(shù)的權(quán)重,否則進(jìn)行懲罰:
-
還可以調(diào)整學(xué)習(xí)率:
-
與感知機(jī)算法比較
- 結(jié)構(gòu)化感知機(jī)修改了特征向量。
- 結(jié)構(gòu)化感知機(jī)的參數(shù)更新賞罰分明。
-
結(jié)構(gòu)化感知機(jī)與序列標(biāo)注
上面已經(jīng)講了結(jié)構(gòu)化感知機(jī)的模型公式,看如何運(yùn)用到序列標(biāo)注上,我們知道序列標(biāo)注最大的結(jié)構(gòu)特點(diǎn)就是標(biāo)簽相互之間的依賴性,這種依賴性利用初始狀態(tài)概率想倆狗和狀態(tài)轉(zhuǎn)移概率矩陣體系那,那么對(duì)于結(jié)構(gòu)化感知機(jī),就可以使用轉(zhuǎn)移特征來表示:
其中,Yt 為序列第 t 個(gè)標(biāo)簽,Si 為標(biāo)注集第 i 種標(biāo)簽,N 為標(biāo)注集大小。狀態(tài)特征如下,類似于隱馬爾可夫模型的發(fā)射概率矩陣,狀態(tài)特征只與當(dāng)前的狀態(tài)有關(guān),與之前的狀態(tài)無關(guān):
于是,結(jié)構(gòu)化感知機(jī)的特征函數(shù)就是轉(zhuǎn)移特征和狀態(tài)特征的合集:
基于以上公式,我們統(tǒng)一用打分函數(shù)來表示:
有了打分公式,就可以利用維特比算法求解得分最高的序列。
5.7 基于結(jié)構(gòu)化感知機(jī)的中文分詞
代碼詳見(注釋寫得很清楚): perceptron_cws.py
https://github.com/NLP-LOVE/Introduction-NLP/tree/master/code/ch05/perceptron_cws.py
運(yùn)行以上代碼結(jié)果如下:
P:96.68 R:96.51 F1:96.59 OOV-R:71.54 IV-R:97.18
[王思斌, ,, 男, ,, 1949年10月, 生, 。]
[山東, 桓臺(tái)縣, 起鳳鎮(zhèn), 穆寨村, 婦女, 穆玲英]
[現(xiàn), 為, 中國(guó)藝術(shù)研究院中國(guó)文化研究所, 研究員, 。]
[我們, 的, 父母, 重, 男, 輕, 女]
[北京輸氣管道, 工程]
準(zhǔn)確性與性能的比較
| 算法 | P | R | F1 | R(oov) | R(IV) |
|---|---|---|---|---|---|
| 最長(zhǎng)匹配 | 89.41 | 94.64 | 91.95 | 2.58 | 97.14 |
| 二元語法 | 92.38 | 96.70 | 94.49 | 2.58 | 99.26 |
| 一階HHM | 78.49 | 80.38 | 79.42 | 41.11 | 81.44 |
| 二階HHM | 78.34 | 80.01 | 79.16 | 42.06 | 81.04 |
| 平均感知機(jī) | 96.69 | 96.45 | 96.57 | 70.34 | 97.16 |
| 結(jié)構(gòu)化感知機(jī) | 96.67 | 96.64 | 96.65 | 70.52 | 97.35 |
對(duì)比各項(xiàng)指標(biāo),我們終于將 OOV 提高到了 70% 以上,并且綜合 F1 也提高了 96.7%,感知機(jī)是截止到這章最好用的算法,完全達(dá)到了實(shí)用水平,在實(shí)際項(xiàng)目中,無非還需要掛載一些領(lǐng)域詞庫。
5.8 GitHub
HanLP何晗--《自然語言處理入門》筆記:
https://github.com/NLP-LOVE/Introduction-NLP
項(xiàng)目持續(xù)更新中......
目錄
| 章節(jié) |
|---|
| 第 1 章:新手上路 |
| 第 2 章:詞典分詞 |
| 第 3 章:二元語法與中文分詞 |
| 第 4 章:隱馬爾可夫模型與序列標(biāo)注 |
| 第 5 章:感知機(jī)分類與序列標(biāo)注 |
| 第 6 章:條件隨機(jī)場(chǎng)與序列標(biāo)注 |
| 第 7 章:詞性標(biāo)注 |
| 第 8 章:命名實(shí)體識(shí)別 |
| 第 9 章:信息抽取 |
| 第 10 章:文本聚類 |
| 第 11 章:文本分類 |
| 第 12 章:依存句法分析 |
| 第 13 章:深度學(xué)習(xí)與自然語言處理 |
