神经网络优化¶
参数优化问题¶
再次回忆我们的梯度下降更新公式:
$$ \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] 这里考场上可能会要求大家手撕一遍这个算法……
随机采样¶
由于一般的计算量太大,我们采用随机采样的样本机制,将更新规则变为:
这里的 \(i\) 是等可能随机取出的一个样本。
随机采样带来梯度估计方差过大的问题。
批量随机梯度下降¶
Batch SGD,是全量梯度下降算法和单样本随机梯度下降算法的折中方案:每次计算通过随机采样小批量样本的(称为一个 batch)梯度平均来平衡方差和计算效率。
反向传播算法¶
梯度下降一直在说梯度,可问题是,我们怎么快速计算这个梯度呢?反向传播算法给出了一个计算思路。其核心就是求导法则中的链式法则。
反向传播过程计算参数梯度的核心公式如下:
神经网络的训练技巧¶
这里给出一些具体实践中的技巧,有助于提升神经网络的性能和训练效率。
样本随机性与打乱¶
我们希望,我们抽取的 batch,并不是某个特殊范围内的,而是能反映全局的,比较「均匀的」batch。大样本下可能有点困难,但在具体实践中,我们直接随机化打乱一次就够用了
Batch size 的选择¶
批量大小不影响梯度期望,但会影响梯度方差。我们需要在梯度方差和计算量之间进行权衡。同时,批量越大,模型训练越稳定,可以设置更大的学习旅。批量较小时,需要设置较小的学习率,否则模型可能不收敛
学习率的调整¶
有两种可能:
- 学习率过小:相当于步子迈太小,需要很多步才能到达谷底。意味着我们的训练很难收敛
- 学习率过大:相当于步子迈太大,一下又走出了水坑,意味着我们的训练会剧烈震荡。
一般来说,我们可以将学习率按训练批次进行衰减,在最优附近用更小的步幅,方便我们逼近。
正则化方法¶
正则化依然是很有效的一个手段,和之前类似,分为L1正则化和L2正则化。公式表达为:
这个 \(\frac{1}{2}\) 没别的意思,单纯是为了形式上好看,直接塞给惩罚系数也是一样的。
提前终止¶
通过监控模型在验证集上的性能,当验证集性能不再提升甚至开始下降时,直接停止训练,防止过拟合。
Dropout¶
Dropout 也是一种正则化方法。顾名思义,Dropout 就是在训练过程中以一定概率忽略一部分神经元的输出。具体来说,在训练时,取到一个 batch 后,以概率 \(p\) 设置一些神经元为 \(0\),使网络结构发声变化,然后用新网络在 batch 上计算梯度,并在新网络上进行参数更新。
其动机是:
- 强制模型有冗余特征表示,而不是被过多的特征给限制死。
- 防止特征的相互关联。部分特征可能存在关联,某种特征出现需要另一种特征的出现。
DropConnect¶
Dropout 是对某个神经元的输出置 \(0\) ,而 DropConnect 则是对某个隐藏神经元的输入权重进行随机置 \(0\)。
参数初始化¶
不知道书上为什么是三级标题,这里其实也是训练的小技巧。
预训练初始化¶
在其他任务上预先训练一部分模型参数,作为当前网络参数的初始值。这种模型方便我们迁移到另一个任务上,也降低了训练的成本。主要用于:小样本学习、复杂特征提取。
固定值初始化¶
将参数设置为预定的常数,而非随机值或外部模型参数。
随机初始化¶
通过赋予随机置,打破固定值初始化带来的对称问题,确保不同神经元初始学习独立的特征。取一个随机变量即可,一般考虑均匀分布和正态分布。