深度学习
在训练网络的过程中,数据我们一般分类成训练集,验证集以及测试集。以保证最后训练出来的网络的适用性。
如果训练集的误差很大的情况下,一般是存在欠拟合的情况,判断为偏差很大。如果偏差的确很高,甚至无法拟合训练集,那么你要做的就是选择一个新的网络,比如含有更多隐藏层或者隐藏单的网络,或者花费更多时间来训练网络,或者尝试更先进的优化算法。
在训练集误差不是很大,而验证集的误差相对来说很大的情况下,则是存在过拟合的现象,判断为方差很大。方差很大的情况下,可以通过两种方法进行修正:1、增加更多的训练数据,这个通常比较麻烦。2、进行正则化
正则化:
- L2正则化
一般我们采取的是L2正则化过程,在逻辑回归函数中加入正则化:
J
(
w
,
b
)
=
1
m
∑
i
=
1
m
L
(
a
,
y
)
+
λ
2
m
∑
i
=
1
m
w
[
i
]
J(w,b) = \frac{1}{m}\sum\limits_{i=1}^mL(a,y)+\frac{\lambda}{2m}\sum\limits_{i=1}^mw^{[i]}
J(w,b)=m1i=1∑mL(a,y)+2mλi=1∑mw[i]
=
1
m
∑
i
=
1
m
L
(
a
,
y
)
+
λ
2
m
∣
∣
w
∣
∣
2
=\frac{1}{m}\sum\limits_{i=1}^mL(a,y)+\frac{\lambda}{2m}||w||^{2}
=m1i=1∑mL(a,y)+2mλ∣∣w∣∣2
=
1
m
∑
i
=
1
m
L
(
a
,
y
)
+
λ
2
m
w
T
w
=\frac{1}{m}\sum\limits_{i=1}^mL(a,y)+\frac{\lambda}{2m}w^{T}w
=m1i=1∑mL(a,y)+2mλwTw一般只对w进行正则化,而不对b进行正则化,这是因为𝑤通常是一个高维参数矢量,已经可以表达高偏差问题,𝑤可能包含有很多参数,我们不可能拟合所有参数,而𝑏只是单个数字,𝑤几乎涵盖所有参数如果加了参数𝑏,其实也没太大影响,因为𝑏只是众多参数中的一个。
λ
\lambda
λ是正则化参数,一般是通过验证集和交叉验证集来配置这个参数。
∣
∣
w
∣
∣
2
||w||^{2}
∣∣w∣∣2称为弗罗贝尼乌斯范数,表示的是一个矩阵中所有元素的平方和。
d
W
[
l
]
=
d
J
d
W
[
l
]
+
λ
m
W
[
l
]
dW^{[l]} = \frac{dJ}{dW^{[l]}} + \frac{\lambda}{m}W^{[l]}
dW[l]=dW[l]dJ+mλW[l]所以:
W
[
l
]
=
W
[
l
]
−
α
d
W
[
l
]
=
W
[
l
]
−
α
d
J
d
W
[
l
]
−
α
λ
m
W
[
l
]
W^{[l]} = W^{[l]} -\alpha dW^{[l]}= W^{[l]} -\alpha\frac{dJ}{dW^{[l]}}-\alpha \frac{\lambda}{m}W^{[l]}
W[l]=W[l]−αdW[l]=W[l]−αdW[l]dJ−αmλW[l]相当于我们给矩阵 W 乘以(1 −
α
λ
m
\alpha \frac{\lambda}{m}
αmλ)倍的权重,矩阵𝑊减去
α
λ
m
\alpha \frac{\lambda}{m}
αmλ倍的它,使得W变得更小,这个系数小于 1,因此𝐿2正则化也被称为“权重衰减”。
正则化𝜆设置很大的时候,权重矩阵𝑊被设置为接近于 0 的值,也就是说把许多隐藏单元的权重设为 0,这些隐藏单元的影响被大大削弱了。如果是这种情况,这个被大大简化了的神经网络会变成一个很小的网络,小到如同一个逻辑回归单元,可是深度却很大,它会使这个网络从过度拟合的状态变成高偏差状态,也就是欠拟合状态。
那么在这个过渡的过程中,λ总会存在一个值使得拟合的程度达到刚刚好的效果。
- dropout正则化
还有另一种常用的正则化方法,也就是dropout正则化。dropout正则化就是遍历整个网络,然后在每一层的每一个节点以抛硬币的方式设置这个节点是否保留的概率,当完成整个网络的节点的设置之后,消除某些节点以及它的进出线,我们就得到了一个更加简洁的网络,利用这个精简的网络来训练我们的数据。对于所有样本,都是采取抛硬币的方式,删除某类节点,保留其余节点的集合,也就是训练一个更小的网络。
Dropout 可以随机删除网络中的神经单元。
反向随机失活(inverted dropout)方法是先随机生成一个布尔型数组,利用这个数组和激活函数的乘积,确定要消除的单元,然后通过将原来的激活函数的矩阵除以 keep-prob,向外扩展,修正和弥补我们删除的百分比,确保这个矩阵的期望值不变。每次迭代之后,神经网络都会比之前的小。
Dropout不会在任何一个输入加上太多权重,因为输入可能会被删除,因此该单元将通过这种方式积极地传播开,并为单元的每个输入增加一点权重,通过传播所有权重,dropout 将产生收缩权重的平方范数的效果,和之前讲过的𝐿2正则化类似,实施 dropout的结果是它会压缩权重,并完成一些预防过拟合的外层正则化。
在使用dropout的过程中,针对不同的隐藏层,如果某层权重较大,容易产生过拟合,则可以将他的keep-pro设置小一点,反之,如果不容易产生过拟合或者甚至不产生,那你可以将keep-pro设置为1。keep-pro在不同的层是变化的。在计算视觉中的输入量非常大,输入太多像素,以至于没有足够的数据,往往容易产生过拟合,所以 dropout在计算机视觉中应用得比较频繁,它能够十分有效防止过拟合。
除此之外,降低神经网络中的方差或预防过拟合常用的方法还有数据扩增,以及 early stopping 。