【Deep Learning】第8章 深度模型中的优化

Posted by Cao Zihang on December 20, 2022 Word Count:

第8章 深度模型中的优化

风险最小化→经验风险最小化→代理损失函数最小化

批量/确定性梯度算法:使用整个训练集的优化算法 随机/在线算法:每次只使用单个样本的优化算法 小批量/小批量随机/随机算法:介于批量算法和在线算法的样本量之间 小批量算法优势:

  • 更大的批量会计算更精准的梯度,但回报小于线性($n个样本均值的标准差为 \frac{\sigma}{\sqrt{n}}$)
  • 极小批量难以充分利用多核架构
  • 批量处理中的样本可以并行计算
  • 在GPU上使用2的幂数作为批量大小可以获取更少的运行时间,一般取值范围为32~256,16有时在尝试大模型时使用
  • 可能由于小批量学习过程加入了噪声,会有一些正则化效果

仅基于梯度$g$的更新方法相对鲁棒,能使用较小的批量获取成功,如100;基于Hessian矩阵$H$计算$H^{-1}g$更新的二阶方法需要更大的批量,如10000

神经网络优化挑战

病态 突出的是Hessian矩阵$H$的病态 随机梯度会“卡”在某些情况,此时即使是很小的更新步长也会增加代价函数 二阶优化中二阶泰勒级数展开预测梯度下降$\frac{1}{2}\eta^{2}g^{\top}Hg-\eta g^{\top}g$ 当$\frac{1}{2}\eta^{2}g^{\top}Hg$超过$\eta g^{\top}g$时,梯度的病态会成为问题 判断病态通常监控平方梯度范数$g^{\top}g$和$g^{\top}Hg$

局部极小值 凸优化问题任何一个局部极小点都是全局极小点 神经网络基本有非常多的局部极小值,难以找到全局极小点

模型可辨识性:如果一个足够大的训练集可以唯一确定一组模型参数,那么该模型被称为可辨认的 神经网络不可辨识:权重空间对称性等 不可辨识性意味着神经网络代价函数具有非常多的局部极小值,虽然这些由不可辨识性产生的局部极小值都有相同的代价函数值,若其比全局最小点拥有很大的代价就会带来隐患 目前学界认为足够大的神经网络大部分局部极小值都有很小的代价函数,需要谨慎判断

高原、鞍点和其他平坦区域 未经修改的牛顿法容易跳进鞍点,高维空间中鞍点的激增使神经网络训练中二阶方法无法成功取代梯度下降 Dauphin,2014介绍了二阶优化的无鞍牛顿法

出现恒值的、宽且平坦的区域时,梯度和Hessian矩阵均为0,这种退化情形是所有数值优化算法的主要问题

悬崖和梯度爆炸 遇到斜率极大的悬崖结构时,梯度更新会很大程度地改变参数值,通常会完全逃过悬崖结构 |450

采用启发式梯度截断可以避免严重后果 基本思想是梯度没有指明步长,当传统梯度下降算法提议更新很大一步时,启发式梯度截断会干涉使步长减小,从而不弹射过远

悬崖结构在循环神经网络的代价函数中很常见

长期依赖 当计算图很深的时候,由于深的结构使模型丧失了学习到先前信息的能力,让优化变得困难

循环网络中问题突出 假设计算图中包含一条反复与矩阵$W$相乘的路径,$t$步后相当于乘以$W^{t}$,假设$W$有特征值分解$W=Vdiag(\lambda)V^{-1}$,则$W^{t}=(Vdiag(\lambda)V^{-1})^{t}=Vdiag(\lambda)^{t}V^{-1}$ 当特征值$\lambda_{i}$不在1附近,若在量级上大于1会发生梯度爆炸问题,若小于1会发生梯度消失问题

非精确梯度 当目标函数不可解时,通常梯度也难以处理,只能近似梯度 对比散度用来近似玻尔兹曼机中难以处理的对数似然梯度

