如果训练的模型过拟合,也就是高方差,我们首先想到的是正则化。高方差的解决方法有准备充足的数据,但是有时候我们无法找到足够的数据。下文详细说明正则化方法,包括L2正则化(菲罗贝尼乌斯)、dropout机制、数据扩增、Early stopping。
一、逻辑回归中的正则化
需要求得损失函数
J
(
w
,
b
)
J(w,b)
J(w,b)的最小值,已知
J
(
w
,
b
)
=
1
m
∑
i
=
1
m
L
(
y
^
(
i
)
,
y
(
i
)
)
J(w,b)=\frac{1}{m} \sum_{i=1}^m L(\widehat{y}^{(i)},y^{(i)})
J(w,b)=m1i=1∑mL(y
(i),y(i))
在此基础上添加正则化参数
λ
\lambda
λ
J
(
w
,
b
)
=
1
m
∑
i
=
1
m
L
(
y
^
(
i
)
,
y
(
i
)
)
+
λ
2
m
∣
∣
w
∣
∣
2
2
J(w,b)=\frac{1}{m} \sum_{i=1}^m L(\widehat{y}^{(i)},y^{(i)})+\frac{\lambda}{2m}||w||_2^2
J(w,b)=m1i=1∑mL(y
(i),y(i))+2mλ∣∣w∣∣22
其中
w
w
w的欧几里得范数的平方等于元素平方和
L
2
r
e
g
u
l
a
r
i
z
a
t
i
o
n
:
∣
∣
w
∣
∣
2
2
=
∑
j
=
1
n
x
w
j
2
=
w
T
w
L2 regularization:||w||_2^2=\sum_{j=1}^{n_x} w_j^2=w^Tw
L2regularization:∣∣w∣∣22=j=1∑nxwj2=wTw
为什么省略b,因为w通常是一个高维参数矢量,已经可以表达高方差的情况,b对参数影响并不显著。
L
1
:
λ
2
m
∑
j
=
1
n
x
∣
w
j
∣
=
λ
2
m
∣
∣
w
∣
∣
1
L1:\frac{\lambda}{2m} \sum_{j=1}^{n_x}|w_j|=\frac{\lambda}{2m}||w||_1
L1:2mλj=1∑nx∣wj∣=2mλ∣∣w∣∣1
如果用L1正则化,W向量会很稀疏,会有很多0,有人说利于压缩模型,实际上并没有降低很多内存。我们更倾向于L2正则化。顺便说,
λ
\lambda
λ这个参数也是一个超参数,需要尝试哪个取值才是最优取值,为了方便编程,在Python中
λ
\lambda
λ是保留字段,编程通常写作lambd
作为正则化参数变量。
二、神经网络中的L2正则化
J
(
w
,
b
)
=
1
m
∑
i
=
1
m
L
(
y
^
(
i
)
,
y
(
i
)
)
+
λ
2
m
∑
l
=
1
L
∣
∣
w
[
l
]
∣
∣
F
2
J(w,b)=\frac{1}{m} \sum_{i=1}^m L(\widehat{y}^{(i)},y^{(i)})+\frac{\lambda}{2m}\sum_{l=1}^L ||w^{[l]}||_F^2
J(w,b)=m1i=1∑mL(y
(i),y(i))+2mλl=1∑L∣∣w[l]∣∣F2
其中,
∣
∣
w
[
l
]
∣
∣
F
2
=
∑
i
=
1
n
[
l
−
1
]
∑
j
=
1
n
[
1
]
(
w
i
j
[
l
]
)
2
||w^{[l]}||_F^2=\sum_{i=1}^{n^{[l-1]}}\sum_{j=1}^{n^{[1]}}(w_{ij}^{[l]})^2
∣∣w[l]∣∣F2=i=1∑n[l−1]j=1∑n[1](wij[l])2
L2范数,按照惯例称之为:Frobenius 菲罗贝尼乌斯范数,即矩阵中所有元素的平方和。
反向传播
d
w
[
l
]
=
(
f
r
o
m
b
a
c
k
p
r
o
p
)
+
λ
2
m
w
[
l
]
dw^{[l]}=(from backprop)+\frac{\lambda}{2m}w^{[l]}
dw[l]=(frombackprop)+2mλw[l]
w [ l ] = w [ l ] − α d w [ l ] w^{[l]}=w^{[l]}-\alpha dw^{[l]} w[l]=w[l]−αdw[l]
L2正则化被称作权重衰减的原因
w
[
l
]
=
w
[
l
]
−
α
[
(
f
r
o
m
b
a
c
k
p
r
o
p
)
+
λ
2
m
w
[
l
]
]
w^{[l]}=w^{[l]}-\alpha[(from backprop)+\frac{\lambda}{2m}w^{[l]}]
w[l]=w[l]−α[(frombackprop)+2mλw[l]]
w [ l ] = w [ l ] − α λ 2 m w [ l ] − α ( f r o m b a c k p r o p ) w^{[l]}=w^{[l]}-\frac{\alpha \lambda}{2m}w^{[l]}-\alpha(frombackprop) w[l]=w[l]−2mαλw[l]−α(frombackprop)
从上面的式子可以看到,不管w是什么,总是试图使w变得更小。实际上是给w矩阵乘上了小于1的系数 1 − α λ 2 m 1-\frac{\alpha \lambda}{2m} 1−2mαλ。
三、为什么正则化可以防止过拟合?
直觉经验告诉我们,
λ
\lambda
λ足够大的时候,使得w权重小到0,那么神经网络中的隐藏单元失效(在初始化权重那一课有讲),这样网络结构更趋近于逻辑回归,所以防止了高方差(过拟合)的情况。
λ
\lambda
λ足够大的时候,w会变得很小,z同样会变得很小,在激活函数上落在近似线性的部分上。(在激活函数使用非线性那一课中讲到)隐藏层的激活函数是线性的,这个网络就是线性网络,不管网络有多深,实际上起不到更好的训练效果,模型趋近于逻辑回归,不会发生过拟合的情况。
为了调试梯度下降,务必使用新定义的J函数,包含正则化项,否则J可能不会在所有调幅范围内都单调递减。
四、dropout
除了L2正则化方法,还有非常使用的正则化方法——dropout(随机失活)
dropout会遍历网络每一层,并设置消除神经网络中节点的概率。通过前面的内容,一定很容易理解为什么dropout可以防止过拟合了,因为随机扔弃一部分节点后,网络结构变得更小,更趋近线性拟合,过拟合的可能性更小。
Inverted dropout的实现
keep_prob = 0.8
d3 = np.random.rand(a3.shape[0], a3.shape[1]) < keep_prob
a3 = np.multiply(a3, d3)
a3 /= keep_prob
反向随机失活最后除以keep_prob确保a3的期望值不变。
五、dropout深入理解
- 每一层有不同的keep_prob保留值,根据每一层具体情况,参数多容易过拟合应当降低keep_prob的取值
- 输入层应尽可能接近1,因为是输入的是所需特征
- 缺点是为了使用交叉验证,需要搜索更多超级参数
- dropout在计算机视觉CV中应用频繁,维度很大但是数据较少
- 除非过拟合,我们不应该使用dropout
- 缺点还有代价函数很难明确定义(要求加入正则化项后J函数单减),通常做法是关闭dropout,将keep_prob设置为1.0后运行代码确保函数递减,再打开dropout函数。
六、其他正则化方法
数据扩增
- 水平翻转
- 随意裁剪
- 随意旋转
- 扭曲数字
Early stopping
考虑两方面: - 选择算法优化代价函数J
- 梯度下降
- Momentum
- RMSprop
- Adam
- 回避过拟合问题
- 正则化
- 扩增数据
提前停止训练不能同时解决如上两个问题。L2正则化通过尝试不同的正则化参数,但是需要承担很大的计算代价,如果不能承受很大的计算代价,early stopping也可以得到相似的结果。