我正在从头开始编写自己的 CNN 代码。尽管我得到了快速、收敛和令人满意的结果,但训练后的权重值变化很小(而成本/损失函数以看似收敛的方式迅速下降)。我的初始权重:卷积核作为非零单位矩阵;全连接层权重为 0。激活函数是 sigmoid。数据范围从 0 到 1。为什么权重变化如此之小?
CNN 中的重量训练速度太慢
数据挖掘
美国有线电视新闻网
训练
权重初始化
2022-02-14 17:52:15
3个回答
在机器学习中,梯度消失问题是使用基于梯度的学习方法和反向传播训练人工神经网络时发现的一个难题。在这样的方法中,每个神经网络的权重在每次训练迭代中接收与误差函数相对于当前权重的偏导数成比例的更新。问题是在某些情况下,梯度会非常小,有效地防止权重改变其值。在最坏的情况下,这可能会完全阻止神经网络进一步训练。
来源:: https://en.wikipedia.org/wiki/Vanishing_gradient_problem
因此,梯度一直消失,直到它到达神经网络的初始层,而权重的变化也很小。
我敢说您遇到的问题至少是由于初始化不当,也可能是学习率或激活函数不好。
您提到您正在将 conv 内核初始化为“非零单位矩阵”和“完全连接的层权重为 0”。首先,我不知道“非零单元矩阵”是什么意思,但绝对不应该将全连接层初始化为 0。原因是如果该层中的所有神经元具有相同的值,它们都会表现非常相似,如果不是完全相同(取决于网络)。这将产生非常相似的特征,不会很好地偏向网络。
我建议对 Conv 内核和 Dense 内核都使用随机初始化,并为任何偏差使用零。
其次,没有说明您的激活函数,但是如果您使用的激活函数具有对学习率消失敏感的梯度,那么这也是一个问题。例如,使用 sigmoid 激活和高学习率将导致几乎没有权重更新值。
另外,您如何看待[为什么权重变化]“如此之少”?我希望从 [-1, 1] 缩放的数据的更新幅度应该是第一层的 1e-3 和最后一层的 1e-4。(在我的头顶上)
@feynman 因为批量标准化不会让权重消失或爆炸,所以它会标准化每一层之间的批次。由于每个激活函数的前一层的输入都接近于零,因此前一层的权重增加/减少的影响将被抑制;避免滚雪球效应。