Keras: 损失不断增加

3

代码:

import keras
import numpy as np

x = []
y = []

for i in range(1000):
    x.append((i/10.0))
    y.append(2.71828 ** (i/10.0))

x = np.asarray(x)
y = np.asarray(y)
x = x.T
y = y.T

model = keras.models.Sequential()
model.add(keras.layers.Dense(1, input_dim=1, activation='relu'))
model.add(keras.layers.Dense(100, activation='relu'))
model.add(keras.layers.Dense(1))

model.compile(loss='mean_squared_error', optimizer=keras.optimizers.SGD(lr=0.001))
model.fit(x, y, batch_size=1, shuffle=False)

tx = [0.0, 1.0, 10.0]
tx = np.asarray(tx)
tx = tx.T

print(model.predict(tx))

这是一个旨在映射e^x的非常简单的神经网络。这是我第一次使用keras,但当我运行它时,损失(loss)会不断增加到无穷大。相反,它应该减少。

1个回答

8
如果损失增加到无穷大,这是学习率过高的迹象。在拟合e^x (当x = 100时) 的情况下,问题在于值之间的差异将非常大。因此梯度将非常大,根据您的学习率更新也将同样大。然而,如果您的学习速率非常小,网络将被这些大的更新所主导。这就是为什么在深度学习中对值进行归一化的原因之一。

一个快速的解决方案是只使用前100个值或减小步长。


我已经尝试过降低学习率了。我尝试过低至10^-15,但损失仍然增加。 - ParmuTownley
10^-15与e^100相比微不足道。对于该值,您的网络最初会输出大约200左右,而您说它应该是10^40。梯度将是2乘以这个值。因此,您的参数将被更新为一些非常大的值,然后您会遇到数值不稳定和NaN的问题。 - Thomas Pinetz
好的..所以,我是新手,那么我该如何对我的值进行归一化,以避免出现这种爆炸? - ParmuTownley
在深度学习中,你可以对数据集进行归一化处理,计算数据集的均值和标准差,然后从每个数据点中减去均值和标准差。但是我建议一开始就不要使用那些较高的值。对于训练目的来说,使用e^0到e^5之间的值就足够了。这样做也更容易绘制函数图形。我建议你查看一下数据集,比如绘制它的值以及梯度。那么你会发现更新的结果并没有那么有意义。 - Thomas Pinetz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接