簡體   English   中英

關於輸入的神經網絡導數

[英]Derivative of neural network with respect to input

我訓練了一個神經網絡對正弦函數進行回歸,並想計算相對於輸入的一階和二階導數。 我試過像這樣使用tf.gradients()函數(neural_net是tf.keras.Sequential的實例):

prediction = neural_net(x_value)
dx_f = tf.gradients(prediction, x_value)
dx_dx_f = tf.gradients(dx_f, x_value)

x_value是具有測試大小長度的數組。 但是,這導致了預測和導數 網絡的預測(藍色曲線)基本上正好抓住了正弦函數,但我必須將一階導數(橙色)除以10,將二階導數(綠色)除以100,才能使其成為正弦函數。在相同的數量級。 因此,一階導數看起來(在重新縮放后)還可以,但是第二個導數是完全不穩定的。 由於對正弦函數的預測非常有效,因此這里顯然存在一些有趣的事情。

我認為您無法使用tf.gradients計算二階導數。 看一下tf.hessians(您真正想要的是Hessian矩陣的對角線),例如[1]。

另一種方法是使用tf.GradientTape:[2]。

[1] https://github.com/gknilsen/pyhessian

[2] https://www.tensorflow.org/api_docs/python/tf/GradientTape

關於您所觀察到的結果的一種可能解釋是,您的函數不可兩次求導。 似乎極值周圍的一階導數存在跳躍。 如果是這樣,則該函數的二階導數實際上並不存在,而您會感到困惑的圖取決於庫如何處理此類位置。

考慮以下不平滑函數的圖片,對於{1、2,....}中的所有x,該函數從0.5跳到-0.5。 除x為整數外,所有位置的斜率均為1。 如果您嘗試繪制它的導數,則可能會在y = 1處看到一條直線,這很容易被誤解,因為如果有人只是看這個圖,他們可能會認為函數是完全線性的,並且從-infinity到+無窮大。

如果您的結果是由使用RELU的神經網絡產生的,則可以嘗試使用S型激活函數進行相同的操作。 我想您不會在此功能中看到太多尖峰。

在此處輸入圖片說明

您所學的是正弦函數,而不是其導數:在訓練過程中,您正在使用成本函數控制誤差,而成本函數僅考慮值,但根本不控制斜率:您本可以學到非常噪聲功能,但數據點完全匹配。

如果僅在成本函數中使用數據點,則無法保證所學的導數。 但是,通過一些高級培訓技術,您還可以學習這樣的派生形式: https : //arxiv.org/abs/1706.04859

綜上所述,這不是代碼問題,而只是理論問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM