深度学习的概念们
张量(Tensor)
张量是深度学习中用于存储和计算数据的基本数据结构,可以把它理解为高维数组的泛化。
定义和结构
张量是一个带有形状(shape)和数值(data)的多维数组结构,0 维张量是标量,1 维张量是向量,2 维张量是矩阵,高阶张量就是三维及以上。
名称 | 数学维度 | 举例 |
---|---|---|
标量 | 0D | 5 |
向量 | 1D | [1, 2, 3] |
矩阵 | 2D | [[1, 2], [3, 4]] |
三维张量 | 3D | [[[...], [...]], [...]] |
n 维张量 | nD | 形如 shape=(2, 3, 28, 28) |
用法
用法 | 描述 |
---|---|
表示数据 | 各种类型的输入数据(图像、文本、音频、视频等),支持多维结构 |
表示模型参数 | 网络中的权重、偏置、卷积核等参数 |
数值计算 | 所有计算(矩阵乘法、卷积、激活、归一化等)的基本单位 |
自动求导 | 追踪计算图,实现反向传播和梯度更新 |
GPU 加速 | 适配并行计算,可高效运行在 GPU 上 |
高维数据操作 | 提供强大的维度变换、索引、切片、广播等操作,方便处理复杂结构 |
神经网络(Neural Network)
神经网络是一个由大量简单计算单元(称为“人工神经元“或“节点”)分层互联而成的计算模型。
基本组成单元(神经元/节点)
- 输入: 接收来自前一层或其他源的数据(特征)和权重
- 计算: 对输入进行加权求和,并加上一个偏置(bias),这个值代表该节点接收到的“总刺激”
- 激活: 将加权求和的结果传入一个非线性激活函数(如 ReLU、Sigmoid、Tanh)。激活函数是神经网络具有强大表达能力、避免退化为线性模型的关键,它决定该节点是否“激活”以及激活的强度
- 输出: 将激活函数处理后的值传递给下一层神经元
层级结构
- 输入层: 接收原始数据(如图像像素值、文本编码、传感器数据等),每个节点对应一个输入特征
- 隐藏层: 位于输入层和输出层之间,可以有一层或多层,用于对特征进行层层变换和抽象提取,隐藏层的节点数量及其连接方式决定模型的容量和复杂度,是信息处理的核心区域,特征在此逐步被抽象化
- 输出层: 产生最终的预测结果(如分类类别、数值、概率分布等)。激活函数通常根据任务而定,例如:Sigmoid 用于二分类概率,Softmax 用于多分类概率,线性回归则可能不使用激活函数
层与层之间的节点连接可以是全连接(即每个节点与下一层所有节点相连),也可以采用其他连接方式(如卷积)。每条连接都对应一个权重(Weight),它是神经网络的核心参数,表示某个输入特征对当前节点的重要性。每个节点还会有一个偏置(Bias),这是一个独立的可学习参数,相当于一个“激活门槛”,即便输入总和为零也能激活节点。
神经网络的运行原理
神经网络的运行机制围绕两个核心过程展开:前向传播(Forward Propagation) 和 反向传播(Back Propagation)。
- 前向传播: 原始输入数据从输入层开始,逐层传递。在每一层,每个节点对输入进行加权求和、加偏置并通过激活函数处理,最终到达输出层,得出模型的预测结果。其目的是计算给定输入下的输出,即预测值。
- 学习(训练)机制:
首先定义一个损失函数(如均方误差 MSE、交叉熵 Cross-Entropy),用于衡量预测值与真实目标之间的差距(损失)。
接着,通过反向传播算法计算损失函数对网络中每一个权重和偏置的梯度(Gradient),这个梯度表示为了减小损失,该参数应如何调整。
然后利用这些梯度,通过优化算法(如随机梯度下降 SGD、Adam、RMSprop 等)更新所有参数。简单地说,就是:新权重 = 旧权重 - 学习率 × 损失对该权重的梯度。
这个过程会在整个训练数据集上反复执行,通常以多个小批量进行,每次完整遍历一轮称为一个 Epoch。通过不断迭代,网络的预测将越来越接近目标。
核心流程:
1 | 输入数据 -> 前向传播 -> 计算损失 -> 反向传播求梯度 -> 优化算法更新参数 -> (重复前向传播...)-> 模型收敛(损失不再显著下降或达到预定条件) |
用法
应用类型 | 说明 | 常用网络 |
---|---|---|
图像分类 | 输入图片,输出类别 | CNN(卷积神经网络) |
语音识别 | 音频转文字 | RNN、Transformer |
文本情感分析 | 判断情感极性 | RNN、BERT |
机器翻译 | 英文转中文等 | Transformer |
图像生成 | 生成照片/艺术图 | GAN |
时间序列预测 | 股票、气温预测 | RNN、LSTM |
特征提取 | 提取中间层特征 | CNN、预训练模型 |
权重(Weight)
权重是连接神经元之间的系数,表示一个输入对输出的重要程度。换句话说,权重是模型学习的参数,它决定了每个输入特征对预测结果的影响。
权重本质上是一个张量,存储在神经元之间(输入层→隐藏层、隐藏层→隐藏层、隐藏层→输出层)的连线上,量化上游神经元信号对下游神经元的影响程度。其初始值常随机设置(如正态分布),训练过程通过优化算法(如SGD/Adam)基于损失函数反馈动态调整。
核心机制
- 线性变换:在神经元激活前执行 加权求和 操作(即输入特征向量 $X$ 与权重向量 $W$ 的点积): 输出 = $w1x1 + w2x2 + … + wnxn$+ 偏置项
- 特征重要性学习:网络通过反向传播调整权重:
- 正权重 → 增强信号 → 正向关联特征
- 负权重 → 抑制信号 → 负向关联特征
- 近似零权重 → 屏蔽无效特征
- 知识载体:训练后稳定的权重矩阵编码了模型从数据中学习到的核心内在逻辑(如边缘检测器、语义特征提取器)。
用法场景
用法场景 | 描述 |
---|---|
前向传播 | 决定输入特征对输出的贡献 |
模型训练 | 通过梯度下降不断更新 |
模型存储 | 训练完成后模型参数即为权重和偏置集合 |
迁移学习 | 已训练模型的权重可用于新任务,作为预训练参数 |
偏置(Bias)
偏置(Bias) 是神经网络的另一类核心可学习参数,与权重协同工作,为模型提供灵活性和表达能力。
偏置本质是一个张量,是独立于输入特征的存在,它对神经元的加权求和结果 ($z = W·X$)进行平移操作: $输出 = z + b = W·X + b$,一般与权重同步优化,初始值常设为0或较小值(如0.01)。
核心机制
- 打破原点对称性:若无偏置,所有神经元的计算起点强制为原点($X=0 → z=0$),这就限制了模型的表达能力。偏置允许决策边界(或特征空间划分面)自由平移,突破坐标原点的束缚,使得模型拟合能力提高。
- 阈值调节器:可以在激活函数前调整信号的基准位置(以Sigmoid为例):
- $b > 0$ ➔ 加权输出 $z$ 整体右移,这样更易激活神经元
- $b < 0$ ➔ $z$ 整体左移,这样使得神经元更难激活
- 补偿数据偏差:学习数据中的系统偏移(如所有样本的标签存在固定偏移量)。比如预测房价时,即便所有输入特征为0(如零面积房屋),房价也不应为0,偏置可学习该基准值。
用法场景
应用场景 | 是否使用偏置 | 作用与说明 |
---|---|---|
全连接层(Dense / Linear) | 默认使用 | 提供输出的可调“起点”,允许模型学习数据的平移特性 |
卷积层(Conv2d / Conv1d / Conv3d) | 默认使用 | 给每个卷积核增加偏置,有助于处理背景亮度或全局偏移等问题 |
循环神经网络(RNN、LSTM、GRU) | 使用多个偏置项 | 控制不同门(输入门、遗忘门、输出门等)的激活偏移,提高时序建模能力 |
Transformer 中的注意力机制(Attention) | 一般在线性变换时使用 | 在生成 Query、Key、Value 向量时常通过含偏置的线性层增强表达力 |
批归一化(BatchNorm)之后 | 常关闭偏置 | 因为 BatchNorm 自带偏移与缩放参数(γ 与 β),原始层的 bias 可省略 |
激活函数之前(如 ReLU、Sigmoid) | 使用偏置 | 通过加偏置调整输入激活值范围,使得激活函数在有效区间工作 |
AutoEncoder(自编码器) | 编码器与解码器中的线性层都使用 | 提高压缩与重构能力 |
生成对抗网络(GAN) | 生成器和判别器都常含偏置 | 增强网络表达能力 |
图神经网络(GNN) | 在图卷积层中常包含 | 保证节点在无邻居输入时仍有输出可能 |
深度残差网络(ResNet) | 通常保留偏置 | 残差块内的卷积层默认使用偏置,提升表示能力 |
迁移学习(Fine-tune) | 或冻结偏置 | 在微调阶段可能保留或冻结偏置,看任务需求而定 |
前向传播(Forward Pass)
前向传播是神经网络的数据加工流水线,将原始输入数据从输入层逐层向前流动,通过加权计算与非线性变换,最终在输出层生成预测结果。这也是神经网络进行特征抽象的核心过程。
运行原理
神经元视角:输出 = 激活函数(权重x输入 + 偏置)
,就像流水线上的加工站,接收原料(输入),用特定工具(权重)加工,质检员(激活函数)决定是否放行。
网络层视角:输入层 → 隐藏层₁ → ... → 隐藏层ₙ → 输出层
,类似工厂装配线:
- 初级车间:提取边缘/颜色特征(浅层网络)
- 中级车间:组装成纹理/部件(中层网络)
- 高级车间:合成完整物体(深层网络)
在代码中的典型用法(PyTorch为例)
1 | import torch |
作用
- 预测输出:输入样本经过网络计算预测结果
- 计算损失:前向传播的结果与真实标签比较,得到损失值
- 反向传播的基础:只有先完成前向传播,才能基于损失计算梯度,执行反向传播和参数更新
反向传播(Backward Pass)
反向传播(Back Propagation)是训练神经网络的核心算法,它通过从输出层向输入层反向传递误差信号来计算网络中每个参数的梯度,从而用梯度下降法优化参数。
工作流程:
- 前向传播(Forward Pass):输入数据经过网络一层层传播,得到预测结果。
- 计算损失:使用损失函数评估预测值与真实值之间的误差。
- 反向传播(Backward Pass):
- 从输出层开始,计算损失函数对输出的梯度
- 利用链式法则,逐层向前计算每个参数的梯度(即损失函数对各层参数的导数)
- 参数更新:使用梯度下降等优化算法,根据计算出的梯度对每个参数进行更新。
用法场景 | 说明 |
---|---|
模型训练过程中的参数更新 | 与优化器配合,自动计算并更新网络中每一层的权重和偏置 |
计算梯度信息 | 使模型能够感知“如何调整”才能减小误差 |
实现自动微分(autograd)机制 | 如 PyTorch / TensorFlow 内部都基于反向传播自动求导 |
调试模型收敛问题 | 通过监控梯度是否为0、是否爆炸/消失,判断训练是否正常 |
损失函数(Loss Function)
损失函数是训练过程中的“评价器”,它衡量模型预测结果与真实值之间的差距,核心组成如下:
组成部分 | 说明 |
---|---|
预测值(Output / Logits) | 模型输出的结果(可能是分数、概率或回归值) |
真实标签(Ground Truth) | 数据集中真实的目标值,用于监督学习 |
误差度量方式(Metric) | 衡量“预测值”和“真实值”之间距离的方法,如L1、L2、交叉熵等 |
可微性设计 | 损失函数需具备可导性,以便参与反向传播计算梯度 |
工作原理
损失函数的核心机制是将模型的“预测结果”转化为“可以优化的标量反馈”,从而驱动神经网络更新参数。
- 前向传播阶段:
- 模型对输入数据做出预测,输出结果如 $\hat{y}$
- 损失函数将 $\hat{y}$ 与真实值 $y$ 比较,计算出一个损失值 $L(\hat{y}, y)$
- 反向传播阶段:
- 利用损失值对网络参数反向求导,生成梯度
- 梯度引导优化器调整模型参数以最小化损失
损失值越大 → 模型越差,损失值越小 → 模型越接近理想预测
用法:
用法场景 | 说明 |
---|---|
指导模型学习方向 | 通过损失函数提供反馈,让模型知道哪些预测是错误的、需要纠正的 |
计算梯度的起点 | 所有参数的梯度都基于损失函数的导数进行计算 |
衡量模型性能变化趋势 | 训练过程中,监控 loss 能帮助判断是否收敛、是否过拟合等 |
任务定制 | 分类、回归、分割等任务使用不同类型的损失函数(如交叉熵、MSE、Dice Loss) |
多目标训练 | 可组合多个损失函数进行加权,用于多任务学习或辅助任务引导训练 |
常见的损失函数:
任务类型 | 常见损失函数 |
---|---|
分类 | 交叉熵损失(Cross Entropy) |
回归 | 均方误差(MSE)、平均绝对误差(MAE) |
分割 / 检测 | Dice Loss、IoU Loss、Focal Loss |
对比学习 | Triplet Loss、Contrastive Loss |
梯度(Gradient)
梯度是模型学习方向的“指南针”,是告诉每个参数“往哪走才能更好”的关键信息。梯度的本质是一个向量,它反映了损失函数对模型参数的偏导数,从组成上看,梯度涉及以下要素:
组成部分 | 说明 |
---|---|
损失函数(Loss) | 衡量预测值与真实值之间的误差,是梯度的“源头” |
模型参数(权重、偏置) | 需要被优化的目标,是梯度的“作用对象” |
偏导数(Partial Derivative) | 描述损失在每个参数维度上的变化率 |
梯度向量 | 多维参数对应多个偏导,整体形成一个方向性的向量 |
工作原理
梯度是指明函数在当前点上最陡峭上升(或下降)的方向和速率。
在深度学习中,我们关心的是如何减小损失函数的值,因此会反向使用梯度信息:
- 梯度的方向:告诉我们如果参数朝哪个方向微调,损失会变大。
- 负梯度方向:我们采用负梯度方向作为更新方向,以减少损失。
- 梯度大小:决定了更新步长的大小(配合学习率使用)。
举个例子:若某个参数的梯度是 0.5,就表示该参数若增加一点,损失会相应增加(损失函数对该参数是“上升”趋势),所以我们要朝“反方向”调整它。
用法场景 | 说明 |
---|---|
参数更新 | 梯度用于指导优化器(如 SGD、Adam)更新每一层的参数 |
误差传播(反向传播) | 反向传播过程的核心计算就是梯度链式相乘 |
调试训练过程 | 梯度消失/爆炸等问题是训练失败的重要信号 |
自动求导 | 框架(如 PyTorch)通过自动微分机制计算每个参数的梯度 |
神经网络学习机制的本质体现 | 训练的全部过程,其实就是围绕着“计算并利用梯度”展开的 |
梯度下降(Gradient Descent)
梯度下降是一种“聪明的试错”方法,通过沿着误差减少的方向不断微调参数,使模型逐步逼近最优性能。它由以下几个核心要素构成:
组成部分 | 说明 |
---|---|
模型参数(如权重 W、偏置 b) | 需要被优化的变量 |
损失函数 $\mathcal{L}$ | 衡量预测结果与真实值之间的误差 |
梯度 $\nabla \mathcal{L}$ | 损失函数对每个参数的导数,表示误差随参数变化的趋势 |
学习率 $\eta$ | 控制每次参数更新的步长,决定收敛速度和稳定性 |
工作原理
在当前点上,计算损失函数对参数的梯度,朝梯度反方向移动参数,减小损失。
具体步骤如下:
- 前向传播:模型对输入数据生成预测结果;
- 计算损失:通过损失函数得到预测误差;
- 反向传播:计算损失函数对每个参数的梯度;
- 参数更新:按以下公式更新每个参数:
$\theta \leftarrow \theta - \eta \cdot \nabla_\theta \mathcal{L}$ $\theta$:待更新的参数 $\eta$:学习率 $\nabla_\theta \mathcal{L}$:该参数的梯度
这个过程持续进行,直到损失函数收敛或达到设定轮数。
梯度下降广泛应用于深度学习模型训练,是模型“学习”的基础:
用法场景 | 说明 |
---|---|
神经网络训练的核心优化方法 | 所有模型参数的更新都依赖梯度下降 |
与反向传播结合 | 梯度由反向传播计算,梯度下降据此更新参数 |
支持多种变体 | 包括批量(Batch)、小批量(Mini-batch)、随机(SGD)三种方式 |
可与高级优化器结合 | 如 Adam、RMSProp、Momentum 等都基于梯度下降改进 |
调节学习率以控制训练过程 | 过小 → 学得慢;过大 → 震荡或发散;可配合调度策略如余弦退火、Warmup等 |
梯度下降三种常见形式
类型 | 特点 | 适用场景 |
---|---|---|
批量梯度下降 | 每轮使用全部数据,计算精确,但慢 | 小数据集 |
随机梯度下降(SGD) | 每个样本单独更新,波动大但快 | 大数据训练、在线学习 |
小批量梯度下降 | 每次使用部分样本,速度与稳定性兼顾 | 实际最常用 |
学习率(Learning Rate)
学习率(Learning Rate)是梯度下降等优化算法中的一个关键超参数,控制着每次模型参数更新的“步长”
组成部分 | 说明 |
---|---|
学习率值(η 或 lr) | 一个标量,表示每一步更新沿梯度方向移动的幅度 |
优化器 | 学习率是优化器(如SGD、Adam等)的输入 |
梯度信息 | 与学习率配合决定参数的实际更新量 |
动态调整策略(可选) | 可以采用学习率调度器根据训练进度动态变化 |
工作原理:
决定梯度更新的“步长”大小,直接影响模型收敛速度和稳定性。
在参数更新中,学习率控制了“走多远”:
$\theta \leftarrow \theta - \eta \cdot \nabla_\theta \mathcal{L}$
情况 | 影响 |
---|---|
学习率太大 | 更新过猛,可能震荡或发散,无法收敛 |
学习率太小 | 收敛速度慢,训练效率低,容易陷入局部最优或提前停止 |
用法
学习率是训练过程中必须设置的重要超参数,使用方式包括:
用法场景 | 说明 |
---|---|
固定学习率训练 | 设置一个固定值,适用于简单问题或短时间训练 |
逐步衰减(Step Decay) | 每隔一定epoch将学习率缩小,比如除以10 |
余弦退火(Cosine Annealing) | 学习率按余弦函数周期变化,有利于跳出局部最优 |
Warm-up | 在训练开始阶段先用较小学习率“热身”,避免初始梯度爆炸 |
自适应学习率(如Adam) | 优化器内部根据梯度历史动态调整每个参数的学习率 |
手动调参 | 可视化 loss 曲线和验证指标,手动调整学习率以优化训练表现 |
学习率常见设置技巧
训练目标 | 建议策略 |
---|---|
模型初期不稳定 | 使用 warm-up 或较小初始学习率 |
模型收敛缓慢 | 适当调大学习率或改用带动量的优化器 |
模型震荡或 loss 上下跳动 | 适当降低学习率 |
训练中后期精调 | 使用调度器降低学习率以精细收敛 |
学习率就像“油门”,踩得太猛容易翻车,踩得太轻走不动,只有控制得当,模型训练才能又快又稳。
优化器(Optimizer)
优化器是神经网络训练中用于更新模型参数的模块,它基于梯度信息,决定每次如何调整参数以减小损失函数。
组成部分 | 说明 |
---|---|
模型参数(weights / biases) | 需要被优化的变量 |
损失函数的梯度 $\nabla \mathcal{L}$ | 通过反向传播计算得到 |
学习率(Learning Rate) | 决定每次更新的步长 |
动量 / 累积项(某些优化器有) | 如 SGD with Momentum、Adam 等,引入历史信息增强稳定性 |
优化规则 | 每种优化器都有自己独特的参数更新公式和机制 |
工作原理
利用损失函数的梯度信息,按一定规则更新参数,以使损失函数逐步下降,模型性能不断提升。
以最基础的梯度下降法为例:
$\theta \leftarrow \theta - \eta \cdot \nabla_\theta \mathcal{L}$
不同的优化器在此基础上会加入各种机制来提高训练效率与稳定性:
优化器 | 关键机制 |
---|---|
SGD(随机梯度下降) | 使用当前样本或小批量样本的梯度 |
SGD + Momentum | 引入“惯性”,缓解震荡,增强方向感 |
RMSProp | 自动调整每个参数的学习率,抑制震荡 |
Adam | 综合 Momentum 和 RMSProp,自适应调整每个参数的更新步长 |
用法:
用法场景 | 说明 |
---|---|
训练神经网络 | 反向传播后由优化器根据梯度更新模型参数 |
选择合适优化器 | 小模型可用 SGD,大模型推荐 Adam;分类任务多用 Adam 或 AdamW |
调整学习率 | 大多数优化器需手动设置初始学习率,必要时配合调度器 |
支持参数分组 | 可为不同层设置不同学习率、权重衰减等超参数(如 param_groups) |
结合正则化 | 优化器常配合 L2 正则(weight decay)防止过拟合 |
常用优化器对比表
优化器 | 是否使用动量 | 是否自适应学习率 | 特点 |
---|---|---|---|
SGD | 否 | 否 | 简单、高效,适合小规模数据 |
SGD + Momentum | 是 | 否 | 更平稳、更快收敛 |
RMSProp | 否 | 是 | 更适合非平稳目标或循环网络 |
Adam | 是 | 是 | 默认首选,适用于大多数任务 |
AdamW | 是 | 是 | Adam 的改进版,更适合 Transformer 类模型(如 BERT、ViT) |
优化器是训练的“驾驶员”,它读取梯度信息,控制模型参数沿着“更优方向”前进,让模型不断逼近理想状态。
激活函数(Activation Function)
激活函数是神经网络中每个神经元内部的非线性变换函数,它决定了每一层输出的形式,控制信息的传播和模型的表达能力。
组成部分 | 说明 |
---|---|
输入信号(一般为线性加权和) | 来自前一层的输出,即 $z = w^\top x + b$ |
激活函数本体 | 将输入信号变换为非线性输出,如 ReLU、Sigmoid、Tanh 等 |
输出结果 | 作为当前神经元的输出传递给下一层 |
工作原理
对神经元的线性输出进行非线性映射,从而打破神经网络的线性性,使模型能学习复杂、高阶的表示。
没有激活函数的神经网络,哪怕有多层,整体仍是线性函数,无法解决实际问题中的非线性关系。
常见激活函数及机制特点:
函数 | 表达式 | 机制说明 |
---|---|---|
ReLU | $f(x) = \max(0, x)$ | 保留正值,抑制负值,收敛快,简洁高效 |
Sigmoid | $f(x) = \frac{1}{1 + e^{-x}}$ | 输出范围(0, 1),适用于概率建模,但梯度容易消失 |
Tanh | $f(x) = \tanh(x)$ | 输出范围(-1, 1),比Sigmoid居中,但仍可能梯度消失 |
Leaky ReLU | $f(x) = \max(0.01x, x)$ | 改进ReLU,允许负值通过,避免神经元“死亡” |
GELU / Swish | 更复杂 | 新型激活函数,用于BERT、Vision Transformer等 |
用法
激活函数广泛用于神经网络的各层中,具体用法包括:
应用场景 | 说明 |
---|---|
隐藏层激活函数 | 通常使用 ReLU 或其变体,提升训练效率和非线性表达能力 |
输出层激活函数 | 根据任务类型选择:回归 → 无激活 / ReLU,二分类 → Sigmoid,多分类 → Softmax |
防止梯度问题 | Tanh/Sigmoid 早期常用,但容易梯度消失;ReLU 更常用于深层网络 |
搭配正则化使用 | 常与 BatchNorm、Dropout 一起增强训练稳定性和泛化能力 |
注意选择位置 | 激活函数通常在每层线性操作(Linear / Conv)之后使用: |
激活函数的对比简表:
函数 | 非线性 | 导数计算 | 是否零均值 | 是否抗梯度消失 | 常用位置 |
---|---|---|---|---|---|
ReLU | ✅ | 简单 | 否 | ✅ | 隐藏层 |
Tanh | ✅ | 复杂 | ✅ | 一定程度✅ | RNN 中常用 |
Sigmoid | ✅ | 复杂 | 否 | ❌ | 输出层(二分类) |
Softmax | ✅ | 稍复杂 | - | - | 输出层(多分类) |
激活函数是神经网络的“灵魂”,它赋予网络理解非线性世界的能力,使模型不仅能加减乘除,更能思考弯弯绕绕。
归一化(Normalization)
用于标准化神经网络层输入,它通过调整数据的均值和方差,来解决深度学习模型训练中常见的问题,比如内部协变量偏移、梯度消失/爆炸,从而加速模型收敛、提高训练稳定性、改善模型泛化能力。
主要归一化方法
- 批归一化:在一个训练批次内,对同一个神经元(特征通道)在所有样本上的激活值进行归一化。
- 层归一化: 对单个样本,在一个层(所有神经元)的激活值上进行归一化(计算均值和方差)。
- 实例归一化:对单个样本,在其空间维度上(对卷积层而言,是高度H和宽度W),对每个特征通道单独进行归一化。
- 组归一化:主要是对单个样本,将其特征通道划分为 G 个组,然后对每个组内的所有通道上的激活值(跨越通道维度)进行归一化。
原理
- 缓解内部协变量偏移(Internal Covariate Shift): 在训练时,每层输入的分布不断变化,会导致训练不稳定,而归一化强制每层输入保持稳定分布(均值为 0,方差为 1),从而提升模型收敛效率。
- 改善梯度传播: 归一化使激活值落入激活函数的线性敏感区间(如 Sigmoid/Tanh 的中段),从而避免梯度消失或爆炸。
- 轻度正则化作用(主要对 BN 而言): Batch 内统计带来的噪声有助于防止过拟合,提升泛化能力。
- 允许更大学习率: 训练过程更稳定,能使用更大的学习率,进一步提升训练效率。
用法
场景 | 推荐归一化方法 | 原因说明 |
---|---|---|
卷积网络 + 大Batch(≥32) | BatchNorm(BN) | 训练快、性能好,是标准选择 |
卷积网络 + 小Batch | GroupNorm(GN) | 不依赖 batch,适合目标检测、分割等任务 |
RNN / Transformer | LayerNorm(LN) | 不受序列长度与 batch 大小影响,是 NLP/时序模型标准配置 |
图像生成 / 风格迁移任务 | InstanceNorm(IN) | 去除图像对比度等风格信息,更关注结构与纹理生成 |
正则化(Regularization)
是通过在训练过程中引入额外的约束或惩罚,限制模型的复杂性,使其更倾向于学习数据中泛化的模式(General Pattern),而不是对训练数据中的噪声或特定细节(Specific Detail/Noise)进行精确记忆。
核心目标:解决过拟合
- 过拟合: 模型在训练集上表现极好,但在未见过的测试集或真实数据上表现很差。这表明模型记住了训练数据的“个性”,而非掌握了数据的“共性”。
- 欠拟合: 模型在训练集上都表现不佳,说明模型能力不够或训练不足。正则化主要解决的是过拟合问题。
常见正则化技术及其机制
- L1 正则化(Lasso Regression): 鼓励模型学习稀疏(Sparse)权重。它倾向于将不重要的特征权重精确地压缩到0,实现特征选择(Feature Selection) 。被压缩到零的特征对预测基本没有贡献。
- L2 正则化(Ridge Regression / Weight Decay - 权重衰减):鼓励模型学习较小、分布分散(Diffuse)的权重。它惩罚过大的权重值,防止模型过度依赖少数几个特征。使权重趋向于零但不精确为零(除非λ极大)。能有效缓解多重共线性问题,提高模型的稳定性和泛化能力。是深度学习中最常用的正则化方式之一(常直接称为 Weight Decay)。
- Dropout:在训练阶段的每次前向传播(Forward Pass) 过程中,以预先设定的概率
p
(Dropout Rate)随机暂时丢弃(置零) 网络中的神经元(通常是隐藏层节点)。一方面打破协同适应性(Co-adaptation), 迫使网络不能过度依赖少数几个特定神经元或特征。每个神经元都必须学会在随机的、缺失部分信息的子集(“残破的网络”)中有效工作。另一方面隐式的模型集成(Ensembling),不同的 Dropout 模式相当于在训练多个“瘦身”后的子网络。在测试(推理)阶段,所有神经元被保留,但它们的输出值要乘以(1 - p)
(近似平均集成效果)。这大大增强了泛化能力。 - 数据增强(Data Augmentation):在不改变数据标签(Label) 的前提下,对原始训练数据进行合理、多样化的变换或生成新的合成数据。通过生成大量不同的训练样本变体,模拟数据的自然变异,让模型学习到更鲁棒、更具不变性的特征,减少对特定数据点和噪声的敏感性。本质上是在增加训练集的有效大小和多样性。
- 早停法(Early Stopping):监测模型在验证集(Validation Set)上的性能(如loss或accuracy)。当验证集性能在一定迭代次数(epoch)或迭代步数(steps)后不再提升,甚至开始下降时,停止训练。
- 模型复杂度约束: 直接限制了模型拟合复杂函数(包括噪声)的能力,使其更倾向于学习更简单、更泛化的模式。这样直观有效,但在设计时需要根据数据复杂度进行经验性选择(容量太小会导致欠拟合)。通常结合其他正则化技术(如 L2 正则化/Dropout)以在保持一定容量的同时控制过拟合。
用法
深度学习:
- L2 正则化 (Weight Decay) 一般常用方式
- Dropout 在 FC 层、CNN 中被广泛应用(常放在 FC 层之后)
- 数据增强 是图像任务的必备项,文本、语音任务应用也越来越多
- Batch Normalization 被广泛用于稳定训练和加速收敛,还可以顺带正则化。
- 早停法 使用方便有效
- 结合起来使用,如
Dropout + L2 + Data Augmentation
选择依据: - 数据量: 小数据时更依赖正则化(数据增强、Dropout、L1/L2、强约束)
- 数据噪声: 噪声大时更需要正则化(Dropout、数据清洗)
- 任务/模型: 不同模型有其偏好(CNN常用Dropout+BN+数据增强;RNN常用L2/梯度裁剪)
- 计算资源: 数据增强、早停法等需额外计算/验证
- 问题目标: 是否需要特征选择(L1)或可解释性(模型约束)
- 超参数调节: 正则化强度(如 λ, Dropout Rate, 数据增强强度)需要通过验证集仔细调整
动量(Momentum)
动量(Momentum) 是一种优化算法,用于加速梯度下降过程并减少振荡。其核心思想是引入历史梯度信息的加权平均,模拟物理中的“动量”概念,帮助参数更新在正确方向上积累速度,从而更快收敛并逃离局部极小值或鞍点。
核心机制
- 历史梯度的累积
每次更新时,不仅考虑当前梯度,还加入之前更新方向的加权值,形成“惯性”:
$$v_t = \beta v_{t-1} + (1 - \beta) \nabla_\theta J(\theta_t)$$- $v_t$:当前动量(更新方向)
- $\beta$:动量系数(通常取0.9),控制历史信息的权重
- $\nabla_\theta J(\theta_t)$:当前梯度
- 参数更新
使用动量项替代原始梯度更新参数:
$$ \theta_{t+1} = \theta_t - \alpha v_t $$- $\alpha$:学习率
解决的问题
- 梯度振荡
在损失函数的狭窄山谷中,传统SGD会因梯度方向反复变化而振荡。动量通过累积同方向梯度,平滑更新路径,加速穿过平坦区域。示例:山谷中,梯度在两侧来回震荡,动量使其沿谷底方向加速。
- 局部极小值与鞍点
动量提供的“惯性”帮助跳出局部极小值或缓慢穿越鞍点(梯度接近零的区域)。 - 噪声鲁棒性
对小批量(mini-batch)的梯度噪声具有平滑作用,提升稳定性。
物理类比
想象一个球从山坡滚下:
- 传统SGD:球每一步只根据当前坡度调整方向,容易卡在局部凹坑
- 动量法:球拥有“速度”,下坡时加速,遇到反向坡度时速度逐渐衰减而非立刻转向,更易越过小障碍
超参数选择
- 动量系数 $\beta$:
- 常用值:0.9(保留90%历史梯度方向)
- $\beta \uparrow$:对历史依赖更强,更新更平滑,但可能过度惯性
- $\beta \downarrow$:更依赖当前梯度,振荡可能增加
- 学习率 $\alpha$:
通常需略高于标准SGD(因动量加速收敛),但需调优避免发散
使用场景
- 训练加速:在卷积网络(CNN)、循环网络(RNN)中常见,收敛速度显著提升
- 振荡抑制:在病态条件(如不同特征尺度差异大)的问题中表现更稳定
- 与自适应方法结合:如Adam(融合动量与RMSProp),成为主流优化器之一
独热编码(One-Hot Encoding)
独热编码(One-Hot Encoding) 是将分类变量转换为数值形式的标准化技术,使算法能够正确处理非数值特征(如颜色、国家、类别)。其核心思想是为每个类别生成一个二元向量(仅包含0和1),长度等于类别总数,且仅在对应类别位置为1。
核心机制
编码过程 :假设一个特征有 k
个类别,创建一个全零向量 [0, 0, ..., 0]
,长度为 k
。将该特征对应的类别位置设为 1
。
示例:颜色特征包含 [红, 绿, 蓝]
三个类别:
- 红 →
[1, 0, 0]
- 绿 →
[0, 1, 0]
- 蓝 →
[0, 0, 1]
解决的问题
- 分类特征的数值化:机器学习模型(如神经网络、SVM)只能处理数值输入,无法直接处理“颜色=红”等文本信息。
- 避免数值陷阱:若直接赋值(如红=1、绿=2、蓝=3),模型可能错误认为:数值大小反映重要性(如蓝>红),类别间存在线性关系(如(红+蓝)/2=绿)。独热编码通过等距表示消除此类偏差。
应用场景
- 结构化数据:处理表格中的分类列(如性别、产品类型)
- 自然语言处理(NLP):将词转换为向量(词袋模型的基础)
- 推荐系统:用户或物品的类别特征编码
局限性
问题 | 原因 | 解决方案 |
---|---|---|
维度爆炸 | 类别数 k 过大时,编码后特征维度急剧增加(如国家有200类 → 200列) |
嵌入层(Embedding)、特征哈希(Hashing) |
数据稀疏性 | 矩阵中大量0值,存储计算效率低 | 使用稀疏矩阵格式存储(如scipy.sparse ) |
类别信息丢失 | 忽略类别间潜在关系(如“动物”与“植物”的距离) | 嵌入表示(如Word2Vec)、目标编码 |
新类别处理 | 测试集出现训练时未见的类别(如训练集无“紫”,测试出现“紫”) | 统一预留“未知”类别位或舍弃该特征 |
替代方案
- 标签编码(Label Encoding):直接分配数值标签(如红→0, 绿→1, 蓝→2),仅适用于有序类别(如学历:小学<中学<大学)。 风险:无序类别引入虚假顺序关系(如“红<绿”无意义)。
- 嵌入(Embedding) :用低维稠密向量表示类别(如将1000个国家映射为16维向量),可学习类别间语义关系。
- 特征哈希(Hashing Trick):用哈希函数压缩维度(固定输出维度),牺牲少量精度以换取效率。
池化(Pooling)
池化(Pooling) 是卷积神经网络(CNN)中的核心操作,通过对局部区域进行降采样(downsampling),逐步减少特征图的空间尺寸,从而压缩信息并增强特征的鲁棒性。其本质是保留显著特征,抑制冗余细节,类似于人眼忽略细节、关注整体轮廓的认知机制。
核心目的
- 降低维度:减少特征图尺寸(如将224×224变为112×112),显著降低计算量和参数量。
- 平移不变性(Invariance):使模型对微小位置变化不敏感(如猫的耳朵在图像中移动几个像素仍能被识别)。
- 特征层次化:逐层抽象,浅层保留边缘等细节,深层提取语义特征(如“猫脸”)。
- 防止过拟合:压缩信息减少模型容量,抑制噪声干扰。
主要类型与操作方式
- 最大池化(Max Pooling) :保留最显著特征(如纹理、边缘),适用于特征识别任务(如图像分类)
操作:取局部窗口内的最大值 $\text{Output} = \max(\text{Region})$ - 平均池化(Average Pooling) :平滑区域特征,抑制极端值,适用于需要保留整体信息的任务(如生成模型)
操作:取局部窗口内的平均值 $\text{Output} = \frac{1}{N} \sum_{i=1}^{N} x_i$ - 全局池化(Global Pooling):代替全连接层,直接输出分类概率,减少参数量(如ResNet、Inception中使用)。
操作:对整个特征图进行池化(取全局最大值或平均值)
关键参数与计算
- 池化窗口(Kernel Size):一般为2×2或3×3
- 步长(Stride):通常等于窗口大小(如2×2窗口步长为2)
- 填充(Padding):通常设为0(
valid
模式)
输出尺寸公式:
$$
\text{Output Size} = \left\lfloor \frac{\text{Input Size} - \text{Kernel Size}}{\text{Stride}} + 1 \right\rfloor
$$
与卷积层的区别
特性 | 卷积层 | 池化层 |
---|---|---|
参数 | 有权重(可学习) | 无权重(固定操作) |
作用 | 特征提取(主动学习) | 特征压缩(被动降维) |
通道处理 | 跨通道融合 | 各通道独立操作 |
信息保留 | 保留细节 | 保留最显著特征 |
局限性与现代替代方案
- 信息丢失问题:池化会丢弃非最大值信息,可能导致细节损失(如小物体检测)。
解决方案:- 步长卷积(Strided Convolution):用步长>1的卷积代替池化(如VGG16)
- 空洞卷积(Dilated Convolution):扩大感受野且不降采样
- 位置信息破坏:平移不变性可能损害需要位置的任务(如目标检测)。
解决方案:- 减少池化层数量(如YOLO仅用1次最大池化)
- 使用可学习池化(如LPPool、SoftPool)
- 全局信息缺失:浅层池化丢失长距离依赖。
解决方案:自注意力机制(如Transformer)
用法
- 基础架构:CNN浅层优先使用最大池化(保留强特征),深层可尝试全局池化替代全连接层。
- 尺寸控制:避免频繁池化导致特征图过小(如小于4×4时停止池化)。
- 任务适配:
- 分类任务:池化提升平移不变性
- 检测/分割任务:减少池化层或使用步长卷积保留位置信息