深度学习提高泛化能力的技术
LeetCode題目記錄
- 1.泛化能力(generalization)
- 2.正則化(regularization)
- 2.1 正則化方法
1.泛化能力(generalization)
對于模型,我們不僅要求它對訓(xùn)練數(shù)據(jù)集有很好的擬合(訓(xùn)練誤差),同時也希望它可以對未知數(shù)據(jù)集(預(yù)測集)有很好的擬合結(jié)果(泛化能力),所產(chǎn)生的測試誤差被稱為泛化誤差。
度量泛化能力的好壞,最直觀的表現(xiàn)就是模型的過擬合(overfitting)和欠擬合(underfitting)
過擬合和欠擬合是用于描述模型在訓(xùn)練過程中的兩種狀態(tài),一般來說,訓(xùn)練會是這樣的一個曲線。下面的training error,generalization error分別是訓(xùn)練集和測試集的誤差。
訓(xùn)練剛開始的時候,模型還在學(xué)習(xí)過程中,訓(xùn)練集和測試集的性能都比較差,這個時候,模型還沒有學(xué)習(xí)到知識,處于欠擬合狀態(tài),曲線落在underfitting zone,隨著訓(xùn)練的進行,訓(xùn)練誤差和測試誤差都下降。
隨著模型的進一步訓(xùn)練,在訓(xùn)練集上表現(xiàn)的越來越好,終于在突破一個點之后,訓(xùn)練集的誤差下降,測試集的誤差上升了,這個時候就進入了過擬合區(qū)間overfitting zone。
不過也不是說什么訓(xùn)練過程,都會滿足上面的曲線。
(1) 模型訓(xùn)練過程中,訓(xùn)練集的誤差一定一直低于測試集嗎?未必。
如果這兩個集合本來就取自于同樣的數(shù)據(jù)分布,比如從一個數(shù)據(jù)集中隨機采樣,那么有可能測試的誤差從一開始就低于訓(xùn)練集。不過,總體的趨勢肯定是不變的,兩者從一開始慢慢下降直到最后過擬合,訓(xùn)練集的誤差低于測試集。
(2) 模型的訓(xùn)練一定會過擬合嗎?這也不一定!
如果數(shù)據(jù)集足夠大,很可能模型的能力不夠始終都不會過擬合。另一方面,有很多的方法可以阻止,或者減緩模型的過擬合,比如正則化。
2.正則化(regularization)
正則化的目標(biāo): 模型的經(jīng)驗風(fēng)險和模型復(fù)雜度之和達到最小,即結(jié)構(gòu)風(fēng)險達到最小。
以上是我們的優(yōu)化目標(biāo),V就是損失函數(shù),它表示的是當(dāng)輸入xi預(yù)測輸出為f(xi),而真實標(biāo)簽為yi時,應(yīng)該給出多大的損失。
只要一個模型足夠復(fù)雜,它是不是可以記住所有的訓(xùn)練集合樣本之間的映射,代價就是模型復(fù)雜,帶來的副作用就是沒見過的只是略有不同的樣本可能表現(xiàn)地就很差。造成這種情況的問題就是學(xué)的太過,參數(shù)擬合的太好以致于超過了前面那個訓(xùn)練曲線的最低泛化誤差臨界點,究其根本原因是模型的表達能力足夠強大到過擬合數(shù)據(jù)集。
式子中的R(f),正是為了約束模型的表達能力,f是模型,R是一個跟模型復(fù)雜度相關(guān)的函數(shù),單調(diào)遞增。
模型的表達能力跟模型大小,也就是參數(shù)量有關(guān),限制模型的表達能力可以去調(diào)整模型大小,也就是調(diào)整模型的參數(shù)來實現(xiàn),正則項就可以在參數(shù)上做文章。
所以說正則化就用于提高模型的泛化能力,這里所說的僅僅是狹義上的參數(shù)正則化,而廣義上的正則化方法眾多。
2.1 正則化方法
正則化方法,根據(jù)具體的使用策略不同,有直接提供正則化約束的參數(shù)正則化方法如L1/L2正則化,以及通過工程上的技巧來實現(xiàn)更低泛化誤差的方法,比如訓(xùn)練提前終止和模型集成,我將其稱為經(jīng)驗正則化,也有不直接提供約束的隱式正則化方法如數(shù)據(jù)增強等,下面就從這三類進行講述。
1、經(jīng)驗正則化方法
這里主要包含兩種方法,即提前終止和模型集成。
(1) 提前終止(earlystop)
前面我們看的訓(xùn)練曲線隨著不斷迭代訓(xùn)練誤差不斷減少,但是泛化誤差減少后開始增長。假如我們在泛化誤差指標(biāo)不再提升后,提前結(jié)束訓(xùn)練,也是一種正則化方法,這大概是最簡單的方法了。
(2) 模型集成(dropout)
另一種方法就是模型集成(ensemable),也就是通過訓(xùn)練多個模型來完成該任務(wù),它可以是不同網(wǎng)絡(luò)結(jié)構(gòu),不同的初始化方法,不同的數(shù)據(jù)集訓(xùn)練的模型,也可以是用不同的測試圖片處理方法,總之,采用多個模型進行投票的策略
在這一類方法中,有一個非常有名的方法,即Dropout。
Dropout在2014年被H提出后在深度學(xué)習(xí)模型的訓(xùn)練中被廣泛使用。它在訓(xùn)練過程中,隨機的丟棄一部分輸入,此時丟棄部分對應(yīng)的參數(shù)不會更新。所謂的丟棄,其實就是讓激活函數(shù)的輸出為0。
關(guān)于dropout的有效性,從結(jié)構(gòu)上來說,它消除或者減弱了神經(jīng)元節(jié)點間的聯(lián)合,降低了網(wǎng)絡(luò)對單個神經(jīng)元的依賴,從而增強了泛化能力。不過也有另外的一些研究從數(shù)據(jù)增強的角度來思考這個問題。
那么,就真的不擔(dān)心dropout會把一些非常重要的神經(jīng)元刪除嗎?最新的神經(jīng)科學(xué)的研究以及DeepMind等研究人員通過對神經(jīng)元進行隨機刪除來研究網(wǎng)絡(luò)性能,發(fā)現(xiàn)雖然某些神經(jīng)元確實很重要,它們會選擇性激活特定輸入,比如只對輸入貓圖特別敏感,對其他輸入則完全不感冒,但是刪除這一類神經(jīng)元仍然不影響網(wǎng)絡(luò)能識別到貓。
這說明網(wǎng)絡(luò)中未必少了誰就不行。不過反過來,上面說到的單個像素的攻擊,則說明又有某些神經(jīng)元至關(guān)重要。關(guān)于這其中的關(guān)系,仍然是研究熱門,還是不斷跟進更多最新的研究吧。
取平均的作用: 先回到正常的模型(沒有dropout),我們用相同的訓(xùn)練數(shù)據(jù)去訓(xùn)練5個不同的神經(jīng)網(wǎng)絡(luò),一般會得到5個不同的結(jié)果,此時我們可以采用 “5個結(jié)果取均值”或者“多數(shù)取勝的投票策略”去決定最終結(jié)果。(例如 3個網(wǎng)絡(luò)判斷結(jié)果為數(shù)字9,那么很有可能真正的結(jié)果就是數(shù)字9,其它兩個網(wǎng)絡(luò)給出了錯誤結(jié)果)。這種“綜合起來取平均”的策略通常可以有效防止過擬合問題。因為不同的網(wǎng)絡(luò)可能產(chǎn)生不同的過擬合,取平均則有可能讓一些“相反的”擬合互相抵消。dropout掉不同的隱藏神經(jīng)元就類似在訓(xùn)練不同的網(wǎng)絡(luò)(隨機刪掉一半隱藏神經(jīng)元導(dǎo)致網(wǎng)絡(luò)結(jié)構(gòu)已經(jīng)不同),整個dropout過程就相當(dāng)于 對很多個不同的神經(jīng)網(wǎng)絡(luò)取平均。而不同的網(wǎng)絡(luò)產(chǎn)生不同的過擬合,一些互為“反向”的擬合相互抵消就可以達到整體上減少過擬合。
減少神經(jīng)元之間復(fù)雜的共適應(yīng)關(guān)系: 因為dropout程序?qū)е聝蓚€神經(jīng)元不一定每次都在一個dropout網(wǎng)絡(luò)中出現(xiàn)。(這樣權(quán)值的更新不再依賴于有固定關(guān)系的隱含節(jié)點的共同作用,阻止了某些特征僅僅在其它特定特征下才有效果的情況)。 迫使網(wǎng)絡(luò)去學(xué)習(xí)更加魯棒的特征 (這些特征在其它的神經(jīng)元的隨機子集中也存在)。換句話說假如我們的神經(jīng)網(wǎng)絡(luò)是在做出某種預(yù)測,它不應(yīng)該對一些特定的線索片段太過敏感,即使丟失特定的線索,它也應(yīng)該可以從眾多其它線索中學(xué)習(xí)一些共同的模式(魯棒性)。(這個角度看 dropout就有點像L1,L2正則,減少權(quán)重使得網(wǎng)絡(luò)對丟失特定神經(jīng)元連接的魯棒性提高)
(還有一個比較有意思的解釋是,Dropout類似于性別在生物進化中的角色:物種為了生存往往會傾向于適應(yīng)這種環(huán)境,環(huán)境突變則會導(dǎo)致物種難以做出及時反應(yīng),性別的出現(xiàn)可以繁衍出適應(yīng)新環(huán)境的變種,有效的阻止過擬合,即避免環(huán)境改變時物種可能面臨的滅絕。 當(dāng)?shù)厍蚨际呛Q髸r,人類是不是也進化出了再海里生活的能力呢?)
總之一句話,不怕刪了誰。就dropout的使用方法而言,我們平常只更改dropout的比例,作者對此還有更多的建議。
(1) 因為dropout降低了模型的性能,所以對于原本需要容量為N的網(wǎng)絡(luò)才能解決的問題,現(xiàn)在需要N/p,p就是保留該節(jié)點的概率,這個概率通常在0.5~0.9之間,p=1就是普通的網(wǎng)絡(luò)了。
(2) 因為dropout相當(dāng)于增加了噪聲,造成梯度的損失,所以需要使用更大的學(xué)習(xí)率和動量項。與此同時,對權(quán)重進行max-norm等權(quán)重約束方法,使其不超過某個值。
(3) 訓(xùn)練更久,很好理解。
對dropout方法,還有很多的變種,包括dropout connect,maxout,stochastic depth等。
一個神經(jīng)元的輸出實際上是由輸入以及參數(shù)來共同決定,dropout把神經(jīng)元的值設(shè)置為0了,那是不是也可以把參數(shù)設(shè)置為0呢?這就是drop connect,而且它可以比dropout更加靈活,可視為Dropout的一般化形式,從模型集成的角度來看,Dropout是2^n個模型的平均,那DropConnect呢?它應(yīng)該更多,因為權(quán)重連接的數(shù)目比節(jié)點數(shù)本身更多,所以DropConnect模型平均能力更強。
Drop Connect和Dropout均引入了稀疏性,不同之處在于Drop Connect引入的是權(quán)重的稀疏而不是層的輸出向量的稀疏。
另外,在dropout這一個思路上做相關(guān)文章的還有一些,比如maxout,是一種激活函數(shù),它對N個輸入選擇最大的作為激活輸出。比如隨機pooling,是一種池化方法。比如stochastic depth,它用在帶有殘差結(jié)構(gòu)的網(wǎng)絡(luò)中,將某些res block直接設(shè)置為等價映射。還有backdrop,在前向的時候不drop,在梯度反傳的時候才做。
2、參數(shù)正則化方法
L2/L1正則化方法,就是最常用的正則化方法,它直接來自于傳統(tǒng)的機器學(xué)習(xí)。
L2正則化方法如下:
L1正則化方法如下:
這么來看上面的那張圖,參數(shù)空間(w1,w2)是一個二維平面,藍色部分是一個平方損失函數(shù),黃色部分是正則項。
藍色的那個圈,中心的點其實代表的就是損失函數(shù)最優(yōu)的點,而同心圓則代表不同的參數(shù)相同的損失,可見隨著圓的擴大,損失增大。黃色的區(qū)域也類似,周邊的紅色線表示的是損失相同點的輪廓。
正則項的紅色輪廓線示平方損失的藍色輪廓線總要相交,才能使得兩者加起來的損失最小,兩者的所占區(qū)域的相對大小,是由權(quán)重因子決定的。不管怎么說,它們總有一個交叉點。
對于L2正則化,它的交點會使得w1或者w2的某一個維度特別小,而L1正則化則會使得w1或者w2的某一個維度等于0,因此獲得所謂的稀疏化
在深度學(xué)習(xí)框架中,大家比起L1范數(shù),更鐘愛L2范數(shù),因為它更加平滑和穩(wěn)定。
3、隱式正則化方法
前面說了兩種正則化方法,第一種,通過對網(wǎng)絡(luò)結(jié)構(gòu)的修改或者在使用方法上進行調(diào)整。第二種,直接對損失函數(shù)做了修改。這兩種方法,其實都應(yīng)該算作顯式的正則化方法,因為在做這件事的過程中, 我們是有意識地知道自己在做正則化。
但是還有另一種正則化方法,它是隱式的正則化方法,并非有意識地直接去做正則化,卻甚至能夠取得更好的效果,這便是數(shù)據(jù)有關(guān)的操作,包括歸一化方法和數(shù)據(jù)增強,擾亂標(biāo)簽。
[參考文獻]:
[1]: https://blog.csdn.net/hacker_long/article/details/88430542
總結(jié)
以上是生活随笔為你收集整理的深度学习提高泛化能力的技术的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 火山安卓19开发答题App
- 下一篇: 用python程序计算勾股数,用Pyth