《动手学深度学习》第三章——(1)线性回归从零开始实现_学习思考与习题答案


3.1线性回归

作者 github链接github链接

学习笔记

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

习题

  1. 如果我们将权重初始化为零,会发生什么。算法仍然有效吗?
  2. 假设你是乔治·西蒙·欧姆,试图为电压和电流的关系建立一个模型。你能使用自动微分来学习模型的参数吗?
  3. 您能基于普朗克定律使用光谱能量密度来确定物体的温度吗?
  4. 如果你想计算二阶导数可能会遇到什么问题?你会如何解决这些问题?
  5. 为什么在squared_loss函数中需要使用reshape函数?
  6. 尝试使用不同的学习率,观察损失函数值下降的快慢。
  7. 如果样本个数不能被批量大小整除,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},\piy=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 yy是一个行向量

6.尝试使用不同的学习率,观察损失函数值下降的快慢。

可以自行尝试:

  • 学习率过小loss下降比较慢
  • 学习率过大loss无法收敛

7.如果样本个数不能被批量大小整除,data_iter函数的行为会有什么变化?

执行到最后所剩样本数不能被整除,会报错


版权声明:本文为weixin_45042017原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。