机器学习_Part3
神经网络
开局的说教回顾
此处与前面重复的内容均不再讲解,只做去重后剩余内容的再说明
训练相关补充:
- 小批量随机梯度下降法
设训练集为 $\mathcal{D} = {(x_i,y_i)}_{i=1}^{N}$,损失函数为
- $ J(\theta) = \frac{1}{N}\sum_{i=1}^{N} \ell(f(x_i;\theta),y_i) $
将训练集划分为大小为 $b$ 的小批量 $B_t$,则第 $t$ 次迭代的梯度估计为
-
$ g_t = \frac{1}{\lvert B_t \rvert}\sum_{(x_i,y_i)\in B_t} \nabla_{\theta}\ell(f(x_i;\theta_t),y_i) $
-
提前停止法
若存在某轮 $t^*$ 使得
- $ J_{\text{val}}^{(t^*)} = \min_t J_{\text{val}}^{(t)} $ 则停止训练,并取
- $ \theta = \theta_{t^*} $
常见停止条件:
- $ J_{\text{val}}^{(t)} > J_{\text{val}}^{(t-p)} $ 其中 $p$ 为 patience。
数学基本概念:
-
标量
-
$ a \in \mathbb{R} $
-
向量
-
$ \mathbf{x} = (x_1,x_2,\dots,x_n)^T \in \mathbb{R}^n $
-
矩阵
-
$ A = [a_{ij}] \in \mathbb{R}^{m\times n} $
-
张量
-
$ \mathcal{T} \in \mathbb{R}^{d_1 \times d_2 \times \cdots \times d_k} $
-
范数
- $ \lVert \mathbf{x} \rVert_1 = \sum_{i=1}^{n}\lvert x_i \rvert $
- $ \lVert \mathbf{x} \rVert_2 = \left(\sum_{i=1}^{n}x_i^2\right)^{1/2} $
- $ \lVert \mathbf{x} \rVert_\infty = \max_i \lvert x_i \rvert $
- $ \lVert A \rVert_F = \left(\sum_{i}\sum_{j}a_{ij}^2\right)^{1/2} $
常用结构
-
logistic函数
- $ f(x) = \frac{1}{1+e^{-x}} $
-
$ f’(x) = f(x)(1-f(x)) $
- softmax
设 $\mathbf{z} = (z_1,\dots,z_K)$,则
-
$ \operatorname{softmax}(z_i) = \frac{e^{z_i}}{\sum_{j=1}^{K}e^{z_j}}, \qquad i=1,2,\dots,K $
-
sigmoid
指的是一类S形函数,通常直接说sigmoid就指的是其中最常见的logistic function
-
ReLu
- $ \operatorname{ReLU}(x) = \max(0,x) $
-
$ \operatorname{ReLU}’(x) = \begin{cases} 1, & x>0
0, & x<0 \end{cases} $ -
交叉熵损失
-
$ L = -\sum_{k=1}^{K} y_k \log \hat{y}_k $
-
KL散度
- $ D_{KL}(P\mathrel{\Vert}Q) = \sum_{x} P(x)\log \frac{P(x)}{Q(x)} = D_{KL}(p\mathrel{\Vert}q) = H(p,q) - H(p) $
人工智能与神经网络
一些历史
人工神经网络基础
对生物神经元的模拟
- 就像生物神经元中有很多输入(激励)一样,处理单元也有很多输入信号,并同时叠加到处理单元上。
- 处理单元以输出作为响应。
- 处理单元的输出像实际神经元一样,输出响应不但受
- 输入信号的影响,同时也受内部其它因素的影响:内部阈值或一个额外输入(称为偏置项)
- 处理单元的每一个输入都经过相关的加权,以影响输入的激励作用:
- 类似于生物神经元中突触的可变强度,它确定了输入信号的强度,一般把它看作连接强度的测度。
- 处理单元的初始加权可以根据确定的规则进行调节修正
- 类似于生物神经元中的突触强度可受外界因素影响
神经网络基础模型
单层前馈神经网络
- 结构:输入层 $\rightarrow$ 输出层,中间无隐层。
-
单个神经元输出:
- $ \mathbf{y} = \phi(W\mathbf{x}+\mathbf{b}) $
- 二分类常取:
- $ \phi(z)=\operatorname{sign}(z) \quad \text{或} \quad \phi(z)=\sigma(z) $
- 若采用感知机进行二分类学习,对误分类样本 $(\mathbf{x},y)$(其中 $y\in{-1,+1}$),常用更新规则:
- $ \mathbf{w} \leftarrow \mathbf{w} + y\mathbf{x} $ 若显式写出学习率 $\eta$ 与偏置 $b$,则可写为
- $ \mathbf{w} \leftarrow \mathbf{w} + \eta y\mathbf{x}, \qquad b \leftarrow b + \eta y $ 其思想是:当样本被误分类时,将权重朝着正确分类该样本的方向调整。
- 多分类常取:
- $ \mathbf{y}=\operatorname{softmax}(W\mathbf{x}+\mathbf{b}) $
- 本质:线性变换 $+$ 非线性激活。
万能近似定理
万能近似定理说明:在满足一定条件时,只要隐藏层神经元数量足够多,单隐层前馈神经网络(即两层神经网络)就能够以任意精度逼近定义在紧致区域上的任意连续函数(但其规模可能巨大)。
常见的神经网络结构
- 记忆网络(反馈网络):网络中存在反馈连接,当前时刻的输出会受到过去状态的影响,适合处理时序或序列数据。
- 图网络:以图结构数据为对象,通过节点之间的连接关系进行信息传播与特征聚合,适合处理社交网络、知识图谱等数据。
- 前馈神经网络:信息从输入层经过一个或多个隐藏层逐层传到输出层,层与层之间不存在反馈,是最基本的神经网络结构。
激活函数
隐藏单元的设计是一个非常活跃的研究领域,但目前还没有十分明确的统一指导原则。一般希望激活函数满足以下性质:
- 激活函数应是连续且可导的非线性函数(允许在少数点上不可导),这样可以直接利用梯度下降等数值优化方法学习网络参数。
- 激活函数及其导函数应尽可能简单,以提高前向计算与反向传播的效率。
- 激活函数的导函数值域应处于合适范围,不能过大也不能过小,否则容易影响训练的效率与稳定性,甚至导致梯度爆炸或梯度消失。
- 常用的激活函数主要包括 Sigmoid 类函数和 ReLU 类函数。
输出单元
输出单元的类型通常由具体任务决定,常见可分为以下几类:
- 线性输出单元:输出值可取任意实数,常用于回归任务。
- Sigmoid 输出单元:输出范围为 $(0,1)$,常用于二分类任务,可表示样本属于某一类的概率。
- Softmax 输出单元:输出为各类别的概率分布,且各分量之和为 $1$,常用于多分类任务。
- sign 输出单元:输出为 $-1$ 或 $+1$,常用于感知机这类硬判别二分类模型。
学习准则
学习准则的核心是通过定义合适的损失函数与目标函数,使网络参数在训练过程中不断优化。
- 常见损失函数:
- 平方误差损失:
- $ L = \frac{1}{2}(y-\hat{y})^2 $ 常用于回归问题。
- 交叉熵损失:
- $ L = -\sum_{k=1}^{K} y_k \log \hat{y}_k $ 常用于分类问题,特别适合与 Sigmoid 或 Softmax 输出单元配合使用。
- 对数损失:在二分类中常写为
- $ L = -\bigl[y\log \hat{y} + (1-y)\log(1-\hat{y})\bigr] $ 本质上是二分类情形下的交叉熵损失。
- 平方误差损失:
- 结构风险函数:
仅最小化训练误差容易导致过拟合,因此常在经验风险上加入正则化项,形成结构风险最小化目标:
- $ J(\theta) = \frac{1}{N}\sum_{i=1}^{N} \ell(f(x_i;\theta),y_i) + \lambda \Omega(\theta) $
其中,前一项为经验风险,后一项为正则化项,$\lambda$ 为权衡系数。常见正则化包括:
- $L_2$ 正则化:
- $ \Omega(\theta) = \lVert \theta \rVert_2^2 $ 有助于抑制参数过大,使模型更平滑。
- $L_1$ 正则化:
- $ \Omega(\theta) = \lVert \theta \rVert_1 $ 有助于得到稀疏参数。
因此,学习准则不仅要求模型在训练集上误差较小,还希望模型具有更好的泛化能力。
反向传播算法
反向传播算法(Back Propagation, BP)是训练多层前馈神经网络的经典方法,其基本思想是:先前向计算输出,再将误差从输出层向输入层逐层反向传播,并利用链式法则计算各参数的梯度。
主要步骤可整理为:
- 第一步:对输入样本进行前向传播,计算网络的预测输出值,并确定损失函数。
- 第二步:明确参数更新策略,例如梯度下降法:
- $ \theta’ \leftarrow \theta - \eta \nabla_\theta J(\theta) $
- 第三步:计算输出层输出的梯度,即损失函数对网络最终输出的偏导数。
- 第四步:结合输出层激活函数,计算损失函数对输出层输入的梯度。
- 第五步:根据输出层输入梯度,求出隐层到输出层连接权值及偏置的梯度。
- 第六步:将误差信号继续向前一层传播,计算隐层输出的梯度。
- 第七步:结合隐层激活函数,计算损失函数对隐层输入的梯度。
- 第八步:根据隐层输入梯度,求出输入层到隐层连接权值及偏置的梯度。
上述过程对多层网络可以继续递推,本质上就是重复“前向计算 + 误差反传 + 参数更新”的过程。
自动梯度计算
自动梯度计算的核心思想是:先把复杂函数分解为一系列最基本的算子,再利用链式法则自动求出整体函数对各个参数的梯度。
- 符号微分法应用于最基本的算子:对于加法、乘法、指数、对数、矩阵乘法等基本运算,可以直接写出它们的导数公式。
- 利用计算图:将整个计算过程表示成一个有向图,图中的节点表示变量或中间结果,边表示运算关系。
- 前向传播时,按照计算图顺序求出各节点的数值;反向传播时,再从输出端开始逐步回传梯度。
- 这样就可以高效地求出复杂模型中每个参数的偏导数,而不必手工推导整个大公式。
深度学习基础
卷积神经网络
卷积神经网络(Convolutional Neural Network, CNN)主要用于处理图像等具有网格结构的数据。与全连接前馈网络相比,它更适合从图像中提取局部特征。
在用全连接前馈网络处理图像时,主要存在以下两个问题:
- 参数太多:如果输入图像大小为 $100\times 100\times 3$,则一个神经元与输入层全连接时就需要 $30000$ 个权重参数。随着隐藏层神经元数量增加,参数规模会迅速膨胀,从而导致训练效率低、存储开销大,并且容易过拟合。
- 难以有效利用图像的局部结构特征:自然图像通常具有局部相关性以及一定程度的平移不变性,而全连接网络没有专门利用这种结构信息,因此特征提取效率较低。
卷积神经网络正是为了解决这些问题而提出的,其核心思想包括:
- 局部连接:每个神经元只与输入的局部区域相连,从而减少参数数量。
- 权值共享:同一个卷积核在整张图像上滑动使用,使得模型能检测不同位置上的相同局部模式。
- 池化操作:对局部区域进行下采样,进一步减少计算量,并增强特征的稳定性。
从数学上看,若输入特征图记为矩阵 $X$,卷积核记为矩阵 $W$,则二维卷积在位置 $(i,j)$ 处的输出可写为:
$ Y_{ij} = \sum_{u=1}^{K_h}\sum_{v=1}^{K_w} X_{i+u-1,\,j+v-1} W_{uv} + b $
其中,$X \in \mathbb{R}^{H\times W}$ 表示输入特征图,$W \in \mathbb{R}^{K_h\times K_w}$ 表示卷积核,$b$ 表示偏置,$Y_{ij}$ 表示输出特征图矩阵 $Y$ 在第 $i$ 行第 $j$ 列处的元素。卷积层的作用就是用卷积核在输入矩阵上滑动,从而提取局部模式。
卷积运算中还需要考虑步长(stride)和填充(padding):
- 步长:指卷积核每次在输入上移动的距离。步长越大,输出特征图尺寸越小,计算量也会减少;但步长过大可能丢失部分细节信息。
- 填充:指在输入边缘补零等操作,用来控制输出特征图大小,并保留边界信息。若不进行填充,卷积后特征图尺寸通常会缩小。
设输入尺寸为 $H\times W$,卷积核尺寸为 $K_h\times K_w$,上下左右总填充分别折算后记为 $P_h, P_w$,步长为 $S_h, S_w$,则输出特征图尺寸为:
$ H_{out} = \left\lfloor \frac{H + 2P_h - K_h}{S_h} \right\rfloor + 1, \qquad W_{out} = \left\lfloor \frac{W + 2P_w - K_w}{S_w} \right\rfloor + 1 $
常见地,当步长为 $1$ 且采用合适填充时,可以在保留空间尺寸的同时提取局部特征。
池化(Pooling)是卷积神经网络中的另一类重要操作,主要用于对特征图进行下采样,以减少计算量并增强特征的稳定性。常见的池化方式有最大池化(max pooling)和平均池化(average pooling)。
若池化窗口大小为 $p\times q$,则最大池化可表示为:
$ Y_{ij} = \max_{1 \le u \le p,\,1 \le v \le q} X_{i+u-1,\,j+v-1} $
平均池化可表示为:
$ Y_{ij} = \frac{1}{pq} \sum_{u=1}^{p}\sum_{v=1}^{q} X_{i+u-1,\,j+v-1} $
其中,$X$ 为输入特征图矩阵,$Y$ 为池化后的输出特征图矩阵。最大池化更强调局部最显著特征,平均池化则更强调整体平滑信息。
因此,卷积神经网络在图像识别、目标检测等任务中通常比普通全连接前馈网络更有效。
自编码器
核心思想:自编码器(Autoencoder)是一类通过“编码—解码”结构来学习数据表示的神经网络,其目标是将输入数据压缩到低维隐空间,再尽可能重构出原始输入。
设输入为 $x$,编码器记为 $f_{\theta}$,解码器记为 $g_{\phi}$,则编码和重构过程可表示为:
-
$ h = f_{\theta}(x) $
-
$ \hat{x} = g_{\phi}(h) = g_{\phi}(f_{\theta}(x)) $
其中,$h$ 为隐表示或潜在表示。自编码器希望 $\hat{x}$ 与原始输入 $x$ 尽可能接近,从而使隐层表示能够保留数据中的重要特征。
网络训练:自编码器通常采用最小化重构误差的方式进行训练,常见目标函数为:
- $ J(\theta,\phi) = \sum_{i=1}^{N} \ell\bigl(x_i,\hat{x}_i\bigr) $
其中,$ \hat{x}i = g{\phi}(f_{\theta}(x_i)) $。若输入为连续值数据,常用平方误差损失:
- $ \ell(x,\hat{x}) = \frac{1}{2}\lVert x-\hat{x} \rVert_2^2 $
若输入是二值数据,也可以使用交叉熵损失。训练完成后,编码器部分可以用于特征提取、降维、去噪等任务。
对抗生成网络
对抗生成网络(Generative Adversarial Network, GAN)由生成器和判别器两部分组成。生成器负责生成尽可能逼真的样本,判别器负责区分样本是真实数据还是生成数据,二者通过对抗训练共同提升性能。
其基本目标可写为:
- $ \min_G \max_D V(D,G) = \mathbb{E}{x\sim p{data}(x)}[\log D(x)] + \mathbb{E}_{z\sim p_z(z)}[\log(1-D(G(z)))] $
其中,$G$ 表示生成器,$D$ 表示判别器。GAN 常用于图像生成、图像修复和风格迁移等任务。
扩散模型
扩散模型(Diffusion Model)的基本思想是:先逐步向数据中加入噪声,将真实样本破坏为近似随机噪声;再训练模型学习逆过程,逐步去噪并恢复数据。
其前向加噪过程通常写为:
- $ q(x_t\mid x_{t-1}) = \mathcal{N}(x_t;\sqrt{1-\beta_t}x_{t-1},\beta_t I) $
模型学习逆过程:
- $ p_\theta(x_{t-1}\mid x_t) $
通过不断迭代去噪,最终可以从随机噪声生成高质量样本。扩散模型近年来在图像生成等任务中表现非常突出。
循环神经网络
循环神经网络(Recurrent Neural Network, RNN)是一类适合处理序列数据的神经网络。它在时刻 $t$ 的隐藏状态不仅依赖当前输入 $x_t$,还依赖上一时刻的隐藏状态 $h_{t-1}$,因此能够建模序列中的时间依赖关系。
RNN 的基本形式可写为:
-
$ h_t = \phi(W_{xh}x_t + W_{hh}h_{t-1} + b_h) $
-
$ y_t = W_{hy}h_t + b_y $
其中,$h_t$ 表示第 $t$ 个时刻的隐藏状态,$y_t$ 表示输出,$\phi$ 为激活函数。
BPTT(Back Propagation Through Time,时间反向传播)是训练 RNN 的主要方法。它可以看作将 RNN 在时间维度上展开为一个深层前馈网络,再利用反向传播算法计算各时刻参数的梯度。
长依赖问题:当序列很长时,误差信号在时间上传播过程中容易发生梯度消失或梯度爆炸,使得网络难以学习较早时刻的信息,因此标准 RNN 往往难以处理长期依赖关系。
LSTM(Long Short-Term Memory)是在 RNN 基础上提出的一种改进结构,通过引入记忆单元和门控机制来缓解长依赖问题。其核心计算可表示为:
-
$ f_t = \sigma(W_f x_t + U_f h_{t-1} + b_f) $
-
$ i_t = \sigma(W_i x_t + U_i h_{t-1} + b_i) $
-
$ \tilde{c}t = \tanh(W_c x_t + U_c h{t-1} + b_c) $
-
$ c_t = f_t \odot c_{t-1} + i_t \odot \tilde{c}_t $
-
$ o_t = \sigma(W_o x_t + U_o h_{t-1} + b_o) $
-
$ h_t = o_t \odot \tanh(c_t) $
其中,遗忘门 $f_t$、输入门 $i_t$、输出门 $o_t$ 用来控制信息的保留、写入和输出,$c_t$ 为记忆单元状态。
注意力与记忆机制
注意力机制(Attention)的核心思想是:在处理当前信息时,不再对所有输入一视同仁,而是根据相关性为不同输入分配不同权重,从而聚焦于更重要的信息。
在最基本的形式下,注意力可表示为:
-
$ \alpha_i = \frac{\exp(e_i)}{\sum_j \exp(e_j)} $
-
$ c = \sum_i \alpha_i h_i $
其中,$e_i$ 表示当前查询与第 $i$ 个输入之间的相关性得分,$\alpha_i$ 为注意力权重,$c$ 为加权求和后的上下文向量。
Transformer 是一种以注意力机制为核心的网络结构,它不依赖循环结构,而是主要通过自注意力机制来建模序列中任意位置之间的关系,因此具有更强的并行计算能力。
Tokenization(词元化)是将原始文本切分成模型可处理的基本单元(token)的过程,这些 token 可以是词、子词或字符。模型首先将 token 转换为向量表示,再进行后续计算。
位置编码(Positional Encoding)用于给序列中的每个 token 注入位置信息,因为 Transformer 本身不包含循环或卷积结构,无法天然感知顺序。常见的位置编码形式为:
$ PE_{(pos,2i)} = \sin\left(\frac{pos}{10000^{2i/d}}\right), \qquad PE_{(pos,2i+1)} = \cos\left(\frac{pos}{10000^{2i/d}}\right) $
其中,$pos$ 表示位置,$i$ 表示维度索引,$d$ 表示向量维数。
多头注意力(Multi-Head Attention)是将输入映射到多个不同的子空间中,分别计算注意力,再将结果拼接起来,从而使模型能够同时关注不同类型的关系。其基本形式可写为:
-
$ \operatorname{Attention}(Q,K,V) = \operatorname{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V $
-
$ \operatorname{MultiHead}(Q,K,V) = \operatorname{Concat}(head_1,\dots,head_h)W^{O} $
其中每个头满足
- $ head_i = \operatorname{Attention}(QW_i^{Q},KW_i^{K},VW_i^{V}) $
这种机制使 Transformer 在自然语言处理、计算机视觉等领域都取得了非常好的效果。