Deep Learning

基本结构

神经元

神经元是神经网络的基本单元,它接收输入信号,经过加权处理后,输出一个信号。

\[ f(x) = \sigma(\sum_{i=1}^{n} w_i x_i + b) \]

激活函数

激活函数是神经网络的非线性部分,它的作用是引入非线性因素,使得神经网络可以拟合非线性函数;对应神经元中的 \(\sigma\)

常用的激活函数有:

ReLU计算速度快,在CNN中经常使用;sigmoid和tanh在RNN中经常使用。

损失函数

损失函数是神经网络的目标函数,它的作用是衡量神经网络的输出与真实值的差距。

常用的损失函数有:

优化器

全连接神经网络

全连接神经网络是最简单的神经网络,它的每一层都是全连接层,含多个隐藏层的全连接神经网络也称为深度神经网络 (Deep Neural Network, DNN)。

考虑其中的第\(L\)层和下一层\(L+1\)层;第\(L\)层的输出为 \(a^L\)是一个向量,其大小与第\(L\)层的神经元个数相同,设为\(N_L\)\(a^L\)是第\(L+1\)层的输入,经过加权处理后,输出为 \(z^{L+1}\),其大小与第\(L+1\)层的神经元个数相同,设为\(N_{L+1}\)\(z^{L+1}\)经过激活函数处理后,输出为 \(a^{L+1}\)

\[ \begin{aligned} z^{L+1}_j &= \left\langle w^{L+1}_j, a^L \right\rangle + b^{L+1}_j \\ a^{L+1}_j &= \sigma(z^{L+1}_j) \\ \end{aligned} \]

其中\(w^{L+1}_j\)是第\(L+1\)层第\(j\)个神经元的权重向量,其大小与第\(L\)层的神经元个数\(N_L\)相同,\(b^{L+1}_j\)是第\(L+1\)层第\(j\)个神经元的偏置,\(a^{L+1}_j\)是第\(L+1\)层第\(j\)个神经元的输出。设权重矩阵\(W^{L+1}\)的第\(j\)列为\(w^{L+1}_j\),则有

\[ \begin{aligned} W^{L+1}_{N_{L+1}\times N_L} &= \begin{bmatrix} w^{L+1}_1 & w^{L+1}_2 & \cdots & w^{L+1}_{N_{L+1}} \end{bmatrix}^T \\ &=\begin{bmatrix} w^{L+1}_{1,1} & w^{L+1}_{1,2} & \cdots & w^{L+1}_{1,N_L} \\ w^{L+1}_{2,1} & w^{L+1}_{2,2} & \cdots & w^{L+1}_{2,N_L} \\ \vdots & \vdots & \ddots & \vdots \\ w^{L+1}_{N_{L+1},1} & w^{L+1}_{N_{L+1},2} & \cdots & w^{L+1}_{N_{L+1},N_L} \end{bmatrix} \\ \end{aligned} \]

则有

\[ \begin{aligned} z^{L+1} &= W^{L+1} a^L + b^{L+1} \\ a^{L+1} &= \sigma(z^{L+1}) \end{aligned} \]

反向传播

反向传播是神经网络的训练算法,它的作用是根据损失函数的梯度,更新神经网络的参数,包括更新权重和偏置,依赖于链式法则。

设损失函数为\(L\),记第\(L\)层第\(j\)个神经元的梯度误差\(\delta^{L}_j\)\(\frac{\partial L}{\partial z^{L}_j}\),则有

\[ \begin{aligned} \frac{\partial L}{\partial w^{L+1}_{i} } &= \frac{\partial L}{\partial z^{L+1}_{i}} \frac{\partial z^{L+1}_{i}}{\partial w^{L+1}_{i}} = \delta^{L+1}_i a^{L} \\ \frac{\partial L}{\partial b^{L+1}_{i} } &= \frac{\partial L}{\partial z^{L+1}_{i}} \frac{\partial z^{L+1}_{i}}{\partial b^{L+1}_{i}} = \delta^{L+1}_i \\ \end{aligned} \]

根据链式法则,梯度误差间的关系为

