模型基础02:深度学习基础
从神经网络结构、反向传播算法、表示学习到参数规模,理解深度学习为什么能从数据中自动学习特征。
深度学习是机器学习的一个分支,它通过多层神经网络从数据中自动学习特征。理解深度学习的核心原理,是理解大模型的基础。
神经网络:从感知器到深度学习
神经网络的灵感来源于人脑的神经元,它是深度学习的核心组件。
感知器:最简单的神经元
感知器是神经网络的基本单元:
输入 → 加权求和 → 激活函数 → 输出
数学表达:y = σ(w₁x₁ + w₂x₂ + ... + wₙxₙ + b)
w:权重,决定输入的重要程度b:偏置,控制神经元的激活阈值σ:激活函数,引入非线性
激活函数:引入非线性
没有激活函数,神经网络就是线性模型,无法学习复杂模式。
| 激活函数 | 公式 | 特点 | 适用场景 |
|---|---|---|---|
| Sigmoid | 1/(1+e⁻ˣ) | 将输出压缩到 (0,1) | 二分类、输出概率 |
| Tanh | (eˣ-e⁻ˣ)/(eˣ+e⁻ˣ) | 将输出压缩到 (-1,1) | 隐藏层 |
| ReLU | max(0, x) | 计算简单,缓解梯度消失 | 隐藏层(最常用) |
| Leaky ReLU | max(αx, x) | 解决 ReLU 死亡问题 | 隐藏层 |
| Softmax | eˣⁱ/Σeˣⱼ | 将输出转换为概率分布 | 多分类 |
多层神经网络
单层感知器只能处理线性可分问题,多层神经网络可以处理非线性问题。
神经网络结构:
输入层 → 隐藏层1 → 隐藏层2 → ... → 隐藏层n → 输出层
- 输入层:接收原始数据
- 隐藏层:提取特征,层数越深,特征越抽象
- 输出层:产生最终预测
前向传播:数据从输入层流向输出层,每层计算:
a⁽ˡ⁾ = σ(z⁽ˡ⁾) = σ(W⁽ˡ⁾a⁽ˡ⁻¹⁾ + b⁽ˡ⁾)
反向传播:深度学习的核心算法
反向传播是训练神经网络的核心算法,它让模型能够从错误中学习。
损失函数:衡量预测误差
损失函数衡量模型预测与真实标签的差距:
| 损失函数 | 公式 | 适用场景 |
|---|---|---|
| MSE | (1/n)Σ(yᵢ - ŷᵢ)² | 回归任务 |
| Cross Entropy | -Σyᵢlog(ŷᵢ) | 分类任务 |
| Binary Cross Entropy | -y log(ŷ) - (1-y)log(1-ŷ) | 二分类 |
| Hinge Loss | max(0, 1-yŷ) | SVM、分类任务 |
反向传播原理
反向传播基于链式法则,从输出层向输入层逐层计算梯度:
- 计算输出层梯度:
∂L/∂z⁽ᵒᵘᵗ⁾ = ∂L/∂a⁽ᵒᵘᵗ⁾ * σ'(z⁽ᵒᵘᵗ⁾) - 计算隐藏层梯度:
∂L/∂z⁽ˡ⁾ = (W⁽ˡ⁺¹⁾ᵀ * ∂L/∂z⁽ˡ⁺¹⁾) * σ'(z⁽ˡ⁾) - 更新参数:
W⁽ˡ⁾ = W⁽ˡ⁾ - α * ∂L/∂W⁽ˡ⁾
梯度消失与梯度爆炸
深度神经网络训练时会遇到梯度消失或梯度爆炸问题:
梯度消失:
- 深层网络中,梯度经过多层链式求导后变得极小
- 原因:激活函数(如 Sigmoid)的导数小于 1,多次相乘后趋近于 0
- 表现:网络浅层参数几乎不更新
梯度爆炸:
- 梯度经过多层链式求导后变得极大
- 原因:权重初始化不当或激活函数导数大于 1
- 表现:参数更新过大,训练不稳定
解决方案:
| 方法 | 原理 |
|---|---|
| 权重初始化 | Xavier/Glorot 初始化,保持梯度方差稳定 |
| Batch Normalization | 每层输入标准化,缓解内部协变量偏移 |
| Residual Connection | 跳过连接,梯度可以直接传递 |
| ReLU 激活函数 | 梯度为 0 或 1,缓解梯度消失 |
| Gradient Clipping | 限制梯度最大值,防止爆炸 |
优化器:如何更新参数
优化器决定了参数如何根据梯度更新,不同的优化器有不同的收敛特性。
梯度下降家族
| 优化器 | 特点 | 适用场景 |
|---|---|---|
| SGD | 简单,计算快,但收敛慢 | 基础对比 |
| SGD + Momentum | 利用历史梯度,加速收敛 | 大多数场景 |
| AdaGrad | 自适应学习率,适合稀疏数据 | 自然语言处理 |
| RMSprop | 自适应学习率,解决 AdaGrad 学习率衰减问题 | 深度学习 |
| Adam | 结合 Momentum 和 RMSprop,自适应学习率 | 最常用,推荐默认选择 |
| AdamW | Adam + 权重衰减,效果更稳定 | 推荐替代 Adam |
学习率调度
学习率是最重要的超参数,需要动态调整:
| 策略 | 原理 | 适用场景 |
|---|---|---|
| 固定学习率 | 始终保持不变 | 简单场景 |
| 阶梯衰减 | 训练到一定轮数后降低学习率 | 大多数场景 |
| Cosine Decay | 余弦曲线衰减学习率 | 深度学习 |
| Warmup | 初始阶段学习率逐渐增加 | 训练不稳定时 |
表示学习:自动提取特征
深度学习的核心优势是自动从数据中学习特征,而不需要人工设计。
表示学习 vs 手工特征
| 维度 | 手工特征 | 表示学习 |
|---|---|---|
| 特征设计 | 人工设计 | 自动学习 |
| 特征层次 | 单一层次 | 多层抽象 |
| 数据需求 | 少 | 多 |
| 灵活性 | 低 | 高 |
| 可解释性 | 高 | 低 |
特征层次
深度学习学习的特征是分层的:
第一层:学习简单特征(如边缘、颜色) 第二层:学习组合特征(如纹理、形状) 第三层:学习高级特征(如物体、场景) 更高层:学习抽象特征(如概念、关系)
自监督学习
自监督学习不需要人工标注,通过设计”代理任务”让模型自己学习特征:
| 方法 | 代理任务 | 适用场景 |
|---|---|---|
| Contrastive Learning | 区分相似和不相似的样本 | 图像、文本 |
| Masked Language Model | 预测被掩盖的 token | 文本 |
| Next Sentence Prediction | 判断两个句子是否连续 | 文本 |
| SimCLR/MoCo | 同一图像不同变换的相似度学习 | 图像 |
参数规模:越大越好吗
参数规模是大模型的重要特征,但不是越大越好。
参数规模与能力
一般来说,参数越多,模型能力越强:
- 100M 参数:小型模型,适合简单任务
- 1B 参数:中等模型,适合特定任务
- 10B 参数:大型模型,具有多任务能力
- 100B+ 参数:超大模型,具有通用智能
参数效率
参数效率关注如何用更少的参数达到相同效果:
| 方法 | 原理 | 适用场景 |
|---|---|---|
| 参数共享 | 不同层共享参数 | Transformer |
| 稀疏激活 | 只激活部分神经元 | MoE 模型 |
| 知识蒸馏 | 大模型教小模型 | 边缘部署 |
| LoRA | 低秩适配,只训练少量参数 | 微调 |
训练数据与参数规模的关系
训练数据量应该与参数规模匹配:
- 参数太多,数据太少 → 过拟合
- 参数太少,数据太多 → 欠拟合
- 最优比例:数据量 ≈ 参数数量的 10-100 倍
正则化:防止过拟合
深度学习模型参数多,更容易过拟合,需要正则化。
常见正则化方法
| 方法 | 原理 | 适用场景 |
|---|---|---|
| L1 正则化 | 惩罚参数绝对值,产生稀疏解 | 特征选择 |
| L2 正则化 | 惩罚参数平方,抑制参数过大 | 大多数场景 |
| Dropout | 训练时随机丢弃部分神经元 | 深度学习 |
| Batch Normalization | 标准化每层输入,增加稳定性 | 深度学习 |
| 早停 | 验证集性能下降时停止训练 | 深度学习 |
| 数据增强 | 对训练数据做变换 | 图像、语音 |
项目判断清单
- 需要处理复杂模式(图像、文本、语音)→ 用深度学习
- 数据量小(<10万)→ 用传统算法或预训练模型微调
- 训练不稳定、梯度消失 → 检查初始化、激活函数、BatchNorm
- 过拟合 → 增加数据、加正则化、简化模型
- 欠拟合 → 增加模型复杂度、增加训练轮数
- 选择优化器 → 默认用 AdamW,配合余弦衰减学习率
- 需要边缘部署 → 用知识蒸馏或 LoRA 压缩模型