【问题标题】:Weight initialization in neural networks神经网络中的权重初始化
【发布时间】:2020-02-08 16:32:13
【问题描述】:

您好,我正在使用 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 和他的初始化。我尝试了不同的权重 intilizations,但它们都给出了相同的结果。我想了解正确初始化有多重要?

谢谢

【问题讨论】:

  • 对于这么小的网络,它可能几乎无关紧要。对于大型的深度网络,它可以在强大的结果和完全无法学习之间产生差异。虽然,由于标准化方法(例如 batchnorm),初始化变得不那么重要了。
  • 不是编程问题,因此这里可以说是题外话;更适合Cross Calidated

标签: machine-learning keras neural-network initialization


【解决方案1】:

我会解释一下初始化权重的重要性。

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

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

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

所以,它甚至是正态分布的,但有方差。

这意味着它的值为|z| >> 1 或 |z| 网络会慢慢学习。

一种解决方案是将权重初始化为,其中 是第一层的输入数。这样,z 将是,因此传播范围更小,因此神经元更不容易饱和。

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

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

【讨论】:

    猜你喜欢
    • 2021-06-25
    • 2019-10-09
    • 2011-12-09
    • 2019-04-10
    • 1970-01-01
    • 2020-03-28
    • 2014-10-30
    • 1970-01-01
    • 2017-06-17
    相关资源
    最近更新 更多