神经网络中的优化算法和正则化问题

本文最后更新于:2022年7月31日 下午

本文主要参考邱锡鹏老师的nndl-book,作为笔记使用

神经网络与深度学习(第7-10讲)(更新至:第9讲 无监督学习)_哔哩哔哩_bilibili

非凸优化问题

高维空间中常常遇到的都是非凸函数

非凸优化问题中难点有:

  • 如何逃离鞍点
  • 会出现平坦最小值

鞍点

在某些维度上是最高点,另一些维度上是最低点.其一阶导数为0,二阶梯度Hessian矩阵不是半正定矩阵.

鞍点示例

平坦最小值

由于DL中的参数非常多且具有冗余,单个参数对最终的损失影响比较小,这会导致损失函数在局部最小解附近通常是一个平坦的区域

平坦最小值和尖锐最小值
  • 一个平坦最小值的邻域内,所有点对应的训练损失都比较接近
  • 大部分局部最小解是等价的
  • 局部最小解对应的训练损失有可能非常接近于全局最小解训练损失

神经网络优化算法

随机梯度下降法(SGD)

小批量随机梯度下降,每次选择k个样本计算偏导数的平均数,然后在梯度反向上更新参数

批量大小调整

不影响梯度的期望,但会影响方差.

  • batch越大,方差越小,学习率需要设置较大

  • batch越小,需要设置较小的学习率,否则模型不会收敛

  • NOTE:batch和学习率可遵守线性缩放原则

    batch变为m倍,学习率变为\(1/m\)

梯度估计修正

  • Momentum Method 动量法

    用之前累积的动量来代替真正的梯度(负梯度的加权移动平均)

    参数更新的差值为:

    \[ \Delta \theta_t =\rho \Delta \theta_{t-1}-\alpha g_t=-\alpha \sum \limits _{\tau=1}^{t} \rho^{t-\tau}g_{\tau} \]

  • Nesterov 加速梯度

  • 梯度截断

    当某个时刻梯度(的模)过大如NaN,就把梯度的模限定在某个区间,将超过区间的部分进行截断

    • 按值截断

      例如取\([a,b]\)区间的值

      \[ g_t=\max(\min(g_t,b),a) \]

    • 按模截断

      把模的最大值限定为b

      \[ g_t=\frac{b}{||g_t||}g_t \]

  • Adam算法

    使用动量法优化梯度,加上RMSprop自适应调整学习率

    先计算两个移动平均:

    \[ M_t = \beta _1M_{t-1}+(1-\beta_1)g_t \]

    \[ G_t = \beta_2G_{t-1}+(1-\beta_2)g_t \odot g_t \]

    当t=1时,\(M_1\)应该等于\(g_1\),但是在上述公式中不正确,于是加入偏差修正如下:

    \[ \hat M_t = \frac {M_t}{1-\beta_1^t} \]

    \[ \hat G_t=\frac{G_t}{1-\beta_2^t} \]

    更新参数内容:

    \[ \Delta \theta_t = - \frac{\alpha}{\sqrt {G_t+\epsilon}}\hat M_t \]

学习率调整

  • 学习率衰减

    • 阶梯衰减
    • 逆时衰减:\(\alpha_t = \alpha_0 \frac{1}{1+\beta \times t}\)
    • 指数衰减
    • 余弦衰减
  • 周期性学习率调整

    周期性学习率调整

    跳出局部最优或鞍点的情况,找到更平坦的局部最优

  • 学习率预热

    学习率预热示例
  • AdaGrad算法

    借鉴L2正则化的思想,在第t次迭代的时候,先计算每个参数梯度平方的累计值。

    \[ G_t=\sum \limits _{\tau}^{t}g_{\tau}\odot g_{\tau} \]

    参数更新的差值为:

    \[ \Delta \theta _{t} = - \frac {\alpha}{\sqrt {G_t+\epsilon}}\odot g_t \]

    其中\(\alpha\)是初始学习率,\(\epsilon\)是为保持数值稳定一个小常数(大小通常是\(e^{-7}\sim e^{-10}\)),公式内的运算都是按元素进行的操作。

    from nndl-book:

    在 AdaGrad 算法中,如果某个参数的偏导数累积比较大,其学习率相对较小;相反,如果其偏导数累积较小,其学习率相对较大.但整体是随着迭代次数的增加,学习率逐渐缩小. AdaGrad 算法的缺点是在经过一定次数的迭代依然没有找到最优点时,由于这时的学习率已经非常小,很难再继续找到最优点.

  • RMSprop算法

    避免AdaGrad算法中学习率不断单调下降导致过早衰减的问题。

    参数更新的差值和AdaGrad算法是相同的:

    \[ \Delta \theta _{t} = - \frac {\alpha}{\sqrt {G_t+\epsilon}}\odot g_t \]

    区别在于计算\(G_t\):

    \[ \begin{aligned} G_{t} &=\beta G_{t-1}+(1-\beta) \boldsymbol{g}_{t} \odot \boldsymbol{g}_{t} \\ &=(1-\beta) \sum_{\tau=1}^{t} \beta^{t-\tau} \boldsymbol{g}_{\tau} \odot \boldsymbol{g}_{\tau} \end{aligned} \]

    由于参数的学习率变化由单调衰减变成了指数加权的移动平均,既可以变大也可以变小。

  • AdaDelta算法

    参数更新的差值为:

    \[ \Delta \theta_{t}=-\frac{\sqrt{\Delta X_{t-1}^{2}+\epsilon}}{\sqrt{G_{t}+\epsilon}} \mathbf{g}_{t} \]

    其中\(G_t\)和RMSprop算法相同:

    \[ \begin{aligned} G_{t} &=\beta G_{t-1}+(1-\beta) \boldsymbol{g}_{t} \odot \boldsymbol{g}_{t} \\ &=(1-\beta) \sum_{\tau=1}^{t} \beta^{t-\tau} \boldsymbol{g}_{\tau} \odot \boldsymbol{g}_{\tau} \end{aligned} \]

    分子上:

    \[ \Delta X_{t-1}^{2}=\beta_{1} \Delta X_{t-2}^{2}+\left(1-\beta_{1}\right) \Delta \theta_{t-1} \odot \Delta \theta_{t-1} \]

    其中\(\beta _1\)是衰减率

    由于将原本的学习率修改为了带衰减率的移动平均,能够抑制住学习率的波动。