局部和全局结构间的若对应 在局部有改进但不能指向全局中代价低得多的遥远区域的算法仍然表现不佳 目前多数研究在求解具有困难全局结构的问题时,旨在寻找良好的初始点,而不是开发非局部范围更新的算法

优化的理论限制

基本算法

随机梯度下降SGD

随机梯度下降SGD在第$k$个训练迭代的更新 $\begin{aligned}Re&quire:学习率\eta_{k}\Re&quire:初始参数\theta\&while\ 停止准则为满足\ do\&\quad 从训练集中采取包含m个样本{x^{1},…,x^{m}}的小批量\&\quad计算梯度估计:\hat{g}\leftarrow + \frac{1}{m}\bigtriangledown_{\theta}\sum\limits_{i}L(f(x^{i};\theta),y^{i})\&\quad应用更新\theta\leftarrow\theta-\eta_{k} \hat{g}\&end\ while\end{aligned}$

批量梯度下降可以使用固定的学习率;SGD不行 实践中一般会线性衰减学习率直到第$\tau$次迭代$\eta_{k}=(1-\alpha)\eta_{0}+\alpha\eta_{\tau}$其中$\alpha= \frac{k}{\tau}$ 在$\tau$步迭代后,一般使$\eta$保持常数

通常$\eta_{\tau}$设为$\eta_{0}$的1% $\eta_{0}$通常检测最早的几轮迭代,选择比在效果上表现最佳的学习率更大的学习率,但又不会导致严重震荡

动量

动量方法旨在加速学习,特别是处理高曲率、小但一直的梯度,或是带噪声的梯度

引入了变量$v$充当速度 $v\leftarrow \alpha v-\eta\bigtriangledown_{\theta}( \frac{1}{m}\sum\limits_{i=1}^{m}L(f(x^{i};\theta),y^{i}))$ $\theta\leftarrow\theta+v$ 速度$v$积累了梯度元素$\eta\bigtriangledown_{\theta}( \frac{1}{m}\sum\limits_{i=1}^{m}L(f(x^{i};\theta),y^{i}))$ 相对于$\eta$,$\alpha$越大,之前的梯度对现在的方向影响越大 |450

使用动量的随机梯度下降SGD $\begin{aligned}Re&quire:学习率\eta,动量参数\alpha\Re&quire:初始参数\theta,初始速度v\&while\ 没有达到停止准则\ do\&\quad 从训练集中采取包含m个样本{x^{1},…,x^{m}}的小批量\&\quad 计算梯度估计:g\leftarrow \frac{1}{m}\bigtriangledown_{\theta}\sum\limits_{i}L(f(x^{i};\theta),y^{i})\&\quad 计算速度更新:v\leftarrow\alpha v-\eta g\&\quad 应用更新\theta \leftarrow\theta+v\&end\ while\end{aligned}$

将动量超参数$\alpha$视作$\frac{1}{1-\alpha}$有助于理解 $\alpha=0.9$对应着最大速度10倍于梯度下降算法 常用$\alpha$取值为0.5,0.9,0.99 $\alpha$也会随时间调整,一般初始值是一个较小的值,随后慢慢变大 随着时间推移,调整$\alpha$重要性比收缩$\eta$越来越低

Nesterov动量

