正则化与优化技术

1、深度学习中的正则化
正则化技术是保证算法泛化能力的有效工具,因此算法正则化的研究成为机器学习中主要的研究主题。此外,正则化还是训练参数数量大于训练数据集的深度学习模型的关键步骤。正则化可以避免算法过拟合,过拟合通常发生在算法学习的输入数据无法反应真实的分布且存在一些噪声的情况。过去数年,研究者提出和开发了多种适合机器学习算法的正则化方法,如数据增强、L2 正则化(权重衰减)、L1 正则化、Dropout、Drop Connect、随机池化和早停等。

数据增强
数据增强是提升算法性能、满足深度学习模型对大量数据的需求的重要工具。数据增强通过向训练数据添加转换或扰动来人工增加训练数据集。数据增强技术如水平或垂直翻转图像、裁剪、色彩变换、扩展和旋转通常应用在视觉表象和图像分类中。

L1 和 L2 正则化
L1 和 L2 正则化是最常用的正则化方法。L1 正则化向目标函数添加正则化项,以减少参数的绝对值总和;而 L2 正则化中,添加正则化项的目的在于减少参数平方的总和。根据之前的研究,L1 正则化中的很多参数向量是稀疏向量,因为很多模型导致参数趋近于 0,因此它常用于特征选择设置中。

Dropout
Dropout 指暂时丢弃一部分神经元及其连接。随机丢弃神经元可以防止过拟合,同时指数级、高效地连接不同网络架构。神经元被丢弃的概率为 1 − p,减少神经元之间的共适应。隐藏层通常以 0.5 的概率丢弃神经元。使用完整网络(每个节点的输出权重为 p)对所有 2^n 个 dropout 神经元的样本平均值进行近似计算。Dropout 显著降低了过拟合,同时通过避免在训练数据上的训练节点提高了算法的学习速度。

Drop Connect
Drop Connect 是另一种减少算法过拟合的正则化策略,是 Dropout 的一般化。在 Drop Connect 的过程中需要将网络架构权重的一个随机选择子集设置为零,取代了在 Dropout 中对每个层随机选择激活函数的子集设置为零的做法。由于每个单元接收来自过去层单元的随机子集的输入,Drop Connect 和 Dropout 都可以获得有限的泛化性能。Drop Connect 和 Dropout 相似的地方在于它涉及在模型中引入稀疏性,不同之处在于它引入的是权重的稀疏性而不是层的输出向量的稀疏性。

早停法(stop early)
早停法可以限制模型最小化代价函数所需的训练迭代次数。早停法通常用于防止训练中过度表达的模型泛化性能差。如果迭代次数太少,算法容易欠拟合(方差较小,偏差较大),而迭代次数太多,算法容易过拟合(方差较大,偏差较小)。早停法通过确定迭代次数解决这个问题,不需要对特定值进行手动设置。

对于正则化,大家可以参考吴恩达的视频,改善深层神经网络:超参数调试、正则化以及优化 这一节,讲的很好!

2、深度模型中的优化技术
基于随机梯度下降的优化算法是机器学习和深度学习中的核心优化算法。该领域中的许多问题都可以看作是最大化和最小化一个参数化的损失函数,在大多数情况下损失函数本身是可微的,由于问题数据规模极大,所以一般情况下获得二阶信息是很难的,存储相应的二阶信息也是消耗非常大的一件事,所以梯度下降,这样一种仅仅要求一阶偏导数的优化算法在这些问题上很有效。而在深度学习领域,即使数据集和网络模型架构完全相同,使用不同的优化算法,也可能得到相差非常大的最终结果,此外,在数据收集和采样进行训练的时候可能会有比较严重的噪声影响,简单的梯度下降方法往往无法奏效,因此,为了弥补朴素梯度下降的种种缺陷,就需要一系列对梯度下降系列优化算法的的改进,也就因此诞生了SGD with momentum, Adagrad,RMSprop,Adam等一系列变种算法。