参数初始化

当使用梯度下降法优化网络参数时,参数的初始值非常重要,直接影响到网络的优化效率和泛化能力

神经网络的参数不能初始化为0,会出现对称权重问题,导致层内所有权重相同。

因此对于参数的初始化也有许多方法。

  • 预训练初始化
  • 随机初始化
    • 基于固定方差的参数初始化

      • 高斯分布初始化

        使用方差和均值的高斯分布

      • 均匀分布初始化

        采用在区间\([-r,r]\)内采用均匀分布进行初始化

    • 基于方差缩放的参数初始化

      \(M_l\)是第\(l\)层的神经元个数

      基于方差缩放的参数初始化设置
    • 正交初始化

      由于上述两种初始化对每个参数都是独立采样,依旧存在梯度消失或梯度爆炸问题。

      此处我们从最开始就构建一个L层的等宽线性网络:

      \[ \bold y= \bold W^L \bold W^{L-1} \dots \bold W^1 \bold x \]

      在反向传播中误差项\(\delta\)的反向传播公式为:\(\delta ^{l-1}=(W^l)^T\delta ^l\)

      范数保持性:指误差项在反向传播中的范数保持不变,满足\(||\delta^{l-1}||^2=||\delta^l||^2=||(W^l)^T\delta^l||^2\)

      于是在初始化就可以使用均值为0,方差为\(1/M\)的高斯分布来做初始化


      或者采用更直接的方式:直接将 \(W^l\)初始化为正交矩阵,即\(W^l(W^l)^T=I\)

      1. y地方用均值为0,方差为1的高斯分布初始化一个矩阵
      2. 将这个矩阵用奇异值分解得到两个正交矩阵,用其中之一作为权重矩阵

数据预处理

尺度不变性(Scale Invariance)

对于机器算法中的数据,在缩放部分特征或者全部特征后,不影响学习和预测。

例如:将厘米单位的特征,缩放为毫米单位。

NOTE:KNN算法的尺度不变性较差,因为其计算的欧式距离对数据要求高

不同输入特征的尺度差异较大会带来两个问题:

  1. 参数初始化困难
  2. 优化效率较低

归一化(规范化 Normalization)

  • 最小最大值规范化

    找到数据中的最小最大值,将所有数据缩放到这个范围内

  • 标准化(Z值规范化)

    对每一维数据计算均值和方差

    \[ \mu = \frac{1}{N} \sum \limits _{n=1}^Nx^n \]

    \[ \sigma ^2 = \frac{1}{N}\sum \limits _{n=1}^N (x^n-\mu)^2 \]

    然后将特征\(x^n\)进行变换:

    \[ \hat x^n = \frac{x^n-\mu}{\sigma} \]

    标准差\(\sigma\)做分母不为零的含义:

    表示这一维度的特征相同,不重要可以直接去掉

  • 白化(whitening,PCA):

    去除所有成分之间的相关性

    标准化和白化

逐层规范化

