3.1线性回归
作者 github链接: github链接
学习笔记
习题
- 如果我们将权重初始化为零,会发生什么。算法仍然有效吗?
- 假设你是乔治·西蒙·欧姆,试图为电压和电流的关系建立一个模型。你能使用自动微分来学习模型的参数吗?
- 您能基于普朗克定律使用光谱能量密度来确定物体的温度吗?
- 如果你想计算二阶导数可能会遇到什么问题?你会如何解决这些问题?
- 为什么在
squared_loss
函数中需要使用reshape
函数? - 尝试使用不同的学习率,观察损失函数值下降的快慢。
- 如果样本个数不能被批量大小整除,
data_iter
函数的行为会有什么变化?
习题解答
1.如果我们将权重初始化为零,会发生什么。算法仍然有效吗?
实验证明算法仍然有效果,看起来效果更好了
全0初始化也是常用的一个选择,跟正态分布初始化相比可能会走向不同的局部最优点,算法还是有效的。
# w = torch.normal(0, 0.01, size=(2,1), requires_grad=True)
w = torch.zeros((2,1) ,requires_grad=True)
epoch 1, loss 0.036967
epoch 2, loss 0.000132
epoch 3, loss 0.000050
4.如果你想计算二阶导数可能会遇到什么问题?你会如何解决这些问题?
一阶导函数计算式无法直接获取。 解决方法:求一阶导数保存计算图。
例子:
y
=
x
3
+
c
o
s
x
,
x
=
π
2
,
π
y=x^3+cosx,x=\frac{\pi}{2},\pi
y=x3+cosx,x=2π,π,分别求一阶导数和二阶导数
参考
import torch
import math
import numpy as np
x = torch.tensor([math.pi / 2, math.pi], requires_grad=True)
y = x ** 3 + torch.cos(x)
true_dy = 3 * x ** 2 - torch.sin(x)
true_d2y = 6 * x - torch.cos(x)
# 求出一阶导数,保存计算图后,在去求二阶导数
dy = torch.autograd.grad(y, x,
grad_outputs=torch.ones(x.shape),
create_graph=True,
retain_graph=True) # 为计算二阶导保持计算图
# 在张量后加上.detach().numpy()可以仅输出张量数值
print("一阶导真实值:{} \n一阶导计算值:{}".format(true_dy.detach().numpy(), dy[0].detach().numpy()))
# 求二阶导。上面的dy的第一个元素是一阶导数值
d2y = torch.autograd.grad(dy, x,
grad_outputs=torch.ones(x.shape),
create_graph=False # 不再弄计算图,销毁前面的计算图
)
print("\n二阶导真实值:{} \n二阶导计算值:{}".format(true_d2y.detach().numpy(), d2y[0].detach().numpy()))
5.为什么在squared_loss
函数中需要使用reshape
函数?
y ^ \hat{y} y^是一个列向量, y y y是一个行向量
6.尝试使用不同的学习率,观察损失函数值下降的快慢。
可以自行尝试:
- 学习率过小loss下降比较慢
- 学习率过大loss无法收敛
7.如果样本个数不能被批量大小整除,data_iter
函数的行为会有什么变化?
执行到最后所剩样本数不能被整除,会报错