深度学习的方法有哪些?看这篇就够了

来源商业新知网,原标题:【科普贴】深度学习的一些方法

1. 参数初始化

训练之前一定要执行参数初始化,否则可能减慢收敛速度,影响训练结果,或者造成Nan数值溢出等异常问题。

特别的,如果所有参数都是0,则反向传播时,隐含层中所有参数的地位是一样,导致每次更新后隐层的参数都是一样的,导致学习失败。

初始化方法: 随机初始化、高斯分布初始化、均匀初始化、与参数量 n 相关的平方、开放初始化等。

xavier初始化: xavier初始化方法由Bengio在2010年提出,基本思想是要保证前向传播和反向传播时每一层的方差一致,根据每层的输入个数和输出个数来决定参数随机初始化的分布范围,是一个通过该层的输入和输出参数个数得到的分布范围内的均匀分布。

2. 数据预处理

输入数据归一化到 [0,1]或者以 0 为中心的 [-1,1],一般要做精度提升。

输入数据要做随机排序。

3. 训练技巧相关

梯度归一化: 计算出来梯度之后,要除以minibatch的数量,这样就不显式依赖minibatch size。

梯度限制: 限制最大梯度,超过阈值乘一个衰减系数,防止梯度爆炸。

batchsize: batch size值增加,的确能提高训练速度。但是有可能收敛结果变差。batch size 太小,不能充分利用批量训练的优点,可能使训练速度下降,严重的或不收敛。

学习率: 太大的学习率,不收敛,导致在最优解附近震荡; 太小的学习率,收敛慢,陷入局部最优解的可能增大。 可设置动态的学习率,逐步减小。

动量momentum: 滑动平均模型,在训练的过程中不断的对参数求滑动平均这样能够更有效的保持稳定性,使其对当前参数更新不太敏感,保留之前梯度下降的方向,以加快收敛。一般动量选择在0.9-0.95之间。

滤波器核大小: 一般选奇数核,根据输入尺寸大小调整。

dropout: 一般选0.5, 测试时候记得关闭dropout。

Batch Normalization: 加BN批规范化层。

池化的选择: 一般最大池化。

shortcut的位置选择。

CNN中滑动步长。

网络深度: 非越深越好。

训练次数epoch: 可以设置提前结束,防止过拟合。

Inception modeles: 组成Inception的滤波器个数和滤波核大小,以及深度。

增加非线性: Relu函数等。

LSTM中遗忘门参数设置: 开始时候设置较大的遗忘参数,可能效果更好。

4.  CNN的魅力

CNN可以很好的处理局部与整体,低层次特性到高层次特征的映射。

CNN的四个主要特点:局部连接/权值共享/池化操作/多层次结构。

  • 局部连接 使网络可以提取数据的局部特征;
  • 权值共享 大大降低了网络的训练难度,一个Filter只提取一个特征,在整个图片(或者语音/文本) 中进行卷积;
  • 池化操作 与 多层次结构 一起,实现了数据的降维,将低层次的局部特征组合成为较高层次的特征。

5. LSTM与RNN

RNN 是包含循环的网络,允许信息的持久化。

LSTM可以缓解RNN中梯度消失问题,可以处理长期依赖问题。

LSTM中sigmoid和Tanh函数不同作用:sigmoid 用在各种gate上,作用是产生0~1之间的值,这个一般只有sigmoid最直接了。

tanh 用在了状态和输出上,是对数据的处理,这个用其他激活函数或许也可以。

6. 注意力模型 Attention机制

注意力机制即 Attention 机制在序列学习任务上具有巨大的提升作用,Attention机制的设计可以优化传统编码解码(Encode-Decode)结构。

传统编码解码结构: 传统编码器-解码器的RNN模型先用一些LSTM单元来对输入序列进行学习,编码为固定长度的向量表示;然后再用一些LSTM单元来读取这种向量表示并解码为输出序列。

