1 基础知识
1.1 反向传播
1.1.1 梯度计算
第\(l\)层隐藏层计算过程如下:
则求偏导有以下结果:
因此,可知参数的反向传播梯度如下:
1.1.2 梯度下降法
按下面的迭代公式来计算训练集\(D\)上风险函数的最小值:
1.1.3 梯度下降的若干变形
批量梯度下降(BGD):每次迭代时需要计算每个样本上损失函数的梯度并求和。当训练集中的样本数 量\(N\)很大时,空间复杂度比较高,每次迭代的计算开销也很大。
随机梯度下降(SGD):每次迭代时只采集一个样本,计算这个样本损失函数的梯度并更新参数。当经过足够次数的迭代时,随机梯度下降也可以收敛到局部最优解。
- 随机梯度下降相当于在批量梯度下降的梯度上引入了随机噪声
- 在非凸优化问题中,随机梯度下降更容易逃离局部最优点
小批量梯度下降法(Mini-Batch GD):批量梯度下降和随机梯度下降的折中。每次迭代时,我们随机选取一小部分训练样本来计算梯度并更新参数,这样既可以兼顾随机梯度下降法的优点,也可以提高训练效率。
1.2 优化算法
1.2.1 学习率调整
学习率衰减:也称学习率退火。学习率在一开始要保持大些来保证收敛速度,在收敛到最优点附近时要小些以避免来回振荡。常见衰减方法如下:
- 分段常数衰减
- 逆时衰减:\(\alpha_t=\alpha_0\cdot\frac{1}{1+\beta\cdot t}\)
- 指数衰减/自然指数衰减:\(\alpha_t=\alpha_0\cdot\beta^t\)
- 余弦衰减:\(\alpha_t=\frac{1}{2}\alpha_0\cdot\left(1+\cos\frac{t\pi}{T}\right)\)
学习率预热:在刚开始训练时,由于参数是随机初始化的,梯度往往也比较大,再加上比较大的初始学习率,会使得训练不稳定。可以在最初几轮迭代时,采用比较小的学习率,等梯度下降到一定程度后再恢复到初始的学习率。
周期性学习率调整:为了使得梯度下降法能够逃离鞍点或尖锐最小值,一种经验性的方式是在训练过程中周期性地增大学习率。周期性地增大学习率虽然可能短期内损害优化过程,使得网络收敛的稳定性变差,但从长期来看有助于找到更好的局部最优解。
- 循环学习率,常见三角循环学习率
- 带热重启的随机梯度下降,常见带热重启的余弦衰减
AdaGrad:借鉴L2正则化的思想,每次迭代时自适应地调整每个参数的学习率。
- 如果某个参数的偏导数累积比较大,其学习率相对较小;相反,如果其偏导数累积较小,其学习率相对较大。但整体是随着迭代次数的增加,学习率逐渐缩小
- 缺点是在经过一定次数的迭代依然没有找到最优点时,由于这时的学习率已经非常小,很难再继续找到最优点
RMSprop:可以在有些情况下避免 AdaGrad 算法中学习率不断单调下降以至于过早衰减的缺点。RMSProp算法和AdaGrad算法的区别在于\(G_t\)的计算由累积方式变成了指数衰减移动平均。在迭代过程中,每个参数的学习率并不是呈衰减趋势,既可以变小也可以变大。
AdaDelta:和RMSprop算法类似,AdaDelta算法通过梯度平方的指数衰减移动平均来调整学习率。此外,AdaDelta算法还引入了每次参数更新差值\(\Delta\theta\)的平方的指数衰减权移动平均。
1.2.2 梯度估计修正
随机梯度下降方法中每次迭代的梯度估计和整个训练集上的最优梯度并不一致,具有一定的随机性。一种有效地缓解梯度估计随机性的方式是通过使用最近一段时间内的平均梯度来代替当前时刻的随机梯度来作为参数更新的方向,从而提高优化速度。
动量法:用之前积累动量来替代真正的梯度.每次迭代的梯度可以看作加速度。\(\rho\)为动量因子,则:
Nesterov动量法:在动量法中,参数更新可分为两步:(1) \(\hat{\theta}-\theta_{t-1}+\rho\Delta\theta_{t-1}\),(2) \(\theta_t=\hat{\theta}-\alpha\boldsymbol{g}_t\) ,但是第二步不合理,更新方向应为\(\hat{\theta}\)上的梯度。因此Nesterov动量法的改进如下:
Adam:可以看作动量法与RMSprop的结合,不但使用动量作为参数更新方向,而且可以自适应调整学习率。Adam既计算梯度平方的指数加权平均\(G_t\)(类似RMSprop),也计算梯度的指数加权平均\(M_t\)(类似动量法)。可以把\(M_t\)和\(G_t\)分别看作梯度的均值(一阶矩)和未减去均值的方差(二阶矩)。
假设\(M_0=0\),\(G_0=0\),那么在迭代初期\(M_t\)和\(G_t\)的值会比真实的均值和方差要小。特别是当\(\beta_1\)和\(\beta_2\)都接近于1时,偏差会很大。因此,需要对偏差进行修正。
Adam算法的参数更新差值为:
梯度截断:在基于梯度下降的优化过程中,如果梯度突然增大,用大的梯度更新参数反而会导致其远离最优点。梯度截断是一种比较简单的启发式方法,把梯度的模限定在一个区间。一般截断的方式有以下几种:
- 按值截断:\(\boldsymbol{g}_t=\max(\min(\boldsymbol{g}_t,b),a)\)。
- 按模截断:若\(\|\boldsymbol{g}_t\|>b\),则\(\boldsymbol{g}_t=\frac{b}{\|\boldsymbol{g}_t\|}\boldsymbol{g}_t\)
1.3 参数初始化
基于固定方差:关键在于如何设置方差\(\sigma^2\),太小会导致神经元输出过小,经过多层之后信号慢慢消失,并且还会使sigmoid激活函数失去非线性能力;太大会导致sigmoid激活函数的梯度消失。基于固定方差的初始化通常结合Layer Norm使用。
- 高斯分布初始化:\(N(0,\sigma^2)\)
- 均匀分布初始化:\([-r, r]\),其中\(r=\sqrt{3\sigma^2}\)
基于方差缩放:根据神经元的性质进行差异化设置。如果神经元输入很多,则每个连接上的权重应小些,避免输出过大或过饱和。对于深度网络,为了缓解梯度消失和梯度爆炸,需要尽可能保持神经元输入和输出方差的一致,根据神经元连接数量自适应调整初始化的方差,即方差缩放。
-
Xavier初始化:假设激活函数为恒等函数,则有\(\text{Var}(a^{(l)})=\text{Var}(\sum_{i=1}^{M_{l-1}}w_i^{(l)}a_i^{(l-1)})\\=\sum_{i=1}^{M_{l-1}}\text{Var}(w_i^{(l)})\text{Var}(a_i^{(l-1)})\\=M_{l-1}\text{Var}(w_i^{(l)})\text{Var}(a_i^{(l-1)})\\\)。为了保证前向和后向的方差都不被过分放大或缩小,因此折中后设置参数的方差为\(\text{Var}(w_i^{(l)})=\frac{2}{M_l+M_{l-1}}\)。对于tanh和sigmoid等激活函数,通常需要乘以缩放因子\(\rho\)
-
He初始化/Kaiming初始化:当第\(l\)层神经元使用ReLU激活函数时,通常有一半的神经元输出为0,因此其分布的方差也近似为使用恒等函数时的一半。只考虑前向传播时,参数的理想方差为\(\text{Var}(w_i^{(l)})=\frac{2}{M_{l-1}}\)。
正交初始化:为了避免梯度消失或梯度爆炸,希望误差项在反向传播中具有范数保持性,即\(\|\delta^{(l-1)}\|^2=\|(\boldsymbol{W}^{(l)})^\top\delta^{(l)}\|^2=\|\delta^{(l)}\|^2\)。正交初始化可能保证这一性质,通常由两步实现:(1) 用\(N(0,1)\)初始化矩阵,(2) 对矩阵进行奇异值分解得到两个正交矩阵,并使用其中一个作为参数矩阵。使用非线性激活函数时,可乘以缩放因子\(\rho\)
1.4 正则化
正则化是一类通过限制模型复杂度,从而避免过拟合,提高泛化能力的方法。
L1、L2正则化:带正则化的优化问题等价于带约束条件的优化问题\(\theta^*=\arg\min\frac{1}{N}\sum_{i=1}^N L(y^{(n)},\hat{y}^{(n)}) \ \text{s.t.} \ L_p(\theta)\leq C\),其中L1范数在零点不可导,通常近似为\(L_1(\theta)=\sum_{i=1}^D\sqrt{\theta_d^2+\varepsilon}\)
- L1正则化的约束通常使得最优解位于坐标轴上,能够增加参数的稀疏性,因此也能起到特征选择的作用
- L2正则化虽然不会导致参数的稀疏性,但也能缓解过拟合,因为参数总体较小,对数据偏移敏感度较弱,具有较强的抗扰动能力
- 从先验分布的角度,L1正则化假设参数服从拉普拉斯分布,L2正则化假设参数服从高斯分布
权重衰减:\(\theta_t\leftarrow(1-\beta)\theta_{t-1}-\alpha\boldsymbol{g}_t\),L2正则化是实现权重衰减的一种形式,但在较复杂的优化方法中二者不等价。
提前停止:当验证集上的错误率不再下降就停止迭代。
Dropout:设定一个固定概率\(p\),对于一层神经元有\(\boldsymbol{y}=f(\boldsymbol{W}\cdot \text{mask}(\boldsymbol{x})+\boldsymbol{b})\)
- 训练阶段:\(\text{mask}(\boldsymbol{x})=\boldsymbol{m}\odot\boldsymbol{x}\),其中\(\boldsymbol{m}\in\{0,1\}^D\)以服从\(p\)的伯努利分布随机生成
- 测试阶段:\(\text{mask}(\boldsymbol{x})=p\cdot\boldsymbol{x}\)
- 从集成学习的角度:Dropout相当于从原始网络中采样获得许多子网络,每次迭代相当于训练不同的子网络,并且这些子网络共享参数,因此可以近似看作集成指数级子网络的组合模型
- 从贝叶斯学习的角度:Dropout相当于假设参数\(\theta\)服从先验分布\(q(\theta)\),然后对参数进行多次采样进行训练
- RNN上的Dropout:随机丢弃会损害RNN在时间维度上的记忆能力,因此需要对所有时刻使用相同的丢弃掩码,即变分丢弃
数据增强:主要针对图像,包括旋转、翻转、缩放、平移、加噪等
标签平滑:简单的方法是使用软目标\([\frac{\varepsilon}{K-1}\cdots 1-\varepsilon\cdots \frac{\varepsilon}{K-1}]\)代替硬目标\([0\cdots 1 \cdots 0]\)。另一种方式包括知识蒸馏,即预先训练一个更复杂的教师网络,然后使用教师网络的输出作为软目标来训练学生网络。
1.5 归一化
逐层归一化是对神经网络中隐藏层的输入进行归一化,从而使得网络更容易训练。逐层归一化能提高训练效率的原因主要包括:
- 更好的尺度不变性:由于存在内部协变量偏移(每次参数更新都会导致隐藏层输入分布发生变化,越高的层变化越明显),因此逐层归一化能使输入分布保持稳定
- 更平滑的优化地形:逐层归一化能使大部分神经元的输入处于不饱和区域,缓解梯度消失问题。另外,也能够使神经网络的优化地形更加平滑,使得梯度更稳定,允许使用更大的学习率来加速收敛
1.5.1 BatchNorm
计算原理:
- 前向传播过程:
- 计算均值与方差:对应计算\(\mu_B\)和\(\sigma^2_B\)
- 标准化:对应计算\(\hat{x}_i\),将输入的每一维特征转化为均值为0方差为1的正态分布
- 缩放平移:对应计算\(y_i\),其中\(\gamma\)和\(\beta\)均为可学习的参数。缩放平移赋予了BN的还原能力,若\(\gamma=1\)且\(\beta=0\)则为完全还原。
- 反向传播过程:
- 训练阶段:
- 初始化:参数矩阵使用Xavier初始化,偏置项可忽略(因为BN层可实现缩放平移),\(\gamma=1\),\(\beta=0\)
- 均值与方差的计算:指数移动平均法\(x_\text{EMA}=x_\text{EMA}\cdot \rho+(1-\rho)\cdot x_\text{B}\)
- 在CNN中,假设mini-batch样本维度为\(N\times C \times H\times W\),则BN在\((N,H,W)\)上进行操作
- 测试阶段:\(y=\frac{x-\mu_B}{\sqrt{\sigma^2_B+\varepsilon}}\cdot \gamma+\beta\)
主要作用:
- 使隐藏层输入分布更稳定,缓解内部协变量偏移
- 使神经元的输入处于梯度不饱和区域,缓解梯度消失
- 一定的正则化作用
- 在训练时,神经网络对一个样本的预测不仅和该样本自身相关,也和同一批次中的其他样本相关
- 由于在选取批次时具有随机性,相当于引入了随机噪声,因此使得神经网络不会“过拟合”到某个特定样本,从而提高网络的泛化能力
局限性/缺点:
- batch_size较小时,均值和方差的估计不准确,此时效果较差
- BN主要应用于MLP和CNN类网络,不适用于RNN
1.5.2 LayerNorm
计算原理:
- 前向传播过程:
- 计算隐藏层输入的均值和方差
- 缩放平移
- RNN中的LN:\(\boldsymbol{h}_t=f(\text{LN}_{\gamma,\beta}(\boldsymbol{U}\boldsymbol{h}_{t-1}+\boldsymbol{W}\boldsymbol{x}_t))\)
局限性/缺点:
- 不依赖于batch_size和序列长度,因此可以适用于RNN
- 在CNN上的效果不如BN
1.5.3 InstanceNorm
1.5.4 WeightNorm
1.6 凸优化
根据输入变量\(X\)的值域是否为实数域,数学优化问题可以分为离散优化问题和连续优化问题。
- 离散优化问题主要有两个分支:组合优化(从一个有限集合中找出使得目标函数最优的元素)、整数规划(常见的整数规划问题通常为整数线性规划)
- 连续优化问题是目标函数的输入变量为连续变量,即目标函数为实函数
在连续优化问题中,根据是否有变量的约束条件,可以将优化问题分为无约束优化问题和约束优化问题。
- 无约束优化问题的可行域为实数域,则无约束优化问题可写为\(\min_{\boldsymbol{x}} f(\boldsymbol{x})\),其中\(\boldsymbol{x}\in \mathbb{R}^D, \ f:\mathbb{R}^D\to \mathbb{R}\)
- 约束优化问题中变量需要满足一些等式或不等式的约束。约束优化问题通常使用拉格朗日乘数法来进行求解。
如果目标函数和所有的约束函数都为线性函数,则为线性规划问题,否则为非线性规划问题。在非线性优化问题中,有一类比较特殊的问题是凸优化问题,其中需要满足:(1)目标函数为凸函数;(2)不等式约束函数为凸函数;((3)等式约束函数为非线性函数)。
1.6.1 全局最小解与局部最小解
求局部最小解一般是比较容易的,但很难保证其为全局最小解。对于线性规划或凸优化问题,局部最小解就是全局最小解。
要确认一个点\(\boldsymbol{x}^*\)是否为局部最小解,如果函数\(f(\boldsymbol{x})\)是二次连续可微的,我们可以通过检查目标函数在点\(\boldsymbol{x}^*\)的梯度\(\nabla f(\boldsymbol{x}^*)\)和Hessian矩阵\(\nabla^2 f(\boldsymbol{x}^*)\)来判断。
- 局部最小解的一阶必要条件:\(\nabla f(\boldsymbol{x}^*)=0\)
- 局部最小解的二阶必要条件:\(\nabla f(\boldsymbol{x}^*)=0\),且\(\nabla^2 f(\boldsymbol{x}^*)\)为半正定矩阵
1.6.2 梯度下降法
梯度下降法也称最速下降法,经常用来求解无约束优化的最小值问题。如果\(f(\boldsymbol{x})\)在\(\boldsymbol{x}_t\)附近连续可微,则\(f(\boldsymbol{x})\)下降最快的方向是\(\boldsymbol{x}_t\)处梯度的反方向。梯度下降法为一阶收敛算法,如果目标函数为二阶连续可微,则可使用牛顿法(一种二阶收敛算法),收敛速度更快,但是每次迭代需要计算Hessian矩阵,复杂度较高。
1.6.3 拉格朗日乘数法与KKT条件
约束优化问题的形式化表示:
则\(\boldsymbol{x}\)的可行域为\(D=\text{dom}(f)\cap\bigcap_{m=1}^M\text{dom}(h_m)\cap\bigcap_{n=1}^N\text{dom}(g_n)\subseteq \mathbb{R}^D\)。
等式约束优化问题:若只有等式约束,则可构造拉格朗日函数\(\Lambda(\boldsymbol{x},\lambda)=f(\boldsymbol{x})+\sum_{m=1}^M \lambda_m h_m(\boldsymbol{x})\),其中\(\lambda\)为拉格朗日乘数(可正可负)。如果\(f(\boldsymbol{x}^*)\)为原问题的局部最小值,则存在\(\lambda^*\)使\((\boldsymbol{x}^*,\lambda^*)\)为\(\Lambda\)的驻点,因此令\(\frac{\partial \Lambda}{\partial \boldsymbol{x}}=0\)和\(\frac{\partial \Lambda}{\partial \lambda}=0\),则有:
拉格朗日乘数法是将一个有\(D\)个变量和\(M\)个等式约束条件的最优化问题转换为一个有\(D+M\)个变量的函数求驻点的问题。拉格朗日乘数法所得的驻点会包含原问题的所有最小解,但并不保证每个驻点都是原问题的最小解,因此需要进行验证。
不等式约束优化问题:对于一般约束优化问题,其拉格朗日函数为\(\Lambda(\boldsymbol{x},\boldsymbol{a},\boldsymbol{b})=f(\boldsymbol{x})+\sum_{m=1}^M a_m h_m(\boldsymbol{x})+\sum_{n=1}^N b_n g_n(\boldsymbol{x})\),其中\(\boldsymbol{a}\)和\(\boldsymbol{b}\)分别为等式、不等式约束的拉格朗日乘数。
令\(\theta_P(\boldsymbol{x})=\max_{\boldsymbol{a},\boldsymbol{b}; \ \boldsymbol{b}\geq 0}\Lambda(\boldsymbol{x},\boldsymbol{a},\boldsymbol{b})\)考虑以下情况:
- 当约束条件不满足时,有\(\max_{\boldsymbol{a},\boldsymbol{b}}\Lambda(\boldsymbol{x},\boldsymbol{a},\boldsymbol{b})=\infty\)
- 当约束条件满足,且\(\boldsymbol{b}\geq 0\)时,有\(\max_{\boldsymbol{a},\boldsymbol{b}}\Lambda(\boldsymbol{x},\boldsymbol{a},\boldsymbol{b})=f(\boldsymbol{x})\)
因此原始约束优化问题等价于以下min-max优化问题(主问题):
然而这个min-max问题并不好求解。
定义\(\theta_D(\boldsymbol{a},\boldsymbol{b})=\min_{\boldsymbol{x}}\Lambda(\boldsymbol{x}, \boldsymbol{a},\boldsymbol{b})\),因此可定义原问题的对偶问题:
由于以下关系的存在:
易得:
至此成功将原始问题转化为对偶问题,但是二者并不等同。若\(d^*\leq p^*\),则称为弱对偶性;若\(d^*=p^*\),则称为强对偶性。
当强对偶性成立时,令\((\boldsymbol{x}^*,\boldsymbol{a}^*,\boldsymbol{b}^*)\)为原问题和对偶问题的最优解,则满足以下条件:
这5个条件称为不等式约束优化问题的KKT条件,KKT条件是拉格朗日乘数法在不等式约束优化问题上的泛化。当原问题是凸优化问题时,满足KKT条件的解也是原问题和对偶问题的最优解。
在KKT条件中,\(b_n^*\cdot g_n(\boldsymbol{x}^*)=0\)为互补松弛条件,互补松弛条件说明当最优解出现在不等式约束的内部,则约束失效。
- 若最优解\(x^*\)出现在不等式约束边界\(g_n(\boldsymbol{x})=0\),则\(b_n^*>0\)
- 若最优解\(x^*\)出现在不等式约束内部\(g_n(\boldsymbol{x})<0\),则\(b_n^*=0\)
1.7 激活函数
Sigmoid函数:将实数域的输入压缩到\((0,1)\)
- 当输入值在0附近时,近似为线性函数
- 连续可导,数学性质较好
- 输出可看作概率分布,能够与统计学习模型结合
- 可以看作软性门,控制其它神经元输出信息的数量
Softmax函数:argmax的平滑近似
Tanh函数:可以看作放大并平移的Sigmoid函数,将实数域的输入压缩到\((-1,1)\)
- 当输入值在0附近时,近似为线性函数
- 输出是零中心化的,不会产生偏置偏移,避免收敛速度变慢
ReLU函数:修正线性单元,实际上是一个斜坡函数
- 计算高效
- 具有生物学合理性(单侧抑制、宽兴奋边界),可以导致良好的稀疏性
- 左饱和函数,缓解梯度消失
- 非零中心化,可能产生偏置偏移
- 存在神经元死亡问题
Leaky ReLU函数:
ELU函数:
Softplus函数:ReLU函数的平滑版本,其导数刚好是Sigmoid函数
- 虽然也具有单侧抑制、宽兴奋边界的特性,但没有稀疏激活性
GELU函数:
Maxout函数:
1.8 损失函数
绝对值误差MAE:误差的绝对值的平均值
- 对异常值不敏感
均方误差MSE:一般应用于回归任务,不适用于分类任务
- 对异常值敏感
- 曲线光滑,收敛速度较快
- MSE+Sigmoid函数可能导致输出层神经元学习缓慢
交叉熵损失:也称负对数似然函数,一般用于分类任务。对于两个概率分布,可以使用交叉熵来衡量分布之间的差异。
Hinge损失:通常用于SVM的分类问题。对于二分类问题,\(y\)取值为\(\pm 1\),\(\hat{y}\in \mathbb{R}\)。
Huber损失:均衡MAE与MSE