問題不在於損失是分段還是非平穩。問題是我們需要一個損失函數,當輸出和預期輸出之間出現錯誤時,可以向網絡參數(dloss/dparameter)發送非零梯度。這適用於幾乎在模型內部使用的任何功能(例如損失功能,激活功能,注意功能)。
例如,感知器使用一個unit step H(x)作爲激活函數(H(x)= 1,如果x> 0 else 0)。因爲H(x)的導數總是爲零(在x = 0時未定義),所以沒有來自損失的梯度將通過它返回到權重(鏈規則),因此網絡中的該函數之前沒有權重可以更新使用梯度下降。基於此,梯度下降不能用於感知器,但可用於使用激活函數的常規神經元(因爲所有x的梯度不爲零)。
對於Relu,對於x> 0,導數爲1,否則爲0。雖然導數在x = 0時是未定義的,但當x> 0時,我們仍然可以通過它反向傳播損失梯度。這就是它可以被使用的原因。
這就是爲什麼我們需要一個具有非零梯度的損失函數。像精度和F1這樣的函數在任何地方都沒有梯度(或者在x的某些值處未定義),所以它們不能使用,而像交叉熵L2和L1這樣的函數具有非零梯度,因此可以使用它們。 (請注意,L1「絕對差值」在x = 0時是分段式的並不平滑,但仍然可以使用)
如果您必須使用不符合上述標準的功能,請嘗試reinforcement learning methods政策梯度)。
也正在尋找#3的答案。感謝大問題 –