?1实辑、過擬合問題
在本系列第三篇文章TensorFlow(3)- 防止過擬合之dropout中已經(jīng)談到過過擬合問題:所謂過擬合颈娜,指的是當(dāng)一個(gè)模型過為復(fù)雜之后镊讼,它可以很好地“記憶”每一個(gè)訓(xùn)練數(shù)據(jù)中隨機(jī)噪音的部分而忘記了要去“學(xué)習(xí)”訓(xùn)練數(shù)據(jù)中通用的趨勢(shì)匹舞。舉一個(gè)極端的例子排宰,如果一個(gè)模型中的參數(shù)比訓(xùn)練數(shù)據(jù)的總數(shù)還多似芝,那么只要訓(xùn)練數(shù)據(jù)不沖突,這個(gè)模型完全可以記住所有訓(xùn)練數(shù)據(jù)的結(jié)果從而使得損失函數(shù)為0板甘〉澄停可以直觀地想象一個(gè)包含n 個(gè)變量和n 個(gè)等式的方程組,當(dāng)方程不沖突時(shí)盐类,這個(gè)方程組是可以通過數(shù)學(xué)的方法來求解的寞奸。然而,過度擬合訓(xùn)練數(shù)據(jù)中的隨機(jī)噪音雖然可以得到非常小的損失函數(shù)在跳,但是對(duì)于未知數(shù)據(jù)可能無法做出可靠的判斷枪萄。
除了之前介紹過的dropout來解決這個(gè)問題之外,另一非常常用的方法就是我們今天的主角-正則化猫妙。
至于為什么正則化之所以能夠降低過擬合的原因在于瓷翻,正則化是結(jié)構(gòu)風(fēng)險(xiǎn)最小化的一種策略實(shí)現(xiàn)。
給loss function加上正則化項(xiàng)割坠,能使得新得到的優(yōu)化目標(biāo)函數(shù)h = f+normal齐帚,需要在f和normal中做一個(gè)權(quán)衡(trade-off),如果還像原來只優(yōu)化f的情況下彼哼,那可能得到一組解比較復(fù)雜对妄,使得正則項(xiàng)normal比較大,那么h就不是最優(yōu)的敢朱,因此可以看出加正則項(xiàng)能讓解更加簡(jiǎn)單剪菱,符合奧卡姆剃刀理論,同時(shí)也比較符合在偏差和方差(方差表示模型的復(fù)雜度)分析中拴签,通過降低模型復(fù)雜度琅豆,得到更小的泛化誤差,降低過擬合程度篓吁。
L1正則化和L2正則化:
L1正則化就是在loss function后邊所加正則項(xiàng)為L(zhǎng)1范數(shù)茫因,加上L1范數(shù)容易得到稀疏解(0比較多)。L2正則化就是loss function后邊所加正則項(xiàng)為L(zhǎng)2范數(shù)的平方杖剪,加上L2正則相比于L1正則來說冻押,得到的解比較平滑(不是稀疏)驰贷,但是同樣能夠保證解中接近于0(但不是等于0,所以相對(duì)平滑)的維度比較多洛巢,降低模型的復(fù)雜度括袒。
詳細(xì)的解釋和原理請(qǐng)參照:https://zhuanlan.zhihu.com/p/35356992
?2、正則化
正則化的思想就是在損失函數(shù)中加入刻畫模型復(fù)雜程度的指標(biāo)稿茉。假設(shè)用于刻畫模型在訓(xùn)練數(shù)據(jù)上表現(xiàn)的損失函數(shù)為的锹锰,那么在優(yōu)化時(shí)不是直接優(yōu)化的,而是優(yōu)化漓库。其中R(w)刻畫的是模型的復(fù)雜程度恃慧,而λ表示模型復(fù)雜損失在總損失中的比例。注意這里θ表示的是一個(gè)神經(jīng)網(wǎng)絡(luò)中所有的參數(shù)渺蒿,它包括邊上的權(quán)重w和偏置項(xiàng)b痢士。一般來說模型復(fù)雜度只由權(quán)重w決定。常用的刻畫模型復(fù)雜度的函數(shù)R(w)有兩種茂装,一種是LI正則化怠蹂,計(jì)算公式是:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
另一種是L2 正則化,計(jì)算公式是:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???????????????????
無論是哪一種正則化方式少态,基本的思想都是希望通過限制權(quán)重的大小城侧,使得模型不能任意擬合訓(xùn)練數(shù)據(jù)中的隨機(jī)噪音。但這兩種正則化的方法也有很大的區(qū)別彼妻。首先赞庶,Ll 正則化會(huì)讓參數(shù)變得更稀疏,而L2 正則化不會(huì)澳骤。所謂參數(shù)變得更稀疏是指會(huì)有更多的參數(shù)變?yōu)? 歧强,這樣可以達(dá)到類似特征選取的功能。之所以L2 正則化不會(huì)讓參數(shù)變得稀疏的原因是當(dāng)參數(shù)很小時(shí)为肮,比如0.001 摊册,這個(gè)參數(shù)的平方基本上就可以忽略了,于是模型不會(huì)進(jìn)一步將這個(gè)參數(shù)調(diào)整為0 颊艳。其次茅特,LI正則化的計(jì)算公式不可導(dǎo),而L2正則化公式可導(dǎo)棋枕。因?yàn)樵趦?yōu)化時(shí)需要計(jì)算損失函數(shù)的偏導(dǎo)數(shù)白修,所以對(duì)含有L2 正則化損失函數(shù)的優(yōu)化要更加簡(jiǎn)潔。優(yōu)化帶LI正則化的損失函數(shù)要更加復(fù)雜重斑,而且優(yōu)化方法也有很多種兵睛。在實(shí)踐中,也可以將LI正則化和L2正則化同時(shí)使用,如:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
3、簡(jiǎn)單的例子
前面我們提到過tensorflow可以優(yōu)化任意形式的損失函數(shù)祖很,所以tensorflow自然也可以優(yōu)化帶正則化的損失函數(shù)笛丙。以下代碼給出了一個(gè)簡(jiǎn)單的帶L2正則化的損失函數(shù)定義:
# 均方誤差損失函數(shù) + L2正則化項(xiàng)
import tensorflowas tf
w= tf.Variable(tf.random_normal([2,1], stddev=1, seed=1))
y= tf.matmul(x, w)
loss= tf.reduce_mean(tf.square(y- y))+ tf.contrib.layers.l2_regularizer(lambda)(w)
在以上程序中,loss 為定義的損失函數(shù)假颇,它由兩個(gè)部分組成胚鸯。第一個(gè)部分是均方誤差損失函數(shù),它刻畫了模型在訓(xùn)練數(shù)據(jù)上的表現(xiàn)笨鸡。第二個(gè)部分就是正則化姜钳,它防止模型過度模擬訓(xùn)練、數(shù)據(jù)中的隨機(jī)噪音形耗。lambda 參數(shù)表示了正則化項(xiàng)的權(quán)重哥桥,也就是公式J(θ)+λR (w)中的λ。w 為需要計(jì)算正則化損失的參數(shù)趟脂。TensorFlow提供了tf.contrib.layers.12_regularizer函數(shù),它可以返回一個(gè)函數(shù)例衍,這個(gè)函數(shù)可以計(jì)算一個(gè)給定參數(shù)的L2正則化項(xiàng)的值昔期。類似的,tf.contrib.layers.l1_regularizer可以計(jì)算LI正則化項(xiàng)的值佛玄。
本文只是一個(gè)引子硼一,更多的信息就請(qǐng)大家自己探索啦
?參考文獻(xiàn):
1.書籍:Tensorflow:實(shí)戰(zhàn)Google深度學(xué)習(xí)框架(第二版)
2.?L1正則化與L2正則化