深度学习吴恩达第二门课-改善深层神经网络-第一周作业

作业说明

通过完成这项作业,你将:
1.初始化参数
-训练神经网络需要指定权重的初始值,分别使用0、随机数和抑梯度异常(He初始化)初始化参数。
一个精心选择的初始化可以:
-加快梯度下降的收敛速度
-增加梯度下降收敛到较低的训练(和泛化)误差的几率
2.正则化模型
-了解不同的正则化方法可以帮助你的模型。
-实现dropout并查看它在数据上的工作。
-认识到没有正则化的模型在训练集上能给你更好的准确性,但在测试集可能不会。
-理解你可以在你的模型上使用dropout(随机删除结点)和二范数正则化尝试避免过拟合。
3.进行梯度检验
-从头开始执行梯度检查。
-了解如何使用差值公式来检查反向传播实现。
-认识到你的反向传播算法的结果应该与差值公式近似相等。
-计算差分公式。
-学习如何识别哪个参数的梯度计算错误。

初始化参数

三种初始化方法作业代码:

# 0初始化
        parameters["W" + str(l)] = np.zeros((layers_dims[l], layers_dims[l-1]))
        parameters["b" + str(l)] = np.zeros((layers_dims[l], 1))
# 随机初始化
        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))
# He初始化,随机初始化权重值乘以根号下(2除以上一层的维度数)
        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))

总结:

不同的初始化方法会导致不同的结果。

随机初始化有助于打破对称,使得不同隐藏层的单元可以学习到不同的参数。

初始化时,初始值不宜过大。

He初始化对于具有ReLU激活函数的网络效果很好。

正则化模型

L2正则化:
代码:

    L2_regularization_cost = 1/m * lambd/2 * (np.sum(np.square(W1)) + np.sum(np.square(W2)) + np.sum(np.square(W3)))
   ...
   dW3 = 1/m * np.dot(dZ3, A2.T) + lambd/m * W3
   ...

L2正则化会使决策边界更加平滑。如果λ太大,对权重的“惩罚”太大,也可能会“过度平滑”,从而导致模型高偏差。L2正则化实际上在做什么?L2正则化依赖于较小权重的模型比具有较大权重的模型更简单这样的假设,因此,通过削减成本函数中权重的平方值,可以将所有权重值逐渐改变到到较小的值。权值数值高的话会有更平滑的模型,其中输入变化时输出变化更慢,但是你需要花费更多的时间。L2正则化对以下内容有影响:

成本计算       : 正则化的计算需要添加到成本函数中
反向传播功能     :在权重矩阵方面,梯度计算时也要依据正则化来做出相应的计算
权重变小(“权重衰减”) :权重被逐渐改变到较小的值。

dropout正则化:
Dropout的原理就是每次迭代过程中随机将其中的一些节点失效。当我们关闭一些节点时,我们实际上修改了我们的模型。背后的想法是,在每次迭代时,我们都会训练一个只使用一部分神经元的不同模型。随着迭代次数的增加,我们的模型的节点会对其他特定节点的激活变得不那么敏感,因为其他节点可能在任何时候会失效。
代码:

        # Steps 1-4 below correspond to the Steps 1-4 described above. 
        # Step 1: initialize matrix D1 = np.random.rand(..., ...)
    D1 = np.random.rand(A1.shape[0], A1.shape[1])
        # Step 2: convert entries of D1 to 0 or 1 (using keep_prob as the threshold)
    D1 = (D1 < keep_prob)
        # Step 3: shut down some neurons of A1
    A1 = A1 * D1
        # Step 4: scale the value of neurons that haven't been shut down
    A1 = A1 / keep_prob

Dropout是一种正则化技术。
-你只在训练中使用dropout。在测试期间不要使用dropout(随机消除节点)。
-在向前和向后传播期间应用dropout。
-在训练期间,每个dropout层除以keep_prob,使激活的期望值保持一致。例如,如果keep_prob是0.5,那么我们将平均关闭一半的节点,因此输出将按比例增加0.5,因为只有剩下的一半对解决方案有贡献。除以0.5等于乘以2。因此,输出现在具有相同的期望值。即使keep_prob的值不是0.5,也可以检查它是否正常工作。

总结:
-正则化将帮助你减少过拟合。

-正则化会使你的权重降低。

-L2正则化和Dropout是两种非常有效的正则化技术。

梯度检验

在这里插入图片描述

作业代码:

# Compute J_plus[i]. Inputs: "parameters_values, epsilon". Output = "J_plus[i]".
        # "_" is used because the function you have to outputs two parameters but we only care about the first one
        ### START CODE HERE ### (approx. 3 lines)
            # Step 1
        theta_plus = np.copy(parameters_values)
        theta_plus[i][0] = theta_plus[i][0] + epsilon
            # Step 2
        J_plus[i], cache = forward_propagation_n(X, Y, vector_to_dictionary(theta_plus))
        ### END CODE HERE ###

        # Compute J_minus[i]. Inputs: "parameters_values, epsilon". Output = "J_minus[i]".
        ### START CODE HERE ### (approx. 3 lines)
            # Step 1
        theta_minus = np.copy(parameters_values)
        theta_minus[i][0] = theta_minus[i][0] - epsilon
            # Step 2        
        J_minus[i], cache = forward_propagation_n(X, Y, vector_to_dictionary(theta_minus))
        ### END CODE HERE ###
        
        # Compute gradapprox[i]
        ### START CODE HERE ### (approx. 1 line)
        gradapprox[i] = (J_plus[i] - J_minus[i]) / (2 * epsilon)
        ### END CODE HERE ###
    
    # Compare gradapprox to backward propagation gradients by computing difference.
    ### START CODE HERE ### (approx. 1 line)
        # Step 1'
    numerator = np.linalg.norm(grad - gradapprox)
        # Step 2'
    denominator = np.linalg.norm(grad) + np.linalg.norm(gradapprox)
        # Step 3'
    difference = numerator / denominator
    ### END CODE HERE ###

总结:
-梯度检查验证反向传播的梯度和使用差分计算的梯度的数值近似值之间的紧密性(使用正向传播计算)。

-梯度检查很慢,所以我们不会在每次训练迭代中都运行它。您通常只会运行它来确保您的代码是正确的,然后关闭它并使用backprop来进行实际的学习过程。

-梯度检查,对使用dropout的网络模型不起作用。你通常会在没有dropout的情况下运行梯度检查算法,以确保你的backprop是正确的,然后添加dropout。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值