去年最受矚目的科技詞彙莫過於「人工智能」了,而前一段時間神祕旗手Master的連勝事件再一次把「人工智能」這個話題推到了普通大衆面前。可是,做爲一名技術人員,天然不能和普通人同樣只是看個熱鬧,我和你同樣,對於這項技術背後的運做原理深感興趣。html
當前人工智能的核心技術是深度學習。而深度學習到底爲何能在現實世界中起做用?爲何給它一堆數據它就能從中學到「知識」?它背後有沒有堅實的數學基礎甚至哲學基礎?這些問題我都很想知道答案。所以,我最近花了很多精力來研究,發現這項技術原來與信息論、機率和統計學,都有着密不可分的關係,不少看似散亂的概念其實相互之間都有關聯。git
在這篇文章中,我會嘗試將這些相關的數學原理和概念進行總結,在必要時也會深刻到一些細節,但更側重原理性的描述,但願沒有相關基礎的讀者也能讀懂大部份內容。程序員
咱們在日常常常聽到一些概念,好比:人工智能、機器學習、神經網絡、深度學習。爲了後面描述清晰,咱們先用一張圖來表達這幾個概念之間的包含關係:github
其中神經網絡和深度學習這兩個概念之間的關係,不一樣的人有不一樣的見解。有些人認爲神經網絡包含深度學習,深度學習就等同於多層的神經網絡;另外一些人則認爲這兩個概念是交叉關係。咱們不在這裏糾結這兩個概念,可暫且按前一種見解來理解,這不影響下文的討論。編程
注:若是你想對神經網絡和深度學習有更直觀詳盡的瞭解,請先參見個人另外一篇文章:你須要瞭解深度學習和神經網絡這項技術嗎?c#
下文描述的一些數學原理,對於機器學習和深度學習大部分狀況下都是適用的。網絡
咱們在讀大學本科時通常都學過幾率論,知道隨機現象能夠用機率來表示。但我心裏深處卻對於與隨機性相關的概念一直有一些疑問:隨機現象究竟是事物本質上的隨機,仍是因爲咱們對系統缺乏足夠的信息而形成的表面現象?機器學習
好比說,向空中拋一枚硬幣觀察正面仍是反面,咱們通常認爲是一個隨機現象,用機率的語言來表述就是,咱們觀察到正面或反面的機率都是1/2。可是,若是咱們能對每一次拋硬幣出手的位置、速度、加速度、周圍的空氣密度以及風速等影響因素都能精確瞭解的話,那麼咱們就能根據物理定律對硬幣出手後每一時刻的運行狀態進行精確地計算,這樣硬幣落地時是正面仍是反面就是個肯定性事件,而不是隨機事件了。所以,咱們是否是能夠說,拋硬幣帶來的隨機性,只不過是因爲咱們對硬幣的信息瞭解不夠而形成的表面上的隨機呢?函數
再舉一個程序員常常碰到的例子。好比,咱們的計算機是產生不了真正的隨機數的,咱們日常調用的隨機數函數所產生的只不過是個「僞隨機數」。若是咱們指定了隨機的種子(seed),那麼隨機函數輸出的整個序列都是肯定的。有時候,僞隨機數所暗含的這種「肯定性」的特性,甚至能夠被用來實現某些應用特性(特別是在遊戲實現中)。post
這有點像是哲學中決定論的論調。那麼世界上到底有沒有絕對的隨機現象呢?若是任何隨機現象均可以用更精確的肯定性模型來描述,那麼咱們還須要機率論這一學科嗎?《Deep Learning》[1]這本書的做者指出,機器學習常常須要處理兩類數量性質:隨機性(Stochasticity)和不肯定性(Uncertainty),而它們都須要用機率進行描述。書中還總結了隨機性和不肯定性的三種來源:
可見,除了事物內在的隨機性以外,即便咱們只是本着簡單實用的原則,用機率的觀點來看世界也是一種「方便」的方式。
然而,咱們日常在編程當中,每個邏輯分支都是嚴密的、肯定的。也正由於如此,傳統的編程方式就對解決那些帶有不肯定性的、「模糊的」問題不太適用。在一些典型的機器學習任務中,好比圖像識別,即便圖像模糊一些,模型也應該可以識別正確;再好比語音識別,即便有些噪音,也不該該影響模型的判斷。傳統的編程方式無法完成這種模糊條件的判斷,它只能給出非對即錯的結果,並且輸入的微小變更就會形成結果的劇烈變更。
因此,神經網絡和深度學習的模型創建在機率和統計學之上,也就是瓜熟蒂落的了。
在深度學習領域,咱們解決問題的思路再也不是直接針對問題自己進行編程,而是先設計一個能自我學習的神經網絡,而後把大量的數據輸入到這個網絡中去,這個過程稱爲訓練。在訓練過程當中,這個神經網絡可以從數據集(dataset)中學習到數據的內在結構和規律,從而最終有能力對原問題中新出現的數據給出預測的解。這篇文章《你須要瞭解深度學習和神經網絡這項技術嗎?》就給出了對於手寫體數字圖片進行識別這樣的一個具體的例子。
從統計學的觀點來看,神經網絡用來訓練的數據集(dataset)至關於樣本,而學習過程至關於對整體信息進行估計(屬於統計推斷問題)。
對於無監督學習(unsupervised learning)來講,每個輸入樣本是一個向量:x={x1, x2, ..., xn}T,學習過程至關於要估計出整體的機率分佈p(x)。而對於監督學習(supervised learning)來講,每個輸入樣本x還對應一個指望的輸出值y,稱爲label或target,那麼學習的過程至關於要估計出整體的條件機率分佈p(y | x)。這樣,當系統遇到一個新的樣本x的時候,它就能對應地給出預測值y。
下面咱們以監督學習爲例,把學習過程看做是統計推斷中的最大似然估計( Maximum Likelihood Estimation)[2]問題來進行討論。
假設:
那麼,似然函數能夠記爲pmodel(Y | X;θ),而機器學習的目標能夠描述爲計算參數θ的最大似然估計θML:
上面的公式中之因此乘法能改爲加法,是由於增長了一個對數運算,這樣並不影響使似然函數最大化的參數θ的選取。
通常來講,上面公式的右邊還能夠針對樣本數量m求平均值,最大似然估計的公式改寫爲:
在深度學習領域,咱們通常不是經過使似然函數最大化來估計參數θ,而是經過定義一個Cost Function來使它最小化的方式進行。所以,上面公式右邊部分加上一個負號就能做爲Cost Function。因爲它的形式是取對數的負數,所以這種形式被稱爲negative log-likelihood,簡稱NLL。以下:
後面咱們能夠看到,深度學習相關的Cost Function基本均可以使用NLL推導獲得。
前面咱們從統計學的觀點分析了機器學習的目標本質,獲得了最大似然估計和NLL的形式。它們爲機器學習的模型設計和Cost Function的肯定提供了理論依據。而信息論則提供了另一個視角。
信息論由Claude Elwood Shannon在1948年所創立,它提供了一種將信息進行量化的手段。根據這門理論咱們能夠獲得信息的最優編碼長度。
這裏咱們首先借用一下"Visual Information Theory[3]"這篇blog所給出的一個具體例子來講明幾個概念。
假設如今咱們要對一份詞彙表進行二進制編碼。爲了簡單起見,這份詞彙表只包含4個單詞,它們分別是:
顯然,每一個單詞只須要用2個bit進行編碼。下面是一個編碼的例子:
如今假設有一位叫Bob的同窗,他使用這份詞彙表的時候每一個單詞出現的頻率並非均等的。再假設他比較喜歡狗,所以使用dog這個單詞的頻率比較高。Bob對於每一個單詞的使用頻率(至關於單詞出現的機率分佈)以下:
那麼,這時2bit的定長編碼就不是最優的了。看起來,咱們應該對出現機率高的單詞采用較短的編碼,而對於出現機率低的單詞采用較長的編碼,這樣就獲得了以下的一種變長編碼:
此次,咱們計算一下平均編碼長度爲:1 1/2 + 2 1/4 + 3 1/8 + 3 1/8 = 1.75bit,少於2bit。
咱們能夠用信息論中的概念來解釋一下這裏的編碼問題。首先,第一個概念,是自信息量(self-information[4]):
I(x) = log (1/p(x)) = -log p(x)
它代表了一個隨機事件中所包含的信息量的多少。其中p(x)表示事件x的出現機率。由這個定義能夠看出,某事件發生的機率越低,那麼這個事件真正發生時它所攜帶的信息量越大。在極端狀況下,若是一個事件百分之百發生,即p(x)=1,那麼這個事件的信息量爲0;而一個小几率事件一旦發生,那麼它的信息量是巨大的。
在I(x)的定義中,log對數操做既能夠以2爲底,也能夠以e爲底,但它們沒有本質區別,只差一個固定的倍數。當討論信息編碼的時候,採用以2爲底比較方便,這時候I(x)的單位是bit;而討論機器學習的時候,以e爲底比較方便。
在前面單詞編碼的例子中,"dog"一詞出現的機率爲1/2,所以它的自信息量爲:
I = -log2 (1/2) = 1bit
說明正好用1bit來編碼。一樣計算能夠獲得,「cat」, "fish", "bird"三個單詞的自信息量分別爲2bit, 3bit, 3bit。在前面給出的變長編碼中,各個單詞所使用的二進制編碼長度正好等於各自的自信息量的值。
若是I(x)量化了單個事件的信息量,那麼計算整個分佈p(x)的平均信息量(機率均值),就獲得了信息熵(Entropy)[5])的概念:
H(p) = Ex~p[I(x)] = -Ex~p[log p(x)] = -∑x p(x)*log(p(x))
H(p)能夠解釋爲:機率分佈p(x)所包含的平均信息量。那麼,若是對p(x)的各個可能的隨機事件進行二進制編碼,那麼平均至少也須要這麼多個bit。實際上,針對前面的詞彙表中各個單詞的機率分佈,計算H(p)的值剛好也是1.75bit,所以前面給出的這種變長編碼就是最優的一種編碼了,再也找不到另一種編碼可讓平均編碼長度比信息熵還小。
如今假設又有一位叫Alice的同窗,她也使用這份只有4個單詞的詞彙表,可是她不太喜歡狗,而是比較喜歡貓,所以她使用cat這個單詞的頻率比較高。Alice對於每一個單詞的使用頻率以下圖中的右圖所示:
若是Alice也採用前面給出的變長編碼,那麼她使用這同一份詞彙表的平均編碼的長度爲:1 1/8 + 2 1/2 + 3 1/4 + 3 1/8 = 2.25bit。
信息論中有一個概念,叫作Cross-Entropy[6],正是表達了相似的含義。它的定義公式以下:
H(q,p) = -Ex~q[log p(x)] = -∑x q(x)*log(p(x))
H(q,p)能夠理解爲:對於符合機率分佈q(x)的詞彙表使用p(x)對應的最優編碼時所獲得的平均編碼長度。固然,這時對於q(x)來說就確定算不上最優編碼了。
若是運用前面Entropy的概念,能夠算得Alice的最優編碼的平均長度爲:
H(q) = -∑x q(x)log(q(x)) = -1/8 log(1/8) - 1/2 log(1/2) - 1/4 log(1/4) - 1/8 * log(1/8) = 1.75bit。
Cross-Entropy與Entropy的差,定義了另一個概念,叫作Kullback-Leibler (KL) divergence[7]。
DKL(q||p) = H(q,p) - H(q) = -Ex~q[log p(x)] + Ex~q[log q(x)]
它表示符合機率分佈q(x)的詞彙表,若是使用p(x)對應的最優編碼,那麼比q(x)自身對應的最優編碼在平均編碼長度上要多出多少。從更抽象的意義上來說,KL divergence量化了從一個機率分佈到另外一個機率分佈之間的距離。
具體到Bob和Alice的例子中,p(x)和q(x)分別是Bob和Alice的單詞使用機率分佈,那麼,DKL(q||p)就表示Alice使用Bob的編碼比她使用本身的最優編碼平均要多用幾個bit。這個具體的值能夠計算出來:
DKL(q||p) = H(q,p) - H(q) = 2.25bit - 1.75bit = 0.5bit
回到機器學習的場景當中,KL divergence剛好能夠用來表示咱們定義的模型和樣本數據之間的差距。即:
DKL(p'data||pmodel) = -Ex~p'data[log pmodel(y|x;θ)] + Ex~p'data[log p'data]
注意,上面式子中pmodel(y|x;θ)是一個機率分佈族,也就是咱們定義的模型。而p'data是由樣本獲得的經驗分佈(empirical distribution),它與待求的真正的數據分佈pdata還有所不一樣,二者之間的差別由樣本數據集的大小和質量決定。若是暫且不論樣本的質量,機器學習的目標就能夠歸結爲將pmodel(y|x;θ)和p'data之間的差別減少,也就是使DKL(p'data||pmodel)最小化。而這個最小化的過程,其實就是經過修改參數θ不斷優化pmodel(y|x;θ)的過程。
仔細觀察上面DKL(p'data||pmodel)的定義,能夠看出,對於固定的樣本數據來講,第二項是固定的,而只有第一項才包含參數θ,所以上述第二項在將KL divergence最小化的過程當中不起做用。
所以,將KL divergence最小化,就至關於將上面式子中的第一項(也就是Cross-Entropy)最小化。這個Cross-Entropy的值記爲:
H(p'data, pmodel) = -Ex~p'data[log pmodel(y|x;θ)]
再對比上一節計算獲得的NLL(θ)的值:
能夠看出,Cross-Entropy正好等同於NLL,即:
H(p'data, pmodel) = NLL(θ)
如今,通過了前面結合統計學和信息論的分析,咱們能夠得出結論:在指導機器學習的優化目標上,如下四種方式是等價的:
這裏還須要着重指出的一點是:Cross-Entropy是一個很容易讓人迷惑的概念。不少機器學習或深度學習的教程上都把Cross-Entropy當成了一種特定的Cost Function,這其中也包括著名的Michael Nielsen的《Neural Networks and Deep Learning》一書[8]。但根據上面的分析,Cross-Entropy其實應該是一個更基礎的信息論的概念,它指導咱們在不一樣的狀況下推導出不一樣的Cost Function。咱們不該該把Cross-Entropy當作一種特定的Cost Function來對待,這樣不利於知識的融會貫通。
統計學有兩個流派:頻率學派和貝葉斯學派。兩個學派有不少不一樣點,好比:
在針對機器學習進行統計推斷時,前面在經典統計學中的模型p(x ; θ)被看作是包含了未知參數θ的一個機率分佈族。而在貝葉斯推斷中未知參數θ被看作是隨機變量,所以,模型能夠寫爲條件分佈的形式:p(x | θ)。
貝葉斯統計是要先計算出後驗分佈,即:
p(θ | x) = p(x | θ) * p(θ) / p(x)
兩邊求對數:
log p(θ | x) = log p(x | θ) + log p(θ) - log p(x)
按照最大後驗估計(Maximum A Posteriori Estimation, MAP)的思路,上面式子最後一項與θ無關,能夠忽略掉。第一項至關於經典統計學中的最大似然估計,而第二項log p(θ)是一個先驗分佈。這個先驗分佈容許對學習過程施加一些人爲的經驗的影響,這些經驗不依賴於訓練數據。在某些狀況下,這個先驗分佈能夠當作是Regularization的一種形式。
這一小節會涉及神經網絡的一些技術細節,若是你不想太過於深刻細節,本節內容能夠跳過。
神經網絡的輸出層與模型pmodel分佈的選擇緊密相關,而pmodel肯定以後,Cost Function也隨之基本肯定了,所以,Cost Function與神經網絡的輸出層之間緊密相關。
咱們先把日常常常碰到的一些Cost Function的形式羅列一下,而後挨個看一下它們是否能由前面的最大似然估計來獲得。
第一種,比較經典的,稱爲mean squared error,簡稱MSE:
其中,a表示網絡的實際輸出值,而y(x)是輸入爲x的時候,指望的輸出值,即label。y(x)是one-hot code vector的形式,表示一個0和1組成的向量,其中只有1位爲1。
第二種,廣泛被稱爲Cross-Entropy Cost Function。前面咱們已經提到過,這個概念與信息論裏的Cross-Entropy的概念有所衝突。它的定義形式以下:
第三種,稱爲log-likelihood:
注意上面log-likelihood的表達式只是針對單個輸入樣本x的形式,最終計算的時候還應該針對x求均值。它的意思是:當網絡的輸出層(即第L層)的第y個輸出是指望的輸出(即爲1)時,Cost Function是上面公式所描述的形式。
上面第二和第三種Cost Function,在Michael Nielsen的《Neural Networks and Deep Learning》[8]一書的第三章都有說起過。
實際上,仔細計算的話,上面三種Cost Function的形式,均可以從最大似然估計得來,或者等價地從NLL、KL divergence或Cross-Entropy得來。
這裏面有一些細節值得注意,好比[12]這篇文章基於信息論的Cross-Entropy概念給出了這樣一種Cost Function:
首先,這個式子也只是針對單個輸入樣本x的形式。在這個式子中,y'是網絡指望的輸出值,即label,並且是one-hot code vector的形式。所以,上面這個式子其實和log-likelihood是同樣的。但若是y'不是one-hot code vector的形式了,那麼它在某些場景應該仍是能這樣計算的,只要還是輸出一個Multinoulli分佈。好比,《Deep Learning》[1]一書的第7章提到的label smoothing機制,在這種狀況下,仍然能夠利用上面這個式子計算Cross-Entropy。但要注意,這時就不是像本文前面章節所講的是最小化p'data和pmodel之間的Cross-Entropy,而是在固定一個輸入樣本的前提下,最小化由多個輸出單元組成的實際輸出和指望輸出之間的Cross-Entropy了。
在實際中,由最大似然估計得來的Cost Function,一般帶有NLL的形式(包含對數),所以它在不少狀況下剛好能夠與輸出單元激活函數(activation function)中的指數形式抵消,從而避免網絡單元達到saturation的狀態。
本文以統計學和信息論的視角總結了機器學習和深度學習與各學科之間的關係,並說明了它們如何指導優化的目標。
在討論的過程當中,咱們會發現,若是將機器學習和深度學習比做一座宏偉的大廈的話,統計學和信息論基礎只是這個大廈的基座。並且這個基礎可能還存在一些薄弱的地方,好比說:
因此,構建一個自底層到上層所有堅實的理論大廈,仍然任重而道遠。
(完)
其它精選文章: