新闻详情

新闻详情

首页 / 资讯中心 / 详情

【动手学深度学习】多层感知机之权重衰减研究详情

发布时间:2026/9/30 6:34:35来源:尧图网络
【动手学深度学习】多层感知机之权重衰减研究详情
目录1. 研究目的2. 研究准备3. 研究内容3.1 多层感知机权重衰减3.2 基础练习4. 研究体会1. 研究目的防止过拟合权重衰减和暂退法都是用来控制模型的复杂度防止模型在训练集上过拟合提高模型泛化能力通过在训练过程中应用权重衰减或暂退法可以限制模型对训练数据的过度依赖从而提高模型在未见过的测试数据上的泛化能力研究正则化效果权重衰减和暂退法都可以看作是对模型的正则化约束通过实验可以研究不同的正则化方法对于模型训练和性能的影响了解特征选择通过应用权重衰减或暂退法可以观察到一些权重变得非常小或接近于零。2. 研究准备根据GPU安装pytorch版本实现GPU运行研究代码配置环境用来运行 Python、Jupyter Notebook和相关库等相关库。3. 研究内容启动jupyter notebook使用新增的pytorch环境新建ipynb文件为了检查环境配置是否合理输入import torch以及torch.cuda.is_available()若返回TRUE则说明研究环境配置正确若返回False但可以正确导入torch则说明pytorch配置成功但研究运行是在CPU进行的结果如下3.1多层感知机权重衰减1使用jupyter notebook新增的pytorch环境新建ipynb文件完成基本数据操作的研究代码与练习结果如下导入必要库及模型%matplotlib inline import torch from torch import nn from d2l import torch as d2ln_train, n_test, num_inputs, batch_size 20, 100, 200, 5 true_w, true_b torch.ones((num_inputs, 1)) * 0.01, 0.05 train_data d2l.synthetic_data(true_w, true_b, n_train) train_iter d2l.load_array(train_data, batch_size) test_data d2l.synthetic_data(true_w, true_b, n_test) test_iter d2l.load_array(test_data, batch_size, is_trainFalse)初始化模型参数def init_params(): w torch.normal(0, 1, size(num_inputs, 1), requires_gradTrue) b torch.zeros(1, requires_gradTrue) return [w, b]定义L2范数惩罚def l2_penalty(w): return torch.sum(w.pow(2)) / 2定义训练代码实现def train(lambd): w, b init_params() net, loss lambda X: d2l.linreg(X, w, b), d2l.squared_loss num_epochs, lr 100, 0.003 animator d2l.Animator(xlabelepochs, ylabelloss, yscalelog, xlim[5, num_epochs], legend[train, test]) for epoch in range(num_epochs): for X, y in train_iter: # 增加了L2范数惩罚项 # 广播机制使l2_penalty(w)成为一个长度为batch_size的向量 l loss(net(X), y) lambd * l2_penalty(w) l.sum().backward() d2l.sgd([w, b], lr, batch_size) if (epoch 1) % 5 0: animator.add(epoch 1, (d2l.evaluate_loss(net, train_iter, loss), d2l.evaluate_loss(net, test_iter, loss))) print(w的L2范数是, torch.norm(w).item())忽略正则化直接训练train(lambd0)使用权重衰减train(lambd3)简洁实现def train_concise(wd): net nn.Sequential(nn.Linear(num_inputs, 1)) for param in net.parameters(): param.data.normal_() loss nn.MSELoss(reductionnone) num_epochs, lr 100, 0.003 # 偏置参数没有衰减 trainer torch.optim.SGD([ {params:net[0].weight,weight_decay: wd}, {params:net[0].bias}], lrlr) animator d2l.Animator(xlabelepochs, ylabelloss, yscalelog, xlim[5, num_epochs], legend[train, test]) for epoch in range(num_epochs): for X, y in train_iter: trainer.zero_grad() l loss(net(X), y) l.mean().backward() trainer.step() if (epoch 1) % 5 0: animator.add(epoch 1, (d2l.evaluate_loss(net, train_iter, loss), d2l.evaluate_loss(net, test_iter, loss))) print(w的L2范数, net[0].weight.norm().item()) train_concise(0)train_concise(3)3.2基础练习1.在本节的估计问题中使用λ的值进行实验。绘制训练和测试精度关于λ的函数。观察到了什么根据提供的代码可以看出train_concise函数用于训练一个具有正则化的线性回归模型并绘制训练和测试精度关于正则化参数λ的函数。为了实验不同的λ值可以调用train_concise函数并将不同的λ值作为参数传递给它。在这种情况下已经提供了两个示例train_concise(0)和train_concise(3)。调用train_concise(0)表示没有正则化而调用train_concise(3)表示使用正则化参数λ的值为3。你可以尝试不同的λ值并观察结果。以下是绘制训练和测试精度关于λ的函数的代码示例import torch import torch.nn as nn import matplotlib.pyplot as plt def train_concise(wd): net nn.Sequential(nn.Linear(num_inputs, 1)) for param in net.parameters(): param.data.normal_() loss nn.MSELoss(reductionnone) num_epochs, lr 100, 0.003 # 偏置参数没有衰减 trainer torch.optim.SGD([ {params:net[0].weight,weight_decay: wd}, {params:net[0].bias}], lrlr) train_accuracy [] test_accuracy [] for epoch in range(num_epochs): for X, y in train_iter: trainer.zero_grad() l loss(net(X), y) l.mean().backward() trainer.step() train_acc evaluate_accuracy(net, train_iter) test_acc evaluate_accuracy(net, test_iter) train_accuracy.append(train_acc) test_accuracy.append(test_acc) print(w的L2范数, net[0].weight.norm().item()) return train_accuracy, test_accuracy def evaluate_accuracy(net, data_iter): correct 0 total 0 for X, y in data_iter: output net(X) predicted (output 0.5).float() correct (predicted y).sum().item() total y.size(0) return correct / total def plot_accuracy_lambda(lambda_values): for lambda_val in lambda_values: train_accuracy, test_accuracy train_concise(lambda_val) plt.plot(range(len(train_accuracy)), train_accuracy, labelTrain Accuracy (lambda{}).format(lambda_val)) plt.plot(range(len(test_accuracy)), test_accuracy, labelTest Accuracy (lambda{}).format(lambda_val)) plt.xlabel(Epochs) plt.ylabel(Accuracy) plt.legend() plt.show() # 定义 num_inputs, train_iter, test_iter这些变量应该在你的代码中有定义 lambda_values [0, 0.5, 1, 2, 3, 4, 5] plot_accuracy_lambda(lambda_values)在上述代码中lambda_values列表包含了不同的λ值。train_concise函数的输出被修改为返回训练和测试的精度。plot_accuracy_lambda函数使用这些值来绘制训练和测试精度关于λ的函数图像。通过调用plot_accuracy_lambda(lambda_values)可以观察到不同λ值对训练和测试精度的影响。2.使用验证集来找到最佳值λ。它真的是最优值吗这有关系吗使用验证集来找到最佳正则化参数λ是一种常见的模型选择方法。在训练过程中可以尝试不同的λ值并使用验证集来评估模型在不同λ值下的性能。最终选择在验证集上性能最好的λ值作为模型的最终正则化参数。然而需要注意的是通过验证集来选择最佳λ并不一定意味着这是绝对最优的值。这是因为验证集是从训练数据中独立出来的使用它来估计模型在未见过的数据上的泛化能力。因此验证集中的性能评估并不总是能够完全反映模型在真实数据上的表现。过度依赖验证集来选择最佳参数可能导致过拟合验证集的问题也称为“验证集泄漏”。简单来说当我们反复调整模型或超参数直到在验证集上得到理想结果时可能会选择那些在验证集上仅仅是运气好的模型而这些模型未必在真实数据上表现优秀。为了解决验证集泄漏的问题通常采用交叉验证的方法。交叉验证将数据集划分为多个不相交的子集并多次训练模型每次使用一个不同的子集作为验证集其他子集作为训练集。这样可以得到更稳健的性能评估并减少验证集泄漏的影响。另外最终模型的性能并不仅仅取决于正则化参数λ。其他因素如模型的复杂性、训练数据的质量和数量等也会影响最终的模型性能。因此在选择λ时应该将它作为一个超参数同时考虑其他超参数和模型选择中的不确定性。3.如果我们使用作为我们选择的惩罚正则化那么更新方程会是什么样子如果使用L1正则化使用L1范数作为惩罚项则更新方程会发生变化。正则化项被添加到损失函数中以对权重进行约束。在标准的梯度下降算法中我们通过在梯度更新中加入正则化项来实现L1正则化。更新方程如下其中ω 是权重的第i个元素 是学习率控制更新的步长 是L1正则化参数控制正则化的强度 是损失函数 ∂/∂ω 是损失函数关于权重ω的梯度 sign(ω) 是ω的符号函数正数为1负数为-1零为0 更新方程的第二项 * sign(ω) 是L1正则化的关键部分。它对权重进行约束使得某些权重变为零从而实现特征选择和稀疏性。需要注意的是L1正则化会导致权重稀疏化即某些权重变为零。这对于特征选择和模型解释性非常有用可以通过选择重要的特征来提高模型的泛化能力。更新方程的具体实现可能因使用的深度学习框架而有所不同但基本的思想是相同的。4.我们知道。能找到类似的矩阵方程吗见 2.3.10节 中的Frobenius范数在2.3.10节中Frobenius范数被定义为矩阵的元素平方和的平方根即 ||||_F sqrt(∑∑_^2) 其中_是矩阵的元素。如果希望使用Frobenius范数作为惩罚项来约束权重我们可以修改更新方程来实现。对于的更新方程可以使用以下形式其中 是权重矩阵 是学习率控制更新的步长 是Frobenius范数的正则化参数控制正则化的强度 是损失函数 / 是损失函数关于的梯度 更新方程的第二项 * 是Frobenius正则化的关键部分。它对权重矩阵进行约束使得权重的大小受到限制。需要注意的是Frobenius正则化并不会导致权重的稀疏性它主要用于控制权重的大小。相比于L1正则化和L2正则化Frobenius正则化在深度学习中的应用相对较少通常更常见的是使用L1正则化或L2正则化来约束权重。5.回顾训练误差和泛化误差之间的关系。除了权重衰减、增加训练数据、使用适当复杂度的模型之外还能想出其他什么方法来处理过拟合除了权重衰减、增加训练数据和使用适当复杂度的模型之外还有一些其他方法可以处理过拟合问题。以下是一些常见的方法早停Early Stopping在训练过程中通过监测验证误差的变化当验证误差不再下降或开始上升时及时停止训练防止过拟合。这可以通过保存在训练过程中得到的最佳模型来实现。数据增强Data Augmentation通过对训练数据进行随机变换或扩增生成新的训练样本。例如图像分类任务中的随机裁剪、翻转、旋转、缩放等操作可以增加数据的多样性减少过拟合的风险。Dropout在训练过程中以一定的概率随机将神经元的输出置为零从而随机地丢弃一些神经元减少神经网络的复杂性。Dropout可以减少神经网络中神经元之间的依赖关系有助于防止过拟合。正则化方法除了权重衰减还有其他正则化方法可以应用于神经网络。例如L1正则化、L2正则化、弹性网络Elastic Net等它们通过在损失函数中添加额外的正则化项限制模型参数的大小减少过拟合的风险。模型集成Model Ensemble将多个模型的预测结果进行集成可以通过投票、平均等方式得到最终的预测结果。模型集成可以减少模型的方差提高模型的泛化能力。正交化Orthogonalization将模型的学习过程分解为两个独立的步骤一步用于优化训练数据上的训练误差另一步用于优化验证数据上的泛化误差。这种方法可以帮助确保模型不仅仅是过拟合训练数据而是能够在未见过的数据上表现良好。这些方法可以单独使用也可以结合使用具体取决于数据和模型的特点。在实际应用中需要根据具体问题和数据集的特点来选择适合的方法来处理过拟合问题。6.在贝叶斯统计中我们使用先验和似然的乘积通过公式P(w|x)正比于P(x|w)P(x)得到后验。如何得到带正则化的P(w)在贝叶斯统计中通常使用正则化项来引入先验概率P(w)。正则化项对参数w的取值进行限制有助于防止过拟合特别是在数据较少或特征较多的情况下。假设我们的模型是一个参数为w的概率模型数据为x。在贝叶斯统计中要求参数w的后验概率P(w|x)即给定数据x条件下参数w的概率分布。根据贝叶斯定理后验概率可以表示为P(w|x) ∝ P(x|w) * P(w)其中P(x|w)是似然函数表示在给定参数w下观测数据x的概率P(w)是先验概率表示在未观测数据之前参数w的概率分布。为了引入正则化项我们可以假设参数w的先验概率P(w)服从某种特定分布通常我们会选择一个具有特定性质的分布比如高斯分布。例如对于L2正则化我们可以假设参数w的先验概率P(w)服从一个高斯分布即P(w) N(0, λ^2 * I)其中N(0, λ^2 * I)表示均值为0方差为λ^2的多元高斯分布I是单位矩阵。对于L1正则化我们可以假设参数w的先验概率P(w)服从一个拉普拉斯分布即P(w) Laplace(0, λ)其中Laplace(0, λ)表示均值为0尺度参数为λ的拉普拉斯分布。在引入正则化项后求解参数w的后验概率P(w|x)时需要将先验概率P(w)乘以似然函数P(x|w)然后归一化以得到正确的后验概率分布。具体求解过程可以使用贝叶斯推断方法如马尔可夫链蒙特卡洛MCMC等。总结在贝叶斯统计中通过引入正则化项可以在参数估计过程中考虑先验信息对参数进行约束有助于改善模型的泛化能力和鲁棒性。4. 研究体会通过这次研究​​​​​​​我深入学习了多层感知机解决了分类和回归等问题。在本次实验中使用Python编写了多层感知机模型并分别应用了权重衰减和暂退法来观察它们对模型性能的影响。首先实现了一个简单的多层感知机模型包括输入层、隐藏层和输出层。为了进行实验选择了一个经典的分类问题数据集并将其划分为训练集和测试集。接着定义了损失函数和优化器并使用反向传播算法来更新模型的权重和偏置。接下来开始尝试权重衰减技术。在训练过程中我引入了一个权重衰减项它会惩罚大的权重值。通过调整权重衰减系数我观察到模型在训练集和测试集上的表现。实验结果显示适当的权重衰减可以有效减少过拟合提高模型的泛化能力。通过本次实验我深刻理解了权重衰减对于多层感知机模型的重要性和影响。权重衰减技术可以通过惩罚大的权重值来控制模型的复杂度防止过拟合而暂退法技术可以通过逐渐减小学习率来提高模型的稳定性和收敛速度。通过观察模型的权重变化我发现权重衰减对特征选择起到了一定的作用。在应用权重衰减后一些权重值会趋近于零或变得非常小这意味着这些特征对于模型的决策贡献较小。因此可以根据权重的大小进行特征选择从而提高模型的解释性和效果。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

