7 优化、正则化、迁移学习

7.1 更好的优化

  • SGD

    缺点:不能跨过局部极小值点,或者鞍点

  • SGD+Momentum: 梯度+当前的动量方向为下一步的方向

  • Nester+Momentum:先按动量方向前进然后找当前位置的梯度方向,然后回到起点向前两个的方向加起来前进(或者在第一步前进后的位置上向当前梯度的方向前进)。

  • AdaGrad:每一步累加梯度的平方项,然后在更新的时候除以这个和的梯度平方项。可以使多个维度的梯度方向均匀,例如两个方向,一个梯度大一个梯度小,大的累计就大,然后除以累计的结果后就会变小。
    不过会到导致步长越来越小。凸函数好用。

  • RMSProp:AdaGrad的改进
    累加时乘一个衰减率,$sum=\rho*sum+(1-\rho)dx^2$

  • Adam
    结合了SGD+Momentum和AdaGrad,梯度和梯度的平方

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    first_moment = 0
    second_moment = 0
    for t in range(num):
    dx = compute_gradient(x)
    first_moment = beta1 * first_moment + (1 - beta1) * dx #累计动量
    second_moment = beta2 * second_moment + (1 - beta2) * dx * dx 累计动量的平方
    # 防止直接乘除步长太
    first_unbias = first_moment / (1 - beta1 ** t)
    second_unbias = second_moment / (1 - beta2 ** t)
    x -= learning_rate * first_unbias / (np.sqrt(second_unbias) + 1e-7)

7.2 正则化

  • L1、L2正则化
    加一项参数$W$的L1范数或者L2范数

  • Dropout
    随即将一层中的神经元的值置为0
    为什么有用:

    • 一个解释是每个神级元学到的特征不一样,不加dropout时需要将这些特征全部组合在一起才可以判断出来结果,加上以后就可以分别用单个的特征来判断,避免了过拟合。
    • 第二种解释是加入的dropout以后相当于去掉了一些神经元,变成了一个子网络,所有的dropout形成的子网络成了在一个模型中的集成学习
  • Batch Normalization(批量标准化)

  • Data Augmentation(数据增强)
    翻转、随机剪裁、增加对比度、改变颜色等

7.3 迁移学习

更改一个训练好的模型中的一部分,例如如果之前的模型是分1000类的,现在要分10类,则可以冻结前面的特征提取的层,只需将最后的全连接层重新训练即可;
如果是有更多的数据,则可以微调整个模型,降低一下学习率再训练。

8 深度学习软件