1.视频网站:mooc慕课https://mooc.study.163.com/university/deeplearning_ai#/c
2.详细笔记网站(中文):http://www.ai-start.com/dl2017/
3.github课件+作业+答案:https://github.com/stormstone/deeplearning.ai
1.4 正则化 Regularization
DL可能存在过拟合问题——高方差,有两个解决方法
- 准备更多的数据。这是非常可靠的方法,但你可能无法时时刻刻准备足够多的训练数据或者获取更多数据的成本很高。
- 正则化,通常有助于避免过拟合或减少你的网络误差。
如果你怀疑NN过度拟合了数据,即存在高方差问题,那么最先想到的方法可能是正则化,另一个解决高方差的方法就是准备更多数据。
1.正则化的作用原理
我们用逻辑回归来实现这些设想。求成本函数J的最小值。
J
(
w
,
b
)
=
1
m
∑
i
=
1
m
L
(
y
^
(
i
)
,
y
(
i
)
)
+
λ
2
m
∣
∣
w
∣
∣
2
2
J(w,b)=\frac 1m \sum_{i=1}^mL(\hat y^{(i)},y^{(i)})+\frac \lambda{2m}||w||^2_2
J(w,b)=m1i=1∑mL(y^(i),y(i))+2mλ∣∣w∣∣22
参数包含一些训练数据和不同数据中个体预测的损失,w和b是逻辑回归的2个参数。
- w是一个多(n)维参数向量, w ∈ R n w \in R^n w∈Rn
- b是一个实数
- λ,正则化参数。在逻辑回归函数中加入正则化,只需添加参数λ。
向量参数w 欧几里德范数 Euclidean norm(L2范数,即
∣
∣
w
∣
∣
2
||w||_2
∣∣w∣∣2)的平方,等于wj(j值从1到n)平方的和,也可以表示为wTw,被称为 L2正则化。
∣
∣
w
∣
∣
2
2
=
∑
j
=
1
n
w
j
2
=
w
T
w
||w||^2_2=\sum_{j=1}^nw_j^2=w^Tw
∣∣w∣∣22=j=1∑nwj2=wTw
上面介绍的内容可以参见下图。
那么为什么只正则化参数w,为什么不再加上参数b呢(即再加上正则化公式 λ 2 m b 2 \frac \lambda{2m}b^2 2mλb2)?
你可以这么做,只是通常习惯省略不写。
因为w通常是一个高维参数向量,已经可以表达高偏差问题,w可能包含有很多参数,我们不可能拟合所有参数。而b只是单个数字,与几乎涵盖了所有参数的向量w对比,如果正则化加了参数b,其实也没太大影响,因为b只是众多参数中的一个,通常省略不计。
如果你想加上b,也完全没问题。
2.L1和L2正则化
L2正则化是最常见的正则化类型。
而L1正则化加的不是L2范数,而是 λ m ∑ j = 1 m ∣ w j ∣ = λ m ∣ ∣ w j ∣ ∣ 1 \frac \lambda m\sum_{j=1}^m|w_j|= \frac \lambda m||w_j||_1 mλ∑j=1m∣wj∣=mλ∣∣wj∣∣1。
- ∣ ∣ w j ∣ ∣ 1 ||w_j||_1 ∣∣wj∣∣1被称为L1范式,向量中各个元素绝对值之和
如果用的是L1正则化,w最终会是稀疏的,也就是说w向量中有很多0。
有人说这样有利于压缩模型,因为集合中参数均为0,存储模型所占用的内存更少。
实际上,虽然L1正则化使模型变得稀疏,却没有降低太多存储内存,所以我认为这并不是L1正则化的目的,至少不是为了压缩模型,人们在训练网络时,越来越倾向于使用L2正则化。
λ是正则化参数,我们通常使用验证集或交叉验证集来配置这个参数,尝试各种各样的数据,寻找最好的参数。我们要考虑训练集( 1 m ∑ i = 1 m L ( y ^ ( i ) , y ( i ) ) \frac 1m\sum_{i=1}^mL(\hat y^{(i)},y^{(i)}) m1∑i=1mL(y^(i),y(i)))之间的权衡,把λ参数设置为较小值,这样可以避免过拟合,所以λ是另外一个需要调整的超参。
3.NN中实现L2正则化
如何在NN中实现L2正则化呢?
NN含有一个成本函数
J
(
W
[
1
]
,
b
[
1
]
.
.
.
.
.
.
W
[
L
]
,
b
[
L
]
)
=
1
m
∑
i
=
1
n
L
(
y
^
(
i
)
,
y
(
i
)
)
+
λ
2
m
∑
l
=
1
L
∣
∣
W
[
l
]
∣
∣
F
2
J(W^{[1]},b^{[1]}......W^{[L]},b^{[L]})=\frac1m\sum_{i=1}^nL(\hat y^{(i)},y^{(i)})+\frac \lambda {2m}\sum_{l=1}^L||W^{[l]}||_F^2
J(W[1],b[1]......W[L],b[L])=m1i=1∑nL(y^(i),y(i))+2mλl=1∑L∣∣W[l]∣∣F2
- 成本函数包含了从 W [ 1 ] , b [ 1 ] W^{[1]},b^{[1]} W[1],b[1]到 W [ L ] , b [ L ] W^{[L]},b^{[L]} W[L],b[L]所有参数
- L是NN包含的层数
- 成本函数等于m个训练样本损失函数的总和的平均值
- W是一个 n [ l ] n^{[l]} n[l] x n [ l − 1 ] n^{[l-1]} n[l−1]维矩阵,其中 n [ l ] n^{[l]} n[l]表示l层单元数量, n [ l − 1 ] n^{[l-1]} n[l−1]表示l-1层单元的数量
∣
∣
W
[
l
]
∣
∣
2
||W^{[l]}||^2
∣∣W[l]∣∣2称为范数平方,它是W矩阵中所有元素的平方求和。
∣
∣
W
[
l
]
∣
∣
2
=
∑
i
=
1
n
[
l
]
∑
j
=
1
n
[
l
−
1
]
(
W
i
j
[
l
]
)
2
||W^{[l]}||^2=\sum_{i=1}^{n^{[l]}}\sum_{j=1}^{n^{[l-1]}}(W_{ij}^{[l]})^2
∣∣W[l]∣∣2=i=1∑n[l]j=1∑n[l−1](Wij[l])2
上面公式中第一个求和符号其值 i 从1到
n
[
l
−
1
]
n^{[l-1]}
n[l−1],第二个其值 j 从1到
n
[
l
]
n^{[l]}
n[l]。
该矩阵范数被称作“弗罗贝尼乌斯范数” Frobenius norm,用下标“F”标注( ∣ ∣ ∣ ∣ F 2 ||||^2_F ∣∣∣∣F2)。它表示一个矩阵中所有元素的平方和。注意:这里不是叫“矩阵L2范数”( ∣ ∣ ∣ ∣ 2 2 ||||^2_2 ∣∣∣∣22)。
4.利用弗罗贝尼乌斯范数实现梯度下降-权重衰减
如何使用弗罗贝尼乌斯范数实现梯度下降呢?
我们已经了解过深层NN梯度下降算法,先通过反向传播计算出dW,然后更新W参数,
W
[
l
]
=
W
[
l
]
−
α
d
W
[
l
]
W^{[l]}=W^{[l]}-\alpha dW^{[l]}
W[l]=W[l]−αdW[l]
由于NN成本函数J中追加了正则化项,所以这里dW也要增加正则化项
λ
m
W
[
l
]
\frac \lambda mW^{[l]}
mλW[l]
此时dW的定义含有相关参数代价函数导数和( 1 m d Z [ l ] A [ l − 1 ] T \frac 1mdZ^{[l]}A^{[l−1]T} m1dZ[l]A[l−1]T,相关公式参见链接),以及最后添加的额外正则项。
观察下式,你可以看到由于dW增加了正则项,所以权重W的更新多减了一个正则项
α
λ
m
W
[
l
]
\alpha\frac \lambda mW^{[l]}
αmλW[l]。相当于我们给矩阵W乘以
1
−
α
λ
m
1-\alpha \frac \lambda m
1−αmλ倍的权重,而该系数小于1,看上去它就像一般的梯度下降,因此L2正则化也被称为“权重衰减”。
以上就是在NN中应用L2正则化的过程。