TensorFlow(7)- 防止過擬合之正則化

?1、過擬合問題

在本系列第三篇文章TensorFlow(3)- 防止過擬合之dropout中已經(jīng)談到過過擬合問題:所謂過擬合,指的是當(dāng)一個(gè)模型過為復(fù)雜之后,它可以很好地“記憶”每一個(gè)訓(xùn)練數(shù)據(jù)中隨機(jī)噪音的部分而忘記了要去“學(xué)習(xí)”訓(xùn)練數(shù)據(jù)中通用的趨勢。舉一個(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)能讓解更加簡單,符合奧卡姆剃刀理論,同時(shí)也比較符合在偏差和方差(方差表示模型的復(fù)雜度)分析中,通過降低模型復(fù)雜度,得到更小的泛化誤差,降低過擬合程度。

L1正則化和L2正則化:

L1正則化就是在loss function后邊所加正則項(xiàng)為L1范數(shù),加上L1范數(shù)容易得到稀疏解(0比較多)。L2正則化就是loss function后邊所加正則項(xiàng)為L2范數(shù)的平方,加上L2正則相比于L1正則來說,得到的解比較平滑(不是稀疏),但是同樣能夠保證解中接近于0(但不是等于0,所以相對(duì)平滑)的維度比較多,降低模型的復(fù)雜度。

詳細(xì)的解釋和原理請參照:https://zhuanlan.zhihu.com/p/35356992


?2、正則化

正則化的思想就是在損失函數(shù)中加入刻畫模型復(fù)雜程度的指標(biāo)。假設(shè)用于刻畫模型在訓(xùn)練數(shù)據(jù)上表現(xiàn)的損失函數(shù)為J(\theta )的,那么在優(yōu)化時(shí)不是直接優(yōu)化J(\theta )的,而是優(yōu)化J(\theta )+R(w)。其中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ì)算公式是:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?R(w ) = ||w||_{1}  = \sum_{i}|w_{i} |

另一種是L2 正則化,計(jì)算公式是:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??R(w ) = ||w||_{2}^2   = \sum_{i}|w_{i}^2  |?????????????????

無論是哪一種正則化方式,基本的思想都是希望通過限制權(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)化要更加簡潔。優(yōu)化帶LI正則化的損失函數(shù)要更加復(fù)雜,而且優(yōu)化方法也有很多種。在實(shí)踐中,也可以將LI正則化和L2正則化同時(shí)使用,如:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??R(w) =  \sum_{i}\alpha |w_{i} | + (1-\alpha )w_{i}^2


3、簡單的例子

前面我們提到過tensorflow可以優(yōu)化任意形式的損失函數(shù),所以tensorflow自然也可以優(yōu)化帶正則化的損失函數(shù)。以下代碼給出了一個(gè)簡單的帶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è)引子,更多的信息就請大家自己探索啦

?參考文獻(xiàn):

1.書籍:Tensorflow:實(shí)戰(zhàn)Google深度學(xué)習(xí)框架(第二版)

2.?L1正則化與L2正則化

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容