Back

感知机模型#

感知机是一个简单的 两类线形分类模型,它是多层感知机的基本单元:

mlp

其中 sgn\text{sgn} 表示单位跃迁函数,其根据输入的正负返回 1 或者 0。我们也可以加上偏置 bb,来增加模型的表达能力(改变原先必然过圆心的决策边界)。

参数学习#

感知机的学习算法是一种 错误驱动 的在线学习算法。

定义训练集为 {(x(n),y(n))}n=1NRd×{1,+1}\{(x^{(n)},y^{(n)})\}_{n=1}^N\subset\mathbb{R}^d\times\{-1,+1\},初始化权重向量 w0w\leftarrow 0,然后每次每次分错一个样本时,即模型预测标签和原标签符号相反的时候,数学表达为 ywx<0yw^{\top}x<0,就用这个样本来更新权重:

ww+yxw\leftarrow w+yx

根据感知机收敛定理可以知道,如果训练集线形可分,则权重更新的次数不超过 (Rγ)2(\frac{R}{\gamma})^{2}

  • 数据集必须线形可分才能保证收敛;
  • 只能表达与、或、非基本组件、不能表达非线性的异或。

激活函数#

激活函数 g()g(\cdot) 对神经元的输出进行 非线性变换,增强网络的表达能力。

  • 一个激活函数是 饱和 的意味着 limzg(z)=0\lim_{|z|\to\infty}|\nabla g(z)|=0
  • 一个激活函数是 零中心化 的意味着它的输出是在零点附近的。

多层感知机#

多层感知机是一种 前馈神经网络,它由 输入层隐藏层输出层 组成。我们知道,通过与、或、非基本元件的组合可以表达任意复杂的布尔表达式(这也正是多层的由来)。但是可表达并不代表该模型是可学习的,因为 默认的感知机模型的激活函数是没有梯度的,无法通过反向传播算法收敛。

mlp

  • zi(l)z_i^{(l)} 表示第 ll 层第 ii 个神经元,其为 (l1)(l-1) 层的神经元与权重的加权和加上偏置 bib_i。称为 净输入
  • ai(l1)a_i^{(l-1)} 表示第 ll 层第 ii 个神经元激活之后的值。称为 激活值
  • θij(l)\theta_{ij}^{(l)} 表示第 ll 层的神经元与 (l+1)(l+1) 层神经元之间的权重,其中 ii 表示 (l+1)(l+1) 层的第 ii 个神经元,jj 表示第 ll 层的第 jj 个神经元。

若是分类问题,则最后一层使用 softmax 函数。若是回归问题,则不使用激活函数。

Softmax 回归#

z=wxz=w^\top x。给定训练集 D={(xi,yi)}i=1m{1,2,,k}\mathcal{D}=\{(x_i,y_i)\}_{i=1}^m\in\{1,2,\cdots,k\} 。第 ii 个样本属于类别 jj 的后验概率为:

y^=p(yi=jxi)=[p(yi=1xi;w)p(yi=2xi;w)p(yi=kxi;w)]=1j=1kexp(zj(l))[exp(z1(l))exp(z2(l))exp(zk(l))]\hat{y} = p(y_i=j | x_i) = \begin{bmatrix} p(y_{i} = 1 | x_{i}; w) \\ p(y_{i} = 2 | x_{i}; w) \\ \vdots \\ p(y_{i} = k | x_{i}; w) \end{bmatrix} = \frac{1}{\sum_{j=1}^{k} \exp(z_j^{(l)})} \begin{bmatrix} \exp(z_1^{(l)}) \\ \exp(z_2^{(l)}) \\ \vdots \\ \exp(z_k^{(l)}) \end{bmatrix}

其中分母项为输出的所有类别概率之和。使用 softmax 的好处是能够 将离散的连续值转换为和为 1 的概率,概率最高的就是输入样本的类别。但是坏处是涉及指数运算,会有数值稳定性问题,解决方法就是减去输入中最大的值:

p(yi=jxi)=exp(zizu)j=1kexp(zjzu),u=argmax(zj)p(y_i=j|x_i)=\frac{\exp (z_i-z_u)}{\sum_{j=1}^k\exp(z_j-z_u)},\hspace{0.2cm}u=\arg\max(z_j)

下面通过多伯努利变量的最大似然估计来得出交叉熵损失函数。假设所有样本独立,且样本 ii 属于类别 jj 的后验概率为 P(yi=jxi;w)P(y_i=j\mid x_i;w),那么 mm 个样本在所有类别上的联合概率为:

