參考原文鏈接??:https://developer.aliyun.com/article/105339 “人世間,很多事情雖然已經(jīng)做過了,卻不為人知,但那又如何,重要的是,我已做過,并從中獲得了很多。” 多層感知機網(wǎng)絡(luò)遇到的大問題 第六講中提到的多層前饋網(wǎng)絡(luò),有時也被稱為多層感知機(MLP)。但是這個提法導(dǎo)致概念多少有些混淆,因為,在多層前饋網(wǎng)絡(luò)中,神經(jīng)元的內(nèi)部構(gòu)造已經(jīng)悄然發(fā)生了變化,即激活函數(shù)從簡單粗暴的“階躍函數(shù)”變成了比較平滑的擠壓函數(shù)Sigmoid。 為什么要換成這個激活函數(shù)呢?原因并不復(fù)雜,這是因為感知機的激活函數(shù)是階躍函數(shù),不利于求導(dǎo),今兒求損失函數(shù)的最小值。當(dāng)分類對象是線性可分,且學(xué)習(xí)率η足夠小時,感知機還堪勝任,其構(gòu)建的網(wǎng)絡(luò),還可以訓(xùn)練達(dá)到收斂。但分類對象不是線性可分時,感知機就無法勝任了。因此,通常感知機并不能推廣到一般前饋網(wǎng)絡(luò)中。 ? ? 按照我們前面章節(jié)的說法,所謂的機器學(xué)習(xí),簡單來說,就是找到一個好用的函數(shù),從而較好地實現(xiàn)某個特定的功能。一言蔽之,函數(shù)就是功能。對于某個特定的前饋神經(jīng)網(wǎng)絡(luò),給定網(wǎng)絡(luò)參數(shù)(連接權(quán)值和閾值),其實就是定義了一個具備數(shù)據(jù)采集(輸入層)、加工處理(隱含層),然后是輸出結(jié)果(輸出層)的函數(shù)。 如果僅僅給定一個網(wǎng)絡(luò)結(jié)構(gòu),其實它定義的是一個函數(shù)集合,因為不同的網(wǎng)絡(luò)參數(shù)(連接權(quán)值與閾值),實現(xiàn)的功能“大相徑庭”。功能不同,自然函數(shù)也是不同的。 針對前饋神經(jīng)網(wǎng)絡(luò),我們需要實現(xiàn)的目的很簡單,就是想讓損失函數(shù)達(dá)到最小值,因為只有這樣,實際輸出和預(yù)期輸出的差值才最小。那么,如何從眾多的網(wǎng)絡(luò)參數(shù)(神經(jīng)元之間的連接)中選擇最佳的參數(shù)呢? 最簡單粗暴的方法,當(dāng)然就是枚舉所有可能值。 ? ? 但是這種暴力策略,對稍微復(fù)雜一點的網(wǎng)絡(luò)就不可取的,例如,用于語音識別的神經(jīng)網(wǎng)絡(luò),假設(shè)網(wǎng)絡(luò)結(jié)構(gòu)有7層,每一層有1000個神經(jīng)元,那么僅一層之間的全連接權(quán)值,就達(dá)到1000*1000=1000000個,一旦層次多了,那權(quán)值數(shù)量就太多了。 ? 到底什么是梯度? 為了克服多層感知機存在的問題,人們設(shè)計了一種名為delta法則的啟發(fā)式方法,該方法可以讓目標(biāo)收斂到最佳解的近似值。 該法則的思想在于,使用梯度下降的方法找極值。具體來說,就是在假設(shè)空間中搜索可能的權(quán)值向量,并以“最佳”的姿態(tài),來擬合訓(xùn)練集合中的樣本。那么,何為最佳擬合呢?當(dāng)然就是讓損失函數(shù)達(dá)到最小值! 我們知道,求某個函數(shù)的極值,難免用到“導(dǎo)數(shù)”的概念。什么是導(dǎo)數(shù)呢?導(dǎo)數(shù)就是用來分析函數(shù)“變化率”的一種度量。針對函數(shù)中某個特定點x0,該點的導(dǎo)數(shù)就是x0點的“瞬間斜率”,也即切線斜率,見公式:? 如果這個斜率越大,就表明其上升的趨勢越強勁。當(dāng)這個斜率為0時,就達(dá)到了這個函數(shù)的極值點,而前文提到的損失函數(shù),如果要達(dá)到損失最小,就難免用到導(dǎo)數(shù)“反向指導(dǎo)”如何快速抵達(dá)最小值。 在單變量的實值函數(shù)中,梯度就可以簡單地理解為只是導(dǎo)數(shù),或者說對于一個線性函數(shù)而言,梯度就是線的斜率。但對于多變量的函數(shù),它的梯度概念就不那么容易理解了。 在向量微分中,標(biāo)量場的梯度其實是一個向量場。對于特定函數(shù)的某個特定點,它的梯度就表示從該點出發(fā),該函數(shù)值增長最為迅猛的方向。假設(shè)一個標(biāo)量函數(shù)f的梯度記為:f或gradf,這里的表示向量微分算子,那么,在一個三維直角坐標(biāo)系,該函數(shù)的梯度就可以表示為公式: ?求這個梯度值,難免用到“偏導(dǎo)”的概念。說到“偏導(dǎo)”,這里順便提一下國內(nèi)的翻譯,其英文是“partial derivatives(局部導(dǎo)數(shù))”,書本上常翻譯為“偏導(dǎo)”,可能會把讀者的思路引導(dǎo)“偏”。 什么是“局部導(dǎo)數(shù)”呢?對于多維變量函數(shù)而言,當(dāng)求某個變量的導(dǎo)數(shù)(相比于全部變量,這里只求一個變量,即為“局部”),就是把其他變量視為常量,然后整個函數(shù)求其導(dǎo)數(shù)。之后,整個過程對每個變量都“臨幸”一遍,放在向量場中,就得到了這個函數(shù)的梯度了。舉例來說,對于三變量的函數(shù)f = x^2 3xy y^2 z^3。它的梯度可以這樣求得: ? 這時,梯度可以理解為,站在向量點A(1,2,3),如果想讓函數(shù)f的值增長得最快,那么它的下一個前進(jìn)的方向,就是朝著向量B(8,7,27)方向進(jìn)發(fā)。很顯然,梯度最明顯的應(yīng)用,就是快速找到多維變量函數(shù)的極(大/小)值。 ? 在這里需要說明的是,我們用“局部函數(shù)”的翻譯,僅僅用來加深對“偏導(dǎo)”的理解。 到底什么是梯度下降? 下面我們說說,在求損失函數(shù)的極小值的過程中,常常提到的“梯度遞減”的概念。 如果把登山過程中求某點的斜率稱為“梯度(gradient)”,而找谷底的方法,就可以把它稱之為“梯度遞減(gradient descent)”。 “梯度遞減”體現(xiàn)出來的指導(dǎo)意義,就是“機器學(xué)習(xí)”中的“學(xué)習(xí)”的內(nèi)涵?!皩W(xué)習(xí)”的本質(zhì),在于性能的提升,利用“梯度遞減”的方法,的確在很大程度上,提升了機器的性能,所以,它就是“學(xué)習(xí)”。 重溫神經(jīng)網(wǎng)絡(luò)的損失函數(shù) 針對前饋神經(jīng)網(wǎng)絡(luò)的設(shè)計,輸入和輸出層設(shè)計比較直觀。 針對前饋神經(jīng)網(wǎng)絡(luò)的設(shè)計,輸入和輸出層設(shè)計比較直觀。比如說,假如我們嘗試判斷一張手寫數(shù)字圖片上面是否寫著數(shù)字“2”。很自然地,我們可以把圖片像素的灰度值作為網(wǎng)絡(luò)的輸入。如果圖片的維度是16×16,那么我們輸入層神經(jīng)元就可以設(shè)計為256個(也就是說,輸入層是一個包括256個灰度值向量),每個神經(jīng)元接受的輸入值,就是規(guī)格化的灰度值。 而輸出層的設(shè)計也很簡單,就是需要包含10神經(jīng)元,輸出是數(shù)字“0~9”的分類概率(也就是說,輸出層是一個包括10個概率值的向量)。擇其大者而判之,如圖7-7所示,如果判定為“2”的概率(比如說80%)遠(yuǎn)遠(yuǎn)大于其他數(shù)字,那么整個神經(jīng)網(wǎng)絡(luò)的最終判定,就是手寫圖片中的數(shù)字是“2”,而非其它數(shù)字。 但通過不斷地“折騰”,研究人員還真是掌握了一些針對隱層的啟發(fā)式設(shè)計規(guī)則(如下文即將提到的BP算法),以此降低訓(xùn)練網(wǎng)絡(luò)所花的開銷,并盡量提升網(wǎng)絡(luò)的性能。 那么,怎樣才算是提升神經(jīng)網(wǎng)絡(luò)的性能呢?這就要用到我們前面提到的損失函數(shù)了。在第六章我們提到,所謂“損失函數(shù)”,就是一個刻畫實際輸出值和期望值之間“落差”的函數(shù)。 為了達(dá)到理想狀態(tài),我們當(dāng)然希望這種“落差”最小,也就是說,我們希望快速配置好網(wǎng)絡(luò)參數(shù),從而讓這個損失函數(shù)達(dá)到極小值,神經(jīng)網(wǎng)絡(luò)的性能接近最優(yōu)。 關(guān)于求損失函數(shù)極小值,給出一個通俗易懂的例子,對于識別手寫數(shù)字的神經(jīng)網(wǎng)絡(luò),訓(xùn)練數(shù)據(jù)都是一些“0,1,2,...,9”等數(shù)字圖像。 ? ? 由于人們手寫數(shù)字的風(fēng)格不同,圖像的殘缺程度不同,輸出的結(jié)果又是并不能是“十全十美”,于是我們就用損失函數(shù)來衡量二者的誤差,前面我們提到,常用的損失函數(shù)是: 機器學(xué)習(xí)的任務(wù),很大程度上,找一個模型,擬合或者說“適配”給定的訓(xùn)練數(shù)據(jù),然后再用這個模型預(yù)測新數(shù)據(jù)。這個模型的表現(xiàn)形式,具體來說,就是設(shè)計一個好用的函數(shù),用以揭示這些訓(xùn)練樣本隨著自身變量的變化關(guān)系。揭示擬合好壞的程度,就要用到損失函數(shù)。“損失”越小,說明擬合的效果越好。 ? 在我們訓(xùn)練神經(jīng)網(wǎng)絡(luò)時,損失函數(shù)說白了,就是有關(guān)“權(quán)值參數(shù)”的函數(shù)。為了求損失函數(shù)的極小值,就不可避免地需要計算損失函數(shù)中的每一個權(quán)值參數(shù)的偏導(dǎo)數(shù),這時前文中提到的“梯度遞減”的方法就派上用場了。訓(xùn)練線性單元的梯度遞減算法如上圖所示,圖中的參數(shù)η就是“學(xué)習(xí)率”,它決定了梯度遞減搜索的步長,這個步長“過猶不及”。如果值太小,則收斂慢,如果值太大,則容易越過極值,導(dǎo)致網(wǎng)絡(luò)震蕩,難以收斂。 上圖僅給出一個權(quán)值變量wi的梯度示意圖,而實際上,神經(jīng)網(wǎng)絡(luò)的參數(shù)是非常多的,因此針對損失函數(shù)L的權(quán)值向量的梯度可以記作: 在這里,梯度本身就是一個向量,它的多個維度分別由損失函數(shù)L對多個權(quán)值參數(shù)wi求偏導(dǎo)所得。當(dāng)梯度被解釋為權(quán)值空間的一個向量時,它就確定了L對陡峭上升的方向。 如果需要根據(jù)公式來更新權(quán)值,我們需要一個更加實用的方法,在每一步重復(fù)計算。幸運的是,這個過程并不復(fù)雜,通過簡易的數(shù)學(xué)推導(dǎo),我們可以得到每個權(quán)值分量wi更簡明的計算公式: 其中,xid表示訓(xùn)練集合的第d個樣例的輸入分量xi,yd表示第d樣例的期望輸出值,yd'表示第d樣例的實際輸出值,這二者差值就是“損失”,也稱為誤差。有了公式做支撐,算法就可行之有“章法”了。 對于前文所言,對于特定訓(xùn)練集合,第d個樣本的預(yù)期輸出yd和實際輸出yd',都是“塵埃落定”的常數(shù),對于求權(quán)值分量wi的偏導(dǎo)(部分導(dǎo)數(shù))來說,除了作為變量的系數(shù)可以保留之外,其他統(tǒng)統(tǒng)都可以看作“浮云”。此外,注意到: 因此,可以進(jìn)一步將公式化簡: 有了該公式做支撐,梯度下降的權(quán)值更新法則可以用如下公式表示: 有了前面的知識鋪墊,我們終于可以在下一章談?wù)務(wù)`差反向傳播(BP)算法了。 小結(jié) 在本章中,我們主要講解了梯度的概念,所謂梯度,就是該函數(shù)增長最迅猛的方向,然后我們介紹了梯度下降法則。 在下一章中,我們將用最通俗易懂的方式,詳細(xì)解釋誤差反向傳播算法。深度學(xué)習(xí)之所以性能奇佳,不僅僅因為它有一個“無監(jiān)督”的逐層預(yù)訓(xùn)練,除此之外,預(yù)訓(xùn)練之后的“微調(diào)”,還是需要“有監(jiān)督”的BP算法作為支撐。 深度學(xué)習(xí)離不開“BP”算法。 來源:https://www./content-4-792351.html |
|