import tensorflow as tf
import tensorflow.contrib as contrib
weight=tf.constant([[1,-2],
[-3,4]],dtype=tf.float32)
with tf.session() as sess:
init=tf.global_variables_initializer()
sess.run(init)
# l1正則化輸出為(|1|+|-2|+|-3|+|4|)*0.5=5
print(sess.run(contrib.layers.l1_regularizer(0.5)(weight)))
# l2正則化輸出為(1²+(-2)²+(-3)²+4²)/2*0.5=7.5
print(sess.run(contrib.layers.l2_regularizer(0.5)(weight)))
# l1和l2正則化
print(sess.run(contrib.layers.l1_l2_regularizer(0.5,0.5)(weight)))
提高泛化能力,防止過擬合,大多數正則化策略都會對估計進行正則化,估計的正則化以偏差的增加換取方差的減少
正則化方法是在訓練資料不夠多時,或者over training時,常常會導致過擬合(overfitting)。這時向原始模型引入額外資訊,以便防止過擬合和提高模型泛化效能的一類方法的統稱。
正則化可以幫助防止過度配合,提高模型的適用性。(讓模型無法完美匹配所有的訓練項。)(使用規則來使用盡量少的變數去擬合資料)
通俗來說 正則化就是說給需要訓練的目標函式加上一些規則(限制),讓他們不要自我膨脹。
l1 正則化在原始的代價函式後面加上乙個 l1 正則化項,即所有權值 w 的絕對值的和,乘以 λ/n。l1 正則化項的效果是讓權值 w 往 0 靠,使網路中的權值盡可能為 0,也就相當於減小了網路複雜度,防止過擬合。事實上,l1 正則化能產生稀疏性,導致 w 中許多項變成零。
l2 正則化,會在代價函式後面再加上乙個正則化項
其中,c0代表原始的代價函式,後面加上 l2 正則化項。事實上,l2 正則化將所有引數 w 的平方的和,乘以 λ/2n。。λ 就是正則項係數,而係數 1/2,主要是為了求導的結果方便,後面那一項求導會產生乙個 2,與 1/2 相乘剛好湊整。
l2 正則化項的效果是減小權值 w。事實上,更小的權值 w,從某種意義上說,表示網路的複雜度更低,對資料的擬合剛剛好。
tf.contrib.layers.l1_regularizer(scale, scope=none)
tf.contrib.layers.l2_regularizer(scale, scope=none)
其中,有兩個重要的引數。
現在,來看乙個案例。這個案例中,我們使用了tf.contrib.layers.l2_regularizer(scale, scope=none)
函式。其中, lambd 引數表示來正則化項的權重,w 為需要計算正則化損失的引數。
loss = tf.reduce_mean(tf.square(y-y_) + tf.contrib.layers.l2_regularizer(lambd)(w))
這兩個引數是用兩個括號括起來的,與我們平時寫在乙個括號,用逗號分隔開不一樣。
tf.nn.dropout是tensorflow裡面為了防止或減輕過擬合而使用的函式,它一般用在全連線層
tf.nn.dropout(x, keep_prob, noise_shape=none, seed=none,name=none)
改變神經網路本身的結構,對於同一組訓練資料,利用不同的神經網路訓練之後,求其輸出的平均值可以減少overfitting
參考部落格
機器學習的l1和l2規範
Tensorflow 中新增正則化項
為防止網路過擬合,在損失函式上增加乙個網路引數的正則化項是乙個常用方法,下面介紹如何在tensorflow中新增正則化項。tensorflow中對引數使用正則項分為兩步 下面詳細介紹 step1 建立乙個正則化方法 regularizer l1 tf.contrib.layers.l1 regula...
TensorFlow正則化小結
在設計深度學習模型的時候,我們經常需要使用正則化 regularization 技巧來減少模型的過擬合效果,例如 l1 正則化 l2 正則化等。在keras中,我們可以方便地使用三種正則化技巧 那麼,我們應該如何使用這三種正則化技巧呢?以keras中的dense層為例,我們發現有以下三個引數 這三個...
L2正則化的TensorFlow實現
tensorflow實現l2正則化 tensorflow的最優化方法tf.train.gradientdescentoptimizer包辦了梯度下降 反向傳播,所以基於tensorflow實現l2正則化,並不能按照上節的演算法直接干預權重的更新,而要使用tensorflow方式 tf.add to ...