线性单细胞双层神经网络产生恒定的预测



假设我们想要在平面中拟合一条通过原点和点(1,2(的直线。我们可以将其视为样本大小为1且没有截距的线性回归。另一方面,这可以表示为一个相当琐碎的神经网络,没有隐藏层,也没有激活。在喀拉拉邦,情况如下:

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的梯度下降算法,都会发生这种情况。

这是令人惊讶的,因为在第一个模型的参数可以实现为第二个模型中两个参数的乘积的意义上,这两个模型是等价的。也就是说,我们通过试图找到ab的值来拟合直线y=abx。例如,a=2和b=1将产生完美的拟合。

那么,有什么区别呢?

这是所选初始值的一个非常不幸的副作用。很容易看出,对于给定的样本,均方误差优化目标的梯度是

(ab(↦2(b(ab−2(,a

当(ab(=(0,0(时,恰好等于零。为参数选择任何其他初始值,一切都会按预期进行。特别是,使用

kernel_initializer=keras.initializers.Constant(.1)

在两层中都将产生期望的结果。

在单层情况下不会出现相同的问题,因为这里的梯度是

a↦2(a−2(

仅当a=2时为零。

最新更新