这里是我学习李沐老师的动手学深度学习时,教材课后题的一些解答,如果有不正确的解答还请指出来。持续更新
2.预备知识
2.5自动微分
1.为什么计算二阶导数比一阶导数的开销要大?
A : 二阶导数是一阶导数的导数,从原理上看,它表示一阶导数的变化率,从图形上看,它反映的是函数图像的凹凸性,二阶导数比一阶导数开销大。
2.在运行反向传播函数之后,立即再次运行它,会发生什么?
A:
3.在控制流的例子中,我们计算d关于a的导数,如果我们将变量a更改为随机向量或矩阵,会发生什么?
A:
把原文中的例子换成size=(3,1)使用d.sum().backward(),运行结果正确。
但是我们看到a.grad == d / a,中第三个是False,可能是微小的误差引起的。
4.如下图:
A:
%matplotlib inline
import torch
import matplotlib.pyplot as plt
from matplotlib.ticker import FuncFormatter,MultipleLocator
import numpy as np
f,ax = plt.subplots(1)
x = np.linspace(-3*torch.pi,3*torch.pi,100)
x1 = torch.tensor(x,requires_grad=True)
y1 = torch.sin(x1)
y1.sum().backward()
ax.plot(x,np.sin(x),label = 'sin(x)')
ax.plot(x,x1.grad,label = 'gradient of sin(x)')
ax.legend(loc='upper center',shadow=True)
plt.show()
output:
3.线性神经网络
3.1线性回归
1.如下图:
A:
3.3线性回归简洁实现
1.如果我们用nn.MSELoss(reduction=‘sum’)替换 ,nn.MSELoss()”为了使代码的行为相同,需要怎么更改学习速率?为什么?
A:应该把学习率除以batch_size,因为默认参数是mean,换成sum 需要除以批量数,一般会采用默认,因为这样学习率可以跟batch_size解耦
并且如果只采用sum没有除以样本数,损失会放大样本数的倍数(样本数是100,损失会放大100倍),这回使得参数的梯度过大,梯度经过放大后,原有的学习率显得过大,使得其出现了振荡,即步长过长导致在最优解的附近震荡而无法高效逼近最优点。
2.如何访问线性回归的梯度?
A :一般情况下,先call .backward(),再call .grad
5.深度学习计算
5.2参数管理
1.共享参数的好处是什么?
A: 共享参数通常可以节省内存,并在以下方面具有特定的好处:
- 对于图像识别中的CNN,共享参数使网络能够在图像中的任何地方而不是仅在某个区域中查找给定的功能。
- 对于RNN,它在序列的各个时间步之间共享参数,因此可以很好的推广到不同序列长度的示例。
- 对于自动编码器,编码器和解码器共享参数,在具有线性激活函数的单层自动编码器中,共享权重会在权重矩阵的不同隐藏层之间强制正交。
5.3延后初始化
1.如果你指定了第一层的输入尺寸,但没有指定后续层的尺寸,会发生什么?是否立即进行初始化?
A:可以正常运行。第一层会立即初始化,但其他层同样是直到数据第一次通过模型传递才会初始化
net = nn.Sequential(
nn.Linear(20, 256), nn.ReLU(),
nn.LazyLinear(128), nn.ReLU(),
nn.LazyLinear(10)
)
print(net[0].weight)
print(net[2].weight)
net(X)
print(net[2].weight)
-
如果指定了不匹配的维度会发生什么?
A:会由于矩阵乘法的维度不匹配而报错 -
如果输入具有不同的维度,你需要做什么?提示:查看参数绑定的相关内容。
A:如果输入维度比指定维度小,可以考虑使用padding填充;如果输入维度比指定维度大,可以考虑用pca等降维方法,将维度降至指定维度。