更新规则: $v\leftarrow \alpha v-\eta\bigtriangledown_{\theta}( \frac{1}{m}\sum\limits_{i=1}^{m}L(f(x^{i};\theta+\alpha v),y^{i}))$ $\theta\leftarrow\theta+v$ Nesterov动量的梯度计算在施加当前速度之后 解释为往标准动量方法中添加了一个校正因子 使用Nesterov动量的随机梯度下降 $\begin{aligned}Re&quire:学习率\eta,动量参数\alpha\Re&quire:初始参数\theta,初始速度v\&while\ 没有达到停止准则\ do\&\quad 从训练集中采取包含m个样本{x^{1},…,x^{m}}的小批量\&\quad 应用临时更新:\tilde{\theta}\leftarrow\theta+\alpha v\&\quad 计算梯度估计:g\leftarrow \frac{1}{m}\bigtriangledown_{\theta}\sum\limits_{i}L(f(x^{i};\theta),y^{i})\&\quad 计算速度更新:v\leftarrow\alpha v-\eta g\&\quad 应用更新\theta \leftarrow\theta+v\&end\ while\end{aligned}$ 在凸批量梯度的情况下,Nesterov动量将额外误差收敛率从$O(\frac{1}{k})$改进到$O(\frac{1}{k^{2}})$ 在SGD情况下,Nesterov动量没有改进收敛率

参数初始化策略

目前对初始点如何影响泛化的理解是原始的,几乎没有任何的指导 完全确知的唯一特性是初始化参数需要在不同单元间破坏对称性

通常我们仅随机初始化权重,偏置和其他超参数设置启发式挑选的常数

几乎总是初始化模型的权重为高斯或均匀分布中随机抽取的值 一个好的初始数值选取范围的经验法则是观测单个小批量数据上的激活或梯度的幅度或标准差;若权重太小,当激活值在小批量上前向传播时激活值的幅度会缩小;通过重复识别具有小得不可接受的激活值的第一层并提高其权重,最终可能获取一个初始激活全部合理的网络

设置偏置方法必须与设置权重的方法协调,多数权重初始化中可以设偏置为0 偏置不为0的情况:

  • 若偏置作为输出单元,初始化偏置以获取正确的输出边缘统计通常是有利的【自编码器、玻尔兹曼机】
  • 选择偏置避免初始化引起太大饱和,如将ReLU的隐藏单元偏置设为0.1而非0
  • 一个单元会控制其他单元是否参与到等式中【LSTM模型遗忘门】

使用无监督模型训练出来的参数初始化监督模型等其他方案

自适应学习率算法

AdaGrad算法

独立地适用所有模型参数的学习率,缩放每个参数反比于其所有梯度历史水平平方值综合的平方根 具有损失最大偏导的参数有一个快速下降的学习率,而具有小偏导的参数在学习率上有相对较小的下降 净效果是在参数空间中更为平缓的倾斜方向会取得更大的进步

在凸优化背景中,AdaGrad有一些令人满意的性质 在深度神经网络中,从训练开始积累梯度平方会导致有效学习率过早或过重得减小 AdaGrad在某些深度学习模型上效果不错,但不是全部

AdaGrad算法 $\begin{aligned}Re&quire:全局学习率\eta\Re&quire:初创参数\theta\Re&quire:小常数\delta,为了数值稳定大约设为10^{-7b}\&初始化梯度累计变量r=0\&while\ 没有达到停止标准\ do\&\quad 从训练集中采取包含m个样本{x^{1},…,x^{m}}的小批量\&\quad 计算梯度:g\leftarrow \frac{1}{m}\bigtriangledown_{\theta}\sum\limits_{i}L(f(x^{i};\theta),y^{i})\&\quad累计平方梯度:r\leftarrow r+g\odot g\&\quad计算更新:\Delta \theta\leftarrow - \frac{\eta}{\delta+\sqrt{r}}\odot g(逐元素地应用除和求平方根)\&\quad应用更新:\theta\leftarrow\theta+\Delta \theta\&end\ while\end{aligned}$

RMSProp算法

通过修改AdaGrad在非凸设定下效果更好 改变梯度积累为指数加权的移动平均 RMSProp使用指数衰减平均以丢弃遥远过去的历史,使其能够在找到凸碗状结构后快速收敛,就像一个初始化于该碗状结构的AdaGrad算法