i=1mj=1kP(yi=jxi;w)I{yi=j}\prod_{i=1}^m\prod_{j=1}^kP(y_i=j | x_i;w)^{I\{y_i=j\}}
  • I{yi=j}I\{y_i=j\} 表示当样本 ii 的真实类别为 jj 的时候,返回 1。

举例来说,训练集有 2 个样本,总共有 3 类。假设第一个样本为第一类,第二个样本为第三类,那么联合概率为:

$$
p(y_1=1\mid x_1)\times p(y_2=3\mid x_2)
$$

其余结果都因为 I{yi=j}I\{y_i=j\} 而被忽略。

那么参数 ww 在训练集 D\mathcal{D} 上的似然函数为:

p(Dw)=i=1mj=1kP(yi=jxi,w)I{yi=j}p(\mathcal{D}|w)=\prod_{i=1}^m\prod_{j=1}^kP(y_i=j | x_i,w)^{I\{y_i=j\}}

最大化似然函数等价于最小化负对数似然函数:

argminwlogp(Dw)=1mi=1m[j=1kI{yi=j}logP(yi=jxi;w)]=1mi=1m[j=1kI{yi=j}logexp(zi(l))j=1kexp(zj(l))]\begin{aligned} \arg\min_{w}-\log p(\mathcal{D}|w)&=-\frac{1}{m}\sum_{i=1}^m\left[\sum_{j=1}^k I\{y_i=j\}\cdot\log P(y_i=j|x_i;w)\right] \\ &=-\frac{1}{m}\sum_{i=1}^m\left[\sum_{j=1}^k I\{y_i=j\}\cdot\log \frac{\exp(z_i^{(l)})}{\sum_{j=1}^{k}\exp {(z_j^{(l)})}}\right] \end{aligned}

实际上就和多分类问题的交叉熵损失一致了。

Softmax 参数学习#

多层感知机参数学习#

多层感知即的参数学习是基于反向传播算法(BackPropagation),它的主要思想是利用链式法则来求每一层参数的偏导数。主要分为以下三步:

  • 前馈计算每一层的净输入 z(l)z^{(l)} 和激活值 a(l)a^{(l)} 直到最后一层;
  • 反向传播计算每一层的误差项 δ(l)\delta^{(l)}
  • 计算每一层参数的偏导数,并更新参数。

a(l)=g(z(l))a^{(l)}=g(z^{(l)}),那么净输入和激活值的计算为:

z(l)=w(l)a(l1)+b(l)a(l)=g(w(l)a(l1)+b(l))z^{(l)}=w^{(l)}a^{(l-1)}+b^{(l)} \quad a^{(l)}=g(w^{(l)}a^{(l-1)}+b^{(l)})

根据链式法则 Lzj(l+1)ai(l)zi(l)\nabla \mathcal{L} \rightarrow \nabla z^{(l+1)}_j \rightarrow \nabla a^{(l)}_i \rightarrow \nabla z^{(l)}_i 我们可以得到误差项的递推公式,从而求出损失函数对隐藏层中单个神经元的误差:

δi(l)=zi(l)L(w,b)=j=1s(l+1)L(w,b)zj(l+1)zj(l+1)ai(l)ai(l)zi(l)=j=1s(l+1)δj(l+1)ai(l)[i=1s(l)wji(l+1)ai(l)+bj(l+1)]净输入计算公式g(zi(l))=j=1(l+1)δj(l+1)wji(l+1)g(zi(l))\begin{aligned} \delta^{(l)}_{i}&=\frac{\partial}{\partial z_{i}^{(l)}} \mathcal{L}(w,b) \\ &=\sum_{j=1}^{s_{(l+1)}}\frac{\partial \mathcal{L}(w,b)}{\partial z_{j}^{(l+1)}} \cdot \frac{\partial z_{j}^{(l+1)}}{\partial a_{i}^{(l)}} \cdot \frac{\partial a_{i}^{(l)}}{\partial z_{i}^{(l)}} \\ &= \sum_{j=1}^{s_{(l+1)}}\delta^{(l+1)}_{j} \cdot \frac{\partial}{\partial a_{i}^{(l)}} \underbrace{\left[\sum_{i=1}^{s_{(l)}} w_{ji}^{(l+1)} a_{i}^{(l)}+b_{j}^{(l+1)}\right]}_{净输入计算公式} \cdot g^{\prime}(z_{i}^{(l)}) \\ &= \sum_{j=1}^{(l+1)}\delta_{j}^{(l+1)} w^{(l+1)}_{ji} g^{\prime}(z_{i}^{(l)}) \end{aligned}

延续上面的计算方法,我们可以得到损失函数对参数 wwbb 的偏导数:

