正则化

Let's first import the packages you are going to use.

Problem Statement: 假设你刚刚被法国足球公司聘为AI专家。 他们希望你推荐法国守门员应该踢球的位置,这样法国队的球员用头击出。

1517937477262038.png

守门员将球踢向空中,各队的队员们正在拼命用头撞球,以下二维数据集为他们他们提供的法国过去10场比赛情况。

运行:

得到结果图:

2.jpg

每个点对应于足球运动员在足球场左侧击球之后,用头将球击中的足球场上的位置。

如果这个点是蓝色的,这意味着这个法国球员设法用他/她的头击球

如果这个点是红色的,这意味着另一个队的球员用头撞球

你的目标:使用深度学习模式来找到守门员踢球的场地。

数据集的分析:这个数据集有点嘈杂,但是看起来像是左上角(蓝色)和右下角(红色)分开的对角线,效果很好。

你将首先尝试一个非正则化的模型。 然后,您将学习如何正则化,并决定选择哪种模式来解决法国足球公司的问题。

1 – 非正则化模型

您将使用以下神经网络(以下已为您实施)。 这个模型可以这样使用:

  • regularization mode — 通过将lambd输入设置为非零值。 我们使用“lambd”而不是“lambda”,因为“lambda”是Python中的保留关键字。

  • in dropout mode — 通过将keep_prob设置为小于1的值

您将首先尝试没有正规化的模型。 然后,你将执行:

  • L2 regularization — functions: "compute_cost_with_regularization()" and "backward_propagation_with_regularization()"

  • Dropout —      functions: "forward_propagation_with_dropout()" and "backward_propagation_with_dropout()"

在每个部分中,您将使用正确的输入运行此模型,以便调用您实施的功能。 看看下面的代码,以熟悉模型。

让我们在没有任何正则化情况下训练模型,,并观察训练集/测试集的准确性。

迭代结果:

Cost after iteration 0: 0.6557412523481002

Cost after iteration 10000: 0.1632998752572419

Cost after iteration 20000: 0.13851642423239133

3.jpg

On the training set:

Accuracy: 0.947867298578

On the test set:

Accuracy: 0.915

训练精度为94.8%,测试精度为91.5%。 这是基准模型(您将观察正则化对此模型的影响)。 运行以下代码来绘制模型的决策边界。

1517937900233472.jpg

很明显已经过拟合了。接下来采用两种正则化来测试一下。

2 – L2 正则化

1517937960389335.jpg

下面来做修改。

Exercise: 执行 compute_cost_with_regularization() 来计算式(2)给的计算代价的方式。

测试一下:

结果为:

cost = 1.78648594516

当然,因为你改变了成本,你也必须改变后向传播! 所有的梯度都必须计算这个新的成本。

Exercise: Implement the changes needed in backward propagation to take into account regularization. The changes only concern dW1, dW2 and dW3. For each, you have to add the regularization term's gradient

# GRADED FUNCTION: backward_propagation_with_regularization

 

测试一下:

结果为:

dW1

[[-0.25604646 0.12298827 -0.28297129] [-0.17706303   0.34536094 -0.4410571 ]]

dW2

[[ 0.79276486 0.85133918] [-0.0957219 -0.01720463]   [-0.13100772 -0.03750433]]

dW3

[[-1.77691347 -0.11832879 -0.09397446]]

现在让我们用L2正则化(λ= 0.7)运行模型。 model()函数将调用:

compute_cost_with_regularization而不是compute_cost

backward_propagation_with_regularization而不是backward_propagation

代码如下:

结果如下:

Cost after iteration 0: 0.6974484493131264

Cost after iteration 10000: 0.2684918873282239

Cost after iteration 20000: 0.2680916337127301

6.jpg

On the train set:

Accuracy: 0.938388625592

On the test set:

Accuracy: 0.93

我们看出精确度又有所提高,下面看边界图像,判断看是否过拟合?

