神经网络模型
定义:模仿人脑的计算模型,由连接节点(神经元)组成,节点按照层次排列。
- 神经元(Neuron):
- 定义:神经网络基本单元,由输入(Input)、’权重(weights)、偏置(bias)、求和函数(summation function)、阈值(activation potential)、激活函数(activation function)、输出(output)构成。
- 用途:接收输入数据(起始点,特征向量),将输入数据加权求和与偏置相加,通过阈值和激活函数处理后,产生输出数据(终点,预测结果)。
- 网络层(Layer):
- 定义:由多个神经元组成,神经元之间的连接密度和类型构造网络配置。
- 组成(最简):输入层(Input Layer,接收输入数据)、隐藏层(Hidden Layer, 数据处理)、输出层(Output Layer, 产生输出结果)。
前馈神经网络(Feedforward Neural Networks, FNN)
- 定义:基础神经网络,数据从输入到输出单向流动。
- 特点:数据从输入层开始,经过隐藏层计算,最后到达输出层输出预测结果,数据单向流动,全过程没有反馈和循环等方向操作。
- 结构:输入层(网络数据入口,每个节点代表一种输入特征)、隐藏层(每层由多个神经元构成,每个神经元通过激活函数体现其非线性能力,用于获取数据的非线性特征)、输出层(网络预测结果出口,其节点个数和问题有关)。
卷积神经网络(Convolutional Neural Networks, CNN)
- 定义:专门处理网络拓扑结构数据的神经网络模型,是机器视觉核心技术。可以使用卷积层提取空间特征。
- 结构:
- 输入层(Input Layer):原始数据图像入口,用于接收类似于图像的三维数组(图像高度、宽度和颜色通道)。
- 卷积层(Convolutional Layer):根据卷积公式,用卷积核(Kernel)提取局部特征,生成特征图。
- 非线性激活函数层(Activation Function):引入非线性特征,增强网络适应性。
- 池化层(Pooling Layer):在卷积层后,在保留最重要特征信息情况下,通过池化技术(最大池化-区域最大值/平均池化-区域平均值)降低特征图空间维度,减少计算和参数数量,生成池化特征图。
- 归一化层(Normalization Layer, 可选):采用归一化技术(局部响应归一化/批归一化),使多维特征图转换为一维向量,加速训练,提高模型稳定性。
- 正则化(Regularization, 可选):用于防止模型过拟合。
- 损失函数层(Loss Function):衡量模型预测和实际结果之间的差异。
- 优化器(Optimizer):根据损失函数对参数的梯度更新模型参数。
- 全连接层(Fully Connected Layer):用于综合所有提取的特征映射到输出,并进行最后的分类或回归。
- 输出层(Output Layer):模型预测结果出口。
循环神经网络(Recurrent Neural Networks, RNN)
- 定义:允许信息反馈循环,适用于序列数据(时间序列、语音识别、自然语言)。
- 特点:“记忆能力”,使用隐状态(hidden state),在隐藏层可以保留以前时间调用的信息,进而捕获数据中的时间等前后依赖关系。
- 典型RNN模块:
- torch.nn.RNN: 基本RNN单元。
- torch.nn.LSTM: 长短期记忆网络(Long short-Term Memory, LSTM),RNN的变种,能学习长期依赖关系。
- torch.nn.GRU: 门控循环单元,LSTM简化版本。
神经网络模型训练过程简介(Training Process)
- 数据ETL:
- 收集和处理数据,包括数据清洗、标准化和归一化。
- 数据分割,包括训练集、验证集和测试集。
- 定义网络模型:
- 设计模型架构,在业务需求、设备支持、项目交付、行管规则等要求下,选择合适的模型,定义网络层、前向传播过程、激活函数等。
- 设置初始化模型参数(权重和偏置)。
- 选择损失函数:根据问题特点选择合适的损失函数(分类或回归等)。
- 选择优化器:根据需要选择优化算法,更新模型参数。
- 前向传播(Forward Propagation):
- 在每次迭代中,根据输入数据通过模型传递,计算预测输出。
- 开启训练前需要清除梯度,调整模型进入训练模式(model.train())。
- 计算损失(Calulate Loss):
- 使用损失函数计算评估预测输出和实际输出之间的差异。
- 反向传播(Backpropagation):
- 利用自动求导计算损失函数相对于模型参数(权重和偏置)的梯度。
- 一般调度torch.nn.MSEloss().backward()等计算。
- 参数更新(Parameter Update):
- 调用优化器,根据计算出的梯度和优化器策略,更新模型参数。
- 一般通过optim.SGD().step()等更新参数。
- 迭代优化(Iteration):
- 重新循环上述步骤,直到模型在验证集上是性能不能再提升,或者迭代达到预定次数。
- 此过程也是试算过程的开始,考虑到数据、方案、环境等因素的不完善,模型方案不一定有好的结果,需不断校验检查。
- 测试评估:
- 利用测试集评估模型性能,确保模型没有过拟合或者欠拟合。
- 计算准确率(Accuracy):计算正确预测比例(分类问题)。
- 测试评估前需要调整模型进入评估模式(model.eval()),并且在评估过程中要禁用梯度计算。(torch.no_grad(), 减少不必要的计算和内存开销),以确保模型能正确推理。
- 模型调优:
- 根据模型在测试集上的表现调参,优化模型各项配置和参数。
- 部署模型:
- 将训练好的模型,根据部署平台的使用要求,部署到生产环境中,用于实际工作。
PyTorch神经网络工具字典
关键模块:torch.nn(网络模块)、torch.optim(优化器模块)、 torch.autograd(自动微分)
- torch.nn模块组成:
- 关键类:torch.nn.Module类,是所有神经网络模块的基类,可以用来从这个基类派生出自己的模型类,并定义其中的网络层结构和前向传播过程。自定义神经网络模型时,需要定义这两部分:init()(定义网络层)、forward()(定义数据前向传播过程)。
- 预定义层(Modules):包含各种层组件,如卷积层、线性层、池化层、归一化层、循环神经网络层、嵌入层、Dropout层、非线性激活函数(Activation Function,决定神经元是否应该被激活)等。
- 容器类(Containers):由模块(torch.nn.Module)、序列(torch.nn.Sequential)、模块列表(torch.nn.ModuleList)、模块字典(torch.nn.ModuleDict)、参数列表(torch.nn.ParameterList)、参数字典(torch.nn.ParameterDict)组成。
- 损失函数(Loss Function):衡量模型预测值和真实值之间的差异。
- 实用函数(Functional Interface):torch.nn.functional(作用于张量上的实现和层对象相同功能的函数)。
- 初始化方法:torch.nn.init(权重初始化策略)。
- torch.nn常用组件:
| 组件 |
描述和特点 |
| torch.nn.Conv2d() |
2D卷积层,常用于图像 |
| 组件 |
描述和特点 |
| torch.nn.Linear(in_features,out_features) |
输入in_features个特征,输出out_features个特征 |
| 组件 |
描述和特点 |
| torch.nn.MaxPool2d() |
2D最大池化层,常用于降维 |
| 组件 |
描述和特点 |
| torch.nn.functional.relu() |
定义为f(x) = max(0, x),常用于隐藏层 |
| torch.nn.functional.sigmoid() |
输出值为0和1之间,适合二分类问题 |
| torch.nn.functional.tanh() |
输出值在-1和1之间,适合输出层使用 |
| torch.nn.functional.softmax |
将输出转换为概览分布,适用多分类的输出层 |
| 组件 |
描述和特点 |
适配场景 |
| torch.nn.MSELoss() |
均方误差(L2范数),计算输出和目标值之间的平方差 |
回归问题 |
| torch.nn.CrossEntropyLoss() |
计算输出和目标值之间的交叉熵 |
分类问题 |
| torch.nn.BCEWithLogitsLoss() |
计算Sigmoid激活和二元交叉熵的损失 |
二分类问题 |
- torch.optim
- 功能:根据损失函数的梯度,在训练过程中自动化更新网络模型参数(权重和偏置),在避免局部最优的情况下,参数加速收敛到最优解,进而使模型预测结果逐步优化逼近目标值。
- 优化器(Optimizer)选择判断:数据是否稀疏->是否需要快速收敛
- 常用优化器类型:
| 优化器名称 |
中文名称 |
调度方法 |
收敛速度 |
内存占用 |
超参数敏感度 |
特点 |
适用场景 |
| SGD |
随机梯度下降 |
torch.optim.SGD(params, lr = 0.01, momentum = 0, weight_decay = 0) |
慢 |
低 |
高 |
简单,可添加动量加速收敛,适合和基准比较,使用梯度的移动平均值(一阶矩) |
基础简单模型 |
| Adam |
自适用矩估计 |
torch.optim.Adam(params, lr = 0.001, betas = (0.9, 0.999), eips = 1e-08, amsgrad = False) |
快 |
中 |
低 |
可自适应学习率,可计算每个参数的学习率,结合SGD和RMSprop的特点 |
绝大多数的深度学习任务 |
| RMSprop |
均方根传递 |
torch.optim.RMSprop(params, lr = 0.01, alpha = 0.99) |
快 |
中 |
中 |
适应学习率,使用平方梯度的移动平均值来缩放梯度(二阶矩) |
RNN网络 |
| Adagrad |
自适应学习率应梯度下降 |
torch.optim.Adagrad(params, lr = 0.01, initial_accumulator_value = 0) |
先快后慢 |
中 |
高 |
参数独立学习率,学习率随时间减小 |
稀疏数据 |
4 torch.autograd
- 功能:各种类和函数对任意标量函数计算数学函数的导数,主要用来自动计算梯度。深度学习自动求导主要用于在神经网络计算梯度和反向传播算法实现。
参考文献
[1] 深度学习与PyTorch入门实战
[2] Zhang, A., Lipton, Z. C., Li, M., & Smola, A. J. (2023). Dive into Deep Learning. Cambridge University Press. URL: https://D2L.ai
[3] PyTorch深度学习
[4] 菜鸟教程
[5] 深入浅出PyTorch