Techniques
Techniques
Activation Function 激活函数
原理: 激活函数为神经网络引入非线性。如果没有激活函数,无论网络有多少层,最终都只是输入的线性组合。
常见的激活函数都是非线性的,因此也会给神经元引入非线性元素,使得神经网络可以逼近其他的任何非线性函数,这样可以使得神经网络应用到更多非线性模型中。
| 激活函数 | 公式/特性 | 优缺点 & 场景 |
|---|---|---|
| Linear | 场景:通常只用于回归问题的输出层。如果在隐藏层用,网络就退化了。 | |
| Sigmoid | 优点:输出在 (0,1) 之间,适合概率。 缺点:有严重的梯度消失问题;输出不是 Zero-centered(导致收敛慢);计算 耗时。 | |
| Tanh | 优点:输出在 (-1,1) 之间,是 Zero-centered 的,比 Sigmoid 收敛快。 缺点:依然有梯度消失问题。 | |
| ReLU | 优点:解决了正区间的梯度消失;计算极快(只是判断是否大于 0);收敛速度远快于 Sigmoid/Tanh。 缺点:Dead ReLU 问题(负区间梯度为 0,神经元一旦坏死就再也无法激活)。 | |
| Leaky ReLU / PReLU | 解决 Dead ReLU。给负区间一个很小的斜率(如 0.01)。PReLU 则是把这个斜率 当作可学习的参数。 | |
| Swish | Google 提出的。 特点:平滑、非单调。在深层网络中往往比 ReLU 效果好一点点,但计算开销大。 | |
| Softmax | 多分类问题的输出层。它将输出 logits 归一化为概率分布,且所有概率之和为 1。 |
Skip/Residual Connections 残差连接
核心痛点:理论上网络越深越好,但实际上网络太深会导致“退化问题”(Degradation)—随着层数增加,准确率反而饱和甚至下降(不是过拟合,是训练不动)。
解决方案:
微软研究院提出的 ResNet(2015)引入了 的结构。
原理:
- 网络不再直接学习目标映射 ,而是学习残差 。
- Skip Connection (捷径):将输入 直接加到输出上。
为什么有效?
- 梯度高速公路:在反向传播时,梯度可以通过 这条路无损地传到前面的层,极大地缓解了梯度消失。
- 恒等映射 (Identity Mapping):如果某一层是多余的,网络只需要把 的权重训练为 0,那么输出就变成了 (也就是直接透传)。这意味着深层网络至少不会比浅层网络差。
解决的问题:
- 网络退化问题: 在深度网络中,随着层数增加,准确率反而下降。跳跃连接确保了网络至少能学习到恒等映射(Identity Mapping)。
- 梯度消失: 梯度可以通过 这一项直接反向传播,路径更短。
使用场景: ResNet 架构的核心,现在几乎是所有深层网络(包括 Vision Transformer 和 GPT)的标配。
Normalization 归一化
Batch Normalization (BN)
- 原理: 在 Batch 维度上计算均值和方差进行归一化。
- 公式:
- 场景: 常用于 CNN。因为它依赖 Batch Size,Batch 太小时效果较差。
Layer Normalization (LN)
- 原理: 在 Feature (隐藏层神经元) 维度上计算均值和方差。
- 场景: NLP/Transformer 的标配。由于 RNN/Transformer 输入长度不一,LN 不依赖 Batch 且对序列长度不敏感,表现更好。
- 解决的问题: 内部协变量偏移(Internal Covariate Shift),平滑损失函数曲面,允许使用更高的学习率。
Regularization 正则化
正则化的核心目标是解决 过拟合(Overfitting)。
过拟合现象:模型过于复杂,把训练集里的“噪声”和“随机波动”也当成了规律学了进去。就像背下了习题集的答案,但遇到新考试就懵了。
14世纪英国修士威廉·奥卡姆提出的著名哲学原理:"如无必要,勿增实体",在700年后的人工智能领域依然闪耀着智慧的光芒。这把无形的"剃刀"告诉我们:当两个理论具有相同的解释力时,更简单的那个往往更接近真理。这不仅是中世纪经院哲学的重要遗产,更成为现代科学方法论的重要基石。
L1
L1正则化的思想是在损失函数中额外加入模型所有参数的绝对值之和作为惩罚项。这样模型在训练过程中,会尽可能的让参数变小来降低Loss值,直到让某些参数为0。如果一个参数降为0,则等价于这个参数消失,起到了降低模型复杂度的作用。同样减小参数的值也是降低模型复杂度的一种方式。L1正则化的公式为:
其中θ是模型参数,λλ是控制正则化强度的参数,一般初始设置为1e-3或者1e-4。设置过大会导致模型欠拟合。在训练过程中可以进根据实际情况进行调整,调整原则为如果数据量越少,模型越复杂,输入特征越多,那么λ就越大。因为这些情况都更容易出现过拟合。反之则可以减小λ。
L2
L2正则化与L1正则化非常类似,它在损失函数中加入模型参数的平方和作为惩罚项。同样可以达到控制模型复杂度的效果。它的公式为:
L1正则化会让模型很多参数为0,也就是模型参数会变得稀疏。L2正则化会让模型参数变小,但是不会等于0。为什么会产生这种效果呢?
因为L1正则化每个参数是以绝对值的形式加入Loss函数,绝对值函数的导数在x大于0为1,x小于0为-1,在0处没有定义。所以它可以按照固定速度降低参数的绝对值,直到为0。L2正则化每个参数是以平方项的形式加入Loss函数,平方项的导数为2x2x,当xx越接近零,梯度会越小,所以参数只会接近0,而不会等于0。
当然调整参数过程大部分还是受原本Loss函数的影响。它和正则项一起优化出一个既有效又简单的模型来。L2正则化让所有参数均匀缩小,避免模型过度依赖某些特征,同时保留所有特征的贡献,适用于大多数场景。所以一般情况下都默认使用L2正则化,很少使用L1正则化。
l2_norm = 0.0
for param in model.parameters():
l2_norm += param.pow(2).sum()
loss = criterion(outputs, labels) + 1e-4 * l2_normDropout
原理: 在训练过程中,以概率 随机将一部分神经元的输出置为 0。
- 解决的问题: 过拟合 (Overfitting)。
- 核心逻辑:
- 集成效应: 每次训练都在训练不同的子网络,测试时相当于多个子网络的平均。
- 减少协同适应: 迫使每个神经元学习更鲁棒的特征,而不依赖于特定的其他神经元。
- 使用场景: 全连接层(Dense layers)。在现代 CNN 中由于 BN 已有正则化作用,Dropout 用得较少;但在 Transformer 的 Attention 之后仍经常使用。
注意: 测试(Inference)阶段必须关闭 Dropout,并将权重乘以 ,或使用 Inverted Dropout。
# 模型定义(加入 Dropout)
class NeuralNetwork(nn.Module):
def __init__(self):
super().__init__()
self.model = nn.Sequential(
nn.Linear(28 * 28, 128),
nn.ReLU(),
nn.Dropout(0.5),
nn.Linear(128, 128),
nn.ReLU(),
nn.Dropout(0.5),
nn.Linear(128, 128),
nn.ReLU(),
nn.Dropout(0.5),
nn.Linear(128, 64),
nn.ReLU(),
nn.Dropout(0.5),
nn.Linear(64, 10)
)
def forward(self, x):
return self.model(x)Weight Initialization 权重初始化
如果权重初始值太大,会导致梯度爆炸;太小则导致梯度消失。
- Xavier 初始化: 适用于 Sigmoid/Tanh。保持输入输出方差一致。
- He 初始化 (Kaiming Init): 适用于 ReLU。考虑了 ReLU 有一半区域为 0 的特性。
- 公式:
在深度学习中,参数初始化对模型的训练效果和收敛速度有重要影响。如果权重初始化不当(比如全部设为0或过大/过小的随机值),会导致梯度消失、梯度爆炸或训练缓慢等问题。为此,研究者提出了多种科学的初始化方法,其中 Xavier 初始化(也称 Glorot 初始化)是最经典的方法之一。
- 公式:
下面介绍几种常用的初始化方法:
零初始化(Zero Initialization)
- 所有权重设为 0。
- ❌ 不推荐:会导致所有神经元在前向传播中输出相同,反向传播时梯度也相同,无法打破对称性,网络无法有效学习。
随机初始化(Random Initialization)
- 用小的随机数(如从均匀分布或正态分布中采样)初始化权重。
- 例如:
W ~ N(0, 0.01)或W ~ U(-0.1, 0.1) - ✅ 比零初始化好,但若尺度不合适,仍可能导致梯度问题。
Xavier 初始化(Glorot Initialization)
由 Xavier Glorot 和 Yoshua Bengio 在 2010 年提出,适用于 Sigmoid、Tanh 等激活函数。
核心思想:
保持前向传播时各层的激活值方差一致,以及反向传播时梯度的方差一致,从而避免梯度消失/爆炸。
公式:
假设输入维度为 ,输出维度为
均匀分布版本(Xavier Uniform):
正态分布版本(Xavier Normal):
(注:部分实现中方差为 ,标准差为其平方根)
✅ 适用于使用 tanh 或 logistic(sigmoid) 激活函数的网络。
He 初始化(Kaiming Initialization)
由 Kaiming He 等人在 2015 年提出,专为 ReLU 及其变体(如 Leaky ReLU) 设计。
原因:
ReLU 会将一半的神经元输出置为 0,导致方差减半,因此需要更大的初始权重来补偿。
公式:
输入维度为
He Uniform:
He Normal:
✅ 在使用 ReLU 的现代 CNN 和 MLP 中广泛使用。
其他初始化方法
- LeCun 初始化:早期用于 Sigmoid-like 函数,类似 Xavier,但仅考虑输入维度。
- Orthogonal Initialization(正交初始化):使权重矩阵正交,有助于训练深度 RNN 或 ResNet。
- Sparse Initialization(稀疏初始化):只初始化少量连接,其余为 0,用于特定结构。
Dimensionality Reduction 降维
在深度学习中,降维 (Dimensionality Reduction) 的核心目标是减少特征数量(或通道数),在保留关键信息的同时降低计算复杂度、去除噪声或方便可视化。
深度学习中的降维技巧可以分为架构内置降维(如卷积神经网络中的操作)和表示学习降维(如自编码器)两大类。
- 如果你想在模型运行中减少计算开销,请使用 1x1 卷积 或 Pooling。
- 如果你想学习紧凑的数据表示,请使用 Autoencoder。
- 如果你处理的是离散类别数据,请使用 Embedding。
- 如果你需要观察聚类效果,请使用 t-SNE 或 UMAP。
池化 (Pooling)
原理: 池化通过在一个滑动窗口内进行下采样(Downsampling),减少数据的空间尺寸。
A. 最大池化 (Max Pooling)
- 做法: 取窗口内的最大值。
- 公式: ,其中 。
- 解决的问题: 提取最显著的特征(比如边缘或纹理),并提供平移不变性(即使物体稍微移动,最大值通常保持不变)。
B. 平均池化 (Average Pooling)
- 做法: 取窗口内的平均值。
- 公式: 。
- 解决的问题: 保留背景信息或整体特征,减少方差,使平滑效果更好。
C. 全局平均池化 (Global Average Pooling, GAP)
- 做法: 将整个特征图(Feature Map)直接压缩成一个值()。
- 解决的问题: 代替传统 CNN 末尾的全连接层(FC layer),极大减少参数量,有效防止过拟合。
- 使用场景: CNN 架构(如 VGG, ResNet)的中间层,用于降低计算量;GAP 常用于分类网络的最后一层。
1x1 卷积 (1x1 Convolution / Bottleneck)
这是 CNN(如 Inception, ResNet)中最常用的通道维度降维技巧,也被称为“Network in Network”。
原理: 使用 大小的卷积核对输入进行卷积。虽然它不改变空间尺寸(),但可以通过控制卷积核的数量来增加或减少通道数 ()。
计算公式:
设输入为 ,使用 个 卷积核,输出尺寸为 。
每个输出像素是输入同一位置 个通道值的线性组合。
解决的问题:
- 计算量爆炸: 在大尺寸卷积(如 )之前先用 降维,可以极大地减少参数量。
- 特征融合: 实现跨通道的信息交互。
使用场景: ResNet 的 Bottleneck Block,GoogLeNet 的 Inception 模块。
自编码器 (Autoencoders, AE)
原理: 神经网络试图学习一个恒等函数,使输出尽量等于输入。网络中间有一个非常窄的层(Bottleneck),强迫模型将原始高维输入压缩成低维向量(Latent Code)。
- 组成:
- Encoder ():
- Decoder ():
- 损失函数:
- 解决的问题:
- 非线性特征提取: 相比于 PCA 的线性映射,AE 可以通过激活函数捕获复杂的非线性流形结构。
- 使用场景: 图像压缩、去噪(Denoising AE)、异常检测(通过重构误差判断)。
嵌入层 (Embedding Layer)
原理: 将高维且稀疏的独热编码(One-hot Encoding)映射到低维且稠密的连续向量空间。
- 解决的问题:
- 维度灾难: 词表有 10 万个词时,One-hot 是 10 万维且极其稀疏。Embedding 可以将其降至 256 或 512 维。
- 语义捕捉: 降维后的空间中,语义相近的词(如“猫”和“狗”)距离更近。
- 使用场景: NLP 中的 Word2Vec、Transformer;推荐系统中的用户/物品特征处理。
可视化降维:t-SNE 与 UMAP
当我们需要直观查看高维特征(如模型最后一层的 Embedding)的分布情况时,通常会降维到 2D 或 3D。
| 技巧 | 原理 | 特点 |
|---|---|---|
| t-SNE | 基于概率分布,将高维近邻映射为低维近邻。 | 极擅长保留局部结构,容易产生清晰的聚类簇。 |
| UMAP | 基于黎曼几何和代数拓扑。 | 比 t-SNE 更快,且能更好地保留全局结构(不同簇之间的相对位置)。 |
线性降维基准:PCA (主成分分析)
虽然 PCA 是传统机器学习算法,但在深度学习中常用于预处理或特征分析。
- 原理: 通过正交变换,将一组可能存在相关性的变量转换成一组线性不相关的变量(主成分)。
- 公式: ,其中 是协方差矩阵的特征向量。
- 解决的问题: 去除特征间的相关性,压缩数据。
- 深度学习关联: 一个仅含单隐藏层且无激活函数的线性自编码器,其学习到的权重空间与 PCA 的子空间等价。
Attention
Attention 机制是一种广泛应用于深度学习中的技术,最初用于解决神经机器翻译任务中的长序列问题,现在已经扩展到各种任务中。
1. 按实现方法分类
1.1. Additive Attention
提出于 Bahdanau Attention(2014)。
使用一个可训练的前馈神经网络(通常是一层全连接层)计算注意力得分。
公式:
其中,是输入序列的编码器隐藏状态,是解码器隐藏状态。
1.2. Dot-Product Attention
提出于 Vaswani 等人的 Transformer 模型(2017)。
通过计算 Query 和 Key 向量的点积来获得注意力得分。
公式:
点积的结果常使用 Softmax 归一化,并可加入缩放因子,称为 Scaled Dot-Product Attention:
1.3. Multi-Head Attention
- 将输入划分为多个头,每个头独立计算 Attention,结果通过线性变换进行组合。
- 优点: 增强模型的表示能力,捕获不同子空间的特征。
2. 按功能分类
2.1. 自注意力(Self-Attention)
- Query、Key 和 Value 都来源于同一个输入序列。
- 常用于序列建模,特别是在 Transformer 中。
2.2. 跨注意力(Cross-Attention)
- Query 来自一个序列(如解码器),Key 和 Value 来自另一个序列(如编码器)。
- 通常用于 Encoder-Decoder 架构中。
2.3. 全局注意力(Global Attention)
- 考虑整个输入序列作为注意力的计算范围。
2.4. 局部注意力(Local Attention)
- 只在输入序列中选取一个子窗口,减少计算量,适用于长序列。
3. 按架构改进分类
3.1. Transformer Attention
- 核心特点: Scaled Dot-Product Attention 和 Multi-Head Attention 结合。
- 应用于自然语言处理、计算机视觉等任务中。
3.2. Soft Attention 和 Hard Attention
- Soft Attention: 通过 Softmax 函数得到注意力分布,可微,适合反向传播。
- Hard Attention: 选择单一注意力焦点,使用采样技术训练,非可微。
3.3. Sparse Attention
- 降低全局注意力的计算复杂度,仅关注部分输入。
- 例子:Longformer、BigBird。
3.4. Memory-Augmented Attention
- 引入外部记忆模块,帮助捕获更多上下文信息。
- 例子:Memory Networks。
3.5. Low-Rank Attention
- 使用低秩分解降低计算复杂度。
- 例子:Performer。
3.6. Dynamic Attention
- 根据上下文动态调整注意力计算范围和策略。
- 例子:Deformable Attention。
4. 应用场景中的变种
4.1. 自然语言处理
- BERT: 基于双向 Transformer 的模型。
- GPT: 采用单向自回归 Transformer。
4.2. 计算机视觉
- Vision Transformer(ViT): 使用 Self-Attention 替代卷积操作。
- Deformable DETR: 使用可变形注意力提高目标检测的效率。
4.3. 多模态学习
- CLIP: 文本和图像跨模态对齐的 Attention 模型。
- UNITER: 多模态统一表征。
5. 未来方向
- Efficient Attention: 专注于减少长序列中的计算量。
- Hierarchical Attention: 在不同层次上关注局部与全局特征。
- Hybrid Models: 与卷积网络等结合以提高模型性能。
