这里回顾dlsys第六讲,本讲内容是全连接神经网络和优化。

课程主页:

大纲

  • 全连接神经网络;
  • 优化;
  • 初始化;

全连接神经网络

现在我们已经涵盖了自动微分的基础知识,我们可以回到深度网络的“标准”形式。
一个$L$层全连接网络,又名多层感知机(MLP),现在有一个明确定义:

其中参数为,$\sigma_i(x)$是非线性函数。

矩阵形式和广播的微妙之处

让我们考虑迭代的矩阵形式:

注意一个微妙的点:以矩阵形式正确地描述,更新为$Z_{i+1}\in \mathbb R^{m\times n}$要求我们形成矩阵$1 b_i^T \in \mathbb{R}^{m \times n}$。实际上,我们不会构造这些矩阵,而是通过广播执行操作:

  • 例如,对于$n\times 1$向量(或高阶张量),广播将其视为$n\times p$矩阵:重复同一列$p$次;
  • 我们可以(非正式地)将迭代写成$Z_{i+1}=\sigma_i\left(Z_i W_i+ b_i^T\right)$;
  • 广播不复制任何数据(在后面的讲座中有更多描述);

全连接网络的关键问题

为了真正训练一个全连接网络(或任何深度网络),我们需要解决一些问题:

  • 我们如何选择网络的宽度和深度?
  • 我们实际上如何优化目标?
    • (“SGD”是最容易的答案,但不是实践中最常用的算法);
  • 我们如何初始化网络的权重?
  • 我们如何确保网络可以在多次优化迭代中继续轻松训练?

这些问题(仍然)没有明确的答案,对于深度学习,这和特定问题有关,但我们将介绍一些基本原则。

优化

梯度下降

让我们重新考虑我们之前描述的通用梯度下降更新,现在对于一个函数$f$,第$t$轮的更新为:

其中$\alpha > 0$是步长(学习率),$ \nabla_\theta f\left(\theta_t\right)$是在参数$\theta_t$下评估的梯度。

梯度下降在局部采用“最速下降方向”(根据$\ell_2$范数定义,我们将在稍后讨论),但可能会在更大的时间尺度上振荡。

梯度下降示意图

对于$\theta \in \mathbb R^2$,考虑二次函数$f(\theta)=\frac{1}{2} \theta^T P \theta+q^T \theta$,对于$P$正定
,不同步长的梯度下降示意图:

牛顿法

将更多“全局”结构集成到优化方法中的一种方法是牛顿法,它根据 Hessian(二阶导数矩阵)的逆来缩放梯度:

其中$\nabla_\theta^2 f\left(\theta_t\right)$是所有二阶导数的Hessian, $n\times n$矩阵。

相当于用二阶泰勒展开将函数逼近为二次函数,然后求解最优解。$\alpha = 1$给出的完整步长,否则称为阻尼牛顿法。

牛顿法示意图

牛顿法($\alpha=1$)可以一步优化二次函数。由于两个原因,与深度学习没有太大的实际相关性:

  1. 即使使用自动微分,我们也无法有效求解牛顿步(尽管有一些技巧可以近似求解);
  2. 对于非凸优化,我们甚至不清楚是否想使用牛顿法;

动量

我们能否找到像梯度下降法一样容易计算,但像牛顿法一样考虑更多“全局”结构的“中间地带”。
一种常见的策略是使用动量更新,它考虑了多个先前梯度的滑动平均值:

其中$\alpha$和之前一样是步长,$\beta$是动量平均参数。注意:通常写成替代形式

动量法示意图

动量“平滑”梯度下降下降步骤,但也可能引入其他形式的振荡或非下降行为,在实际中经常用于训练深度网络:

无偏动量项

动量项$u_t$(如果初始化为零,这很常见),在初始迭代中会比在后面的迭代中小。为了使所有迭代中具有相同的预期幅度,我们可以使用更新:

效果:

Nesterov动量法

