我的神经网络甚至无法学习欧几里得距离

机器算法验证 机器学习 神经网络 优化 喀拉斯 欧几里得
2022-03-21 20:41:28

所以我正在尝试自学神经网络(用于回归应用,而不是对猫的图片进行分类)。

我的第一个实验是训练一个网络来实现一个 FIR 滤波器和一个离散傅里叶变换(对“之前”和“之后”信号进行训练),因为它们都是线性操作,可以通过没有激活函数的单层来实现。 两者都工作得很好。

所以我想看看我是否可以添加一个abs()并让它学习一个幅度谱。首先,我考虑在隐藏层中需要多少个节点,并意识到 3 个 ReLU 足以abs(x+jy) = sqrt(x² + y²)对输出)。有时它会起作用:

3个将欧几里得距离实现为倒六角金字塔的ReLU

但在我尝试的大多数情况下,它都会陷入局部最小值并且无法找到正确的形状:

3个ReLUs形成谷形网络

损失与时代

我已经尝试过 Keras 中的所有优化器和 ReLU 变体,但它们并没有太大区别。我还能做些什么来使像这样的简单网络可靠地收敛吗?还是我只是以错误的态度来处理这个问题,而您应该在问题上抛出比必要更多的节点,如果其中一半死了,这没什么大不了的?

1个回答

输出似乎强烈表明您的一个或多个神经元死亡(或者您的两个神经元的权重超平面已经合并)。您可以看到,使用 3 个 Relu,当您收敛到更合理的解决方案时,您会在中心获得 3 个阴影分裂。您可以通过检查每个神经元的输出值来轻松验证这是否正确,以查看它是否在您的大部分样本中保持死亡。或者,您可以绘制按各自神经元分组的所有 2x3=6 神经元权重,以查看两个神经元是否塌陷到同一对权重。

我怀疑造成这种情况的一个可能原因是x+iy偏向一个坐标,例如xy,在这种情况下,您将尝试重现身份,然后abs(x+iy)x. 你真的没有什么可以做的来解决这个问题。一种选择是按照您的尝试添加更多神经元。第二种选择是尝试连续激活,如 sigmoid,或者可能是无界的,如指数。你也可以尝试 dropout(比如说,10% 的概率)。您可以在 keras 中使用常规的 dropout 实现,希望它足够聪明,可以忽略所有 3 个神经元都退出的情况。