陸陸續續把調研學習工做完成了,雖然歷時有點久,如今put上來。評論裏的同窗也等不及了時不時催我,因此不敢怠慢啊……html
總結的還算比較體系化,蠻長的,請讀者慢慢看,確定有收穫的。python
(好痛苦,這麼多公式都要在知乎上重輸;是在MD上寫的,在知乎上沒想到格式這麼難看……)c++
——20180129git
2.1 機率圖 github
2.1.1 概覽
2.1.2 有向圖 vs. 無向圖
2.1.3 馬爾科夫假設&馬爾科夫性
2.2 判別式模型 vs. 生成式模型
2.3 序列建模算法
3.1 理解HMM
3.2 模型運行過程
3.2.1 學習過程
3.2.2 序列標註(解碼)過程
3.2.3 序列機率過程網絡
4.1 理解MEMM
4.2 模型運行過程app
4.2.1 學習過程
4.2.2 序列標註(解碼)過程
4.2.3 序列機率過程
4.3 標註偏置? 框架
5.1 理解CRF
5.2 模型運行過程
5.2.1 學習過程
5.2.2 解碼過程
5.2.3 序列機率過程
5.3 CRF++分析
5.4 LSTM+CRF dom
以前剛接觸NLP時作相關的任務,也必然地涉及到了序列處理任務,而後天然要接觸到機率圖模型。當時在全網搜中文資料,陸續失望地發現居然真的沒有講得清楚的博文,發現基本是把李航老師書裏或CRF tutorial等資料的文字論述和公式抄來抄去的。固然,沒有說別人講的是錯的,只是以爲,要是沒有把東西說的讓讀者看得懂,那也是沒意義啊。或者有些吧,就是講了一大堆的東西,貌似也明白了啥,但仍是不能讓我很好的理解CRF這些模型到底是個啥,完了仍是有一頭霧水散不開的感受。試想,一堆公式扔過來,沒有個感性理解的過渡,怎麼可能理解的了。我甚至以爲,若是博客讓人看不懂,那說明要麼本身沒理解透要麼就是思惟不清晰講不清楚。因此默想,深水區攻堅仍是要靠本身,而後去作調研作research,因此就寫了個這個學習記錄。
因此機率圖的研究學習思考列入了個人任務清單。不過平時的時間又很是的緊,只能陸陸續續的思考着,因此時間拖得也真是長啊。
這是個學習筆記。相比其餘的學習模型,機率圖貌似確實是比較難以理解的。這裏我基本所有用本身的理解加上本身的語言習慣表達出來,off the official form,表達儘可能接地氣。我會盡可能將我全部理解過程當中的每一個關鍵小細節都詳細描述出來,以使對零基礎的初學者友好。包括理論的前因後果,抽象具象化,模型的構成,模型的訓練過程,會注重類比的學習。
根據現有資料,我是按照機率圖模型將HMM,MEMM,CRF放在這裏一塊兒對比學習。之因此把他們拿在一塊兒,是由於他們都用於標註問題。而且之因此放在機率圖框架下,是徹底由於本身top-down思惟模式使然。另外,機率圖下還有不少的模型,這兒只學習標註模型。
正兒八經的,我對這些個機率圖模型有了徹悟,是從我明白了生成式模型與判別式模型的那一刻。一直在思考從機率圖模型角度講他們的區別到底在哪。
另外,篇幅略顯長,但我們不要急躁,好好看完這篇具備良好的上下文的筆記,那確定是能理解的,或者就多看幾遍。
我的學習習慣就是,要儘量地將一羣沒有結構的知識點融會貫通,再用一條樹狀結構的繩將之串起來,結構化,就是說要成體系,這樣把繩子頭一拎全部的東西都能拿起來。學習嘛,應該要是一個熵減的過程,卓有成效的學習應該是混亂度愈來愈小!這個思惟方式對我影響仍是蠻大的。
在正式內容以前,仍是先要明確下面這一點,最好腦子裏造成一個定勢:
統計機器學習全部的模型(個別instant model和優化算法以及其餘的特種工程知識點除外)的工做流程都是如此:
a.訓練模型參數,獲得模型(由參數惟一肯定),
b.預測給定的測試數據。
拿這個流程去挨個學習模型,思路上會很是順暢。這一點可參見我 另外一篇文字介紹。
除此以外,對初學者的關於機器學習的入門學習方式也順帶表達一下(empirical speaking):
a.完整特徵工程競賽
b.野博客理論入門理解
c.再回到代碼深刻理解模型內部
d.再跨理論,查閱經典理論巨做。這時感性理性都有必定高度,會遇到不少很大的理解上的疑惑,這時3大經典可能就能夠發揮到最大做用了。
不少beginer,就好比說學CRF模型,而後一上來就擺一套複雜的公式,什麼我就問,這能理解的了嗎?這是正確的開啓姿式嗎?固然了,也要怪那些博主,直接整一大堆核心公式,實際上讀者的理解門檻可能就是一個過渡性的細枝末節而已。沒有上下文的教育確定是失敗的(這一點我又想吐槽國內絕大部分本科的院校教育模式)。因此說帶有完整上下文信息以及過程前因後果交代清楚纔算到位吧。
而不是一上來就死啃被人推薦的「經典資料」,這一點相信部分同窗會理解。比如之前本科零基礎學c++ JAVA,上來就看primr TIJ,結果浪費了時間精力一直在門外兜圈。總結方法吸收教訓,應該快速上手代碼,纔是最高效的。經典最好是用來查閱的工具書,我目前是李航周志華和經典的那3本迭代輪詢看了好多輪,常常會反覆查詢某些model或理論的前因後果;有時候要查不少相關的東西,看這些書仍是難以貫通,而後發現有些人的博客寫的會更容易去理解。因此另外,學習資料渠道也要充分才行。
最後提示一下,請務必按照標題層級結構和目錄一級一級閱讀,防止跟丟。
以前剛接觸CRF時,一上來試圖越過一堆繁瑣的機率圖相關概念,不過sad to say, 這是後面的前驅知識,後面還得反過來補這個點。因此若想總體把握,系統地拿下這一塊,應該仍是要越過這塊門檻的。
固然了,一開始只需略略快速看一篇,後面可再返過來補查。
在統計機率圖(probability graph models)中,參考宗成慶老師的書,是這樣的體系結構(我的很是喜歡這種類型的圖):
在機率圖模型中,數據(樣本)由公式 建模表示:
上圖能夠看到,貝葉斯網絡(信念網絡)都是有向的,馬爾科夫網絡無向。因此,貝葉斯網絡適合爲有單向依賴的數據建模,馬爾科夫網絡適合實體之間互相依賴的建模。具體地,他們的核心差別表如今如何求 ,即怎麼表示 這個的聯合機率。
1. 有向圖
對於有向圖模型,這麼求聯合機率:
舉個例子,對於下面的這個有向圖的隨機變量(注意,這個圖我畫的仍是比較廣義的):
應該這樣表示他們的聯合機率:
應該很好理解吧。
2. 無向圖
對於無向圖,我看資料通常就指馬爾科夫網絡(注意,這個圖我畫的也是比較廣義的)。
若是一個graph太大,能夠用因子分解將 寫爲若干個聯合機率的乘積。咋分解呢,將一個圖分爲若干個「小團」,注意每一個團必須是「最大團」(就是裏面任何兩個點連在了一塊,具體……算了不解釋,有點「最大連通子圖」的感受),則有:
, 其中 ,公式應該不難理解吧,歸一化是爲了讓結果算做機率。
因此像上面的無向圖:
其中, 是一個最大團 上隨機變量們的聯合機率,通常取指數函數的:
好了,管這個東西叫作勢函數
。注意 是否有看到CRF的影子。
那麼機率無向圖的聯合機率分佈能夠在因子分解下表示爲:
注意,這裏的理解還蠻重要的,注意遞推過程,敲黑板,這是CRF的開端!
這個由Hammersly-Clifford law
保證,具體不展開。
這個也屬於前饋知識。
1. 馬爾科夫假設
額應該是齊次馬爾科夫假設,這樣假設:馬爾科夫鏈 裏的 老是隻受 一我的的影響。
馬爾科夫假設這裏至關於就是個2-gram。
馬爾科夫過程呢?即,在一個過程當中,每一個狀態的轉移只依賴於前n個狀態,而且只是個n階的模型。最簡單的馬爾科夫過程是一階的,即只依賴於器哪個狀態。
2. 馬爾科夫性
馬爾科夫性是是保證或者判斷機率圖是否爲機率無向圖的條件。
三點內容:a. 成對,b. 局部,c. 全局。
我以爲這個不用展開。
在監督學習下,模型能夠分爲判別式模型與生成式模型。
重點來了。上面有提到,我理解了HMM、CRF模型的區別是從理解了判別式模型與生成式模型的那刻,而且瞬間對其餘的模型有一個恍然大悟。我記得是一年前就開始糾結這二者的區別,但我只能說,栽在了一些爛博客上,大部分都沒有本身的insightful理解,也就是一頓官話,也真是難以理解。後來在知乎上一直琢磨別人的答案,而後某日早晨終於豁然開朗,就是這種感受。
好了,我要用本身的理解來轉述二者的區別了below。
先問個問題,根據經驗,A批模型(神經網絡模型、SVM、perceptron、LR、DT……)與B批模型(NB、LDA……),有啥區別不?(這個問題須要一些模型使用經驗)應該是這樣的:
1. A批模型是這麼工做的,他們直接將數據的Y(或者label),根據所提供的features,學習,最後畫出了一個明顯或者比較明顯的邊界(具體怎麼作到的?經過複雜的函數映射,或者決策疊加等等mechanism),這一點線性LR、線性SVM應該很明顯吧。
2. B批模型是這麼工做的,他們先從訓練樣本數據中,將全部的數據的分佈狀況摸透,而後最終肯定一個分佈,來做爲個人全部的輸入數據的分佈,而且他是一個聯合分佈 (注意 包含全部的特徵 , 包含全部的label)。而後我來了新的樣本數據(inference),好,經過學習來的模型的聯合分佈 ,再結合新樣本給的 ,經過條件機率就能出來 :
好了,應該說清楚了。
1. 判別式模型
那麼A批模型對應了判別式模型。根據上面的兩句話的區別,能夠知道判別模型的特徵了,因此有句話說:判別模型是直接對 建模,就是說,直接根據X特徵來對Y建模訓練。
具體地,個人訓練過程是肯定構件 模型裏面「複雜映射關係」中的參數,完了再去inference一批新的sample。
因此判別式模型的特徵總結以下:
2. 生成式模型
一樣,B批模型對應了生成式模型。而且須要注意的是,在模型訓練中,我學習到的是X與Y的聯合模型 ,也就是說,我在訓練階段是隻對 建模,我須要肯定維護這個聯合機率分佈的全部的信息參數。完了以後在inference再對新的sample計算 ,導出 ,但這已經不屬於建模階段了。
結合NB過一遍生成式模型的工做流程。學習階段,建模: (固然,NB具體流程去隔壁參考),而後 。
另外,LDA也是這樣,只是他更過度,須要肯定不少個機率分佈,並且建模抽樣都蠻複雜的。
因此生成式總結下有以下特色:
這一點明白後,後面講到的HMM與CRF的區別也會很是清晰。
最後identity the picture below:
爲了號召零門檻理解,如今解釋如何爲序列問題建模。
序列包括時間序列以及general sequence,但二者無異。連續的序列在分析時也會先離散化處理。常見的序列有如:時序數據、本文句子、語音數據、等等。
廣義下的序列有這些特色:
對不一樣的序列有不一樣的問題需求,常見的序列建模方法總結有以下:
a. 常規序列建模方法:AR、MA、ARMA、ARIMA
b. 迴歸擬合
c. Neural Networks
2. 判斷不一樣序列類別,即分類問題:HMM、CRF、General Classifier(ML models、NN models)
3. 不一樣時序對應的狀態的分析,即序列標註問題:HMM、CRF、RecurrentNNs
在本篇文字中,咱們只關注在2. & 3.類問題下的建模過程和方法。
最先接觸的是HMM。較早作過一個項目,關於聲波手勢識別,跟聲音識別的機制同樣,使用的正是HMM的一套方法。後來又用到了kalman filter,以後作序列標註任務接觸到了CRF,因此整個機率圖模型仍是接觸的方面還蠻多。
在2.二、2.3中提序列的建模問題時,咱們只是討論了常規的序列數據,e.g., ,像2.3的圖片那樣。像這種序列通常用馬爾科夫模型就能夠勝任。實際上咱們碰到的更多的使用HMM的場景是每一個節點 下還附帶着另外一個節點 ,正所謂隱含馬爾科夫模型,那麼除了正常的節點,還要將隱含狀態節點也得建模進去。正兒八經地,將 換成 ,而且他們的名稱變爲狀態節點、觀測節點。狀態節點正是個人隱狀態。
HMM屬於典型的生成式模型。對照2.1的講解,應該是要從訓練數據中學到數據的各類分佈,那麼有哪些分佈呢以及是什麼呢?直接正面回答的話,正是HMM的5要素,其中有3個就是整個數據的不一樣角度的機率分佈:
因此圖看起來是這樣的:
看的很清楚,個人模型先去學習要肯定以上5要素,以後在inference階段的工做流程是:首先,隱狀態節點 是不能直接觀測到的數據節點, 纔是能觀測到的節點,而且注意箭頭的指向表示了依賴生成條件關係, 在A的指導下生成下一個隱狀態節點 ,而且 在 的指導下生成依賴於該 的觀測節點 , 而且我只能觀測到序列 。
好,舉例子說明(序列標註問題,POS,標註集BES):
input: "學習出一個模型,而後再預測出一條指定"
expected output: 學/B 習/E 出/S 一/B 個/E 模/B 型/E ,/S 然/B 後/E 再/E 預/B 測/E ……
其中,input裏面全部的char構成的字表,造成觀測集 ,由於字序列在inference階段是我所能看見的;標註集BES構成隱藏狀態集 ,這是我沒法直接獲取的,也是個人預測任務;至於 ,這些機率分佈信息(上帝信息)都是我在學習過程當中所肯定的參數。
而後通常初次接觸的話會疑問:爲何要這樣?……好吧,就應該是這樣啊,根據具備同時帶着隱藏狀態節點和觀測節點的類型的序列,在HMM下就是這樣子建模的。
下面來點高層次的理解:
模型的運行過程(工做流程)對應了HMM的3個問題。
對照2.1的講解,HMM學習訓練的過程,就是找出數據的分佈狀況,也就是模型參數的肯定。
主要學習算法按照訓練數據除了觀測狀態序列 是否還有隱狀態序列 分爲:
感受不用作不少的介紹,都是很實實在在的算法,看懂了就能理解。簡要提一下。
1. 極大似然估計
通常作NLP的序列標註等任務,在訓練階段確定是有隱狀態序列的。因此極大似然估計法是很是經常使用的學習算法,我見過的不少代碼裏面也是這麼計算的。比較簡單。
好比說,在代碼裏計算完了就是這樣的:
2. Baum-Welch(前向後向)
就是一個EM的過程,若是你對EM的工做流程有經驗的話,對這個Baum-Welch一看就懂。EM的過程就是初始化一套值,而後迭代計算,根據結果再調整值,再迭代,最後收斂……好吧,這個理解是沒有捷徑的,去隔壁鑽研EM吧。
這裏只提一下核心。由於咱們手裏沒有隱狀態序列 信息,因此我先必須給初值 ,初步肯定模型,而後再迭代計算出 ,中間計算過程會用到給出的觀測狀態序列 。另外,收斂性由EM的XXX定理保證。
好了,學習完了HMM的分佈參數,也就肯定了一個HMM模型。須要注意的是,這個HMM是對我這一批所有的數據進行訓練所獲得的參數。
序列標註問題也就是「預測過程」,一般稱爲解碼過程。對應了序列建模問題3.。對於序列標註問題,咱們只須要學習出一個HMM模型便可,後面全部的新的sample我都用這一個HMM去apply。
咱們的目的是,在學習後已知了 ,如今要求出 ,進一步
再直白點就是,我如今要在給定的觀測序列下找出一條隱狀態序列,條件是這個隱狀態序列的機率是最大的那個。
具體地,都是用Viterbi算法解碼,是用DP思想減小重複的計算。Viterbi也是滿大街的,不過要說的是,Viterbi不是HMM的專屬,也不是任何模型的專屬,他只是剛好被知足了被HMM用來使用的條件。誰知,如今你們都把Viterbi跟HMM捆綁在一塊兒了, shame。
Viterbi計算有向無環圖的一條最大路徑,應該還好理解。如圖:
關鍵是注意,每次工做熱點區只涉及到t 與 t-1,這對應了DP的無後效性的條件。若是對某些同窗仍是很難理解,請參考這個答案下@Kiwee的回答吧。
我經過HMM計算出序列的機率又有什麼用?針對這個點我把這個問題詳細說一下。
實際上,序列機率過程對應了序列建模問題2.,即序列分類。
在3.2.2第一句話我說,在序列標註問題中,我用一批完整的數據訓練出了一支HMM模型便可。好,那在序列分類問題就不是訓練一個HMM模型了。我應該這麼作(結合語音分類識別例子):
目標:識別聲音是A發出的仍是B發出的。
HMM建模過程:
1. 訓練:我將全部A說的語音數據做爲dataset_A,將全部B說的語音數據做爲dataset_B(固然,先要分別對dataset A ,B作預處理encode爲元數據節點,造成sequences),而後分別用dataset_A、dataset_B去訓練出HMM_A/HMM_B
2. inference:來了一條新的sample(sequence),我不知道是A的仍是B的,沒問題,分別用HMM_A/HMM_B計算一遍序列的機率獲得 ,比較二者大小,哪一個機率大說明哪一個更合理,更大機率做爲目標類別。
因此,本小節的理解重點在於,如何對一條序列計算其總體的機率。即目標是計算出 。這個問題前輩們在他們的經典中說的很是好了,好比參考李航老師整理的:
後面兩個算法採用了DP思想,減小計算量,即每一次直接引用前一個時刻的計算結果以免重複計算,跟Viterbi同樣的技巧。
仍是那句,由於這篇文檔不是專門講算法細節的,因此不詳細展開這些。畢竟,全部的科普HMM、CRF的博客貌似都是在扯這些算法,妥妥的街貨,就不搬運了。
MEMM,即最大熵馬爾科夫模型,這個是在接觸了HMM、CRF以後才知道的一個模型。說到MEMM這一節時,得轉換思惟了,由於如今這MEMM屬於判別式模型。
不過有一點很尷尬,MEMM貌似被使用或者講解引用的不及HMM、CRF。
這裏仍是囉嗦強調一下,MEMM正由於是判別模型,因此不廢話,我上來就直接爲了肯定邊界而去建模,好比說序列求機率(分類)問題,我直接考慮找出函數分類邊界。這一點跟HMM的思惟方式發生了很大的變化,若是不對這一點有意識,那麼很難理解爲何MEMM、CRF要這麼作。
HMM中,觀測節點 依賴隱藏狀態節點 ,也就意味着個人觀測節點只依賴當前時刻的隱藏狀態。但在更多的實際場景下,觀測序列是須要不少的特徵來刻畫的,好比說,我在作NER時,個人標註 不只跟當前狀態 相關,並且還跟先後標註 相關,好比字母大小寫、詞性等等。
爲此,提出來的MEMM模型就是可以直接容許「定義特徵」,直接學習條件機率,即 , 整體爲:
而且, 這個機率經過最大熵分類器建模(取名MEMM的緣由):
重點來了,這是ME的內容,也是理解MEMM的關鍵: 這部分是歸一化; 是特徵函數,具體點,這個函數是須要去定義的; 是特徵函數的權重,這是個未知參數,須要從訓練階段學習而得。
好比我能夠這麼定義特徵函數:
其中,特徵函數 個數可任意制定,
因此整體上,MEMM的建模公式這樣:
是的,公式這部分之因此長成這樣,是由ME模型決定的。
請務必注意,理解判別模型和定義特徵兩部分含義,這已經涉及到CRF的雛形了。
因此說,他是判別式模型,直接對條件機率建模。 上圖:
MEMM須要兩點注意:
好了,走一遍完整流程。
step1. 先預約義特徵函數 ,
step2. 在給定的數據上,訓練模型,肯定參數,即肯定了MEMM模型
step3. 用肯定的模型作序列標註問題或者序列求機率問題。
MEMM模型的工做流程也包括了學習訓練問題、序列標註問題、序列求機率問題。
一套MEMM由一套參數惟一肯定,一樣地,我須要經過訓練數據學習這些參數。MEMM模型很天然須要學習裏面的特徵權重λ。
不過跟HMM不用的是,由於HMM是生成式模型,參數即爲各類機率分佈元參數,數據量足夠能夠用最大似然估計。而判別式模型是用函數直接判別,學習邊界,MEMM即經過特徵函數來界定。但一樣,MEMM也有極大似然估計方法、梯度降低、牛頓迭代發、擬牛頓降低、BFGS、L-BFGS等等。各位應該對各類優化方法有所瞭解的。
嗯,具體詳細求解過程貌似問題不大。
仍是跟HMM同樣的,用學習好的MEMM模型,在新的sample(觀測序列 )上找出一條几率最大最可能的隱狀態序列 。
只是如今的圖中的每一個隱狀態節點的機率求法有一些差別而已,正確將每一個節點的機率表示清楚,路徑求解過程仍是同樣,採用viterbi算法。
跟HMM舉的例子同樣的,也是分別去爲每一批數據訓練構建特定的MEMM,而後根據序列在每一個MEMM模型的不一樣得分機率,選擇最高分數的模型爲wanted類別。
應該能夠不用展開,吧……
MEMM討論的最多的是他的labeling bias 問題。
1. 現象
是從街貨上烤過來的……
用Viterbi算法解碼MEMM,狀態1傾向於轉換到狀態2,同時狀態2傾向於保留在狀態2。 解碼過程細節(須要會viterbi算法這個前提):
P(1-> 1-> 1-> 1)= 0.4 x 0.45 x 0.5 = 0.09 ,
P(2->2->2->2)= 0.2 X 0.3 X 0.3 = 0.018,
P(1->2->1->2)= 0.6 X 0.2 X 0.5 = 0.06,
P(1->1->2->2)= 0.4 X 0.55 X 0.3 = 0.066
可是獲得的最優的狀態轉換路徑是1->1->1->1,爲何呢?由於狀態2能夠轉換的狀態比狀態1要多,從而使轉移機率下降,即MEMM傾向於選擇擁有更少轉移的狀態。
2. 解釋緣由
直接看MEMM公式:
求和的做用在機率中是歸一化,可是這裏歸一化放在了指數內部,管這叫local歸一化。 來了,viterbi求解過程,是用dp的狀態轉移公式(MEMM的沒展開,請參考CRF下面的公式),由於是局部歸一化,因此MEMM的viterbi的轉移公式的第二部分出現了問題,致使dp沒法正確的遞歸到全局的最優。
我以爲一旦有了一個清晰的工做流程,那麼循序漸進地,沒有什麼很難理解的地方,由於總體框架已經成竹在胸了,剩下了也只有添磚加瓦小修小補了。有了上面的過程基礎,CRF也是相似的,只是有方法論上的細微區別。
請看第一張機率圖模型構架圖,CRF上面是馬爾科夫隨機場(馬爾科夫網絡),而條件隨機場是在給定的隨機變量 (具體,對應觀測序列 )條件下,隨機變量 (具體,對應隱狀態序列 的馬爾科夫隨機場。
廣義的CRF的定義是: 知足 的馬爾科夫隨機場叫作條件隨機場(CRF)。
不過通常說CRF爲序列建模,就專指CRF線性鏈(linear chain CRF):
在2.1.2中有提到過,機率無向圖的聯合機率分佈能夠在因子分解下表示爲:
而在線性鏈CRF示意圖中,每個( )對爲一個最大團,即在上式中 。而且線性鏈CRF知足 。
因此CRF的建模公式以下:
我要敲黑板了,這個公式是很是很是關鍵的,注意遞推過程啊,我是怎麼從 跳到 的。
不過仍是要多囉嗦一句,想要理解CRF,必須判別式模型的概念要深刻你心。正由於是判別模型,因此不廢話,我上來就直接爲了肯定邊界而去建模,由於我創造出來就是爲了這個分邊界的目的的。好比說序列求機率(分類)問題,我直接考慮找出函數分類邊界。因此才爲何會有這個公式。因此再看到這個公式也別懵逼了,he was born for discriminating the given data from different classes. 就這樣。不過待會還會具體介紹特徵函數部分的東西。
除了建模總公式,關鍵的CRF重點概念在MEMM中已強調過:判別式模型、特徵函數。
1. 特徵函數
上面給出了CRF的建模公式:
對於CRF,能夠爲他定義兩款特徵函數:轉移特徵&狀態特徵。 咱們將建模總公式展開:
其中:
不過通常狀況下,咱們不把兩種特徵區別的那麼開,合在一塊兒:
知足特徵條件就取值爲1,不然沒貢獻,甚至你還可讓他打負分,充分懲罰。
再進一步理解的話,咱們須要把特徵函數部分摳出來:
是的,咱們爲 打分,知足條件的就有所貢獻。最後將所得的分數進行log線性表示,求和後歸一化,便可獲得機率值……完了又扯到了log線性模型。如今稍做解釋:
log-linear models take the following form:
我以爲對LR或者sotfmax熟悉的對這個應該秒懂。而後CRF完美地知足這個形式,因此又能夠納入到了log-linear models之中。
模型的工做流程,跟MEMM是同樣的:
序列標註問題
或者序列求機率問題
。可能仍是沒作到100%懂,結合例子說明:
……
一套CRF由一套參數λ惟一肯定(先定義好各類特徵函數)。
一樣,CRF用極大似然估計方法、梯度降低、牛頓迭代、擬牛頓降低、IIS、BFGS、L-BFGS等等。各位應該對各類優化方法有所瞭解的。其實能用在log-linear models上的求參方法均可以用過來。
嗯,具體詳細求解過程貌似問題不大。
仍是跟HMM同樣的,用學習好的CRF模型,在新的sample(觀測序列 )上找出一條几率最大最可能的隱狀態序列 。
只是如今的圖中的每一個隱狀態節點的機率求法有一些差別而已,正確將每一個節點的機率表示清楚,路徑求解過程仍是同樣,採用viterbi算法。
囉嗦一下,咱們就定義i處的局部狀態爲 ,表示在位置i處的隱狀態的各類取值可能爲I,而後遞推位置i+1處的隱狀態,寫出來的DP轉移公式爲:
這裏沒寫規範因子 是由於不規範化不會影響取最大值後的比較。
具體仍是不展開爲好。
跟HMM舉的例子同樣的,也是分別去爲每一批數據訓練構建特定的CRF,而後根據序列在每一個MEMM模型的不一樣得分機率,選擇最高分數的模型爲wanted類別。只是貌似不多看到拿CRF或者MEMM來作分類的,直接用網絡模型不就完了不……
應該能夠不用展開,吧……
原本作task用CRF++跑過baseline,後來在對CRF作調研時,很是想透析CRF++的工做原理,以identify以及verify作的各類假設猜測。固然,也看過其餘的CRF實現源碼。
因此乾脆寫到這裏來,結合CRF++實例講解過程。
有一批語料數據,而且已經tokenized好了:
Nuclear
theory
devoted
major
efforts
……
而且我先肯定了13個標註元素:
B_MAT
B_PRO
B_TAS
E_MAT
E_PRO
E_TAS
I_MAT
I_PRO
I_TAS
O
S_MAT
S_PRO
S_TAS
1. 定義模板
按道理應該是定義特徵函數纔對吧?好的,在CRF++下,應該是先定義特徵模板,而後用模板自動批量產生大量的特徵函數。我以前也蠻confused的,用完CRF++還覺得模板就是特徵,後面就搞清楚了:每一條模板將在每個token處生產若干個特徵函數。
CRF++的模板(template)有U系列(unigram)、B系列(bigram),不過我至今搞不清楚B系列的做用,由於U模板均可以完成2-gram的做用。
U00:%x[-2,0]
U01:%x[-1,0]
U02:%x[0,0]
U03:%x[1,0]
U04:%x[2,0]
U05:%x[-2,0]/%x[-1,0]/%x[0,0]
U06:%x[-1,0]/%x[0,0]/%x[1,0]
U07:%x[0,0]/%x[1,0]/%x[2,0]
U08:%x[-1,0]/%x[0,0]
U09:%x[0,0]/%x[1,0]
B
因此,U00 - U09 我定義了10個模板。
2. 產生特徵函數
是的,會產生大量的特徵。 U00 - U04的模板產生的是狀態特徵函數;U05 - U09的模板產生的是轉移特徵函數。
在CRF++中,每一個特徵都會try每一個標註label(這裏有13個),總共將生成 個特徵函數以及對應的權重出來。N表示每一套特徵函數 ,L表示標註集元素個數。
好比訓練好的CRF模型的部分特徵函數是這樣存儲的:
22607 B
790309 U00:%
3453892 U00:%)
2717325 U00:&
2128269 U00:'t
2826239 U00:(0.3534
2525055 U00:(0.593–1.118
197093 U00:(1)
2079519 U00:(1)L=14w2−12w−FμνaFaμν
2458547 U00:(1)δn=∫−∞En+1ρ˜(E)dE−n
1766024 U00:(1.0g
2679261 U00:(1.1wt%)
1622517 U00:(100)
727701 U00:(1000–5000A)
2626520 U00:(10a)
2626689 U00:(10b)
……
2842814 U07:layer/thicknesses/Using
2847533 U07:layer/thicknesses/are
2848651 U07:layer/thicknesses/in
331539 U07:layer/to/the
1885871 U07:layer/was/deposited
……(數量很是龐大)
其實也就是對應了這樣些個特徵函數:
func1 = if (output = B and feature="U02:一") return 1 else return 0
func2 = if (output = M and feature="U02:一") return 1 else return 0
func3 = if (output = E and feature="U02:一") return 1 else return 0
func4 = if (output = S and feature="U02:一") return 1 else return 0
好比模板U06會從語料中one by one逐句抽出這些各個特徵:
一/個/人/……
個/人/走/……
3. 求參
對上述的各個特徵以及初始權重進行迭代參數學習。
在CRF++ 訓練好的模型裏,權重是這樣的:
0.3972716048310705
0.5078838237171732
0.6715316559507898
-0.4198827647512405
-0.4233310655891150
-0.4176580083832543
-0.4860489836004728
-0.6156475863742051
-0.6997919485753300
0.8309956709647820
0.3749695682658566
0.2627347894057647
0.0169732441379157
0.3972716048310705
0.5078838237171732
0.6715316559507898
……(數量很是龐大,與每一個label的特徵函數對應,我這有300W個)
4. 預測解碼
結果是這樣的:
Nuclear B TAS
theory ETAS
devoted O
major O
efforts O
……
LSTM+CRF這個組合其實我在知乎上答過問題,而後順即可以整合到這裏來。
一、perspectively
你們都知道,LSTM已經能夠勝任序列標註問題了,爲每一個token預測一個label(LSTM後面接:分類器);而CRF也是同樣的,爲每一個token預測一個label。
可是,他們的預測機理是不一樣的。CRF是全局範圍內統計歸一化的條件狀態轉移機率矩陣,再預測出一條指定的sample的每一個token的label;LSTM(RNNs,不區分here)是依靠神經網絡的超強非線性擬合能力,在訓練時將samples經過複雜到讓你窒息的高階高緯度異度空間的非線性變換,學習出一個模型,而後再預測出一條指定的sample的每一個token的label。
二、LSTM+CRF
既然LSTM都OK了,爲啥researchers搞一個LSTM+CRF的hybrid model?
哈哈,由於a single LSTM預測出來的標註有問題啊!舉個segmentation例子(BES; char level),plain LSTM 會搞出這樣的結果:
input: "學習出一個模型,而後再預測出一條指定"
expected output: 學/B 習/E 出/S 一/B 個/E 模/B 型/E ,/S 然/B 後/E 再/E 預/B 測/E ……
real output: 學/B 習/E 出/S 一/B 個/B 模/B 型/E ,/S 然/B 後/B 再/E 預/B 測/E ……
看到不,用LSTM,總體的預測accuracy是不錯indeed, 可是會出現上述的錯誤:在B以後再來一個B。這個錯誤在CRF中是不存在的,由於CRF的特徵函數的存在就是爲了對given序列觀察學習各類特徵(n-gram,窗口),這些特徵就是在限定窗口size下的各類詞之間的關係。而後通常都會學到這樣的一條規律(特徵):B後面接E,不會出現E。這個限定特徵會使得CRF的預測結果不出現上述例子的錯誤。固然了,CRF還能學到更多的限定特徵,那越多越好啊!
好了,那就把CRF接到LSTM上面,把LSTM在timestep上把每個hiddenstate的tensor輸入給CRF,讓LSTM負責在CRF的特徵限定下,依照新的loss function,學習出一套新的非線性變換空間。
最後,不用說,結果還真是好多了呢。
BiLSTM+CRF codes, here. Go just take it.
這個代碼比較早,CRF層中的transition matrix以及score的計算都是python from scratch. 目前tf 1.4早已將crf加入contrib中,4行代碼便可實現LSTM拼接CRF的效果。
3. CRF in TensorFlow V.S. CRF in discrete toolkit
發現有的同窗仍是對general 實現的CRF工具包代碼,與CRF拼接在LSTM網絡以後的代碼具體實現(如在TensorFlow),理解的稀裏糊塗的,因此還得要再次稍做澄清。
在CRF相關的工具包裏,CRF的具體實現是採用上述理論提到的爲特徵打分的方式統計出來的。統計的特徵分數做爲每一個token對應的tag的類別的分數,輸入給CRF解碼便可。
而在TensorFlow中,LSTM每一個節點的隱含表徵vector:Hi的值做爲CRF層對應的每一個節點的統計分數,再計算每一個序列(句子)的總體得分score,做爲損失目標,最後inference階段讓viterbi對每一個序列的transition matrix去解碼,搜出一條最優路徑。
關鍵區別在於,在LSTM+CRF中,CRF的特徵分數直接來源於LSTM傳上來的Hi的值;而在general CRF中,分數是統計來的。全部致使有的同窗認爲LSTM+CRF中其實並無實際意義的CRF。其實按剛纔說的,Hi自己當作特徵分數造成transition matrix再讓viterbi進行路徑搜索,這整個其實就是CRF的意義了。因此LSTM+CRF中的CRF沒毛病。
1. 整體對比
應該看到了熟悉的圖了,如今看這個圖的話,應該能夠很清楚地get到他所表達的含義了。這張圖的內容正是按照生成式&判別式來區分的,NB在sequence建模下拓展到了HMM;LR在sequence建模下拓展到了CRF。
2. HMM vs. MEMM vs. CRF
將三者放在一塊作一個總結:
3. Machine Learning models vs. Sequential models
爲了一次將機率圖模型理解的深入到位,咱們須要再串一串,更深度與原有的知識體系融合起來。
機器學習模型,按照學習的範式或方法,以及加上本身的理解,給常見的部分的他們整理分了分類(主流上,都喜歡從訓練樣本的歧義型分,固然也能夠從其餘角度來):
1、監督:{
1.1 分類算法(線性和非線性):{
感知機
KNN
機率{
樸素貝葉斯(NB)
Logistic Regression(LR)
最大熵MEM(與LR同屬於對數線性分類模型)
}
支持向量機(SVM)
決策樹(ID三、CART、C4.5)
assembly learning{
Boosting{
Gradient Boosting{
GBDT
xgboost(傳統GBDT以CART做爲基分類器,xgboost還支持線性分類器,這個時候xgboost至關於帶L1和L2正則化項的邏輯斯蒂迴歸(分類問題)或者線性迴歸(迴歸問題);xgboost是Gradient Boosting的一種高效系統實現,並非一種單一算法。)
}
AdaBoost
}
Bagging{
隨機森林
}
Stacking
}
……
}
1.2 機率圖模型:{
HMM
MEMM(最大熵馬爾科夫)
CRF
……
}
1.3 迴歸預測:{
線性迴歸
樹迴歸
Ridge嶺迴歸
Lasso迴歸
……
}
……
}
2、非監督:{
2.1 聚類:{
1. 基礎聚類
K—mean
二分k-mean
K中值聚類
GMM聚類
2. 層次聚類
3. 密度聚類
4. 譜聚類()
}
2.2 主題模型:{
pLSA
LDA隱含狄利克雷分析
}
2.3 關聯分析:{
Apriori算法
FP-growth算法
}
2.4 降維:{
PCA算法
SVD算法
LDA線性判別分析
LLE局部線性嵌入
}
2.5 異常檢測:
……
}
3、半監督學習
4、遷移學習
(注意到,沒有把神經網絡體系加進來。由於NNs的範式很靈活,不太適用這套分法,largely, off this framework)
Generally speaking,機器學習模型,尤爲是有監督學習,通常是爲一條sample預測出一個label,做爲預測結果。 但與典型常見的機器學習模型不太同樣,序列模型(機率圖模型)是試圖爲一條sample裏面的每一個基本元數據分別預測出一個label。這一點,每每是beginner伊始難以理解的。
具體的實現手段差別,就是:ML models經過直接預測得出label;Sequential models是給每一個token預測得出label還沒完,還得將他們每一個token對應的labels進行組合,具體的話,用viterbi來挑選最好的那個組合。
有了這道開胃菜,接下來,讀者能夠完成這些事情:完善細節算法、閱讀原著相關論文達到完全理解、理解相關拓展概念、理論創新……
hope those hlpe!
歡迎留言!
有錯誤之處請多多指正,謝謝!
《統計學習方法》,李航
《統計天然語言處理》,宗成慶
《 An Introduction to Conditional Random Fields for Relational Learning》, Charles Sutton, Andrew McCallum
《Log-Linear Models, MEMMs, and CRFs》,ichael Collins
如何用簡單易懂的例子解釋條件隨機場(CRF)模型?它和HMM有什麼區別?
【中文分詞】最大熵馬爾可夫模型MEMM - Treant - 博客園
【中文分詞】最大熵馬爾可夫模型MEMM - Treant - 博客園