8. 深度学习实践:优化(续)

接上部分讨论:8. 深度学习实践:优化

3. 基本算法

3.1 随机梯度下降

SGD及其变种很可能是一般ML中应用最多的优化算法。

8. 深度学习实践:优化(续)_第1张图片

关键参数:学习率。最好的选择方法:监测目标函数值随时间变化的学习曲线。与其科学,更像艺术。实践中有必要随时间逐渐降低学习率。

SGD(1998年就有了)、小批量、基于梯度优化的在线学习算法,一个重要性质:每一步更新的计算时间不依赖于训练样本数目的多寡。

3.2 动量(momentum)法

SGD的学习过程有时会很慢。动量法(1964年)旨在加速学习。积累了之前梯度指数级衰减的移动平均,并且继续沿着该方向移动。

普通的梯度步骤会浪费时间在峡谷的窄轴上来回移动:

8. 深度学习实践:优化(续)_第2张图片

动量正确的纵向穿过峡谷:

8. 深度学习实践:优化(续)_第3张图片

动量主要针对两个问题:一是海森矩阵的病态条件,二是随机梯度的方差。该图直观解释了第一个问题。红色路径表示动量学习规则所遵循的路径,黑色箭头表示梯度下降将在该点采取的步骤。

8. 深度学习实践:优化(续)_第4张图片

动量版算法引入了变量 v 充当速度角色,代表参数移动的方向和速率。速度被设定为负梯度的指数衰减平均。动量一词是物理类比,负梯度是移动参数空间中粒子的力。假设是单位质量,则速度向量 v 可看作是粒子的动量。 α 决定了之前梯度的贡献衰减得有多大,越大则之前梯度对现在方向的影响也越大(放大了之前梯度的效果)。

步长大小为:这里写图片描述

例如,当 α 为 0.9 时,对应着最大速度10倍于梯度下降算法。当许多连续的梯度指向相同的方向时,步长最大。马太效应的感觉。梯度下降算法基于每个梯度简单的更新一步。动量算法则使用力改变粒子的速度。

3.3 Nesterov动量

受Nesterov加速梯度算法(1983,2004)启发,Sutskever(2013)提出了动量算法的一个变种。和标准动量体现在梯度计算上。梯度计算在施加当前速度之后。

8. 深度学习实践:优化(续)_第5张图片

4. 参数初始化策略

4.1 初始化很重要

有的优化算法是非迭代的,仅是求解一个解点(例如,求二次函数的最小值)。有的本质上是迭代的,但优化时能在可接受时间内收敛到可接受的解,并且与初始值无关(凸优化,不论从哪走,都可以到碗底)。

DL训练算法通常没有这两种奢侈的性质。通常是迭代的,需要指定初始点。训练网络足够困难,大多数算法很大程度地受到初始化选择的影响。初始点能够决定算法是否收敛。当学习收敛时,初始点可决定学习收敛得有多快,以及是否收敛到一个代价高或低的点。

现代的初始化策略是简单的、启发式的。设定改进的初始化策略很困难,因为NN优化至今尚未很好理解。机理不知,没有指导。一个比较确知的特性是:初始参数需要在不同单元间破坏对称性。若相同激活函数的两个隐藏单元连接到相同的输入,则这些单元必须具有不同的初始参数。

4.2 常用的策略

本书讲了2页。理解没到,看了仅是字面意思,暂不做笔记。

5. 自适应学习率算法

学习率是难以设置的超参数之一。若我们相信方向敏感度有些轴对齐(互相正交吗?),则每个参数设置不同的学习率。在整个学习过程中自动适应这个学习率是有道理的。

以下讨论内容,是基于梯度优化方法(学习率是超参数),本节做的改进的算法,对基本形式做了各种调整,学习率(步长)在训练过程中成了一个变化着的值,谓之自适应。

5.1 AdaGrad算法

2011年。思路:独立的适应所有模型参数的学习率,缩放每个参数反比于其所有梯度历史平方值总和的平方根(平方根值越大,缩得越美,学习率越小了)。