传统编码解码结构存在的最大问题是:输入序列不论长短都会被编码成一个固定长度的向量表示,而解码则受限于该固定长度的向量表示,尤其是当输入序列比较长时,模型的性能会变得很差。

Attention机制的基本思想是,打破了传统编码器-解码器结构在编解码时都依赖于内部一个固定长度向量的限制。

Attention机制的实现是通过保留LSTM编码器对输入序列的中间输出结果,然后训练一个模型来对这些输入进行选择性的学习并且在模型输出时将输出序列与之进行关联。

使用attention机制便于理解在模型输出过程中输入序列中的信息是如何影响最后生成序列的。这有助于我们更好地理解模型的内部运作机制以及对一些特定的输入-输出进行debug。

深度学习中的注意力机制从本质上讲和人类的选择性视觉注意力机制类似,核心目标也是从众多信息中选择出对当前任务目标更关键的信息。

7. 过拟合和正则化

过拟合问题往往源于过多的特征,对训练集的拟合能力很强,但是到测试集上,轻微的数据偏差就导致结果上较大的偏差。

解决过拟合的方法:

① 减少特征的数量,保留较关键的信息;

② 使用正则化方法。

正则化方法会保留所有的特征,但是增加了对特征的约束,每一个特征都会对预测y贡献一份合适的力量。具体做法是给需要训练的目标函数加上一些规则(限制)项,控制参数的幅度,不至于波动太大。

L1正则化: L1正则化是指权值向量(系数)w中各个元素的绝对值之和。一般都会在正则化项之前添加一个系数,系数越大,正则化作用越明显。

L1正则化有助于生成一个稀疏权值矩阵,进而可以用于特征选择。相当于减少了特征数量,所以说是进行了特征选择。系数越大,正则化作用越明显。

L2正则化: L2正则化是指权值向量w中各个元素的平方和然后再求平方根一般都会在正则化项之前添加一个系数。

L2正则化倾向于让权值尽可能小,最后构造一个所有参数都比较小的模型。因为一般认为参数值小的模型比较简单,能适应不同的数据集(由于参数比较小,数据本身的波动对结果影响不至于太大),也在一定程度上避免了过拟合现象。

8. Relu激活函数的优点

sigmoid函数范围[0,1], tanh函数范围[-1,1], Relu函数范围[0,无穷]。

  • 计算量上,Sigmoid和T函数含有指数,Relu函数是简单的线性,所以Relu的计算量小很多。
  • 梯度消失上,Sigmoid和T函数在接近饱和区时,梯度很小,更新缓慢,Relu不存在梯度过小情况。
  • 稀疏性能上,Relu函数会使一部分神经元的输出为0,这样就造成了网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生。

9. 梯度弥散与梯度爆炸

梯度弥散现象: 靠近输出层的隐藏层梯度大,参数更新快,所以很快就会收敛;而靠近输入层的隐藏层梯度小,参数更新慢,几乎就和初始状态一样,随机分布。这种现象就是梯度弥散。指的是反向传播过程中,梯度开始很大,但是很快就降低到一个很小的值。

梯度爆炸现象: 靠近输出层的隐藏层梯度很小,参数更新慢,几乎不会收敛,而靠近输入层的隐藏层梯度变得很大,参数更新快,很快就会收敛。这种现象就是梯度爆炸。指的是反向传播过程中,梯度开始时候很小,但是梯度以指数级增长。

梯度爆炸与梯度弥散的特点是梯度相当不稳定(unstable),学习效果很差。

导致梯度弥散与梯度爆炸现象的原因:

在使用sigmoid作为激活函数的网络中,如果使用均值为0,方差为1的高斯分布初始化参数w,有|w| < 1。

又知sigmoid函数的特性是把+∞~-∞之间的输入压缩到0~1之间,所以反向传播时,梯度会以指数级减小,靠近输入层的系数得不到更新,导致梯度弥散。而如果初始化时候采用|w| > 1 的系数,又会导致梯度以指数级增大,靠近输入层的系数得到的梯度过大,导致梯度爆炸。

