深度学习基础学习文档#
目录#
深度学习概述#
什么是深度学习?#
深度学习(Deep Learning)是机器学习的一个子领域,它使用多层神经网络来模拟人脑的学习过程。深度学习通过构建具有多个隐藏层的神经网络,能够自动从数据中学习复杂的特征表示。
核心特点#
- 自动特征提取:无需人工设计特征,模型自动学习
- 端到端学习:从原始输入直接到最终输出
- 强大的表达能力:能够学习高度复杂的非线性关系
表征学习#
概念解释#
表征学习(Representation Learning) 是深度学习的核心思想。它指的是让算法自动从数据中学习有用的特征表示,而不是依赖人工设计的特征。
传统方法 vs 表征学习#
传统方法(非表征学习)#
以猫的图片分类为例:
人工特征设计:
- 边缘检测:识别猫的轮廓
- 焦点检测:识别猫的眼睛、鼻子等关键部位
- 颜色特征:提取猫的颜色信息
- 形状特征:分析猫的整体形状
局限性:
- 上限低:人工设计的特征难以捕捉所有重要信息
- 易误判:特征设计不当会导致分类错误
- 需要专业知识:需要领域专家设计特征
表征学习方法#
自动特征学习:
- 将原始数据(如图片像素)直接输入神经网络
- 网络自动学习从低级特征(边缘、纹理)到高级特征(形状、语义)的层次化表示
- 整个过程是"黑箱",但效果通常更好
优势:
- 自动发现数据中的模式
- 能够学习复杂的非线性关系
- 减少人工干预,提高泛化能力
示例对比#
传统方法流程:
原始图片 → [人工特征提取] → 特征向量 → 分类器 → 结果
表征学习方法流程:
原始图片 → [神经网络自动学习特征] → 特征表示 → 分类器 → 结果学习方法#
监督学习(Supervised Learning)#
定义:通过训练集中图片对应的标签(label)来训练网络,使网络能够预测标签。
特点:
- 强烈依赖数据:需要大量标注数据
- 无数据无法学习:没有标注数据就无法训练
- 应用广泛:图像分类、目标检测、语音识别等
示例:
- 输入:猫的图片
- 标签:$[1, 0, 0]$ (表示"猫"类别)
- 目标:训练网络输出正确的类别概率
自监督学习(Self-Supervised Learning)#
定义:通过更弱的方法构造数据,不需要人工标注,从数据本身学习表示。
特点:
- 减少对标注数据的依赖
- 是现代AI的热门方向
- 可以处理大量无标注数据
示例:
- 预测图片的旋转角度
- 预测视频的下一帧
- 掩码语言模型(如BERT)
强化学习(Reinforcement Learning)#
定义:通过与环境交互,根据奖励信号学习最优策略。
特点:
- 适用于决策问题
- 需要设计奖励函数
- 在游戏AI、机器人控制等领域应用广泛
示例:
- 游戏AI:通过游戏得分学习策略
- 机器人控制:通过完成任务获得奖励
三大支柱架构#
在深度学习的发展历程中,Transformer、卷积神经网络(CNN) 和循环神经网络(RNN) 并称为三大支柱架构。这三大架构分别解决了空间特征提取、时序依赖建模和长距离全局关联这三个核心难题,共同构成了现代人工智能的技术基石。
以下是这三大支柱的总结及其核心作用:
1. 卷积神经网络 (CNN) - 空间特征的“捕手”#
核心作用:处理具有空间结构的数据,如图像、网格数据。它通过局部连接和权值共享,高效地提取局部特征并组合成全局特征。
关键特性:
局部感知:每个神经元只感受图像的局部区域,模拟了生物视觉系统。
参数共享:同一个卷积核在图像的不同位置滑动,大大减少了模型参数。
平移不变性:无论物体在图像的哪个位置,都能被识别出来。
代表模型:LeNet、AlexNet、ResNet、VGG。
地位:计算机视觉领域的绝对霸主,开启了深度学习在图像识别、目标检测等领域的黄金时代。
2. 循环神经网络 (RNN) - 时序记忆的“管家”#
核心作用:处理序列数据,如文本、语音、时间序列。它通过循环结构(隐藏状态的传递)赋予网络“记忆”能力,能够处理前后依赖关系。
关键特性:
时序建模:能够记住之前的信息,并用于当前的计算。
变长输入:可以处理长度不固定的序列数据。
代表变体:
LSTM (长短期记忆网络):通过“门控机制”解决了长期依赖问题,防止梯度消失。
GRU (门控循环单元):LSTM的简化版,参数更少,效果相当。
地位:在Transformer出现前,是自然语言处理(NLP)和语音识别的主流架构。
3. Transformer - 全局关联的“破局者”#
核心作用:处理长序列依赖关系。它摒弃了RNN的循环结构,完全依赖自注意力机制来捕捉序列中任意两个元素之间的关系。
关键特性:
自注意力 (Self-Attention):计算序列中每个元素与其他所有元素的相关性权重,实现“全局视野”。
并行计算:由于没有循环结构,所有计算可以并行进行,极大提升了训练速度。
位置编码:通过添加位置信息来弥补其本身不具备位置感知能力的缺陷。
代表模型:BERT (编码器)、GPT系列 (解码器)、T5 (编码器-解码器)。
地位:彻底改变了NLP领域,催生了“预训练-微调”范式和大语言模型(LLM)时代,并正在向计算机视觉(ViT)和多模态领域扩展。
深度学习应用领域#
CV(计算机视觉)任务#
1. 图像分类(Image Classification)#
- 输入:图片
- 输出:类别(如"猫"、“狗”、“人”)
- 示例:ImageNet分类任务
2. 目标检测(Object Detection)#
- 输入:图片
- 输出:包含目标框的集合
- 每个目标框包含:
- 左上角坐标 $(x_1, y_1)$
- 右下角坐标 $(x_2, y_2)$
- 类别(如"猫")
- 置信度(如 $0.95$ )
- 每个目标框包含:
- 特点:稀疏预测(只预测有目标的位置)
- 应用:自动驾驶、安防监控
3. 图像分割(Image Segmentation)#
- 输入:图像
- 输出:与输入分辨率相同的图像,每个像素对应一个类别
- 特点:稠密预测(对每个像素都进行预测)
- 应用:自动驾驶(识别道路、车辆、行人等)
4. 单目深度估计(Monocular Depth Estimation)#
- 输入:单张图片
- 输出:深度图(每个像素的深度值)
- 应用:自动驾驶、AR/VR
5. 自动驾驶感知#
- 输入:激光雷达点云图或多模态感知数据
- 处理:网络将点云转换为物体集合
- 输出:决策模块根据物体集合规划路线
NLP(自然语言处理)任务#
- 机器翻译:将一种语言翻译成另一种语言
- 语音识别:将语音转换为文本
- 文本生成:生成自然语言文本
- 情感分析:分析文本的情感倾向
大模型和生成式AI#
统一CV和NLP领域#
ChatGPT:
- 分析图片
- 生成图片
- 翻译
- 对话聊天
Midjourney:专门做图片生成
Sora:视频生成
AI游戏引擎和世界模型#
- Genie 3:
- 模拟整个世界
- 接受自然语言输入
- 实时操作画面
VLA(Vision Language Action Model)#
- 用途:具身智能
- 功能:可输出对机器人的控制信号
- 应用:机器人操作、智能助手
重要常识#
机器学习基础#
| 概念 | 含义 |
|---|---|
| 过拟合 | 模型在训练集上表现好、泛化差;解决:正则化、Dropout、数据增强、早停 |
| 欠拟合 | 模型容量不足,训练/测试均差;解决:增加模型复杂度、特征工程 |
| 偏差-方差权衡 | 偏差高→欠拟合,方差高→过拟合;需在二者间平衡 |
| 训练/验证/测试集 | 训练拟合参数,验证调超参,测试做最终评估;典型比例 7:2:1 或 8:1:1 |
模型规模与计算#
| 概念 | 含义 |
|---|---|
| 参数量(Params) | 可学习权重总数,单位 M/B;与模型容量、显存占用相关 |
| FLOPs | 浮点运算次数,衡量计算量;与推理速度、能耗相关 |
| 显存占用 | 与 batch size、模型参数量、激活值相关;大模型常需梯度检查点 |
训练范式#
| 概念 | 含义 |
|---|---|
| 预训练(Pretrain) | 在大规模无标注/弱标注数据上学习通用表示 |
| 微调(Fine-tune) | 在特定任务数据上对预训练模型继续训练 |
| 迁移学习 | 将源域知识迁移到目标域;预训练+微调是典型形式 |
| 零样本/少样本 | 无或极少目标域标注;依赖强预训练与提示设计 |
数据与标注#
| 概念 | 含义 |
|---|---|
| 数据增强 | 通过变换扩充数据(旋转、裁剪、颜色抖动等),提升泛化 |
| 标注噪声 | 标签错误;影响监督学习,可结合噪声鲁棒损失或清洗策略 |
| 长尾分布 | 类别不平衡;可考虑重采样、类别权重、Focal Loss 等 |
评估指标速查#
| 任务 | 常用指标 |
|---|---|
| 分类 | 准确率、精确率、召回率、F1、AUC |
| 回归 | MSE、MAE、$R^2$ |
| 检测 | mAP、IoU |
| 分割 | mIoU、Dice |
| 生成 | FID、IS、CLIP Score |
分类问题#
分类与回归的区别#
| 特性 | 回归问题 | 分类问题 |
|---|---|---|
| 输出 | 连续值(实数) | 离散值(类别) |
| 目标 | 寻找目标分布的最优拟合 | 寻找决策边界 |
| 示例 | 房价预测、温度预测 | 图像分类、垃圾邮件检测 |
| 损失函数 | 均方误差(MSE) | 交叉熵(Cross-Entropy) |
决策边界#
分类问题的目标是找到决策边界,将不同类别的数据分开。
示例:
- 二分类:一条直线或曲线将两类数据分开
- 多分类:多条边界将多个类别分开
One-Hot编码#
为什么需要One-Hot编码?#
问题:直接用数值表示类别会引入噪声。
示例:
- 如果用 $1, 2, 3$ 表示"猫、狗、人"
- 模型会认为 $2$ 是 $1$ 和 $3$ 的中间值
- 但实际上类别之间没有大小关系
原理#
One-Hot编码 将类别拆解到不同维度,使类别正交、独立。
特点:
- 每个类别用一个向量表示
- 向量中只有一个位置是1,其他都是0
- 不同类别的向量正交(点积为0)
应用示例#
三分类问题(猫、狗、人)#
猫 → [1, 0, 0]
狗 → [0, 1, 0]
人 → [0, 0, 1]手写数字分类(0-9)#
0 → [1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
1 → [0, 1, 0, 0, 0, 0, 0, 0, 0, 0]
2 → [0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
...
9 → [0, 0, 0, 0, 0, 0, 0, 0, 0, 1]代码示例#
import torch
# 类别标签
labels = [0, 1, 2] # 猫、狗、人
# One-Hot编码
num_classes = 3
one_hot = torch.zeros(len(labels), num_classes)
one_hot[range(len(labels)), labels] = 1
print(one_hot)
# 输出:
# tensor([[1., 0., 0.],
# [0., 1., 0.],
# [0., 0., 1.]])Softmax函数#
作用#
Softmax函数 将神经网络输出的实数域值转换为概率。
满足概率的两个条件:
- 值大于0:$P_i > 0$
- 总和为1:$\sum_i P_i = 1$
计算方法#
对于 $n$ 个输出值 $O_1, O_2, \ldots, O_n$ :
$$ P_i = \frac{e^{O_i}}{\sum_{j=1}^{n} e^{O_j}} $$其中:
- $e^{O_i}$ :对每个输出值取指数
- $\sum_{j=1}^{n} e^{O_j}$ :所有输出值的指数和
- $P_i$ :第 $i$ 个类别的概率
特性#
- 单调性:输出值越大,概率越大
- 归一化:所有概率之和为1
- 可微性:便于反向传播
代码示例#
import torch
import torch.nn.functional as F
# 神经网络输出(3个类别)
logits = torch.tensor([[2.0, 1.0, 0.1]])
# Softmax
probs = F.softmax(logits, dim=1)
print(probs)
# 输出: tensor([[0.6590, 0.2424, 0.0986]])
# 三个值之和为1,且都是正数数值稳定性#
问题:直接计算 $e^x$ 可能溢出(有限浮点数精度下)
解决方案:减去最大值
$$ P_i = \frac{e^{O_i - \max(O)}}{\sum_{j=1}^{n} e^{O_j - \max(O)}} $$这样不会改变结果,但数值更稳定。
交叉熵损失函数#
为什么不用平方误差?#
平方误差损失函数不适合分类问题:
- 问题:对于分类问题,我们关心的是预测概率,而不是具体的数值
- 示例:预测 $[0.9, 0.1]$ 和 $[0.6, 0.4]$ 对于真实标签 $[1, 0]$ 的平方误差相同,但前者更好
公式#
$$ L = -\sum_{i} y_i \cdot \log(\hat{y}_i) $$其中:
- $y_i$ :真实标签(One-Hot编码)
- $\hat{y}_i$ :预测概率(Softmax输出)
- $i$ :类别索引
特点#
- 只关注当前样本所处类别的维度:因为One-Hot编码中只有一个是1,其他都是0
- 使预测概率最大:损失函数最小化等价于最大化正确类别的预测概率
推导示例#
以输入维度为3的二分类问题为例:
1. 前向过程#
输入 x → 线性层 → 输出 O = [O₁, O₂]2. 计算Softmax#
$$ P_1 = \frac{e^{O_1}}{e^{O_1} + e^{O_2}}, \quad P_2 = \frac{e^{O_2}}{e^{O_1} + e^{O_2}} $$3. 计算损失#
假设真实标签是 $[1, 0]$ (第一类):
$$ L = -[1 \cdot \log(P_1) + 0 \cdot \log(P_2)] = -\log(P_1) $$4. 求导#
$$ \frac{\partial L}{\partial O_1} = P_1 - 1 \quad \text{(如果真实类别是1)} $$ $$ \frac{\partial L}{\partial O_2} = P_2 \quad \text{(如果真实类别是1)} $$5. 更新参数#
使用梯度下降更新权重和偏置。
注意#
在PyTorch中,nn.CrossEntropyLoss() 已经包含了Softmax操作,所以:
- 输入:logits(未经过Softmax的原始输出)
- 标签:类别索引(不是One-Hot编码)
- 内部:自动应用Softmax,然后计算交叉熵