![](/img/trans.png)
[英]L1 activity regularization and L12 activity regularization with tensorflow
[英]Is the L1 regularization in Keras/Tensorflow *really* L1-regularization?
我正在使用keras.regularizers.l1(0.01)
對keras.regularizers.l1(0.01)
神經網絡參數進行L1正則化,以獲得稀疏模型。 我發現,雖然我的許多系數都接近於零,但實際上很少有系數為零。
在查看正則化的源代碼時 ,它表明Keras只是將參數的L1范數添加到損失函數中。
這將是不正確的,因為參數幾乎肯定永遠不會像L1正則化那樣變為零(在浮點誤差內)。 當參數為零時,L1范數不可微分,因此如果參數設置為零(如果在優化例程中足夠接近零),則需要使用次梯度方法。 請在此處查看軟閾值運算符max(0, ..)
。
Tensorflow / Keras是否會這樣做,或者這對隨機梯度下降是否不切實際?
編輯: 這里還有一篇精湛的博客文章,解釋了L1正則化的軟閾值運算符。
所以盡管@Joshua回答,還有其他三件事值得一提:
0
的漸變沒有問題。 keras
自動將其設置為1
類似於relu
case。 1e-6
值實際上等於0
因為這是float32
precision。 由於基於梯度下降的算法(並且設置高l1
值)的性質,由於計算原因可能出現不將大多數值設置為0
問題,因為可能由於梯度不連續而發生振盪。 要理解想象,對於給定的權重w = 0.005
你的學習率等於0.01
,主要損失的梯度等於0
wrt到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).
正如您所看到的,即使您應用l1
正則化, w
的絕對值也沒有減少,這是由於基於梯度的算法的性質而發生的。 當然,這是簡化的情況,但是當使用l1
范數正則化器時,您可能經常會遇到這種振盪行為。
Keras正確地實現了L1正則化,但這不是LASSO。 對於LASSO,需要一個軟閾值函數,如原始帖子中正確指出的那樣。 對於類似於keras.layers.ThresholdedReLU(theta = 1.0)的函數來說非常有用,但是對於x> theta,f(x)= x,對於x <-the,f(x)= x,f(x) )= 0否則。 對於LASSO,theta將等於學習速率乘以L1函數的正則化因子。
TL; DR:深度學習框架中的表述是正確的,但目前我們沒有強大的求解器/優化器來完全解決它與SGD或其變體。 但是如果使用近端優化器,則可以獲得稀疏解。
你的觀察是正確的。
次梯度下降對於非光滑函數(例如Lasso目標)具有非常差的收斂性質,因為它只是通過查看整個目標的子梯度來完全忽略問題結構(它不區分最小二乘擬合和正則化項) 。 直觀地,在(子)梯度的方向上采取小步驟通常不會導致坐標精確地等於零。
tf.train.ProximalAdagradOptimizer
)是否會導致稀疏解決方案,但您可能會嘗試一下。 另一個簡單的工作是在訓練之后或在每個梯度下降步驟之后將小權重(即:絕對值<1e-4)歸零以強制稀疏。 這只是一種方便的啟發式方法,在理論上並不嚴謹。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.