CS231n-2017 第7讲 训练网络(下)

一. 优化算法

1. 随机梯度下降法(SGD)

表达式:

x t + 1 = x t − α ∇ f ( x t ) x_{t+1} = x_t - \alpha\nabla f(x_t) xt+1=xtαf(xt)
缺点:

  • 如果损失函数对某一维的参数敏感,而对另一维的参数不敏感,那么容易出现z-形优化路径。
CS231n-2017 第7讲 训练网络(下)_第1张图片
图 1. z-形优化路径
  • 会陷在局部最小值或鞍点附近。对于高维参数空间,出现鞍点的情形要远频繁于出现局部最小值的情形。
  • 小批量数据使得优化方向受噪声影响严重,导致行进到最优解的路径会很长。
2. 带动量的随机梯度下降法(SGD+Momentum)

表达式:

v t + 1 = ρ v t + ∇ f ( x t ) , x t + 1 = x t − α v t + 1 v_{t+1} = \rho v_t + \nabla f(x_t), \quad x_{t+1} = x_t - \alpha v_{t+1} vt+1=ρvt+f(xt),xt+1=xtαvt+1
即定义一个随时间变化的速度,每次计算的梯度视为速度的修正(动量)。这样有助于克服梯度计算过程中一些噪声的影响。

Nesterov Momentum

v t + 1 = ρ v t − α ∇ f ( x t + ρ v t ) , x t + 1 = x t + v t + 1 v_{t+1} = \rho v_t - \alpha \nabla f(x_t+\rho v_t), \quad x_{t+1} = x_t + v_{t+1} vt+1=ρvtαf(xt+ρvt),xt+1=xt+vt+1

即在速度方向上前进一步,然后计算梯度,将这里的梯度和刚才的速度加权求和作为前进方向。基本思想是:如果速度方向出现了一点偏差,那么前进后的梯度方向会校正速度方向。

3. AdaGradRMSProp

AdaGrad维持一个对各个维度的梯度模值的统计,然后在更新参数时,用这个取规范化梯度。这样可以解决梯度向量的条件数恶化的问题。但随着学习的进行,后续更新会越来越慢。
RMSProp将累积的梯度模值,替换成线性加权的梯度模值。

4. Adam

Adam整合了动量法和RMSProp方法。但还有个问题:在最起初的步骤,由于线性加权中的权值较大一项被初始化为0,则在规范化梯度时,会出现除以一个小量的现象。Adam会对所用的两个参数进行偏置校正。

v t + 1 = [ β 1 v t + ( 1 − β 1 ) ∇ f ( x t ) ] / ( 1 − β 1 t ) m t + 1 = [ β 2 m t + ( 1 − β 2 ) ∇ f ( x t ) ⊙ ∇ f ( x t ) ] / ( 1 − β 2 t ) x t + 1 = x t − α v t + 1 / ( m t + 1 + e p s ) \begin{array}{lll} v_{t+1} &=& \left[\beta_1 v_t + (1-\beta_1)\nabla f(x_t)\right]/(1-\beta_1^t)\\ \\ m_{t+1} &=& \left[\beta_2 m_t + (1-\beta_2)\nabla f(x_t)\odot\nabla f(x_t)\right]/(1-\beta_2^t)\\ \\ x_{t+1} &=& x_t - \alpha v_{t+1}/(\sqrt{m_{t+1}} + eps) \end{array} vt+1mt+1xt+1===[β1vt+(1β1)f(xt)]/(1β1t)[β2mt+(1β2)f(xt)f(xt)]/(1β2t)xtαvt+1/(mt+1 +eps)

5. 二阶优化方法
  • 将损失函数展开到二阶项,然后根据二次型表达,直接求出此时最小值对应的参数。
  • 需要求解Hessian矩阵的逆。一个近似方法是Quasi-Newton方法(最流行的是BGFS),适用于风格迁移这种随机性很小、参数不多的应用场景。

二. 学习速率衰减

  • 阶梯式衰减:以某个常值遍历几次数据集后进行衰减。
  • 指数式衰减: α = α 0 e − k t \alpha = \alpha_0e^{-kt} α=α0ekt
  • 幂次衰减: α = α 0 / ( 1 + k t ) \alpha = \alpha_0/(1+kt) α=α0/(1+kt)

三. 集成学习

  • 训练多个模型,在预测时集成相应输出结果。
  • 还可以保留训练过程中,模型陷入各个局部最优解时的参数快照。

四. 正则化

正则化的一般模式:在训练阶段,给网络添加一些随机性,避免网络对训练数据的拟合过度。在测试阶段,则期望这种随机性被去除,从而提高泛化能力。

1. Dropout策略
  • 按一定比例,随机地将某些神经元置0。
  • 在卷积层应用Dropout时,是将某些卷积核所输出的特征层全部置0。
  • 在预测时,不进行置零操作,而是将输出乘上训练时置零的概率。或是为了预测时的计算效率,用训练时的除以相应概率。(这样做的基本想法是使得预测时产生的数据的特征和训练时的一样。一个简单的推导是在穷举的情况下进行一下平均。)
  • 由于每次只能更新部分参数,因此采用Dropout会使得训练过程变长。
  • Dropout起到正则化作用的一个解释:这种做法使得模型能够学习到关于数据的特征的冗余表达,从而降低相关联的特征对决策的影响。(即避免模型学到了训练数据的显著特征,出现过拟合,而不再进行学习或不能跳出局部最优解。)
  • Dropout起到正则化作用的另一个解释:相当于一个集成学习的过程。
2. 数据增强
  • 图像裁剪。
  • 图像几何变换。
  • 颜色抖动。

五. 迁移学习

根据所拥有的数据集的大小,决定重新训练的层数。

一些框架的模型库

  • Caffe: https://github.com/BVLC/caffe/wiki/Model-Zoo
  • TensorFlow: https://github.com/tensorflow/models
  • PyTorch: https://github.com/pytorch/vision

你可能感兴趣的:(CS231n,训练网络,梯度下降算法,正则化)