接着上一课的超参数调参内容,这一周先从超参数的经验值选取开始讲起。
1训练/开发/测试集
在机器学习中,我们一般数据分为训练集,测试集和验证集,在数据量比较少的情况下,我们可以采用原始划分百分比60%,20%,20%,当数据量特别大至百万级的时候,我们的验证集和测试集就不需要取到20%这么大,有时候甚至取0.5%,0.1%就可以了。
另外一个问题是训练集,验证集和测试集的数据要确保来自同一个分布,这样可以加快机器学习算法的训练。另外,Not having a test set might be ok. (Only have dev set.)
2 方差与偏差
四种情况:1.高偏差;2.高方差;3.高偏差并且高方差;4.低偏差并且低方差。
高偏差问题的解决方法:1.更大的网络;2.训练更长的时间
高方差问题的解决方法:1.更多的数据;2.正则化
在神经网络中我们通常不需要考虑降低方差(偏差)对偏差(方差)的影响,也就是不需要考虑两者的trade-off。
3 正则化–解决方差高
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
∑
j
(
w
i
j
[
l
]
)
2
J(w^{{[1]}},b^{[1]},...w^{[l]},b^{[l]})=\frac{1}{m}\sum_{i=1}^{m}L(\hat y^{(i)},y^{(i)})+\frac{\lambda}{2m}\sum_{l=1}^L||w^{[l]}||_F^2,\\ ||w^{[l]}||_F^2=\sum_{i}\sum_j (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∑j∑(wij[l])2
下面这个矩阵的范数为矩阵各个元素的平方之和,称为Frobenius norm。在损失函数加上正则项之后,梯度下降的公式dw将加上一个
λ
m
w
[
l
]
\frac{\lambda}{m}w^{[l]}
mλw[l].
问题:
1.为什么损失函数不加上偏置b?
因为通常来说假设函数是一个高维函数,w是一个多参数的数组,而b只是其中的一个参数,实际上加上b对结果影响不大。
2.为什么正则化可以过拟合?
增大
λ
\lambda
λ使得参数
w
[
l
]
w^{[l]}
w[l]减小,因此
z
[
l
]
z^{[l]}
z[l]也会减小,从而使得激活函数的横坐标z处于接近线性函数区,因此整个神经网络会趋于一种线性网络。
Dropout正则化–使用Inverted dropout实现
dropout是指在深度学习网络的训练过程中,对于神经网络单元,按照一定的概率将其暂时从网络中丢弃。注意是暂时,对于随机梯度下降来说,由于是随机丢弃,故而每一个mini-batch都在训练不同的网络。
L=3,keep-prob=0.8
d3=np.random.randn(n3.shape(0),n3.shape(1))<0.8
a3=d3.*a3 #用d3过滤值为0的节点
a3/=keep-prob
最后一步是希望在删除a3的20%节点之后不影响下一步计算的
z
[
4
]
=
w
[
4
]
a
[
3
]
+
b
[
4
]
z^{[4]}=w^{[4]}a^{[3]}+b^{[4]}
z[4]=w[4]a[3]+b[4]期望值,进一步不影响输出的
y
^
(
i
)
\hat y^{(i)}
y^(i)的期望值,否则对每一个测试数据会有不同的输出期望,从而影响测试数据时的输出。
在测试阶段不使用dropout方法,我们不希望输出值是随机的。
注意:
1.不同层的keep-prob可以是不同的,对节点数比较多的层使用较小的值,对节点数比较少的层使用比较大的值甚至是1.
2.drop-out是一种防止过拟合的方法,因此只有当数据量少且出现过拟合的时候才需要采用,例如在计算机视觉处理中,输入特征数较多,一般会使用这种方法。
问题:
1.为什么drop-out可以正则化?
1)dropout不同的神经元就类似在训练不同的网络(随机删掉一半隐藏神经元导致网络结构已经不同),整个dropout过程就相当于对很多个不同的神经网络取平均。
2)因为dropout程序导致两个神经元不一定每次都在一个dropout网络中出现,因此神经网络不应该对一些特定的线索片段太过敏感,即使丢失特定的线索,它也应该可以从众多其它线索中学习一些共同的模式,也就是通过减少权重使得网络对丢失特定神经元连接的鲁棒性提高.
其他正则化方法
1)数据扩充。人工合成数据集,比如对图片信息,可以通过对称,剪裁等得到更多的样本,虽然样本中有一定的冗余信息;类似的,可以对数据进行旋转,变形等
2)early stopping
也就是当迭代到一定次数时(参数w比较大时),就提前结束训练。
但它有一个缺点就是无法同时优化损失函数并且防止过拟合,当我们为了防止过拟合而提前结束训练的时候,我们并不知道这个损失函数是否已经达到最优。
它的优点是只运行一次梯度下降就可以找到w的较小值,适中值和较大值,而无需尝试L2正则化参数
λ
\lambda
λ的很多值。
4加快神经网络的训练速度
1.归一化输入:零均值化(减去均值),归一化方差(除以方差)
注意:测试集也需要使用一样的均值和方差进行归一化处理。
为什么归一化输入可以加快训练速度?
参数范围相差太大的话代价函数呈椭圆形,此时学习速率learning rate必须要比较小才能逐渐到达最优解;而归一化输入之后,代价函数呈圆形,此时learning rate可以设置的大一些,比较容易找到最优解。
2.谨慎选择权重初始化
梯度消失(gradient valishing):当参数w,b的初始化值小于1时,经过深层神经网络之后,activations
a
a
a会趋于一个很小的值。
梯度爆炸(gradient exploding):当参数w,b的初始化值大于1时,经过深层神经网络之后,activations
a
a
a会趋于一个很大的值。
因此需要谨慎选择参数初始化的值,当我们使用Relu函数时,一般采用的参数初始化为:
w
[
l
]
=
np.random.randn(shape)
.
2
n
[
l
−
1
]
w^{[l]}=\text{np.random.randn(shape)}.\sqrt{\frac{2}{n^{[l-1]}}}
w[l]=np.random.randn(shape).n[l−1]2
5梯度检测
1.双边误差计算梯度更加可靠
f
′
(
θ
)
=
lim
ϵ
→
0
f
(
θ
+
ϵ
)
−
f
(
θ
−
ϵ
)
2
ϵ
f'(\theta)=\lim_{\epsilon\rightarrow0 }\frac{f(\theta+\epsilon )-f(\theta-\epsilon )}{2\epsilon }
f′(θ)=ϵ→0lim2ϵf(θ+ϵ)−f(θ−ϵ)
2.需要使用梯度检测来判断在反向传播算法中计算导数的公式是否正确。
反向传播求出的
d
θ
\rm d \theta
dθ与利用损失函数的导数公式计算出的
d
θ
a
p
p
r
o
x
\rm d \theta_{approx}
dθapprox是否接近
1
0
−
7
10^{-7}
10−7.
3.进行梯度检测的几点注意:
- 梯度检测仅仅在调试时使用,在训练时不应该使用,这会减低训练数据的效率;
- 对多个参数运行梯度检测来定位出错的位置;
- 梯度检测不能与dropout正则一起使用,因为dropout正则之后的损失函数J不是一个固定公式,如果要检测此时的神经网络是否正确,应该设置keep.prob=1
- 进行梯度检测时不要忘记正则项
- 可能只有在参数w,b接近0时backprop的实施才是正确的
总结
学完本周内容你应该知道:
- 如何划分训练集/验证集/测试集
- 高偏差,高方差如何判别,并且应该如何改进?
- 正则化的两种主要方法,如何实施,以及原理?其他的正则化方法呢?
- 加快神经网络训练速度的方法。
- 为什么要梯度检测?如何梯度检测?