Lecture by X.Dan

深度神经网络在机器学习应用、学习复杂概率分布方面表现出色。但是,训练深度神经网络存在诸多挑战。我们将从以下几个方面探讨深度学习架构:

  • 更好的优化方法
    • 克服非凸损失函数
    • 自适应学习率
    • 基于动量的方法
  • 梯度消失与梯度爆炸问题
    • 归一化技术
    • 残差连接
    • 谨慎的初始化策略
  • 过拟合与正则化
    • 正则化技术
    • 早停和模型选择
  • 现代神经网络架构
    • 卷积神经网络
    • 循环神经网络
    • 转换器架构
    • 图像神经网络

# 优化方法

# 现代神经网络架构

# 卷积神经网络 (CNNs)

在对图像的全连接神经网络中,参数数量随着输入图像大小的增加而急剧增加。对于 4×44\times 4 的图像,平坦化后有 1616 个输入神经元。而对于 100×100100\times 100 的 RGB 图像,平坦化后有 30,00030,000 个输入神经元。如果使用一个隐藏层,隐藏层有 1,0001,000 个神经元,那么全连接后的参数数量将达到 30,000,00030,000,000 个。这种庞大的参数量不仅增加了计算复杂度,还容易导致过拟合,忽视了图像的空间结构信息。

卷积神经网络的核心思想是利用权重共享局部连接来减少参数数量。通过在输入图像上滑动一个小的滤波器,卷积操作能够像探针一样在保持空间局部结构的前提下提取特征。这种方法不仅显著减少了参数数量,还提高了模型的泛化能力。

例如,对 3×33\times 3 的图像编码

Img=[123456789]\mathrm{Img}=\begin{bmatrix}1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9\end{bmatrix}

使用 2×22\times 2 的滤波器

ker=[1234]\mathrm{ker}=\begin{bmatrix}1&2\\ 3&4\end{bmatrix}

进行卷积操作,得到的特征图为

Imgker:=[[1245][1234][2356][1234][4578][1234][5689][1234]]=[37476777]\mathrm{Img}*\mathrm{ker}:=\begin{bmatrix}\begin{bmatrix}1&2\\4&5\end{bmatrix}*\begin{bmatrix}1&2\\3&4\end{bmatrix} & \begin{bmatrix}2&3\\5&6\end{bmatrix}*\begin{bmatrix}1&2\\3&4\end{bmatrix} \\ \\ \begin{bmatrix}4&5\\7&8\end{bmatrix}*\begin{bmatrix}1&2\\3&4\end{bmatrix} & \begin{bmatrix}5&6\\8&9\end{bmatrix}*\begin{bmatrix}1&2\\3&4\end{bmatrix}\end{bmatrix}=\begin{bmatrix}37 & 47 \\ 67 & 77\end{bmatrix}

离散卷积作为 CNNs 的核心运算,将输入数据体与一组可学习滤波器之间进行如下运算得到特征图 IK:=ZI*K:=Z,其每一个元素的计算公式为

(IK)i,j=m=0M1n=0N1Ii+m,j+nKm,n(I*K)_{i,j}=\sum_{m=0}^{M-1}\sum_{n=0}^{N-1}I_{i+m,j+n}K_{m,n}

其中 II 是输入图像,KK滤波器卷积核M×NM\times N 是滤波器的尺寸。多通道卷积扩展了这一概念,以 RGB 图像为例,其特征图的计算公式为

Zi,j,k=c=0C1m=0M1n=0N1Xi+m,j+n,cWm,n,c,k+bkZ_{i,j,k}=\sum_{c=0}^{C-1}\sum_{m=0}^{M-1}\sum_{n=0}^{N-1}X_{i+m,j+n,c}W_{m,n,c,k}+b_k

其中 XX 是尺寸为 H×WH\times W 的、具有 CC 个通道的输入数据体;WW 是尺寸为 (M,N,C,K)(M,N,C,K) 的滤波器张量,即 KK 个尺寸为 M×NM\times N 的滤波器,每个滤波器有 CC 个通道,和输入数据体的通道对应。bkb_k 是偏置项;ZZ 是输出特征图,尺寸为 (H,W,K)(H',W',K),表示在 KK 个滤波器作用下得到的 KK 个特征图。