RMSProp算法 $\begin{aligned}Re&quire:全局学习率\eta,衰减速率\rho\Re&quire:初始参数\theta\Re&quire:小常数\delta,通常设定为10^{-6}(用于被小数除时的数值稳定)\&初始化积累变量r=0\&while\ 没有达到停止准则\ do\&\quad从训练集中采取包含m个样本{x^{1},…,x^{m}}的小批量\&\quad计算梯度:g\leftarrow \frac{1}{m}\bigtriangledown_{\theta}\sum\limits_{i}L(f(x^{i};\theta),y^{i})\&\quad累计平方梯度:r\leftarrow \rho r+(1-\rho)g\odot g\&\quad计算参数更新:\Delta\theta=- \frac{\eta}{\sqrt{\delta+r}}\odot g\ ( \frac{1}{\sqrt{\delta+r}}逐元素应用)\&\quad应用更新:\theta\leftarrow\theta+\Delta\theta\&end\ while\end{aligned}$ 使用Nesterov动量的RMSProp算法 $\begin{aligned}Re&quire:全局学习率\eta,衰减速率\rho,动量系数\alpha\Re&quire:初始参数\theta,初始参数v\&初始化积累变量r=0\&while\ 没有达到停止准则\ do\&\quad从训练集中采取包含m个样本{x^{1},…,x^{m}}的小批量\&\quad计算临时更新:\tilde{\theta}\leftarrow\theta+\alpha v\&\quad计算梯度:g\leftarrow \frac{1}{m}\bigtriangledown_{\theta}\sum\limits_{i}L(f(x^{i};\theta),y^{i})\&\quad累计平方梯度:r\leftarrow \rho r+(1-\rho)g\odot g\&\quad计算速度更新:v\leftarrow\alpha v- \frac{\eta}{\sqrt{r}}\odot g\ (\frac{1}{\sqrt{r}}逐元素应用 )\&\quad应用更新:\theta\leftarrow\theta+v\&end\ while\end{aligned}$

经验上,RMSProp已被证明是有效且使用的深度神经网络优化算法。目前是从业者经常使用的优化算法之一

Adam算法

Adam算法 $\begin{aligned}Re&quire:步长\epsilon(建议默认0.001)\Re&quire:矩估计的指数衰减率\rho_{1}和\rho_{2}在区间[0,1)内(建议默认0.9\&0.999)\Re&quire:用于数据稳定的小常数\delta(建议默认10^{-8})\Re&quire:初始参数\theta\&初始化一阶和二阶矩变量s=0,r=0\&初始化时间步t=0\&while\ 没有达到停止准则\ do\&\quad从训练集中采取包含m个样本{x^{1},…,x^{m}}的小批量\&\quad计算梯度:g\leftarrow \frac{1}{m}\bigtriangledown_{\theta}\sum\limits_{i}L(f(x^{i};\theta),y^{i})\&\quad t\leftarrow t+1\&\quad 更新有偏一阶矩估计:s\leftarrow \rho_{1}s+(1-\rho_{1})g\&\quad更新有偏二阶矩估计:r\leftarrow \rho_{2}r+(1-\rho_{2})g\odot g\&\quad 修正一阶矩的偏差:\hat{s}\leftarrow \frac{s}{1-\rho_{1}^{t}}\&\quad 修正二阶矩的偏差:\hat{r}\leftarrow \frac{r}{1-\rho_{2}^{t}}\&\quad 计算更新:\Delta\theta= - \epsilon \frac{\hat{s}}{\sqrt{\hat{r}}+\delta}(逐元素应用操作)\&\quad应用更新:\theta\leftarrow\theta+\Delta\theta\&end\ while\end{aligned}$ 不像Adam,RMSProp二阶据估计可能在训练初期有很高的的偏置,Adam通常被认为对超参数选择相当鲁棒,尽管学习率有时需要从建议的默认修改

二阶近似方法

