接上部分讨论:8. 深度学习实践:优化
3. 基本算法
3.1 随机梯度下降
SGD及其变种很可能是一般ML中应用最多的优化算法。
关键参数:学习率。最好的选择方法:监测目标函数值随时间变化的学习曲线。与其科学,更像艺术。实践中有必要随时间逐渐降低学习率。
SGD(1998年就有了)、小批量、基于梯度优化的在线学习算法,一个重要性质:每一步更新的计算时间不依赖于训练样本数目的多寡。
3.2 动量(momentum)法
SGD的学习过程有时会很慢。动量法(1964年)旨在加速学习。积累了之前梯度指数级衰减的移动平均,并且继续沿着该方向移动。
普通的梯度步骤会浪费时间在峡谷的窄轴上来回移动:
动量正确的纵向穿过峡谷:
动量主要针对两个问题:一是海森矩阵的病态条件,二是随机梯度的方差。该图直观解释了第一个问题。红色路径表示动量学习规则所遵循的路径,黑色箭头表示梯度下降将在该点采取的步骤。
动量版算法引入了变量 v 充当速度角色,代表参数移动的方向和速率。速度被设定为负梯度的指数衰减平均。动量一词是物理类比,负梯度是移动参数空间中粒子的力。假设是单位质量,则速度向量
步长大小为:
例如,当 α 为 0.9 时,对应着最大速度10倍于梯度下降算法。当许多连续的梯度指向相同的方向时,步长最大。马太效应的感觉。梯度下降算法基于每个梯度简单的更新一步。动量算法则使用力改变粒子的速度。
3.3 Nesterov动量
受Nesterov加速梯度算法(1983,2004)启发,Sutskever(2013)提出了动量算法的一个变种。和标准动量体现在梯度计算上。梯度计算在施加当前速度之后。
4. 参数初始化策略
4.1 初始化很重要
有的优化算法是非迭代的,仅是求解一个解点(例如,求二次函数的最小值)。有的本质上是迭代的,但优化时能在可接受时间内收敛到可接受的解,并且与初始值无关(凸优化,不论从哪走,都可以到碗底)。
DL训练算法通常没有这两种奢侈的性质。通常是迭代的,需要指定初始点。训练网络足够困难,大多数算法很大程度地受到初始化选择的影响。初始点能够决定算法是否收敛。当学习收敛时,初始点可决定学习收敛得有多快,以及是否收敛到一个代价高或低的点。
现代的初始化策略是简单的、启发式的。设定改进的初始化策略很困难,因为NN优化至今尚未很好理解。机理不知,没有指导。一个比较确知的特性是:初始参数需要在不同单元间破坏对称性。若相同激活函数的两个隐藏单元连接到相同的输入,则这些单元必须具有不同的初始参数。
4.2 常用的策略
本书讲了2页。理解没到,看了仅是字面意思,暂不做笔记。
5. 自适应学习率算法
学习率是难以设置的超参数之一。若我们相信方向敏感度有些轴对齐(互相正交吗?),则每个参数设置不同的学习率。在整个学习过程中自动适应这个学习率是有道理的。
以下讨论内容,是基于梯度优化方法(学习率是超参数),本节做的改进的算法,对基本形式做了各种调整,学习率(步长)在训练过程中成了一个变化着的值,谓之自适应。
5.1 AdaGrad算法
2011年。思路:独立的适应所有模型参数的学习率,缩放每个参数反比于其所有梯度历史平方值总和的平方根(平方根值越大,缩得越美,学习率越小了)。
原来的参数更新,对于所有参数都使用相同的学习率。某一个参数向量变化为:
θt+1,i=