李沐动手学深度学习课后习题

这篇博客探讨了深度学习中的关键概念,包括自动微分的原理及其相对于一阶导数的计算复杂性,线性回归的实现细节,特别是当损失函数的reduction设置为'sum'时对学习率的影响,以及在参数管理和延后初始化中的注意事项。此外,还讨论了在不同场景下共享参数的优势,并展示了在实际代码中如何访问和处理梯度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里是我学习李沐老师的动手学深度学习时,教材课后题的一些解答,如果有不正确的解答还请指出来。持续更新

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)
  1. 如果指定了不匹配的维度会发生什么?
    A:会由于矩阵乘法的维度不匹配而报错

  2. 如果输入具有不同的维度,你需要做什么?提示:查看参数绑定的相关内容。
    A:如果输入维度比指定维度小,可以考虑使用padding填充;如果输入维度比指定维度大,可以考虑用pca等降维方法,将维度降至指定维度。

### 关于《动手学深度学习》第13章的学习资源 对于《动手学深度学习》这本书中的第13章,其主要内容围绕着自然语言处理(NLP)展开,具体涉及序列到序列模型以及注意力机制的应用[^1]。以下是关于该章节的一些解答和学习建议: #### 一、官方文档与教程支持 作者团队提供了丰富的在线资源来辅助读者理解书中内容。这些资源通常包括代码实现、理论讲解视频以及部分课后习题的参考答案。可以通过访问本书的官方网站获取相关内容。例如,在官网中可以找到基于Jupyter Notebook形式的代码实例,帮助深入理解Seq2Seq模型及其变体的工作原理[^2]。 ```python import d2l.torch as d2l from torch import nn # 定义编码器结构 class Seq2SeqEncoder(d2l.Encoder): def __init__(self, vocab_size, embed_size, num_hiddens, num_layers, dropout=0, **kwargs): super(Seq2SeqEncoder, self).__init__(**kwargs) ... ``` 上述代码片段展示了如何构建一个基础的Seq2Seq编码器类,这是解决翻译任务的重要组成部分之一[^3]。 #### 二、社区贡献者分享的内容 除了官方渠道外,GitHub上也有许多由爱好者维护的仓库专门整理了各章节练习题目的解决方案。通过搜索关键词如“dive into deep learning chapter 13 solutions”,能够发现多个有价值的项目链接。需要注意的是,由于不同版本之间可能存在差异,因此在借鉴他人成果时务必核对自己的教材版本号是否一致[^4]。 另外值得注意的一点是,虽然网络上有不少现成的答案可供查阅,但从长远来看主动尝试独立完成这些问题会更加有利于巩固所学到的知识点[^5]。 #### 三、其他推荐参考资料 如果觉得仅依靠一本书难以完全掌握复杂概念的话,则还可以考虑补充阅读一些额外材料。比如斯坦福CS224n课程讲义就涵盖了大量有关现代NLP技术的信息;而Keras开发者Francois Chollet撰写的书籍《Deep Learning with Python》同样对构建实际应用系统有所帮助[^6]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值