最近,我在 Keras 中使用內核約束來限制訓練期間的梯度。對于我的用例(回歸),我發現NonNeg約束非常有用。
據我了解,NonNeg 類將梯度限制為僅正數(可能使用絕對梯度)。因此,我想知道在添加 NonNeg 約束時,使用線性激活layers.Dense(1, activation = "linear", kernel_constraint = "non_neg")與 ReLU 激活激活層之間是否有任何區別。layers.Dense(1, activation = "relu", kernel_constraint = "non_neg")你有一些見解嗎?
uj5u.com熱心網友回復:
這取決于層的輸入。(注意:這個約束只影響層的“權重”,而不影響梯度)
因此,如果您“只有正權重”,則會發生以下情況:
如果輸入為正:
- 輸出將為正(正 x 正 = 正)
- ReLU 永遠不會完成它的作業,它將等同于線性
如果輸入可以為負:
- 輸出可以為負(正 x 負 = 負)
- ReLU 會做它的作業,它將不同于線性
所以,如果你像這樣堆疊兩層:
- 具有“ReLU”或“sigmoid”的第一層(僅正輸出)
- 具有 NonNeg 約束的下一層
第二層總是會有積極的結果,因此 ReLU 不會像第二層那樣作業。
如果您將整個模型與 NonNeg 和 ReLU 疊加,則只有第一層才能正確利用 ReLU(并且僅當輸入資料可以為負時)。
好奇這個內核約束是如何作業的:
- Keras 計算梯度
- Keras 為權重添加漸變
- 如果在此之后權重變為負數
- 使權重為 0
當然,梯度仍然可以是負數。如果梯度只能是正數,那么最終你的權重會增長到無窮大。內核約束不會以任何方式改變梯度。
uj5u.com熱心網友回復:
Akernel_constraint影響層的權重。它通過在每個梯度步驟之后將約束函式應用于權重來作業。NonNeg,特別是,將所有負權重設定為 0(它不使用絕對值)。因此:
- 它根本不影響梯度,除了權重 >= 0 會對梯度產生的任何影響。
- 它實際上也不“尊重”梯度——如果基于梯度的優化將權重推到 < 0 的值,則約束將直接將其設定為 0。
- 它與
ReLU激活不同,因為 relu 將激活設定為 >= 0,這再次與權重和/或梯度 >= 0 完全不同。
您可以說的一件事是:如果您的輸入全部 >= 0,并且您通過 將權重限制為 >= 0 kernel_constraint=NoneNeg,則層輸出必然為 >= 0 并且relu確實沒有效果,因此您可以使用線性激活。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/432306.html
