0. 基本概念
1. 线性回归
1.1 目标
使用pytorch框架实现线性回归的训练
1.2 相关概念
1.2.1 模型定义
为了简单起见,这里我们假设价格只取决于房屋状况的两个因素,即面积(平方米)和房龄(年)。接下来我们希望探索价格与这两个因素的具体关系。线性回归假设输出与各个输入之间是线性关系:
p r i c e = w a r e a ⋅ a r e a + w a g e ⋅ a g e + b \mathrm{price} = w_{\mathrm{area}} \cdot \mathrm{area} + w_{\mathrm{age}} \cdot \mathrm{age} + b price=warea⋅area+wage⋅age+b
1.2.2 模型损失函数以及求解过程
(1)回归问题常用损失函数:
- 均方误差(MSE)——本次选择
- 平均绝对误差(MAE)
- Huber损失(Smooth mean absolute error)
- log cosh损失
- quantile损失
(2)求解过程:梯度下降
常用梯度下降:
- 批量梯度下降(BGD)——本次选择
- 小批量梯度下降(SGD)
- 随机梯度下降(MBGD)
- 其他相关梯度下降方法
1.3 线性回归从零开始
1.3.1 构造数据与批量读取数据(batch)
目标:1. 随机构造样本,基于给定的w和b,添加一个随机量。2. 每次选择一批样本进行梯度下降,减少每次计算的运算量。
关键:torch.randn, torch.index_select,yield
1.3.2 模型、损失函数、优化函数定义
目标:1. 线性回归模型定义;2. 损失函数(MSE)定义;3. 优化函数(BGD)定义
关键:torch.mm, torch.view, torch.data
1.3.3 模型训练
伪代码如下:
初始化参数(训练次数、最小步长、w和b)
循环训练次数:
每次循环,以批次进行所有样本的遍历:
计算当前w和b下的误差
将误差往回传递
计算误差对w和b的梯度,并根据梯度和步长重新计算w和b
将梯度清零(不然下次计算梯度会进行累加)
1.4 使用pytorch模型实现
与1.3进行对比:
- 批量读取数据:使用torch.utils.data
- 模型定义:torch.nn.Module(主要用于实现前向传递)
- 损失函数:torch.nn.MSELoss()
- 优化函数:torch.optim
2. softmax和分类模型
2.1 目标
使用softmax函数将回归问题转换成分类问题
2.2 相关概念
2.2.1 Sof tmax的概念
- 进行二分类或多分类时,通过概率将回归问题转换为分类问题。
- 全连结:输入输出全连结
2.2.2 损失函数以及求解过程
(1)分类问题常用损失函数
- 交叉熵
(2)求解方法(与1.2.2一致)
2.3 softmax从零开始
2.3.1 构造数据与读取数据
(1)构造数据
图像数据:torchvision.datasets.FashionMNIST
(2)批量读取数据
torch.utils.data.DataLoader
2.3.2 模型训练过程
定义softmax函数
定义基于softmax函数的网络
定义损失函数
定义模型评价指标(准确率)
参数初始化
遍历循环次数
以小批量方式进行x和y的遍历
基于当前参数的网络预测值计算
损失函数计算
梯度清零
backward并计算梯度
更新参数
2.4 基于pytorch模型实现
与2.4.1的对比
- 网络模型:定义两层模型,使用nn.Sequential实现模型串联,并且每层模型都是定义为类型。
- 损失函数:nn.CrossEntropyLoss()
- 优化函数:torch.optim.SGD(net.parameters(), lr=0.1)
3. 多层感知机
3.1 目的
实现多层模型,实现神经网络模型拟合非线性模型
3.2 相关概念
3.2.1 隐藏层
在输入层与输出层之间的层次
3.2.2 激活函数
- ReLU函数
- Sigmoid函数
- tanh函数
ReLu函数是一个通用的激活函数,目前在大多数情况下使用。但是,ReLU函数只能在隐藏层中使用。
用于分类器时,sigmoid函数及其组合通常效果更好。由于梯度消失问题,有时要避免使用sigmoid和tanh函数。
在神经网络层数较多的时候,最好使用ReLu函数,ReLu函数比较简单计算量少,而sigmoid和tanh函数计算量大很多。
在选择激活函数的时候可以先选用ReLu函数如果效果不理想可以尝试其他激活函数。
3.3 多层感知机从零开始实现
获取数据:d2l.load_data_fashion_mnist
定义模型参数:一层输入、一层隐层、一层输出,所以有两组w/b
定义激活函数:relu
定义网络:输入层——隐层——输出层
定义损失函数:torch.nn.CrossEntropyLoss()
模型训练:
遍历循环次数
以小批量方式进行x和y的遍历
基于当前参数的网络预测值计算
损失函数计算
梯度清零
backward并计算梯度
更新参数
3.4 多层感知机pytorch实现
与3.3的对比
- nn.Sequential实现多层网络
- nn.Linear()实现线性回归
- nn.ReLU()实现激活函数