[英]Neural network toy model to fit sine function fails, what's wrong?
為了使代碼正常工作,您需要:
經過這些修改,我能夠在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.