0
本文作者: 楊曉凡 | 2017-09-29 23:59 |
雷鋒網(wǎng) AI 科技評(píng)論按:「Deep Learning」這本書是機(jī)器學(xué)習(xí)領(lǐng)域的重磅書籍,三位作者分別是機(jī)器學(xué)習(xí)界名人、GAN的提出者、谷歌大腦研究科學(xué)家 Ian Goodfellow,神經(jīng)網(wǎng)絡(luò)領(lǐng)域創(chuàng)始三位創(chuàng)始人之一的蒙特利爾大學(xué)教授 Yoshua Bengio(也是 Ian Goodfellow的老師)、同在蒙特利爾大學(xué)的神經(jīng)網(wǎng)絡(luò)與數(shù)據(jù)挖掘教授 Aaron Courville。只看作者陣容就知道這本書肯定能夠從深度學(xué)習(xí)的基礎(chǔ)知識(shí)和原理一直講到最新的方法,而且在技術(shù)的應(yīng)用方面也有許多具體介紹。這本書面向的對(duì)象也不僅是學(xué)習(xí)相關(guān)專業(yè)的高校學(xué)生,還能夠?yàn)檠芯咳藛T和業(yè)界的技術(shù)人員提供穩(wěn)妥的指導(dǎo)意見、提供解決問題的新鮮思路。
面對(duì)著這樣一本內(nèi)容精彩的好書,不管你有沒有入手開始閱讀,雷鋒網(wǎng) AI 研習(xí)社都希望借此給大家提供一個(gè)共同討論、共同提高的機(jī)會(huì)。如果大家有看過之前的分享的話,現(xiàn)在除了王奇文之外,我們還繼續(xù)邀請(qǐng)到了多位機(jī)器學(xué)習(xí)方面優(yōu)秀、熱心的分享人參與這本書的系列分享。這期邀請(qǐng)到的是陳安寧與大家一起分享他對(duì)這本書第四章的讀書感受。
分享人:陳安寧,Jakie,名古屋大學(xué)計(jì)算力學(xué)博士。
「Deep learning」讀書分享(四) —— 第四章 數(shù)值計(jì)算
大家好,我叫陳安寧,目前在名古屋大學(xué)攻讀計(jì)算力學(xué)博士。今天我要和大家分享的是「Deep Learning」這本書的第四章節(jié),Numerical Calculation,即“數(shù)值計(jì)算”。
其實(shí)大家如果翻過這本書的話,可以看出第四章是整本書所有章節(jié)里面篇幅最少的一章。為什么,是因?yàn)槠鋵?shí)我們大部分人在運(yùn)用機(jī)器學(xué)習(xí)或者深度學(xué)習(xí)的時(shí)候是不需要考慮這一章的內(nèi)容的,這章的內(nèi)容更多是針對(duì)算法的數(shù)學(xué)分析,包括誤差的增長以及系統(tǒng)的穩(wěn)定性。
今天分享的主要輪廓包括以下四個(gè)點(diǎn),
第一,在機(jī)器學(xué)習(xí)、包括了深度學(xué)習(xí)中數(shù)值計(jì)算的應(yīng)用。
第二,數(shù)值誤差的問題
第三,簡單的分析機(jī)器學(xué)習(xí)系統(tǒng)的穩(wěn)定性問題
最后,針對(duì)優(yōu)化問題給出了兩種不同的優(yōu)化算法,一種是梯度下降法,一種是限制優(yōu)化算法。
我們首先來看一下機(jī)器學(xué)習(xí)中的數(shù)值計(jì)算問題。所謂的機(jī)器學(xué)習(xí)或者深度學(xué)習(xí),其實(shí)最終的目標(biāo)大部分都是極值優(yōu)化問題,或者是求解線性方程組的問題。這兩個(gè)問題無論哪個(gè),我們現(xiàn)在的求解辦法基本上都是基于計(jì)算機(jī)的反復(fù)迭代更新來求解。因?yàn)槟壳翱隙ㄊ菦]有解析解的,大家都是通過離散數(shù)學(xué)來求解這兩個(gè)問題。
既然這個(gè)過程有迭代或者大量的重復(fù)計(jì)算,那么肯定會(huì)牽扯到數(shù)據(jù)的累積。數(shù)據(jù)累積就極有可能會(huì)有誤差的產(chǎn)生。誤差如果過于大或者過于小,在某些特定的情況下都會(huì)對(duì)系統(tǒng)產(chǎn)生非常致命的影響。
首先我們來看數(shù)值誤差。所謂的數(shù)值誤差是指由于計(jì)算機(jī)系統(tǒng)本身的一些特性產(chǎn)生的誤差,比如說我們知道,無論你使用任何編程語言,它里面都有很多的數(shù)據(jù)類型,包括單精度、雙精度、整形、長整型。那么每一種數(shù)據(jù)當(dāng)你定義以后,它在計(jì)算機(jī)的內(nèi)存里面都是有對(duì)應(yīng)的數(shù)值范圍和精度范圍的。如果在反復(fù)的迭代計(jì)算過程中,你產(chǎn)生的數(shù)據(jù)超過了數(shù)據(jù)類型定義的范圍,計(jì)算機(jī)會(huì)自動(dòng)的進(jìn)行取舍。
這時(shí)就會(huì)產(chǎn)生一個(gè)問題,因?yàn)槿∩峋蛯?dǎo)致了和真實(shí)值之間的變化,這個(gè)變化就極有可能產(chǎn)生很大的麻煩,如果一個(gè)很小的數(shù)出現(xiàn)在了分母上,那么計(jì)算機(jī)在計(jì)算過程中就會(huì)得到一個(gè)非常大的數(shù),如果這個(gè)非常大的數(shù)超過了你所定義的數(shù)據(jù)類型的范圍,計(jì)算機(jī)就會(huì)出現(xiàn)錯(cuò)誤。
我們可以簡單看一下PPT中這個(gè)函數(shù),它叫softmax函數(shù),softmax函數(shù)經(jīng)常會(huì)在概率里面用到。它有很多特性,它的所有元素的softmax之和是等于1的;然后如果所有元素Xi也是相等的話,那么softmax的每一個(gè)元素也是相等的,等于所有n個(gè)元素合的1/n。
我們考慮一些比較特殊的情況,比如X是一個(gè)非常小的一個(gè)量,在指數(shù)函數(shù)中當(dāng)這個(gè)X非常小的時(shí)候,這個(gè)指數(shù)函數(shù)也是非常小,無限趨于零的。無限趨于零的話,假如有限個(gè)值相加,比如n=10的話,十個(gè)數(shù)以后這個(gè)分母也是一個(gè)非常小的值;如果特別小,比如10-10,這個(gè)在計(jì)算機(jī)里面一算的話,softmax就會(huì)產(chǎn)生一個(gè)很大的數(shù),經(jīng)過多次累積的話,產(chǎn)生的這個(gè)大數(shù)極有可能超過你的所定義的數(shù)據(jù)范圍,這個(gè)時(shí)候你的程序就會(huì)報(bào)錯(cuò)。所以我們?cè)谟?jì)算的時(shí)候要避免分母上出現(xiàn)一個(gè)極小的數(shù)的情況。
同理,分子 xi 如果是一個(gè)非常大的數(shù)字的話,它的指數(shù)也是趨向于無窮的,整個(gè)的softmax也是一個(gè)非常大的數(shù)。這也就是說,分子過大或者是分母過小,都是我們應(yīng)該在計(jì)算過程中極力避免的事情。
舉一個(gè)實(shí)際應(yīng)用的例子,為什么會(huì)有這種過小或過大的情況產(chǎn)生。比如說有一條線,我們要計(jì)算某一個(gè)點(diǎn)到這個(gè)線的距離,這個(gè)距離d之后會(huì)出現(xiàn)在分母上。對(duì)于這樣一個(gè)式子,如果這個(gè)點(diǎn)我們?nèi)〉秒x線過于近的話,這個(gè)距離就非常之小,這在實(shí)際應(yīng)用中是經(jīng)常出現(xiàn)的。這種情況下softmax這個(gè)函數(shù)就極容易出現(xiàn)問題。
那么有人會(huì)問了,怎么樣去避免這個(gè)問題呢?當(dāng)然有很多方法,可以的最簡單的辦法就是定義一個(gè)max函數(shù),里面帶有一個(gè)常數(shù)比如10-4;如果這個(gè)距離D很小的話,我們就取這個(gè)10-4,限定了d的最小的值就是10-4。
當(dāng)然這是一個(gè)樸素簡單的想法,在實(shí)際應(yīng)用當(dāng)中,我們可以使用很多其他的方法,比如可以再取一個(gè)指數(shù),那么如果這個(gè)值非常小的話,它的整個(gè)值就會(huì)是趨向于1的,實(shí)際上也是一個(gè)解決問題的辦法。
這兩個(gè)問題,一個(gè)叫做分母趨近于0,或者是分子趨近于無窮大,一個(gè)叫underflow,下溢,就是指分母過于??;一個(gè)是overflow,是指分子過于大,趨近于無窮。這兩個(gè)問題都是由于計(jì)算機(jī)的數(shù)據(jù)有一個(gè)有限的范圍而產(chǎn)生的,并不是我們的算法本身系統(tǒng)產(chǎn)生的。這是Numerical error其中的一種,我們可以把它理解為,數(shù)據(jù)類型的范圍限定而導(dǎo)致的對(duì)于分子或者分母不能過大或過小而產(chǎn)生的限制。
還有一種極容易出現(xiàn)錯(cuò)誤的方式,是我們所構(gòu)造的系統(tǒng)產(chǎn)生的。比如我們?cè)谇蠼饩€性方程組Ax=B的時(shí)候,如果這個(gè)矩陣A的是一個(gè)病態(tài)矩陣,所謂的病態(tài)矩陣,最簡單形象的理解就是其中的某些列向量,它們之間的相關(guān)性過于大,也就是說列向量非常的接近。
假設(shè)這是其中的兩個(gè)列向量,取了其中一個(gè)列向量上的點(diǎn)。這兩個(gè)列向量過于接近的話,對(duì)點(diǎn)進(jìn)行一個(gè)微小的變化,它就有可能跑到了另外一個(gè)向量上,就是說它的解發(fā)生了發(fā)生了很大的變化;按理說這個(gè)點(diǎn)是屬于向量1的,但僅僅是因?yàn)楹苄〉囊粋€(gè)擾動(dòng),它就跑到了向量2上,它的解就發(fā)生了很大的變化。
有一個(gè)一般的辦法判斷矩陣是否病態(tài),就是把矩陣A所有的特征值λ求出來以后,然后把所有λ里的最大的值除以最小值,然后取它的模。我們根據(jù)這個(gè)值可以判斷一個(gè)矩陣是否是病態(tài)矩陣。
所以很多時(shí)候,在進(jìn)行machine learning或者deep learning之前,我們會(huì)對(duì)數(shù)據(jù)進(jìn)行一個(gè)篩選。篩選時(shí)候有時(shí)候很大的一個(gè)目的就是為了把其中的特征叫量過于接近的一些數(shù)據(jù)排除出去,讓我們經(jīng)過篩選后的矩陣,在它的每一個(gè)列向量上有明顯的差異,盡量避免過于接近的列向量的產(chǎn)生。
下面我們來簡單說一下優(yōu)化算法。絕大部分的機(jī)器學(xué)習(xí)或者說深度學(xué)習(xí),都是可以歸結(jié)為一個(gè)求極值的最優(yōu)化問題。最優(yōu)化問題,我們想到的簡單的辦法當(dāng)然可以有很多,比如說梯度下降,就是僅僅求一個(gè)導(dǎo)數(shù)就可以判斷求極值點(diǎn)的方向。
最優(yōu)化問題,所謂的最優(yōu)化去找最小值或者是最大值,涉及到兩個(gè)問題,一是我怎么找、往哪個(gè)方向走;第二個(gè)問題是,我知道了這個(gè)方案以后我應(yīng)該怎么走,每一步走多少。這基本上是所有求最值的兩個(gè)問題,一個(gè)是找方向,第二個(gè)是找步長。
這是Deep Learning書中關(guān)于一些基本函數(shù)的定義,包括objective funtion目標(biāo)函數(shù),或者也可以稱為損失函數(shù),或者也可以稱為誤差函數(shù)。這時(shí)候我們一般都是要求它的最小值,讓誤差或者損失盡量的小。
這里我們看一個(gè)非常簡單的例子,怎么解釋剛才說的兩個(gè)問題,一個(gè)是找方向,一個(gè)是找步長。這是一個(gè)目標(biāo)函數(shù),一個(gè)非常簡單的二次函數(shù)。我們看紅色箭頭指的這一點(diǎn),先看剛才說的取方向、怎么走的問題。這里有無數(shù)種方法,每一條直線都可以代表它可以前進(jìn)的一個(gè)方向。但是我們要從中找到一個(gè),因?yàn)檫@個(gè)最低點(diǎn)是我們的目標(biāo)點(diǎn),我們要找到從這個(gè)點(diǎn)出發(fā)到目標(biāo)點(diǎn)的最快的路徑、一個(gè)方向。
這里面這條紅線是書中原有的,我做了兩條藍(lán)色的線。我們從這三條線中可以比較出來,紅線是這三條線里面朝目標(biāo)點(diǎn)下降最快的一條線,因?yàn)榧t色線在這個(gè)點(diǎn)和目標(biāo)函數(shù)的角度是最小的,所以它是過這個(gè)點(diǎn)的下降最快的一條線。
然后我們看第二個(gè)問題,就是知道了方向以后怎么去走。對(duì)于每一個(gè)步長,我們?cè)谶@里面引入一個(gè)ε的權(quán)值,為了保持系統(tǒng)的穩(wěn)定性,一般會(huì)取一個(gè)比較小的值,比如說0.001或者是10-4這樣的一個(gè)小值,讓這個(gè)點(diǎn)緩慢地沿著這個(gè)紅色的這個(gè)方向,一小步一小步地,朝著目標(biāo)函數(shù)前進(jìn)。
但是這里面會(huì)有一些問題,比如說我們會(huì)遇到一些特殊的點(diǎn)。剛才的比較簡單的二次函數(shù)是沒有問題的,但是看一下后面一些復(fù)雜的函數(shù)。
這里是一些特殊的點(diǎn),critical points,我們可以把它稱為臨界點(diǎn)。
所謂的臨界點(diǎn)是指,它的一次導(dǎo)數(shù)為零,也就是說這個(gè)點(diǎn)往左或者往右都會(huì)都會(huì)變大或變小,這個(gè)點(diǎn)本身就是這個(gè)小的局部系統(tǒng)里面的一個(gè)極值點(diǎn)。如果你往兩邊走都是變大,那么它就是一個(gè)極小值點(diǎn);如果你往兩邊走都是變小,那么它就是一個(gè)極大值點(diǎn);如果一邊減小、一邊變大,這種情況是我們?cè)谟?jì)算里面最不想看到的情況,叫做駐點(diǎn),雖然它的導(dǎo)數(shù)也是零,但是這個(gè)點(diǎn)并不是我們所期待的那個(gè)objective point,不是我們想要找的目標(biāo)點(diǎn)。
我們看一個(gè)復(fù)雜一點(diǎn)的。像這個(gè)函數(shù)曲線,圖中有三個(gè)點(diǎn)都滿足我們剛才說的一階導(dǎo)數(shù)為零,但是右側(cè)這兩個(gè)點(diǎn)就不是我們想要的,最左側(cè)點(diǎn)的值更小。這個(gè)時(shí)候就有兩個(gè)問題,就是局部極值和全局最值的問題。這三個(gè)點(diǎn)都可以稱為局部的極值點(diǎn),只要滿足一階導(dǎo)數(shù)為零,但是怎么判斷你所求的局部極值點(diǎn)是否是全局的最值點(diǎn)?有一個(gè)簡單的辦法是把整個(gè)系統(tǒng)所有的極值點(diǎn)都找到,然后比從里面比較出最小值;但是在實(shí)際應(yīng)用中是不會(huì)這么做的,一是浪費(fèi)太多的計(jì)算資源,二是因?yàn)槠瘘c(diǎn)的不同,找這個(gè)局部極值點(diǎn)也會(huì)有很多的問題。
所以如果要是把每一個(gè)極值點(diǎn)都找的話,會(huì)非常的繁瑣,會(huì)浪費(fèi)大量的資源。那么,我們?cè)O(shè)計(jì)的系統(tǒng)怎么樣保證找到的這個(gè)點(diǎn)是一個(gè)最優(yōu)點(diǎn)、或者說是全局的最值點(diǎn)呢?
之前介紹的都是只有單個(gè)變量的系統(tǒng),現(xiàn)在看一下有多個(gè)變量的系統(tǒng)。在單變量系統(tǒng)里面,我們只需要求一個(gè)輸入的導(dǎo)數(shù);但是在多變量的系統(tǒng)里面,有很多的輸入,就有一個(gè)偏導(dǎo)數(shù)的概念,假定其它的變量固定、系統(tǒng)對(duì)其中的某一個(gè)變量求導(dǎo)的話,就稱之為關(guān)于這個(gè)變量的偏導(dǎo)數(shù)。
把所有的變量的偏導(dǎo)數(shù)求出來,并用向量的形式表示出來,可以表示成這個(gè)形式。剛才我們分析過了,如果要找到局部極值點(diǎn)的話,我們最快的方向是求導(dǎo)數(shù)、沿著梯度的方向;那么多變量系統(tǒng)里面也一樣,就是說我們要求一個(gè)系統(tǒng)的最小值的話,還是通過求導(dǎo),但這次是多變量的系統(tǒng),所以我們的求導(dǎo)要改成偏導(dǎo)數(shù)向量的方向來去尋找新的最值。
這種梯度下降算法在實(shí)現(xiàn)的時(shí)候會(huì)有一些不同,比如根據(jù)每次下降所采用的系統(tǒng)點(diǎn)數(shù)的不同,可以大致分為兩大類,一種叫做Batch Gradient Desecent,就是批梯度下降。所謂的“批”就是批量,比如說我們現(xiàn)在有一個(gè)系統(tǒng)h(x)等于θi*xi的合集(右上角),這是一個(gè)非常簡單的線性系統(tǒng)。按照我們之前所說的,首先要求出這個(gè)系統(tǒng)的目標(biāo)函數(shù),我們這里用了一個(gè)最小二乘法的目標(biāo)函數(shù),然后求這個(gè)目標(biāo)函數(shù)的最小值問題。
首先我們要求它的偏導(dǎo)數(shù),?J(θ)/?θj,它表示一個(gè)方向,然后沿著這個(gè)方向更新那個(gè)變量。在變量更新的時(shí)候,批梯度下降是指每一次的變量更新,都會(huì)用到所有的xj;然后從i=1到m,會(huì)用到所有的單獨(dú)變量的偏導(dǎo)數(shù)。比如假設(shè)這個(gè)系統(tǒng)里面的每一個(gè)樣本有五個(gè)特征的話,那么在更新任意一個(gè)權(quán)值的時(shí)候都要把這五個(gè)特征遍歷一遍。
這樣的話,如果是一個(gè)非常小的系統(tǒng),比如說樣本數(shù)量不是很多、每一個(gè)樣本所包含的特征也不是很多的話,這個(gè)是完全可以的,因?yàn)樗蠼獾氖且粋€(gè)全局的最優(yōu),考慮了考慮到了每一個(gè)變量方向的梯度問題,所以求的是全局的最優(yōu)下降的方向。但是所求的系統(tǒng)往往有大量的樣本,同時(shí)每一個(gè)樣本還包含了不少的特征,簡單分析一下這個(gè)系統(tǒng)的計(jì)算量的話,假設(shè)它的樣本數(shù)量是n,然后每一個(gè)的特征是m,那么其中一個(gè)樣本的計(jì)算量是m×m;有n個(gè)樣本的話,總的計(jì)算量是m×m×n。如果樣本1萬、2萬、10萬超級(jí)大的話,每一次迭代的計(jì)算量是非常大的。
這個(gè)時(shí)候大家就想到另外一種辦法,我能不能在每一次更新權(quán)值的時(shí)候,不用到所有的特征,只用其中的所求變量的特征,這就是我們所謂的隨機(jī)梯度下降Stochastic Gradient Descent。隨機(jī)梯度就是說,每一次針對(duì)權(quán)值的更新,只隨機(jī)取其中的一個(gè)i,就是隨機(jī)取其中的一個(gè)特征來計(jì)算。這樣它的計(jì)算量立馬就下降了,同樣是n個(gè)樣本就變成了m×n。因?yàn)樵瓉淼墓嚼锩嬗幸粋€(gè)求和符號(hào),需要求m個(gè)特征的值;這里面每次只求一個(gè)特征的。所以這個(gè)計(jì)算量就少了非常多。
這又引發(fā)了一個(gè)問題,通過剛才分析,我們知道BGD是全局自由梯度下降,SGD是隨機(jī)梯度現(xiàn)象,隨機(jī)梯度中只找了其中一個(gè)變量所在的方向進(jìn)行搜索,向目標(biāo)點(diǎn)前進(jìn),那么這種方法是否能保證最后到達(dá)目標(biāo)呢?理論上是有證明的,是可以的,只是這個(gè)會(huì)收斂的非常慢。
這兩個(gè)方法就有點(diǎn)矛盾,一個(gè)是計(jì)算量大,但是全局最優(yōu),收斂比較快;一個(gè)是計(jì)算量小,但是收斂比較慢,只能找到最優(yōu)目標(biāo)值的附近。所以又產(chǎn)生了一種調(diào)和的算法,叫做小批量梯度下降,Mini-Batch Gradient Descent。其實(shí)很簡單,既不像批量用到所有的特征去更新權(quán)值,也不像隨機(jī)梯度下降只用其中一個(gè),我選取一部分,假設(shè)每個(gè)樣本有100個(gè)特征,我只取其中的10個(gè)特征用于每一次的權(quán)值更新。那么首先它的計(jì)算量是下降的,其次它也并不是僅僅按照其中某一個(gè)、而是它是按照了10個(gè)特征向量所在的方向進(jìn)行搜索,既保證了搜索速度,又保證了計(jì)算量,這是目前在梯度下降中用的比較多的一個(gè)方法,算是一個(gè)BGD和SGD兩種方法的折中方法。
它們?nèi)叩膬?yōu)缺點(diǎn)分別就是,批量是計(jì)算量大,隨機(jī)是計(jì)算量小,但是搜索精度有一定的問題;Mini-batch就是權(quán)衡了兩者。
剛才所有的分析都是基于一階導(dǎo)數(shù),這也是在簡單的線性系統(tǒng)優(yōu)化中常用的。其實(shí)二階導(dǎo)數(shù)對(duì)于系統(tǒng)的分析也是非常有用的。
看一下這幾個(gè)簡單的例子。我們知道一階導(dǎo)數(shù)的意義表示的是f(x)的變化,二階導(dǎo)數(shù)的意義就是一階導(dǎo)數(shù)的變化情況。比如說第一幅圖,它的一階導(dǎo)數(shù)從正(上升)到0(水平)再到負(fù)的(下降),不停地減小,就可以知道它的二階導(dǎo)數(shù)是小于0的。第二幅圖一條直線的話,它的斜率也就是一階導(dǎo)數(shù)是永遠(yuǎn)不變,那么它的二階導(dǎo)數(shù)就永遠(yuǎn)是0;同理第三個(gè)圖指的是二階導(dǎo)數(shù)大于零的情況。
二階導(dǎo)數(shù)的意義就是我們可以分析這個(gè)系統(tǒng)。下面先介紹一個(gè)雅克比矩陣(Jacobian Matrix),我們的系統(tǒng)是一個(gè)多輸入、多輸出的系統(tǒng),它變量的范圍是Rm 域的范圍,輸出是Rn 域的范圍,那么f(x) 的雅克比矩陣就是,針對(duì)所有的輸入啊求導(dǎo),比如第一行是那個(gè)f1對(duì)所有的輸入變量求導(dǎo),第二行就是f2,f的第二個(gè)變量,對(duì)所有的變量求導(dǎo);同理,最后一行就是fm對(duì)所有的變量求導(dǎo)。這就是雅克比矩陣的定義。
雅克比矩陣是一階的求導(dǎo)矩陣,還有二階求導(dǎo)矩陣黑塞矩陣(Hessian Matrix)。
黑塞矩陣的定義其實(shí)也很簡單,每一個(gè)f(x) 同時(shí)對(duì)兩個(gè)方向的變量求二次導(dǎo)數(shù)。當(dāng)然你也可以把它看成雅克比矩陣的變形,黑塞矩陣?yán)锏拿恳豁?xiàng)相當(dāng)于雅克比矩陣?yán)锩娴拿恳豁?xiàng)再求導(dǎo),因?yàn)槎A導(dǎo)數(shù)可以看成一次求導(dǎo)再求導(dǎo)。這是黑塞矩陣的定義。
黑塞矩陣有一個(gè)特點(diǎn),對(duì)于一個(gè)系統(tǒng),如果它的偏導(dǎo)數(shù)不分方向的,就是說先對(duì)xi求導(dǎo)、或者先對(duì)xj求導(dǎo),求導(dǎo)的先后順序不影響二次導(dǎo)數(shù)值的話,那么黑塞矩陣就明顯是一個(gè)對(duì)稱矩陣,因?yàn)閤i、xj可以互相交換。就是說對(duì)先對(duì)x2求導(dǎo)或者先對(duì)x1求導(dǎo)是沒有關(guān)系的,那么?x1*?x2和?x2*?x1是相等的。
那么二階矩陣有什么影響,它對(duì)先前的一階矩陣梯度下降的不足有什么樣的改進(jìn)呢?簡單分析一下,一個(gè)f(x) 可以做這樣的泰勒展開,其中包含特定點(diǎn)的值,這個(gè)g 表示的是一階導(dǎo)數(shù),也就是梯度,然后H是一個(gè)二階的梯度矩陣。
當(dāng)我們更新x值的時(shí)候,比如說現(xiàn)在是x0,然后下一步更新到x0-εg的時(shí)候(這是剛才梯度下降的定義嘛),帶入這個(gè)泰勒展開會(huì)得到圖中下方的公式。
列出這個(gè)公式的主要目的是為了考察梯度下降的步長系數(shù)應(yīng)該怎么取值比較好。剛才講過了,剛開始我們可以隨便給一個(gè)比較小的值,0.01、0.004或者更小的值。但是實(shí)際的情況下,我們不想隨機(jī)給一個(gè),而是通過數(shù)學(xué)的分析得到一個(gè)比較好的值,從而定義這個(gè)步長系數(shù),可以走得既快又準(zhǔn)確。
帶入得到這個(gè)公式之后(當(dāng)然這時(shí)候我們可以把約等號(hào)當(dāng)作等號(hào)),我們可以把它當(dāng)做一個(gè)關(guān)于ε的函數(shù),其它的變量可以都當(dāng)作常數(shù)。如果要得ε的一個(gè)比較優(yōu)化的值的話,我們可以看作f(ε) 等于這個(gè)式子,然后對(duì)它關(guān)于ε求導(dǎo),最后在所有可能的系數(shù)里面得到一個(gè)比較好的系數(shù)。有了這個(gè)系數(shù)就可以保證我們的步長取得又大又穩(wěn)。
下面我介紹兩個(gè)方法,一個(gè)是僅僅用了一階導(dǎo)數(shù)的、我們前面提到的gradient descent;另一個(gè)是牛頓方法,這是用到二階導(dǎo)數(shù)的方法。梯度下降僅僅用到了一階導(dǎo)數(shù),所以我們把它稱為一階優(yōu)化算法;牛頓方法用到了二階,我們就把牛頓方法稱為二階優(yōu)化算法。
我們看一下牛頓迭代方法,這是剛才提到的泰勒展開,然后現(xiàn)在想要找到這個(gè)系統(tǒng)的極值點(diǎn),當(dāng)然,僅僅求導(dǎo)就行了。根據(jù)一階導(dǎo)數(shù)為0,它的臨界點(diǎn)就是圖中下方這個(gè)公式。這樣我們更新就按照這個(gè)公式。
這個(gè)公式有什么意義呢?就是一次直接找到了這個(gè)critical point,過程中用到的是黑塞矩陣。因?yàn)樵谶@里面用到了黑塞矩陣,所以我們把牛頓方法稱為一個(gè)二階方法。
這之前,我們遇到的所有求極值的問題都是就是無約束的,就是freestyle,x沒有任何的約束。僅僅是求目標(biāo)函數(shù)的最小值問題。但是實(shí)際情況里有大量的約束問題,這就牽扯到了另外的約束優(yōu)化的問題。
這是維基百科上關(guān)于約束優(yōu)化的定義。
首先f(x) 是目標(biāo)函數(shù),如果沒有下面這一堆subject to的話,它就是我們之前講到的最優(yōu)化問題,你可以用梯度下降,也可以用牛頓法來求解。但是這個(gè)時(shí)候它有了很多的約束,比如x必須滿足某一個(gè)函數(shù),xi代進(jìn)去要等于一個(gè)特定的值ci。這是一個(gè)等式,所以又把它稱作等式約束;相反就是不等式約束問題。
遇到這樣問題應(yīng)該怎么做?很容易想到能不能把這兩個(gè)約束的條件整合到目標(biāo)函數(shù)里面,然后對(duì)這個(gè)整合的系統(tǒng)再求優(yōu)化問題。其實(shí)我們做工程很多時(shí)候都是這樣的,之前先有一個(gè)基本的、best的處理方法,再遇到一個(gè)問題以后,就想辦法把新產(chǎn)生的問題去往已知的基本問題上靠攏。
這里介紹一個(gè)KKT的約束優(yōu)化算法。KKT優(yōu)化算法其實(shí)很簡單,它就是構(gòu)造了一個(gè)廣義的拉格朗日函數(shù),然后我們針對(duì)這個(gè)廣義的拉格朗日函數(shù),或者是這個(gè)系統(tǒng)來求它的極值。
我們可以從圖片上來看這個(gè)約束問題。比如我們選了一個(gè)初始點(diǎn),如果沒有陰影部分的面積,那就從初始點(diǎn)隨便怎么走去找這個(gè)最優(yōu)的x。走的方法就是它的梯度方向。但是現(xiàn)在有約束問題的話,x的取值必須要在陰影范圍之內(nèi)走動(dòng),這是一個(gè)比較形象的約束問題的表征。
前面提到我們要構(gòu)造拉格朗日函數(shù)。要構(gòu)造拉格朗日函數(shù)也簡單,我們現(xiàn)在有一個(gè)等式約束,還有一個(gè)不等式約束,只要在等式約束和不能約束之前加入一個(gè)系數(shù),當(dāng)然我們是把這些系數(shù)看作變量的。把這些系數(shù)加入到原來的函數(shù)之上,構(gòu)成了一個(gè)新的函數(shù)系統(tǒng),我們就可以把它叫做廣義拉格朗日函數(shù)。
之前我們是僅僅是求f(x) 的最小值,現(xiàn)在加入了這兩個(gè),我們可以根據(jù)它的特征分析一下。
首先,h(x) 小于等于0的話,針對(duì)它的系數(shù)α,我們就要求它的最大值;然后看 λ,因?yàn)?λ 是一個(gè)常數(shù),求最大或者最小是一樣的;最后又歸結(jié)到f(x),還是求它的最小值。當(dāng)然,我們也可以兩個(gè)累加前面都變成負(fù)號(hào),那么同理下面可以變成要求它的最小值。
其實(shí)也可以很好理解,就是說原來是一個(gè)f(x),現(xiàn)在加入了一個(gè)東西,這個(gè)東西滿足的條件是對(duì)于任意的x,h(x)都必須是小于等于0的。那么如果我的最大值都小于等于0的話,那肯定所有值都小于等于0了。所以我這邊要求一個(gè)最小值。
當(dāng)然我假設(shè)加入的這部分是正的,這邊所有的α都是大于零的,那么L(x,λ,α) 里αjhj(x) 就始終是小于等于0的;小于等于0的話,我只要讓它的最大值滿足的小于等于0,那么它所有的其他值肯定也是滿足這個(gè)條件的。這就是如何構(gòu)建一個(gè)拉格朗日函數(shù)的方法。
有了這個(gè)構(gòu)建的函數(shù)以后,它的極值問題就可以用梯度下降的方法來求解。
我們舉一個(gè)簡單的例子,最簡單的,線性最小二乘法,這個(gè)是在求誤差的時(shí)候最常用的損失函數(shù)或者目標(biāo)函數(shù)了。那么我們可以用到前面講到的梯度下降法,求它的導(dǎo)數(shù),然后x更新的話就是用一個(gè)小的補(bǔ)償系數(shù)乘以Δx,就是它的梯度。當(dāng)然你也可以用牛頓方法,用求它的二階導(dǎo)數(shù)來更新。
現(xiàn)在我們把這個(gè)系統(tǒng)稍微改一下,把它變成一個(gè)受限的系統(tǒng)。比如我們要求向量x滿足這個(gè)條件,這樣它就變成了一個(gè)帶有限制的優(yōu)化問題。這個(gè)時(shí)候我們可以構(gòu)造拉格朗日函數(shù),原函數(shù)不變,加上它的限制條件,前面加上一個(gè)λ變量,然后就可以寫出它的目標(biāo)函數(shù)。
首先f(x) 是不變的,然后因?yàn)閤Tx小于等于1,所以這邊要求最大的(當(dāng)然如果xTx大于等于1,你這邊要求最小的)。然后怎么更新這個(gè)系統(tǒng)呢,x可以這樣來表示
基本上就是求逆的操作。λ滿足的一個(gè)梯度條件是,把它看作單變量,對(duì)它求導(dǎo),它的導(dǎo)數(shù)需要滿足
這樣Deep Learning書的第四章書基本上就講完了。
最后簡單總結(jié)一下,這一章主要講的問題。
第一,我們?cè)谧鰯?shù)值計(jì)算,包括深度學(xué)習(xí)或者機(jī)器學(xué)習(xí)的時(shí)候,我們要注意里面的變量,尤其是在分母上的變量,不要出于出現(xiàn)過小的值,比如距離,分母不要過橋,分子不要過大?,F(xiàn)在是有軟件是可以幫助我們檢測(cè)的,但是因?yàn)槲覀兤綍r(shí)用到的算法基本上是成熟的,或者是用了很多Library/庫,其中已經(jīng)對(duì)一些異常狀況做過提前預(yù)防,所以我們的計(jì)算中是不存在這個(gè)問題的。一般是針對(duì)我們要自己動(dòng)手設(shè)計(jì)出新的計(jì)算方法時(shí)才會(huì)考慮這個(gè)問題;平時(shí)的計(jì)算過程中一般不需要考慮系統(tǒng)的穩(wěn)定性問題的。你如果設(shè)計(jì)一個(gè)新的系統(tǒng),你就要分析一下這個(gè)系統(tǒng)的穩(wěn)定性。
然后就是梯度下降的意義,就是我們找了一個(gè)什么樣的方向去接近目標(biāo)函數(shù),有了方案以后我們應(yīng)該怎么走,每一步應(yīng)該走多少;有時(shí)候你走的過大的話,也會(huì)導(dǎo)致系統(tǒng)的發(fā)散。
其實(shí)在這本書的最后作者也說了,目前Deep Learning系統(tǒng)缺少嚴(yán)格的理論保障。為什么我們做機(jī)器學(xué)習(xí)的時(shí)候經(jīng)常說調(diào)參數(shù)、調(diào)參數(shù),就是因?yàn)楹芏鄸|西可以說是試出來的,并沒有嚴(yán)格的數(shù)學(xué)證明說某一個(gè)值應(yīng)該怎么取。這一章節(jié)在最后也說了一個(gè)目前使用的深度學(xué)習(xí)算法的缺點(diǎn),就是因?yàn)樗南到y(tǒng)目前過于復(fù)雜,比如一層接一層的函數(shù)的疊加或者是相乘,它的系統(tǒng)分析就會(huì)很復(fù)雜,很難有一個(gè)明確的理論去分析這個(gè)系統(tǒng)的各種特征。如果僅僅是一個(gè)簡單的f(x)=x2,這種系統(tǒng)無論怎么做都行,它已經(jīng)被分析的太徹底了,無論怎么算都會(huì)有一個(gè)精確的算法在那里。所以前面講的誤差也僅僅是在一個(gè)常見的容易出錯(cuò)的地方給了一個(gè)比較好的指導(dǎo),但實(shí)際的計(jì)算過程中還會(huì)遇到各種各樣的問題。這個(gè)時(shí)候一是要靠經(jīng)驗(yàn),二是也希望會(huì)有越來越多的數(shù)學(xué)理論來支持深度學(xué)習(xí)的系統(tǒng)分析。
還有就是,我們?cè)谧鲇?jì)算的時(shí)候都知道有一個(gè)天然的矛盾,就是計(jì)算量和精度的問題。計(jì)算量大就會(huì)讓精度提高,但是有時(shí)候過大的計(jì)算量又是我們承受不了的,所以這也是一個(gè)矛盾?,F(xiàn)在的很多算法其實(shí)也就是在中和這個(gè)矛盾,既要降低計(jì)算量,要保持我們能夠接受的精度。所以現(xiàn)在有很多前處理的方式,針對(duì)大量的數(shù)據(jù)要怎么樣處理,讓設(shè)計(jì)的系統(tǒng)最后既能夠滿足我們的要求,又盡量的減少計(jì)算量,同時(shí)也盡量避免一些不必要的誤差。其實(shí)這是就是一個(gè)洗數(shù)據(jù)的過程,把數(shù)據(jù)洗得干凈一點(diǎn),把噪音和沒有用的數(shù)據(jù)都淘汰掉的過程。
今天就和大家分享到這里,如果有什么問題的話,歡迎大家在群里面討論。
機(jī)器學(xué)習(xí)的數(shù)學(xué)數(shù)學(xué)理論其實(shí)比較匱乏,所以有很多值得討論的問題,包括其實(shí)有我剛才有好幾個(gè)點(diǎn)想講沒有講的,因?yàn)闀r(shí)間有限,比如說二階的優(yōu)化問題,怎么樣去用二階的優(yōu)化問題去保證一階優(yōu)化找到那個(gè)全局的最小點(diǎn),而不是局部的最小點(diǎn)。其實(shí)這個(gè)在多目標(biāo)、多變量的系統(tǒng)里面,目前還沒有特別好的方法,當(dāng)然在單系統(tǒng)里面就不存在這個(gè)問題,有很多方法去解決。今天就先到這里,謝謝大家。
(完)
雷鋒網(wǎng) AI 科技評(píng)論整理,感謝陳安寧此次分享,后續(xù)更多章節(jié)的分享請(qǐng)大家繼續(xù)關(guān)注我們!
相關(guān)文章:
「Deep Learning」讀書系列分享第二章:線性代數(shù) | 分享總結(jié)
「Deep Learning」讀書系列分享第三章:概率和信息論 | 分享總結(jié)
雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。