卷积操作自然地减少了特征图的高、宽尺寸。例如,输入图像尺寸为 H×WH\times W,使用 M×NM\times N 的滤波器进行卷积后,输出特征图的尺寸变为 (HM+1)×(WN+1)(H-M+1)\times (W-N+1)。为了控制输出特征图的尺寸,有以下几种常用技术。

填充:在输入图像四周添加额外的像素行和列包裹,通常填充为零,允许滤波器在边缘位置进行卷积操作,从而保持输出特征图的尺寸不变。

对之前例子中的图像进行填充:

Imgpad=[0000001230045600789000000]\mathrm{Img_{pad}}=\begin{bmatrix}0 & 0 & 0 & 0 & 0 \\ 0 & 1 & 2 & 3 & 0 \\ 0 & 4 & 5 & 6 & 0 \\ 0 & 7 & 8 & 9 & 0 \\ 0 & 0 & 0 & 0 & 0\end{bmatrix}

使用相同的 2×22\times 2 滤波器进行卷积操作,得到的特征图为

Imgpadker:=[[0001][1234][0012][1234][0023][1234][0104][1234][1245][1234][2356][1234][0407][1234][4578][1234][5689][1234]]=[41016223747406777]\mathrm{Img_{pad}}*\mathrm{ker}:=\begin{bmatrix}\begin{bmatrix}0&0\\0&1\end{bmatrix}*\begin{bmatrix}1&2\\3&4\end{bmatrix} & \begin{bmatrix}0&0\\1&2\end{bmatrix}*\begin{bmatrix}1&2\\3&4\end{bmatrix} & \begin{bmatrix}0&0\\2&3\end{bmatrix}*\begin{bmatrix}1&2\\3&4\end{bmatrix} \\ \\ \begin{bmatrix}0&1\\0&4\end{bmatrix}*\begin{bmatrix}1&2\\3&4\end{bmatrix} & \begin{bmatrix}1&2\\4&5\end{bmatrix}*\begin{bmatrix}1&2\\3&4\end{bmatrix} & \begin{bmatrix}2&3\\5&6\end{bmatrix}*\begin{bmatrix}1&2\\3&4\end{bmatrix} \\ \\ \begin{bmatrix}0&4\\0&7\end{bmatrix}*\begin{bmatrix}1&2\\3&4\end{bmatrix} & \begin{bmatrix}4&5\\7&8\end{bmatrix}*\begin{bmatrix}1&2\\3&4\end{bmatrix} & \begin{bmatrix}5&6\\8&9\end{bmatrix}*\begin{bmatrix}1&2\\3&4\end{bmatrix}\end{bmatrix}=\begin{bmatrix}4 & 10 & 16 \\ 22 & 37 & 47 \\ 40 & 67 & 77\end{bmatrix}

尺寸变回了 3×33\times 3

步幅:通过在卷积操作中跳过某些位置来控制输出特征图的尺寸。步幅 SS 表示每次移动滤波器时跳过的像素数(横向和纵向均跳过 S1S-1 个像素),直接通过减少采样点来降低输出特征图的尺寸。

例如,使用步幅 S=2S=24×44\times 4 图像进行卷积操作:

Img=[12345678910111213141516]\mathrm{Img}=\begin{bmatrix}1 & 2 & 3 & 4 \\ 5 & 6 & 7 & 8 \\ 9 & 10 & 11 & 12 \\ 13 & 14 & 15 & 16\end{bmatrix}

使用 2×22\times 2 的滤波器

ker=[1001]\mathrm{ker}=\begin{bmatrix}1&0\\0&1\end{bmatrix}

进行卷积操作,得到的特征图为

Imgker:=[[1256][1001][3478][1001][9101314][1001][11121516][1001]]=[7112327]\mathrm{Img}*\mathrm{ker}:=\begin{bmatrix}\begin{bmatrix}1&2\\5&6\end{bmatrix}*\begin{bmatrix}1&0\\0&1\end{bmatrix} & \begin{bmatrix}3&4\\7&8\end{bmatrix}*\begin{bmatrix}1&0\\0&1\end{bmatrix} \\ \\ \begin{bmatrix}9&10\\13&14\end{bmatrix}*\begin{bmatrix}1&0\\0&1\end{bmatrix} & \begin{bmatrix}11&12\\15&16\end{bmatrix}*\begin{bmatrix}1&0\\0&1\end{bmatrix}\end{bmatrix}=\begin{bmatrix}7 & 11 \\ 23 & 27\end{bmatrix}

