基础认知
人工智能(AI, Artificial Intelligence)
- 定义:最广泛的技术概念,旨在使机器模拟人类智能行为。
- 核心能力:
- 理解自然语言
- 识别图像/声音
- 解决问题与推理
- 自主决策与学习
- 特点:
- 涵盖所有智能系统的研究与开发
- 不限定具体实现方式(包括规则引擎、机器学习等)。
- 应用场景:智能助手、自动驾驶、机器人、游戏AI等。
机器学习(ML, Machine Learning)
- 定义:实现AI的核心方法,通过数据驱动模型自动改进任务性能。
- 核心原理:
- 依赖算法和统计模型,从数据中“学习”规律。
- 无需显式编程指令(与传统程序不同)。
- 典型技术:
- 监督学习:线性回归、支持向量机(SVM)、决策树
- 无监督学习:聚类(如K-means)、降维(如PCA)
- 强化学习:Q-learning、策略梯度
- 特点:
- 数据依赖性高,性能随数据量提升。
- 需人工设计特征(传统方法中)。
- 应用场景:预测分析、推荐系统、欺诈检测等。
深度学习(DL, Deep Learning)
- 定义:机器学习的分支,基于深层神经网络结构进行学习。
- 核心原理:
- 使用多层(“深度”)神经网络自动提取数据特征。
- 擅长处理高维度、非结构化数据(如图像、文本、音频)。
- 典型模型:
- 卷积神经网络(CNN):图像识别
- 循环神经网络(RNN):序列数据(如语言模型)
- 生成对抗网络(GAN):数据生成
- 特点:
- 需大规模数据和算力支持。
- 减少人工特征工程,自动学习抽象特征。
- 应用场景:计算机视觉、语音识别、自然语言处理(NLP)等。
层级关系
AI ⊃ ML ⊃ DL
- AI 是顶层目标,ML 是实现AI的核心路径,DL 是ML中依赖深度神经网络的高阶方法。
- 关键区别:
- ML依赖人工特征工程,DL通过多层网络自动提取特征。
- DL在复杂任务(如图像分类)中表现更优,但需更大算力和数据量。
时间线
1. 符号主义(20世纪50-70年代)
- 1950年:图灵设计国际象棋程序,提出“图灵测试”概念。
- 1962年:IBM Arthur Samuel的跳棋程序战胜人类高手(第一次AI浪潮)。
- 特点:以专家系统和规则逻辑为主导,依赖符号推理。
2. 统计主义(20世纪80-2000年)
- 1993年:Vapnik提出支持向量机(SVM),成为统计学习代表方法。
- 1997年:IBM“深蓝”战胜国际象棋冠军卡斯帕罗夫(第二次AI浪潮)。
- 特点:基于概率统计模型解决分类、预测问题。
3. 神经网络与深度学习(21世纪初期-2016年)
- 2012年:AlexNet在ImageNet竞赛夺冠,引爆深度学习革命(卷积神经网络崛起)。
- 2016年:Google AlphaGo战胜李世石(第三次AI浪潮)。
- 特点:神经网络复兴,依赖大数据和算力提升。
4. 大规模预训练模型时代(2017年-至今)
- 2017年:Google提出Transformer框架(NLP领域里程碑)。
- 2018年: BERT(双向预训练模型)和GPT(生成式预训练)问世,开启大模型竞赛。
- 2022年:OpenAI发布ChatGPT,推动AIGC(生成式AI)普及。
- 2023年-至今:全球“百模大战”(如GPT-4、文心一言、Claude等),大模型进入高速迭代阶段。
符号推理 → 统计学习 → 神经网络 → 大模型AIGC
每次突破均伴随算法创新(如Transformer)、算力提升(GPU/TPU)和数据规模化(互联网文本/多模态数据)。当前焦点已从专用AI转向通用人工智能(AGI)探索。
深度学习框架
对比维度 | PyTorch | TensorFlow | PaddlePaddle | ONNX |
---|---|---|---|---|
开发者/机构 | Facebook(Meta) | 百度 | 微软主导,社区维护 | |
发布年份 | 2016 | 2015 | 2016 | 2017 |
编程语言 | Python(底层C++) | Python(底层C++、CUDA) | Python(底层C++) | 协议标准(支持多种语言) |
动态图/静态图 | 动态为主,支持TorchScript静态图 | 静态图为主,TF 2.x默认动态图(Eager Execution) | 动静结合,默认静态图 | 非框架,主要是模型交换格式 |
可视化工具 | TensorBoard(兼容),torch.utils.tensorboard | TensorBoard | VisualDL(自研) | 无直接可视化工具,可配合其他工具 |
训练易用性 | 简单易用,面向研究 | TF 2.x后也较易用,TF 1.x偏复杂 | API设计类似PyTorch,中文文档友好 | 非训练框架,负责模型格式交换和推理 |
部署支持 | TorchScript、ONNX、TorchServe等 | TensorFlow Lite、TensorFlow.js、TF Serving等 | Paddle Lite、Paddle Serving、Paddle.js等 | ONNX Runtime 可部署多平台,如移动端、服务器、浏览器等 |
推理性能 | 良好,支持ONNX加速推理 | 很强,TF Serving + XLA优化 | 不错,国产设备适配优化良好 | 优秀,尤其适配硬件后端如NVIDIA TensorRT、OpenVINO等 |
社区活跃度 | 非常活跃,学术界主流 | 非常活跃,工业界广泛使用 | 中国社区活跃,海外影响力略低 | 中立框架,支持多框架模型转换,社区支持不错 |
模型生态 | HuggingFace、TorchHub等丰富 | TensorFlow Hub、TF Model Zoo | PaddleHub、PaddleNLP、PaddleDetection等 | 提供通用模型格式支持,许多主流模型支持导出为ONNX格式 |
硬件支持 | GPU(NVIDIA)、CPU、MPS(Mac)、部分TPU支持 | 全面支持GPU、TPU、CPU等 | 支持GPU(NVIDIA)、昇腾、昆仑芯、CPU等 | ONNX Runtime 支持 GPU、CPU、NPU、TPU 等多种硬件后端 |
跨平台部署 | 支持 | 支持 | 支持 | 强,适合在多平台间迁移模型 |
中文文档支持 | 一般,社区翻译 | 一般,官方翻译为主 | 强,官方中文文档完善 | 一般,偏向开发者为主 |
环境配置
-
安装 Miniconda:https://www.anaconda.com/docs/getting-started/miniconda/install#power-shell
-
创建虚拟环境:
-
安装 Pytorch:https://pytorch.org/
-
验证安装:
-
输出:
张量基础
概念
张量(Tensor)是 多维数组 的一种通用表示,是 PyTorch 中存储和操作数据的基本结构。
维度 | 名称 | 举例 |
---|---|---|
0 维 | 标量 (scalar) | 7 |
1 维 | 向量 (vector) | [7, 7] |
2 维 | 矩阵 (matrix) | [[7, 8], [9, 10]] |
3 维及以上 | 多维张量 | [[[1, 2], [3, 4]], [[5, 6], [7, 8]]] |
创建张量
- 张量维度查看:使用
.ndim
或.dim()
- 形状查看:使用
.shape
- 取值:当张量只有一个值的时候,使用
.item()
创建随机张量跟随机种子有关:
类型转换
数字类型:
Numpy数组转换:
使用对象拷贝:
基本运算
运算 | 操作符方式 | 不改变原张量 | 改变原张量 |
---|---|---|---|
加法 | a + b |
a.add(b) |
a.add_(b) |
减法 | a - b |
a.sub(b) |
a.sub_(b) |
乘法 | a * b |
a.mul(b) |
a.mul_(b) |
除法 | a / b |
a.div(b) |
a.div_(b) |
取负 | -a |
a.neg() |
a.neg_() |
点积运算
点积定义:
\mathbf{a} \cdot \mathbf{b} = \sum_{i=1}^{n} a_i b_i
点积展开(n = 3):
\mathbf{a} \cdot \mathbf{b} = a_1 b_1 + a_2 b_2 + a_3 b_3
矩阵乘法形式
\mathbf{a} \cdot \mathbf{b} =
\begin{bmatrix}
a_1 & a_2 & \dots & a_n
\end{bmatrix}
\begin{bmatrix}
b_1 \\
b_2 \\
\vdots \\
b_n
\end{bmatrix}
= \sum_{i=1}^{n} a_i b_i
点积与夹角的关系:
\mathbf{a} \cdot \mathbf{b} = \|\mathbf{a}\| \|\mathbf{b}\| \cos{\theta}
例如设:
A = \begin{bmatrix}
1 & 2 & 3 \\
4 & 5 & 6
\end{bmatrix}, \quad
B = \begin{bmatrix}
7 & 8 & 9 \\
10 & 11 & 12 \\
13 & 14 & 15
\end{bmatrix}
矩阵乘积:
AB = \begin{bmatrix}
1\cdot7 + 2\cdot10 + 3\cdot13 & 1\cdot8 + 2\cdot11 + 3\cdot14 & 1\cdot9 + 2\cdot12 + 3\cdot15 \\
4\cdot7 + 5\cdot10 + 6\cdot13 & 4\cdot8 + 5\cdot11 + 6\cdot14 & 4\cdot9 + 5\cdot12 + 6\cdot15
\end{bmatrix}
=
\begin{bmatrix}
66 & 72 & 78 \\
156 & 171 & 186
\end{bmatrix}
使用 PyTorch 的 @
运算(矩阵乘法):
使用 NumPy 的 @
运算:
行列索引
操作 | 代码 | 说明 |
---|---|---|
获取第 0 行 | a[0] |
返回 [10, 20, 30] |
获取第 1 行第 2 列的值 | a[1][2] 或 a[1, 2] |
返回 60 |
获取第 2 列 | a[:, 2] |
返回 [30, 60, 90] (所有行的第 2 列) |
获取第 0 列 | a[:, 0] |
返回 [10, 40, 70] |
获取第 0~1 行 | a[0:2] |
返回前两行 |
获取第 1~2 行,第 0~1 列 | a[1:3, 0:2] |
取子矩阵 |
形状操作
函数名 | 功能描述 | 重点备注 |
---|---|---|
reshape() |
改变张量形状,返回新张量 | 不一定共享内存,推荐用 |
view() |
改变张量形状,返回视图 | 要求连续内存 |
squeeze() |
去掉维度为1的维度 | 变“瘦” |
unsqueeze() |
增加一个维度 | 变“胖” |
transpose() |
交换两个维度 | 用于2D或高维张量 |
permute() |
按任意顺序排列维度 | 比transpose() 更灵活 |
contiguous() |
将张量在内存中变为连续 | 通常和view() 一起用 |
张量拼接
方式 | 是否增加维度 | 场景推荐 |
---|---|---|
torch.cat() |
否 | 沿现有维度拼接 |
torch.stack() |
构造新维度,构造 batch | |
torch.hstack() |
否 | 类似横向拼接 |
torch.vstack() |
否 | 类似纵向拼接 |
torch.dstack() |
堆叠到第三个维度(图像) |
沿指定维度拼接多个张量:
增加新维度后进行拼接(类似堆叠):
torch.hstack()
和 torch.vstack()
(类似 numpy):
torch.dstack()
— 沿第三个维度堆叠:
自动微分
反向传播
概念
反向传播(Backpropagation)是一种高效的链式法则(链式求导)算法,用于计算神经网络中每个参数的梯度,从而进行优化(如梯度下降)。
先通过前向传播计算输出和损失,再通过反向传播逐层把误差“传回去”,计算每个参数对误差的贡献(导数),再用优化器更新参数。
数学原理
前向传播:
对于一个 层的神经网络,前向传播过程可表示为:
\begin{aligned} \mathbf{z}^{(l)} &= \mathbf{W}^{(l)}\mathbf{a}^{(l-1)} + \mathbf{b}^{(l)} \\ \mathbf{a}^{(l)} &= f^{(l)}(\mathbf{z}^{(l)}) \end{aligned}其中:
- 是第 层的权重矩阵
- 是第 层的偏置向量
- 是第 层的激活函数
- 是第 层的激活值( 为输入)
损失函数:
定义损失函数 ,其中 表示所有参数 ():
J(\theta) = \frac{1}{m}\sum_{i=1}^m L(\mathbf{y}^{(i)}, \mathbf{a}^{(L)(i)})链式法则:
反向传播的关键是计算损失函数对各层参数的偏导数
首先计算输出层的误差 :
\delta^{(L)} = \frac{\partial J}{\partial \mathbf{z}^{(L)}} = \frac{\partial J}{\partial \mathbf{a}^{(L)}} \odot f'^{(L)}(\mathbf{z}^{(L)})其中 表示逐元素相乘(Hadamard积)。
再计算隐藏层误差,对于 ,误差反向传播:
\delta^{(l)} = \left((\mathbf{W}^{(l+1)})^\top \delta^{(l+1)}\right) \odot f'^{(l)}(\mathbf{z}^{(l)})最后参数梯度计算,利用误差 计算参数梯度:
\begin{aligned} \frac{\partial J}{\partial \mathbf{W}^{(l)}} &= \delta^{(l)} (\mathbf{a}^{(l-1)})^\top \\ \frac{\partial J}{\partial \mathbf{b}^{(l)}} &= \delta^{(l)} \end{aligned}反向传播算法可总结为:
- 前向传播计算各层激活值
- 计算输出层误差
- 反向传播误差至各隐藏层
- 计算各层参数梯度
- 使用梯度下降更新参数
反向传播本质上是多元微积分中链式法则的递归应用。
以两层神经网络为例:
\frac{\partial J}{\partial \mathbf{W}^{(1)}} = \underbrace{\frac{\partial J}{\partial \mathbf{a}^{(2)}}}_{\text{输出层}} \cdot \underbrace{\frac{\partial \mathbf{a}^{(2)}}{\partial \mathbf{z}^{(2)}}}_{\text{激活导数}} \cdot \underbrace{\frac{\partial \mathbf{z}^{(2)}}{\partial \mathbf{a}^{(1)}}}_{\mathbf{W}^{(2)}} \cdot \underbrace{\frac{\partial \mathbf{a}^{(1)}}{\partial \mathbf{z}^{(1)}}}_{\text{激活导数}} \cdot \underbrace{\frac{\partial \mathbf{z}^{(1)}}{\partial \mathbf{W}^{(1)}}}_{\mathbf{a}^{(0)}}
这种链式分解使得我们可以从输出层开始,逐层反向计算梯度,避免重复计算。
Pytorch 自动微分机制
自动微分(Automatic Differentiation,简称 Autograd)是指:自动计算张量的导数(梯度),用于模型训练中的反向传播。
PyTorch 中只需设置 requires_grad=True
,它就会记录所有与该张量相关的操作并构建一个计算图(Computational Graph)。
反向传播时,PyTorch 会自动根据链式法则计算所有梯度。
PyTorch 的自动微分采用动态图机制(Dynamic Computational Graph),主要特点:
- 每次运算时动态构建计算图;
- 正向传播时记录运算过程;
- 调用
.backward()
自动执行反向传播; - 每个张量有三个重要属性:
属性 | 说明 |
---|---|
tensor.data |
原始数值,不包含梯度信息 |
tensor.grad |
当前张量的梯度值(在反向传播后自动赋值) |
tensor.requires_grad |
是否需要对该张量进行求导 |
基础用法:
对多维张量求导:
多次反向传播(需要 retain_graph=True):
不需要梯度的操作:
.detach()
:从计算图中分离: