训练/开发/测试集
- 数 据 集 { 训 练 集 ( t r a i n ) : 数 据 集 越 大 , 占 比 越 大 验 证 集 ( d e v ) 测 试 集 ( t e s t ) : 对 最 终 所 选 定 的 神 经 网 络 做 出 无 偏 估 计 ( 无 需 无 偏 估 计 可 以 不 设 测 试 集 ) 数据集\left\{ \begin{aligned} &训练集(train):数据集越大,占比越大& \\ &验证集(dev)& \\ &测试集(test):对最终所选定的神经网络做出无偏估计 \\ &(无需无偏估计可以不设测试集)& \end{aligned} \right. 数据集⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧训练集(train):数据集越大,占比越大验证集(dev)测试集(test):对最终所选定的神经网络做出无偏估计(无需无偏估计可以不设测试集)
- 只有Train sets和Dev sets,通常也有人把这里的Dev sets称为Test sets,注意加以区别。
我们可以通过Train sets训练不同的算法模型,然后分别在Dev sets上进行验证,根据结果选择最好的算法模型。
偏差/方差
- high bias表示欠拟合,high variance表示过拟合。
偏差用于衡量Train set error,方差用于衡量Train set error与Dev set error的差值。
正则化
- 如果出现了高方差,也就是过拟合的情况,则需要采用正则化(regularization)来解决。
解决过拟合的方法有正则化和扩大数据。但通常获得更多训练样本的成本太高,比较困难。
使用L2正则化逻辑回归模型,表达式修正为:
J
(
ω
,
b
)
=
1
m
∑
i
=
1
m
L
(
y
^
(
i
)
,
y
(
i
)
)
+
λ
2
m
∣
∣
ω
∣
∣
2
2
J(\omega,b)=\frac{1}{m}\sum_{i=1}^m L(\hat y(i),y(i))+\frac{\lambda}{2m}||\omega||^2_2
J(ω,b)=m1i=1∑mL(y^(i),y(i))+2mλ∣∣ω∣∣22
∣
∣
ω
∣
∣
2
2
=
∑
j
=
1
n
x
ω
j
2
=
ω
T
ω
||\omega||^2_2=\sum_{j=1}^{n_{x}}\omega^2_j=\omega^T\omega
∣∣ω∣∣22=j=1∑nxωj2=ωTω
其中
λ
\lambda
λ就是正则化参数(超参数的一种)。
也可以对b进行正则化。但是一般w为高维参数矢量,而b只是一个常数。相比较来说,参数很大程度上由w决定,改变b值对整体模型影响较小。所以为了简便,一般忽略对b的正则化。
在深度学习模型中,L2 regularization的表达式为:
J
(
ω
[
1
]
,
b
[
1
]
,
…
,
ω
[
L
]
,
b
[
L
]
)
=
1
m
∑
i
=
1
m
L
(
y
^
(
i
)
,
y
(
i
)
)
+
λ
2
m
∑
l
=
1
L
∣
∣
ω
[
l
]
∣
∣
2
J(\omega^{[1]},b^{[1]},…,\omega^{[L]},b^{[L]})=\frac{1}{m}\sum_{i=1}^m L(\hat y(i),y(i))+\frac{\lambda}{2m}\sum_{l=1}^L||\omega^{[l]}||^2
J(ω[1],b[1],…,ω[L],b[L])=m1i=1∑mL(y^(i),y(i))+2mλl=1∑L∣∣ω[l]∣∣2
∣
∣
ω
[
l
]
∣
∣
2
=
∑
i
=
1
n
[
l
]
∑
j
=
1
n
[
l
−
1
]
(
ω
i
j
[
l
]
)
2
||\omega^{[l]}||^2=\sum_{i=1}^{n^{[l]}}\sum_{j=1}^{n^{[l-1]}}(\omega^{[l]}_{ij})^2
∣∣ω[l]∣∣2=i=1∑n[l]j=1∑n[l−1](ωij[l])2
其中
∣
∣
ω
[
l
]
∣
∣
2
||\omega^{[l]}||^2
∣∣ω[l]∣∣2称为弗罗贝尼乌斯(Frobenius)范数。
为什么正则化可以预防过拟合
使用L2 regularization,当λ很大时,w[l]≈0,意为将某些神经元权重趋于0,给忽略掉了,问题就从high variance变成了high bias了。
另外,假设激活函数是tanh函数。tanh函数的特点是在z接近零的区域,函数近似是线性的,而当|z|很大的时候,函数非线性且变化缓慢。当使用正则化,λ较大,即对权重w[l]的惩罚较大,w[l]减小。因为z[l]=w[l]a[l]+b[l]。当w[l]减小的时候,z[l]也会减小。则此时的z[l]分布在tanh函数的近似线性区域。那么这个神经元起的作用就相当于是线性回归(linear regression)。如果每个神经元对应的权重w[l]都比较小,那么整个神经网络模型相当于是多个linear regression的组合,即可看成一个linear network。得到的分类超平面就会比较简单,不会出现过拟合现象。
Dropout正则化
- 除了L2 regularization之外,还有另外正则化合的有效方法:Dropout(随机失活)。
- Dropout是指在深度学习网络的训练过程中,对于每层的神经元,按照一定的概率将其暂时从网络中丢弃。对于m个样本,单次迭代训练时,随机删除掉隐藏层一定数量的神经元;然后,在删除后的剩下的神经元上正向和反向更新权重w和常数项b;接着,下一次迭代中,再恢复之前删除的神经元,重新随机删除一定数量的神经元,进行正向和反向更新w和b。不断重复上述过程,直至迭代训练完成。
注意 使用dropout ** 训练 结束后,在测试和实际应用**模型时,不需要进行dropout和随机删减神经元,所有的神经元都在工作。
理解Dropout
- 不同隐藏层的dropout系数keep_prob可以不同。一般来说,神经元越多的隐藏层,keep_out可以设置得小一些.,例如0.5;神经元越少的隐藏层,keep_out可以设置的大一些,例如0.8,甚至是1。
- 实际应用中,不建议对输入层进行dropout,如果输入层维度很大,例如图片,那么可以设置dropout,但keep_out应设置的大一些,例如0.8,0.9。
- 使用dropout的时候,可以通过绘制cost function来进行debug,看看dropout是否正确执行。一般做法是,将所有层的keep_prob全设置为1,再绘制cost function,即涵盖所有神经元,看J是否单调下降。下一次迭代训练时,再将keep_prob设置为其它值。
其他正则化方法
除了L2 regularization和dropout regularization之外,还有其它减少过拟合的方法。
1.增加训练样本数量。
例如图片识别问题中,可以对已有的图片进行水平翻转、垂直翻转、任意角度旋转、缩放或扩大等等。
2.early stopping。
一个神经网络模型随着迭代训练次数增加,train set error一般是单调减小的,而dev set error 先减小,之后又增大。 也就是说训练次数过多时,模型会对训练样本拟合的越来越好,但是对验证集拟合效果逐渐变差,即发生了过拟合。因此,迭代训练次数不是越多越好,可以通过train set error和dev set error随着迭代次数的变化趋势,选择合适的迭代次数,即early stopping。
- Early stopping有其自身缺点。
机器学习训练模型有两个目标:一是选择一个算法来优化代价函数 J ( ω , b ) J(\omega,b) J(ω,b);二是防止过拟合。 这两个目标彼此对立的,即减小 J ( ω , b ) J(\omega,b) J(ω,b)的同时可能会造成过拟合,反之亦然。我们把这二者之间的关系称为正交化(orthogonalization)。
在深度学习中,我们可以同时减小Bias和Variance,构建最佳神经网络模型。但是,Early stopping提早停止了梯度下降,同时也就停止了优化代价函数 J ( ω , b ) J(\omega,b) J(ω,b)。 - 与early stopping相比,L2 正则化可以实现“分而治之”的效果:迭代训练足够多,减小J,而且也能有效防止过拟合。
而L2 regularization的缺点之一是最优的正则化参数λ的选择比较复杂。对这一点来说,early stopping比较简单。
总的来说,L2 regularization更加常用一些。
正则化输入
- 在训练神经网络时,标准化输入可以提高训练的速度。
标准化输入就是对训练数据集进行归一化的操作,让所有输入归一化同样的尺度上,方便进行梯度下降算法时能够更快更准确地找到全局最优解。
即将原始数据减去其均值 μ μ μ后,再除以其方差 σ 2 σ^2 σ2,书写表达式为:
μ = 1 m ∑ i = 1 m X ( i ) μ=\frac{1}{m}\sum_{i=1}^m X^{(i)} μ=m1i=1∑mX(i)
σ 2 = 1 m ∑ i = 1 m ( X ( i ) ) 2 σ^2=\frac{1}{m}\sum_{i=1}^m (X^{(i)})^2 σ2=m1i=1∑m(X(i))2
X : = X − μ σ 2 X:=\frac{X-μ}{σ^2} X:=σ2X−μ
图示为:
注意 由于训练集进行了标准化处理,那么对于测试集或在实际应用时,应该使用同样的 μ μ μ和 σ 2 σ^2 σ2对其进行标准化处理。
梯度消失与梯度爆炸
-
梯度消失和梯度爆炸(Vanishing and Exploding gradients):当训练一个 层数非常多的神经网络时,计算得到的梯度可能非常小或非常大,甚至是指数级别的减小或增大。这样会让训练过程变得非常困难。
*例如,假设一个多层的每层只包含两个神经元的深度神经网络模型,如下图所示:为了简化复杂度,便于分析,我们令各层的激活函数为线性函数,即 g ( Z ) = Z g(Z)=Z g(Z)=Z。且忽略各层常数项b的影响,令b全部为零。那么,该网络的预测输出 Y ^ \hat Y Y^为:
Y ^ = W [ L ] W [ L − 1 ] W [ L − 2 ] … W [ 3 ] W [ 2 ] W [ 1 ] X \hat Y=W^{[L]}W^{[L-1]}W^{[L-2]}…W^{[3]}W^{[2]}W^{[1]}X Y^=W[L]W[L−1]W[L−2]…W[3]W[2]W[1]X也就是说,如果各层权重W[l]都大于1或者都小于1,那么各层激活函数的输出将随着层数l的增加,呈指数型增大或减小。当层数很大时,出现数值爆炸或消失。
神经网络的权重初始化
- 神经网络的权重初始化用于改善上述Vanishing and Exploding gradients问题
- 以单个神经元为例,该层
(
l
)
(l)
(l)的输入个数为
n
n
n,其输出为(忽略常数项b):
z = w 1 x 1 + w 2 x 2 + … + w n x n z=w_1x_1+w_2x_2+…+w_nx_n z=w1x1+w2x2+…+wnxn
a = g ( z ) a=g(z) a=g(z)
为了让z不会过大或者过小,思路是让w与n有关,且n越大,w应该越小才好。
另外,我们可以对这些初始化方法中设置某些参数,作为超参数,通过验证集进行验证,得到最优参数,来优化神经网络。
梯度的数值逼近
- 梯度的数值逼近用于近似求解梯度值
利用微分思想,函数f在点 θ θ θ处的梯度可以表示成:
g ( θ ) = f ( θ + ε ) − f ( θ − ε ) 2 ε g(θ)=\frac{f(θ+ε)−f(θ−ε)}{2ε} g(θ)=2εf(θ+ε)−f(θ−ε)
其中 ε > 0 且 ε → 0 ε>0且ε→0 ε>0且ε→0。
梯度检验
-
梯度检验用于检查验证反向传播过程中梯度下降算法是否正确。
-
梯度检查首先要做的是分别将 W [ 1 ] , b [ 1 ] , ⋯ , W [ L ] , b [ L ] W^{[1]},b^{[1]},⋯,W^{[L]},b^{[L]} W[1],b[1],⋯,W[L],b[L]这些矩阵构造成一维向量,然后将这些一维向量组合起来构成一个更大的一维向量θ。这样cost function J ( W [ 1 ] , b [ 1 ] , ⋯ , W [ L ] , b [ L ] ) J(W^{[1]},b^{[1]},⋯,W^{[L]},b^{[L]}) J(W[1],b[1],⋯,W[L],b[L])就可以表示成 J ( θ ) J(θ) J(θ)。
然后将反向传播过程通过梯度下降算法得到的 d W [ 1 ] , d b [ 1 ] , ⋯ , d W [ L ] , d b [ L ] dW^{[1]},db^{[1]},⋯,dW^{[L]},db^{[L]} dW[1],db[1],⋯,dW[L],db[L]
按照一样的顺序构造成一个一维向量 d θ dθ dθ。 d θ dθ dθ的维度与 θ θ θ一致。接着利用 J ( θ ) J(θ) J(θ)对每个 θ i θ_i θi计算近似梯度,其值与反向传播算法得到的 d θ i dθ_i dθi相比较,检查是否一致。例如,对于第 i i i个元素,近似梯度为:
d θ a p p r o x [ i ] = J ( θ 1 , θ 2 , ⋯ , θ i + ε , ⋯ ) − J ( θ 1 , θ 2 , ⋯ , θ i + ε , ⋯ ) 2 ε dθ_{approx}[i]=\frac{J(θ_1,θ_2,⋯,θ_i+ε,⋯)−J(θ_1,θ_2,⋯,θ_i+ε,⋯)}{2ε} dθapprox[i]=2εJ(θ1,θ2,⋯,θi+ε,⋯)−J(θ1,θ2,⋯,θi+ε,⋯)
计算完所有 θ i θ_i θi的近似梯度后,可以计算 d θ a p p r o x 与 d θ dθ_{approx}与dθ dθapprox与dθ的欧式(Euclidean)距离来比较二者的相似度。公式为:
∣ ∣ d θ a p p r o x − d θ ∣ ∣ 2 ∣ ∣ d θ a p p r o x ∣ ∣ 2 + ∣ ∣ d θ ∣ ∣ 2 \frac{||dθ_{approx}-dθ||_2}{||dθ_{approx}||_2+||dθ||_2} ∣∣dθapprox∣∣2+∣∣dθ∣∣2∣∣dθapprox−dθ∣∣2
一般来说,如果欧氏距离越小,例如10−7,甚至更小,则表明 d θ a p p r o x 与 d θ dθ_{approx}与dθ dθapprox与dθ越接近。反之如果欧氏距离较大,例如10−5,则表明梯度计算可能出现问题,需要再次检查是否有bugs存在。如果欧氏距离很大,例如10−3,甚至更大,则表明 d θ a p p r o x 与 d θ dθ_{approx}与dθ dθapprox与dθ差别很大,梯度下降计算过程有bugs,需要仔细检查。
关于梯度检验实现的注记
- 不要在整个训练过程中都进行梯度检查,仅仅作为debug使用。
- 如果梯度检查出现错误,找到对应出错的梯度,检查其推导是否出现错误。
- 注意不要忽略正则化项,计算近似梯度的时候要包括进去。
- 梯度检查时关闭dropout,检查完毕后再打开dropout。
- 随机初始化时运行梯度检查,经过一些训练后再进行梯度检查(不常用)。