1. 如果我们将权重初始化为零,会发⽣什么。算法仍然有效吗?
答:有效
以下是一个神经元即一个线性回归模型实验结果:
原数据:
true_w=torch.tensor([4.1,5.4])
true_b=3.3
当权重是均值为0,标准差为0.01的正态随机分布时,结果如下:
第1个epoch
l: tensor(0.0003, grad_fn=<MseLossBackward0>)
w: tensor([[4.0939, 5.3890]])
b: tensor([3.2999])
第2个epoch
l: tensor(0.0001, grad_fn=<MseLossBackward0>)
w: tensor([[4.0997, 5.4007]])
b: tensor([3.3003])
第3个epoch
l: tensor(0.0001, grad_fn=<MseLossBackward0>)
w: tensor([[4.1004, 5.3997]])
b: tensor([3.2998])
当权重初始值为零时:
第1个epoch
l: tensor(0.0005, grad_fn=<MseLossBackward0>)
w: tensor([[4.0884, 5.3890]])
b: tensor([3.2886])
第2个epoch
l: tensor(0.0001, grad_fn=<MseLossBackward0>)
w: tensor([[4.0992, 5.4001]])
b: tensor([3.3002])
第3个epoch
l: tensor(0.0001, grad_fn=<MseLossBackward0>)
w: tensor([[4.0996, 5.4002]])
b: tensor([3.3004])
可以看出两个都收敛,所以初始权重为0不会影响到一个神经元的收敛,数学过程:
2. 假设你是乔治·西蒙·欧姆48,试图为电压和电流的关系建⽴⼀个模型。你能使用⾃动微分来学习模型的参数吗?
答:可以,特征就是电流,标签就是电压,求出来的权重就是模型的电阻。
3. 您能基于普朗克定律49使⽤光谱能量密度来确定物体的温度吗?
答:我认为不行,因为这条公式是非线性的
4.如果你想计算⼆阶导数可能会遇到什么问题?你会如何解决这些问题?
答:当你没有一个具体的一阶导函数的时候,求二阶导数是有困难的,比如线性回归模型的一阶导数来源于训练每一个样本得到的梯度,并不是某个具体的公式求导而来。
因此推荐用autograd.grad()解决。
详解 pytorch 中的 autograd.grad() 函数_waitingwinter的博客-CSDN博客_torch.autograd.grad)
5.为什么在squared_loss函数中需要使用reshape函数?
答:因为y是行向量,y_hat是列向量
6.尝试使用不同的学习率吗,观察损失函数值下降的快慢
答:lr=0.01:
第1个epoch
l: tensor(1.0535, grad_fn=<MseLossBackward0>)
w: tensor([[3.5437, 4.5931]])#4.1 5.4
b: tensor([2.9438])#3.3
第2个epoch
l: tensor(0.0210, grad_fn=<MseLossBackward0>)
w: tensor([[4.0231, 5.2782]])#4.1 5.4
b: tensor([3.2652])#3.3
第3个epoch
l: tensor(0.0005, grad_fn=<MseLossBackward0>)
w: tensor([[4.0887, 5.3814]])#4.1 5.4
b: tensor([3.2971])#3.3
可以看出经过3个epoch,模型差不多才收敛。
lr=0.1:
第1个epoch
l: tensor(0.0001, grad_fn=<MseLossBackward0>)
w: tensor([[4.1005, 5.3997]])#4.1 5.4
b: tensor([3.3000])#3.3
第2个epoch
l: tensor(0.0001, grad_fn=<MseLossBackward0>)
w: tensor([[4.1003, 5.3992]])#4.1 5.4
b: tensor([3.2993])#3.3
第3个epoch
l: tensor(0.0001, grad_fn=<MseLossBackward0>)
w: tensor([[4.1008, 5.4009]])#4.1 5.4
b: tensor([3.3000])#3.3
在第一个epoch就已经收敛。
lr=1:
第1个epoch
l: tensor(7.9011e+18, grad_fn=<MseLossBackward0>)
w: tensor([[-4.1428e+08, -1.6207e+09]])#4.1 5.4
b: tensor([-2.3720e+09])#3.3
第2个epoch
l: tensor(4.0500e+23, grad_fn=<MseLossBackward0>)
w: tensor([[-1.5859e+11, -5.8639e+11]])#4.1 5.4
b: tensor([-2.5961e+11])#3.3
第3个epoch
l: tensor(6.0649e+33, grad_fn=<MseLossBackward0>)
w: tensor([[ 4.1251e+16, -3.6850e+16]])#4.1 5.4
b: tensor([-5.6323e+16])#3.3
学习率太大,模型来回振荡,观察一下梯度变化:
lr=1:训练第一批数据,w的梯度变化
tensor([[ -6.2054, -14.7463]])
tensor([[ 2.4022, 18.7184]])
tensor([[ 12.0126, -21.7380]])
tensor([[-18.1835, 72.3830]])
tensor([[ 19.7513, -131.6401]])
tensor([[-79.2929, 249.0611]])
tensor([[ 9.8358, -312.1883]])
tensor([[132.0909, 281.2443]])
tensor([[ -63.1510, -312.5429]])
tensor([[126.1241, 103.9766]])
tensor([[-396.3439, 183.4693]])
lr=0.1:训练第一批数据,w的梯度变化
tensor([[ -4.6073, -15.0562]])
tensor([[-3.9512, -5.9302]])
tensor([[ -5.9215, -10.7462]])
tensor([[-3.6581, -2.9408]])
tensor([[-3.9894, -3.8170]])
tensor([[-3.2923, -2.6397]])
tensor([[-5.8927, -3.4658]])
tensor([[-2.3613, -5.0761]])
tensor([[-3.2779, -1.9214]])
tensor([[-0.5259, -0.2782]])
7. 如果样本个数不能被批量大小整除,data_iter函数的行为会有什么变化?
答:无变化,因为沐神已经用min优化过了,当最后一个样本个数拿不出一个批次,就有多少拿多少。
min(i + batch_size, num_examples)]