机器学习期末大作业

构建一个五层的神经网络,在mnist数据集上对网络进行训练,要求如下:

1、 利用训练集和验证集找到一组合适的超参数;

2、 分析使用批量标准化和不使用批量标准化时的网络性能差异;

3、 分析使用权重衰减和不使用权重衰减时的网络性能差异;

4、 分析使用dropout技术和不使用dropout时的网络性能差异;

5、 将以上所有技术应用到网络的训练过程中后,对网络的性能进行分析。

以上实现过程和分析过程全部在jupyter notebook中实现,一定要有运行结果输出

chatgpt:


作业要求解析

你要实现一个五层神经网络(一般理解为输入层+3个隐藏层+输出层,共五层)在MNIST数据集上训练和测试。MNIST是一个手写数字识别数据集,有60000张训练图像和10000张测试图像,每张28x28像素,10个数字类别。

具体要求包括:

  1. 利用训练集和验证集找到合适的超参数

    • 超参数一般指学习率、每层神经元数量、激活函数、批大小(batch size)、迭代次数(epoch)、dropout比率、权重衰减系数等。

    • 你要用训练集训练网络,用验证集评估性能,通过试验选择表现最好的超参数组合。

  2. 分析批量标准化(Batch Normalization)对网络性能的影响

    • 比较网络加了批量标准化和没加批量标准化两种情况下,网络的训练效果、收敛速度、准确率等差别。

  3. 分析权重衰减(Weight Decay,L2正则化)对网络性能的影响

    • 比较加和不加权重衰减时,模型的训练表现,权重衰减一般用于防止过拟合。

  4. 分析dropout技术对网络性能的影响

    • 比较加和不加dropout时的网络表现,dropout也是防止过拟合的一种技巧。

  5. 将批量标准化、权重衰减和dropout这三种技术全部用到网络训练中,分析最终网络的性能。

所有过程都需要在Jupyter Notebook中完成,要有代码和运行结果输出,也就是说不仅写代码,还要做实验分析。


思路建议(纯Python实现神经网络)

numpy,自己手写神经网络的前向传播、反向传播和训练流程。

1. 数据准备
  • MNIST数据集可以用tensorflow.keras.datasets加载或者从网上下载,加载后转成numpy数组。(已有)

  • 分割成训练集和验证集(例如训练集50000,验证集10000)。

2. 网络结构设计
  • 输入层:28×28=784个输入节点

  • 隐藏层1:比如128个神经元

  • 隐藏层2:128个神经元

  • 隐藏层3:64个神经元

  • 输出层:10个神经元(数字类别)

  • 激活函数:隐藏层用ReLU,输出层用softmax

3. 实现关键模块
  • 前向传播:计算每层的加权和,激活函数输出

  • 损失函数:交叉熵损失

  • 反向传播:计算梯度,更新权重

  • 权重更新:用SGD(随机梯度下降)或带动量的SGD

4. 实现作业要求的特殊技术
  • 批量标准化

    • 在每个隐藏层加激活前进行批量标准化,计算mini-batch的均值和方差,归一化数据,再学习两个可训练参数(缩放和平移)

  • 权重衰减

    • 在更新权重时增加正则项,比如权重 = 权重 - lr * (梯度 + λ * 权重)

  • Dropout

    • 训练时随机丢弃部分神经元(置0),测试时不丢弃,权重乘以keep概率

5. 超参数调节
  • 手动尝试不同的学习率、隐藏层大小、dropout概率、权重衰减系数

  • 训练后在验证集上计算准确率,找出最优组合

6. 实验与分析
  • 实现没有批量标准化的网络,训练并画出训练/验证准确率曲线

  • 实现加了批量标准化的网络,比较二者性能差异

  • 同理,比较有无权重衰减,有无dropout的效果

  • 最后三者都加上,分析结果


总结:你可以按下面步骤做

  1. 准备数据和工具(numpy)

  2. 实现基础的五层神经网络(前向、反向传播)

  3. 实现批量标准化模块,能开关使用

  4. 实现权重衰减功能,能开关使用

  5. 实现dropout功能,能开关使用

  6. 写训练循环,支持超参数调节

  7. 分别跑不同配置的实验,记录训练和验证准确率

  8. 在Jupyter Notebook里写代码和文字分析,展示结果图表


网络层数配置 激活函数组合 使用技巧 备注
[784, 128, 64, 32, 10] ReLU, ReLU, ReLU Dropout + Weight decay 基线配置,较稳定
[784, 128, 64, 32, 10] Sigmoid, ReLU, ReLU BatchNorm Sigmoid 结合 BN 抑制梯度消失
[784, 128, 64, 32, 10] Sigmoid, Sigmoid, ReLU 无特殊技巧

比较梯度消失的效果

你该怎么调试

  1. 绘制 loss/acc 曲线,观察收敛速度;

  2. 改变激活函数组合:ReLU vs Sigmoid;

  3. 打开或关闭 Dropout、BatchNorm、L2正则(weight decay)

  4. 控制 epoch 与 batch size,防止过拟合;

  5. 最后在测试集上评估,而不是只看训练集。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