尺寸变为 2×22\times 2

对输入图 H×WH\times W 使用 M×NM\times N 的滤波器,填充为 PP,步幅为 SS,则输出特征图的尺寸为

O=WK+2PS+1O=\dfrac {W-K+2P}{S}+1

其中 OO 是输出特征图的宽度或高度,KK 是滤波器的宽度或高度。

线性采样结束后,通常还会进行非线性变换,以增强模型的表达能力。对特征图 ZZ 应用非线性激活函数后,得到激活特征图 AA

Ai,j,k=f(Zi,j,k)A_{i,j,k}=f(Z_{i,j,k})

其中,常用的激活函数包括

  • ReLU(线性整流单元):f(x)=max(0,x)f(x)=\max(0,x)
  • Sigmoid(S 型函数):f(x)=11+exf(x)=\dfrac{1}{1+e^{-x}}
  • Tanh(双曲正切函数):f(x)=exexex+exf(x)=\dfrac{e^{x}-e^{-x}}{e^{x}+e^{-x}}

最后通过池化操作进一步降低特征图的尺寸和复杂度。

对先前例子中的特征图线性整流 f(x)=50xf(x)=|50-x|,得到激活特征图

[41016223747406777]f[46403428133101727]\begin{bmatrix}4 & 10 & 16 \\ 22 & 37 & 47 \\ 40 & 67 & 77\end{bmatrix}\xrightarrow{f}\begin{bmatrix}46 & 40 & 34 \\ 28 & 13 & 3 \\ 10 & 17 & 27\end{bmatrix}

池化通过对局部区域进行汇总操作来减少特征图的尺寸。

Pi,j,k=pool(Asi:si+p;sj:sj+p;k)P_{i,j,k}=\text{pool}(A_{si:si+p;sj:sj+p;k})

其中,PP池化特征图pp池化窗口的尺寸,ss池化步幅pool()\text{pool}(\cdot)池化函数。常见的池化方法包括最大池化和平均池化。

例如,对激活特征图进行 2×22\times 2 最大池化,步幅为 22,得到池化特征图

[46403428133101727]max pool[46341727]\begin{bmatrix}46 & 40 & 34 \\ 28 & 13 & 3 \\ 10 & 17 & 27\end{bmatrix}\xrightarrow{\text{max pool}}\begin{bmatrix}46 & 34 \\ 17 & 27\end{bmatrix}

这里根据步幅 22,从左上角开始,会超出边界,它将自动填充为负无穷。

CNNs 的核心架构是局部连接、权重共享和池化操作的组合,分别用于提取局部特征、减少参数数量和降低特征图尺寸,使得极大优化了全连接神经网络的参数尺寸、鲁棒于平移变换,并提升了模型的泛化能力。

CNNs 应用常见于图像分类、目标检测、语义分割、图像生成、医学图像分析、视频处理等领域。里程碑式的 CNN 架构包括 LeNet、AlexNet、VGG、GoogLeNet、ResNet 等。

对于 RGB 图像,卷积神经网络的输入通常是一个三维张量,尺寸为 H×W×3H\times W\times 3,其中 HH 是图像的高度,WW 是图像的宽度,33 代表 RGB 三个颜色通道。通过多层卷积和池化操作,CNNs 能够逐步提取图像的低级到高级特征,具体体现为如下例子

  • 128×128×3128\times 128\times 3:输入一张彩色图片;
  • 128×128×32128\times 128\times 32:第一层卷积层使用 32323×33\times 3 的滤波器组 I,每个滤波器先提取不同通道的局部特征,然后相加,得到一张特征图,经过 3232 个滤波器组后,得到 3232 张特征图;
  • 64×64×3264\times 64\times 32:第一层池化层,使用 2×22\times 2 的最大池化,步幅为 22,将每张特征图的尺寸减半;
  • 64×64×6464\times 64\times 64:第二层卷积层,使用 64643×33\times 3 的滤波器组,提取更复杂的特征;
  • 32×32×6432\times 32\times 64:第二层池化层,再次使用 2×22\times 2 的最大池化,步幅为 22,将特征图尺寸减半;
  • 32×32×12832\times 32\times 128:第三层卷积层,使用 1281283×33\times 3 的滤波器组,提取更高级的特征;
  • 16×16×12816\times 16\times 128:第三层池化层,使用 2×22\times 2 的最大池化,步幅为 22,将特征图尺寸减半;
  • 3276832768:将 16×16×12816\times 16\times 128 的特征图展平为一维向量,作为输入,全连接第一隐藏层为 10241024 个神经元,全连接第二隐藏层为 512512 个神经元,输出层用 Softmax 激活为 10001000 个类别的概率分布。

