C08. 深度模型中的优化
Ch04介绍一般的数值优化问题
Ch08关注特定的数值优化问题:寻找神经网络上的一组参数 $\theta$,用于显著降低代价函数 $J(\theta)$,这个代价函数通常包括整个训练集上的性能评估和额外的正则化项。
8.1 不同数值优化问题的区别
- 机器学习的数值优化问题是间接的:最小化目标 $J$ 不是问题的目标,问题关注某些性能度量$P$,其定义于测试集上,并且可能是不可解的。因此,只能间接地优化 $P$,即通过降低代价函数 $J(\theta)$ 来提高 $P$
- 训练集上的代价函数的形式化定义:$J(\theta)=\mathbb{E}_{\text{x,y}\sim\hat{p}_\text{data}} L(f(\mathbf{x;\theta}),y)$
- $L$ 是每个样本的损失函数
- $f(\mathbf{x;\theta})$ 是输入 $\mathbf{x}$ 时所预测的输出
- $\hat{p}_\text{data}$ 是经验分布
- 在监督学习中,$y$ 是目标输出
- 原始数据集上的代价函数的形式化定义:$J^*(\theta)=\mathbb{E}_{\text{x,y}\sim p_\text{data}} L(f(\mathbf{x;\theta}),y)$
- $J^*(\theta)$ :是问题的真实目标函数
- 生成原始数据集的分布 $p_\text{data}$ 的期望
- 训练集上的代价函数的形式化定义:$J(\theta)=\mathbb{E}_{\text{x,y}\sim\hat{p}_\text{data}} L(f(\mathbf{x;\theta}),y)$
- 纯数值优化问题是直接的:即最小化目标 $J$ 就是问题的目标
8.1.1 经验风险最小化
将机器学习问题转化为优化问题的方式:最小化训练集上的期望损失。
经验风险(empirical risk):用训练集上的经验分布 $\hat{p}_\text{data}$ 代替真实分布 $p_\text{data}$。
经验风险最小化(empirical risk minimization):基于最小化这种平均训练误差的训练过程
经验风险最小化很容易导致过拟合:因为高容量的模型会记住训练集
8.1.2 现实情况下的损失函数和优化方法
代理损失函数(surrogate loss function)
- 正确类别的负对数似然函数用于 0-1 损失的替代
代理损失函数与纯优化对比
- 代理损失函数提前终止时导数可能还很大
- 纯优化终止时导数较小
8.1.3 批量算法和小批量算法
机器学习算法的目标函数可以分解为训练样本上的求和
- 最大似然估计问题可以在对数空间中分解成各个样本的总和
$$
\theta_{ML}=\arg\max_{\theta}\sum_{i=1}^m\log p_{\text{model}}(\mathbf{x}^{(i)},y^{(i)};\theta)
$$
- 使用整个训练集的优化算法被称为批量(batch)或者确定性(deterministic)梯度算法
- 每次只使用单个样本的优化算法称为随机(stochastic)或者在线(online)算法。
- 使用一个以上而不是全部训练样本的深度学习优化算法称为小批量(minibatch)或小批量随机(minibatch stochastic)算法,统称为随机(stochastic)方法。
小批量的大小设置
- 更大的批量会计算更加精确的梯度估计,但是回报是小于线性的
- 过小的批量无法充分利用多核计算架构
- 如果批量处理中的所有样本可以并行处理,那么内存消耗和批量大小成正比
- 批处理大小通常使用 2 的幂数,取值范围在 32~256 之间,对于某些大模型时可以考虑 16
- 小批量学习过程中加入的噪声可以会产生一定的正则化效果
8.2 神经网络优化中的困难
优化问题本身就是一个极其困难的任务。
- 传统的机器学习会小心设计目标函数和约束,以确保优化问题是凸的,从而避免一般优化问题的复杂度
- 深度学习肯定会遇到一般的非凸问题,即使是凸优化问题也面临以下困难
- 矩阵病态问题
- 局部极小值
- 平坦区域(高原、鞍点等等)
- 斜率悬崖结构导致的梯度爆炸问题
- 长期依赖导致的梯度消失问题
- 非精确梯度
- 局部结构与全局结构之间的弱对应
- 优化问题存在的理论限制
8.2.1 病态问题
Hessian 矩阵 $H$ 的病态问题:在随机梯度下降时会「卡」在某些情况下,此时即使很小的更新步长也会增加代价函数,因此学习率必须收缩以弥补更强的曲率。
8.2.2 局部极小值
模型可辨识性(model identifiability)问题:如果一个足够大的训练集可以唯一确定一组模型参数,那么该模型被称为可辨识的。
- 带有隐变量的模型通常是不可辨识的
- 权重空间对称性(weight space symmetry):对神经网络的任一隐藏层的 单元 $i$ 、单元 $j$ 的传入权重向量和传出权重向量交换,得到等价模型;如果神经网络有 $m$ 层,每层有 $n$ 个单元,那么会有 $n!^m$ 种排列隐藏单元的方式。这种类型的不可辨识性称为权重空间对称性。
- 带有整流线性单元的网络或者 maxout 的网络是不可辨识的
- 将传入权重和偏置扩大 $\alpha$ 倍,传出权重扩大 $\frac1\alpha$ 倍,得到等价模型
模型可辨识性问题导致:神经网络代价函数具有非常多甚至不可数无限多的局部极小值,而且这些局部极小值都有相同的代价函数值,因此这些局部极小值不是非凸带来的问题。
学者们猜想:对于足够大的神经网络,大部分局部极小值都具有很小的代价函数,因此找全局最小点不是最重要的,而是需要在参数空间中找到一个代价很小(可能不是最小)的点。
一种排除局部最小值的方法:如果梯度范数没有随着时间缩小到一个微小的值,那么得到的既不是局部极小值,也不是其他形式的临界点。
8.2.3 平坦区域(高原、鞍点)
鞍点:在鞍点处,Hessian矩阵同时具有正负特征值。位于正特征值对应的特征向量方向的点比鞍点的代价大,位于负特征值对应的特征向量方向的点比鞍点的代价小,鞍点为代价函数在某个横截面上的局部极小点,也为代价函数某个横截面上的局部极大点。
随机函数
- 低维空间中,局部极小值很常见
- 高维空间中,局部极小值很罕见,鞍点很常见
投影函数($f:\mathbb{R}^n\rightarrow\mathbb{R}$):鞍点和局部极小值的数目比率的期望随 $n$ 指数级增长
随机函数
- 具有低代价的点更可能是局部极小值
- 具有高代价的点更可能是鞍点
- 具有极高代价的点更可能是局部极大值
鞍点
- 对于只使用梯度信息的一阶优化算法,实验中梯度下降似乎可以在许多情况下逃离鞍点
- 对于牛顿法目标是寻找梯度为零的点,如果没有适当的修改,优化就会跳进鞍点,可以考虑使用无鞍牛顿法,但是对于大型网络效果不好。
8.2.4 斜率悬崖结构导致的梯度爆炸
长期时间序列会产生大量的权重相乘,几个较大的权重相乘会导致悬崖结构。
当传统的梯度下降算法更新步长过大时,Ch10.md启发式梯度截断(gradient clipping)会干涉来减小步长,从而避免越过悬崖区域。
8.2.5 长期依赖导致的梯度消失
长期依赖问题:变深的神经网络结构使模型丧失了学习到先前信息的能力,从而使优化变得极其困难。
假设某个计算图中包含一条反复与矩阵 $W$ 相乘的路径,那么 $t$ 步后相当于乘以 $W^t$,对 $W$ 进行特征值分解 $W=V\text{diag}(\lambda)V^{-1}$,得 $W^t=(V\text{diag}(\lambda)V^{-1})^t=V\text{diag}(\lambda)^t V^{-1}$,因此计算图上的梯度会因为 $\text{diag}(\lambda)^t$ 而导致梯度消失或者梯度爆炸问题。
循环网络在各个时间步上使用相同的矩阵 $W$,而前馈网络使用不同的矩阵,因此即使非常深层的前馈网络也能在很大程度上有效地避免梯度消失和梯度爆炸问题。
8.2.6 非精确梯度
大多数优化算法的先决条件是知道精确的梯度或者 Hessian 矩阵,但是当目标函数不可解时,只有使用近似梯度代替,或者使用代理损失函数来避免这个问题。
8.2.7 局部结构与全局结构之间的弱对应
许多现有研究方法在求解具有困难的全局结构的问题时,旨在寻找良好的初始点,而不是开发非局部范围更新的算法。
基本上所有的可以有效地训练神经网络的学习算法都是基于局部较小更新。
8.2.8 传统的优化理论的限制
为神经网络设计的优化算法都有性能限制,因此研究优化算法现实的性能上界是重要目标。
- 大多数神经网络单元输出光滑的连续值,使得局部搜索求解优化可行
- 理论结果表明某些问题是不可解的,但是无法判断哪个问题是不可解的
- 寻找给定规模的网络的一个可行解是困难的,但是使用更大的网络可以找到可接受的解
- 在神经网络训练中,不关注某个函数的精确极小点,只关注将其值下降到足够小以获得一个良好的泛化误差,但是对优化算法进行理论分析判断是否能够实现目标也是困难的
8.3 基本算法
8.3.1 随机梯度下降(Stochastic Gradient Descent, SGD)
在机器学习和深度学习中,SGD是应用最多的优化算法。按照数据生成分布抽取 $m$ 个小批量(i.i.d.)样本,通过计算它们的梯度均值,得到梯度的无偏估计。
- 每一步更新的计算时间不依赖训练样本数目的多寡,即使训练样本数目极大时,也能收敛。
- 泛化误差的下降速度不会快于 $O(\frac1k)$,更快的收敛可能对应着过拟合
- 对于大数据集,只需要非常少量样本计算梯度就能实现初始快速更新,远超其缓慢的渐近收敛
算法描述:
- 学习率($\epsilon$),选择方法是监测目标函数值随时间变化的学习曲线,通过试验和误差来选取。
- 初始参数($\theta$)
- 梯度估计:$\hat{g}\leftarrow+\frac1m\nabla_{\theta}\sum_iL(f(x^{(i)};\theta),y^{(i)})$
- 应用更新:$\theta\leftarrow\theta-\epsilon\hat{g}$
8.3.2 动量
动量算法可以加速随机梯度下降的学习过程,特别是处理高曲率线段、梯度一致并且很小的线段或是梯度带噪声的线段。
动量算法积累了之前梯度指数级衰减的移动平均,并且继续沿着这个方向移动。
动量算法引入了变量 $v$ 作为速度,表示参数在参数空间移动的方向和速率。速度被设为负梯度的指数衰减平均。
算法描述:
- 学习率($\epsilon$);动量参数($\alpha$)
- 初始参数($\theta$);初始速度($v$)
- 梯度估计:$g\leftarrow\frac1m\nabla_{\theta}\sum_i L(f(x^{(i)};\theta),y^{(i)})$
- 速度更新:$v\leftarrow\alpha v-\epsilon g$
- 应用更新:$\theta\leftarrow\theta+v$
8.3.3 Nesterov 动量
受 Nesterov 加速梯度算法的启发,Sutskever 提出了动量算法的变种。
算法描述:
- 学习率($\epsilon$);动量参数($\alpha$)
- 初始参数($\theta$);初始速度($v$)
- 应用临时更新:$\tilde{\theta}\leftarrow\theta+\alpha v$
- 梯度估计:$g\leftarrow\frac1m\nabla_{\tilde{\theta}}\sum_i L(f(x^{(i)};\tilde{\theta}),y^{(i)})$
- Nesterov 动量为标准动量方法中添加了一个校正因子。
- 将额外误差收敛率从 $O(1/k)$( $k$ 步后)改进到 $O(1/k^2)$
- 在随机梯度下,Nesterov 动量没有改进收敛率。
- 速度更新:$v\leftarrow\alpha v-\epsilon g$
- 应用更新:$\theta\leftarrow\theta+v$
8.4 参数初始化策略
初始参数需要在不同单元间「破坏对称性」。如果具有相同激活函数的两个隐藏单元连接到相同的输入,那么这些单元必须具有不同的初始参数。如果具有相同的初始参数,然后应用到确定性损失和模型的确定性学习算法将一直以相同的方式更新这两个单元。即使模型或者训练算法能够使用随机性为不同的单元计算不同的更新,因此初始化每个单元使其和其他单元计算不同的函数效果最好。可能有助于确保没有输入模式丢失在前向传播的零空间中,没有梯度模式丢失在反向传播的零空间中。每个单元计算不同函数的目标促使了参数的随机初始化。
更大的初始权重具有更强的破坏对称性的作用,有助于避免冗余的单元,也有助于避免在每层线性成分的前向或者反向传播中丢失信号——矩阵中更大的值在矩阵乘法中有更大的输出。如果初始权重过大,会在前向传播或者反向传播中产生爆炸的值。在循环网络中,很大的权重可能会导致混沌(chaos)(即对输入中很小的扰动也非常敏感,导致确定性前向传播过程中表现随机)。很大的权重也会使激活函数输出值饱和的值,导致饱和单元的梯度消失。
初始化网络的观点
- 优化建议权重应该足够大以成功传播信息
- 正则化建议权重应该小一点,最好初始参数与最终参数距离接近
启发式方法可以用于选择权重的初始大小。
- 标准初始化:$W_{i,j}\sim U(-\sqrt{\frac6{m+n}},\sqrt{\frac6{m+n}})$ ,$m$ 个输入,$n$ 个输出,用于初始化所有的层,在具有相同的激活方差和相同的梯度方差之间进行折衷。
- 初始化为随机正交矩阵,启发于不含非线性的矩阵相乘序列的深度网络,保证了达到收敛所需要的训练迭代总数独立于深度。
权重初始化的最佳准则不能带来最佳效果的原因:
- 可能准则有误,并未保持整个网络信号的范数
- 初始化强加的性质未能在学习中保持
- 初始化提高了优化速度,但是增加了泛化误差
数值范围准则的缺点:设置所有的初始权重具有了相同的标准差$\frac1{\sqrt{m}}$,当层中单元数很多时每个单一权重会变得很小。
稀疏初始化:每个单元初始化为恰好有 $k$ 个非零权重,从而保持这个单元输入的总数量独立于输入数目 $m$,有助于实现单元之间在初始化时更加具有多样性,但是获得较大取值的权重也被强加了先验,使得错误单元权重的优化时间加长。
如果计算资源允许,将每层权重的初始数值范围设为超参数。
设置偏置的方法与设置权重的方法必须相互协调
- 如果偏置作为输出单元,那么初始化偏置以获取正确的边缘统计是有益的
- 通过选择偏置可以避免初始化引起的太大的饱和
- 利用偏置初始化控制其他单元能够参与到等式中
使用机器学习初始化模型参数,使用相同的输入数据集,使用无监督模型训练出来的参数来初始化监督模型
8.5 自适应学习率算法
8.5.1 AdaGrad
独立地适应所有模型参数的学习率,缩放每个参数反比于其所有梯度历史平方值总和的平方根。损失函数中参数的偏导的大小对应学习率的大小,从而参数空间中平缓的方向也有合适的步长。
凸优化问题中,算法具有良好的理论性质,但是实际应用中因为从训练开始时积累梯度平方会导致有效学习率过早和过快地减小。
算法描述:
- 全局学习率:$\epsilon$
- 初始参数:$\theta$
- 小常数:$\delta=10^{-7}$
- 计算梯度:$g\leftarrow\frac1m\nabla_{\theta}\sum_i L(f(x^{(i)};\theta),y^{(i)})$
- 累积平方梯度:$r\leftarrow r+g\odot g$
- 计算更新:$\Delta\theta\leftarrow\frac{\epsilon}{\delta+\sqrt{r}}\odot g$(逐元素地应用除和求平方根)
- 应用更新:$\theta\leftarrow\theta+\Delta\theta$
8.5.2 RMSProp
RMSProp 是深度学习经常采用的优化方法之一。
算法在非凸问题中也能应用,改变梯度积累为指数加权的移动平均。
- AdaGrad 根据平方梯度的整个历史收缩学习率,可能使得学习率在达到凸结构时就变得太小
- RMSProp 使用指数衰减平均,从而丢弃遥远过去的历史,使得学习率在达到凸结构前不会变得过小
算法描述:
- 全局学习率:$\epsilon$,衰减速度:$\rho$
- 初始参数:$\theta$
- 小常数:$\delta=10^{-6}$
- 计算梯度:$g\leftarrow\frac1m\nabla_{\theta}\sum_i L(f(x^{(i)};\theta),y^{(i)})$
- 累积平方梯度:$r\leftarrow\rho r+(1-\rho)g\odot g$
- 计算更新:$\Delta\theta\leftarrow\frac{\epsilon}{\sqrt{\delta+r}}\odot g$(逐元素地应用除和求平方根)
- 应用更新:$\theta\leftarrow\theta+\Delta\theta$
使用 Nesterov 动量的 RMSProp 算法描述:
- 全局学习率:$\epsilon$,衰减速度:$\rho$;动量系数:$\alpha$
- 初始参数:$\theta$;初始参数:$v$
- 小常数:$\delta=10^{-6}$
- 计算临时更新:$\tilde{\theta}\leftarrow\theta+\alpha v$
- 计算梯度:$g\leftarrow\frac1m\nabla_{\tilde{\theta}}\sum_i L(f(x^{(i)};\tilde{\theta}),y^{(i)})$
- 累积平方梯度:$r\leftarrow\rho r+(1-\rho)g\odot g$
- 计算速度更新:$v\leftarrow\alpha v-\frac{\epsilon}{\sqrt{r}}\odot g$(逐元素地应用除和求平方根)
- 应用更新:$\theta\leftarrow\theta+v$
8.5.3 Adam
在Adam中,动量直接并入了梯度一阶矩(指数加权)估计;
在Adam中,加入了偏置修正,用于修正从原点初始化的一阶(动量项)和(非中心的)二阶矩的估计;
在Adam中,超参数的选择非常鲁棒。
算法描述:
- 步长:$\epsilon=0.001$
- 矩估计的指数衰减速率:$\rho_1=0.9,\rho_2=0.999$
- 小常数:$\delta=10^{-8}$
- 计算梯度:$g\leftarrow\frac1m\nabla_{\theta}\sum_i L(f(x^{(i)};\theta),y^{(i)})$
- 更新有偏一阶矩估计:$s\leftarrow\rho_1 s+(1-\rho_1)g$
- 更新有偏二阶矩估计:$r\leftarrow\rho_2 r+(1-\rho_2)g\odot g$
- 修正一阶矩的偏差:$\hat{s}\leftarrow\frac{s}{1-\rho_1^t}$
- 修正二阶矩的偏差:$\hat{r}\leftarrow\frac{r}{1-\rho_2^t}$
- 计算更新:$\Delta\theta\leftarrow-\epsilon\frac{\hat{s}}{\sqrt{\hat{r}}+\delta}$(逐元素地应用除和求平方根)
- 应用更新:$\theta\leftarrow\theta+\Delta\theta$
8.5.4 选择正确的优化算法
以上介绍的五种学习算法都在使用,选择取决于使用者对算法的熟悉程度。