解决梯度弥散与梯度爆炸

① 使用Relu激活函数可以缓解梯度的不稳定情况,Relu的导数不是0就是1,不会指数级缩小或扩大。

② 加入BN层,约束输出到一个范围。BN添加在每层激活函数之前,就是做均值和方差归一化

③ 梯度裁剪,如果梯度大于或小于某个值,就将梯度按比例缩小或扩大。

为什么LSTM在预防梯度弥散与梯度爆炸上性能由于RNN

传统RNN对状态的维护是通过乘积的方式,这导致在链式求导梯度时,梯度被表示为连积的形式,造成梯度爆炸或弥散。

LSTM对状态的维护是通过累加的方式,不至于使得梯度变化过快。

10. 常见损失函数

分类算法中,损失函数通常可以表示成损失项和正则项的和。

损失项常用损失函数:

  • 0-1损失函数: 预测相符为1,不符为0。实际中需要设置判定区间。
  • log对数损失函数
  • exp指数损失函数
  • 平方差损失函数
  • 交叉熵损失函数
  • 绝对损失函数

11. 明星CNN模型

12. rcnn、fast-rcnn和faster-rcnn

RCNN系列是把检测定位问题转换为分类问题来实现的。

RCNN: RCNN使用了region proposal(建议区域)得到可能是目标的若干局部区域,使用CNN分别提取这些区域的特征,再使用SVM分类器做分类判断。

fast-rcnn: rcnn的若干局部区域(约1000个)存在特征重复计算的问题,fast-rcnn把这些局部区域映射到最后一层的特征图上,一张图仅需要提取一次特征就行了,大大提高了计算速度。

faster-rcnn: 将Region proposal的工作也交给CNN(其实也是一个fast-rcnn)网络来做,这个网络把图片固定划分为n×n的区域,分别输出建议的位置和前后景分类,再把结果送入fast-rcnn做精细判断。

faster-rcnn把图片做物理上的切割,有可能忽略了局部相关性信息,准确度有可能降低。

目标检测方法

  • 第一类:传统目标检测算法: 级联+特征+分类器
  • 第二类:基于候选区域的检测方法: RCNN系列
  • 第三类:基于回归方法的检测: YOLO、SSD等

13. 防止过拟合的方法

① Dropout

② L1、L2正则化

③ BatchNormalization

④ 网络bagging(略等于Dropout方法)

⑤ 数据预处理

14. 尝试调参解决深度学习中的过拟合问题

① 检查batch size

② 检查损失函数

③ 检查激活函数

④ 检查学习率

⑤ 检查动量设置

⑥ 提前停止

⑦ 设置权重衰减

⑧ 检查Dropout

⑨ 尝试BN

15. Bounding-Box regression 边框回归是什么操作

通常预测出来的目标的边界跟Ground Truth之间有差异,需要经过边框回归来微调这个边界窗口,使检测结果更准确。

目标窗口一般使用四维向量(x,y,w,h)来表示,分别表示窗口的中心点坐标和宽高。边框回归的目标是使得候选框逼近与真实框。

如何实现边框回归,二个框的差异体现在位置和大小上,所以对其修正也可以从平移+缩放实现。分别是X方向上的平移、缩放和Y方向上的平移和缩放,一共4个映射关系。

4个映射关系的求解:输入候选框对应的CNN特征,跟Ground Truth框对应的特征做损失函数,输出平移和缩放参数。

16. 非极大值抑制(NMS)是什么操作

RCNN中检出的n个框可能彼此重合,进行非极大值抑制就是根据n个框的分类概率从大到小,依次合并的算法。

① 从最大概率矩形框F开始,分别判断A~E与F的重叠度IOU是否大于某个设定的阈值;

