如何在深度学习网络中选择参数 w 的随机值?

人工智能 深度学习
2021-10-28 17:52:39

我确实看过 Andrew Ng 的 DeepLearning 课程,他告诉我们应该创建w小的参数,例如:

parameters['W' + str(l)] = np.random.randn(layer_dims[l], layer_dims[l - 1]) ** 0.001 

但是在最后的应用程序分配中。他们选择了另一种方式:

layers_dims = [12288, 20, 7, 5, 1]
def initialize_parameters_deep(layer_dims):
    np.random.seed(3)
    parameters = {}
    L = len(layer_dims)

    for l in range(1, L):
        parameters['W' + str(l)] = np.random.randn(layer_dims[l], layer_dims[l - 1]) / np.sqrt(layer_dims[l - 1])
        parameters['b' + str(l)] = np.zeros((layer_dims[l], 1))
        assert (parameters['W' + str(l)].shape == (layer_dims[l], layer_dims[l - 1]))
        assert (parameters['b' + str(l)].shape == (layer_dims[l], 1))
    return parameters

而且这种方式的结果非常好,但是如果我w像上面的旧一样选择,那就34%正确了!

那你能解释一下吗?

1个回答

权重初始化与梯度消失/爆炸问题密切相关。有关完整的解释,请查看这个很棒的页面(也来自 deeplearning.ai)。在这里,我将总结主要概念:

  • 将权重全部初始化为零将导致所有权重相对于损失函数具有相同的导数值,因此网络将无法学习任何东西。
  • 将偏差初始化为零没有任何缺点,因为它们是常数(无论如何计算导数时根本没有影响)。

  • 使用过高或过小的值初始化权重将导致梯度爆炸(梯度值振荡而没有收敛)或梯度消失(在达到损失全局最小值之前收敛的小梯度值变化)。

为了避免这些问题,已经提出了一种称为Xavier 初始化的方法:权重应该以这样一种方式初始化,即它们将生成具有以下分布的激活分数:

  • 平均 0
  • 跨层的恒定方差(即没有消失/爆炸)

施加第二个约束时,值“np.sqrt(layer_dims[l - 1])”会上升。要获得正式证明,请查看我链接的页面。要掌握这个概念,只需关注一层权重的方差取决于前一层的节点数量这一事实。这意味着对于具有大量隐藏节点的层之前的层,权重将以小的方差初始化,这是可以的,因为我们不希望一小群节点对后续激活产生更大的影响。但是在层之前有少量节点的层中,允许权重变化更多是可以的。