BasicKnowledge
[TOC]
方差
方差是统计学中的一个基本概念,用于度量一组数据的离散程度,即数据点与其均值之间的偏离程度。方差越大,数据点的离散程度越大;方差越小,数据点的离散程度越小。在神经网络的背景下,理解方差对于理解模型的信号传递、梯度更新等非常重要。
方差的定义
对于一组随机变量 ($X = {x_1, x_2, \dots, x_n}$),其方差 $\text{Var}(X)$ 定义为数据点到均值的平方差的平均值。公式为:
$$
\text{Var}(X) = \frac{1}{n}\sum_{i=1}^{n} (x_i - \mu)^2
$$
其中, $\mu$ 是数据的均值,定义为:
$$
\mu = \frac{1}{n}\sum_{i=1}^{n} x_i
$$
方差与梯度
使用链式法则,梯度的计算过程如下:
$$
\frac{\partial L}{\partial W_i} = \frac{\partial L}{\partial z} \cdot \frac{\partial z}{\partial x} \cdot \frac{\partial x}{\partial W_i}
$$
其中 $z = \text{ReLU}(x) $; $x = W_i \cdot a + b$ ,$W_i$ 是权重矩阵, $a$ 是输入, $b$ 是偏置。
梯度消失:
在使用 sigmoid 或 tanh 这类激活函数时,如果输入的方差很大,输出可能集中在接近 0 或 1(sigmoid)或者 -1 或 1(tanh)的极端值,集中在饱和区间,导致梯度$\frac{\partial z}{\partial x}$非常小,甚至接近于零,造成梯度消失。这种情况使得权重更新很慢或几乎不更新,网络无法有效学习。
梯度爆炸:
在使用 ReLU 这类激活函数时,方差较大的输入/权重可能导致前向传播中的输出方差很大,从而在反向传播中导致梯度的方差也增大。这可能引发梯度爆炸的问题,使得模型无法稳定训练。梯度放大原因的详细解释:
从损失函数到输出的梯度:$\frac{\partial L}{\partial z} $。这是损失函数关于网络输出的梯度。如果输出 z 很大且对应的损失较大,那么该梯度可能也会很大。
- 从激活到输入的梯度:$ \frac{\partial z}{\partial x} $。对于ReLU激活函数,梯度为1或0。当 x > 0 时,ReLU 的梯度为1。这意味着,假设输入 x 是正的,ReLU不会对梯度产生缩放或放大效应。
- 从输入到权重的梯度:$\frac{\partial x}{\partial W_i}$。这里的 $x = W_i \cdot a + b$ ,所以:$\frac{\partial x}{\partial W_i} = a$。当输入特征 a 非常大时,这个梯度也会很大。
激活函数
为什么需要激活函数?
如果不使用激励函数,那么每一层节点的输入都是上层输出的线性函数,无论你神经网络有多少层,输出都是输入的线性组合。相当于最原始的感知机(Perceptron),也没有隐藏层的效果,那么网络的逼近能力就非常有限。因此,引入非线性函数作为激励函数,能够使深层神经网络表达能力更加强大(不再是输入的线性组合,而是几乎可以逼近任意函数)。
GELU
GELU(Gaussian Error Linear Unit)是一种基于高斯误差函数的激活函数,能够自适应地学习输入的非线性关系。其公式为:
$$
\text{GELU}(x) = x \cdot \Phi(x)
$$
其中, $\Phi(x) $ 是标准高斯分布的累积分布函数(CDF),具体表示为:
$$
\Phi(x) = \frac{1}{2} \left[1 + \text{erf}\left(\frac{x}{\sqrt{2}}\right)\right]
$$
输入:x 是单一的标量或张量。
计算过程:
- x 通过高斯误差函数的累积分布函数 $\Phi(x)$ 进行变换。
- 计算结果是$x$和$\Phi(x)$的逐元素乘积。
特点:
GELU 平滑且连续,不会像ReLU那样存在硬性截止(即负数直接输出为0)。它根据输入值自适应地缩放和偏移,这使得它在某些任务中能比ReLU等其他激活函数表现更好。
SiLU / Swish
SiLU / Swish(Sigmoid Linear Unit),是一种平滑且非线性的激活函数。它结合了 sigmoid 的门控效果和线性部分的有界性。SiLU 的公式为:
$$
\text{SiLU|Swish}_{\beta}(x) = x \cdot \sigma(\beta x)
$$
SwiGLU
SwiGLU(Switch GLU) 是一种激活函数,用于神经网络中特别是 Transformer 模型的前馈神经网络(FFN)部分。它是一种改进的激活函数,通过结合线性变换和非线性激活来提高模型的表达能力和性能。SwiGLU 是 GLU(Gated Linear Unit)激活函数的变种。
GLU 通过一个门控机制(由 sigmoid 函数输出的值控制),调节线性变换的输出。GLU 的基本形式为:
$$
\text{GLU}(x) = (xW_1 + b_1) \odot \sigma(xW_2 + b_2)
$$
其中:
- ( x ) 是输入。
- ( $W_1$, $W_2$ ) 是权重矩阵。
- ( $b_1$, $b_2$ ) 是偏置向量。
- ( $\sigma$ ) 是 sigmoid 函数。
- ( $\odot$ ) 表示按元素乘积。
SwiGLU 则稍有不同,公式为:
$$
\text{SwiGLU}(x) = (xW_1) \odot \text{SiLU}(xW_2)
$$
其中:
- ( $W_1$,$ W_2$ ) 是权重矩阵(通常大小为 ( $d \times 4d$ ) 和 ( $d \times 4d$ ),如果前馈层扩展到 4 倍大小)。
- $\text{SiLU}(x) = x \sigma(x)$。其中 ( $\sigma(x)$ ) 是 sigmoid 函数。
特点:
非线性激活: SwiGLU 使用 SiLU 作为激活函数,提供了非线性变换。这比单纯的 ReLU 或 GELU 更复杂,捕捉了更多的模式和特征。
门控机制: 和 GLU 类似,SwiGLU 也具有门控机制,这使得模型能够动态地调整通道的开闭,从而更加灵活地控制信息流。
性能提升: 在一些 Transformer 变体中,SwiGLU 已被证明能够提升模型的性能,如改善模型的收敛性和表达能力。
权重初始化
适当的权重初始化方法可以防止神经网络的训练过程中出现梯度爆炸或消失的问题,进而减少过拟合的风险。例如,使用He初始化、Xavier初始化等方法。
He初始化和Xavier初始化是两种常用的神经网络权重初始化方法,它们的选择通常取决于激活函数的类型和网络层的性质。这些方法的目的都是在训练初期保持每层输出的方差尽量一致,防止梯度消失或爆炸问题,从而加速网络的收敛。
Xavier初始化
定义:Xavier初始化,也称为Glorot初始化,是通过使每层的输入和输出的方差相等来初始化权重。对于一个具有 ( $n_{in}$ ) 个输入神经元和 ( $n_{out}$ ) 个输出神经元的全连接层,权重初始化为一个均值为0、方差为以下值的正态分布或均匀分布:
均匀分布:
$$
W \sim \mathcal{U}\left(-\sqrt{\frac{6}{n_{in} + n_{out}}}, \sqrt{\frac{6}{n_{in} + n_{out}}}\right)
$$
正态分布:
$$
W \sim \mathcal{N}\left(0, \frac{2}{n_{in} + n_{out}}\right)
$$
适用条件:
- 激活函数:Xavier初始化适用于对称的激活函数,例如
tanh
、sigmoid
等。这些函数的输出范围是有限的,对权重的方差要求较为严格。 - 网络类型:适用于全连接层和卷积层等。特别是在深度较浅的网络或使用对称激活函数时效果较好。
He初始化
定义:He初始化是专为ReLU和ReLU变种激活函数设计的初始化方法,因为这些函数具有非对称性(负值部分输出为零)。对于具有 ( $n_{in}$ ) 个输入神经元的层,权重初始化为一个均值为0、方差为以下值的正态分布或均匀分布:
均匀分布:
$$
W \sim \mathcal{U}\left(-\sqrt{\frac{6}{n_{in}}}, \sqrt{\frac{6}{n_{in}}}\right)
$$
正态分布:
$$
W \sim \mathcal{N}\left(0, \frac{2}{n_{in}}\right)
$$
适用条件:
- 激活函数:He初始化主要适用于ReLU(Rectified Linear Unit)及其变种,如
Leaky ReLU
、Parametric ReLU
、ELU
等。这些函数的特点是非对称且可能输出很大的正值,因此需要较大的方差来保持信号的流动。 - 网络类型:适用于全连接层和卷积层。尤其在深度较大的网络中,使用ReLU类激活函数时,He初始化可以帮助防止梯度消失问题。
总结
- Xavier初始化:适用于对称激活函数(如
tanh
、sigmoid
),其主要目的是在整个网络中保持输入和输出的方差相同。 - He初始化:专为ReLU及其变种设计,适用于这些非对称激活函数,能够有效防止梯度消失问题。
梯度消失/梯度爆炸
梯度消失和梯度爆炸是深度神经网络训练中的两个常见问题,它们主要发生在反向传播过程中,影响模型的学习和收敛。
梯度消失
梯度消失是指在反向传播过程中,随着网络层数的增加,梯度逐渐变小,甚至接近于零。这使得参数更新非常缓慢,影响模型的学习效率,特别是在深层网络中,这种情况更为显著。
原因:
- 激活函数的特性:像
sigmoid
和tanh
这样的激活函数在输入绝对值较大时,导数趋近于零,导致梯度值变得非常小。 - 权重初始化不当:初始权重值过小也可能导致前向传播中输出值的幅度过小,从而在反向传播中梯度减小。
解决方法:
- 使用ReLU及其变种激活函数:ReLU(Rectified Linear Unit)激活函数在正数区域导数恒为1,有效缓解了梯度消失问题。此外,其他变种如Leaky ReLU、Parametric ReLU等在负值区域也有非零斜率,进一步减轻了梯度消失。
- 权重初始化方法:使用He初始化或Xavier初始化可以确保每层输出的方差在合理范围内,避免梯度消失。
- 批归一化(Batch Normalization):在每一层之后进行输入归一化,使得每一层的输入保持均值为0、方差为1,从而稳定梯度的分布。
梯度爆炸
梯度爆炸是指在反向传播过程中,随着网络层数的增加,梯度值变得非常大,导致权重更新不稳定,甚至使得模型无法正常训练。
原因:
- 激活函数的特性:即使是
ReLU
这样的激活函数,在输入值非常大时,输出值也会非常大,导致梯度的乘积在反向传播中迅速增长。 - 权重初始化不当:初始权重值过大,可能导致前向传播中信号的增长,从而使得反向传播中的梯度变得非常大。
解决方法:
- 梯度裁剪(Gradient Clipping):在反向传播时,将梯度的L2范数限制在某一阈值内。如果梯度的L2范数超过这个阈值,则将梯度缩放到阈值内。这样可以防止梯度过大。
- 使用适当的权重初始化:He初始化或Xavier初始化可以控制输出方差,防止前向传播中信号过大。
- 学习率调整:使用较小的学习率或自适应学习率方法(如Adam、RMSprop),可以减小梯度爆炸的影响,防止参数更新过大。
其他通用解决方法
- 使用正则化:如L2正则化(权重衰减),可以防止权重值变得过大,间接抑制梯度爆炸。
- 更好的优化算法:如Adam优化器,它能够自适应地调整学习率,有助于减缓梯度消失和爆炸问题。
过拟合
过拟合是指模型在训练数据上表现得很好,但在测试数据上表现不佳的现象,这通常是因为模型在训练数据上学习到了过多的细节和噪声,从而无法很好地泛化到新数据。
防止过拟合的方法
增加训练数据和数据增强
更多的数据通常有助于模型更好地学习数据的分布,而不是记住训练样本的细节。如果可能,获取更多多样化的训练数据。
通过对现有的训练数据进行变换(如旋转、翻转、缩放、裁剪、颜色变化等),可以增加训练数据的多样性,从而使模型更具鲁棒性。数据增强特别适用于计算机视觉任务。
正则化损失函数
正则化是在损失函数中增加一个惩罚项,用于限制模型参数的大小,从而防止过拟合。常见的正则化方法包括:
L1 正则化(Lasso):增加权重绝对值的和作为惩罚项。
L2 正则化(Ridge):增加权重平方和作为惩罚项。
Elastic Net:结合了L1和L2正则化的优点。
Dropout正则化
在每次训练迭代时,随机“丢弃”一些神经元,即暂时移除它们。这有助于减少神经元之间的依赖性,使模型更加鲁棒。Dropout通常在全连接层中使用,但也可以在卷积层中应用。
正则化的权重初始化
He初始化和Xavier初始化是两种常用的神经网络权重初始化方法,它们的选择通常取决于激活函数的类型和网络层的性质。这些方法的目的都是在训练初期保持每层输出的方差尽量一致,防止梯度消失或爆炸问题,从而加速网络的收敛。
早停法(Early Stopping)
在训练过程中监控验证集的损失,当验证集损失不再降低或开始上升时,停止训练。这有助于避免模型在训练集上过度拟合。
减小模型复杂度
通过减少模型的参数数量,如降低网络的层数、减少每层的神经元或卷积核数量,可以减少模型的复杂度,使其不容易在训练数据上过拟合。
Batch Normalization
Batch Normalization通过标准化每一层的输入来加速训练过程,同时对模型的轻微正则化效果有助于防止过拟合。
归一化技术
Batch Normalization
Batch Normalization (BN) 是一种深度学习技术,用于在训练过程中标准化神经网络的输入。其主要目的是加速训练过程并提高模型的稳定性和性能。
举例说明:
假设我们有一个图像分类任务,输入图像的像素值在 0 到 255 之间。我们将像素值缩放到 0 到 1 之间,但不同批次的数据分布可能不同。例如,一个批次的图像可能大部分像素值集中在 0.1 到 0.3 之间,而另一个批次的图像像素值集中在 0.7 到 0.9 之间。这种输入数据分布的变化会导致模型训练不稳定。
通过使用 Batch Normalization,我们可以在每层网络中对输入进行标准化,使得每层的输入在训练过程中保持均值为 0、方差为 1 的分布,从而加快收敛速度并提高模型的稳定性和性能。
具体实现:
计算批次均值和方差: 对于一个批次的输入 $x={x_1,x_2,…,x_m}$,其中 m 是批次的大小,每个输入的维度为 $d$,首先计算每个维度上的均值 $\mu$ 和方差 $\sigma^2$
$$
\mu = \frac{1}{m} \sum_{i=1}^{m} x_i
$$$$
\sigma^2 = \frac{1}{m} \sum_{i=1}^{m} (x_i - \mu)^2
$$将输入数据标准化为均值为 0,方差为 1 的分布,其中,$\epsilon$ 是一个很小的数,用于避免除零错误:
$$
\hat{x_i} = \frac{x_i - \mu}{\sqrt{\sigma^2 + \epsilon}}
$$引入两个可训练参数 $\gamma$ 和 $\beta$,分别用于缩放和平移标准化后的输入,以保证模型的表达能力,其中,$\gamma$ 和 $\beta$ 是与输入维度相同的参数:
$$
y_i = \gamma \hat{x_i} + \beta
$$
作用:
Batch Normalization 之所以对网络训练产生积极作用,主要有以下几个原因:
减轻内部协变量偏移(Internal Covariate Shift): 内部协变量偏移是指在训练过程中,由于前一层参数的变化,后续层的输入分布也发生变化,从而影响训练效率。
BN 通过标准化每一层的输入,使得每一层的输入分布更加稳定,从而减轻了层间输入分布变化带来的影响。这使得网络在训练时更容易收敛。
加速训练: 由于每一层的输入被标准化,梯度下降算法在训练过程中能够使用较大的学习率,从而加快训练速度。
提高模型的稳定性: BN 在一定程度上起到了正则化的作用,减少了过拟合的风险。这是因为每个批次的数据都被标准化,添加了噪声,从而增强了模型的泛化能力。
缓解梯度消失和梯度爆炸: 标准化后的输入使得数据的尺度更加一致,从而缓解了梯度消失和梯度爆炸问题,特别是在深层神经网络中。
实现:
1 |
|
Layer Normalization
在深度学习中,Layer Normalization(层归一化)是一种标准化技术,用于减轻训练过程中不同层之间的内部协变量偏移(internal covariate shift)现象。在Layer Normalization中,归一化操作是在特征维度上进行的,这与Batch Normalization不同。具体来说:
特征维度上的归一化:
假设我们有一个输入向量 $\mathbf{x} = [x_1, x_2, \ldots, x_d] $,其中 ( d ) 是特征的维数。在Layer Normalization中,归一化是在每个样本的特征维度上独立进行的。具体步骤如下:
- 计算均值和方差:
对于给定的输入向量 $\mathbf{x} $,计算其特征维度上的均值和方差:
$$
\mu = \frac{1}{d} \sum_{i=1}^{d} x_i
\
\sigma^2 = \frac{1}{d} \sum_{i=1}^{d} (x_i - \mu)^2
$$
归一化:
使用计算得到的均值和方差,对每个特征进行归一化:
$$
\hat{x}_i = \frac{x_i - \mu}{\sqrt{\sigma^2 + \epsilon}}
$$
其中 ( $\epsilon$ ) 是一个小的常数,用于防止分母为零。
缩放和平移:
归一化后的特征通常会进行缩放和平移,以增加模型的表达能力:
$$
y_i = \gamma \hat{x}_i + \beta
$$
其中, ( $\gamma$ ) 和 ( $\beta$ ) 是可学习的参数,分别用于缩放和平移。
总的来说,Layer Normalization是在每个样本的特征维度上进行归一化,而不是在样本维度上进行归一化,这使得它在处理不同批次大小(尤其是小批次或批次大小为1)的情况下表现更好。
Group Normalization
RMS Normalization
RMSNorm(Root Mean Square Layer Normalization)是一种标准化方法,用于替代传统的 LayerNorm(Layer Normalization)。它主要是为了减少 LayerNorm 中的计算开销,同时仍能保持模型训练的稳定性和性能。相比于 LayerNorm,它省略了对均值的去除,因此计算更为简洁。
给定一个输入向量 x ,RMSNorm 的计算步骤如下:
计算 RMS 值:$\text{RMS}(x) = \sqrt{\frac{1}{d} \sum_{i=1}^{d} x_i^2}$;其中, $d$ 是向量的维度,$ x_i$ 是向量中的第 $ i$ 个元素。
标准化输入:$y_i = \frac{x_i}{\text{RMS}(x)}$;这是对每个输入特征进行缩放,使其除以均方根值。
缩放和偏移:通常会引入可学习的参数 $ \gamma $ 和 $ \beta $ 来进一步调整归一化后的输出:$\text{RMSNorm}(x) = \gamma y + \beta$。
损失函数
回归任务
L1损失和L2损失是两种常见的损失函数,通常用于机器学习和深度学习中的回归问题。它们的主要区别在于计算损失的方法和对模型的影响。
L1损失(绝对误差损失)
L1损失函数的计算方式是预测值与真实值之差的绝对值的和:
$$
L1 = \sum_{i} |y_i - \hat{y}_i|
$$
其中,$y_i$是真实值,$\hat{y}_i $ 是预测值。
特点:
- 对离群点(outliers)更为鲁棒,因为离群点对总损失的贡献相对较小。
- L1损失倾向于产生稀疏的模型参数,这在某些应用中是一个优势,比如特征选择。
L2损失(二次误差损失)
L2损失函数的计算方式是预测值与真实值之差的平方和:
$$
L2 = \sum_{i} (y_i - \hat{y}_i)^2
$$
特点:
- 对离群点更为敏感,因为误差的平方会放大离群点对总损失的贡献。
- L2损失倾向于平滑的模型参数,使得模型在整体上更为平滑和稳定。
Huber损失
结合了L1和L2损失的优点,对离群点较为鲁棒。定义为:
$$
L_\delta (a) =
\begin{cases}
\frac{1}{2} a^2 & \text{for } |a| \le \delta \
\delta (|a| - \frac{1}{2} \delta) & \text{otherwise}
\end{cases}
$$
其中,$ a $是预测误差($a = y - \hat{y}$),$\delta $是一个超参数。
分类任务
交叉熵损失(Cross-Entropy Loss)
常用于分类问题,尤其是多分类问题。对于二分类问题,交叉熵损失定义为:
$$
L = -\frac{1}{N} \sum_{i=1}^{N} [y_i \log(\hat{y}_i) + (1 - y_i) \log(1 - \hat{y}_i)]
$$
其中,$y_i$是真实标签,$ \hat{y}_i $ 是预测的概率。
焦点损失(Focal Loss)
Focal Loss 是一种专门为解决类别不平衡问题而设计的损失函数,最早由 Facebook AI 研究院在 2017 年提出,用于目标检测中的 RetinaNet 模型。它通过减少易分类样本的损失,增加难分类样本的损失,使得模型更加关注难分类的样本。
定义
Focal Loss 是在交叉熵损失(Cross-Entropy Loss)的基础上引入一个调节因子,使得易分类的样本损失减小,难分类的样本损失增大。具体公式如下:
二分类 Focal Loss
对于二分类问题,标准的交叉熵损失函数如下,其中,( $p_t$ ) 表示模型对正确类别的预测概率。
$$
\text{CE}(p_t) = -\log(p_t)
$$
Focal Loss 在此基础上引入了一个调节因子 $(1 - p_t)^\gamma$ ,其中 ( $\gamma$ ) 是一个超参数,用于控制调节因子的大小。Focal Loss 的公式如下:
$$
\text{FL}(p_t) = - (1 - p_t)^\gamma \log(p_t)
$$
多分类 Focal Loss
对于多分类问题,标准的交叉熵损失函数如下,其中,( N ) 是类别数量,( $y_i$ ) 是目标类别的one-hot编码,( $p_i$ ) 是模型对第 ( $i$) 类的预测概率。
$$
\text{CE}(p_t) = - \sum_{i=1}^N y_i \log(p_i)
$$多分类问题下的 Focal Loss 公式为:
$$
\text{FL}(p_t) = - \sum_{i=1}^N y_i (1 - p_i)^\gamma \log(p_i)
$$
Focal Loss 的作用:
1.减小易分类样本的损失:当 $p_t$ 较大时,说明样本容易被正确分类,此时 $(1 - p_t)^\gamma$ 会变小,从而减小该样本的损失。
2.增加难分类样本的损失:当 $p_t$ 较小时,说明样本难以被正确分类,此时 $(1 - p_t)^\gamma $ 会变大,从而增加该样本的损失。
Focal Loss 的优势:
1.缓解类别不平衡问题:在目标检测任务中,背景类通常占据大部分样本,而前景类样本较少。Focal Loss 通过调节因子,使模型更关注前景类的难分类样本,缓解类别不平衡问题。
2.提升检测性能:由于 Focal Loss 增加了难分类样本的损失,模型在训练过程中会更倾向于关注这些样本,从而提升检测性能,尤其是在小目标检测和复杂背景下的检测性能。
VFL(Varifocal Loss)
VFL(Varifocal Loss)是一种改进的分类损失函数,用于处理目标检测中的分类任务。VFL Loss 旨在解决类别不平衡的问题,通过赋予正样本和负样本不同的权重来提高检测效果。
VFL Loss 的公式为:
$$
\mathcal L_{VFL} = - \sum_{i=1}^{N} \alpha_i [y_i \log(p_i) + (1 - y_i) \log(1 - p_i)]
$$
其中:
- ( $y_i$ ) 是真实标签(0 或 1),表示是否存在目标。
- ( $p_i$ ) 是预测的概率。
- ( $\alpha_i$ ) 是一个可变的焦点因子,用于调整不同样本的权重。
VFL Loss 的关键在于权重因子 $\alpha_i$ 的计算。权重因子 $\alpha_i$ 动态调整正负样本的权重,使得模型在训练过程中更关注那些置信度较低的样本。具体的权重计算方法如下:
对于正样本 ( $y_i = 1$ ):$\alpha_i = p_i$
对于负样本 ( $y_i = 0$ ):$\alpha_i = 1 - p_i$
通过这种权重调整机制,VFL Loss 实现了以下效果:
「这里的置信度是被分类为正样本的置信度」
对正样本的关注:当模型对正样本的置信度 $p_i$ 较低时,权重因子 $\alpha_i$ 也较低,损失较大。这样,模型会更关注这些置信度较低的正样本。
对负样本的关注:当模型对负样本的置信度 $p_i$ 较高时,权重因子 $\alpha_i$ 也较低,损失较大。这样,模型会更关注这些置信度较高的负样本。
对比损失(Contrastive Loss)
常用于度量学习中的孪生网络(Siamese Network)。对于一对样本,损失函数定义为:
$$
L = \frac{1}{2N} \sum_{i=1}^{N} [y_i d_i^2 + (1 - y_i) \max(0, m - d_i)^2]
$$
其中,$d_i$是样本对之间的距离,$m$是一个边界阈值。
KL散度(Kullback-Leibler Divergence)
常用于变分自编码器(VAE)等生成模型,用于度量两个概率分布之间的差异:
$$
D_{\text{KL}}(P || Q) = \sum_{i} P(i) \log \frac{P(i)}{Q(i)}
$$
SVM分类器
K-Means聚类
量化、剪枝、蒸馏
模型的量化、剪枝和蒸馏是深度学习模型优化的三种常见技术,旨在减少模型的计算成本和存储需求,同时尽量保持其性能。下面详细解释这些概念及其实现方法。
模型量化(Quantization)
模型量化是将模型权重和激活值从高精度表示(如32位浮点数)转换为低精度表示(如8位整数)的过程。这可以显著减少模型的存储空间和计算需求。
类型:
- 权重量化(Weight Quantization):仅量化模型的权重。
- 激活量化(Activation Quantization):量化模型在推理时产生的激活值。
- 混合量化(Mixed Precision Quantization):同时量化权重和激活值。
量化方法:
- 静态量化(Static Quantization):在推理之前进行量化。
- 动态量化(Dynamic Quantization):在推理过程中动态量化激活值。
- 训练时量化(Quantization-Aware Training, QAT):在训练过程中考虑量化误差,以提高量化后的模型性能。
实现步骤:
- 范围估计:确定权重和激活值的最小值和最大值。
- 缩放和移位:将浮点数映射到整数范围内。
- 量化:将浮点数转换为整数。
公式:
假设 ( x ) 是浮点数, ( x_q ) 是量化后的整数,量化过程可以表示为:
$$
x_q = \text{round}\left(\frac{x - x_{\min}}{x_{\max} - x_{\min}} \cdot (2^b - 1)\right)
$$
其中,$x_{\min}$ 和 $x_{\max} $ 分别是最小值和最大值,( b ) 是量化位数。
模型剪枝(Pruning)
模型剪枝是通过移除不重要的权重或神经元来减少模型的参数数量和计算需求的过程。
类型:
- 权重剪枝(Weight Pruning):移除权重值接近于零的连接。
- 结构化剪枝(Structured Pruning):移除整个神经元、卷积核或通道。
- 非结构化剪枝(Unstructured Pruning):逐个移除权重,但可能导致稀疏矩阵的产生。
剪枝方法:
- 全局剪枝(Global Pruning):基于全局阈值剪枝。
- 层级剪枝(Layer-wise Pruning):每层独立应用剪枝。
- 渐进剪枝(Iterative Pruning):逐步应用剪枝,并在每次剪枝后微调模型。
实现步骤:
- 训练初始模型。
- 评估权重的重要性。
- 根据阈值移除不重要的权重。
- 微调模型以恢复性能。
模型蒸馏(Distillation)
模型蒸馏是通过训练一个较小的学生模型来模仿较大且更复杂的教师模型的行为,从而达到压缩模型的目的。
步骤:
- 训练教师模型:首先训练一个高性能的教师模型。
- 生成软标签(Soft Targets):教师模型在训练数据上的预测输出,通常是带有温度参数 ( $T$ ) 的 softmax 输出。
- 训练学生模型:使用软标签和原始标签联合训练学生模型。
损失函数:
学生模型的损失函数由软标签损失和硬标签损失的加权和组成:
$$
\mathcal L = \alpha\mathcal L_{hard} + (1 - \alpha) \mathcal L_{soft}
$$
其中,( $\alpha$ ) 是权重系数,( $\mathcal{L}{hard}$ ) 是传统的交叉熵损失,( $\mathcal{L}{soft} $) 是带温度参数的软标签损失。
软标签损失:
$$
\mathcal{L}_{soft} = CrossEntropy\left(\frac{\exp(z_i / T)}{\sum_j \exp(z_j / T)}, \frac{\exp(z_i^T / T)}{\sum_j \exp(z_j^T / T)}\right)
$$
其中,( $z_i$ ) 是学生模型的logits,( $z_i^T$ ) 是教师模型的logits,( $T$ ) 是温度参数。
总结:
- 量化:减少模型精度,降低存储和计算需求。
- 剪枝:移除不重要的权重或神经元,减少参数数量和计算需求。
- 蒸馏:使用高性能的教师模型指导训练较小的学生模型,从而压缩模型。