L2正则化
跟在机器学习中学的正则化一致,在代价函数后面加上所有权重矩阵的弗罗贝尼乌斯范数,即所有权重元素平方之和:
J
(
W
[
1
]
,
b
[
1
]
,
⋯
,
W
[
L
]
,
b
[
L
]
)
=
1
m
∑
i
=
1
m
L
(
y
^
(
i
)
,
y
(
i
)
)
+
λ
2
m
∑
l
=
1
L
∣
∣
W
[
l
]
∣
∣
F
2
∣
∣
W
[
L
]
∣
∣
F
2
=
∑
i
=
1
n
[
l
]
∑
j
=
1
n
[
l
−
1
]
(
w
i
j
[
l
]
)
2
J(W^{[1]},b^{[1]},\cdots,W^{[L]},b^{[L]})=\frac{1}{m}\sum_{i=1}^m\mathcal{L}(\hat{y}^{(i)},y^{(i)})+\frac{\lambda}{2m}\sum_{l=1}^L||W^{[l]}||^2_F\\ ||W^{[L]}||^2_F=\sum_{i=1}^{n^{[l]}}\sum_{j=1}^{n^{[l-1]}}(w_{ij}^{[l]})^2
J(W[1],b[1],⋯,W[L],b[L])=m1i=1∑mL(y^(i),y(i))+2mλl=1∑L∣∣W[l]∣∣F2∣∣W[L]∣∣F2=i=1∑n[l]j=1∑n[l−1](wij[l])2
最后梯度的表达式跟机器学习正则化也一样,增加了一项
λ
m
w
\frac{\lambda}{m}w
mλw,于是向后传播的公式改为
d
Z
[
l
]
=
d
A
[
l
]
∗
g
[
l
]
′
(
Z
[
l
]
)
d
W
[
l
]
=
1
m
d
Z
[
l
]
A
[
l
−
1
]
T
+
λ
m
d
W
[
l
]
d
b
[
l
]
=
1
m
n
p
.
s
u
m
(
d
Z
[
l
]
,
a
x
i
s
=
1
,
k
e
e
p
d
i
m
s
=
T
r
u
e
)
d
A
[
l
−
1
]
=
W
[
l
]
T
d
Z
[
l
]
\begin{aligned} &dZ^{[l]}=dA^{[l]}*g^{[l]'}(Z^{[l]})\\ &dW^{[l]}=\frac{1}{m}dZ^{[l]}A^{[l-1]T}+\frac{\lambda}{m}dW^{[l]}\\ &db^{[l]}=\frac{1}{m}np.sum(dZ^{[l]},axis=1,keepdims=True)\\ &dA^{[l-1]}=W^{[l]T}dZ^{[l]} \end{aligned}
dZ[l]=dA[l]∗g[l]′(Z[l])dW[l]=m1dZ[l]A[l−1]T+mλdW[l]db[l]=m1np.sum(dZ[l],axis=1,keepdims=True)dA[l−1]=W[l]TdZ[l]
原理大概就是通过把范数加入代价函数,使算法尝试减小权值(接近0),等效于削减了隐藏节点的影响,而隐藏节点变少,模型就会从高方差向高偏差转变,当你有一个合适的
λ
\lambda
λ时就能得到一个合理的模型。
为什么不添加关于偏置矩阵 b b b的正则化呢?是因为相比 W W W, b b b的元素数量非常少,所以其弗罗贝尼乌斯范数的值相比 W W W也很小,在代价函数中受到“重点关注”的仍然是 W W W中的元素,而 b b b参与正则化与否影响都不是太大,所以我们就不多此一举了。
缺点是要调试参数 λ \lambda λ,需要反复多次训练。
随机失活(dropout)
随机失活是指每次训练的时候,随机使一部分节点失效,将与这些节点相连的通路都删去,在这个网络上进行进行正向传播与反向传播对模型进行训练。
一种常见的实现是反向随机失活,对于第 l l l个隐藏层的节点向量 a [ l ] a^{[l]} a[l],我们生成一个相同大小随机向量,每个元素取值在 [ 0 , 1 ] [0,1] [0,1]。对于小于设定阈值的元素置为1,大于的设为0,用这个向量与 a [ l ] a^{[l]} a[l]元素对应相乘,就可以随机清零一些节点。设置的阈值称为keep-prob,即保留节点的概率。
在将节点置0后,对于剩下的节点,我们还要除1/keep-prob。因为置零后输出的期望会变成原本的keep-prob倍,为了使输出期望不变(这在测试的时候非常有帮助),我们要除keep-prob。
在实际测试的时候,我们就不需要再随机使节点失效了,直接按照普通正向传播运算即可,因为我们训练的时候已经使整个模型输出的期望不变了。
之所以随机失活正则化会有效,是因为它相当于每次训练的时候都在一个规模较小的神经网络上,小规模的网络就不容易过拟合。同时,因为每个节点都有可能被置零,所以模型不会依赖于某个特征值,而是会尽量综合所有被传播过来的信息。
另外,每层的阈值keep-prob可以是不同的,对于一些节点数较多的隐藏层,它们更容易发生过拟合,我们就把keep-prob设置的小一些,不容易过拟合的就可以大一些,甚至可以设置为1全部保留。不过这样的话超级参数就更多了……
还有一个缺点在于使用了随机失活以后,就没有一个很好定义的代价函数,如果强行绘制代价函数-迭代次数图像的话,该曲线很可能不是单减的。
数据集扩增
简单来说,就是用更大的训练集,这样就不会过拟合了,如果搜集不到数据,可以在已有数据的基础之上加一些魔改。
早终止法
简单来说,就是在模型从高偏差逐渐被训练到高方差的过程中直接停止训练,如果停止的时机足够巧妙,我们就能得到一个不错的模型。一个科学的判断方法时绘制验证集的代价函数曲线,在验证集的代价最低点停止。
该方法的好处就是没有什么需要调试的超参数,我们只需要看看验证集代价函数值最低在第几次迭代,然后重开一次训练在对应迭代次数停止训练就好了,非常简单快捷。缺点就是该方法把减小代价函数值和避免过拟合这两个任务混在了一起,违背了正交化理念(一个模块只干一件事),有时候会使得事情变得复杂。