why-what-how方式的機器學習總結之三
取樣方法
why
取樣方法最常用的場景是用來求一些不好計算原函式的積分,或者求一些分佈的期望值,關鍵詞蒙特卡洛積分。
比如上面這張圖,正方形的面積很容易知道,計算綠點佔所有采樣點的比例乘以正方形面積就可以得到f(x)曲線下方的面積也就是f(x)從a到b的定積分。
還可以從期望的角度來看取樣法,假設g(x)不好求積分,令
把g∗(Xi)看成新的獨立同分布的隨機變數,其密度函式是fx(x),所以可以得到期望,
再由大數定理期望等於均值,
所以只需要按照分佈fx(x)大量取樣求均值就可以得到g(x)的積分。
這個地方fx(x)是我們自己變換出來的,所以可以隨意選擇,我們可以選擇成在區間[a,b]上的均勻分佈,那麼剩下的就容易解決了。詳細可看 蒙特卡洛(Monte Carlo)法求定積分
如果要求一個分佈的期望,可能就需要直接對目標分佈進行取樣,而這是一個難點,所以會有很多采樣的方法,比如逆取樣,接受-拒絕取樣,重要性取樣,MCMC取樣以及吉布斯取樣等等。
what
1.逆取樣(Inverse Sampling)
逆取樣是想通過均勻分佈變換目標分佈的取樣,如下圖
(1)如左圖縱座標,從 Uniform(0,1) 中隨機生成一個值用 u 表示。
(2)計算 的值 x,則 x 就是從 f(x) 中得出的一個取樣點。這個過程就是上圖中紅線表示的,F(x)是累積分佈函式CDF。
更多細節參考 逆取樣(Inverse Sampling)和拒絕取樣(Reject Sampling)原理詳解 ,數學原理可以參考維基百科,這裡不展開了,逆取樣需要能求CDF的反函式,有時候會很困難。
2.接受-拒絕取樣
如上圖,紅色的p(x)可能取樣太困難,我們找一個比較好取樣的函式q(x),並且讓kq(x)的曲線能包住p(x)。取樣過程,
(1)x 軸方向:從 q(x) 分佈抽樣得到 a。
(2)y 軸方向:從均勻分佈(0, kq(a)) 中抽樣得到 u。
(3)如果剛好落到灰色區域: u > p(a), 拒絕, 否則接受這次抽樣。
(4)重複以上過程。
在高維的情況下,Rejection Sampling 會出現兩個問題,第一是合適的 q 分佈比較難以找到,第二是很難確定一個合理的 k 值。這兩個問題會導致拒絕率很高,無用計算增加。
3.重要性抽樣(Importance sampling)
和接受-拒絕取樣類似,也是通過較容易取樣的分佈來解決問題。
如上圖對p(z)做了簡單的變換,取樣的目標分佈是q(z),可以吧p(z)/q(z)看成一個樣本點的重要性。
這種方法的問題是在高維空間裡找到一個這樣合適的 q 非常難。更詳細的可以看 隨機取樣方法整理與講解(MCMC、Gibbs Sampling等)
4.MCMC(Markov Chain Monte Carlo)
MCMC取樣的基本原理馬爾科夫鏈和馬爾科夫穩態的基本原理可以看 隨機取樣方法整理與講解(MCMC、Gibbs Sampling等) ,這裡只整理一下基本邏輯。
(1)樣本按照某個轉移矩陣P不斷進行轉移跳轉,最終一定會到達一個馬爾科夫穩態再進行跳轉也不會發生變化,要求這個轉移矩陣P的任意兩個狀態都是連通的。
(2)馬爾科夫穩態有一個特點是滿足細緻平穩條件,一般的轉移矩陣是不太會滿足這個條件的,所以我們想把一個一般的轉移矩陣P改造得滿足細緻平穩條件。
(3)改造的方法是按照對稱性製造一個接受矩陣,按一定的接受率接受跳轉。
(4)實際工作方式按個人理解是取樣的過程是先初始化n個取樣點,然後對每個取樣點做馬爾科夫跳轉,這個跳轉是指轉移到其它的狀態,而這個跳轉概率在我們要求的轉移矩陣裡面,直到最後不再跳轉為止,跳轉的方法由細緻平穩條件推出的那個跳轉公式來決定。
(5)上面的方法存在一個問題是可能會拒絕大量的跳轉導致收斂太慢,所以MH方法來優化這個過程。MH方法只是放大了接收率。
(6)實際應用中高維資料很常見,高維下如果固定一個維度做跳轉是能滿足細緻平穩條件的,所以就有了輪換固定維度跳轉的Gibbs Sampling,應用非常廣泛。
主題模型
why
我們希望機器學習能幫我們自動理解一篇文章,最簡單的觀點是把文章看成一組單詞的無序組合,這個就是詞袋模型(BOW)。但是BOW實在太簡單,稀疏生僻詞,一詞多義,同義詞等等問題都無法描述,所以我們在詞袋模型中引入了主題(Topic)這個概念,認為一篇文章在描述多個主題,每個主題又包含多個單詞。
主題模型這裡主要記錄一下,LSA,PLSA和LDA。之前我認為可以用主題模型搞定評價的標籤詞分析的,後來發現不合適,評價這樣的每篇文件都太短,而且標籤詞實際上是短語。
what
1.LSA(潛在語義分析)
LSA的工作方式是對Term-Document矩陣做SVD分解,詳細可參考 LSA,pLSA原理及其程式碼實現 ,感覺還是比較簡單粗暴,有不少問題,比如一詞多義就無法解決。
2.PLSA(概率潛在語義分析)
和LSA不同,PLSA是一種概率模型。PLSA是這樣看一篇文章的生成過程的,首先找k個主題,然後對於每個主題按照主題-詞語的概率隨機生成多個詞語,所有這些詞語組成文章。
可以看到PLSA並沒有考慮詞語的順序以及位置等關係,所以還是詞袋模型。這個模型裡面doc-topic是隨機選擇的而topic-word是個多項分佈也是我們需要求解的。
每個詞語的生成概率是,
對於第m篇文件的n個詞語的生成概率是,
有了文件的概率就可以寫出最大似然函式然後用EM方法求解了,詳細的可參考 LDA數學八卦
3.LDA(Latent Dirichlet Allocation)
PLSA是屬於頻率學派的模型而LDA是屬於貝葉斯學派的模型。在PLSA裡面文件對應的主題θ,主題對應單詞φ都是模型的引數,這些引數都是有確定的值我們求解這些值就可以了。在LDA裡面θ和φ都是概率分佈,那它們的概率分佈是什麼呢?由於在PLSA裡面θ和φ都是多項分佈的引數,所以對應到貝葉斯模型在LDA裡面 θ和φ 的先驗分佈就可以選多項分佈的共軛分佈Drichlet分佈。
LDA一篇文件生成過程大致如下,
(1)通過Drichlet分佈(引數α)生成doc-topic多項分佈的引數θ。
(2)接下來生成一個詞,先用多項分佈(θ)生成一個topic編號z。
(3)通過Drichlet分佈(引數β)生成k個topic-word多項分佈的引數φ1...φk。
(4)挑選出引數φz,然後用多項分佈(φz)生成一個詞。
(5)重複步驟2和4生成n個詞,注意步驟3不用重複做。
(6)生成新的文件的時候需要重做步驟1。
這整個過程中有M+K個獨立的Dirichlet-Multinomial共軛結構,其中M對應M篇文件,K對應所有M篇文件相關的K個topic。模型的圖解如下。
M篇文件中topics的生成概率是
M篇文件中詞的生成概率是
聯合概率是
有了聯合概率就可以用EM法來求解了,不過解起來相當複雜還需要用到變分法,另一種方法就是用吉布斯取樣來解。吉布斯取樣的目標是估算模型中的引數φ1...φk和θ1...θm,注意不是α,β,它們是先驗引數可以預先指定。
取樣的過程如下,
(1)隨機初始化,對語料中每篇文件中的每個詞隨機賦予一個topic編號z。
(2)重新掃描整個語料庫,按吉布斯取樣公式重新計算topic並在語料庫中更新。
(3)重複上面的過程直到收斂。
(4)統計語料庫中topic-word共現頻率矩陣,就可以得到我們需要估算的引數。
如果來了一篇新文件需要我們分析對應的topic,那我們只需要求引數θ,同樣可以用吉布斯取樣過程直到收斂,然後統計文件中的topic分佈就能得到θ。
最後剩下的是吉布斯取樣公式,就只記錄結果了,詳細推導過程可以看 LDA數學八卦
神經網路和深度學習
why
神經網路要解決的問題和一些基礎的機器學習方法相同,也主要是分類問題和迴歸問題。不同的地方是像邏輯迴歸,樸素貝葉斯這些本質上來說都是線性模型,而n維線性模型的vc維是n+1也就是說要增加模型的容量只能增加維度。而神經網路尤其是深度神經網路是非線性的,神經網路的vc維是每一層的節點數(維度)的乘積,所以增加神經網路的深度可以很輕易的獲得非常高的模型容量,這也是深度學習很火的重要原因。
what
1.神經元是組成神經網路的基本單位,如下圖(來自 神經網路--反向傳播詳細推導過程 )
這個神經元是以x1,x2,x3以及b=1作為輸入的運算單元,其輸出是
其中f被稱作啟用函式,比如可以用sigmoid函式作為啟用函式,當使用sigmoid的時候這個神經元實際上是在做邏輯迴歸。啟用函式還有其他的選擇,詳細可參考《深度學習》,6.3節。
2.多個神經元聯接起來就可以組成神經網路,
上圖中的輸出是單個值,輸出也可以是多個值組成一個向量。
3.前向傳播,就是通過輸入得到輸出以及網路中任意一個節點值的過程,比如上圖中的神經網路就可以這樣計算,
4.反向傳播(詳細可看 深度學習:神經網路中的前向傳播和反向傳播演算法推導 ),是指在訓練的時候把訓練誤差反饋到神經網路的權值引數矩陣的過程。比如下面的網路,
每個權重對誤差的影響可以通過下圖直觀的看到,主要也就是一個鏈式求偏導數的過程,
how
1.神經網路這個牛逼的名字是怎麼來的?可以看看這篇科普 神經網路淺講:從神經元到深度學習 ,神經網路的神經元確實有點模仿人腦神經元的結構,輸入可以類比為神經元的樹突,而輸出可以類比為神經元的軸突,計算則可以類比為細胞核。還有一點仿生的地方在啟用函式,啟用函式也像人腦神經元一樣達到某個臨界狀態後就一直處於工作狀態,否則就一直是休眠狀態。再有就是神經網路的反向傳播機制也和人腦的反饋機制比較相似。
2.為什麼有啟用函式?除了仿生之外啟用函式在神經網路中的功能即通過對加權的輸入進行非線性組合產生非線性決策邊界。
3.神經網路牛逼的理論依據?萬能近似定理(universal approximation theorem)(Hornik et al., 1989;Cybenko, 1989) 表明,一個前饋神經網路如果具有線性輸出層和至少一層具有任何一種‘‘擠壓’’ 性質的啟用函式(例如logistic sigmoid啟用函式)的隱藏層,只要給予網路足夠數量的隱藏單元,它可以以任意的精度來近似任何從一個有限維空間到另一個有限維空間的Borel 可測函式。詳細可見《深度學習》6.4.1節。
4.為啥需要深度神經網路?這個用vc維可以解釋,如果用淺層的神經網路描述精度要求非常高的函式可能需要的隱藏單元的數量是指數級,深度神經網路可以把指數化簡到深度。
5.深度學習僅僅就是深度神經網路麼?答案當然是no,深度學習有三個核心概念,多層組合,端到端學習以及分散式表示,參考 深度學習究竟是個啥? 。多層組合比較好理解,神經網路就是一種多層組合。端到端學習是指不用做特徵工程,由演算法自動學習資料中的特徵,卷積神經網路就是一個典型的例子,只用給原始的影象二進位制資料和最後需要的分類結果就可以了。而分散式表示則需要重點說一下。
6.分散式表示,比如“你有一輛大的藍色福特汽車”用分散式表示就是尺寸+顏色+品牌,我個人的理解就是一種正交的本質的表示方式。因為深度學習可以用函式複合的方式來實現分散式表示,我突然想到函數語言程式設計也是這麼個玩法,函數語言程式設計也是能做到高度的抽象能提煉出系統本質的東西,主要的區別是函數語言程式設計是靠人去建立這種分散式表示吧。
7.那怎麼學習到分散式表示呢?《深度學習》 裡面說k-means,決策樹,高斯混合模型等等都不是基於分散式表示的學習演算法。有一種里程碑式的學習演算法叫無監督預訓練,簡單的說就是多層訓練,每一層用自編碼器或者受限玻爾茲曼機自動抽取特徵,然後把上一層的輸出作為下一層的輸入。具體可以看《深度學習》15.1節以及 淺談深度學習分散式表示以及不同結構
卷積神經網路(CNN)
關於CNN,這篇吳恩達的課程筆記 第四門課 卷積神經網路 ,寫得非常清楚詳細,我簡單的做一下摘要幫助快速索引。
why
CNN最典型的應用是影象識別,比如圖片分類判斷一張圖片是不是貓。那為什麼不用普通的深度神經網路來做呢?這就要提到CNN的三個重要特點引數共享,稀疏連線和等變標識。
1.引數共享是說CNN會用一個過濾器處理影象中所有的部分,比如下圖中的3×3的過濾器檢測垂直邊緣。
2.稀疏連線如下圖,綠圈這個0是通過3×3的卷積計算得到的,它只依賴於這個3×3的輸入的單元格,右邊這個輸出單元(元素0)僅與36個輸入特徵中9個相連線,紅圈這個30也是這樣。而且其它畫素值都不會對輸出產生任影響,這就是稀疏連線的概念。這個和普通神經網路對比很鮮明,普通神經網路是全連線的,也就是說下一層中的一個值會和上一層所有的值發生連線。
3.等變表示指的是,影象中某一元素/成分的移動,在上層神經元中也表現為一定的移動。這是由引數共享直接帶來的,因為移動過程中卷積核的引數不變。這種等變表示使得影象的平移不會對分類預測結果產生太大的影響,使得學習演算法能夠對相同內容不同位置的影象較為準確的識別。
what
1.卷積的概念,知乎上一個比較通俗的 解釋 是加權疊加,一個更通俗的理解是以一個固定的速率毆打某人,那他承受的傷害就是一個疊加的過程。稍微數學一點的理解可以看 如何通俗易懂地解釋卷積? 。實際上加權疊加的理解對於CNN就基本夠用了。
2.卷積核,就是指過濾矩陣,比如下圖就是一個用於檢測圖片邊緣的卷積核,卷積核的作用在於特徵提取因為做了加權求和所以突出了一些重點。
3.Padding,因為卷積操作會讓影象變小丟失一些資訊,所以需要在原始影象周圍填充一圈預設值。
4.卷積步長,是指卷積操作一次移動幾個格子,這個比較直觀。
5.池化層,用來縮減模型的大小,提高計算速度,同時提高所提取特徵的魯棒性,也比較直觀,比如下圖是最大池化的例子。
6.Dropout,是正則化的手段的一種為了提高模型的泛化能力,直觀的理解就是以一定的概率關閉某些神經元,如下圖。
舉個小栗子吧,假如有兩個特徵,有一隻耳朵,有尾巴,假如這兩個特徵同時出現的時候,能判定它是一隻貓,當只有有尾巴這個特徵的時候,也能判定它是一隻貓,但只有有一隻耳朵這個特徵的時候,就不能判定它是一隻貓,那神經網路就知道有一隻耳朵這個特徵在分類是否是貓這個問題時,是個冗餘資訊,那分類的時候就不用它了嘛(來自 (CNN)卷積神經網路(四)dropout )。
7.全部放一起的一段程式碼表示,
stride = 1# output is 28x28 Y1 = tf.nn.relu(tf.nn.conv2d(X, W1, strides=[1, stride, stride, 1], padding='SAME') + B1) stride = 2# output is 14x14 Y2 = tf.nn.relu(tf.nn.conv2d(Y1, W2, strides=[1, stride, stride, 1], padding='SAME') + B2) stride = 2# output is 7x7 Y3 = tf.nn.relu(tf.nn.conv2d(Y2, W3, strides=[1, stride, stride, 1], padding='SAME') + B3) # reshape the output from the third convolution for the fully connected layer YY = tf.reshape(Y3, shape=[-1, 7 * 7 * M]) Y4 = tf.nn.relu(tf.matmul(YY, W4) + B4) Ylogits = tf.matmul(Y4, W5) + B5 Y = tf.nn.softmax(Ylogits)
迴圈神經網路(RNN,LSTM)
why
RNN適合處理序列型別的資料,比如,當我們在理解一句話意思時,孤立的理解這句話的每個詞是不夠的,我們需要處理這些詞連線起來的整個序列; 當我們處理視訊的時候,我們也不能只單獨的去分析每一幀,而要分析這些幀連線起來的整個序列。
CNN不太適合處理很長的序列問題,因為CNN擅長的是捕捉區域性的相鄰的特徵,距離較遠的關聯資訊CNN不太適合處理。在迴圈網路中使用的引數共享的前提是相同引數可用於不同時間步的假設,這個關係應該不隨時間去改變。
RNN當序列較長的時候有梯度消失的問題,所以就出現了LSTM。
what
1.RNN可以用下面這張圖來表示,
RNN最關鍵的是在模型中加入了狀態S然後狀態可以隨著時間傳播下來所以有了記憶功能,整體的定義如下
詳細可看 迴圈神經網路(RNN)原理通俗解釋 ,RNN的反向傳播推導可看 迴圈神經網路(RNN)模型與前向反向傳播演算法
2.梯度爆炸和梯度消失(詳細可看 LSTM原理分析 )
上面的式子是誤差傳遞的過程,可以看到後面的連乘項對一個結構反覆相乘,如果這個結構的值大於1就是梯度爆炸,反之就會梯度消失。
3.LSTM的解決方案是原始RNN的隱藏層只有一個狀態,即h,它對於短期的輸入非常敏感。那麼,假如我們再增加一個狀態,即c,讓它來儲存長期的狀態,那麼問題不就解決了麼?如下圖所示:
按照時間維度展開
加上輸入門和遺忘門來控制c的內容就有了這張經典圖