说我们要在通过原点和点(1、2)的平面上拟合一条直线。我们可以将其视为具有大小为1且没有截距的样本的线性回归。另一方面,这可以表示为没有隐藏层且没有激活的相当琐碎的神经网络。在Keras中,外观如下:
model = keras.Sequential([
keras.layers.Dense(1, input_shape=(1,), use_bias=False,
kernel_initializer=keras.initializers.Zeros()),
])
model.compile(loss='mse', optimizer=keras.optimizers.Adam(lr=.1))
运行
model.fit([[1]], [[2]], epochs=50)
我们得到了期望的结果。即model.predict([[1]])
产生一个接近2的数字。
现在,在模型中添加第二层:
model2 = keras.Sequential([
keras.layers.Dense(1, input_shape=(1,), use_bias=False,
kernel_initializer=keras.initializers.Zeros()),
keras.layers.Dense(1, use_bias=False,
kernel_initializer=keras.initializers.Zeros())
])
model2.compile(loss='mse',
optimizer=keras.optimizers.Adam(lr=.1))
这一次,无论我们在model2.fit
之后抛出什么,我们都会发现model2.predict
始终等于零。而且,无论使用哪种Keras梯度下降算法,都会发生这种情况。
这是令人惊讶的,因为在可以将第一个模型的参数实现为第二个模型中两个参数的乘积的意义上,这两个模型是等效的。也就是说,我们通过尝试找到 a 和 b 的值来拟合直线 y = abx 。例如,以 a = 2和 b = 1会产生完美的拟合。
那么,有什么区别?
答案 0 :(得分:0)
事实证明,这是所选初始值的一个非常不幸的副作用。显而易见,对于给定的样本,均方误差优化目标的梯度为
( a , b )↦2( b ( ab − 2), a ( ab -2))
当( a , b )=(0,0)时等于零。为参数选择任何其他初始值,一切按预期进行。特别是使用
kernel_initializer=keras.initializers.Constant(.1)
在两层中都会产生预期的结果。
单层情况下不会出现相同的问题,因为这里的梯度是
a ↦2( a -2)
仅当 a = 2时为零。