文中部分圖片摘自吳恩達(dá)deeplearning課程的作業(yè)导帝,代碼及課件在我的github:
?DeepLearning 課件及作業(yè)
關(guān)于本篇正則化的具體路徑是:
?正則化作業(yè)
正則化的概念及原因
簡單來說癌刽,正則化是一種為了減小測試誤差的行為(有時(shí)候會(huì)增加訓(xùn)練誤差)穷缤。我們?cè)跇?gòu)造機(jī)器學(xué)習(xí)模型時(shí)槽片,最終目的是讓模型在面對(duì)新數(shù)據(jù)的時(shí)候灯抛,可以有很好的表現(xiàn)妇押。當(dāng)你用比較復(fù)雜的模型比如神經(jīng)網(wǎng)絡(luò),去擬合數(shù)據(jù)時(shí)跳昼,很容易出現(xiàn)過擬合現(xiàn)象(訓(xùn)練集表現(xiàn)很好般甲,測試集表現(xiàn)較差),這會(huì)導(dǎo)致模型的泛化能力下降鹅颊,這時(shí)候敷存,我們就需要使用正則化,降低模型的復(fù)雜度堪伍。
正則化的幾種常用方法
- L1 & L2范數(shù)
首先介紹一下范數(shù)的定義锚烦,假設(shè) 是一個(gè)向量,它的
范數(shù)定義:
在目標(biāo)函數(shù)后面添加一個(gè)系數(shù)的“懲罰項(xiàng)”是正則化的常用方式帝雇,為了防止系數(shù)過大從而讓模型變得復(fù)雜涮俄。在加了正則化項(xiàng)之后的目標(biāo)函數(shù)為:
式中, 是一個(gè)常數(shù)摊求,
為樣本個(gè)數(shù)禽拔,
是一個(gè)超參數(shù)刘离,用于控制正則化程度室叉。
正則化時(shí)睹栖,對(duì)應(yīng)懲罰項(xiàng)為 L1 范數(shù) :
正則化時(shí),對(duì)應(yīng)懲罰項(xiàng)為 L2 范數(shù):
從上式可以看出茧痕, 正則化通過讓原目標(biāo)函數(shù)加上了所有特征系數(shù)絕對(duì)值的和來實(shí)現(xiàn)正則化野来,而
正則化通過讓原目標(biāo)函數(shù)加上了所有特征系數(shù)的平方和來實(shí)現(xiàn)正則化。
兩者都是通過加上一個(gè)和項(xiàng)來限制參數(shù)大小踪旷,卻有不同的效果: 正則化更適用于特征選擇曼氛,而
正則化更適用于防止模型過擬合。
讓我們從梯度下降的角度入手令野,探究兩者的區(qū)別舀患。
為了方便敘述,假設(shè)數(shù)據(jù)只有兩個(gè)特征即 气破,考慮
正則化的目標(biāo)函數(shù):
在每次更新 時(shí):
若 為正數(shù)聊浅,則每次更新會(huì)減去一個(gè)常數(shù);若
為負(fù)數(shù)现使,則每次更新會(huì)加上一個(gè)常數(shù)低匙,所以很容易產(chǎn)生特征的系數(shù)為 0 的情況,特征系數(shù)為 0 表示該特征不會(huì)對(duì)結(jié)果有任何影響碳锈,因此
正則化會(huì)讓特征變得稀疏顽冶,起到特征選擇的作用。
現(xiàn)考慮 正則化的目標(biāo)函數(shù):
在每次更新 時(shí):
從上式可以看出每次更新時(shí)售碳,會(huì)對(duì)特征系數(shù)進(jìn)行一個(gè)比例的縮放而不是像 正則化減去一個(gè)固定值强重,這會(huì)讓系數(shù)趨向變小而不會(huì)變?yōu)?0,因此
正則化會(huì)讓模型變得更簡單贸人,防止過擬合竿屹,而不會(huì)起到特征選擇的作用。
以上就是 正則化的作用以及區(qū)別灸姊。
下面來看一個(gè)課程中的例子拱燃,當(dāng)不使用正則化,發(fā)生過擬合時(shí):
使用 正則化力惯,正常擬合
在圖中可以有比較直觀的感受是碗誉,過擬合時(shí),分類邊界的起伏會(huì)更大父晶,也就是在部分點(diǎn)斜率更大哮缺,而正常擬合時(shí),分類邊界更加平緩甲喝。這也是為什么在目標(biāo)函數(shù)中加入“懲罰項(xiàng)”可以達(dá)到正則化的效果尝苇,“懲罰項(xiàng)”可以使每個(gè)參數(shù)趨向更小,在求導(dǎo)時(shí)斜率也會(huì)更小,等于變相的讓模型更加簡單了糠溜,更加簡單的模型當(dāng)然更加不容易過擬合淳玩。
訓(xùn)練集增強(qiáng)
更大數(shù)量的訓(xùn)練集是提升機(jī)器學(xué)習(xí)模型泛化能力最好的方法。做一個(gè)不可能的假設(shè)非竿,如果你的訓(xùn)練集包含了所有的你需要測試的數(shù)據(jù)蜕着,那么該模型的泛化能力將是100%(開個(gè)玩笑)。在實(shí)際項(xiàng)目中红柱,獲取訓(xùn)練數(shù)據(jù)的成本會(huì)很高承匣,這時(shí)候就需要我們自己來“創(chuàng)造”數(shù)據(jù)。希望在以后锤悄,GAN可以成功的應(yīng)用到訓(xùn)練集增強(qiáng)領(lǐng)域韧骗。
對(duì)于一些特定的場景,“創(chuàng)造”數(shù)據(jù)其實(shí)是很簡單的零聚,例如圖像識(shí)別袍暴。下面有一張6,我們可以對(duì)他采用小幅旋轉(zhuǎn)握牧,平移容诬,放大,縮小甚至給圖片加上波動(dòng)等方法沿腰,他的標(biāo)簽實(shí)際還是6览徒,但是我們已經(jīng)多了很多的訓(xùn)練數(shù)據(jù)。需要注意的是不應(yīng)做翻轉(zhuǎn)操作颂龙,因?yàn)?會(huì)翻轉(zhuǎn)成9习蓬,這會(huì)變成一個(gè)錯(cuò)誤的樣本。
dropout
dropout 是一種計(jì)算方便但功能強(qiáng)大的正則化方法措嵌,適用于最近很火的神經(jīng)網(wǎng)絡(luò)躲叼。他的基本步驟是在每一次的迭代中,隨機(jī)刪除一部分節(jié)點(diǎn)企巢,只訓(xùn)練剩下的節(jié)點(diǎn)枫慷。每次迭代都會(huì)隨機(jī)刪除,每次迭代刪除的節(jié)點(diǎn)也都不一樣浪规,相當(dāng)于每次迭代訓(xùn)練的都是不一樣的網(wǎng)絡(luò)或听,通過這樣的方式降低節(jié)點(diǎn)之間的關(guān)聯(lián)性以及模型的復(fù)雜度,從而達(dá)到正則化的效果笋婿。這點(diǎn)上有點(diǎn)類似 bagging誉裆,但是遠(yuǎn)比 bagging 來的簡單。
直觀理解:
說dropout簡單是因?yàn)槟阒恍枰O(shè)置一個(gè)超參數(shù) keep_prob缸濒,這個(gè)參數(shù)的意義是每層節(jié)點(diǎn)隨機(jī)保留的比例足丢,比如將 keep_prob 設(shè)置為 0.7粱腻,那么就會(huì)隨機(jī)30%的節(jié)點(diǎn)消失,消失這個(gè)動(dòng)作其實(shí)很簡單斩跌,只是將這一層的參數(shù)矩陣與根據(jù) keep_prob 生成的 {0, 1} 矩陣做 逐點(diǎn)乘積绍些,當(dāng)然前向傳播與反向傳播都需要做以上的操作。
dropout的缺點(diǎn)在于滔驶,需要將訓(xùn)練集分為不同子集輸入每一次的迭代遇革,這就需要較大的訓(xùn)練集卿闹,所以在訓(xùn)練集較小的情況下揭糕,dropout的效果可能并不好。我們上面也說過锻霎,增大數(shù)據(jù)集是最好的正則化方式著角,所以在增大數(shù)據(jù)集的情況下,使用 dropout 需要使用的計(jì)算代價(jià)可能會(huì)比他帶來正則化效果更高旋恼,這需要我們?cè)趯?shí)際使用場景中做取舍吏口。
earlystopping
提前終止可能是最簡單的正則化方式,他適用于模型的表達(dá)能力很強(qiáng)的時(shí)候冰更。這種情況下产徊,一般訓(xùn)練誤差會(huì)隨著訓(xùn)練次數(shù)的增多逐漸下降,而測試誤差則會(huì)先下降而后再次上升蜀细。我們需要做的就是在測試誤差最低的點(diǎn)停止訓(xùn)練即可舟铜。
下面還是一個(gè)DL課程中的例子,分別展示了訓(xùn)練1500次與2500次時(shí)的訓(xùn)練誤差與測試誤差:
可以看出隨著訓(xùn)練次數(shù)的增加,訓(xùn)練誤差會(huì)一直下降归斤,而訓(xùn)練2500次的測試誤差要高于訓(xùn)練1500次的測試誤差痊夭,所以我們?cè)?500次的時(shí)候停止會(huì)更好。
以上就是機(jī)器學(xué)習(xí)中常用的幾種正則化方式脏里,正則化在機(jī)器學(xué)習(xí)中占了很重的地位她我,在《deep learning》中介紹了更多的正則化方法,有興趣的同學(xué)可以深入研究迫横。
如果你想用 Pytorch 做訓(xùn)練的話可以看看我的另一篇: 如何用 Pytorch 訓(xùn)練一個(gè)分類模型番舆?
最后,求贊求關(guān)注员淫,歡迎關(guān)注我的微信公眾號(hào)[MachineLearning學(xué)習(xí)之路] 合蔽,深度學(xué)習(xí) & CV 方向的童鞋不要錯(cuò)過!介返!