深度学习总结
1. 深度学习基础概念1.1 深度学习的核心Tensor张量深度学习底层的数据结构就是Tensor张量。Tensor 可以理解为多维数组是深度学习框架中数据流动的基本单位。对应关系数学概念Tensor维度标量0维 Tensor向量1维 Tensor矩阵2维 Tensor图片3维 Tensor视频/批量图片4维 Tensor例如图片数据一张 RGB 图片Height × Width × Channel 224 × 224 × 3在神经网络训练时通常增加 batch 维度Batch × Channel × Height × Width 32 × 3 × 224 × 2241.2 深度学习开发框架 PyTorchPyTorch 是目前主流深度学习开发框架。作用创建神经网络Tensor计算自动求导GPU加速模型训练模型保存PyTorch核心组成PyTorch ├── Tensor │ ├── Autograd 自动微分 │ ├── nn 神经网络模块 │ ├── Optim 优化器 │ └── DataLoader 数据加载2. PyTorch Tensor基础操作函数作用示例用途torch.tensor已有数据创建Tensortensor([1,2])数据转换torch.rand生成0~1随机数rand(2,3)随机初始化torch.randint生成随机整数randint(0,10)生成标签torch.manual_seed固定随机种子manual_seed(1)实验复现torch.zeros全0 Tensorzeros(2,3)bias初始化torch.ones全1 Tensorones(2,3)mask、占位torch.type修改Tensor类型float32控制计算精度2.1 创建Tensor方式1直接创建torch.tensor([1,2,3])生成tensor([1,2,3])方式2numpy转换numpyimportnumpyasnp anp.array([1,2,3])torch.tensor(a)应用深度学习中经常数据采集 ↓ numpy ↓ tensor ↓ 神经网络2.2 Tensor矩阵计算运算符PyTorch写法含义运算规则示例ab/torch.add(a,b)张量加法对应元素相加[1,2][3,4][4,6]-a-b/torch.sub(a,b)张量减法对应元素相减[3,4]-[1,2][2,2]*a*b/torch.mul(a,b)元素乘法对应元素相乘[1,2]*[3,4][3,8]/a/b/torch.div(a,b)元素除法对应元素相除[4,6]/[2,3][2,2]ab矩阵乘法按矩阵乘法规则计算(m,n)(n,p)(m,p)矩阵乘法 matmul数学A(m×n) × B(n×p) C(m×p)PyTorchtorch.matmul(a,b)或者a b应用神经网络核心计算y Wxb其中W × x就是矩阵乘法。2.3 Tensor常用函数sum()求和例如torch.sum(x)用途损失计算Loss Σ(error)argmax()返回最大值位置。例如预测结果 [0.1,0.8,0.1]argmax类别1应用分类任务最终预测概率最大的位置 预测类别2.4 Tensor索引操作行列索引二维Tensor[ [1,2,3], [4,5,6] ]取第一行x[0]取第二列x[:,1]范围索引类似Python切片x[0:3]应用图片裁剪batch选择特征选择2.5 Tensor形状操作深度学习中非常重要很多模型错误都是shape不匹配导致。方法作用常用写法重点理解reshape改变张量形状x.reshape(2, 3)元素总数不能变squeeze删除长度为1的维度x.squeeze()/x.squeeze(0)只能删除size1的维度unsqueeze增加一个长度为1的维度x.unsqueeze(0)常用于增加 batch / channel 维度transpose交换两个维度x.transpose(0, 1)一次只交换两个维度permute按指定顺序重新排列多个维度x.permute(0, 2, 1)可以一次调整多个维度reshape()改变形状例如(2,3) 变成 (3,2)x.reshape(3,2)注意元素数量不能改变。squeeze()删除维度1的维度例如(1,3,224,224) ↓ (3,224,224)常用于模型输出处理。unsqueeze()增加一个维度例如(3,224,224) ↓ (1,3,224,224)作用增加batch维度。transpose()交换两个维度例如(2,3) ↓ (3,2)permute()多个维度交换。例如图片原H,W,C转换C,H,W代码x.permute(2,0,1)深度学习部署经常用。2.6 Tensor拼接cat()沿已有维度拼接。例如A[1,2] B[3,4] cat: [1,2,3,4]stack()创建新的维度。例如两个图片image1 image2stack后batch,image_channel,H,W训练数据通常使用stack。3. 自动微分 Autograd3.1 神经网络训练过程训练过程3.2 前向传播 Forward定义输入数据经过网络计算得到预测结果。例如输入图片经过CNN网络输出猫概率0.9 狗概率0.13.3 反向传播 Backward目的找到最优参数W b使Loss最小梯度是什么梯度表示参数变化对Loss影响方向。数学梯度 导数例如LossLf(w)求dL/dw然后更新ww-learning_rate×gradientPyTorch自动求导loss.backward()自动计算∂Loss/∂W4. 神经网络基础4.1 参数初始化神经网络参数weight(W) bias(b)初始化影响收敛速度是否梯度消失是否训练失败常见初始化方式我们在构建网络之后网络中的参数是需要初始化的。我们需要初始化的参数主要有权重和偏置偏置一般初始化为0即可而对权重的初始化则会更加重要。激活函数推荐初始化方法ReLUKaiming / HeLeaky ReLUKaiming / HeTanhXavier / GlorotSigmoidXavier / Glorot线性层Xavier 或框架默认初始化偏置bias通常初始化为01. Zero初始化全部W0缺点神经元学习能力一样。不推荐。2. Random随机初始化随机小数。3. Xavier初始化适合Sigmoid Tanh目的保持前后层方差稳定。4. Kaiming初始化Kaiming 初始化 根据fan_in自动控制随机权重的大小主要配合 ReLU / Leaky ReLU 使用目的是让深层网络中的激活值和梯度尽量保持稳定。适合ReLU目前CNN常用。5. Normal初始化正态分布随机。W初始化原则不要全部0一般ReLU网络 → KaimingSigmoid/Tanh → Xavierb初始化原则Bias通常初始化为0因为不会破坏对称性。4.2 激活函数使用场景常用激活函数普通隐藏层ReLUCNNReLU / SiLUYOLOSiLUTransformer / 大模型GELU二分类Sigmoid多标签分类Sigmoid多分类Softmax传统 RNNTanh / Sigmoid作用增加非线性。没有激活函数多层网络等价于一个线性模型。Sigmoid公式1/(1e^-x)输出0~1用途二分类输出层。缺点梯度消失。Tanh范围-1~1比Sigmoid中心化。ReLU公式max(0,x)优点计算简单收敛快缓解梯度消失目前隐藏层最常用。Softmax作用多分类概率转换。例如输出[2.5,1.0,0.2]Softmax猫 0.8 狗 0.15 鸟 0.05用于分类最后一层。激活函数选择位置选择隐藏层ReLU二分类输出Sigmoid多分类输出SoftmaxTransformer/GPTGELU4.3 PyTorch搭建神经网络核心继承nn.Module结构classNet(nn.Module):def__init__(self):初始化网络defforward(self,x):定义数据流流程输入 ↓ Linear ↓ ReLU ↓ Linear ↓ 输出5. 损失函数 Loss作用衡量预测值 和 真实值 之间差距目标让Loss越来越小。CrossEntropyLoss在多分类任务通常使用softmax将logits转换为概率的形式所以多分类的交叉熵损失也叫做softmax损失它的计算方法是多分类常用交叉熵损失例如图片分类猫 狗 汽车计算预测概率和真实类别差异。6. 神经网络优化算法优化算法核心思想学习率特点优点缺点适用场景SGD根据当前梯度更新参数W W - lr × grad固定或配合学习率调度器简单、内存占用小、泛化能力常较好容易震荡、收敛较慢对学习率敏感基础训练、CNN、大规模模型MomentumSGD 历史梯度的惯性沿之前的方向继续前进通常手动设置lr减少震荡、加速收敛多一个momentum参数SGD 容易来回震荡时Adagrad根据历史梯度平方和自动调整每个参数的学习率学习率会不断减小自动调学习率稀疏特征表现好AdaGrad 缺点是可能会使得学习率过早、过量的降低导致模型训练后期学习率太小较难找到最优解。稀疏数据、NLP 等RMSProp对历史梯度平方使用指数移动平均改进 Adagrad自适应学习率不会无限减小缓解 Adagrad 学习率下降过快的问题仍需调部分超参数RNN、非平稳问题AdamMomentum RMSProp同时考虑梯度方向和梯度平方每个参数自适应学习率收敛快、稳定、调参简单、通用性强有时泛化能力不如 SGD额外保存状态内存更大深度学习最常用的默认选择之一** SGD 看当前梯度Momentum 看当前梯度 历史方向Adagrad 自动降低学习率RMSProp 改进 AdagradAdam Momentum RMSProp是最常用的自适应优化器之一。 **目标更新参数WW-learning_rate×gradient简单任务和较小的模型SGD 或 Momentum复杂任务或有大量数据Adam 是最常用的选择因其在大部分任务上都表现优秀需要处理稀疏数据或文本数据Adagrad 或 RMSPropSGD基础梯度下降。缺点容易震荡。Momentum 动量法思想加入历史梯度。类似带惯性的梯度下降优点减少震荡。Adagrad特点自动调整学习率。适合稀疏数据。缺点学习率可能越来越小。RMSProp解决Adagrad学习率下降过快。Adam目前最常用。结合Momentum RMSProp优点收敛快参数少通用性强7. 学习率衰减学习率决定参数更新速度太大训练震荡。太小训练慢。常见方式等间隔衰减每N轮降低。指定间隔指定epoch降低。指数衰减越来越小lr × γ^epoch8. 正则化目的防止过拟合训练训练集很好 测试集差8.1 Dropout思想训练时随机关闭部分神经元。例如Dropout0.5表示50%神经元随机失活作用防止神经元过度依赖。训练随机关闭。推理全部开启。8.2 Batch NormalizationBN批量归一化。作用让每层输入保持稳定分布。优点加快训练提高稳定性减少梯度消失流程输入 ↓ 计算mean ↓ 计算variance ↓ 归一化 ↓ 缩放平移 ↓ 输出深度学习训练完整流程总结数据 ↓ Tensor ↓ Dataset/DataLoader ↓ 神经网络(nn.Module) ↓ Forward前向传播 ↓ Loss计算 ↓ Backward自动求梯度 ↓ Optimizer更新参数 ↓ 学习率调整 ↓ 训练完成 ↓ 模型导出 ↓ ONNX ↓ TensorRT/NPU部署