神经网络中的权重初始化

时间:2019-10-11 07:31:22

标签: machine-learning keras neural-network initialization

嗨,我正在使用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,他进行了初始化。我尝试过使用不同的砝码,但是它们都给出相同的结果。我想了解正确进行初始化有多重要?

谢谢

1 个答案:

答案 0 :(得分:2)

我将向您解释权重初始化的重要程度。

让我们假设我们的NN有一个包含1000个神经元的输入层,并假设我们开始初始化权重,因为它们是均值0和方差1()的正态分布。

在第二层,我们假设只有500个第一层的神经元被激活,而其他500个则没有。

第二层z的神经元输入将为:

因此,它甚至将是正态分布的,但方差为

这意味着其值将为| z |。 >> 1或| z | << 1,所以神经元会饱和。 网络将学习缓慢。

一种解决方案是将权重初始化为,其中是第一层输入的数量。这样,z将为,因此扩展度较小,因此神经元不易饱和。

这个技巧可以作为一个开始,但在深度神经网络中,由于存在隐藏的多层,因此权重初始化应在每一层进行。一种方法可能是使用batch normalization

除了您的代码外,我还可以看到您已选择MSE作为成本函数,因此它是二次成本函数。我不知道您的问题是否是分类问题,但是如果是这种情况,我建议您使用交叉熵函数作为成本函数来提高网络的学习率。