深度學習秘籍
我們都知道深度學習分下圖紅框中的3步阱冶,然后我就就形成了自己的神經網絡,我們就直接拿去測試集上實驗嗎滥嘴,不木蹬,我們先要保證在訓練集上有比較好的效果,否則訓練集誤差都比較大若皱,那就說明之前的步驟有問題届囚,導致整體有偏差有梆,我們需要修改直到我們在訓練集上有比較滿意的結果,然后我們才可以在測試集測試意系,如果測試集上是比較好的效果泥耀,那我們的模型訓練至此結束,如果不行蛔添,那就是訓練集好測試集不好痰催,就是過擬合了,我們就需要從頭開始從新考慮模型的創(chuàng)建迎瞧,創(chuàng)建完畢后還是需要先考慮訓練集夸溶,直至訓練集和測試集雙優(yōu)。
我們能把所有錯誤都歸于過擬合嗎凶硅,比如上圖中我們沒有看訓練集準確率缝裁,直接看測試集結果,我們可能覺得測試集效果不好就是過擬合足绅,這是不準確的捷绑,我們先看下圖右,56層的神經網絡比20層的神經網絡在相同迭代次數氢妈,錯誤率高粹污,但實際我們去觀察訓練集錯誤率,56層就已經比20層錯誤率高了首量,有人會把這叫做欠擬合壮吩,這是不準確的,一般的欠擬合是參數少導致擬合不準確加缘,56層比20層多36層鸭叙,參數多,完全可以后36層什么都不干拣宏,可能是因為學習率或者其他問題沈贝,導致停留在了局部最低點。
我們對應訓練集和測試集的好壞都有具體的解決方法蚀浆,先分析訓練集的數據差可能的原因
我們首先考慮的就是激活函數我們一直在用的就是sigmoid函數缀程,下圖中我們使用神經元數量和準確率的關系搜吧,也許有人就會說市俊,哇,你這是層數多過擬合了滤奈,但是請仔細看好摆昧,這是訓練集上的數據,為什么這樣呢蜒程,我們來分析
我們這種情況訓練時绅你,常常是訓練著就發(fā)現靠近輸入端的w梯度很小伺帘,學習很慢,相對的忌锯,靠近輸出的w就梯度較大伪嫁,學習較快,很容易就到了局部的最小點
因為我們使用了sigmoid函數(只分布在0,1之間)偶垮,函數本身會使w得變化對后級影響小张咳,隨著層數增加越來越小,這就是原因似舵。
我們發(fā)現sigmoid有不好用的地方脚猾,于是就有了relu激活函數,relu的特性是輸入≥0砚哗,輸出就是輸入龙助,輸入<0,輸出就是0蛛芥。
我們選用relu有什么優(yōu)點呢:
1便于計算
2有些生物上的仿生技術
3一個relu函數等同于無窮多個不同偏置的sigmoid函數疊加
4我們可以解決梯度消失的問題
我們知道relu的函數特性提鸟,當輸入大于0,輸出就是輸入常空,當輸入小于0沽一,輸出就是0茎活,下圖中有0的神經元的情況下策精,我們其實就可以將這個神經元拿掉
我們把0輸出的神經元拿掉阳欲,剩下的其實就是線性的神經元盐类,整個模型就變成了瘦的線性的網絡棘劣,我們w的改變就不會因為層級的問題而對輸出影響越來越小锻霎。
老師提了一個問題赤惊,如果我們模型是個線性的模型敲长,而我們本來想用的是非線性的復雜模型醉鳖,這不就無法達到我們的效果了嗎捡硅,其實我們的神經網絡還是個非線性模型,比如一個樣本特征輸入可能導致部分工作的模型實現線性模型盗棵,但是另一個樣本經過神經網絡可能開啟(輸出大于0)新的神經元壮韭,同時關閉一部分神經(輸出為0)元來工作,他們的線性模型就不一樣纹因,總體來說就還是非線性的
我們也許還會提問喷屋,我們的反向傳播會用到激活函數的導數,激活函數在0,0處并不可導瞭恰,其實我們實際操作就是大于等于0導數都按1屯曹,小于0都是0,這樣計算也快
relu的變種,我們知道relu函數當x小于0輸出0恶耽,會導致有些w梯度變化無用密任,這時就有人想出來在relu負向做點手腳,就成了下面2個模型偷俭,定制一個,使負向不再是0
Maxout激活函數
什么是Maxout呢浪讳,我們將每層2個計算權重結果構成一個神經元(兩兩預先分好一組),將2組輸出比較大小涌萤,取其大者驻债,其實這跟后面我們知道的Maxpooling原理一樣
我們看下圖maxout的輸出是根據神經元的權重輸入我們取其max得到的結果,圖中z1是wx+b形葬,z2是x軸合呐,取其最大者這里就是我們見過的relu(綠色折線)
如果我們w,b有其他值使z2不是x軸,如下圖右下笙以,就有了如圖的綠色折線部分
所以說maxout是根據數據樣本學習的激活函數淌实,如果我們使用2個元素一組,可以學到類似relu或者絕對值的模型猖腕,如果3個元素一組拆祈,可以類似右下圖的幾種
下面我們就面臨一個問題了,我們這個模型怎么訓練倘感,max不可導放坏,還有反向傳播怎么算?
我們假設圖中紅框內維度部分是較大值老玛,那我們就成了一個線性模型淤年,所以前向傳播和反向傳播的導數就可以求得了,當然不同的樣本會導致每個神經元選擇的元素不一樣蜡豹,構成不同的線性模型
Adaptive Learingrate自適應性學習率
我們訓練集數據不好的時候麸粮,有時候也需要考慮采用自適應性學習率
我們之前學過adagrad調整學習率,比如圖中w1橫向使損失函數變化比較小镜廉,那我們就給與比較大維度學習率弄诲,w2就給與相對比較小的學習率
當然我們的損失函數模型復雜的可能是下圖中的模型,不再是最開始學習率大就大娇唯,到一定位置又需要減小
于是我們就引入了RMSProp的梯度下降法齐遵,我們引入參數(這個參數可以調整),
的初始值就是
,然后將每次的
和g帶入
權重塔插,計算可得出新的
用于更新參數梗摇,所以這還是梯度帶有權重的均方根和,這個
在0,1之間佑淀,我們調整它時留美,使我們的梯度是更偏向之前的梯度,還是新的梯度
解決局部最小點
我們看下圖伸刃,我們都知道很難找到實際上的最小點谎砾,我們很容易停在了局部最小點,或者只是平滑點甚至是高點(只是微分足夠信趼)景图,老師課上說(據說可能有杜撰),我們的最小點就是山谷碉哑,他們往往就是比較多的參數同時達到一個相對較小值時候出現挚币,如果我們采用復雜的神經網絡,參數就不容易生成局部最小點扣典。
我們都知道一個小球從高處落下妆毕,即使是到了最低點,根據慣性我們還是能往前走贮尖,就有可能跳出局部最低點笛粘,我們稱之為動量Momentum
我們秒復習下之前學的梯度下降是怎么進行的,我們在初始點計算梯度湿硝,按照學習率步進一段距離薪前,再計算新的梯度,繼續(xù)步進关斜,知道我們的損失函數趨近于0
我們怎么根據動量定義移動呢示括,假設我們初始在初始速度為0,當我們第一次計算梯度后痢畜,可以計算移動速度垛膝,他是跟上一個移動方向有關的,再開始移動丁稀,我們可以計算出梯度方向紅色虛線繁涂,和原來的方向綠色虛線,將2個方向合成就得到新的方向
我們也可以另一種描述二驰,速度v就是我們之前所有梯度的不同加權求和
我們看下圖扔罪,如果我們的初始位置走,因為初始梯度是向右桶雀,所以向右走矿酵,中間點梯度和原速度都向右,繼續(xù)向右矗积,局部最小點梯度為0但原速度不為0全肮,我們可以繼續(xù)往前走,如果右側山峰不高的話棘捣,我們甚至可能越過去繼續(xù)尋找全局最小點
Adam其實就是RMSProp和Momentum的結合
我們當訓練集已經訓練得不錯辜腺,但是測試集效果不太好的時候的第一種方法,early stoppIng
我們下圖中隨著訓練集重復訓練,訓練集誤差會減小评疗,但是測試集的誤差卻可能增大测砂,我們?yōu)榱苏业綔y試集上的最小點,把訓練集又拆分成訓練集和驗證集
測試集效果差第二個方法是正則化百匆,比如圖中我們引入是w平方和的正則項砌些,是L2正則。而且通常我們不會考慮偏置加匈,我們使用正則通常是使損失函數更平滑存璃,減少局部最低點,而偏置往往和平滑無關
我們分析L2正則雕拼,當我們引入后纵东,對損失函數求導,可以比較出和原來的損失函數的區(qū)別是w的權重變向進行了減小啥寇,學習率和正則系數
乘積一般比較小篮迎,可能回是0.01,0.001等等,結果相當于在原來的微分位置我們先將權重進行了縮小示姿,權重的系數會越來越接近于0甜橱,但總體微分因為還有后一項,不會為0.因為權重在減小栈戳,我們稱之為weight decay
我們也可以使用各權值的絕對值做L1正則岂傲,有人也許會說絕對值怎么求導呢,其實如果不考慮0處子檀,我們可以采用符號函數sgn()作為導數結果镊掖,最終得到的式子比起無正則多了個固定的衰減項(當固定時確定),而且總是使w絕對值減小褂痰。
與L2相比亩进,L2是按W成比例的衰減,當W比較大的時候衰減比較快缩歪,而L1是固定衰減归薛,
L2正則是所有W權重都比較小,L1使局部權重減蟹蓑(很接近于0)主籍,而其他權重往往比較大
類比正則,我們以人腦神經元為例逛球,我們剛出生時候神經元比較小千元,6歲時神經元很多,到14歲神經元又開始減少颤绕,因為有些神經元不用幸海,就會衰退祟身,正則中W權重也是這樣,不怎么更新就會變小
我們講的測試集性能不好的第三個解決方法是Dropout物独,我們先講是怎么做的袜硫,對于每個神經元,都有%p的概率給它拿掉议纯,神經元被丟掉,與其相連的權重也失去了作用
我們丟掉部分神經元后溢谤,模型就變瘦了瞻凤,我開門一般每次去一批次mini-batch訓練得時候,我們更新一次隨機dropout世杀,我們使用dropout的時候阀参,訓練集的數據可能性能會變差點,但是往往測試集打的效果反而好些
我們dropout訓練好模型了瞻坝,測試集就不用dropout了蛛壳,不過我們要對神經元的系數進行處理,比如我們的dropout rate是p%所刀,那我們最后所有的權重都要乘以(100-p)%(圖中小誤)衙荐,比如我們dropout率50%,我們的權重到最后都要乘以0.5
我們?yōu)槭裁磳嘀爻艘韵禂的馗〈矗ㄋ桌斫饩褪怯且鳎琩ropout的時候,我們的神經元會考慮我去掉的隊友可能會不干活斩披,我要好好干溜族,但實際最終合在一起的時候,大家都會認真工作垦沉,所以要乘一點系數
我們舉另一個例子來說明dropout煌抒,比如我們4個神經元,2個被dropout厕倍,但是我們測試時沒有dropout我們的結果就接近之前的2倍寡壮,為了我們測試的性能一致,我們需要乘以系數
我們也把dropout叫做一種終極的ensemble讹弯,我們把訓練集分成若干批次诬像,每個批次訓練一個模型,這些模型都有一定的復雜度闸婴,雖然可能都有些方差坏挠,但是經過他們的綜合,往往就能得到一個比較好的模型
經過上一步訓練得多個模型邪乍,將測試集數據輸入降狠,得到的輸出取平均对竣,我們就能得到一個比較好的結果。
類比下榜配,決策樹我們經常容易過擬合否纬,但是很多棵決策樹組成的隨機森林就能有效的抑制過擬合。
我們?yōu)槭裁凑fdropout是終極的ensemble呢蛋褥,我們假設有M個神經元临燃,每個神經元選擇不選擇就有的模型組合,當然我們一般不會把所有組合都試一遍烙心,但是我們在訓練模型的時候膜廊,相同神經元的權重訓練得是同一個東西,他們之間是共享的
我們看下圖淫茵,當模型是線性的時候爪瓜,dropout事實上就和直接不dropout每個權重乘以系數的模型一樣,但這個前提是模型是線性的匙瘪,通常我們的模型都不是線性的铆铆,所以二者最多是接近,但有時候我們有時候直接乘以系數的結果往往還是worked,比如我們的激活函數用relu,maxout他們相對sigmoid是比較接近線性的丹喻,所以比較worked