跳转至

神经网络优化

参数优化问题

再次回忆我们的梯度下降更新公式:

$$ \begin{align} & \theta_{t + 1} = \theta_t - \alpha \nabla_\theta \mathcal{L} \left(\theta_t \right) \

& \nabla_\theta \mathcal{L} \left( \theta_t \right) = \frac{1}{N} \sum_{n = 1}^N \nabla_\theta \mathcal{L} \left(f \left(x ^{(n)}; \theta_t \right), y^{(n)} \right) \end{align} $$

[!note] 这里考场上可能会要求大家手撕一遍这个算法……

随机采样

由于一般的计算量太大,我们采用随机采样的样本机制,将更新规则变为:

\[ \theta_{t + 1} = \theta_0 - \alpha \nabla_\theta \mathcal{L} \left( f\left(x^{(i)}; \theta_t \right); y^{(i)} \right) \]

这里的 \(i\) 是等可能随机取出的一个样本。

随机采样带来梯度估计方差过大的问题。

批量随机梯度下降

Batch SGD,是全量梯度下降算法和单样本随机梯度下降算法的折中方案:每次计算通过随机采样小批量样本的(称为一个 batch)梯度平均来平衡方差和计算效率。

\[ \theta_{t + 1} = \theta_0 - \alpha \cdot \frac{1}{|B|} \sum_{i \in B} \nabla_\theta \mathcal{L} \left( f\left(x^{(i)}; \theta_t \right); y^{(i)} \right) \]

反向传播算法

梯度下降一直在说梯度,可问题是,我们怎么快速计算这个梯度呢?反向传播算法给出了一个计算思路。其核心就是求导法则中的链式法则。

反向传播过程计算参数梯度的核心公式如下:

\[ \begin{align} & e^{(l)} = \nabla f_l \left(z^{(l)} \right) \odot \left(e^{(l+ 1)} W^{(l + 1)} \right) \\ & \frac{\partial \mathcal{L} \left(\hat{y}, y \right)}{\partial W^{(l)}} = e ^{(l)} \left(a^{(l - 1)} \right)^T \\ & \frac{\partial \mathcal{L} \left(\hat{y}, y \right)}{\partial b^{(l)}} = e ^{(l)} \end{align} \]

神经网络的训练技巧

这里给出一些具体实践中的技巧,有助于提升神经网络的性能和训练效率。

样本随机性与打乱

我们希望,我们抽取的 batch,并不是某个特殊范围内的,而是能反映全局的,比较「均匀的」batch。大样本下可能有点困难,但在具体实践中,我们直接随机化打乱一次就够用了

Batch size 的选择

批量大小不影响梯度期望,但会影响梯度方差。我们需要在梯度方差和计算量之间进行权衡。同时,批量越大,模型训练越稳定,可以设置更大的学习旅。批量较小时,需要设置较小的学习率,否则模型可能不收敛

学习率的调整

有两种可能:

  • 学习率过小:相当于步子迈太小,需要很多步才能到达谷底。意味着我们的训练很难收敛
  • 学习率过大:相当于步子迈太大,一下又走出了水坑,意味着我们的训练会剧烈震荡。

一般来说,我们可以将学习率按训练批次进行衰减,在最优附近用更小的步幅,方便我们逼近。

正则化方法

正则化依然是很有效的一个手段,和之前类似,分为L1正则化和L2正则化。公式表达为:

\[ \begin{align} \mathcal{L}’(\theta) = \mathcal{L} (\theta) + \frac{1}{2}\lambda \| \theta \|_2^2 \\ \mathcal{L}’(\theta) = \mathcal{L} (\theta) + \frac{1}{2}\lambda \| \theta \|_1 \end{align} \]

这个 \(\frac{1}{2}\) 没别的意思,单纯是为了形式上好看,直接塞给惩罚系数也是一样的。

提前终止

通过监控模型在验证集上的性能,当验证集性能不再提升甚至开始下降时,直接停止训练,防止过拟合。

Dropout

Dropout 也是一种正则化方法。顾名思义,Dropout 就是在训练过程中以一定概率忽略一部分神经元的输出。具体来说,在训练时,取到一个 batch 后,以概率 \(p\) 设置一些神经元为 \(0\),使网络结构发声变化,然后用新网络在 batch 上计算梯度,并在新网络上进行参数更新。

其动机是:

  • 强制模型有冗余特征表示,而不是被过多的特征给限制死。
  • 防止特征的相互关联。部分特征可能存在关联,某种特征出现需要另一种特征的出现。

DropConnect

Dropout 是对某个神经元的输出置 \(0\) ,而 DropConnect 则是对某个隐藏神经元的输入权重进行随机置 \(0\)。

参数初始化

不知道书上为什么是三级标题,这里其实也是训练的小技巧。

预训练初始化

在其他任务上预先训练一部分模型参数,作为当前网络参数的初始值。这种模型方便我们迁移到另一个任务上,也降低了训练的成本。主要用于:小样本学习、复杂特征提取。

固定值初始化

将参数设置为预定的常数,而非随机值或外部模型参数。

随机初始化

通过赋予随机置,打破固定值初始化带来的对称问题,确保不同神经元初始学习独立的特征。取一个随机变量即可,一般考虑均匀分布和正态分布。