HanLP《自然語言處理入門》筆記--5.感知機(jī)模型與序列標(biāo)注

筆記轉(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 分類問題

  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
  1. 應(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ù)一分為二。

image

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

如果是任意維度空間中的線性決策邊界統(tǒng)稱為分離超平面

image

推廣到 D 維空間,分離超平面的方程為:

\sum_{i=1}^{D} w_{i} x_{i}+b=0

其中,w 是權(quán)重,b 偏置(截距),可以寫成向量的形式:

\hat{y}={sign}(w \cdot x)=\{\begin{array}{cc}{-1,} {w \cdot x \leqslant 0} \\ {1,} {w \cdot x>0}\end{array}
\begin{aligned} &\boldsymbol{w}=\left[w_{1}, \cdots, w_{D}, b\right]\\ &x=\left[x_{1}, \cdots, x_{D}, 1\right] \end{aligned}\\ \hat{y}=\operatorname{sign}(\boldsymbol{w} \cdot \boldsymbol{x})=\left\{\begin{array}{cc} {-1,} & {\boldsymbol{w} \cdot \boldsymbol{x} \leqslant 0} \\ {1,} & {\boldsymbol{w} \cdot \mathbf{x}>0} \end{array}\right.

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)練,直到誤差最小為止。

image
  • 損失函數(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ī)梯度下降。
image

這時(shí)候問題來了,假如數(shù)據(jù)本身線性不可分,感知機(jī)損失函數(shù)不會(huì)收斂,每次迭代分離超平面都會(huì)劇烈振蕩。這時(shí)可以對(duì)感知機(jī)算法打補(bǔ)丁,使用投票感知機(jī)或平均感知機(jī)。

  1. 投票感知機(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)確率。
  1. 人名性別語料庫

    筆者整理了一份人名性別語料庫 cnname

    運(yùn)行下面代碼后會(huì)自動(dòng)下載。

    預(yù)料格式為逗號(hào)分隔的 .csv,第一列為姓名,第二列為性別:

    趙伏琴,女
    錢沐楊,男
    孫竹珍,女
    李潮陽,男
    
  2. 訓(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è)。

  1. 定義

    信息的層次結(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)整體的合理程度。

  2. 結(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è)輸出,公式如下:
    \hat{y}=\arg \max _{y \in Y} \operatorname{score}_{\lambda}(x, y)
    其中,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ī)算法

  1. 結(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ù):
    \operatorname{score}(x, y)=w \cdot \phi(x, y)
    打分函數(shù)有了,取分值最大的結(jié)構(gòu)作為預(yù)測(cè)結(jié)果,得到結(jié)構(gòu)化預(yù)測(cè)函數(shù):
    \hat{y}=\arg \max _{y \in Y}(w \cdot \phi(x, y))
    預(yù)測(cè)函數(shù)與線性分類器的決策函數(shù)很像,都是權(quán)重向量點(diǎn)積特征向量。那么感知機(jī)算法也可以拓展復(fù)用,得到線性模型的結(jié)構(gòu)化學(xué)習(xí)算法。

    • 讀入樣本 (x,y),進(jìn)行結(jié)構(gòu)化預(yù)測(cè) \hat{y}=\arg \max_{y \in Y}(w \cdot \phi(x, y))

    • 與正確答案相比,若不相等,則更新參數(shù): 獎(jiǎng)勵(lì)正確答案觸發(fā)的特征函數(shù)的權(quán)重,否則進(jìn)行懲罰:

      w \leftarrow w+\phi\left(x^{(i)}, y\right)-\phi\left(x^{(i)}, \hat{y}\right)

    • 還可以調(diào)整學(xué)習(xí)率:

      \boldsymbol{w} \leftarrow \boldsymbol{w}+\alpha\left(\phi\left(\boldsymbol{x}^{(i)}, \boldsymbol{y}\right)-\phi\left(\boldsymbol{x}^{(i)}, \hat{\boldsymbol{y}}\right)\right)

  1. 與感知機(jī)算法比較

    • 結(jié)構(gòu)化感知機(jī)修改了特征向量。
    • 結(jié)構(gòu)化感知機(jī)的參數(shù)更新賞罰分明。
  1. 結(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)移特征來表示:
    \phi_{k}\left(y_{t-1}, y_{t}\right)=\left\{\begin{array}{ll} {1,} & {y_{t-1}=s_{i}, \mathrm{H} y_{t}=s_{j}} \\ {0,} & {其他 } \end{array} \quad i=0, \cdots, N ; j=1, \cdots, N\right.
    其中,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):
    \phi_{i}\left(x_{i}, y_{i}\right)=\left\{\begin{array}{l} {1} \\ {0} \end{array}\right.
    于是,結(jié)構(gòu)化感知機(jī)的特征函數(shù)就是轉(zhuǎn)移特征和狀態(tài)特征的合集:
    \phi=\left[\phi_{k} ; \phi_{l}\right] \quad k=1, \cdots, N^{2}+N ; l=N^{2}+N+1, \cdots
    基于以上公式,我們統(tǒng)一用打分函數(shù)來表示:
    \operatorname{score}(\boldsymbol{x}, \boldsymbol{y})=\sum_{t=1}^{T} \boldsymbol{w} \cdot \phi\left(y_{t-1}, y_{t}, \boldsymbol{x}_{t}\right)
    有了打分公式,就可以利用維特比算法求解得分最高的序列。

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í)與自然語言處理
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容