李宏毅深度學習筆記-結構化學習序列標注


之前講了結構化學習的概念,其實學習都可以看做是兩個步驟,只要回答三個問題,就可以解決所有學習的task。

序列標注

image-20200705165756770

現在函數input是一個sequence,output也是一個sequence(先假設兩個sequence的長度一樣)。如上圖所示,input \(x\)\(x_1,x_2,...,x_L\),output \(y\)\(y_1,y_2,...,y_L\)。這個問題其實是可以用RNN解決的。

例子:詞性標注(POS tagging)

image-20200706091713200

POS tagging:標記一個句子中每個word的詞性。

詞性有很多的類別,名詞下面就可以分成proper(專有名詞 )、common(一般名詞)。動詞可以分成main(主動詞),modals(情態動詞)等等。

現在要做的事情就是,input 一個句子,比如“John saw the saw”,要自動標記說John是PN(專有名詞 ),"saw"為V(動詞),“the” 為D(限定詞),“saw”為名詞。

詞性標注是自然語言處理中非常典型和重要的task,是許多文字理解的基石,比如要先有詞性標注,后續才能比較方便地做句法分析和詞義消歧,或者抽key word(一般是名詞),自動檢測出哪些詞匯是名詞的話,就可以先去掉一些不可能的詞匯。

image-20200706103116811

如果今天找到一個字典,告訴我們說每個詞匯的詞性是什么,那不就解決詞性標注的問題了嗎?寫一個hash table,hash table告訴我們說“the”的output是“D",那詞性標注的問題不就解決了嗎?這里困難的點是,詞性標注光靠查表是不夠的,要知道一整個sequence的信息才有可能把每一個word的詞性找出來。

比如“saw”這個word,可能有不同的詞性。第一個“saw”是動詞,第二個“saw”是名詞。“saw”這個word大多數情況是動詞,但是我們知道一個冠詞("the")后面大概率是一個名詞而不是動詞,所以要把詞性標注做好的話,必須考慮整個sequence的信息。

HMM

image-20200706125723114

HMM的假設是,人用以下兩個步驟產生一個句子:

step1:

當你想要說一句話的時候,你第一件在心里做的事情是先產生一個POS sequence,這個sequence是根據你腦中的grammar產生的(你大腦中對人類語言的理解)。

step2:

根據每一個tag(PN、V、D、N),去找一個符合tag的詞匯,變成一個word sequence。文字和詞性的關系可以從一個詞典中得到。

image-20200706131715895

腦中的grammar長什么樣子呢?

HMM假設它是一個馬爾科夫鏈,要開始說一句話的時候,

  • 句首word的詞性有0.5的概率是Det,0.4的概率是PN,0.1的概率是V,做一下sample(假設是PN)。
  • PN word后面的word有0.1的概率是Det,0.8的概率是V,0.1的概率是end(這個詞是句尾),再做一下sample(假設是V)。
  • V word后繼續下去......

這樣就可以算出“PN V D N”的概率。

image-20200706132814611

產生這個詞性的sequence后,接下來就要進入第二個步驟,根據我手上的詞典,根據詞性看填入哪一個word。現在有一大堆word屬於PN,一大堆word屬於V......,那么從word 集合里面sample出一個word出來(上圖箭頭數字是概率)。

今天給一個sequence,就可以計算出概率。

image-20200706133541662

HMM可以描述,一個詞性sequence可以得到一個句子的概率。

