2017-03-31 169 views
7

我在Keras的神經網絡參數上使用L1正則化與keras.regularizers.l1(0.01)來獲得稀疏模型。我發現,雖然我的許多係數是關閉歸零,但其中很少是實際爲零。Keras/Tensorflow中的L1正則化*真正* L1正則化嗎?

看着the source code for the regularization,它表明Keras只是將參數的L1範數添加到損失函數中。

這將是不正確的,因爲這些參數幾乎可以肯定不會像L1正則化那樣變爲零(在浮點錯誤之內)。當一個參數爲零時,L1範數是不可微分的,所以如果在優化程序中接近零的地方將參數設置爲零,則需要使用次梯度方法。請參閱軟閾值運算符max(0, ..)here

Tensorflow/Keras是否這樣做,或者這對於隨機梯度下降不切實際?

編輯:另外here是一個很好的博客文章,解釋L1正則化的軟閾值運算符。

+0

'L1'正則化很好。 L1鼓勵稀疏性超過L2,但肯定不能保證。 theano和tensorflow都經過了很好的測試,當然在非微分點附近處理梯度也很好。 – y300

+0

我認爲你是正確的,它的實施方式並沒有使權重實際上達到零。這很不幸。 – Aaron

+0

您如何在「您的」代碼中使用正規化器? –

回答

0

Keras正確實現L1正則化。在神經網絡的情況下,L1正則化簡單地將參數的L1範數與損失函數相加(見CS231)。

雖然L1正則化確實鼓勵稀疏性,但它並不能保證輸出將是稀疏的。來自隨機梯度下降的參數更新本質上是有噪聲的。因此,任何給定參數恰好爲0的概率是微乎其微的。

然而,L1正則化網絡的許多參數通常接近於0.一個基本的方法是將小值設爲0。已經有研究探索更先進的生成稀疏神經網絡的方法。在this paper中,作者同時修剪並訓練了一個神經網絡,以在衆多衆所周知的網絡體系結構上實現90-95%的稀疏性。

2

所以儘管@Joshua答案,還有其他的三件事情是值得一提:

  1. 沒有在0用漸變連接問題。 keras自動將其設置爲1類似於relu的情況。
  2. 請記住,小於1e-6的值實際上等於0,因爲這是float32的精度。
  3. 由於計算原因,由於基於梯度下降的算法的性質(並且設置高值,由於可能由於梯度而可能發生的振盪),可能會出現不將大部分值設置爲0的問題間斷。要理解想象,對於給定的體重w = 0.005,您的學習速率等於0.01,主要損失的梯度等於0 w.r.t.到w

    w = 0.005 - 1 * 0.01 = -0.05 (because gradient is equal to 1 as w > 0), 
    

    和第二次更新後:那麼你的體重會通過以下方式進行更新

    w = -0.005 + 1 * 0.01 = 0.05 (because gradient is equal to -1 as w < 0). 
    

    正如你可能會看到w絕對值即使你申請l1正規化並沒有減少這是由於基於梯度的算法的性質而發生的。當然,這是簡化的情況,但使用l1標準正則化轉換器時,您可能經常會遇到這種振盪行爲。