目录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多层感知机暂退法代码实现如下导入必要库及实现部分import torch from torch import nn from d2l import torch as d2l def dropout_layer(X, dropout): assert 0 dropout 1 # 在本情况中所有元素都被丢弃 if dropout 1: return torch.zeros_like(X) # 在本情况中所有元素都被保留 if dropout 0: return X mask (torch.rand(X.shape) dropout).float() return mask * X / (1.0 - dropout) X torch.arange(16, dtype torch.float32).reshape((2, 8)) print(X) print(dropout_layer(X, 0.)) print(dropout_layer(X, 0.5)) print(dropout_layer(X, 1.)) num_inputs, num_outputs, num_hiddens1, num_hiddens2 784, 10, 256, 256 dropout1, dropout2 0.2, 0.5 class Net(nn.Module): def __init__(self, num_inputs, num_outputs, num_hiddens1, num_hiddens2, is_training True): super(Net, self).__init__() self.num_inputs num_inputs self.training is_training self.lin1 nn.Linear(num_inputs, num_hiddens1) self.lin2 nn.Linear(num_hiddens1, num_hiddens2) self.lin3 nn.Linear(num_hiddens2, num_outputs) self.relu nn.ReLU() def forward(self, X): H1 self.relu(self.lin1(X.reshape((-1, self.num_inputs)))) # 只有在训练模型时才使用dropout if self.training True: # 在第一个全连接层之后添加一个dropout层 H1 dropout_layer(H1, dropout1) H2 self.relu(self.lin2(H1)) if self.training True: # 在第二个全连接层之后添加一个dropout层 H2 dropout_layer(H2, dropout2) out self.lin3(H2) return out net Net(num_inputs, num_outputs, num_hiddens1, num_hiddens2) num_epochs, lr, batch_size 10, 0.5, 256 loss nn.CrossEntropyLoss(reductionmean) train_iter, test_iter d2l.load_data_fashion_mnist(batch_size) trainer torch.optim.SGD(net.parameters(), lrlr) d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, trainer)从零开始实现import torch from torch import nn from d2l import torch as d2l def dropout_layer(X, dropout): assert 0 dropout 1 # 在本情况中所有元素都被丢弃 if dropout 1: return torch.zeros_like(X) # 在本情况中所有元素都被保留 if dropout 0: return X mask (torch.rand(X.shape) dropout).float() return mask * X / (1.0 - dropout) X torch.arange(16, dtype torch.float32).reshape((2, 8)) print(X) print(dropout_layer(X, 0.)) print(dropout_layer(X, 0.5)) print(dropout_layer(X, 1.))定义模型参数num_inputs, num_outputs, num_hiddens1, num_hiddens2 784, 10, 256, 256定义模型dropout1, dropout2 0.2, 0.5 class Net(nn.Module): def __init__(self, num_inputs, num_outputs, num_hiddens1, num_hiddens2, is_training True): super(Net, self).__init__() self.num_inputs num_inputs self.training is_training self.lin1 nn.Linear(num_inputs, num_hiddens1) self.lin2 nn.Linear(num_hiddens1, num_hiddens2) self.lin3 nn.Linear(num_hiddens2, num_outputs) self.relu nn.ReLU() def forward(self, X): H1 self.relu(self.lin1(X.reshape((-1, self.num_inputs)))) # 只有在训练模型时才使用dropout if self.training True: # 在第一个全连接层之后添加一个dropout层 H1 dropout_layer(H1, dropout1) H2 self.relu(self.lin2(H1)) if self.training True: # 在第二个全连接层之后添加一个dropout层 H2 dropout_layer(H2, dropout2) out self.lin3(H2) return out net Net(num_inputs, num_outputs, num_hiddens1, num_hiddens2)训练和测试num_epochs, lr, batch_size 10, 0.5, 256 loss nn.CrossEntropyLoss(reductionmean) train_iter, test_iter d2l.load_data_fashion_mnist(batch_size) trainer torch.optim.SGD(net.parameters(), lrlr) d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, trainer)简洁实现net nn.Sequential(nn.Flatten(), nn.Linear(784, 256), nn.ReLU(), # 在第一个全连接层之后添加一个dropout层 nn.Dropout(dropout1), nn.Linear(256, 256), nn.ReLU(), # 在第二个全连接层之后添加一个dropout层 nn.Dropout(dropout2), nn.Linear(256, 10)) def init_weights(m): if type(m) nn.Linear: nn.init.normal_(m.weight, std0.01) net.apply(init_weights); trainer torch.optim.SGD(net.parameters(), lrlr) d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, trainer)3.2基础练习传送门【动手学深度学习】多层感知机之暂退法问题研究详情4. 研究体会通过本次研究我深入学习了多层感知机掌握了分类与回归等问题的解决方法。实验中我使用 Python 编写了多层感知机模型并分别应用权重衰减和暂退法以观察它们对模型性能的影响。首先我实现了一个包含输入层、隐藏层和输出层的简单多层感知机模型。为开展实验我选用了一个经典的分类问题数据集并将其划分为训练集和测试集。随后定义了损失函数和优化器利用反向传播算法更新模型的权重和偏置。然后在暂退法实验中设置了一个初始学习率和一个衰减系数观察模型在不同学习率下的收敛速度和性能表现。实验结果表明适当的暂退法可以加快模型的收敛速度并提高模型的准确率。通过本次实验我深刻理解了权重衰减和暂退法对于多层感知机模型的重要性和影响。权重衰减技术可以通过惩罚大的权重值来控制模型的复杂度防止过拟合而暂退法技术可以通过逐渐减小学习率来提高模型的稳定性和收敛速度。此外观察到在实验中合适的超参数选择非常重要。对于暂退法技术合适的初始学习率和衰减系数可以确保模型能在实验中有效地收敛并取得较好的性能。因此超参数的选择是进行权重衰减和暂退法实验时需要仔细考虑和调优的关键因素之一。