算法介绍
朴素SGD及mini-batch SGD
朴素SGD即最基本的最速下降法,使用一个梯度步作为方向,步长作为一个可调控因子随时调整,那么可简单写为
在深度学习的实践当中,通常选择学习率是一个根据迭代次数逐渐衰减的量,即给定一个初始学习率然后让它随时迭代次 数逐渐衰减,或者是训练到一定迭代次数后进行衰减。朴素的SGD的问题就是其收敛速度非常慢,而且容易陷入局部最优点和鞍点,很难从其中逃出。同时,由于学习率在实践中往往是根据经验来调整,而一个合适的学习率调整策略对整个问题的优化过程是十分重要的,所以如何选择这样合适的学习率更是SGD的最大难点。

​ 在深度学习环境下,我们有非常多的训练数据,朴素的想法是对每一个数据使用SGD更新一次,这样能获得很好的对数据的泛化能力,但是与之而相对的,如果数据的分布极不均衡,数据中有很多的噪声,那么这样的策略将会“带偏”我们的模型,因此,一个自然而然的想法就是每次使用一批数据(batch)来计算梯度,然后将梯度平均之后再使用SGD去更新参数,通过平均一批样本的梯度结果来减少震荡和其他影响,这就是所谓的mini-batch SGD的基本思想。在实际操作中,batch的大小一般根据计算资源的存储能力,训练时间开销,泛化能力要求综合来定,batch越小泛化能力越强,但时间开销就大且容易发生震荡,batch越大训练速度越快但是可能丧失一定的泛化能力,所以一般使用权衡两边的mini-batch。

SGD with momentum
上文中提到朴素SGD收敛速度很慢且容易震荡,借用物理中动量的概念,我们希望结合历史的梯度信息和当前梯度信息来共同指导更新,通俗来讲,就是遇到陡坡时,希望运动得更快,遇到复杂的沟壑时,希望借助之前的惯性尽快冲出,遇到突然变化的情况,也希望由于惯性的作用方向不要变化太大。借由以上直觉和概念,就产生带有动量的梯度下降,即SGD with momentum,其表达式为:

这里 \beta_1 是一个加权因子,一般取0.9,这个形式其实就是对历史的梯度信息做因子为 \beta_1 的指数加权平均,然后结合当前的梯度信息构成下一步更新的方向,由于这个因子大于0.5,这就意味着下降方向主要是此前累积的下降方向,然后略微偏向当前时刻的梯度方向。这样的一种改进,使得参数中那些梯度方向变化不大的维度可以加速更新,同时减少梯度方向变化较大的维度上的更新幅度,由此产生了加速收敛和减小震荡的效果。

Adagrad
​ 之前我们提到的优化算法都是对整个模型的所有参数,以相同的学习率去更新,但是深度学习模型是非常大的,往往有上亿个参数,采用统一的学习率是一种很简单粗暴的策略。而在不同的任务中,不同的网络层的参数所需要的更新频率往往有所区别。对于那些更新不频繁的参数,我们了解到的信息较少,所以希望每次更新时单次步长更大,能够多学习到一些知识,同时对于那些更新非常频繁的参数,我们已经累积了大量关于它的学习经验和知识,所以希望采用较小的步长,不要被一部分样本影响过大,能够学到更稳定的参数值。由此,我们需要一个量来衡量历史更新频率,直观的想法就是二阶动量,即某一维上,迄今为止所有梯度值的平方和,可以写作:

对于以前更新频繁的参数,其二阶动量对应的分量就比较大,所以对应的学习率就较小,反之就较大。Adagrad也可以说是进入所谓“自适应学习率”的时代。

RMSprop
对于Adagrad,有一个很明显的问题,就是V_t 是一个只会累积增加的量,即是单调递增的,这在稀疏数据场景下表现非常好,但是对于稠密的数据集,这会导致学习率在训练的中后期单调递减至0,对于后续的训练样本,由于学习率已经接近于0,所以模型很难学到新的必要的知识。因此,我们需要对Adagrad做一定的修正,借鉴momentum中对历史信息的处理方式,我们对于二阶动量也采用指数加权平均的方法来处理,不累积全部的历史梯度,而只关注最近某一时间窗口内的梯度累积量,由此便得到了RMSprop:

Adam
在上面的方法中我们讲到了基于一阶动量和二阶动量的改进方法,那么如果将他们结合起来呢,Adam就是这样一种结合两者的改进优化算法,也是整个SGD系列的集大成者,既包含来自momentum的累积历史梯度对方向的修正,又包含来自RMSprop的对于学习率的修正,最终的完整表达式如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值