深度学习的实用层面
数据的划分
给定一堆数据,我们需要将数据划分为训练集,验证集和测试集。训练集用于训练模型,验证集用于从不同的模型中选出最优的结构,测试集用于检测模型的泛化性能。
对于小数据,通常按照7/3(只分训练和测试)或者6/2/2。
对于大数据(百万级数据),按照98/1/1或者99.5/0.4/0.1划分。
验证集和测试集最好有同一个来源并且分布相同;若从同一堆数据中分割训练集、验证集和测试集,那么三个集合的分布最好与原始数据的分布一致。
bias和variance
high bias 通常是指训练模型不能很好的拟合训练数据(在训练集中错误率较高)
high variance 通常是指训练模型没有很好的泛化性能(在测试集中错误率较高)
当train set error为 1%,dev(验证集)set error为11%时,成为high variance;当train set error为 15%,dev(验证集)set error为16%时,成为high bias,因为训练集与验证集的误差相差不大;当train set error为 15%,dev(验证集)set error为31%时,成为high bias 和 high variance(训练集与验证集的误差都很高,但是验证集的误差更高)。吴恩达在视频中提到,以上假设的前提是人眼能充分识别样本集中的所有样本,即最优错误率(bages error)为0%时,上述情况是成立的。当最优错误率为15%时,那么训练集的错误率为15%就不能成为high bias。
high bias和high variance是说训练样本过分拟合了训练集中的部分数据,但对其余数据是线性分布。
模型训练的基本观点
对于high bias的情况,可以使用更深的网络,更长的训练时间,甚至选择不同的神经网络结构来调整
对于high variance的情况,可以用更多的数据训练并通过正则化来减少过拟合。(正则化后的网络加深只会增大训练时间。正常来说,正则化之后的网络variance降低但bias增大,但可以通过使用更大更深的网络来避免这种情况)
regularization
添加范数
J
(
ω
,
b
)
=
1
m
∑
i
=
1
m
L
(
y
^
(
i
)
,
y
(
i
)
)
+
λ
2
m
∣
∣
ω
∣
∣
F
J(\omega, b) = \frac{1}{m}\sum_{i=1}^m\mathcal{L}(\hat{y}^{(i)}, y^{(i)}) + \frac{\lambda}{2m}||\omega||_F
J(ω,b)=m1i=1∑mL(y^(i),y(i))+2mλ∣∣ω∣∣F
范数可以为二范数,也可以为一范数。
∣
∣
ω
∣
∣
2
2
=
∑
j
=
1
n
x
ω
j
2
=
ω
T
ω
||\omega||_2^2 = \sum_{j=1}^{n_x} \omega_j^2 = \omega^T\omega
∣∣ω∣∣22=j=1∑nxωj2=ωTω
∣
∣
ω
∣
∣
1
=
∑
i
=
1
n
x
∣
ω
i
||\omega||_1 = \sum_{i=1}^{n_x}|\omega_i
∣∣ω∣∣1=i=1∑nx∣ωi
在模型训练的过程中
λ
\lambda
λ 是通过验证集来配置。
为什么添加范数可以防止过拟合
过拟合很大程度上是因为训练的模型过于复杂导致的。以正则化项为二范数为例
d
ω
[
l
]
=
(
from backward
)
+
λ
m
ω
[
l
]
d\omega^{[l]} = (\text{from backward}) + \frac{\lambda}{m}\omega^{[l]}
dω[l]=(from backward)+mλω[l]
ω
[
l
]
=
ω
[
l
]
−
α
d
ω
[
l
]
\omega^{[l]} = \omega^{[l]} - \alpha d\omega^{[l]}
ω[l]=ω[l]−αdω[l]
所以
ω
[
l
]
=
ω
[
l
]
−
α
[
(
from backward
)
+
λ
m
ω
[
l
]
]
\omega^{[l]} = \omega^{[l]} - \alpha [(\text{from backward}) + \frac{\lambda}{m}\omega^{[l]}]
ω[l]=ω[l]−α[(from backward)+mλω[l]]
=
(
1
−
α
λ
m
)
ω
[
l
]
−
α
(
from backward
)
= (1- \frac{\alpha\lambda}{m})\omega^{[l]} - \alpha(\text{from backward})
=(1−mαλ)ω[l]−α(from backward)
所以参数
ω
[
l
]
\omega^{[l]}
ω[l] 变小,权重衰减(weight decay),对于激活函数(如tanh),当权重很小时,激活函数可以近似为线性函数,若多个网络层全为近似线性的函数,那么训练出的模型也可近似认为是线性,所以整个网络复杂度就会降低,很好的预防了过拟合。
如果用一范数作为正则化项,可以在一定程度上使权重表现出很好的稀疏度
Dropout
定义
以一定概率消除网络中的某些节点,并消除进入和离开该节点的连线。
实现方法
吴恩达是通过随机化一个与权重矩阵大小相同的随机矩阵,若随机矩阵上的值小于keep_prob,那么就将这些位置上的值设为0。做了这些处理之后,权重矩阵的均值会减少,因此需要将处理后的权重矩阵除以keep_prob。
在实现dropout的backward时,可以根据权重矩阵,对那些为0位置上的权重不进行权重的更新。
测试阶段不会使用 dropout,因为不想使结果随机
优势
因为每一个节点都可能被取消,因此训练的网络不会过分依赖某一个feature,但是缺点是该方法不能很好的表述。
因为dropout可能带来欠拟合的现象,因此除非过拟合,否则不使用dropout。
其他regularization的方法
- 数据增强
- early stopping
normalization
均值零化
μ
=
1
m
∑
i
=
1
m
x
(
i
)
\mu = \frac{1}{m}\sum_{i=1}^m x^{(i)}
μ=m1i=1∑mx(i)
x
=
x
−
μ
x= x-\mu
x=x−μ
归一化方差
σ
2
=
1
m
∑
i
=
1
m
x
(
i
)
∗
∗
2
\sigma^2 = \frac{1}{m}\sum_{i=1}^m x^{(i)}**2
σ2=m1i=1∑mx(i)∗∗2
x
=
x
/
σ
2
x = x/\sigma^2
x=x/σ2
当输入测试集时同样需要归一化。
在normalization之后,可以选用较大的学习率,比较快速的实现梯度下降。
对于图片这种输入在一定范围内的输入一般不需要做normalization
梯度消失和梯度爆炸
当权重大于1时,随着神经网络的加深,权重会越来越大,发生梯度爆炸。
当权重小于1时,随着神经网络的加深,权重会越来越小,发生梯度消失。
为了防止这种情况的发生,权重通常选择1的近似值,所以在权重初始化时,通常会乘上系数。
- ReLU的初始化: ω [ l ] = n p . r a n d o m . r a n d n ( s h a p e ) ∗ n p . s q r t ( 2 n [ l − 1 ] ) \omega^{[l]} = np.random.randn(shape)*np.sqrt(\frac{2}{n^{[l-1]}}) ω[l]=np.random.randn(shape)∗np.sqrt(n[l−1]2)
- tanh的初始化: ω [ l ] = n p . r a n d o m . r a n d n ( s h a p e ) ∗ n p . s q r t ( 1 n [ l − 1 ] ) \omega^{[l]} = np.random.randn(shape)*np.sqrt(\frac{1}{n^{[l-1]}}) ω[l]=np.random.randn(shape)∗np.sqrt(n[l−1]1) 或 ω [ l ] = n p . r a n d o m . r a n d n ( s h a p e ) ∗ n p . s q r t ( 2 n [ l − 1 ] ∗ n [ l ] ) \omega^{[l]} = np.random.randn(shape)*np.sqrt(\frac{2}{n^{[l-1]}*n^{[l]}}) ω[l]=np.random.randn(shape)∗np.sqrt(n[l−1]∗n[l]2)