Improving Deep Neural Networks[2]
对吴恩达老师的《优化深度神经网络》课程作业知识进行总结。
文章目录
正则化 Regularization
首先,明确正则化的目的:避免模型在训练过程中出现过拟合(overfitting)的情况。
过拟合:模型对训练集的适应性非常好,但是对测试集的适应性不佳,太过”特殊化“。
不妨参考以上图片(图源:红色石头):
图一属于欠拟合状态,一般解决方法:增加神经网络的隐藏层个数、神经元个数,训练时间延长,选择其它更复杂的NN模型等。
图三处于过拟合状态,一般解决方法: 增加训练样本数据,进行正则化Regularization,选择其他更复杂的NN模型等。
在本例中,我们面临的过拟合情况如下:
可以看到,存在几个红点/蓝点区域存在过拟合现象。
1 正则化是如何解决过拟合问题的?
简单地说,过拟合情况由于当前模型对当前训练集的特异性太强,缺乏一般化。
一个复杂的模型通常有着更强的表达能力,对于训练集数据量不足、问题较简单的情况,过于复杂的模型可能会导致结果太过特化。
正则化的实质是对模型的一个弱化,考虑较常用的两种正则化方法(也是吴恩达老师在本节中提到的):L2 Regularization,Dropout Regularization。
L2 Regularization
参考吴恩达老师的课件,L2 正则化将:
转化为:
在上式中,正则化项 ,被展开表示了。
正则化项的含义实际上是每一层权重矩阵的F范数(矩阵元素平方和再开平方)平方和乘上系数
,再除二倍的样本数。
在这里插入图片描述
因为代价函数的改变,反向传播过程也有改变:
比起原先的情况,梯度新添正则项梯度:
更新参数时,参数额外减去正则项。
即:
考虑系数
,当
取较大值,该权值将会接近0,等同于该神经元将会接近失活状态。
通过这种方法,可以弱化整个模型。
参考上图(图源:红色石头):
弱化后的复杂模型退化成了线性模型。当然,这是一种极端的情况。
因此,我们可以通过调整合适的 值,来保证解决过拟合而不引起欠拟合的情况。
注:L2 正则化是针对W权重进行的,一般地,我们不对偏置量b进行正则化,有以下两个解释,个人倾向于后者:
红色石头:其实也可以对b进行正则化。但是一般w的维度很大,而b只是一个常数。相比较来说,参数很大程度上由w决定,改变b值对整体模型影响较小。所以,一般为了简便,就忽略对b的正则化了。
csdn博主:我们通常只对权重做惩罚,而不对偏置做正则惩罚。因为精确拟合偏置所需的数据通常比权重少的多,正则化偏置参数可能会导致明显的欠拟合。
Dropout Regularization
Dropout 正则化译为随机失活,顾名思义,按照这一策略,我们将令每一个神经元以一定的概率失活(或存活)。
每一个神经元将以 keep_prob
的概率存活,以 1 - keep_prob
的概率失活。
参考L2 正则化中的解释,不难理解这一方法解决过拟合的原理。
Ref:
吴恩达《优化深度神经网络》课程笔记(1)– 深度学习的实用层面
2 L2 Regularization
依照:
在本例中,三层网络的正则化代价计算如下:
def compute_cost_with_regularization(A3, Y, parameters, lambd):
m = Y.shape[1]
W1 = parameters["W1"]
W2 = parameters["W2"]
W3 = parameters["W3"]
cross_entropy_cost = compute_cost(A3, Y)
L2_regularization_cost =
(1/m) * lambd * 0.5 * (np.sum(np.square(W1)) +
np.sum(np.square(W2)) +
np.sum(np.square(W3)))
cost = cross_entropy_cost + L2_regularization_cost
return cost
cost - iteration 图如下:
预测结果图如下:
可以看到,在合适的 的帮助下,过拟合现象得到了解决。
同时需要注意的是,吴恩达老师在本节中提到:
- 是一个超参数,在训练过程中可以由验证集进行调整,以取得合适的取值。
- 太大的 会导致欠拟合现象。
3 Dropout Regularization
根据随机失活的原理,每个神经元将以 keep_prob
的概率存活,以 1 - keep_prob
的概率失活。
def forward_propagation_with_dropout(X, parameters, keep_prob = 0.5):
# retrieve parameters
W1 = parameters["W1"]
# ...
b3 = parameters["b3"]
# LINEAR -> RELU -> LINEAR -> RELU -> LINEAR -> SIGMOID
Z1 = np.dot(W1, X) + b1
A1 = relu(Z1)
D1 = np.random.rand(A1.shape[0], A1.shape[1])
D1 = D1 < keep_prob
A1 = np.multiply(D1, A1)
A1 = A1 / keep_prob
Z2 = np.dot(W2, A1) + b2
A2 = relu(Z2)
D2 = np.random.rand(A2.shape[0], A2.shape[1])
D2 = D2 < keep_prob
A2 = np.multiply(D2, A2)
A2 = A2 / keep_prob
Z3 = np.dot(W3, A2) + b3
A3 = sigmoid(Z3)
cache = (Z1, D1, A1, W1, b1, Z2, D2, A2, W2, b2, Z3, A3, W3, b3)
return A3, cache
代码生成一个随机矩阵(元素值在(0-1)之间),按照 keep_prob
的阈值映射为(0-1)矩阵,对应位置相乘以实现“失活”。
因为在模型训练阶段使用Dropout正则化,而在模型发布后使用过程中是不会进行正则化的,因此我们需要保证每个神经元输出的期望与未使用dropout时一致。因此,在计算结束后,将矩阵Ai每个元素除 keep_prob
。
结合概率论的知识来具体看一下:假设一个神经元的输出激活值为a,在不使用dropout的情况下,其输出期望值为a,如果使用了dropout,神经元就可能有保留和关闭两种状态,把它看作一个离散型随机变量,它就符合概率论中的0-1分布,其输出激活值的期望变为 ,此时若要保持期望和不使用dropout时一致,就要除以 p。Ref: CSDN博主「ytusdc」
cost - iteration 图如下:
预测结果如下:
显然,使用Dropout正则化后,过拟合现象得到了解决。
同时需要注意的是:
- 注意不要在训练和测试的时候都使用Dropout正则化,只需要在训练时使用就可以了。
- 大部分开源框架都内置有Dropout正则化功能,无需担心使用难度。
- 前向、反向传播都需要使用Dropout。
- 在训练时,将输出结果除
keep_prob
以确保每个神经元的期望输出与不使用Dropout时一致。
4 总结 Conclusion
吴恩达老师在本节末提到:
- 正则化会使权重W的值降低
- 因为阻止了过拟合的发生,正则化会破坏训练集的表现(譬如降低训练集的准确度)。
- 但是正则化对测试集(未用于训练的数据)有利,这也是对整个模型系统有利的。
- L2 regularization 以及 Dropout 是两种非常有效的正则化方法。
上一篇:Improving Deep Neural Networks[1]
下一篇:Improving Deep Neural Networks[3]
2019/10 Karl