8. 深度学习实践:优化(续)_第6张图片

原来的参数更新,对于所有参数都使用相同的学习率。某一个参数向量变化为:

θt+1,i=θt,iϵg

现在,学习率随着每次迭代,根据历史梯度变化:

θt+1,i=θt,iϵr+δg

r是d*d的对角矩阵,每个对角线位置i对应某个参数,i的值累加到t次迭代的对应参数的梯度平方和。平方根是因为实践中发现效果更好。

具有损失最大偏导的参数,则相应的有一个快速下降的学习率(缩得厉害)。具有小偏导的参数,在学习率上有相对较小的下降(缩得轻,学习率仍较大)。净效果是参数空间中更平缓的倾斜方向上(小偏导)取得更大的进步(学习率较大),越是陡急的方向上步子小一些。(

凸优化时,该算法还行。然而经验上已发现,对于训练DL模型时,从训练开始时就积累梯度平方会导致有效学习率过早和过量的减小。

5.2 RMSProp算法

2012年,Hinton修改AdaGrad算法,以在非凸设定下效果更好,改变梯度累积,为指数加权的移动平均。当训练非凸函数的NN时,Ada的学习轨迹可能穿过了很多不同钢结构,最终到达一个局部是凸碗的区域。Ada根据平方梯度的整个历史收缩学习率,可能使得学习率在达到这样的凸结构前就变得很小了,从而胜利的前夜脚步慢了。

RMSProp使用指数衰减平均,以丢弃遥远故去的历史,使其能够在找到凸碗结构后快速收敛,就像一个初始化于该碗状结构的Ada算法实例。

算法标准形式:

8. 深度学习实践:优化(续)_第7张图片

加上了一个衰减速率,代表着对以前结果的考虑,若为0.5,则历史和现在都考虑着,若未0.1,则历史考虑1份,现在考虑9份。用来控制移动平均的长度范围。其余一样。

结合Nesterov动量的形式:

8. 深度学习实践:优化(续)_第8张图片

在动量中,步长因子上,考虑了累计梯度的效果。该法已被证明行之有效,目前常用。

5.3 Adam算法

2014年提出,源自“adaptive moments”,另一种学习率自适应的优化算法。

8. 深度学习实践:优化(续)_第9张图片

主要是基于RMSProp法来做。Adam中,动量直接并入了梯度一阶矩的估计(结合动量使用没有明确的理论动机)。其次,Adam中包括偏置修正,修正从原点初始化的一阶矩(动量项)和二阶矩估计。RMSProp也采用了二阶矩估计,但缺失了修正因子。Adam通常被认为对超参数的选择相当鲁棒。

5.4 如何选择?

没有一致共识。具有自适应学习率的算法族表现很好,但没有那个脱颖而出。

当前最流行的优化算法:SGD,动量SGD,RMSProp,动量RMSProp,Adam和AdaDelta。选择哪个算法:取决于你对哪个较熟悉,以便调节超参数。

6. 二阶近似方法

暂不做详细阅读和笔记。

6.1 牛顿法

6.2 共轭梯度

6.3 BFGS法

7. 优化策略和元算法

7.1 批标准化

设H是需要标准化的某层的小批量激活函数,排布为设计矩阵。每个样本的激活出现在矩阵的每一行中。为了标准化H,将其替换为:

H=Hμδ

μ 是包含每个单元均值的向量, δ 是包含每个单元标准差的向量。应用于矩阵H的每一行,每行内是逐元素运算。

本节暂不做详细笔记。

7.2 坐标下降

某些情况下,将优化问题分解可更快解决。我们相对于某个单一变量 xi 最小化 f(x) ,然后相对于另一个变量 xj 等,反复循环所有变量,达到局部极小值。称之为:坐标下降法。更一般的,块坐标下降法,是指我们对于某个子集(子集中只有一个元素时就是单个坐标下降了)的变量同时最小化。

当优化问题中的不同变量们,可以清楚分成相对独立的组时,坐标下降最有意义。举例,有代价函数为:

这里写图片描述

这是稀疏编码的学习问题。目标是寻求一个权重矩阵W(字典),可以线性解码激活值矩阵H(稀疏表示),以重构训练集X(原本样本)。第一项说H要尽量稀疏(非0元尽量少),第二项说尽可能编码X。以前做过笔记见《西瓜书》笔记11:特征选择与稀疏表示(三)。

代价函数非凸,但如果将训练算法的输入分成两个集合:字典W和表示H。最小化二者之一的任意一组变量的目标函数都是凸。块坐标下降允许我们高效的凸优化算法,交替做:固定H优化W,固定W优化H。

当然了,当一个变量的值很大程度地影响另一个变量的最优值时,坐标下降不是一个很好的方法。

7.3 Polyak平均

Polyak平均(1992年)会平均优化算法在参数空间访问轨迹中的几个点。若t次迭代梯度下降访问了点 θ(1),...,θ(t) ,则Polyak平均算法的输出是 θ^(t)=1tiθ(i)

应用其到非凸问题时,通常会用指数衰减来计算平均值:

这里写图片描述

7.4 监督预训练

7.4.1 监督预训练

模型如果太复杂,难以优化。任务如果很困难,直接训练模型来解决的挑战很大。那么,可以训练一个较简单的模型来求解问题,然后逐步加大模型的复杂度可能会有效。训练模型求解一个简单问题,转移到大问题上,有时也会有效。

预训练:在直接训练目标模型求解目标问题之前,训练简单模型求解简单问题的方法(pretraining)。

贪心算法:将问题分解为许多部分,然后独立在每个部分求解最优值。但是,结合各个最佳部分不能保证得到一个最佳的完整解。然而,贪心算法计算上比求解最优联合解高效得多,而且我们常会接受该解。贪心也可紧接一个 精调(fine-tuning)阶段,联合优化算法搜索全问题的最优解。使用贪心解,来初始化联合优化算法,可以加大加速算法。

贪心预训练,在DL中普遍存在。greedy supervised pretraining。在2007年Bengio的原始版本中,每个隐藏层,以先前训练的隐藏层的输出,为输入。

8. 深度学习实践:优化(续)_第10张图片8. 深度学习实践:优化(续)_第11张图片

2015年有版本是预训练深度卷积网络(11层),然后使用该网络前4层、最后3层初始化更深的网络(多达19层),并非一次预训练一层。非常深的新网络的中间层是随机初始化的。然后联合训练新网络。等等。

7.4.2 贪心预训练为什么会有帮助?

2007年Bengio提出的假说:有助于更好地指导深层结构的中间层的学习。

默默无闻的中间层,有机会被拉出来重点关注下,因此它们挺开心,表现也很好。

迁移学习 想法:2014年在一组任务上,预训练了一个8层权重的深度卷积网络(ImageNet数据集的子集)。然后用该网络的前k层初始化了一个同样规模的网络。然后第二个网络的所有层,联合训练以执行不同的任务(ImageNet数据集的另一个子集),但训练样本小于第一个任务。(似乎是第一个捕捉到了某种神秘信息,迁移地用到了第二个上)

7.5 设计有助于优化的模型

实践中,选择一族容易优化的模型,比使用一个强大的优化算法更重要。NN在过去30年的大多数进步主要来自于改变模型族,而非改变优化过程。1980年代用于训练NN的带动量的SGD,仍然是现代NN的前沿算法。

现代NN的设计选择体现在:层之间的线性变换,几乎处处可导的激活函数,大部分定义域都有明显的梯度。LSTM,ReLU,maxout单元都比先前的模型使用更多的线性函数。

其他的模型设计策略还包括:层之间的线性路径,跳跃连接,减少了从较低层参数到输出最短路径的长度,缓解了梯度消失问题(2015年)。这是预训练策略的替代方法。以这种方式,可在一个阶段联合训练所有层,不改变架构,使得中间层,低层,可通过更短路径得到一些如何更新的有用信息。

7.6 延拓法、课程学习

暂不做详细笔记。

你可能感兴趣的:(《深度学习》学习-Bengio)