② 假设B、D与F的重叠度超过阈值,那么就扔掉B、D;并标记第一个矩形框F,是我们保留下来的。

③ 从剩下的矩形框A、C、E中,选择概率最大的E,然后判断E与A、C的重叠度,重叠度大于一定的阈值,那么就扔掉;并标记E是我们保留下来的第二个矩形框。

就这样一直重复,找到所有被保留下来的矩形框。

非极大值抑制(NMS)顾名思义就是抑制不是极大值的元素,搜索局部的极大值。这个局部代表的是一个邻域。

17. 深度学习中加快训练速度方法

① 提高学习率

② 增加batch size

③ 预训练

④ 动量

⑤ 增加步长

⑥ 使用残差

18. 如何使网络跳出局部极小值

  • 调整学习率,使用变化(衰减)的学习率。也可以尝试分段的学习率,在后期较小的学习率上增加一个大一点的学习率,有可能借此跳出局部最有解。
  • 设置更优的初始化参数。 初始化参数的设定定义了训练起始点的位置。
  • 增加或调整动量,一般动量参数设置0.9~0.95
  • 使用随机梯度下降或者调整batch size
  • 尝试Adam算法 Adam算法即自适应时刻估计方法(Adaptive Moment Estimation),能计算每个参数的自适应学习率。这个方法不仅存储了AdaDelta先前平方梯度的指数衰减平均值,而且保持了先前梯度M(t)的指数衰减平均值,这一点与动量类似。

在实际应用中,Adam方法效果良好。与其他自适应学习率算法相比,其收敛速度更快,学习效果更为有效,而且可以纠正其他优化技术中存在的问题,如学习率消失、收敛过慢或是高方差的参数更新导致损失函数波动较大等问题。

19. 梯度下降法和其他无约束优化算法的比较

无约束优化算法,除了梯度下降以外,还有最小二乘法、牛顿法和拟牛顿法。

梯度下降法和最小二乘法相比,梯度下降法需要选择学习率(步长),而最小二乘法不需要。

梯度下降法是迭代求解,最小二乘法是计算解析解。

如果样本量不算很大,且存在解析解,最小二乘法比起梯度下降法要有优势,计算速度很快。

但是如果样本量很大,用最小二乘法由于需要求一个超级大的逆矩阵,这时就很难或者很慢才能求解解析解了,使用迭代的梯度下降法比较有优势。

梯度下降法和牛顿法/拟牛顿法相比,两者都是迭代求解,不过梯度下降法是梯度求解,是一阶的方法,而牛顿法/拟牛顿法是用二阶的海森矩阵的逆矩阵或伪逆矩阵求解。

相对而言,使用牛顿法/拟牛顿法收敛更快。但是每次迭代的时间比梯度下降法长。

牛顿法其实就是通过切线与x轴的交点不断更新切线的位置,直到达到曲线与x轴的交点得到方程解。

牛顿法不需要设置步长,要求函数是二阶可导的。

拟牛顿法:不用二阶偏导而是构造出Hessian矩阵的近似正定对称矩阵的方法称为拟牛顿法

20. DenseNet

DenseNet是CVPR 2017最佳论文,在ResNet及Inception网络基础上做了优化,主要优化是(在稠密连接模块里)做了密集连接,缓解了梯度消失问题,减少了参数量。

在DenseNet中,任何两层之间都有直接的连接,也就是说,网络每一层的输入都是前面所有层输出的并集,而该层所学习的特征图也会被直接传给其后面所有层作为输入。下图是 DenseNet 的一个dense block示意图:

需要明确一点,dense connectivity 仅仅是在一个dense block里的,不同dense block 之间是没有dense connectivity的,在稠密连接模块之间以一个卷积和池化层连接:

DenseNet通过稠密连接,降低了参数量,但是由于要保存很多网络先前的计算状态,所以在内存占用方面很恐怖。

原文链接:https://www.shangyexinzhi.com/Article/details/id-95662/

编辑于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券