\[ \begin{aligned} \delta^{L}_j &= \frac{\partial L}{\partial z^{L}_j} \\ &= \sum_{i=1}^{N_{L+1}} \frac{\partial L}{\partial z^{L+1}_i} \frac{\partial z^{L+1}_i}{\partial z^{L}_j} \\ &= \sum_{i=1}^{N_{L+1}} \frac{\partial L}{\partial z^{L+1}_i} \frac{\partial z^{L+1}_i}{\partial a^{L}_j} \frac{\partial a^{L}_j}{\partial z^{L}_j} \\ &= \sum_{i=1}^{N_{L+1}} \delta^{L+1}_i w^{L+1}_{i,j} \sigma^{\prime}(z^{L}_j) \\ &= \sigma^{\prime}(z^{L}_j) \sum_{i=1}^{N_{L+1}} \delta^{L+1}_i w^{L+1}_{i,j} \\ \delta^{L}&=\sigma^{\prime}(z^{L}) \odot (W^{L+1})^T \delta^{L+1} \end{aligned} \]

这里的\(\odot\)表示对应元素相乘,非矩阵乘法;\(\sigma^{\prime}\)表示激活函数的导数;\((W^{L+1})^T\)表示\(W^{L+1}\)的转置;\(\delta^{L+1}\)是第\(L+1\)层的梯度误差向量,其大小可理解为\(N_{L+1}\times 1\)

优化参数时使用梯度下降法,即

\[ \begin{aligned} w &\leftarrow w - \alpha \frac{\partial L}{\partial w} \\ b &\leftarrow b - \alpha \frac{\partial L}{\partial b} \\ \end{aligned} \]

写成矩阵的形式为

\[ \begin{aligned} W^{L+1} &\leftarrow W^{L+1} - \alpha \frac{\partial L}{\partial W^{L+1}} \\ &= W^{L+1} - \alpha \delta^{L+1} (a^{L})^T \\ b^{L+1} &\leftarrow b^{L+1} - \alpha \frac{\partial L}{\partial b^{L+1}} \\ &= b^{L+1} - \alpha \delta^{L+1} \\ \end{aligned} \]

梯度问题

梯度消失和梯度爆炸是深度神经网络的两个主要问题:根据梯度误差间的传递关系可知,若每层激活函数的导数过大或过小,梯度误差会随着层数的增加而指数级增大或减小,导致梯度爆炸或梯度消失。

卷积神经网络 (CNN)

输入通常是多通道的图像矩阵,再卷积过程,可以通过增加卷积核的个数来增加输出通道的数量。

卷积层

卷积层是卷积神经网络的基本单元,它的作用是提取输入的特征。卷积操作通过卷积核 (Kernel) 实现参数共享,输入的每个位置都使用相同的卷积核,从而减少参数量。

归纳偏置 (Inductive Bias) 是指模型在没有看到数据的情况下,对数据的假设。卷积操作的归纳偏置是局部连接 (Local Connectivity) 和权值共享 (Weight Sharing)。归纳偏置可以理解为归纳性偏好。

定义卷积操作为

\[ f(x,y)\star h = \sum_{i=-a}^{a} \sum_{j=-b}^{b} f(x-i, y-j) h(i,j) \]

在CNN中,每个卷积核实际上都是\(C^{\text{in}}\)\(a\times b\)的矩阵,其中\(C^{\text{in}}\)是输入通道的数量,\(a\)\(b\)是单一核矩阵的大小;对于每个输出通道,其结果是输入通道的卷积结果的和,再加上偏置,即

\[ \begin{aligned} z_{i\in C^{\text{out}}} &= \sum_{j\in C^{\text{in}}} f \star h_{i,j} + b_i \\ \end{aligned} \]

所以如果输入通道是\(C^{\text{in}}\),输出通道是\(C^{\text{out}}\),则实际上一共需要\(C^{\text{in}}\times C^{\text{out}}\)个二维矩阵,每个矩阵的大小是\(a\times b\),再加上\(C^{\text{out}}\)个偏置。

池化层

池化操作在卷积操作的基础上,对卷积结果进行降维,通常是在局部矩阵上取最大值或平均值。

反向传播时,需要还原出池化操作前等大的矩阵,再将梯度误差分配到局部矩阵中: - 若采用平均池化操作,则将梯度误差平均分配到局部矩阵中 - 若采用最大池化操作,则将梯度误差分配到局部矩阵中最大值所在的位置,其他位置为0

循环神经网络 (RNN)

生成对抗网络 (GAN)

自注意力网络 (Transformer)

训练技巧

梯度裁剪

正则化

在损失函数中加入正则项,可以减少过拟合。常见的正则项有:

权重初始化

Dropout

按一定比例随机丢弃神经元,即将神经元的输出设置为0,可以减少过拟合。

Batch Normalization

Layer Normalization

Learning Rate