簡體   English   中英

擬合正弦函數的神經網絡玩具模型失敗,怎么了?

[英]Neural network toy model to fit sine function fails, what's wrong?

研究生,不Keras和神經網絡, 正在嘗試將非常簡單的前饋神經網絡擬合到一維正弦波

以下是我可以獲得的最合適的三個示例。 在圖中,您可以看到網絡的輸出與地面真相的對比

神經網絡輸出與地面真相(運行3)

神經網絡輸出與地面真相(運行1)
神經網絡輸出與地面真相(運行2)

完整的代碼(只有幾行)在此處發布, 示例Keras


我正在使用多個層,不同的激活函數,不同的初始化和不同的損失函數,批處理大小,訓練樣本數量。 除上述示例外,似乎沒有一個能夠改善結果。

我將不勝感激任何意見和建議。 正弦是神經網絡擬合的硬函數嗎? 我懷疑答案不是,所以我一定做錯了...


從5年前開始, 這里有一個類似的問題,但是那里的OP沒有提供代碼,並且仍然不清楚出了什么問題或他如何解決此問題。

為了使代碼正常工作,您需要:

  • 在[-1,+1]范圍內縮放輸入值(神經網絡不喜歡大值)
  • 也可以縮放輸出值,因為tanh激活在+/- 1附近效果不佳
  • 使用RELU激活,而不是在正切所有,但最后一層(收斂方式更快)

經過這些修改,我能夠在10和25個神經元的兩個隱藏層中運行您的代碼

由於已經有一個提供解決方案的答案,因此我將重點介紹您的方法存在的問題。

輸入數據刻度

正如其他人所述,您輸入的數據值范圍從0到1000很大。 通過將輸入數據縮放到零均值和單位方差( X = (X - X.mean())/X.std() ),可以輕松解決此問題,這將改善培訓效果。 對於tanh這種改善可以用飽和度來解釋: tanh映射為[-1; 1],因此對於幾乎所有足夠大的(> 3) x都將返回-1或1,即飽和。 在飽和狀態下, tanh的梯度將接近於零,並且不會學到任何東西。 當然,您也可以改用ReLU ,它不會使值> 0飽和,但是您將遇到類似的問題,因為現在梯度(幾乎)僅依賴於x ,因此,較晚的輸入總是比較早的輸入具有更高的影響力(除其他事項外)。

雖然重新縮放或規范化可能是一種解決方案,但另一種解決方案是將您的輸入視為分類輸入,並將離散值映射到一個熱編碼的矢量,因此,

>>> X = np.arange(T)
>>> X.shape
(1000,)

你將會擁有

>>> X = np.eye(len(X))
>>> X.shape
(1000, 1000)

當然,如果您想學習連續輸入,這可能不是理想的。

造型

當前,您正在嘗試建模從線性函數到非線性函數的映射:將f(x) = x映射到g(x) = sin(x) 雖然我知道這是一個玩具問題,但由於f(x)g(x)毫無關系,因此這種建模方式僅限於一條曲線。 當您嘗試對不同的曲線建模時,用相同的網絡說出sin(x)cos(x) ,您的X就會出現問題,因為X的兩條曲線的值都完全相同。 對此問題建模的更好方法是預測曲線的下一個值 ,即

X = range(T)
Y = sin(x)

你要

X = sin(X)[:-1]
Y = sin(X)[1:]

因此對於時間步驟2,您將獲得時間步驟1的y值作為輸入,而損失則期望時間步驟2的y值。這樣,您就可以隱式地對時間建模。

暫無
暫無

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

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