JavaScript省市区三级联动实战:数据结构、回显与性能优化 2026/9/30 7:35:35

JavaScript省市区三级联动实战:数据结构、回显与性能优化

简介:这份资源面向前端初学者与需要实现地址选择功能的开发者,提供用原生JavaScript完成省份、城市、区域三级联动的完整示例。通过动态创建select元素、监听onchange事件,实现选择省份后自动更新城市与区域列表,解决表单中地理信…

阅读更多 →
Storm DRPC实战:实时查询服务的设计、调优与生产避坑 2026/9/30 7:35:35

Storm DRPC实战:实时查询服务的设计、调优与生产避坑

1. 实时查询的现状痛点:为什么我最后选了 DRPC先交代一下背景。我在做流计算平台的时候遇到一个非常典型的场景:上游是一堆实时上报的传感器数据,已经通过 Kafka 落到 Storm 拓扑里做清洗和窗口聚合,业务方却不满足于"定时出…

阅读更多 →
神经网络模型可视化实战:从特征图到Grad-CAM的完整工具链 2026/9/30 7:35:35

神经网络模型可视化实战:从特征图到Grad-CAM的完整工具链

简介:这份PDF文档面向从事深度学习研究的专业人士与关注神经网络可视化的技术开发者,聚焦神经网络“黑盒子”特性带来的理解与调参难题。内容梳理了可视化技术的兴起背景、主流方法、经典网络模型(如LeNet-5、AlexNet、Inception、ResNet&…

阅读更多 →
混合精度训练崩溃之谜:手写梯度缩放,彻底根治NaN 2026/9/30 7:35:35

混合精度训练崩溃之谜:手写梯度缩放,彻底根治NaN

训练跑着跑着 loss 变成 NaN,这大概是每个搞深度学习的人都经历过的噩梦。早期我遇到这种情况,第一反应是调小学习率、清理数据、换初始化,结果发现治标不治本。真正让我彻底理解问题根源的,是后来深入研究自动混合精度&#xff0…

阅读更多 →
HTTP协议实战避坑:从报文结构、缓存机制到抓包排查的工程指南 2026/9/30 7:35:34

HTTP协议实战避坑:从报文结构、缓存机制到抓包排查的工程指南

简介:这是一份面向有一定网络基础的开发人员与技术爱好者的HTTP协议系统学习资料,聚焦从报文结构、请求方法、URI与状态码等基础概念,到无状态性、明文传输、队头阻塞、跨域、缓存、代理等实际痛点的深入剖析,并延伸至TLS握手&…

阅读更多 →
github.com/ZeroHawkeye/wordZero 将三列的表格 , 竖的排两个表格 2026/9/30 7:35:21

github.com/ZeroHawkeye/wordZero 将三列的表格 , 竖的排两个表格

根据你提供的 wordZero 库信息,将三列表格改为竖排排列两个表格,可以通过**嵌套表格**来实现。即在原表格的某个单元格内,再嵌入一个新的表格。### 实现思路wordZero 的 TableCell 结构支持嵌套表格(Tables 字段)。你可…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