代码如下:

图像如下:

7.jpg

可以看出,过拟合已经得到很大程度减轻。

L2正则化实际上在做什么?

L2规则化依赖于这样的假设,即具有小权重的模型比具有大权重的模型简单。

因此,通过惩罚成本函数中权重的平方值,可以将所有权重驱动到较小的值。

但对于大权重的成本来说代价太大了,这将导致一个更加平滑的模型,它其中输出随着输入改变变化更慢。

L2正则化对以下内容的影响:

成本计算:

         正则化术语被添加到成本中

反向传播功能:

         在权重矩阵的梯度中有额外的术语

 权重变小(“权重衰减”):

         权重被推到较小的值。

3 – Dropout

最后,Dropout(随机失活)是一种广泛使用的正则化技术,特别是在深度学习中,它在每次迭代中随机关闭一些神经元。

代码如下:

测试一下:

输出结果为:

A3 =[[ 0.36974721 0.00305176 0.04565099 0.49683389 0.36974721]]

3.1 – 带有Dropout的反向传播

Exercise: Implement the backward propagation with dropout. As before, you are training a 3 layer network. Add dropout to the first and second hidden layers, using the masks D[1] and D[2] stored in the cache.

Instruction: Backpropagation with dropout is actually quite easy. You will have to carry out 2 Steps:

  1. You had previously shut down some neurons during forward propagation, by applying a mask D[1] to A1. In backpropagation, you will have to shut down the same neurons, by reapplying the same mask D[1] to dA1.

  2. During forward propagation, you had divided A1 by keep_prob. In backpropagation, you'll therefore have to divide dA1 by keep_prob again (the calculus interpretation is that if A[1] is scaled by keep_prob, then its derivative dA[1] is also scaled by the same keep_prob).

代码如下:

测试一下:

结果:

dA1 = [[ 0.36544439  0.         -0.00188233  0.         -0.17408748]

 [ 0.65515713  0.         -0.00337459  0.         -0.        ]]

dA2 = [[ 0.58180856  0.         -0.00299679  0.         -0.27715731]

 [ 0.          0.53159854 -0.          0.53159854 -0.34089673]

 [ 0.          0.         -0.00292733  0.         -0.        ]]

测试一下其cost:

结果为:

Cost after iteration 0: 0.6543912405149825

Cost after iteration 10000: 0.061016986574905605

Cost after iteration 20000: 0.060582435798513114

8.jpg

On the train set:

Accuracy: 0.928909952607

On the test set:

Accuracy: 0.95

精确率已经高达95%了。下面看其边界情况:

9.jpg

注意:

1.dropout只能在训练中使用。

2.像tensorflow,PaddlePaddle,keras或caffe这样的深度学习框架带有一个dropout层的实现。 不要紧张 – 你很快就会学到一些这样的框架。

关于dropout你应该知道:

1.dropout是一种正则化技术。

2.只能在训练期间只能使用dropout。 测试期间不要使用dropout。

3.在前向传播和反向传播期间都是用dropout。

4.在训练期间,通过keep_prob分隔每个丢失层,以保持激活的相同期望值。 例如,如果keep_prob是0.5,那么我们将平均关闭一半的节点,所以输出将被缩放0.5,因为只剩下一半对解决方案有贡献。 除以0.5相当于乘以2。因此,输出现在具有相同的期望值。 即使keep_prob是0.5以外的值,你也可以检查它是否有效。

4 – Conclusions

Here are the results of our three models:

model

train accuracy

test accuracy

3-layer NN without regularization

95%

91.5%

3-layer NN with L2-regularization

94%

93%

3-layer NN with dropout

93%

95%

Note that regularization hurts training set performance! This is because it limits the ability of the network to overfit to the training set. But since it ultimately gives better test accuracy, it is helping your system.

Congratulations for finishing this assignment! And also for revolutionizing French football. :-)