做网站的公司哪家强,电商网站后台怎么做,wordpress导航页面模板下载,手机上如何做网站动手学深度学习之第三章的第一部分笔记
3.1 线性回归
3.1.1 线性回归的基本元素
“线性回归和线性模型之间存在什么区别#xff1f;”“模型和算法之间存在什么区别#xff1f;”
首先#xff0c;我认为模型是对现实世界中某类问题或数学规律的简化表示和数学抽象#xff0…动手学深度学习之第三章的第一部分笔记3.1 线性回归3.1.1 线性回归的基本元素“线性回归和线性模型之间存在什么区别”“模型和算法之间存在什么区别”首先我认为模型是对现实世界中某类问题或数学规律的简化表示和数学抽象它的核心作用是描述输入与输出之间的关系捕捉数据内在模式。线性回归是对现实世界中某类问题中数据内在关系的一种假设。抛离现实世界理论模型常常根据以下标准分类根据有没有标签分为有监督、无监督根据具体的任务分为分类、回归、聚类根据模型结构分为线性模型和非线性模型我认为模型一定离不开现实世界理论模型里面的变量都要与现实世界中样本的某特征进行一一对应。其次算法是用来求取最优的模型参数常见的有最小二乘法、极大似然函数、最小化损失函数——其实上述三种方式都是极大似然法的思想假设变量之间存在某一种数学关系然后求取最优参数使这种函数关系更匹配训练样本。线性模型的线性代数表示法每个样本的特征x∈Rdx \in \mathbb{R}^dx∈Rd仿射变换中的权重和偏置分别是w∈Rd、bw \in \mathbb{R}^d、bw∈Rd、b。其模型可以表示为ywTxby w^T x bywTxb如何学习到最优模型参数首先考虑的是如何构建目标函数。这个目标函数能够量化预测值和真实值之间的差距。对于回归问题常使用MSE作为损失函数当使用非线性结构的话会在原有目标函数的基础上添加正则化范数用于避免过拟合。其次还需要考虑的是如何得到能使目标函数达到理想值的参数。类似于线性回归这种简单问题存在解析解也就是能够直接得到参数与样本特征的关系。还有一些不能得出解析解的问题此时需要采用梯度下降法来获得最优的参数值初始化w、b随机初始化模型参数抽取样本抽取一定数量的样本这些样本的特征值用于表示模型中的变量值计算梯度通过向目标函数关于w、b的偏导数传入初始值和一批样本的特征值得出多个梯度值之后求取梯度值的平均值更新参数使用梯度值的平均值更新参数3.2 线性回归的从零开始实现3.2.1 构建数据集数据关系满足线性回归真实参数值是w[3,7];b9;ywTxbεy w^T x b \varepsilonywTxbε; 其中ε\varepsilonε服从标准正态分布。importtorchimportmatplotlib.pyplotaspltdefsynthetic_data(w,b,num_samples): 生成线性回归数据集 Args: w (list): 真实权重参数 b (float): 真实偏置参数 num_samples (int): 生成的样本数量 Returns: x (torch.Tensor): 特征矩阵形状为(num_samples, len(w)) y (torch.Tensor): 标签向量形状为(num_samples, 1) w_tensortorch.tensor(w,dtypetorch.float32)b_tensortorch.tensor(b,dtypetorch.float32)xtorch.randn(num_samples,w_tensor.shape[0])ytorch.mv(x,w_tensor)b_tensor# 此处b_tensor会进行广播ytorch.normal(0,0.01,y.shape)# 添加噪声returnx,y.reshape(-1,1)# 生成数据集w[3,7]b9X,ysynthetic_data(ww,bb,num_samples1000)# 使用matplotlib进行可视化展示plt.scatter(X[:,0].numpy(),y.numpy(),labelFeature 0,alpha0.5)plt.scatter(X[:,1].numpy(),y.numpy(),labelFeature 1,alpha0.5)plt.xlabel(Features)plt.ylabel(Target)plt.legend()plt.title(Synthetic Linear Regression Dataset)plt.show()3.2.2 读取数据集每一个epoch需要打乱数据并将打乱后的数据按照batch_size的大小划分为K组由于数组的大小可能并不是batch_size的整数倍因此在最后一组中样本的数量可能小于batch_size的大小。详细的程序展示如下importrandomdefdata_iter(X,y,batchsize): 数据迭代器用于按批次读取数据 Args: X (torch.Tensor): 特征矩阵 y (torch.Tensor): 标签向量 batchsize (int): 批次大小 Yields: X_batch (torch.Tensor): 批次特征矩阵 y_batch (torch.Tensor): 批次标签向量 indiceslist(range(X.shape[0]))random.shuffle(indices)# 打乱索引foriinrange(0,len(indices),batchsize):batch_indicesindices[i:min(ibatchsize,len(indices))]yieldX[batch_indices,:],y[batch_indices,:]# 示例使用数据迭代器forX_batch,y_batchindata_iter(XX,yy,batchsize16):print(fBatch shape: X{X_batch.shape}, y{y_batch.shape})break# 只打印第一个批次3.2.3 初始化模型参数模型中的已知值就是batchsize中样本的特征值模型中的未知值就是参数。训练的过程就是寻找最优参数的过程就是更新参数的过程。初始化模型参数这个步骤一定要在更新参数之前且不能处于更新参数的上下文中。# 初始化模型参数wtorch.normal(0,0.01,size(2,1),requires_gradTrue)btorch.zeros(1,requires_gradTrue)print(fInitial w:{w})print(fInitial b:{b})3.2.4 定义模型和定义损失函数模型和损失函数的前后关系是先定义模型后定义损失函数。另外还需要注意的点是“定义”二字这个过程强调的是定义真正构建计算图的过程或者说真正计算、真正前向传播的过程在训练过程中。定义模型defmodel(X,w,b): 线性回归模型 Args: X (torch.Tensor): 特征矩阵 w (torch.Tensor): 权重参数 b (torch.Tensor): 偏置参数 Returns: Y_pred (torch.Tensor): 预测值 returntorch.mv(X,w)b定义损失函数defloss(Y_pred,Y_true): 均方误差损失函数 Args: Y_pred (torch.Tensor): 预测值 Y_true (torch.Tensor): 真实值 Returns: loss (torch.Tensor): 损失值 returntorch.mean((Y_true-Y_pred)**2)3.2.5 定义优化算法优化程序的核心就是在没有梯度追踪的上下文中进行参数更新当然在进行参数更新之前需要计算对应参数的梯度。defsgd(params,learning_rate,batch_size): 随机梯度下降优化算法 Args: params (list): 需要更新的参数列表 learning_rate (float): 学习率 batch_size (int): 批次大小 withtorch.no_grad():forparaminparams:param-learning_rate*param.grad/batch_size param.grad.zero_()# 参数的梯度清零3.2.6 训练train在定义了模型、损失函数、梯度更新的方式之后以及完成了模型参数的初始化之后需要基于以上的组件构建训练函数。训练函数需要明确的超参数有batchsize、learning_rate、epoch# 超参数设置batchsize16epoch100learning_rate0.01# 训练过程forepoch_iinrange(epoch):total_loss0.0forX_train,Y_trainindata_iter(X,y,batchsize):# 前向传播Y_predmodel(X_train,w,b)lloss(Y_pred,Y_train)# 反向传播l.backward()# 更新参数sgd([w,b],learning_rate,batchsize)# 累计损失total_lossl.item()# 打印每一个epoch的平均损失if(epoch_i1)%100:print(fEpoch{epoch_i1}, Average Loss:{total_loss/(len(X)/batchsize):.4f})# 打印训练后的参数print(f\nTrained w:{w})print(fTrained b:{b})print(fTrue w:{w}, True b:{b})总结通过从零开始实现线性回归我们深入理解了以下几个关键概念数据集构建如何生成符合线性关系的合成数据集数据迭代如何按批次读取数据进行训练模型定义线性回归模型的数学表示和实现损失函数均方误差损失函数的定义和作用优化算法随机梯度下降算法的实现和参数更新过程训练过程完整的模型训练流程和超参数调优这种从零开始的实现方式有助于我们更好地理解线性回归的工作原理为后续学习更复杂的深度学习模型打下坚实的基础。