八、(二)深度学习训练技巧

上一章:八、(一)预训练网络与迁移学习

下一章:九、自编码器(Autoencoder)

 更多章节:人工智能入门课程


目录

保持值在合理的区间内

初试权重初始化

批量归一化

随机失活(Dropout)

防止过拟合

优化器/训练算法

动量(Momentum)

亚当(Adam), 阿达格拉德(Adagrad)等

梯度裁剪(Gradient clipping)

学习率衰减

不同的网络结构


随着神将网络深度增加,其训练过程变得越来越具有挑战性。一个做主要的问题是所谓的梯度消失或者梯度爆炸这个帖子很好的介绍了这些问题。

为了使深度网络训练更有效,有一些技术可以使用。

保持值在合理的区间内

为了使数值计算更稳定,我们希望确保神经网络中使用的所有值都在合理的范围。通常是[-1..1]或者[0..1]。这不是非常严格的要求,但是浮点数计算的性质是,不同量级的值不能准确的一起操作。比如,如果我们把10^{-10}10^{10}相加,我们可能会得到10^{10},因为较小的值会转换为与较大的值相同的量级,从而较小的数以尾数的形式丢失了。

大多数激活函数在[-1..1]附近具有非线性的特性,因此,将所有输入数据缩小到[-1..1] 或者 [0..1]区间是有意义的。

初试权重初始化

理想情况下我们希望通过神经网络层后所有的值都在相同的范围内因此以保持值分布的方式来初始化权重很重要

正态分布N(0,1)并不是很好的主意因为如果我们有n个输入输出的标准差会是n同时输出值可能会跳出[0..1]区间

以下初始化方式经常被用到

  • 均匀分布--均匀
  • N(0,1/n) -- 高斯
  • N(0,1/√n_in) 确保对于均值为0并且标准差为1的输入将保持相同的均值/标准差
  • N(0,√2/(n_in+n_out)) -- 所谓的Xavier初始化 (glorot),它不管在前向还是后向传播中都有助于将信号保持在范围内

批量归一化

即使进行了适当的权重初始化权重都可能在训练过程中变得非常大或者非常小从而导致信号超出合理范围我们可以通过使用一种归一化技术将信号恢复虽然有多种权重归一化层归一化),但最常用的还是批量归一化

批量归一化的思想是考虑整个小批量中的所有值并根据这些值进行归一化即减去均值并除以标准差)。归一化被实现为一个网络层,该归一化层位于应用权重之后激活函数之前。应用归一化后,我们可能会看到更高的最终准确度和更快的训练速度

这是关于批量归一化的 原始论文维基百科上的解释一篇很好的介绍性的博客文章以及俄语版)。

随机失活(Dropout)

Dropout 是一种有趣的技术在训练时按照一定的百分比随机移除神经元它也被实现为一个带一个参数的层神经元被移除的百分比通常为10%-50%),在训练过程中在它将向量传输到下一层之前它随机将输入向量的元素置零

虽然这可能听起来像一个奇怪的想法你可以看到Dropout.ipynb笔记中dropout在训练MINIST数字分类器时的效果它加快了训练速度并且可以使我们在更少的训练周期取得更高的准确率

这种效果可以用几种方式解释

  • 它可以被当作模型的随机冲击因子(a random shocking factor),使得优化脱离局部(采样集)最小值。
  • 因为可以说在dropout期间我们在训练稍有不同的模型,它可以被认为是隐式的取了模型的平均。

有些人说当一个喝醉了的人尝试学习一些东西他相比于没喝醉的人在第二天早晨会记得更清楚因为一个大脑存在部分功能障碍的神经元时会尝试更好的适应来理解它的含义我们从未对自己测试过这是不是正确的

防止过拟合

深度学习中最重要的一个方面是能够防止过拟合尽管使用非常强大的神经网络模型非常具有诱惑力我们始终需要平衡模型的参数数量和模型的样本数量

确保您理解我们之前已经介绍过的过拟合的概念

有几种方法可以阻止过拟合

  • 提前停止训练--持续检测验证数据集上的误差并在验证误差开始上升时停止训练
  • 显示权重衰减/规则化--给权重绝对值很高的损失函数增加一个额外的惩罚以防止模型产生不稳定的结果
  • 模型平均--训练多个模型然后求取结果的平均值这有助于最小化方差variance.
  • 随机失活--Dropout (隐式模型平均)

优化器/训练算法

训练的另一个非常重要的方面是选择一个好的训练算法虽然经典梯度下降是一个合理的选择但它有时可能太慢或者会产生其他问题

在深度学习中我们使用随机梯度下降SGD),这是一种应用于从训练集随机选取的小批量数据集的梯度下降它使用如下公式调整权重

w^{t+1}= w^{t}- η∇ℒ

动量(Momentum)

动量随机梯度下降momentum SGD)我们保留先前步骤的一部分的梯度这就好像当我们带着惯性向某个方向运动然后我们受到一个其他方向的力我们的轨迹不会立即变化还会保持一部分原始的运动这里我们引入另一个向量v来表示速度

  • v^{t+1} = γ v^{t}- η∇ℒ
  • w^{t+1} = w^{t}+v^{t+1}

这里参数γ代表我们考虑惯性的程度γ=0代表经典SGDγ=1是一个纯运动方程

亚当(Adam), 阿达格拉德(Adagrad)等

因为在每一层我们使用信号乘以矩阵Wi,根据||Wi||,梯度可以减小并接近0,也可以无限上升这就是梯度爆炸/消失问题的本质

这个问题的解决方法是在方程中仅使用梯度的方向并忽略绝对值

w^{t+1} = w^{t} - η(∇ℒ/||∇ℒ||), where ||∇ℒ|| = √∑(∇ℒ)^{2}

这个算法被称作Adagrad。另一些算法使用了相同的思想有RMSPropAdam。

Adam在许多应用中非常有效如果您不确定使用哪个算法那就使用Adam

梯度裁剪(Gradient clipping)

梯度裁剪是上面思想的延伸 ||∇ℒ|| ≤ θ,我们使用权重优化中的原始梯度||∇ℒ|| > θ ,我们将梯度除以其范数norm)。这里θ是一个参数在大多数情况下我们可以取 θ=1 或 θ=10。

学习率衰减

训练的成功常常依赖于学习率参数η。逻辑上来说更大的η值可以加快训练这通常是我们在训练初期希望的而较小的η允许我们微调fine-tune网络因此在大多数情况下我们希望在训练过程中η逐渐减小

这可以在通过在每个训练周期后将η乘以某个数字例如0.98),或者使用更复杂的学习率调度来实现

不同的网络结构

为你的问题选择正确的网络架构可能有些棘手通常我们会选择已经被证明适用于我们特定或者相似的任务有效的架构这是一个有关计算机视觉的神经网络架构的很好的概述

选择一个对我们拥有的训练样本数量而言足够强大的架构很重要选择过于强大的模型可能会导致过拟合

另一个好的方法是使用能够自动调整所需复杂性的架构在某些程度上ResNet架构和Inception是自动调整的更多计算机视觉架构


上一章:八、(一)预训练网络与迁移学习

下一章:九、自编码器(Autoencoder)

 更多章节:人工智能入门课程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值