ML中的常用方法,应用到DL的目的是:

  1. 更好的尺度不变性

    解决内部协变量偏移问题,防止在深度学习中某一个层的输入分布的微小变化引起更深层中的较大偏移。

  2. 更平滑的优化地形

  • 规范化方法
    • 批量规范化(Batch Normalization)

      对于一个神经网络,第\(l\)层的净输入为\(z^l\),神经元的输出为\(a^l\),即:

      \[ a^l = f(z^l)=f(Wa^{l-1}+b) \]

      对于一个样本数为k的批量样本,计算其方差和均值:

      \[ \begin{aligned} &\boldsymbol{\mu}_{\mathcal{B}}=\frac{1}{K} \sum_{k=1}^{K} \boldsymbol{z}^{(k, l)} \\ &\boldsymbol\sigma_{\mathcal{B}}^{2}=\frac{1}{K} \sum_{k=1}^{K}\left(\boldsymbol{z}^{(k, l)}-\boldsymbol{\mu}_{\mathcal{B}}\right) \odot\left(\boldsymbol{z}^{(k, l)}-\boldsymbol{\mu}_{\mathcal{B}}\right) . \end{aligned} \]

      批量规范化:

      \[ \begin{aligned} \hat{\boldsymbol{z}}^{l} &=\frac{\boldsymbol{z}^{l}-\mu_{\mathcal{B}}}{\sqrt{\sigma_{\mathcal{B}}^{2}+\epsilon}} \odot \boldsymbol{\gamma}+\boldsymbol{\beta} \\ & \triangleq \mathrm{BN}_{\gamma, \boldsymbol{\beta}}\left(\boldsymbol{z}^{l}\right), \end{aligned} \]

      其中\(\boldsymbol{\gamma}\)是缩放参数向量,\(\boldsymbol{\beta}\)是平移参数向量,都是可学习参数。能够增强规范化的能力。

    • 层规范化(Layer Normalization)

      不看batch的内容,对一层内所有神经元进行规范化

      计算层内均值和方差:

      \[ \begin{aligned} \mu^{l} &=\frac{1}{M_{l}} \sum_{i=1}^{M_{l}} z_{i}^{l} \\ (\sigma^{l})^{2} &=\frac{1}{M_{l}} \sum_{i=1}^{M_{l}}\left(z_{i}^{l}-\mu^{l}\right)^{2} \end{aligned} \]

      层规范化:

      \[ \begin{aligned} \hat{\boldsymbol{z}}^{l} &=\frac{\boldsymbol{z}^{l}-\mu^{l}}{\sqrt{(\sigma^{(l)})^{2}+\epsilon}} \odot \boldsymbol{\gamma}+\boldsymbol\beta \\ & \triangleq \mathrm{LN}_{\boldsymbol {\gamma, \beta}}\left(\boldsymbol{z}^{l}\right) \end{aligned} \]

      BN和LN的区别
      各种规范化的对比
    • 权重规范化

    • 局部响应规范化

超参数优化

超参数

  • 层数
  • 每层神经元个数
  • 激活函数
  • 学习率(以及动态调整算法)
  • 正则化系数
  • mini-batch大小

优化方法

  • 网格搜索

    对每一个超参数取几个”经验值“,比如对于学习率\(\alpha\),可以设置

    \[ \alpha \in \{0.01,0.1,0.5,1.0\} \]

  • 随机搜索

    对超参数进行随机组合

  • 贝叶斯优化

  • 动态资源分配

  • 神经架构搜索

网络正则化

由于神经网络的拟合能力强,会将模型过度参数化,会导致模型泛化性差。为提高神经网络的泛化能力通常要加入正则化。

正则化就是所有损害优化方法的方法。通常分为两种方式:

  1. 增加优化约束:L1、L2约束
  2. 干扰优化过程:提前停止、随机梯度下降、暂退法、权重衰减。

早停法

引入验证集(Validation Dataset)测试每一次迭代的参数时候在验证集上最优,如果在验证集上错误率不再下降就停止迭代。防止过拟合。

权重衰减

限制权重取值范围。在每次参数更新时,引入一个衰减系数\(\beta\)

\[ \theta_t=(1-\beta)\theta_{t-1}-\alpha \bold g_t \]

暂退法(Dropout)

有一个神经层\(y=f(Wx+b)\),引入一个随机的掩蔽函数\(mask(x)=m\odot x\)\(m \in \{0,1\}^D\).得到神经层的输出\(y=f(Wmask(x)+b)\).

\(\ell_1\)\(\ell_2\)正则化

在原本的优化问题中加入\(\ell_1\)\(\ell_2\)范数防止过拟合

\[ \begin{aligned} &\theta^{*}=\underset{\theta}{\arg \min } \frac{1}{N} \sum_{n=1}^N \mathcal{L}\left(y^{(n)}, f\left(\boldsymbol{x}^{(n)} ; \theta\right)\right) \\ &\text { s.t. } \quad \ell_{p}(\theta) \leq 1 \end{aligned} \]

\(\ell_2\)正则化的参数更新结果为:\(\theta_t = \theta_{t-1}-\alpha(g_t+\lambda\theta_{t-1})=(1-\alpha\lambda)\theta_{t-1}-\alpha g_t\)

形式上和权重衰减的类似:\(\theta_t=(1-\beta)\theta_{t-1}-\alpha \bold g_t\)

不同范数的约束条件示例

总结

模型 优化 正则化 隐式正则化
用ReLU作为激活函数 SGD+mini-batch(动态学习率、Adam算法优先) 早停法 SGD
残差链接 每次迭代都重新随机排序 暂退法 批量规范化
逐层规范化 数据预处理(规范化) 权重衰减 \(\ell_1\)\(\ell_2\)正则化
参数初始化(预训练) 数据增强

神经网络中的优化算法和正则化问题
https://ash-one.github.io/2022/07/31/shen-jing-wang-luo-zhong-de-you-hua-suan-fa-he-zheng-ze-hua-wen-ti/
作者
灰一
发布于
2022年7月31日
许可协议