wij(l)L(w,b)=L(w,b)zi(l+1)zi(l+1)wij(l)=aj(l)δi(l+1)bi(l)L(w,b)=L(w,b)zi(l+1)zi(l+1)bi(l)=δi(l+1)\begin{aligned} \frac{\partial}{\partial w_{ij}^{(l)}}\mathcal{L}(w,b)&=\frac{\partial \mathcal{L}(w,b)}{\partial z_i^{(l+1)}}\cdot \frac{\partial z_i^{(l+1)}}{\partial w_{ij}^{(l)}}=a_j^{(l)}\delta_i^{(l+1)} \\ \frac{\partial}{\partial b_i^{(l)}}\mathcal{L}(w,b)&=\frac{\partial\mathcal{L}(w,b)}{\partial z_i^{(l+1)}}\cdot \frac{\partial z_i^{(l+1)}}{\partial b_i^{(l)}}=\delta_i^{(l+1)} \end{aligned}

最后就是根据梯度下降的公式进行参数更新直至模型收敛。

自动微分#

自动微分的基本原理是所有的数值计算都可以分解为一些基本操作,包括加减乘除和一些初等函数等,然后利用链式法则来自动计算一个复合函数的梯度。

自动微分

上图描述的是复合函数 f(x;w,b)=1/(exp[(wx+b)]+1)f(x;w,b)={1} / ({\exp\left[-(wx+b)\right]+1}) 的计算图,表示将复合函数拆分成 6 个基本操作 hh。计算完成后按照链式法则计算梯度。

实用训练技巧#

小批量随机梯度下降#

小批量随机梯度下降算法的改进在于将梯度转换为随机梯度,梯度的计算是在一个 小批量随机采样mm 条样本上进行,而不是默认的整个样本集(每个 epoch 对数据集进行 shuffle, 然后按顺序进行无放回采样,引入随机性,且能保证每条样本都能读到)。

1mi=1mwij(l)L()1mwij(l)L()\frac{1}{m}\sum_{i=1}^{m}\frac{\partial}{\partial w^{(l)}_{ij}}\mathcal{L}(\cdot) \quad \rightarrow \quad \frac{1}{m}\frac{\partial}{\partial w^{(l)}_{ij}}\mathcal{L}(\cdot)

这样做的好处就是能够逃离鞍点且计算效率更高,但它不能很好地逃离局部极值。

SGD with Momentum 很好的解决了这一点,它在计算的时候考虑了梯度在 时间上的滑动平均

wij(l)=wij(l)ηΔΔ=βΔ+(1β)wij(l)L(w)\begin{aligned} w_{ij}^{(l)}&=\boldsymbol{w}_{ij}^{(l)} -\eta\Delta\\\Delta&=\beta\Delta+(1-\beta)\frac{\partial}{\partial w_{ij}^{(l)}}\mathcal{L}(w) \end{aligned}

其中 β\beta 是冲量参数,一般取 0.9。后续许多算法的改进(RMSProp、Adam)多数都借鉴了冲量的思想。

迭代(iteration)和回合(epoch)的概念:

epoch=mb×iteration\text{epoch}=\frac{m}{b} \times \text{iteration}

其中:mm 表示样本数量,bb 表示批量大小。可以看出一个回合包含多轮迭代,一个回合遍历了一遍完整数据集。

梯度消失和爆炸#

梯度消失 指反向传播的时候激活函数的梯度太小,导致传播的时候网络浅层的权重无法更新。解决办法为:

  • 使用 ReLU 激活函数、合适的归一化方法、He 初始化。

梯度爆炸 指反向传播的时候深层网络梯度非常大,参数更新非常迅速,导致训练不稳定。解决办法为:

  • 使用梯度裁剪、Adam 优化算法、Xavier 初始化。

学习率衰减 / 预热#

学习率是基于梯度算法中的一个重要超参数,它决定了模型收敛的稳定性和速度。

  • 学习率太大会导致参数更新过快,从而错过最优解;
  • 学习率太小会导致参数更新过慢,从而训练时间过长;

经验想法是说一开始保持较大的学习率来保证收敛速度,在收敛到接近最优点的时候采用较小的学习率。

学习率衰减 指的是学习率按照迭代周期 / 回合进行衰减,常用的衰减方法有:

  • 固定步长衰减(StepLR) - 每隔固定回合将学习率乘上衰减系数(0.1);
  • 余弦衰减(CosineAnnealingLR) - 学习率按余弦曲线从初始值平滑下降到最小值;
  • 自适应衰减(ReduceLRonPlateau) - 监控验证集指标,当它不再改善的时候自动降低学习率。

