1. 训练、验证、测试集
在机器学习中,我们通常将样本分成训练集,验证集和测试集三部分
- 数据集规模相对较小(万,数量级),适用传统的划分比例,60%训练,20%验证和 20%测 试集
- 数据集规模较大的(百万,数量级),验证集和测试集要小于数据总量的 20%或 10%。假设我们有 100 万条数据,其中 1 万条作为验证集,1 万条作为测试集, 100 万里取 1 万,比例是 1%,即:训练集占 98%,验证集和测试集各占 1%。
2. 正则化和Dropout法
- dropout法(随机失活),即以一定概率保留或消除网络中的节点
- dropout 的功能类似于?2正则化,与?2正则化不同的是,被应用的方式不同, dropout 也会有所不同,甚至更适用于不同的输入范围。
- dropout在计算机视觉中应用广泛,由于计算视觉中的输入量非常大,输入太多像素,以至于没有足够的数据,所以一直存在过拟合,
- dropout 一大缺点就是代价函数
J
J
J 不再被明确定义
- 解决方法:通常会关闭 dropout 函数,将 keepprob 的值设为 1,运行代码,确保?函数单调递减。然后打开 dropout 函数,希望在 dropout 过程中,代码并未引入 bug。
3. 梯度检验
假设神经网络中含有下列参数, W [ 1 ] W^{[1]} W[1]和 b [ 1 ] b^{[1]} b[1]…… W [ l ] W^{[l]} W[l]和 b [ l ] b^{[l]} b[l]:
- 首先把矩阵 W W W转换成一个向量,把所有 W W W矩阵转换成向量之后,做连接运算,得到一个巨型向量 θ \theta θ,得到了 θ \theta θ的代价函数 J J J(即 J ( θ ) J(\theta) J(θ))。
- 接着,得到与 W W W和 b b b顺序相同的数据,同样把 d W [ 1 ] dW^{[1]} dW[1]和 d b [ 1 ] {db}^{[1]} db[1]…… d W [ l ] {dW}^{[l]} dW[l]和 d b [ l ] {db}^{[l]} db[l]转换成一个新的向量,用它们来初始化大向量 d θ d\theta dθ,它与 θ \theta θ具有相同维度。
- 循环执行,对每个
i
i
i也就是对每个
θ
\theta
θ组成元素计算
d
θ
approx
[
i
]
d\theta_{\text{approx}}[i]
dθapprox[i]的值,使用双边误差,也就是
d θ approx [ i ] = J ( θ 1 , θ 2 , … θ i + ε , … ) − J ( θ 1 , θ 2 , … θ i − ε , … ) 2 ε d\theta_{\text{approx}}\left[i \right] = \frac{J\left( \theta_{1},\theta_{2},\ldots\theta_{i} + \varepsilon,\ldots \right) - J\left( \theta_{1},\theta_{2},\ldots\theta_{i} - \varepsilon,\ldots \right)}{2\varepsilon} dθapprox[i]=2εJ(θ1,θ2,…θi+ε,…)−J(θ1,θ2,…θi−ε,…) - 验证两个向量的接近程度,即
d
θ
approx
d\theta_{\text{approx}}
dθapprox与
d
θ
d\theta
dθ两个向量
c h e c k :            ∣ ∣ d θ approx − d θ ∣ ∣ 2 ∣ ∣ d θ approx ∣ ∣ 2 + ∣ ∣ d θ ∣ ∣ 2 check:\,\,\,\,\,\,\,\,\,\,\frac{{||d\theta_{\text{approx}} -d\theta||}_{2}}{{||d\theta_{\text{approx}} ||}_{2}+{||d\theta||}_{2}} check:∣∣dθapprox∣∣2+∣∣dθ∣∣2∣∣dθapprox−dθ∣∣2
注意这里( ∣ ∣ d θ approx − d θ ∣ ∣ 2 {||d\theta_{\text{approx}} -d\theta||}_{2} ∣∣dθapprox−dθ∣∣2)没有平方,它是误差平方之和,然后求平方根,得到欧式距离,然后用向量长度归一化,使用向量长度的欧几里得范数。- 如果它的值为 1 0 − 7 10^{-7} 10−7或更小,意味着导数逼近很有可能是正确的。
- 如果它的值在 1 0 − 5 10^{-5} 10−5范围内,就要小心了,也许这个值没问题,但要再次检查这个向量的所有项,确保没有一项误差过大,可能这里有bug。
- 如果它的值比 1 0 − 3 10^{-3} 10−3大很多,这时应该仔细检查所有 θ \theta θ项,看是否有一个具体的 i i i值,使得 d θ approx [ i ] d\theta_{\text{approx}}\left[i \right] dθapprox[i]与$ d\theta[i]$大不相同,并用它来追踪一些求导计算是否正确,经过一些调试,最终结果会是这种非常小的值( 1 0 − 7 10^{-7} 10−7)才可以认为没问题。
4. 梯度检验应用的注意事项
- 不要在训练中使用梯度检验,它只用于调试。
- 如果算法的梯度检验失败,要检查所有项,检查每一项,并试着找出bug。
- 在实施梯度检验时,如果使用正则化,请注意正则项。如果代价函数 J ( θ ) = 1 m ∑ L ( y ^ ( i ) , y ( i ) ) + λ 2 m ∑ ∣ ∣ W [ l ] ∣ ∣ 2 J(\theta) = \frac{1}{m}\sum_{}^{}{L(\hat y^{(i)},y^{(i)})} + \frac{\lambda}{2m}\sum_{}^{}{||W^{[l]}||}^{2} J(θ)=m1∑L(y^(i),y(i))+2mλ∑∣∣W[l]∣∣2,则在检验时需要包含正则项。
- 梯度检验不能与dropout同时使用。建议关闭dropout,用梯度检验进行双重检查,在没有dropout的情况下,保证算法至少是正确的,然后打开dropout。