深度学习的实践层面

  • 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 一大缺点就是代价函数 python划分训练集和验证集脚本 训练集验证集划分比例_正则化 不再被明确定义
    - 解决方法:通常会关闭 dropout 函数,将 keepprob 的值设为 1,运行代码,确保?函数单调递减。然后打开 dropout 函数,希望在 dropout 过程中,代码并未引入 bug。

3. 梯度检验

假设神经网络中含有下列参数,python划分训练集和验证集脚本 训练集验证集划分比例_深度学习_02python划分训练集和验证集脚本 训练集验证集划分比例_python划分训练集和验证集脚本_03……python划分训练集和验证集脚本 训练集验证集划分比例_深度学习_04python划分训练集和验证集脚本 训练集验证集划分比例_吴恩达_05

  • 首先把矩阵python划分训练集和验证集脚本 训练集验证集划分比例_吴恩达_06转换成一个向量,把所有python划分训练集和验证集脚本 训练集验证集划分比例_吴恩达_06矩阵转换成向量之后,做连接运算,得到一个巨型向量python划分训练集和验证集脚本 训练集验证集划分比例_python划分训练集和验证集脚本_08,得到了python划分训练集和验证集脚本 训练集验证集划分比例_python划分训练集和验证集脚本_08的代价函数python划分训练集和验证集脚本 训练集验证集划分比例_正则化(即python划分训练集和验证集脚本 训练集验证集划分比例_深度学习_11)。
  • 接着,得到与python划分训练集和验证集脚本 训练集验证集划分比例_吴恩达_06python划分训练集和验证集脚本 训练集验证集划分比例_深度学习_13顺序相同的数据,同样把python划分训练集和验证集脚本 训练集验证集划分比例_python划分训练集和验证集脚本_14python划分训练集和验证集脚本 训练集验证集划分比例_正则化_15……python划分训练集和验证集脚本 训练集验证集划分比例_机器学习_16python划分训练集和验证集脚本 训练集验证集划分比例_深度学习_17转换成一个新的向量,用它们来初始化大向量python划分训练集和验证集脚本 训练集验证集划分比例_深度学习_18,它与python划分训练集和验证集脚本 训练集验证集划分比例_python划分训练集和验证集脚本_08具有相同维度。
  • 循环执行,对每个python划分训练集和验证集脚本 训练集验证集划分比例_机器学习_20也就是对每个python划分训练集和验证集脚本 训练集验证集划分比例_python划分训练集和验证集脚本_08组成元素计算python划分训练集和验证集脚本 训练集验证集划分比例_吴恩达_22的值,使用双边误差,也就是
    python划分训练集和验证集脚本 训练集验证集划分比例_吴恩达_23
  • 验证两个向量的接近程度,即python划分训练集和验证集脚本 训练集验证集划分比例_正则化_24python划分训练集和验证集脚本 训练集验证集划分比例_深度学习_18两个向量
    python划分训练集和验证集脚本 训练集验证集划分比例_吴恩达_26
    注意这里(python划分训练集和验证集脚本 训练集验证集划分比例_正则化_27)没有平方,它是误差平方之和,然后求平方根,得到欧式距离,然后用向量长度归一化,使用向量长度的欧几里得范数。
  • 如果它的值为python划分训练集和验证集脚本 训练集验证集划分比例_python划分训练集和验证集脚本_28或更小,意味着导数逼近很有可能是正确的。
  • 如果它的值在python划分训练集和验证集脚本 训练集验证集划分比例_机器学习_29范围内,就要小心了,也许这个值没问题,但要再次检查这个向量的所有项,确保没有一项误差过大,可能这里有bug。
  • 如果它的值比python划分训练集和验证集脚本 训练集验证集划分比例_python划分训练集和验证集脚本_30大很多,这时应该仔细检查所有python划分训练集和验证集脚本 训练集验证集划分比例_深度学习_31项,看是否有一个具体的python划分训练集和验证集脚本 训练集验证集划分比例_机器学习_32值,使得python划分训练集和验证集脚本 训练集验证集划分比例_python划分训练集和验证集脚本_33与$ d\theta[i]$大不相同,并用它来追踪一些求导计算是否正确,经过一些调试,最终结果会是这种非常小的值(python划分训练集和验证集脚本 训练集验证集划分比例_python划分训练集和验证集脚本_28)才可以认为没问题。

4. 梯度检验应用的注意事项

  • 不要在训练中使用梯度检验,它只用于调试。
  • 如果算法的梯度检验失败,要检查所有项,检查每一项,并试着找出bug。
  • 在实施梯度检验时,如果使用正则化,请注意正则项。如果代价函数python划分训练集和验证集脚本 训练集验证集划分比例_吴恩达_35,则在检验时需要包含正则项。
  • 梯度检验不能与dropout同时使用。建议关闭dropout,用梯度检验进行双重检查,在没有dropout的情况下,保证算法至少是正确的,然后打开dropout。