\(x,y\)同時出現的概率是(\(y\)出現的概率)*(\(x\)出現的概率|\(y\)

image-20200706133946721

step1會計算\(y\)的概率就是各個詞性出現的條件概率積,這個條件概率稱為轉移概率。

step2會計算\(x|y\)的概率,是詞性產生word的條件概率積,這個條件概率稱為發射概率。

image-20200706135147025

怎么算轉移概率、發射概率?

這個就要從訓練數據中得到,先收集一大堆的訓練數據(sentence),每個sentence詞匯都標注好詞性了。

image-20200706135350958

假如要算\(P(y_{l+1}=s'|y_l=s)\),就是(\(s\)后面接\(s'\)的次數)/(\(s\)的次數)。

要算\(P(x_l=t|y_t=s)\)(給一個詞性,產生的一個詞匯),就是(詞性為\(s\)且輸出為t的次數)/(詞性是\(s\)的次數)。

image-20200706135816054

有兩個上面算出來的概率之后,要做什么呢?

回到原來的問題,給一個句子\(x\),要找\(y\)\(x\)是我們看得到的,而\(y\)是隱藏的,那找出\(y\)就要靠\(P(x,y)\)

很自然的想法如上圖右邊所示,當已經知道\(x\)時,就是去找讓\(P(y|x)\)最大的\(y\)\(P(y|x)\)可以寫成\(\large \frac{P(x,y)}{P(x)}\),因為\(x\)是給定的,最后變成 \(arg \max \limits_{y\in Y}P(x,y)\)

image-20200706141236621

用HMM,要做的事情就是窮舉所有的\(y\),找出讓\(P(x,y)\)最大的\(\widetilde y\)

你可能覺得窮舉這件事情沒辦法做,假設現在有\(s\)個詞性,sequnce長度是L,那有可能的\(y\)就是\(s^L\)個,這個是非常大的數量,這時候就要用維特比算法了,它的復雜度是\(O(LS^2)\)

image-20200706141902471

HMM也是結構化學習的一種方法,就要回答三個問題。

Q1:評估

  • \(F(x,y)=P(x,y)=P(y)P(x|y)\)

Q2:推理

  • \(\widetilde y=arg \max \limits_{y\in Y}P(x,y)\)

Q3:訓練

  • \(P(y)\)\(P(x|y)\),從訓練數據中統計

image-20200706142158603

HMM會有什么問題?

在做Q2推理的時候,我們是把讓\(P(x,y)\)最大的\(y\)作為output,如果我們要讓HMM得到正確的結果,我們會希望正確的\(\hat y\)\(P(x,\hat y)>P(x,y)\),但是HMM可以做到這件事情嗎?HMM可能無法做到這件事情,在HMM訓練中,你會發現它並沒有保證可以讓錯誤的\(y\)\(P(x,y)\)一定是小的。

舉個例子說明下:

假設從語料庫統計出來,N后面接V的概率是9/10,N后面接D的概率是1/10。V詞性是word a的概率是1/2,D詞性是word a的概率是1,如上圖右邊所示。

image-20200706144449855

假設有個問題是說,已經知道\(l-1\)時間點的詞性是N,在\(l\)時間點word 是a,那\(y_l\)最有可能的詞性是什么?

\(y_l=V\)的概率是0.9*0.5=0.45

\(y_l=D\)的概率是0.1*1=0.1

所以最有可能的詞性是V

image-20200706144640033

可是如果我們觀察下訓練數據(如上圖右邊所示),\(N\to V\to c\)出現9次,\(P\to V\to a\)出現9次,\(N\to D\to a\)出現1次,那么N后面接V的概率是0.9,N后面接D的概率是0.1。V產生a的概率是0.5,產生c的概率是0.5,D產生a的概率是1。

根據訓練數據,告訴我們說是V,但是你不覺得有問題嗎?

在訓練數據里,已經告訴你\(N\to D\to a\),但是你還是預測為V,這不是很奇怪嗎。

對HMM來說,它會給一些在訓練數據里沒出現過的sequence高的概率(例如上面例子的\(N\to V\to a)\),所以它有個特色,會腦補沒有看過的東西。

image-20200706145535724

就算一個\(x,y\)的pair在訓練數據里沒出現過,對HMM來說,也可能會給它一個高的概率。這件事情是有好有壞的,這個不一定是個缺點。

當你的訓練數據很少的時候,也許實際真的概率就很高,只是你數據太少沒有觀察到,所以HMM在訓練數據少的時候效果會好,在數據量夠多的時候,效果增長沒有其他方法快。

HMM為什么會產生這種腦補的現象?

因為對它來說,轉移概率跟發射概率是分開的model,這兩個概率是獨立的,CRF可以解決這個問題,但是CRF的model和HMM是差不多的,也是假設轉移概率跟發射概率是獨立的,卻可以克服HMM的問題。

CRF

image-20200706150306326

CRF一樣也要描述\(P(x,y)\),說\(P(x,y)\)正比於\(exp(w\cdot \phi(x,y))\)(一個權值向量 * 特征向量)。

  • \(\phi(x,y)\)是一個特征向量
  • \(w\)是從訓練數據中學到的權值向量
  • \(exp(w\cdot \phi(x,y))\)內積總是正的,但是沒辦法保證小於1,所以說是概率的話就不太對,只能說和概率是成正比的

那我們不就不知道真正的\(P(x,y)\)是什么了嗎?

沒關系,CRF不關心\(P(x,y)\),真正關心的是\(P(y|x)\)\(P(y|x)\)可以寫成上圖的式子。\(P(x,y)\)\(exp(w\cdot \phi(x,y))\)是成正比的,相當於\(\Large \frac{exp(w\cdot \phi(x,y))}{R}\),然后代入\(P(y|x)\)式子里面去,如上圖所示,消去\(R\)

image-20200706151219279

你可能會奇怪,為什么概率會正比於兩個向量的內積,跟HMM完全不一樣

其實CRF和HMM的model是一樣的,只有在訓練上是不一樣的。在HMM里面,\(P(x,y)\)是一大堆概率乘積, 現在對它取log,原來相乘變為相加。

image-20200706154741321

先看上圖紅色框框這一項,整個句子長度是\(L\)的話,就是\(log P(x_l|y_l)\) 的和,把這一項做下整理,寫成上圖下方的式子,summation over所有的tag s跟word t,如果有10個可能的詞性和10000個詞匯,那這里就是summation 10*10000項。每一項是(\(log P(t|s)\)\(\times\)(詞匯\(t\)被標注為\(s\)這件事情在pair \(x,y\)總共出現的次數)。

image-20200706155719498

舉個例子:有一個sentence x “The dog ate the homework”,每一個word都有一個tag的label。

現在做一下計算如上圖右邊所示:

  • “the”被標記為D(冠詞),在這個(x,y) pair出現的次數為2次。
  • “dog”被標記為N(名詞)的次數為1次。
  • “ate”被標記為V(動詞)的次數為1次。
  • “homework”被標記為N(名詞)的次數為1次。
  • 其他詞匯和詞性的次數為0次。

計算下所有的概率的乘積如上圖下方所示。D產生“the”的概率出現過2次,值是一樣的。隨后整理下就變成\(log P()\times N()\)

image-20200706160537834

對其他項也可以做一樣的轉化,如上圖最下方所示。

image-20200706193436765

寫成相乘以后會怎么樣呢?

可以發現說,可以把\(log P(x,y)\)寫成一大堆兩項的相乘,四項分別是

  • summation over所有的tag跟word
  • summation over所有的tag
  • summation over所有的tag和tag
  • summation over所有的tag

然后就可以描述成兩個向量的內積,如上圖右邊所示。紅色向量里每個元素都跟\((x,y)\)有關,是\((x,y)\)所形成的feature,寫成\(\phi(x,y)\),最后得到\(log P(x,y)=w\cdot \phi(x,y)\),也就是\(P(x,y)=exp(w\cdot \phi(x,y))\)

image-20200706195739107

這邊有個地方要稍微注意下,\(w\)向量可以對應到HMM里的概率

  • 也就是\(w_{s,t}\)對應到 \(log P(x_i=t|y_i=s)\) (詞性s時為word t的概率)

  • 或者是\(w_{start,s}\)對應到 \(log P(s|start)\) (句首是s概率)

  • 或者是\(w_{s,s'}\)對應到 \(log(P(y_i=s'|y_{i-1}=s))\)\(y_{i-1}=s\)后面接\(s'\)的概率)

  • ......

也就是今天\(w\)里面,每一個weight都對應到HMM里的某個概率取 log,如果想轉回概率的話,就把\(w\)取exp。

這邊有一個問題,在訓練的時候,\(w\)里面的值是可正可負的,值是負的話,取exp的值是小於1的,可以解釋為一個概率,但是如果exp大於1的話,就不能解釋為概率了。還有就是given s(tags)后對t(word) summation ,沒有辦法保證和是1 (因為\(P(x_i=t|y_i=s)\)取了log)。所以沒辦法說\(P(x,y)=exp(w\cdot \phi(x,y))\) ,於是就改成正比。

image-20200706204247816

特征向量\(\phi(x,y)\)長什么樣子呢?

\(\phi(x,y)\)包含兩個部分

  • 第一個部分是有關tag(詞性)和word(詞匯)的關系
  • 第二個部分是有關tag(詞性)和tag(詞性)之間的關系

先看第一個部分,如上圖右邊的向量。意思是說,如果有\(S\)個tag,有\(L\)個可能的詞匯,那向量維度就是\(S\times L\),例如有10種詞性,10000個可能的詞匯,那向量的長度就是100000維。

向量里面是所有詞性跟所有詞匯的pair,今天如果給一個(x,y)的pair,“the”標示為D出現2次的話,那向量維度D,the就對應2,沒出現的pair都是0。可以想象這個向量的維度非常大,但有值的地方可能很少(稀疏)。

image-20200706205050307

在第二個部分,做法是這樣子的

定義\(\large N_{s,s'}(x,y)\)是tag s跟s'在(x,y)這個pair里面連續出現的次數。所以\(N_{D,D}(x,y)\)就是D后面接D在(x,y)這個pair里面出現的次數。在這個例子里,D和D沒有接在一起過,所以次數為0,D后面接N出現過2次.......。

image-20200706210049454

假設世界上tag的數目有S種,那向量維度就是\(S\times S+2S\),詞性配詞性+start和end。

然后把part1和part2的向量接在一起作為\(\phi(x,y)\),這個向量有它自己的含義,跟HMM想要model的東西是一樣的。但是CRF把概率描述成\(w\)\(\phi(x,y)\)的內積,所以CRF比HMM多了一個厲害的地方,就是你可以自己定義\(\phi(x,y)\)

image-20200706210113871

怎么訓練CRF?

收集訓練數據\(\{(x,\hat y) \}\)

找一個權值向量\(w^*\)去最大化一個目標函數\(O(w)\),目標函數是說,給定\(x^n\)產生正確\(\hat y^n\)的概率取log再summation 。你會發現和交叉熵很像,交叉熵也是最大化正確維度的幾率再取對數,只不過此時是針對整個序列而言的。給定一整個sequence x,我們要讓正確的sequence的概率的log越大越好。

log這一項做下轉化,如上圖最下方所示,由\(\Large P(y|x)=\frac{P(x,y)}{\sum\limits_{y'}P(x,y')}\)進行考慮。那么最大化\(log P(\hat y^n|x^n)\)相當於:

  • 最大化\(\large log P(x^n,\hat y^n)\),最大化在訓練數據里看到的pair \(\large (x^n,\hat y^n)\) 的概率
  • 同時最小化\(\large log \sum\limits_{y'}P(x^n,y')\),最小化訓練數據沒有看到的pair的概率

這邊是最大化,而不是最下化,隨意用梯度上升法。

image-20200706211930026

梯度下降里,最小化代價函數\(C\),計算\(C\)的梯度,然后\(\theta\)減去 \(\eta \nabla C(\theta)\)(即往負梯度方向走)。

梯度上升了,是\(\theta\)加上\(\eta \nabla C(\theta)\)(即往梯度方向走)。

image-20200707090053375

上圖\(O(w)\)是我們要去最大化的函數,定義\(log P(\hat y^n|x^n)\)\(O^n(w)\)

我們\(w\)有很多很多,有的\(w\)對應到一個tag和一個word的pair,有的\(w\)是對應兩個tag的pair。接下來會講解\(\Large \frac{\partial O^n(w)}{\partial w_{s,t}}\),其他偏微分是類似的。

image-20200707090449713

經過一頓數學運算后,最后對\(w_{s,t}\)求得的梯度有兩項

  • 第一項是word t被標識為tag s,在pair \((x^n,\hat y^n)\)中出現的次數
  • 第二項是,summation over所有可能的\(y\) ,summation 中每個term是(word t被標識為tag s在\(x^n\)跟任意一個\(y\)的pair中出現的次數)乘上 (給定\(x^n\)后任意一個\(y\)的概率),\(y\)是所有可能出現的sequence,所以非常多。

算出來偏微分的結果,是要跟\(w_{s,t}\)做相加,綠色和黃色項是互相對抗的

  • 看上圖綠色線第一項,如果算出來是正的,參數就會增加,算出來是負的,參數就會減少。這個式子告訴我們,如果\(s,t\)這個pair在正確的訓練數據\((x^n,\hat y^n)\)中出現的次數越多,那\(w_{s,t}\)就會越大。

  • 黃色線第二項告訴我們,如果\(s,t\)這個pair在任意一個\((x^n,y)\)pair里出現的次數很多的話,那\(w_{s,t}\)應該變小

如果\(s,t\)在正確答案里出現的很多,那對應的\(w_{s,t}\)就會增加,但是如果不只是在正確答案里出現的次數多,在隨便哪個\(y\)\(x^n\)pair里出現的次數也多的話,就應該減小\(w_{s,t}\)

今天你要在第二項(黃色項)summation over所有可能的\(y\),可能會卡住,不知道怎么算。但沒有關系,這個也可以用維特比算法算。

image-20200707102108331

之前是算了某一個\(w\)的偏微分,現在對整個\(w\)的偏微分向量就是(正確的$\hat y \(形成的特征向量)\)-\((任意\)y'\(形成的特征向量*\)y'$的條件概率)。

如果我們把隨機梯度上升的式子列出來的話

  • 每次都取一筆數據\((x^n,\hat y^n)\)

  • 把正確\(\hat y\)形成的向量加給\(w\),再減掉(任意一個\(y\)形成的向量*\(y\)的條件概率,每個\(y\)的條件概率都不一樣)

image-20200707103014284

\(w\)向量算出來后,就可以做Q2:推理了。

我們知道現在要做的事情是,給一個\(x\),找一個\(y\)\(P(y|x)\)最大,在HMM里已經知道,等同於最大化\(P(x,y)\) 。在CRF里又知道,\(P(x,y)\)是正比於\(exp(w\cdot \phi(x,y))\),代進去等同於是最大化\(w\cdot \phi(x,y)\),也可以用維特比算法做。

CRF VS HMM

image-20200707103406469

CRF的訓練過程中,不只會增加\(P(x,\hat y)\),還會減少任意一個\(y\)\(x\)形成pair的概率,而HMM並沒有減少概率這件事情。我們知道說,如果要得到正確的答案,會希望\(P(x,\hat y)>P(x,y)\) ,CRF是增加\(P(x,\hat y)\),減小\(P(x,y)\),所以CRF更有可能得到正確的結果。

舉例來說,用之前HMM的例子,根據訓練數據,HMM給了如上圖左下方所示的結果(直接統計來的),HMM說\(y_i\)應該是V。但是CRF不關心概率,就是調整\(w\)參數使得正確的\((x,y)\)pair的分數比較大。所以CRF可能調來調去,使得\(P(a|V)\)到0.1,使得\(y_i\)可能是D。

image-20200707135929734

以下是一個綜合的實驗,比較CRF和HMM有什么不一樣。

在這個實驗里面,input是小寫的\(a\)\(z\) ,output是大寫的\(A\)\(E\)。然后我們要生成一些人工數據,這些數據使用HMM生成的,但用的不是一般的HMM,用的是一個mixed-order HMM。

  • 轉移概率是:\(\alpha P(y_i|y_{i-1})+(1-\alpha)P(y_i|y_{i-1},y_{i-2})\),如果\(\alpha=1\),則后面一項是0,就是一般的HMM的轉移概率。今天\(\alpha\)的值可以任意調整,考慮一個order的比率大,還是兩個order的比率大。
  • 發射概率是:\(\alpha P(x_i|y_i)+(1-\alpha)P(x_i|y_i,x_{i-1})\),如果\(\alpha=1\),也就是一般的HMM。

比較HMM和CRF(都是一般的HMM和CRF),HMM只考慮一個order(\(\alpha=1\)的狀況) 。

一般而言,如果\(\alpha\)越小,那么跟一般的HMM和CRF差距越大,得到的performance越差。但是我們想要知道在這種情況下,到底是HMM壞得比較厲害,還是CRF壞得比較厲害。

image-20200707140229908

上圖是實驗的結果,每個圈圈是不同的\(\alpha\)得到的結果。從左下到右上代表\(\alpha\)由大到小,每個點都做HMM和CRF的實驗,橫軸和縱軸代表HMM和CRF犯錯的百分比。

可以想象如果一個點在45度角的右側,代表說HMM犯得錯多,CRF犯得錯少。從實驗結果可以發現,非實心的點是\(\alpha > \frac{1}{2}\),接近一般的HMM或者CRF,在這個狀況下HMM是比CRF好的,也不用意外,因為數據是從HMM產生的,所以HMM的假設更貼近數據的產生方式。\(\alpha < \frac{1}{2}\)時,也就是數據的產生方式和HMM、CRF的假設都不合時,這時候CRF就會比HMM好。因此此時HMM只能按照概率,而CRF會調整參數去fit數據,就算有些假設沒有被model在CRF里面,也可以借由調整參數考慮到這些假設,所以當你的模型和數據背后的假設不合時,CRF的表現就會比較好。

image-20200707144937134

上圖是CRF的總結。CRF也是一個結構化學習的方法,解決了3個問題。

Q1:評估

  • \(F(x,y)\)\(P(y|x)\),可以寫成上圖所示的式子

Q2:推理

  • 找使\(w\cdot \phi(x,y)\)最大的\(\widetilde y\),利用維特比算法求解

Q3:訓練

  • 一般文獻是寫成相乘,但是也可以取log,變成相加。使用梯度上升求解\(w\)

結構化感知機

image-20200707145406065

Q1:評估

\(F(x,y)=w\cdot \phi(x,y)\)

你可以會說,如果\(x,y\)都是sequence的話,這個\(\phi()\)應該定成什么樣子?

可以選擇自己喜歡的方式,最簡單的方式就是拿CRF的形式做就好了。

Q2:推理

一樣使用維特比算法求解。

Q3:訓練

對所有的訓練數據\(n\),和所有不等於\(\hat y\)\(y\),我們希望讓\(w\cdot \phi(x^n,\hat y^n)\)大於\(w\cdot \phi(x^n,y)\)。這件事在結構化感知機里,我們會找一個\(\widetilde y\)(根據目前的\(w\),讓式子最大)。接下來更新\(w\)(如上圖最下方所示)。

image-20200707150111785

你有沒有覺得結構化感知機\(w\)更新很眼熟呢,和CRF的梯度上升很像?

在CRF梯度上升里,如果忽略掉\(\eta\)(學習率),那跟結構化感知機一樣都有兩項(綠色線項和紫色線項)。綠色項是一樣的,紫色項雖然看起來不一樣,但其實是很有關系的。CRF里是summation over所有的\(y\)的特征向量,再做weight sum,結構化感知機里則是某一個\(\widetilde y\)的特征向量,而\(\widetilde y\)可以讓\(w\cdot \phi(x^n,y)\)最大,\(\widetilde y\)其實就是讓概率\(P(y|x^n)\)最大\(y\)

  • 在CRF里,減去所有\(y\)的特征向量的weight sum
  • 在結構化感知機里,減去令weight (\(P(y|x^n)\) )最大的\(y\)的特征向量

所以結構化感知機是減去Hard(硬范疇),而CRF是Soft(軟范疇)。可以想象說,如果所有\(y\)里面,只有一個\(y\)是概率為1的,其他\(y\)概率都是0,那么結構化感知機和CRF就是等價的。

結構化SVM

image-20200707151308443

結構化SVM的Q1和Q2都跟結構化感知機的一樣的,唯一不同的地方是訓練的方式。在SVM里面,我們會加上margin和error的概念,有兩個方法求解,一個是梯度下降,另一個是切割平面算法。

image-20200707155125112

結構化SVM里面有個特別的地方,是要考慮error這件事情。我們把誤差函數寫成\(\Delta(\hat y^n,y)\)

  • 計算\(y\)和正確的\(\hat y\)之間不一樣的程度(\(y,\hat y\)之間的差異性)。

  • 結構化SVM的成本函數是\(\Delta(\hat y^n,y)\)的上界,所以最小化成本函數相當於最小化\(\Delta(\hat y^n,y)\)

  • 理論上,\(\Delta(\hat y^n,y)\)可以是任何函數

  • 但是,必須考慮,今天再使用結構化SVM的時候,不管是使用梯度下降,還是使用切割平面算法,都要面對一個問題2.1(窮舉所以\(y\)\(\Delta(\hat y^n,y)+w\cdot \phi(x^n,y)\)最大),這個不一定解得出來,如果\(\Delta\)定得比較復雜的話。上圖最下方是一個可以解的例子,如果把兩個sequence之間的\(\Delta\)定義成錯誤率的話(不一樣label個數/sequence長度),這樣就可以解。

不同方法的比較

image-20200707164558682

上圖是不同方法在POS Tagging上實驗的比較。發現HMM的表現是最差的,CRF是橙色的線,感知機是灰色的線,CRF和感知機區別就是一個是硬范疇,一個是軟范疇,誰好誰壞不好定義,但是CRF有個問題是要summation over所有\(y'\),這件事情你不一定知道要怎么解,不知道怎么解就用感知機好了,圖中SVM是最好的。

上圖下方是另外一個實驗,(命名實體識別),發現SVM是表現最好的。

為什么不用RNN

image-20200707172904986

剛才講的這種序列標注的問題,你可以用RNN,LSTM來解,也可以用HMM、CRF、結構化感知機和SVM來解。那到底哪一個比較好呢?

RNN,LSTM

  • 有個缺點是,如果你用的是單向RNN或者LSTM的話,並沒有看過整個sequence。也就是在單向RNN里,產生第\(t\)個時間點的output時,你只考慮了時間1到時間t的input,沒有考慮時間t+1到時間T的input。那用雙向RNN會怎么樣呢?還沒有在文獻上看到過,雙向RNN跟用維特比算法算出來的結果,有什么差異。
  • RNN、LSTM有足夠的的訓練數據,或許可以把label依賴關系學習出來。
  • 還有個問題是cost和你要的error不見得是有關系的。比如我們希望錯誤率最低,訓練RNN的時候是最小化cost函數,最小化cost函數不一定能降低錯誤率。
  • 有個傳統方法無法比擬的優點,就是可以deep(疊很多層)

HMM、CRF、結構化感知機/SVM

  • 在產生結果的時候,都是做維特比算法(窮舉所有的sequence,看哪個最可能),在計算分數的時候是看過整個sequence的,這個和單向RNN不同。
  • 可以明確地考慮output的sequence,label跟label之間的關系。假設你今天知道output的sequence里面,a跟b這兩個元素不可能同時出現,你可以輕易的把這件事情塞到維特比算法中去。比如語音識別里面,中文都是聲母接韻母,聲母后面不能再接聲母,那你可以把這種約束塞到維特比算法中去。在做維特比算法時,一邊窮舉所有的sequence,一邊過濾掉不可能的sequence。比如只窮舉聲母接韻母的sequence,丟掉聲母接聲母的sequence。 這樣就可以把sequence里面的label的依賴關系明確地描述在我們的model里面。
  • 如果使用結構化SVM,那你最小化的cost函數就是要的錯誤函數的上界,讓你覺得訓練的時候比較安心,當你的cost函數逐漸減小的時候,你的error很有可能也是逐漸減小的。

雖然傳統方法有很多有點,但還是RNN、LSTM表現好。

把傳統方法和深度學習整合在一起

image-20200707173340207

可以把深度學習方法和傳統方法加起來。

model的底層是RNN、LSTM,可以deep。model的淺層可以使HMM、CRF、結構化感知機/SVM,可以發揮它們的優勢(可以明確描述依賴關系,使用結構化SVM的話,cost函數還是error的上界。現在基本上好的方法就是底層架構是deep的方法。

image-20200707174631232

以語音識別舉例,如上圖所示。

根據HMM的model,\(P(x,y)\)如上圖所示的公式。把HMM的\(P(x_l|y_l)\)用DNN、RNN、LSTM得到的結果替換。RNN或DNN可以把一個input \(x_l\)變成一個概率的分布(\(P(a|x_l),P(b|x_l),P(c|x_l)...\)),可以把這個概率分布替換掉HMM的\(P(x_l|y_l)\)

可能你會覺得HMM是給定\(y\),而RNN里是給定\(x\),方向不一致,但可以做一下改變,如上圖右下方所示。\(P(y_l|x_l)\)就是RNN的output,\(P(y_l)\)是label出現的概率(直接從訓練數據統計),還有\(P(x_l)\),訓練數據每個特征都只有一個啊,怎么計算概率呢?就不要管它,真正在用HMM做Q2推理的時候,是給定\(x\),看哪個\(y\)最有可能,不管\(x\)的值是多少,都不會影響最后得到的\(y\)

image-20200707175108502

或者你可以把單向RNN/LSTM加上CRF/結構化SVM,這種方法在序列標注、語義標注這種task里面是非常常見的。

可以把input的特征通過deep的RNN,得到一組新的特征,在新的特征上抽\(\phi(x,y)\)\(x\)是RNN的output),然后把\(w\cdot \phi(x,y)\)作為評估函數。在訓練的時候可以把\(w\)跟RNN的參數一起訓練。

image-20200707165308705

最后是今天的結論,講了好幾種不同的可以處理序列標注的方法,它們都解了三個問題。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM