为深度学习模型设置初始权重的目的是什么?

数据挖掘 深度学习 喀拉斯
2022-03-04 05:33:37

我现在正在学习使用 Keras 进行深度学习,并且要在 Keras 上实现深度学习模型,您需要设置初始化程序以设置其初始权重。

from keras.models import Sequential
from keras.layers import Dense
model = Sequential()
model.add(Dense(12, input_dim=8, kernel_initializer="random_uniform"))

可以采用kernel_initializer其他东西,例如random_normal,它使用高斯分布,不是均匀分布,并且zero,它实际上将所有权重设置为 0。

但是,我不明白您为什么喜欢在初始化程序中设置不同的权重。具体来说,与将所有初始权重设置为 0 相比,它有什么优势,这对于像我这样的新手来说听起来更自然?

此外,如果需要,是否应该始终将初始权重设置为一个很小的值(例如0.05)?

2个回答

这在斯坦福 CS 类 CS231n中得到了很好的解决:

陷阱:全零初始化。让我们从我们不应该做的事情开始。请注意,我们不知道训练网络中每个权重的最终值应该是多少,但是通过适当的数据归一化,可以合理地假设大约一半的权重为正,而其中一半为负。一个听起来合理的想法可能是将所有初始权重设置为零,我们期望这是预期的“最佳猜测”。事实证明这是一个错误,因为如果网络中的每个神经元计算相同的输出,那么它们在反向传播期间也将计算相同的梯度并进行完全相同的参数更新。换句话说,如果它们的权重被初始化为相同,那么神经元之间就没有不对称的来源。

有几种权重初始化策略;每个都最适合一种激活函数。例如,Glorot 的初始化旨在不使 sigmoid 激活饱和,而He 的初始化旨在用于 Rectified Linear Units (ReLUs)。

这与前向和反向传播的工作方式有关。请记住,前向传播是通过将激活函数应用于将层的激活乘以al权重矩阵Wl加上bl 网络每一层的偏置向量的结果来完成的:

zl = activation(Wl * al-1 + bl)

其中zl是层的输出,la0是输入层。从那里很容易看出,如果将Wl设置为零,则输出zl将仅取决于bl网络中每个神经元的激活值将相同。

梯度下降的反向传播步骤使用zl计算梯度步骤和参数更新,因此如果层中的每个神经元具有相同的值,那么这些步骤也将输出相等的值,并且所有神经元将学习相同的参数。

通过将输出初始化为范围内的随机值,您将使每个神经元以不同的方式学习,从而打破对称性。