公司动态
沐神-动手学习深度学习-习题 4.3. 多层感知机的简洁实现
####答案这一节介绍了如何使用深度学习框架如 PyTorch的高级 API 简洁地实现多层感知机MLP。相比上一节的“从零实现”简洁实现将重点放在了模型架构的定义和训练流程的标准化上。核心内容总结A. 模型定义使用 nn.Sequential 构建模型它可以按顺序将各个层串联起来。层级结构展平层 (nn.Flatten)将输入的 28 \times 28 二维图像转换为 784 维的一维向量。隐藏层 (nn.Linear)定义了输入为 784、输出为 256 的全连接层。激活层 (nn.ReLU)在隐藏层后添加非线性变换。输出层 (nn.Linear)将 256 个隐藏单元映射到 10 个分类输出。B. 参数初始化使用 nn.init.normal_ 对权重进行随机正态分布初始化。通常将偏置项初始化为 0。C. 训练配置损失函数使用 nn.CrossEntropyLoss()。它在内部结合了 Softmax 和交叉熵计算并处理了数值稳定性问题。优化器使用 torch.optim.SGD设置学习率如 0.1来更新参数。训练循环直接调用 d2l.train_ch3 函数这与之前的 Softmax 回归训练过程完全一致。习题答案解析Q1: 尝试添加更多的隐藏层看看它对结果有什么影响现象添加更多层可以增加模型的表达能力容量有时能进一步降低训练损失。风险如果层数过多且没有合适的正则化如 Dropout模型更容易发生过拟合。同时训练时间会增加。深度建议在 Fashion-MNIST 这种简单数据集上两到三个隐藏层通常就足够了。Q2: 尝试不同的激活函数。哪个效果最好ReLU目前最通用的选择收敛快且计算简单。Sigmoid容易导致梯度消失尤其是在层数较多时训练速度明显慢于 ReLU。Tanh性能通常介于两者之间但在深度网络中依然不如 ReLU 常用。Leaky ReLU在输入为负时保留微弱梯度有时能改善神经元“死亡”的问题。Q3: 尝试不同的方案来初始化权重。Xavier 初始化 (nn.init.xavier_uniform_)旨在保持每一层输出的方差一致特别适合 Sigmoid 和 Tanh 激活函数。Kaiming 初始化 (nn.init.kaiming_normal_)专为 ReLU 激活函数设计是目前深层网络中最主流的初始化方式。结论使用 Kaiming 初始化通常会让基于 ReLU 的 MLP 收敛更稳定。Q4: 调整超参数如学习率、迭代轮数、隐藏单元个数观察并分析结果。学习率太高会导致 Loss 震荡不下降太低会导致训练极慢。隐藏单元个数增加个数如 512 或 1024能提升准确率上限但会显著消耗更多显存和计算资源。迭代轮数 (Epochs)通常观察训练集和验证集的损失曲线。当验证集损失不再下降甚至上升时应停止训练防止过拟合。下一步建议掌握了简洁实现后你已经具备了构建中等复杂度网络的能力。接下来的 4.4 节“模型选择、欠拟合和过拟合” 将带你探讨如何科学地评估模型性能避免模型只是“死记硬背”数据。你想了解如何绘制损失曲线图来识别过拟合还是想看看**权重衰减L2 正则化**是如何解决这个问题的