学习率预热 指的是一种在训练初期(总回合的 5% ~ 10%)逐渐增大学习率的策略,目的是避免模型在初始阶段因参数随机初始化后直接使用较大学习率导致的训练不稳定问题。

  • 避免初始梯度爆炸;
  • 稳定归一化方法中的统计量;
  • 提升大模型训练效率和稳定性。

权重衰减#

权重衰减指的是在每次参数更新的时候,引入一个衰减系数:

wt(1β)wt1ηtL(wt1)w_t \leftarrow(1-\beta)w_{t-1}-\eta\nabla_t\mathcal{L}(w_{t-1})
  • β\beta 表示衰减系数,通常为 0.0005。

在 SGD 当中,权重衰减相当于 2\ell_2 正则化。但在 Adam 中,设置衰减系数会造成权重衰减与自适应学习率耦合,导致效果不佳。可以使用 AdamW 优化器。

丢弃法#

Dropout 是一种随机正则化方法,它的动机是包含大量神经元的网络的参数其实是饱和的。很容易过拟合,所以可以在训练过程中 随机丢弃一部分神经元(对隐藏层输出置 0),从而减少模型的复杂度,防止过拟合。

具体来说,Dropout 会以概率 pp 随机丢弃一部分神经元,其余神经元的输出乘以 11p\frac{1}{1-p}。从而 保持整体期望值不变。它背后的思想实际上是集成学习。

dropout

而在测试 / 正常使用的时候,不再随机置 0 的原因:确保模型的输出稳定且充分利用训练时学到的所有信息。

参数初始化#

  • 预训练初始化 - 使用大规模训练的网络的参数作为起点;
  • 高斯分布初始化 - 使用高斯分布对每个参数进行初始化;
  • Xavier 初始化 - var(w)=1/nin\text{var}(w)=1/n_{in},适配 sigmoid 函数;
  • He / Kaiming 初始化 - var(w)=2/nin\text{var}(w)=2/n_{in},适配 ReLU 函数。

多层感知机的可表达性#

  • Shallow MLP - 单隐藏层(浅层)MLP 只要宽度足够,可以以任意精度逼近 任意连续函数
  • Role of Depth - 深层网络通过逐层非线性变换,逐步提取 从低级到高级的特征
  • Role of Width - 提升网络每一层的特征表达能力,允许同时捕捉更多模式,但 无法捕捉层次信息
  • Linear Regions - 输入空间被划分成多个线性区域。线性区域数量随深度指数增长 / 宽度多项式增长;
  • Convex Polytopes - 多层叠加后,网络的决策边界由多个超平面交叠形成的 凸多面体 组合而成。

通用逼近定理表示神经网络的学习能力可以去近似一个给定的连续函数,但是没有说明如何找到这个函数以及是否是最优的。

MLP-Mixer#

MLP-Mixer

MLP-Mixer 是一种基于多层感知机的视觉模型,它仅通过 MLP 实现图像特征的高效提取和融合。它先将输入图像分成若干 patch,对每个 patch 通过全连接层转换为特征嵌入,经过若干 Mixer 层处理后,通过全局平均池化和输出全连接层进行分类。

Mixer 层由两种 MLP 层组成,分别是 Token-mixing 和 Channel-mixing。

Token-mixing - 融合每个通道的空间信息,如 MLP1 所示:

U,i=X,i+W2σ(W1LayerNorm(X),i), for i=1C.\mathbf{U}_{*,i}=\mathbf{X}_{*,i}+\mathbf{W}_2\sigma\left(\mathbf{W}_1\operatorname{LayerNorm}(\mathbf{X})_{*,i}\right),\quad\mathrm{~for~}i=1\ldots C.

Channel-mixing - 融合每个位置的通道信息,如 MLP2 所示:

Yj,=Uj,+W4σ(W3LayerNorm(U)j,), for j=1S.\mathbf{Y}_{j,*}=\mathbf{U}_{j,*}+\mathbf{W}_4\sigma\left(\mathbf{W}_3\operatorname{LayerNorm}(\mathbf{U})_{j,*}\right),\quad\mathrm{~for~}j=1\ldots S.

作者设置的模型参数为:

MLP-Mixer 超参数

MLP-Mixer 模型结构上与卷积层非常接近。输入 patch 的全连接层可以看成卷积核和步长都为 patch 大小的常规卷积,而 Mixer 层可以看成参数共享的深度可分离卷积。

Credit#

多层感知机
https://k1tyoo.ink/blog/dl/mlp
Author K1tyoo
Published at January 8, 2025