牛顿法更新规则:$\theta^{*}=\theta_{0}-H^{-1}\bigtriangledown_{\theta}J(\theta_{0})$ 对于非二次的表面,只要Hessian矩阵保持正定,牛顿法就能迭代 目标为$J(\theta)= \frac{1}{m}\sum\limits_{i=1}^{m}L(f(x^{i};\theta),y^{i})$的牛顿法 $\begin{aligned}Re&quire:初始参数\theta_{0}\Re&quire:包含m个样本的训练集\&while\ 没有达到停止准则\ do\&\quad计算梯度:g\leftarrow \frac{1}{m}\bigtriangledown_{\theta}\sum\limits_{i}L(f(x^{i};\theta),y^{i})\&\quad计算Hessian矩阵:H\leftarrow \frac{1}{m}\bigtriangledown_{\theta}^{2}\sum\limits_{i}L(f(x^{i};\theta),y^{i})\&\quad计算Hessian逆:H^{-1}\&\quad 计算更新:\Delta\theta=- H^{-1}g\&\quad应用更新:\theta=\theta+\Delta\theta\&end\ while\end{aligned}$

在目标函数的非凸表面上,牛顿法存在问题 如靠近鞍点处牛顿法会导致朝错误方向移动 可以通过正则化Hessian矩阵避免,常用的正则化策略是在Hessian矩阵对角线增加常数$\alpha$ 正则化更新变为$\theta^{*}=\theta_{0}-[H(f(\theta_{0}))+\alpha I]^{-1}\bigtriangledown_{\theta}f(\theta_{0})$ 当很强的负曲率存在时$\alpha$需要特别大,以至于牛顿法步长较小 牛顿法计算负担较大

共轭梯度方法CG

共轭梯度是通过迭代下降的共轭方向以避免Hessian矩阵求逆计算 CG寻求一个和先前搜索方向共轭的搜索方向,即它不会撤销该方向上的进展 若$d^{\top}{t}Hd{t-1}=0$,则两个方向$d_{t}$和$d_{t-1}$被称为共轭的 在训练迭代$t$时,下一步搜索方向$d_{t}$:$d_{t}=\bigtriangledown_{\theta}J(\theta)+\beta_{t}d_{t-1}$ $其中系数\beta_{t}大小控制应沿方向d_{t-1}加回多少到当前搜索方向上$

规避Hessian矩阵的$\beta_{t}$计算方式:

  • Fletcher-Reeves:$\beta_{t}=\frac{ \bigtriangledown_{\theta}J(\theta_{t})^{\top}\bigtriangledown_{\theta}J(\theta_{t})}{\bigtriangledown_{\theta}J(\theta_{t-1})^{\top}\bigtriangledown_{\theta}J(\theta_{t-1})}$
  • Polak-Ribiere:$\beta_{t}= \frac{(\bigtriangledown_{\theta}J(\theta_{t})-\bigtriangledown_{\theta}J(\theta_{t-1}))^{\top}\bigtriangledown_{\theta}J(\theta_{t})}{\bigtriangledown_{\theta}J(\theta_{t-1})^{\top}\bigtriangledown_{\theta}J(\theta_{t-1})}$

CG算法 $\begin{aligned}Re&quire:初始参数\theta_{0}\Re&quire:包含m个样本的训练集\&初始化\rho_{0}=0\&初始化g_{0}=0\&初始化t=1\&while\ 没有达到停止准则\ do\&\quad 初始化梯度g_{t}=0\&\quad 计算梯度:g_{t}\leftarrow \frac{1}{m}\bigtriangledown_{theta}\sum\limits_{i}L(f(x^{i};\theta),y^{i})\&\quad 计算\beta_{t}= \frac{(g_{t}-g_{t-1})^{\top}g_{t}}{g_{t-1}^{\top}g_{t-1}}(Polak-Ribiere)\&\quad非线性共轭梯度:视情况可重置\beta_{t}为0,如当t为常数k的倍数时重置\&\quad 计算搜索方向:\rho_{t}=-g_{t}+\beta_{t}\rho_{t-1}\&\quad执行线搜索寻找:\epsilon^{}=\mathop{\arg\min}\limits_{\epsilon} \frac{1}{m}\sum\limits_{i=1}^{m}L(f(x^{i};\theta_{t}+\epsilon\rho_{t}),y^{i})\&\quad应用更新:\theta_{t+1}=\theta_{t}+\epsilon^{}\rho_{t}\&\quad t\leftarrow t+1\&end\ while\end{aligned}$ 非线性共轭梯度算法包括偶尔的重置,共轭梯度算法沿未修改的梯度重启线搜索

