您好,我正在使用 keras 开发神经网络模型。
代码
def base_model():
# Initialising the ANN
regressor = Sequential()
# Adding the input layer and the first hidden layer
regressor.add(Dense(units = 4, kernel_initializer = 'he_normal', activation = 'relu', input_dim = 7))
# Adding the second hidden layer
regressor.add(Dense(units = 2, kernel_initializer = 'he_normal', activation = 'relu'))
# Adding the output layer
regressor.add(Dense(units = 1, kernel_initializer = 'he_normal'))
# Compiling the ANN
regressor.compile(optimizer = 'adam', loss = 'mse', metrics = ['mae'])
return regressor
我一直在阅读有关使用哪个 kernel_initializer 的信息,并发现了链接 - https://towardsdatascience.com/hyper-parameters-in-action-part-ii-weight-initializers-35aee1a28404
它讨论了 glorot 和 he 初始化。我尝试过使用不同的权重形式,但它们都给出相同的结果。我想了解正确的初始化有多重要?
谢谢
最佳答案
我将向您解释权重初始化的重要性。
假设我们的神经网络有一个包含 1000 个神经元的输入层,并假设我们开始初始化权重,因为它们呈均值 0 和方差 1 的正态分布 ( )。
在第二层,我们假设只有 500 个第一层神经元被激活,而其他 500 个神经元则没有。
第二层 z 的神经元输入将是:
所以,它甚至会服从正态分布但有差异 .
这意味着它的值将是 |z| >> 1 或|z| << 1,因此神经元将饱和。 网络学习速度会很慢。
解决方案是将权重初始化为 哪里是第一层输入的数量。这样z将是因此扩散器较少,因此神经元不太容易饱和。
这个技巧可以作为一个开始,但在深度神经网络中,由于隐藏多层的存在,权重初始化应该在每一层完成。一种方法可能正在使用 batch normalization
除此之外,从您的代码中我可以看到您选择了 MSE 作为成本函数,因此它是一个二次成本函数。我不知道你的问题是否是分类问题,但如果是这种情况,我建议你使用交叉熵函数作为成本函数来提高网络的学习率。
关于machine-learning - 神经网络中的权重初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58336299/