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