Nesterov动量(或Nesterov加速度)是一个有用的技巧,它计算“下一个”点的动量更新:

效果:

Adam

对于不同的参数,梯度的比例可以有很大的不同,尤其是跨越深度网络的不同层、不同的层类型等。
所谓的自适应梯度方法试图通过迭代估计这个比例,然后相应地重新调整梯度更新。深度学习中使用最广泛的自适应梯度方法是 Adam算法,它结合了动量和自适应尺度估计:

Adam的注释和展示

Adam是否是“好的”优化器在深度学习中一直争论不休,但它在实践中似乎常常表现得很好,尽管有很多变体,但是完全击败Adam很难:

随机版本

之前的所有示例都考虑了参数的批量更新,但最重要的优化选择是使用随机变量。回忆一下我们的机器学习优化问题:

这是对损失的经验预期的最小化。我们可以通过计算样本子集(称为小批量)的损失梯度来获得有噪声(但无偏)的梯度估计。

随机梯度下降

这再次将我们引向SGD算法,对于Batch $B \subset\{1, \ldots, m\}$,重复如下操作:

我们不是采取一些昂贵的、无噪音的步骤,而是采取许多廉价的、有噪音的步骤,最终每个计算都有很强的性能。

小结

  • 到目前为止,您看到的所有优化方法实际上只是以随机形式使用;
  • 通过观察简单(凸、二次)优化问题,您对这些优化方法的有效直觉是有限的;
  • 您需要不断地进行实验,以了解/直觉这些方法实际上如何影响不同类型的深度网络;

初始化

初始化权重

回想一下,我们通过随机梯度下降迭代地优化参数,例如

但是我们如何选择$Wi,b_𝑖$的初始值呢? (也许只是初始化为零?)
回想一下反向传播前向/后向传播(不使用bias):

那么:

  • 如果$W_i=0$,那么$G_j=0, j\le i \Rightarrow \nabla_{W_i} \ell\left(h_\theta(X), y\right)=0$;
  • 即,$W_i= 0$是目标函数的(非常糟糕的)局部最优;

关键思想#1:初始化的选择很重要

如果随机初始化矩阵, 即$W_i \sim \mathcal{N}\left(0, \sigma^2 I\right)$,那么$\sigma^2$的选择会影响两个指标:

  1. 前向传播$Z_i$的模长;
  2. 反向传播$\nabla_{W_i} \ell\left(h_\theta(X), y\right)$梯度的模长;

关键思想 #2:权重不会移动“那么多”

  • 您可能会想到网络的参数会收敛到某个相似的点区域,而不管它们的初始化如何。
  • 但这不是真的,权重通常更接近它们的初始化,而不是从不同的优化后的“最终”点。
  • 最终结果:初始化很重要,我们将在下一节课中看到一些实际方面。

是什么导致了这些影响?

考虑独立随机变量$x \sim \mathcal{N}(0,1), w \sim \mathcal{N}\left(0, \frac{1}{n}\right)$,那么:

因此$\mathbf{E}\left[w^T x\right]=0, \operatorname{Var}\left[w^T x\right]=1$,根据中心极限定理,$w^T x \rightarrow \mathcal{N}(0,1)$。

非正式的说, 如果使用线性激活函数,并且$z_i \sim \mathcal{N}(0, I), W_i\sim \mathcal{N}\left(0, \frac{1}{n} I\right)$,那么$z_{i+1}=W_i^T z_i \sim \mathcal{N}(0, I)$。

如果使用ReLU激活函数,(不准确的估计),我们需要$W_i\sim \mathcal{N}\left(0, \frac{2}{n} I\right)$.

是什么导致了这些影响?

如果$\sigma^2\neq 2 /n$,那么对于ReLU网络,则每次迭代隐藏单元的方差都会按某个因子呈几何级数增加/减少:

向前和向后传播都会发生这种情况:

因此,梯度的方差将在层上近似恒定,但受$\sigma^2$、深度$D$的选择的严重影响: