Course 2 week 1 :权重初始化 & 正则化 & 梯度校验

本文介绍了深度学习中权重初始化的重要性,包括零初始化、随机初始化和sqrt(2 / n[l - 1])初始化,探讨了它们对模型性能的影响。接着讨论了正则化技术,如L2正则化和dropout,及其在防止过拟合中的作用。最后,通过一维和高维线性模型的梯度校验,验证了反向传播算法的正确性。
摘要由CSDN通过智能技术生成

目录

点击回顾本周课堂笔记

一、权重初始化

1.数据和模型

2.权重初始化为0

3.随机初始化

4.sqrt(2 / n[l - 1])初始化

5.总结

二、正则化

1.数据

2.不使用正则化

3.使用正则化

3.1 L2正则化

3.2 dropout

三、梯度校验

1.一维线性模型的梯度检查

​2.高维线性模型的梯度检查


点击回顾本周课堂笔记

一、权重初始化

1.数据和模型

相关代码:

train_X, train_Y, test_X, test_Y = init_utils.load_dataset(is_plot=True)

load_dataset()中的数据可视化代码:

if is_plot:
    plt.scatter(train_X[:, 0], train_X[:, 1],c=train_Y,s=40,cmap=plt.cm.Spectral)
    plt.show()

运行结果: 

模型

实现一个三层的神经网络:LINEAR ->RELU -> LINEAR -> RELU -> LINEAR -> SIGMOID。

迭代的次数为15000,每迭代1000次打印一次成本值

开始学习的核心代码:

    for i in range(0, num_iterations):
        # 前向传播
        a3, cache = init_utils.forward_propagation(X, parameters)

        # 计算成本
        cost = init_utils.compute_loss(a3, Y)

        # 反向传播
        grads = init_utils.backward_propagation(X, Y, cache)

        # 更新参数
        parameters = init_utils.update_parameters(parameters, grads, learning_rate)

        # 记录成本
        if i % 1000 == 0:
            costs.append(cost)
            # 打印成本
            if print_cost:
                print("第" + str(i) + "次迭代,成本值为:" + str(cost))

实验方案

以下三种初始化都只对W进行处理,b不做处理(即b都为0初始化)。通过分析权重参数值、预测结果、学习率、分类性能等实验结果获得结论。

2.权重初始化为0

相关代码:

parameters = model(train_X, train_Y, initialization = "zeros",is_polt=True)

initialize_parameters_zeros(layers_dims) 中的零初始化语句:

parameters["W" + str(l)] = np.zeros((layers_dims[l], layers_dims[l - 1]))
parameters["b" + str(l)] = np.zeros((layers_dims[l], 1))

运行结果:

结论:

  1. 权重参数值被初始化为0,学习率一直没有变化,说明这个模型没有学习。
  2. 成本值在0.69附近,而且成本并没有真正降低,说明性能很差。
  3. 分类失败,该模型预测每个都为0。通常来说,零初始化都会导致神经网络无法打破对称性,最终导致的结果就是无论网络有多少层,最终只能得到和Logistic函数相同的效果。

3.随机初始化

相关代码:

parameters = model(train_X, train_Y, initialization = "random",is_polt=True)

initialize_parameters_random(layers_dims)中的随机初始化语句:

# 使用10倍缩放
parameters['W' + str(l)] = np.random.randn(layers_dims[l], layers_dims[l - 1]) * 10
parameters['b' + str(l)] = np.zeros((layers_dims[l], 1))

运行结果:

结论:

  1. 随机初始化的权重参数值都是比较大的。
  2. 成本开始很高。这是因为由于具有较大的随机权重,最后一个激活(sigmoid)输出的结果非常接近于0或1,而当它出现错误时,它会导致非常高的损失。如果没有很好初始化参数,会导致梯度消失、爆炸,而减慢优化算法。如果对这个网络进行更长时间的训练,将看到更好的结果,但是使用过大的随机数初始化会减慢优化的速度。

4.sqrt(2 / n[l - 1])初始化

相关代码:

parameters = model(train_X, train_Y, initialization = "he",is_polt=True)

initialize_parameters_he(layers_dims)中的初始化语句:

parameters['W' + str(l)] = np.random.randn(layers_dims[l], layers_dims[l - 1]) * np.sqrt(2 / layers_dims[l - 1])
parameters['b' + str(l)] = np.zeros((layers_dims[l], 1))

运行结果:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值