Improving Deep Neural Networks[2]
对吴恩达老师的《优化深度神经网络》课程作业知识进行总结。
文章目录
正则化 Regularization
首先,明确正则化的目的:避免模型在训练过程中出现过拟合(overfitting)的情况。
过拟合:模型对训练集的适应性非常好,但是对测试集的适应性不佳,太过”特殊化“。
不妨参考以上图片(图源:红色石头):
图一属于欠拟合状态,一般解决方法:增加神经网络的隐藏层个数、神经元个数,训练时间延长,选择其它更复杂的NN模型等。
图三处于过拟合状态,一般解决方法: 增加训练样本数据,进行正则化Regularization,选择其他更复杂的NN模型等。
在本例中,我们面临的过拟合情况如下:
可以看到,存在几个红点/蓝点区域存在过拟合现象。
1 正则化是如何解决过拟合问题的?
简单地说,过拟合情况由于当前模型对当前训练集的特异性太强,缺乏一般化。
一个复杂的模型通常有着更强的表达能力,对于训练集数据量不足、问题较简单的情况,过于复杂的模型可能会导致结果太过特化。
正则化的实质是对模型的一个弱化,考虑较常用的两种正则化方法(也是吴恩达老师在本节中提到的):L2 Regularization,Dropout Regularization。
L2 Regularization
参考吴恩达老师的课件,L2 正则化将:
J
=
−
1
m
∑
i
=
1
m
(
y
(
i
)
log
(
a
[
L
]
(
i
)
)
+
(
1
−
y
(
i
)
)
log
(
1
−
a
[
L
]
(
i
)
)
)
(1)
J = -\frac{1}{m} \sum\limits_{i = 1}^{m} \large{(}\small y^{(i)}\log\left(a^{[L](i)}\right) + (1-y^{(i)})\log\left(1- a^{[L](i)}\right) \large{)} \tag{1}
J=−m1i=1∑m(y(i)log(a[L](i))+(1−y(i))log(1−a[L](i)))(1)
转化为:
J
r
e
g
u
l
a
r
i
z
e
d
=
−
1
m
∑
i
=
1
m
(
y
(
i
)
log
(
a
[
L
]
(
i
)
)
+
(
1
−
y
(
i
)
)
log
(
1
−
a
[
L
]
(
i
)
)
)
⏟
cross-entropy cost
+
1
m
λ
2
∑
l
∑
k
∑
j
W
k
,
j
[
l
]
2
⏟
L2 regularization cost
(2)
J_{regularized} = \small \underbrace{-\frac{1}{m} \sum\limits_{i = 1}^{m} \large{(}\small y^{(i)}\log\left(a^{[L](i)}\right) + (1-y^{(i)})\log\left(1- a^{[L](i)}\right) \large{)} }_\text{cross-entropy cost} + \underbrace{\frac{1}{m} \frac{\lambda}{2} \sum\limits_l\sum\limits_k\sum\limits_j W_{k,j}^{[l]2} }_\text{L2 regularization cost} \tag{2}
Jregularized=cross-entropy cost
−m1i=1∑m(y(i)log(a[L](i))+(1−y(i))log(1−a[L](i)))+L2 regularization cost
m12λl∑k∑j∑Wk,j[l]2(2)
在上式中,正则化项 λ 2 m ∑ l = 1 L ∣ ∣ W [ l ] ∣ ∣ F 2 \dfrac{\lambda}{2m}\sum\limits_{l=1}^{L}||W^{[l]}||_F^2 2mλl=1∑L∣∣W[l]∣∣F2,被展开表示了。
正则化项的含义实际上是每一层权重矩阵的F范数(矩阵元素平方和再开平方)平方和乘上系数
λ
\lambda
λ,再除二倍的样本数。
在这里插入图片描述
因为代价函数的改变,反向传播过程也有改变:
比起原先的情况,梯度新添正则项梯度: d d W ( λ 2 m W 2 ) = λ m w [ l ] \dfrac{d}{dW}(\dfrac{\lambda}{2m}W^2)=\dfrac{\lambda}{m}w^{[l]} dWd(2mλW2)=mλw[l]
更新参数时,参数额外减去正则项。
d
w
[
l
]
=
d
w
b
e
f
o
r
e
[
l
]
+
λ
m
w
[
l
]
w
[
l
]
:
=
w
[
l
]
−
α
⋅
d
w
[
l
]
\begin{array}{l}{d w^{[l]}=d w_{b e f o r e}^{[l]}+\frac{\lambda}{m} w^{[l]}} \\ {w^{[l]}:=w^{[l]}-\alpha \cdot d w^{[l]}}\end{array}
dw[l]=dwbefore[l]+mλw[l]w[l]:=w[l]−α⋅dw[l]
即:
w
[
l
]
:
=
w
∣
l
∣
−
α
⋅
d
w
∣
l
∣
=
w
∣
l
∣
−
α
⋅
(
d
w
b
e
f
o
r
e
∣
l
∣
+
λ
m
w
∣
l
∣
)
=
(
1
−
α
λ
m
)
w
[
l
]
−
α
⋅
d
w
b
e
f
o
r
e
[
l
]
\begin{aligned} w^{[l]} &:=w^{|l|}-\alpha \cdot d w^{|l|} \\ &=w^{|l|}-\alpha \cdot\left(d w_{b e f o r e}^{|l|}+\frac{\lambda}{m} w^{|l|}\right) \\ &=\left(1-\alpha \frac{\lambda}{m}\right) w^{[l]}-\alpha \cdot d w_{b e f o r e}^{[l]} \end{aligned}
w[l]:=w∣l∣−α⋅dw∣l∣=w∣l∣−α⋅(dwbefore∣l∣+mλw∣l∣)=(1−αmλ)w[l]−α⋅dwbefore[l]
考虑系数
(
1
−
α
λ
m
)
(1-\alpha \frac{\lambda}{m})
(1−αmλ),当
λ
\lambda
λ取较大值,该权值将会接近0,等同于该神经元将会接近失活状态。
通过这种方法,可以弱化整个模型。
参考上图(图源:红色石头):
弱化后的复杂模型退化成了线性模型。当然,这是一种极端的情况。
因此,我们可以通过调整合适的 λ \lambda λ值,来保证解决过拟合而不引起欠拟合的情况。
注:L2 正则化是针对W权重进行的,一般地,我们不对偏置量b进行正则化,有以下两个解释,个人倾向于后者:
红色石头:其实也可以对b进行正则化。但是一般w的维度很大,而b只是一个常数。相比较来说,参数很大程度上由w决定,改变b值对整体模型影响较小。所以,一般为了简便,就忽略对b的正则化了。
csdn博主:我们通常只对权重做惩罚,而不对偏置做正则惩罚。因为精确拟合偏置所需的数据通常比权重少的多,正则化偏置参数可能会导致明显的欠拟合。
Dropout Regularization
Dropout 正则化译为随机失活,顾名思义,按照这一策略,我们将令每一个神经元以一定的概率失活(或存活)。
每一个神经元将以 keep_prob
的概率存活,以 1 - keep_prob
的概率失活。
参考L2 正则化中的解释,不难理解这一方法解决过拟合的原理。
Ref:
吴恩达《优化深度神经网络》课程笔记(1)– 深度学习的实用层面
2 L2 Regularization
依照:
J r e g u l a r i z e d = − 1 m ∑ i = 1 m ( y ( i ) log ( a [ L ] ( i ) ) + ( 1 − y ( i ) ) log ( 1 − a [ L ] ( i ) ) ) ⏟ cross-entropy cost + 1 m λ 2 ∑ l ∑ k ∑ j W k , j [ l ] 2 ⏟ L2 regularization cost J_{regularized} = \small \underbrace{-\frac{1}{m} \sum\limits_{i = 1}^{m} \large{(}\small y^{(i)}\log\left(a^{[L](i)}\right) + (1-y^{(i)})\log\left(1- a^{[L](i)}\right) \large{)} }_\text{cross-entropy cost} + \underbrace{\frac{1}{m} \frac{\lambda}{2} \sum\limits_l\sum\limits_k\sum\limits_j W_{k,j}^{[l]2} }_\text{L2 regularization cost} Jregularized=cross-entropy cost −m1i=1∑m(y(i)log(a[L](i))+(1−y(i))log(1−a[L](i)))+L2 regularization cost m12λl∑k∑j∑Wk,j[l]2
在本例中,三层网络的正则化代价计算如下:
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 图如下:
预测结果图如下:
可以看到,在合适的 λ \lambda λ的帮助下,过拟合现象得到了解决。
同时需要注意的是,吴恩达老师在本节中提到:
- λ \lambda λ 是一个超参数,在训练过程中可以由验证集进行调整,以取得合适的取值。
- 太大的 λ \lambda λ 会导致欠拟合现象。
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分布,其输出激活值的期望变为 p ∗ a + ( 1 − p ) ∗ 0 = p a p*a+(1-p)*0=pa p∗a+(1−p)∗0=pa,此时若要保持期望和不使用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