可以看见,由于池化 - 卷积,其实越后面的卷积,在空间尺寸上越小,但通道数越来越多,提取的特征也越来越复杂。一开始,卷积提取的是边缘、颜色等低级特征,随着网络加深,卷积提取的特征逐渐变得抽象和复杂,如纹理、形状(由颜色通道的组合形成),最后可能是物体的部分或整体表示(由纹理和形状的组合形成)。这个过程是从低级到高级特征的逐步抽象和组合的过程。

CNNs 中,一个卷积层的总参数数量计算公式为:

Total Parameters=(Kw×Kh×Cin+1)×Cout\text{Total Parameters}=(K_w\times K_h \times C_{in} + 1) \times C_{out}

其中,KwK_wKhK_h 分别是滤波器的宽度和高度,CinC_{in} 是输入通道数,CoutC_{out} 是输出通道数,+1+1 代表每个滤波器的偏置项。

一个简单的例子为

  • 输入 RGB 图像,尺寸为 32×32×332\times 32\times 3
  • 卷积层使用 64643×33\times 3 的滤波器组;
  • 步幅为 11,填充为 11

则该卷积层的总参数数量为

(3×3×3+1)×64=(27+1)×64=28×64=1792(3\times 3 \times 3 + 1) \times 64 = (27 + 1) \times 64 = 28 \times 64 = 1792

# 循环神经网络 (RNNs)

标准的 FNNs 是静态的,它们将输入映射到输出,而不考虑时间或序列信息,假设它们是 i.i.d. 的数据点。但对于含有序列数据的任务,如自然语言处理、时间序列预测、音视频分析等,时序和上下文信息至关重要。现在的问题是,如何让神经网络具备记忆和处理序列数据的能力?即如何记住过去的信息,并将其应用于当前的输入?

循环神经网络(Recurrent NNs) 是为处理序列数据而设计的神经网络架构。RNNs 通过在网络中引入循环连接(Recurrent Connections),使得当前时刻的输出不仅依赖于当前输入,还依赖于前一时刻的隐藏状态,从而实现对序列信息的记忆和处理。此外,RNNs 还可以通过共享权重,在不同时间步上使用相同的参数,从而有效地处理变长序列数据。

RNNs 的基本单元包括输入层、隐藏层和输出层。对于每个时间步 tt,RNNs 接收当前输入 xtx_t 和前一时刻的隐藏状态 ht1h_{t-1},通过以下公式计算当前隐藏状态 hth_t 和输出 yty_t

ht¡1htht+1xt¡1xtxt+1

上述图像描述了 RNNs 的基本结构,其中 xtx_t 是在时间步 tt 的输入,hth_t 是在时间步 tt 的隐藏状态,箭头表示信息流动的方向。隐藏状态 hth_t 通过循环连接将前一时刻的隐藏状态 ht1h_{t-1} 传递到当前时刻,输出依赖于当前输入 xtx_t 和前一隐藏状态 ht1h_{t-1}。更具体地,RNNs 的基本单元为

ytht¡1htxt


其中 tt 代表时间步,即序列中的位置,hth_t 是隐藏状态,xtx_t 是输入,yty_t 是输出,具体关系为