实践中非线性共轭梯度算法训练神经网络是合理的,但在开始之前使用随机梯度下降迭代若干步来初始化效果更佳

BFGS算法

BFGS等拟牛顿法采用矩阵$M_t$近似$H^{-1}$,迭代地低秩更新精度以更好地近似$H^{-1}$ 下降方向$\rho_{t}=M_{t}g_{t}$ 参数更新$\theta_{t+1}=\theta_{t}+\epsilon^{}\rho_{t}$,$\epsilon^{}$为步长 优势:花费较少时间改进每个线搜索 缺点:消耗$O(n^{2})$的存储空间

存储受限的BFGS (L-BFGS)

优化策略与元算法

批标准化

批标准化是一个自适应的重参数化的方法,试图解决训练非常深的模型的困难

理论上,计算更新的假设是其他函数保持不变,但实践中我们同时更新所有层,可能发生意想不到的结果 在非常深的网络中,高阶的相互影响会很显著

重参数化显著减少了多层之间协调更新的问题 设$H$是需要标准化的某曾的小批量激活函数,排布为设计矩阵,每个样本的激活出现在矩阵的每一行中 标准化$H^{‘}= \frac{H-\mu}{\sigma}$ $\mu是包含每个单元均值的向量;\sigma是包含每个单元标准差的向量$

训练阶段:$\mu= \frac{1}{m}\sum\limits_{i}H_{i,:},\sigma=\sqrt{\delta+ \frac{1}{m}\sum\limits_{i}(H-\mu)_{i}^{2}}$ 其中$\delta$为防止梯度在0处未定义问题,可取$10^{-8}$ 批标准化使梯度不会再简单增加$h_{i}$的标准差或均值,标准化会归零其在梯度中的元素

在测试阶段$\mu$和$\sigma$可被替换为训练阶段收集的运行均值

标准化一个单元的均值和标准差会降低包含该单元的神经网络的表达能力,通常会将批量隐藏单元激活$H$替换为$\gamma H^{‘}+\beta$ 变量$\gamma$和$\beta$是允许新变量有任意均值和标准差的学习参数

批标准化应用于$XW+b$而非$X$

坐标下降

将一个优化问题分解成几个部分,有时可以更快地解决原问题 坐标下降:一次优化一个坐标 块坐标下降:对于某个子集的变量同时最小化

监督预训练

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

贪心算法将问题分解为多个部分,然后独立地在每个部分求解最优值;可以紧接着一个精调阶段,联合优化算法搜索全问题的最优解 使用贪心解初始化联合优化算法可以极大地加速算法,并提高寻找到解的质量

贪心监督预训练 原始版本(Bengio et al., 2007c) 扩展迁移学习版本(Yosinski et al., 2014) FitNets方法(Romero et al., 2015)

选择一族容易优化的模型比使用一个强大的优化算法更重要

延拓法

延拓法是一族通过挑选初始点使优化更容易的方法,以确保局部优化花费大部分时间在表现良好的空间

为最小化代价函数$J(\theta)$,构建新的代价函数${J^{0},…,J^{n}}$ 这些代价函数难度逐步提高,$J^{0}$最为简单,真正的代价函数驱动整个过程 这系列代价函数设计为前一个解是下一个的良好初始点

课程学习 首先学习简单的概念,然后逐步学习依赖于这些简化概念的复杂概念