🧪 MNIST先导课程实验报告-课程2

课程名称 课程2:引入权重 w 和偏置 b(线性) 日期
学生姓名 班级/学号

🎯一、实验目的

  1. 固定初始值, 使用不同的学习率, 观察收敛速度
  2. 固定学习率, 使用不同的初始值, 观察收敛速度
  3. 绘制损失曲线和梯度曲线, 分析两者关系

🔧 二、实验参数设置

参数名 符号 说明
输入线索 clue 8
目标值 target 5
学习率 η 0.01
初始权重 w 1.2
初始偏置 b 0.8
  • 实验1:固定 clue=3.0, target=2.0,调整初始 w 和 b,观察不同初始化对收敛的影响(如 w=0.5,b=-0.5;w=1.0,b=-1.0;w=-1.0,b=1.0)。
  • 实验2:固定初始参数(如 w=0.5, b=-0.5),改变学习率(η=0.01, 0.1, 0.2),观察是否出现震荡或收敛过慢。
  • 实验3:固定参数,改变输入 clue(如 clue=1, 2, 10),观察梯度变化与收敛速度。
  • 实验4:clue 过小 (如 0.0001),观察梯度变化与收敛速度。
  • 实验5:clue=6, target=5, η=0.03, 观察损失和梯度的震荡现象。

你能通过反复尝试, 找出 η 的收敛和发散的最小区间吗?

  • 手算练习:对前4轮进行手工前向计算,填写表格。

📋 三、手工计算表格

训练表格 (2-1)

参数:线索clue=\(_____\),目标T=\(_____\),学习率 \(\eta\)=\(_____\),
初始值:权重W=\(______\), 偏置b=\(_____\)

提示

  1. 按照 \(\boxed{S0}\) ~ \(\boxed{S5}\) 的顺序依次计算
  2. 观察 Loss 是否逐渐减小,参数是否朝正确方向调整。

四、代码运行结果

📊 4.1 训练过程中的损失变化曲线和梯度变化曲线

图片

点击放大显示 两层神经网络计算图

📝 4.2 训练过程生成的数据表格 (前3行+后3行), Early stop 机制

4.2.1 参数:线索clue=\(8\),目标T=\(5\),学习率 \(\eta\)=\(0.01\), 初始值:权重W=\(1.2\), 偏置b=\(0.8\),停止阈值Threshold = \(0.0001\)

轮次 权重 w 偏置 b 模型输出 (预测值) 损失 预测梯度 权重梯度 偏置梯度
0 1.2 0.8 10.4 29.16 10.8 86.4 10.8
1 0.336 0.692 3.38 2.6244 -3.24 -25.92 -3.24
2 0.5952 0.7244 5.486 0.2362 0.972 7.776 0.972
5 0.5338 0.7167 4.9869 0.0002 -0.0262 -0.21 -0.0262
6 0.5359 0.7170 5.0039 0 0.0079 0.0630 0.0079
7 0.5352 0.7169 4.9988 0 -0.0024 -0.0189 -0.0024

4.2.2 参数:线索clue=\(8\),目标T=\(5\),学习率 \(\eta\)=\(0.01\), 初始值:权重W=\(12\), 偏置b=\(0.8\),停止阈值Threshold = \(0.00001\)

轮次 权重 w 偏置 b 模型输出 (预测值) 损失 预测梯度 权重梯度 偏置梯度
0 12.0000 0.8000 96.8000 8427.2400 183.6000 1468.8000 183.6000
1 -2.6880 -1.0360 -22.5400 758.4516 -55.0800 -440.6400 -55.0800
2 1.7184 -0.4852 13.2620 68.2606 16.5240 132.1920 16.5240
7 0.6991 -0.6126 4.9799 0.0004 -0.0402 -0.3212 -0.0402
8 0.7023 -0.6122 5.0060 0.0000 0.0120 0.0964 0.0120
9 0.7013 -0.6123 4.9982 0.0000 -0.0036 -0.0289 -0.0036

4.2.2 参数:线索clue=\(8\),目标T=\(5\),学习率 \(\eta\)=\(0.01\), 初始值:权重W=\(1.2\), 偏置b=\(800\),停止阈值Threshold = \(0.00001\)

轮次 权重 w 偏置 b 模型输出 (预测值) 损失 预测梯度 权重梯度 偏置梯度
0 1.2000 800.0000 809.6000 647381.1600 1609.2000 12873.6000 1609.2000
1 -127.5360 783.9080 -236.3800 58264.3044 -482.7600 -3862.0800 -482.7600
2 -88.9152 788.7356 77.4140 5243.7874 144.8280 1158.6240 144.8280
9 -97.8296 787.6213 4.9842 0.0003 -0.0317 -0.2534 -0.0317
10 -97.8271 787.6216 5.0048 0.0000 0.0095 0.0760 0.0095
11 -97.8279 787.6215 4.9986 0.0000 -0.0029 -0.0228 -0.0029

🎉 五、观察与分析

  1. 学习率的影响:当学习率过大/过小时,观察到了什么现象? 当学习率过大时,梯度会发生震荡和不降反增现象;当学习率过小时,损失下降缓慢,最终停止学习
  2. 初始化参数的影响:不同初始 w 和 b 对训练速度有何影响?
    有影响,但影响不大
  3. 神经元死亡现象:是否观察到梯度为0、参数不再更新的情况?如何判断? 是的。当学习率过小时,会发生神经元死亡现象,即参数不再更新

✨ 六、实验结论

(总结本次实验的核心发现,例如:学习率需要适中才能稳定收敛;Leaky ReLU 可以有效避免神经元死亡等)


💫 七、思考题

  1. 如果输入线索 clue 非常大(如 100),训练时可能出现什么问题?如何解决? 收敛过快,梯度在最优值附近震荡;使用更小的\(w\)\(b\)
  2. 为什么要监控梯度的大小?梯度消失或梯度爆炸对训练有何影响?
    防止梯度爆炸和梯度消失;会导致训练失败

八、附录:实验代码

(可附上本次实验的核心代码片段,或说明代码存放位置)

from pydraw import pydraw
def trainmodule1(target:int,clue:int,rate:float,w:float,b:float,there:int):
    draw = pydraw()
    for epoch in range(200):
        pred = w*clue+b
        loss=(pred-target)*(pred-target)
        grad=2*(pred-target)
        gw = grad*clue
        gb = grad
        print(f"| {epoch}  | {w:.4f} |  {b:.4f} |  {pred:.4f}  | {loss:.4f} |  {grad:.4f}  | {gw:.4f} |  {gb:.4f} |")
        if loss < there:
            break
        w = w-(rate*gw)
        b = b-(rate*gb)
        draw.add(loss,"loss")
        draw.add(gw,"gw")
        draw.add(gb,"gb")
    draw.draw()
target = 5
clue = 8
rate = 0.01
w = 1.2
b = 800
there = 0.00001
### 4.2.1 参数:线索clue=$8$,目标T=$5$,学习率 $\eta$=$0.01$, 初始值:权重W=$1.2$, 偏置b=$0.8$,停止阈值Threshold = $0.0001$

print(f"### 4.2.2 参数:线索clue=${clue}$,目标T=${target}$,学习率 $\eta$=${rate}$, 初始值:权重W=${w}$, 偏置b=${b}$,停止阈值Threshold = ${there:.5f}$")
trainmodule1(target,clue,rate,w,b,there)