python - 线性单细胞两层人工神经网络产生恒定预测
问题描述
假设我们想通过原点和点 (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
始终等于 0。此外,无论使用 Keras 的梯度下降算法中的哪一种,都会发生这种情况。
这是令人惊讶的,因为这两个模型在第一个模型的参数可以实现为第二个模型中两个参数的乘积的意义上是等价的。也就是说,我们通过尝试找到a和b的值来拟合一条直线y = abx。例如,a = 2 和b = 1 将产生完美的拟合。
那么,有什么区别呢?
解决方案
事实证明,这是所选初始值的一个相当不幸的副作用。不难看出,对于给定的样本,均方误差优化目标的梯度为
( a , b ) ↦ 2( b ( ab - 2), a ( ab - 2))
当 ( a , b ) = (0, 0)时,它恰好等于0。为参数选择任何其他初始值,一切都按预期进行。特别是,使用
kernel_initializer=keras.initializers.Constant(.1)
在这两层中都会产生所需的结果。
在单层情况下不会出现同样的问题,因为这里的梯度是
a ↦ 2( a − 2)
仅当a = 2 时才为零。
推荐阅读
- r - R:ggplot - 根据组绘制具有不同颜色的数据点的趋势线
- c# - ASP.NET Core AuthorizationHandler 未被调用
- python - AWS lambda 调用时不运行代码
- javascript - 未更新使用 JavaScript 的密码确认
- docker - Gitlab 使用 helm 安装分蘖导致 kubernetes-charts.storage.googleapis.com 不是有效的图表存储库
- javascript - displayChoice() 和使用 .innerHTML 有什么区别?
- c# - 如何将对象列表投影到嵌套对象列表中
- css - 使标题内的文本响应
- c# - 如何在另一个pdf,.NET中打印带有可编辑字段的pdf?
- python-3.x - 获取时区并隐蔽到UTC