{ht=σ(Whhht1+Wxhxt+bh)yt=Whyht+by\begin{cases} h_t=\sigma(W_{hh}h_{t-1}+W_{xh}x_t+b_h)\\[6pt] y_t=W_{hy}h_t+b_y \end{cases}

WW 是权重矩阵,bb 是偏置项,σ\sigma 是激活函数。

RNN 有多种变体,可以根据输入层和输出层的关系进行分类:

  • 单对单(One-to-One):标准的前馈神经网络,输入和输出都是单一的。
  • 单对多(One-to-Many):输入是单一的,输出是一个序列。例如,图像描述生成。

y1y2y3h1h2h3x

  • 多对单(Many-to-One):输入是一个序列,输出是单一的。例如,情感分析。

yh1h2h3x1x2x3

  • 多对多(Many-to-Many):输入和输出都是序列。例如,机器翻译。

y1y2y3h1h2h3x1x2x3

深度 RNNs(Deep RNNs) 通过堆叠多个 RNN 层来增强模型的表达能力。每一层的输出作为下一层的输入,从而捕捉更复杂的时序特征。深度 RNNs 的计算过程如下:

O1O2O3OTH(L)1H(L)2H(L)3¢¢¢H(L)T............H(2)1H(2)2H(2)3¢¢¢H(2)TH(1)1H(1)2H(1)3¢¢¢H(1)TX1X2X3¢¢¢XT

其中 XtX_t 是输入序列,Ht(l)H_t^{(l)} 是第 ll 层在时间步 tt 的隐藏状态,OtO_t 是输出序列。每一层的隐藏状态通过循环连接传递信息,同时每一层之间也有前馈连接,将上一层的输出作为下一层的输入。

双向 RNNs(Bidirectional RNNs) 提供两个反向的隐藏状态,一个从前向后处理序列,另一个从后向前处理序列,最终的输出取决于前文和后文的信息。这种结构特别适用于需要全局上下文信息的任务,如命名实体识别和语音识别。

O1O2O3OTHbackward1Hbackward2Hbackward3¢¢¢HbackwardTHforward1Hforward2Hforward3¢¢¢HforwardTX1X2X3XT

RNNs 也存在挑战和限制,比如在长序列中,梯度可能会随着时间步的增加而指数衰减或爆炸,导致模型难以学习长期依赖关系记忆跨度有限。具体可以从反向传播的表达式中看出,对于单层的 RNNs,其反向传播的梯度链式法则为

hthk=i=k+1thihi1=i=k+1tWhhTdiag(σ(Whhhi1+Wxhxi+bh))\dfrac {h_t}{h_k}=\prod_{i=k+1}^{t}\dfrac {\partial h_i}{\partial h_{i-1}}=\prod_{i=k+1}^{t}W_{hh}^T\mathrm{diag}(\sigma'(W_{hh}h_{i-1}+W_{xh}x_i+b_h))

其中 σ\sigma 对内部线性组合的作用是逐一应用于每个元素上,因此其导数 σ\sigma' 也是一个对角矩阵。

σ[z1z2zn]=[σ(z1)σ(z2)σ(zn)]σ(z)z=diag(σ(z))=[σ(z1)000σ(z2)000σ(zn)]\sigma\begin{bmatrix}z_1 \\ z_2 \\ \vdots \\ z_n\end{bmatrix}=\begin{bmatrix}\sigma(z_1) \\ \sigma(z_2) \\ \vdots \\ \sigma(z_n)\end{bmatrix}\implies \dfrac {\partial \sigma(z)}{\partial z}=\mathrm{diag}(\sigma'(z))=\begin{bmatrix}\sigma'(z_1) & 0 & \cdots & 0 \\ 0 & \sigma'(z_2) & \cdots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & \sigma'(z_n)\end{bmatrix}

解决方案有以下几种:长短期记忆网络、门控循环单元、梯度裁剪和初始化策略等。

长短期记忆网络和门控循环单元通过引入门控机制(Gating Mechanisms)门控腔体(Gated Cells),有效地控制信息的流动和记忆,从而缓解了梯度消失和梯度爆炸问题,提升了模型对长期依赖关系的捕捉能力。

长短期记忆网络(Long Short-Term Memory, LSTM) 的架构为输入、遗忘和输出三个门控机制,分别控制信息的流入、保留和输出,保有一个称为细胞状态(Cell State) 的独立记忆单元。LSTM 强力,但是计算复杂度较高,训练时间较长。核心图表为

MemoryCt¡1Ct¡1¯FtsumCtIt¯~CttanhCtFtIt~CtOtHiddenHt¡1[Ht¡1;Xt]tanhCt¯OtHtInputXttanh¾¾tanh¾

LSTM 引入了细胞状态层,通过三个门控机制来输入序列的信息流动。当 XtX_tHt1H_{t-1} 进入 LSTM 单元时,首先通过遗忘门 FtF_t 决定保留多少先前的细胞状态 Ct1C_{t-1}(通过逐点相乘,遗忘,即减少不重要的分量的权重)。接着,输入门 ItI_t 控制当前输入信息 C~t\tilde{C}_t 的流入,流入的新信息和遗忘操作后的细胞状态相加,得到更新后的细胞状态 CtC_t,作用 tanh\tanh 后,通过逐点相乘调整最基本的输出门 OtO_t,最终得到当前隐藏状态 HtH_t

需要指出,σ\sigma 是 Sigmoid 激活函数,其值域在 0011 之间,tanh\tanh 是 Tanh 激活函数,其值域在 1-111 之间,\odot 是逐点相乘操作,a,b,ca,b,c 是权重矩阵。调用 Sigmoid 激活函数的门控机制可以将信息压缩到 0011 之间,是对信息的 “过滤” 过程,即是否保留信息,而调用 Tanh 激活函数则是对信息进行非线性变换,重新编码信息,两者逐点相乘后,起到调整信息强度的作用。具体细节可以表述为

Forget Gate:What to discard from the cell stateFt=σ(Wf[Ht1,Xt]+bf)Input Gate:What new information to storeIt=σ(Wi[Ht1,Xt]+bi)C~t=tanh(WC[Ht1,Xt]+bC)Cell State Update:Combine forget and input decisionsCt=FtCt1+ItC~tOutput Gate:What to output from the cell stateOt=σ(Wo[Ht1,Xt]+bo)Ht=Ottanh(Ct)\begin{array}{ll} \text{Forget Gate:} & \text{What to discard from the cell state} \\[6pt] &F_t=\sigma(W_f\cdot[H_{t-1},X_t]+b_f) \\[6pt] \text{Input Gate:} & \text{What new information to store} \\[6pt] & I_t=\sigma(W_i\cdot[H_{t-1},X_t]+b_i) \\[6pt] & \tilde C_t=\tanh(W_C\cdot[H_{t-1},X_t]+b_C) \\[6pt] \text{Cell State Update:} & \text{Combine forget and input decisions} \\[6pt] & C_t=F_t\odot C_{t-1}+I_t\odot \tilde C_t \\[6pt] \text{Output Gate:} & \text{What to output from the cell state} \\[6pt] & O_t=\sigma(W_o\cdot[H_{t-1},X_t]+b_o) \\[6pt] &H_t=O_t\odot \tanh(C_t) \end{array}

其中 [,][\cdot, \cdot ] 表示向量连接操作。其中,Wf,Wi,WC,WoW_f,W_i,W_C,W_o 是权重矩阵,bf,bi,bC,bob_f,b_i,b_C,b_o 是偏置项。

门控机制通过学习这些权重和偏置,动态地调整信息的流动,从而有效地捕捉长期依赖关系。LSTM 有效避免了传统 RNN 中的梯度消失问题,因为细胞状态通过线性路径传递信息。

Ct=FtCt1+ItC~tC_t=F_t\odot C_{t-1}+I_t\odot \tilde C_t

允许梯度在时间步之间更稳定地传播。

门控循环单元(Gated Recurrent Unit, GRU) 是 LSTM 的简化版本,结合了遗忘门和输入门为一个更新门(Update Gate) ZtZ_t,并引入重置门(Reset Gate) RtR_t 来控制过去信息的遗忘。不包含独立的细胞状态,而是直接在隐藏状态中进行信息的存储和更新。GRU 的架构为

Ht¡1GPUCellHtXt

具体而言,更新门控制当前隐藏状态中有多少信息需要从过去传递过来,并平衡新信息的引入,类似于 LSTM 的遗忘门和输入门的组合。重置门决定了多少过去的信息需要被遗忘,决定了当前和过去隐藏状态的关联性,有助于捕捉短期依赖关系。GRU 的计算过程如下:

# 转换器架构 (Transformers)

# 图神经网络 (GNNs)