线性回归
线性模型
假设自变量x和因变量y的关系是线性的,则y可以表示为x的加权和
y=wx+b
目的是求出合适的权重w和偏置b建立模型进行预测
在高维数据集中表示为
y^=w1x1+...+wdxd+b
其中y^为y的估计值
使用向量表示wx为:y^=wTx+b
这里只需将w最后1列加入1 x中加入b 就可以将b合并进去得到:y^=wTx这在矩阵中也可以使用
损失函数
用于量化实际值与预测值之间的差距
常用平方误差函数:l(i)(w,b)=21(y^(i)−y(i))2 |添加系数21 使求导后系数为1
为度量模型在整个数据集的质量,提出损失均值:对上方n个样本的l(i)求和求均值:
L(w,b)=n1∑i=1nl(i)(w,b)
展开L(w)=2n1(Xw−y)T(Xw−y)对w求偏导:
∂w∂L(w)=n1XT(Xw−y)
为了最小化损失, 令偏导为0求最小值:XTXw−XTXy=0
即:w=(XTX)−1XTy
小批量随机梯度下降
w←w−∣β∣ηi∈β∑δwl(w,b)w←w−∣β∣ηi∈β∑x(i)(wTx(i)+b−y(i))b←b−∣β∣ηi∈β∑δbl(w,b)b←b−∣β∣ηi∈β∑(wTx(i)+b−y(i))
其中η为学习率lr,β为批量大小,δw,b对损失函数求关于(w,b)的偏导
获取数据集
假设数据集和真实的权重true_w和偏置true_b,用synthetic_data生成随机特征和对应的标签
读取数据集
TensorDataset将features和labels组合起来的元组(features[i],label[i]),方便DataLoader()使用
由于样本数量较大, 这里使用DataLoader生成一个迭代器,每次返回批次大小batch_size的样本数量
这里的data_iter是可迭代对象,可以使用iter(data_iter)转化为迭代器,使用next(iter(data_iter))依次获取1-10,11-20,21-30…的值
定义模型
在定义模型前先了解以下层和神经元
层和神经元
层是神经网络的基本构建块,从输入层输入数据,经过中间多个层,最后从输出层输出数据,每个层接受上一层的结果作为输入,输出的结果作为下一层的输入
- 常见层类型
- 全连接层(Fully Connected Layer / Linear Layer):每个输入与每个输出都有连接,通常用矩阵-向量乘法来表示。输入与权重矩阵相乘并加上偏置,最终经过激活函数输出。
- 卷积层(Convolutional Layer):主要用于处理图像数据,通过卷积操作提取特征。
- 池化层(Pooling Layer):用于减少数据的维度,通常跟在卷积层之后,降低计算复杂度并减少过拟合。
- 激活层(Activation Layer):应用非线性函数(如 ReLU、Sigmoid 等)来引入非线性特性,使模型能够学习复杂的模式。
- 归一化层(Normalization Layer):如批归一化(Batch Normalization),有助于提高训练稳定性,加速收敛。
- 循环层(Recurrent Layer):用于处理序列数据,像 LSTM 和 GRU 这样的层能够处理时间序列数据。
每一层由多个神经元组成,每个神经元用于计算,将输入的数据进行加权和后输出
这里定义了一个Sequential,是层的集合,用于将层按顺序排列,自动按顺序执行每个层,
初始化模型参数
这里的net[0]是神经网络的第一层,即nn.Linear(2, 1)
weight是他的权重,data是访问权重的原始数据,normal_是服从均值为0 标准差为0.01 的正态分布初始化weight,避免所有神经元的输出都相同,从而避免梯度消失或梯度爆炸的问题。
bias是偏置, fill_将偏置填充为0,偏置的作用是作为一个常数项,不需要特别的初始化,设为0是常见做法零初始化
- 其他的初始化策略
- 零初始化
- 正态分布初始化
- 均匀分布初始化
- Xavier 初始化
- He 初始化
- LeCun 初始化
- Orthogonal 初始化
- 自适应初始化
- 常数初始化
- Sparse Initialization
- Lecun Normal 和 Variance Scaling Initialization
- Weight Norm Initialization
MSELoss是一个用于回归任务的标准损失函数
计算均方误差使用的是MSELoss
类(Mean Squared Error,MSE)
这里的loss_fn是生成了一个损失函数可以计算预测值与实际值的平方差的均值
- 其他损失函数
- 回归问题:使用 MSE、SmoothL1、Huber Loss 等。
- 分类问题:使用 Cross-Entropy Loss、BCE Loss 等。
- 特殊任务:使用 KL Divergence Loss、Cosine Embedding Loss
小批量随机梯度下降算法是一种优化神经网络的标准工具
torch.optim.SGD:(Stochastic Gradient Descent, SGD)是pytorch中用于实现随机梯度下降的优化器
params: 是要优化的参数,通常传入net.parameters()作为参数
lr: (learning rate)学习率 用于控制每次更新的步长。较小的学习率可能导致收敛速度慢,而较大的学习率可能导致跳过最优解
momentum:动量w(Momentum),用于加速梯度下降,并避免在鞍点附近震荡。默认值为 0
dampening: 动量的衰减因子。默认值为 0
weight_decay: 权重衰减(L2 正则化),用于防止过拟合。默认值为 0
nesterov: 是否使用 Nesterov 动量,True 表示使用。默认值为 False
训练
Softmax回归
在之前的线性回归中目的是预测一个线性的数值通常是标量,
softmax回归则是输出多个类别的logit 通过softmax函数转化为每个类别的概率,进行分类
softmax函数
y^=softmax(o)
其中 yj^=∑keokeoj
e保证函数可导且概率不为负,求和保证概率之和为1
小批量样本的矢量化
O=XW+b
X→(B,D)B:batch_size;D:features_size;q:categories_size
W→(D,q)
b→(1,q)
这里XW+b使用了广播机制将(1,q)复制为(B,q)
O→(B,q)
损失函数
softmax输出的是一个条件概率的向量:
y:=[ yj | P(y=j|x):在x发生的情况下是j的可能性是多少 ]
最大似然函数
X是输入特征集,Y是标签集:y(i)是独热编码
对于样本i,模型预测该样本属于标签y(i)的概率是P(y(i)∣x(i))
由于样本与样本之间独立,所以可以将概率相乘得到数据集的联合条件概率,即似然函数:
L(X∣Y)=∏i=1nP(y(i)∣x(i)) 这里越接近1则说明模型预测的越好
最小负对数似然
由于上面的似然函数是多个概率的相乘,连乘会导致数值很小,不方便优化
使用对函数两边求对数,log(连乘)可以变成连加log(),
由于在log(x)当0<x<1时,函数为负数,为方便优化,我们计算负对数似然
−logP(Y∣X)=−∑i=1nlogP(y(i)∣x(i))
从信息论基础到信息量\熵\交叉熵\交叉熵损失
信息量:=I(x)=−log2(P(x))用来衡量一件事情有多”意外”,如果一件事情总是发生,则它没有带来信息量,概率越低,信息量越大:不常见的事情带来更大的信息量,反之也是
熵:H(P)=−∑i=1nP(xi)log2(P(xi)),即信息量的加权平均,反映从一个分布中抽取一个事件所带来的信息量.可以想象为“知道真实概率的人所经历的惊异程度”
交叉熵:H(P,Q)=−∑xP(x)log(Q(x))在知道真实分布为P(x),预测分布为Q(x)来编码信息时,所需要的平均信息量,在这里可以理解为对模型预测的惩罚,P(x)越接近Q(x),则交叉熵越小,反之越大,==可以想象为“主观概率为Q的观察者在看到根据概率P生成的数据时的预期惊异”==
交叉熵损失:L(y,y^)=−∑j=1qyjlog(y^)由于这是个分类问题,真实分布只有一个为1,其余为0,例如
一个样本为[鸡,狗,羊]的真实概率为[0,1,0],即,该样本是狗.
那么该样本的求和项中的i=1,i=3项为0,只剩下i=2项,所以交叉熵损失函数可以简化为l(y,^y)=−log(y^)
图像分类数据集
使用torchvision下载Fashion-MNIST数据集
Fashion-MINST是有10个类别的28×28 灰度图像数据集
由于类别以数字分类,这里使用一个函数获取对应数字的标签名称
使用Dataloader()从数据集随机抽取批量大小的数据
初始化参数
获取Fashion MINST 数据集
创建神经网络
初始化权重参数
设置损失计算方法
设置优化方法
定义评估方法
定义训练方法
开始训练
输出