- 类比:
学习率就像你在黑暗中摸索宝藏时的 “步伐大小”。
- 如果步子太大(比如 lr=0.1):你可能一脚迈过宝藏,永远找不到它。
- 如果步子太小(比如 lr=0.0001):你要花很长时间才能慢慢靠近宝藏。
- 你代码里的 lr=0.001:相当于 “小碎步”,对简单任务(比如你的模型)很合适,但对复杂任务可能太慢。
- 类比:
防止计算器 “死机” 的安全措施。比如你要计算 1/0,数学上这是错误的,但加个 eps(比如 0.00000001),就变成 1/0.00000001 = 1 亿,计算器就不会崩溃了。
- 类比:
老师对学生的要求:“你不能死记硬背!要用简单通用的方法解题!”
- weight_decay=0:老师完全不管,学生爱怎么学怎么学(可能导致过拟合)。
- weight_decay>0:老师会惩罚那些用复杂方法解题的学生,逼他们用更简单的方法(防止过拟合)。
- 类比:
假设你要把 1000 块砖从 A 地搬到 B 地:
- 原代码做法:一块一块地搬,每次都要重新规划路线。
- 正确做法:先把所有砖堆成一堆(np.array),然后一次性用卡车运过去(torch.FloatTensor)。
- 影响:数据量大时,原方法会让你等很久(比如训练前要等 1 分钟加载数据)。
- 类比:
你让一个学生只做 1 道数学题,就指望他学会所有同类题,这显然不可能。
- 解决:让学生多做几道题(比如 epoch_num=50),他才能真正掌握规律。
- 类比:
老师只给学生 20 道题练手,而且这 20 道题可能还不全面(比如全是加法,没有减法)。
- 解决:给学生更多题(比如 train_sample=500),覆盖各种情况。
- 类比:
学生做题时,每次调整方法的幅度太小。比如他写错了,只改了 0.1%,几乎等于没改。
- 解决:让他每次改得幅度大一点(比如 lr=0.01),但不能太大(否则会改过头)。
深度学习训练就像教小孩学骑自行车:
-
学习率(lr):
小孩调整车头方向的 “力度”。力度太大(车头猛转)会摔车,力度太小(车头微动)永远学不会。
-
Betas:
- Beta1(短期记忆):小孩根据最近几次摔倒的经验调整方向。
- Beta2(长期记忆):小孩记住 “速度快时车头要稳,速度慢时车头要灵活”。
-
Weight Decay:
家长的要求:“不能只靠大人扶着骑!要自己掌握平衡!”(防止过拟合)
-
训练轮数(epoch_num):
小孩练习的次数。只练 1 次肯定学不会,练 100 次可能就会了。
-
样本量(train_sample):
小孩练习时的路况。只在平路练,遇到斜坡就不会骑了;要在各种路况练习。
-
改代码:
def build_dataset(total_sample_num):
X, Y = [], []
for _ in range(total_sample_num):
x, y = build_sample()
X.append(x)
Y.append([y])
-
调参数:
-
加验证:
训练后用固定测试数据验证,比如:
test_vec = [
[0.9, 0.1, 0.2, 0.3, 0.4],
通过这些调整,你的模型应该能轻松学会 “比较第 1 个数和第 5 个数大小” 的规律!