网络优化与正则化笔记
本文最后更新于:几秒前
网络优化
网络优化的难点
结构差异大
- 没有通用的优化算法
- 超参数多
非凸优化问题
鞍点:梯度为0的点,在不同维度的性质不同,如下图,在不同的维度里分别是局部最高点和局部最低点
平坦最小值:邻域内的值都接近于局部最小值,所有点对应的训练损失都比较接近。大部分的局部最小解都是平坦最小值,而局部最小解对应的训练损失都可能非常接近于全局最小解对应的训练损失。
网络优化的改善方法
更有效的优化算法来提高优化方法的效率和稳定性
- 动态学习率调整
- 梯度估计修正
更好的参数初始化方法、数据预处理方法来提高优化效率
修改网络结构来得到更好的优化地形
- ReLU激活函数
- 残差连接
- 逐层归一化
使用更好的超参数优化方法
优化算法本身的改进
小批量随机梯度下降(MiniBatch)
选取$K$个训练样本$\lbrace x^ { (k)},y^ { (k) } \rbrace_{ k=1} ^ K$,计算偏导数
$$
g_t(\theta) = {1 \over K} \sum_{(\pmb x,\pmb y) \in \mathcal S_t} { {\partial \mathcal L(\pmb y,f(\pmb x;\theta))} \over \partial \theta}
$$
定义梯度为前一个阶段参数$\theta_{t-1}$的函数
$$
g_t = g_t(\theta_{t-1})
$$
更新参数为梯度的反方向,其中$\alpha>0$为网络的学习率
$$
\theta_t = \theta_{t-1}-\alpha g_t
$$
影响Minibatch的因素有很多,但关键在于批量大小、梯度和学习率三个参数因素。
批量大小
批量大小不影响随机梯度的期望,但会影响随机梯度的方向。批量越大,随机梯度的方差越小,引入的噪声相对越少,训练也会越稳定,就可以采用更高的学习率来提高学习效率;反之若批量越小,则需要设置小学习率防止不收敛。
按batch更新一次为单位,批量越大,学习率越高,其效果和效率也越好;按整个训练集迭代一遍为单位,批量越小,学习率越低,走的步次越多,其学习的准确度越高。
$$
1回合(Epoch) = ({训练样本的数量N\over 批量大小K}) \times 迭代(Iteration)
$$
学习率
学习率衰减
越到学习的中后期,其学习的步长理应越小,以接近最优点,防止过拟合情况出现,因此学习率衰减技巧十分重要。
逆时衰减:按照迭代次数衰减
$$
\alpha_t = \alpha_0 {1 \over {1+\beta \times t}}
$$
指数衰减:按照衰减系数对于迭代次数的指数衰减
$$
\alpha_t = \alpha_0 \beta^t ,\ \ \beta<1
$$
自然指数衰减:$\alpha_t = \alpha_0·exp(-\beta \times t)$
余弦衰减:采用余弦函数中(0,1)段的递减性衰减
$$
\alpha_t = {1\over 2}\alpha_0(1+cos({t\pi \over T}))
$$
几个方法的比较:
周期学习率
周期学习率旨在体现整体衰减但部分跳跃的学习率,可以帮助跳出局部最优,收敛于更为平坦的局部解。
三角循环学习率:假设每个循环周期的长度相等都为$2\triangle𝑇$,其中前$\triangle T$步为学习率线性增大阶段,后$\triangle T$步为学习率线性缩小阶段。其中在第t次迭代时有
$$
\begin{align}
m & = \lfloor 1+{t \over 2\triangle T} \rfloor \\
b & = |{t \over \triangle T} - 2m+1| \\
\alpha_t & = \alpha_{min}^m +(\alpha_{max}^m - \alpha_{min}^m)(max(0,1-b))
\end{align}
$$
带热重启的随机梯度下降:假设在梯度下降过程中重启$M$次,第$𝑚$次重启在上次重启开始第个回合后进行,称为$T_m$重启周期.在第$m$次重启之前,采用余弦衰减来降低学习率
$$
\alpha_t = \alpha_{min}^m + {1 \over 2}(\alpha_{max}^m - \alpha_{min}^m)(1+cos({T_{cur} \over T_m} \pi))
$$
两种周期学习率调整方法的示意图如图
自适应学习率
Adagrad
借鉴了$l_2$正则化的思想,在更新梯度时结合之前梯度平方和的影响
$$
\triangle \theta_t = - {\alpha \over {\sqrt{G_t+\epsilon}}} \odot \pmb g_t,其中G_t = \sum_{\tau=1} ^t{\pmb g_t \odot \pmb g_t}
$$
RMSprop
RMSprop可以在有些情况下避免AdaGrad算法中学习率不断单调下降以至于过早衰减的缺点。
$$
\triangle \theta_t = - {\alpha \over {\sqrt{G_t+\epsilon}}} \odot \pmb g_t,其中G_t = \beta G_{t-1}+(1-\beta){\pmb g_t \odot \pmb g_t}= (1-\beta) \sum_{\tau=1}^t \beta^{t-\tau}\pmb g_\tau \odot g_\tau
$$
从上式可以看出,$RMSProp$算法和$AdaGrad$算法的区别在于$G_t$的计算由累积方式变成了指数衰减移动平均.在迭代过程中,每个参数的学习率并不是呈衰减趋势,既可以变小也可以变大。
Adadelta
加入方向梯度参数进行考量,当某个方向的梯度一直很大时,代表这个方向还没有训练完全,应该多学一下。
$$
\triangle \theta_t = - { {\sqrt{\triangle X_{t-1} ^2 + \epsilon} } \over {\sqrt{G_t+\epsilon} } } \odot \pmb g_t,其中G_t = \sum_{\tau=1} ^t{\pmb g_t \odot \pmb g_t},\triangle X_{t-1}^2 = \beta_1\triangle X_{t-2}^2+(1-\beta_1)\triangle \theta_{t-1} \odot \triangle \theta_{t-1}
$$
$AdaDelta$算法还引入了每次参数更新差值$\triangle \theta$的平方的指数衰减权移动平均,一定程度上减小了学习率$\alpha$的波动。
梯度
梯度方向优化
Momentum(动量法)
用之前累计动量来替代真正的梯度进行更新,每次迭代的梯度可以看作是加速度。在第$t$次迭代,计算负梯度的”加权移动平均“作为参数更新的方向。
$$
\triangle \theta_t = \rho \triangle \theta_{t-1} -\alpha \pmb g_t = -\alpha\sum_{\tau=1}^t \rho^{t-\tau}\pmb g_\tau
$$
其中$\rho$是动量因子,整体是动量因子和梯度的乘积的加权移动平均,每个$\rho^{t-i}\pmb g_t$是单位的动量。这样每个参数的实际更新差值取决于最近一段时间内梯度的加权平均值。当某个参数在最近一段时间内的梯度方向不一致时,其真实的参数更新幅度变小;相反,当在最近一段时间内的梯度方向都一致时,其真实的参数更新幅度变大,起到加速作用。从而起到抵消相反方向,加速相同方向的效果。
当前梯度与之前梯度的加权移动平均可以近似看作二阶梯度,体现梯度的变化方向。
Nesterov加速梯度
对于动量法的公式,可以将其看作两步,第一步是加上之前$\triangle \theta_{t-1}$的参数,得到中间参数$\triangle \hat \theta$;第二步是加上梯度反方向,得到新的参数$\triangle \theta_t$。其中,第二步的更新本应从中间参数的位置进行更新,这样才能用到第一步的中间更新结果,因此就可以得到$Nesterov$方法的更新公式:
$$
\triangle \theta_t = \rho \triangle \theta_{t-1} -\alpha \pmb g_t(\theta_{t-1}+\rho \triangle \theta_{t-1})
$$
其中括号中的参数加和就体现了参数本身的中间值更新。
Adam算法:梯度方向优化+自适应学习率
计算梯度平方$g_t^2$的指数加权平均(RMSprop)和梯度$g_t$的指数加权平均(动量法)
$$
\begin{align}
M_t & = \beta_1M_{t-1}+(1-\beta_1)\pmb g_t \\
G_t & = \beta_2G_{t-1}+(1-\beta_2)\pmb g_t \odot \pmb g_t
\end{align}
$$
取其中一个加权移动平均,并看平均式子的第一项:$M_1 = \beta_1M_0+(1-\beta_1)g_1$,若前面的$\beta_1M_0=0$,则有$M_1=(1-\beta_1)g_1$,而梯度更新的单位不能变,即本身应该$M_1=g_1$,因此需要修正掉这个系数的偏差,扩展到$M_t$和$G_t$则有
$$
\hat M_t = {M_t \over {1-\beta_1^t}},\hat G_t = {G_t \over {1-\beta_2^t}}
$$
最后,按照自适应学习率的方法更新参数即可
$$
\triangle \theta_t = - {\alpha \over \sqrt{\hat G_t+\epsilon}}\hat M_t
$$
梯度截断
梯度截断通过将梯度的模限制在一个区间,从而解决了梯度爆炸的问题,防止梯度过大。梯度截断的的方法相对会比较暴力,有按值截断和按模截断两种方法。
按值截断:$\pmb g_t = max(min(\pmb g_t,b),a)$ ——>限制在$[a,b]$之间
按模截断:$\pmb g_t = { b \over ||\pmb g_t||}\pmb g_t$
其他方法
增大批量大小:批量越大,相对需要的学习率就越大,而单纯增大批量,效果可以视为变相降低学习率
学习率预热:在一开始梯度较乱的时候使用小学习率提高稳定性,到一定epoch后开始正式学习,学习率预热目前已成为业界公认常规使用的一种方法。
优化算法小结
统一公式
$$
\triangle \theta_t = - {\alpha_t \over {\sqrt{G_t+\epsilon} } }M_t,\ 其中G_t = \phi(\pmb g_1.\pmb g_2,…,\pmb g_n),\ M_t = \psi(\pmb g_1.\pmb g_2,…,\pmb g_n)
$$
参数和数据
参数初始化
神经网络的参数初始化不可以像一般规模的参数一样全部初始化为0,这样会出现所有神经元的输出结果一样,即进入了对称态,这样我们的网络就不能学到更多的特征了,因此需要规避这种可能性。
初始化的方法有预训练初始化(Backbone)、随机初始化和固定值初始化等方法。
预训练初始化
在训练模型时,我们常常需要利用预训练的baseline模型对所设计网络的backbone或部分layer进行初始化,给网络训练提供一个较好的起点,同时减少训练的时间成本。
随机初始化
随机初始化是通过采用一定的随机化方法,将参数进行随机赋值来完成初始化。
高斯分布初始化:参数从一个固定均值和固定方差的高斯分布进行随机初始化(如$X \sim \mathcal N(0,0.01^2)$
均匀分布初始化:参数可以在区间$[-r,r]$内采用均匀分布进行初始化。
基于方差缩放的参数初始化
在一个神经网络中,第$l$层的神经元要接收第$l-1$层的输入,即有
$$
a^{(l)} = f(\sum_{i=1}^{M_{l-1}} w_i^{(l)}a_i^{(l-1)})
$$
其中$f(·)$是激活函数,不妨在这里设为简单的恒等函数$f(x)=x$。假设$w_i^{(l)}$和$a_i^{(l-1)}$的均值均为0且相互独立,则有
$$
\mathbb E[a^{(l)}]=\mathbb E[\sum_{i=1}^{M_{l-1}} w_i^{(l)}a_i^{(l-1)}]=\sum_{i=1}^{M_{l-1}}\mathbb E[w_i^{(l)}]\mathbb E[a_i^{(l-1)}] = 0
$$
而$a^{(l)}$的方差为:
$$
\begin{align}
var(a^{(l)})&=var(\sum_{i=1}^{M_{l-1}} w_i^{(l)}a_i^{(l-1)})\\
&=\sum_{i=1}^{M_{l-1}}\ var(w_i^{(l)})var(a_i^{(l-1)}) \\
&=M_{l-1}\ var(w_i^{(l)})var(a_i^{(l-1)})
\end{align}
$$
也就是说通过一次神经元计算,方差从$l-1$层到$l$层变化了$M_{l-1}\ var(w_i^{(l)})$倍,为了使得在经过多层网络后,信号不被过分放大或过分减弱,我们尽可能保持每个神经元的输入和输出的方差一致,则有
$$
M_{l-1}\ var(w_i^{(l)})=1,\ \ \
var(w_i^{(l)})={1\over M_{l-1}}
$$
同理,对于反向传播的结果也需要保证方差一致,需要将$w_i^{(l)}$保持方差为$var(w_i^{(l)})={1\over M_{l}}$
因为,取两个式子的折中结果为
$$
var(w_i^{(l)})={2\over {M_{l-1} + M_l} }
$$
这个就是方差缩放初始化的基本思想,通过将参数的方差限制到前后一致的程度,从而减少因参数变化导致的模型动荡的问题。
假设初始化方法服从均匀分布,根据方差计算公式,可得服从$[a,b]$的均匀分布的期望为$\mathbb E[X]={1\over 2}(a+b)$,所以有
$$
\begin{align}
D[X]=E[X^2]-[E[X]]^2 & = \int_a^b x^2f(x)dx - ({a+b\over2})^2 \\
& = \int_a^b x^2{1\over {b-a} } dx- ({a+b\over2})^2 \\
& = {1\over {b-a} }·{1\over 3}x^3 \vert a^b - ({a+b\over2})^2 \\
& = {(b-a)^2 \over 12}
\end{align}
$$
当服从$[-r,r]$的均匀分布时,代入到方差式子中,令$var(x)=\sigma^2$,可得$r=\sqrt{3\sigma^2}$,代入上面的方差结果可以得到
$$
r = \sqrt{6\over{M{l-1}+M_l}}
$$
这个就是$Xavier$初始化的基本思想,将这个思想扩展可以得到其他变种的初始化方法。
正交初始化
一个$M$层的等宽线性网络定义如下:
$$
\pmb y = \pmb W^{(L)}\pmb W^{(L-1)}…\pmb W^{(1)}\pmb x
$$
网络的反向传播公式为$\delta^{(l)}=\pmb (W^{(l)})^\top \delta^{(l-1)}$为了避免梯度消失或梯度爆炸问题,希望误差项应该是相等的,即:
$$
||\delta^{(l-1)}||^2 = ||\delta^{(l)}||^2 = ||(\pmb W^{(l)})^\top\delta^{(l-1)}||^2
$$
因此,我们希望反向传播的参数相乘结果保持为单位阵,即$\pmb W^{(l)} ·(\pmb W^{(l)})^\top = \mathbb I$,这种性质我们称之为范数保持性
为了能够保持这一性质,可以直接采用正交初始化的方法,将参数矩阵设置为正交矩阵,正交矩阵可以满足相乘为单位阵的特点。正交初始化的方法可以按照下面步骤来
- 用均值为0,方差为1的高斯分布初始化得到一个矩阵
- 将这个矩阵通过奇异值分解得到两个正交矩阵,并使用其中一个作为权重矩阵。
数据归一化
不同机器学习模型对数据特征尺度的敏感程度不一样。如果一个机器学习算法在缩放全部或部分特征后不影响它的学习和预测,我们就称该算法具有尺度不变性(Scale Invariance)。对于尺度敏感的模型,必须先对样本进行预处理,将各个维度的特征转换到相同的取值区间,并且消除不同特征之间的相关性,才能获得比较理想的结果.
数据归一化操作通过使数据特征范围限制到特定范围内,从而对训练起到积极作用,具体来说,数据归一化可以使梯度更新方向与最优的指向方向一致,加速模型的训练速度。
简单归一化
简单归一化直接对数据本身做归一化处理,其包括以下方法:
最小最大值归一化:通过缩放将每一个特征的取值范围归一到$[0, 1]$或$[−1, 1]$之间,即:
$$
\hat x^{(n)} = { {x^{(n)}-min_nx^{(n)} } \over {max_nx^{(n)}-min_nx^{(n)} } }
$$
Z值标准化:对每一维的特征进行调整,使之均值为0,方差为1,首先计算特征的均值和方差:
$$
\begin{align}
\mu={1\over N}\sum_{n=1}^Nx^{(n)},\ \ \sigma^2{1\over N}\sum_{n=1}^N(x^{(n)}-\mu)^2
\end{align}
$$
然后将特征减去均值,除以标准差,得到均值为0,方差为1的分布。
$$
\hat x^{(n)} = { {x^{(n)}-\mu} \over \sigma }
$$
白化(PCA降维):输入数据经过白化处理后,特征之间相关性较低,并且所有特征具有相同的方差,从而降低输入数据的冗余性,白化的一个重要实现方式是主成分分析(PCA)
几种方法的比较如下:
逐层归一化
每层或每隔几层做一次层归一化,以达到层与层之间更好的尺度不变性,减少内部协变量偏移(内部协变量偏移:每层活性值的分布都有所变化,随着层的增多其变化导致的偏移会越来越明显);可以达到平滑地形的效果,优化地形使梯度更容易收敛。
逐层归一化的方法有批量归一化、层归一化、权重归一化、局部响应归一化等
批量归一化(Batch Normalization,BN)
对于一个深层神经网络,有
$$
\pmb a^{(l)}=f(\pmb z^{(l)}) = f(W\pmb a^{(l-1)}+\pmb b)
$$
其中$f(·)$使激活函数,W和b是可学习参数,批量归一化对深层网络的净输入$\pmb z^{(l)}$进行归一化,应用于仿射变换之后,激活函数之前,具体的,对于净输入应用z值标准化:
$$
\hat z^{(l)} = { {\pmb z^{(l)} - \mathbb E[\pmb z^{(l)}]} \over {\sqrt{var(\pmb z^{(l)})+\epsilon}} }
$$
其中期望和方差都针对于$\pmb z^{(l)}$在整个训练集上的结果,而由于训练时更多的是应用批量化的随机梯度下降,因此在整个数据集上算是不现实的,因此使用单个批量上的均值和方差来拟合整体的期望和方差,有
$$
\mu_\mathcal B = {1\over K}\sum_{k=1}^K\pmb z^{(k,l)},\ \ \sigma_\mathcal B^2={1\over K}\sum_{k=1}^K(\pmb z^{(k,l)}-\mu_\mathcal B)\odot (\pmb z^{(k,l)}-\mu_\mathcal B)
$$
最后采用批量上的均值和方差代替整体的期望和方差。
$$
\hat {\pmb z}^{(l)} = { {\pmb z^{(l)} - \mu_\mathcal B} \over \sqrt{\sigma_\mathcal B^2+\epsilon} } \odot \gamma + \beta \Leftrightarrow BN_{\gamma,\beta}(\pmb z^{(l)})
$$
其中$\gamma$表示缩放因子,$\beta$表示平移因子,当$\gamma=\sigma_\mathcal B,\beta=\mu_\mathcal B$时,调整后的$\pmb z$可以学习回到原有的$\pmb z$,这样也提高了本身的灵活性。但由于在RNN中,同一个神经元在不同时刻的值有所不同,无法确定在同一个神经元中的固定结果,维度不同从而导致$BN$很难应用进去。
层归一化(Layer Normalization,LN)
与批量归一化不同,层归一化针对的是每一层的所有样本,而不是基于一个batch。设第$l$层的神经元净输入为$z^{(l)}$,则有期望和方差为
$$
\mu^{(l)} = {1\over n^l}\sum_{i=1}^{n^l} z_i^{(l)}, \ {\sigma^{(l)} }^2 = {1 \over n^l}\sum_{i=1}^{n^l} (z_i^{(l)} - \mu^{(l)})^2, \ \ 其中n^{l}为l层的神经元数量
$$
求出层上的均值和方差之后,归一化的方法和批量归一化一样都是移动中心点。
$$
\hat {\pmb z}^{(l)} ={ {\pmb z^{(l)} - \mu^{(l)}} \over \sqrt{ {\sigma^{(l)} } ^2+\epsilon} } \odot \gamma + \beta \Leftrightarrow LN_{\gamma,\beta}(\pmb z^{(l)})
$$
批量归一化和层归一化的对比可以看下图:
可以看到,第一张图中,蓝色的区域表示在第$i$个深度中的所有样本$N$,第二个部分是第$i$个样本在所有神经元中训练,第三个和第四个也是逐层归一化的一种方法,分别对应一个实体的归一化和一个组的归一化。
层归一化和批量归一化整体上是十分类似的,差别在于归一化的方法不同。对于$K$个样本的一个小批量集合$Z^{(l)} = [Z_1^{(l)},Z_2^{(l)},…,Z_m^{(l)}]$,层归一化是对矩阵$Z^{(l)}$的每一列进行归一化,而批量归一化是对每一行进行归一化。一般而言,批量归一化是一种更好的选择。当小批量样本数量比较小时,可以选择层归一化。此外,归一化方法中还有基于权重的归一化($WN$)和局部区域的响应归一化($LRN$),这里不再详述。
超参数优化
超参数的类型众多,且范围不尽相同,因此针对于超参数的搜索和优化难度相对较高,需要找到一种相对合理的赋值或搜索的方法。
超参数的种类
常见的超参数包含以下三种:
- 网络结构,包括神经元之间的连接关系、层数、每层的神经元数量、激活函数的类型等.
- 优化参数,包括优化方法、学习率、小批量的样本数量等.
- 正则化系数.
超参数优化(Hyperparameter Optimization)是一个组合优化问题,无法像一般参数那样通过梯度下降方法来优化,也没有一种通用有效的优化方法;同时,评估一组超参数配置(Configuration)一般需要完整运行整套机制,因此时间成本很高,需要从参数的选择本身进行优化。
网格搜索
是一种通过尝试所有超参数的组合来寻找合适一组超参数配置的方法。假设共有$K$个超参数,其中第$k$个超参数可以取到$m_k$个值;如果参数是连续的,可以选择几个“经验”值作为整体,一般这个经验值非等距;进一步的,为了能够使每一维上的值尽可能多的覆盖,可以采用随机搜索的方法,用不同取值的组合来模拟随机性。
贝叶斯优化
通过当前已经尝试过的超参数组合来预测下一步的最优组合,每个组合的优良与否采用概率的方式给出,即对当前的$K$种已尝试的方案建模。
具体的,比较常用的贝叶斯优化方法是时序模型优化:假设超参数优化的函数$f(x)$服从高斯分布,贝叶斯过程通过根据$N$组已经产生结果的数据$\mathcal H={\pmb x^{(n)},y^{(n)} } {i=1} ^N$建模后验分布$\mathcal p{\mathcal {GP} }(f(x)|x)$。而要使后验分布尽可能去接近真实分布,其需要对样本空间进行足够多的采样,为了使尽可能少的样本产生尽可能好的效果,需要对样本设置一个收益函数,比较常用的是期望改善。具体的设置方法不再详述。
动态资源分配
动态资源分配的关键是将有限的资源分配给更有可能带来收益的超参数组合.一种有效方法是逐次减半(Successive Halving)方法,将超参数优化看作一种非随机的最优臂问题,即在给定有限的机会次数下,如何玩这些赌博机并找到收益最大的臂。和多臂赌博机问题类似,最优臂问题也是在利用和探索之间找到最佳的平衡。
神经架构搜索
神经架构搜索的基本思想是通过神经网络来实现网络架构的设计,利用元学习的思想,神经架构搜索利用一个控制器来生成另一个子网络的架构描述。控制器可以由一个循环神经网络来实现。控制器的训练可以通过强化学习来完成,其奖励信号为生成的子网络在开发集上的准确率。
网络正则化
神经网络会优先记住具有一般性的规律,之后才会考虑到噪声,且由于通用近似定理的存在,神经网络的拟合能力也十分突出。但神经网络所用到的参数规模十分庞大,一般会超过样本的规模,因此很容易出现过拟合的问题,故需要对网络采用正则化的技术,限制其拟合能力到正常范围。正则化的方法原理是损害优化,其可以通过增加优化约束(L1/L2约束、数据增强)、干扰优化过程(权重衰减、随机梯度下降、早停法)等方法实现。
$l_1$和$l_2$正则化(Normalization)
$$
\theta^* = \mathop{argmin}_\theta {1 \over N}\mathcal L(y^{(n)},f(\pmb x^{(n)},\theta)) + \lambda \mathscr l_p(\theta)
$$
其中,$\mathscr l_p$是范数函数,$p$的取值一般取${1,2}$,$\mathscr l_1=\mathop {\sum_i} |\theta_i| \le 1$,$\mathscr l_2=\sum_i(\theta_i)^2 \le 1$;$\lambda$为正则化系数。
早停法
使用验证集来测试每一次迭代的参数在验证集上是否是最优,如果在验证集上的错误率不再下降就停止迭代,防止过拟合。
权重衰减
在每次参数更新时引入一个衰减系数$w$:
$$
\theta_t \leftarrow (1-w)\theta_{t-1}-\alpha\pmb g_t
$$
对于$l_2$正则化,其公式可以表达为:
$$
\theta_t = \theta_{t-1}-\alpha(\pmb g_t+\lambda\theta_{t-1}) = (1-\alpha\lambda)\theta_{t-1}-\alpha\pmb g_t
$$
当$w=\alpha\lambda$时,可以看出在随机梯度下降的背景下,权重衰减的效果与$l_2$正则化是完全一致的。
暂退法(Dropout)
在神经网络中,多个神经元的行为一致,可能会出现协同效应,这会降低模型的鲁棒性和表达能力,而当所有神经元的行为一致,就会退化为对称效应。为了避免协同效应,可以采用暂退法,对于一个神经层$y=f(Wx+b)$,引入一个丢弃函数$d(·)$使得$y=f(Wd(x)+b)$。
在训练时,$d(\pmb x) = \pmb m \odot \pmb x$,其中$\pmb m \in {0,1}^d$是丢弃掩码,可以通过依概率为$p$的伯努利分布生成,在训练时,$1-p$部分的神经元会被丢弃掉,这个过程是随机的,因此具有很强的多样性,其表达能力也会因为随机性而破坏程度降低。
在测试时,由于训练时神经元是依概率为$p$的伯努利分布随机$dropout$的,因此仅会有$p·n^l$的数量的神经元保留,而在测试时,所有的神经元都是可以激活的,这会造成训练和测试时网络的输出不一致,因此需要对输入限制,即$d(\pmb x) = p\pmb x$,相当于对不同的神经元做平均。
对于暂退法,可以有以下两种形式的理解:
集成学习的解释:每做一次$Dropout$是对原有的完整网络做了一次子网络提取,若一个神经网络有$n$个神经元,则可以提取出$2^n$个子网络,这些子网络共享模型参数,相当于每次采用的是不同的网络训练,这会有效提高模型的鲁棒性。
贝叶斯学习的解释:
假设参数服从先验分布$q(\theta)$,则有贝叶斯加和为
$$
E_{q(\theta)}[y] = \int_qf(\pmb x,\theta)q(\theta)d\theta \approx {1\over M}\sum_{m=1}^Mf(\pmb x,\theta_m)
$$
其中$f(\pmb x,\theta_m)$是第$m$次$dropout$后的网络,多个子网络分布的综合可以看作对先验分布的期望。
在循环神经网络中,每次采样的参数需要在每个时刻保持不变,因此在对循环神经网络上使用$dropout$时需要对参数矩阵的每个元素随机丢弃,并在所有时刻都使用相同的丢弃掩码。这种丢弃方式称之为变分丢弃法。
输入和输出
数据增强
在数据中引入噪声或加入变换来增加数据的多样性和数量。
图像增强:旋转、平移、翻转、缩放、加噪声等
文本增强:词汇替换、回译、随机编辑噪声(增删改查、句子乱序)
标签平滑
在样本的输出标签中加入噪声来避免模型过拟合。若一个样本$x$的标签用独热编码表示:$\pmb y=[0,…,0,1,0,…,0]\top$,则加入一个很小的噪声$\epsilon$,即
$$
\hat {\pmb y} = [{\epsilon \over {K-1} } ,,,,,{\epsilon \over {K-1} },1-\epsilon,{\epsilon \over {K-1} } ,…,{\epsilon \over {K-1} } ]\top
$$
若要在标签中继续加入语义相关性,可以采用知识蒸馏的方法,比如先训练另外一个更复杂(一般为多个网络的集成)的教师网络(Teacher
Network),并使用大网络的输出作为软目标来训练学生网络(Student Network)。