《动手学深度学习》——第二章习题及自写答案

本文介绍了数据操作、预处理的练习,包括条件语句、张量操作。深入探讨了线性代数中的矩阵性质,如转置的性质、矩阵加法的性质和对称性。同时涵盖了微积分中的函数图像、梯度计算。还涉及自动微分的基本概念,解释了反向传播和链式法则的应用。最后,文章讨论了概率中的事件概率和独立事件的计算。
摘要由CSDN通过智能技术生成

2.1 数据操作

练习1

运⾏本节中的代码。将本节中的条件语句 X = = Y X == Y X==Y更改为 X < Y X < Y X<Y X > Y X > Y X>Y,然后看看你可以得到什么样的张量。
在这里插入图片描述

练习2

用其他形状(例如三维张量)替换⼴播机制中按元素操作的两个张量。结果是否与预期相同?
在这里插入图片描述

2.2 数据预处理

创建包含更多⾏和列的原始数据集。

  1. 删除缺失值最多的列。
  2. 将预处理后的数据集转换为张量格式。

练习1

在这里插入图片描述
在这里插入图片描述

练习2

在这里插入图片描述

2.3 线性代数

练习1

证明⼀个矩阵A的转置的转置是A,即(A) = A。
在这里插入图片描述

练习2

给出两个矩阵A和B,证明“它们转置的和”等于“它们和的转置”,即A + B = (A +B)

在这里插入图片描述

练习3

给定任意⽅阵A,A + A总是对称的吗?为什么?
是的。设A是一个n×n的方阵,那么它的转置A也是一个n×n的方阵,满足(A)ij = Aji,其中i,j=1,2,…,n。那么A + A也是一个n×n的方阵,满足(A + A)ij = Aij + (A)ij = Aij + Aji,其中i,j=1,2,…,n。由于(A + A)ij = (A + A)ji对所有的i和j都成立,所以A + A是对称的。

练习4

本节中定义了形状(2, 3, 4)的张量X。len(X)的输出结果是什么?
在这里插入图片描述

练习5

对于任意形状的张量X,len(X)是否总是对应于X特定轴的⻓度?这个轴是什么?

对于高维张量,len()函数只能返回第一维大小,而不能返回其他维度的大小。因此,如果需要获取张量的其他维度大小,需要使用张量对象的shape属性。
在这里插入图片描述

练习6

运⾏A/A.sum(axis=1),看看会发⽣什么。请分析⼀下原因?
在这里插入图片描述
原因:这个错误出现的原因是在执行A/A.sum(axis=1)时,张量A的第一维元素个数为5,而A.sum(axis=1)返回的张量的第一维元素个数为4。由于这两个张量在第一维上的大小不同,所以无法进行逐元素的除法运算。
在这里插入图片描述

解决:要解决这个问题,需要将A.sum(axis=1)返回的张量的形状与A相同。可以通过在调用sum函数时指定参数keepdims=True来保持维度不变,然后使用broadcasting机制将A.sum(axis=1)的形状扩展为(5, 1)
在这里插入图片描述

练习7

考虑⼀个具有形状 ( 2 , 3 , 4 ) (2, 3, 4) (2,3,4)的张量,在轴 0 、 1 、 2 0、1、2 012上的求和输出是什么形状?
在这里插入图片描述

练习8

linalg.norm函数提供3个或更多轴的张量,并观察其输出。对于任意形状的张量这个函数计算得到什么?

torch.linalg.norm函数torch.linalg.norm()函数可以用于计算张量的范数。当给定多维张量时,可以通过指定参数dim来计算指定轴上的范数。如果给定了多个轴,则会计算这些轴上的范数并返回一个形状更小的张量。

范数是一个将向量映射到非负值的函数,它度量了向量的大小或长度。在数学中,范数是一个广义的概念,包括了向量空间中的向量大小的不同度量方式。在机器学习和深度学习中,范数通常指的是向量的欧几里德范数(L2范数)和向量的曼哈顿范数(L1范数)。

范数在机器学习和深度学习中有很多应用,其中一些应用包括:

正则化:范数可以用于正则化,通过添加一个范数惩罚项来限制模型的复杂度,以避免过拟合。例如,在逻辑回归和线性回归等模型中,可以通过添加L1或L2范数惩罚项来实现正则化。

相似性度量:范数可以用于计算向量之间的相似性度量。例如,可以使用余弦相似度或欧几里德距离等度量来比较两个向量之间的相似性。

数据预处理:范数可以用于数据预处理,例如对数据进行归一化或标准化。通过将向量除以其范数,可以将向量归一化为单位向量,这有助于处理某些机器学习任务,如聚类和分类。
在这里插入图片描述
错误原因:矩阵内的数值必须为浮点数。
在这里插入图片描述

2.4 微积分

练习1

绘制函数 y = f ( x ) = x 3 − 1 x y = f(x) = x^3 −\frac{1}{x} y=f(x)=x3x1和其在 x = 1 x = 1 x=1处切线的图像。

# 导入模块
import matplotlib.pyplot as plt
import numpy as np

# 定义函数和导数
def f(x):
    return x**3 - 1/x

def f_prime(x):
    return 3*x**2 + 1/x**2

# 生成x值的数组
x = np.linspace(-5, 5, 100)

# 计算y值和切线斜率的数组
y = f(x)
m = f_prime(x)

# 绘制函数曲线
plt.plot(x, y, label="f(x)")

# 绘制切线
# 切点的x坐标
x0 = 1
# 切点的y坐标
y0 = f(x0)
# 切线的斜率
m0 = f_prime(x0)
# 切线的截距
b0 = y0 - m0 * x0
# 切线的方程
def tangent_line(x):
    return m0 * x + b0

# 切线的y值的数组
y_tangent = tangent_line(x)

# 绘制切线
plt.plot(x, y_tangent, label="tangent line")

# 显示图像
plt.xlabel("x")
plt.ylabel("y")
plt.legend()
plt.show()

在这里插入图片描述

练习2

求函数 f ( x ) = 3 x 1 2 + 5 e x 2 f(x) = 3x_1^2 + 5e^{x_2} f(x)=3x12+5ex2的梯度。

梯度为: ( 6 x 1 , 5 e X 2 ) (6x_1, 5e^{X_2}) (6x1,5eX2)

练习3

函数 f ( x ) = ∥ x ∥ 2 f(x) = ∥x∥_2 f(x)=x2的梯度是什么?

范数: ∣ ∣ x ∣ ∣ ||x|| ∣∣x∣∣表示 x x x的范数,也就是 x x x的长度或大小。

∣ ∣ X ∣ ∣ 2 ||X||_2 ∣∣X2为第二范数

在这里插入图片描述

练习4

尝试写出函数 u = f ( x , y , z ) u = f(x, y, z) u=f(x,y,z),其中 x = x ( a , b ) , y = y ( a , b ) , z = z ( a , b ) x = x(a, b),y = y(a, b),z = z(a, b) x=x(a,b)y=y(a,b)z=z(a,b)的链式法则。
在这里插入图片描述

2.5 自动微分

练习1

为什么计算⼆阶导数⽐⼀阶导数的开销要更⼤?

因为计算二阶导数要在一阶导数的基础上再进行求导,这就需要构建新的计算图,保存更多的中间结果,占用更多的内存和计算资源。而计算一阶导数只需要沿着原有的计算图反向传播梯度值,不需要额外的开销。

练习2

在运⾏反向传播函数之后,⽴即再次运⾏它,看看会发⽣什么。
在这里插入图片描述
在这里插入图片描述
这意味着你试图对一个已经释放了计算图的张量进行反向传播,这是不允许的。当你调用.backward()autograd.grad()时,计算图中的中间值会被释放,以节省内存。如果你需要对同一个张量进行第二次反向传播或者在调用.backward()后访问保存的张量,你需要在第一次调用.backward()时指定retain_graph=True参数,以保留计算图。
在这里插入图片描述

练习3

在控制流的例⼦中,我们计算d关于a的导数,如果将变量a更改为随机向量或矩阵,会发⽣什么?
在这里插入图片描述
在调用backward()方法之前,需要确保输出张量是一个标量,否则将会引发与之类似的错误。

在PyTorch中,计算图是动态构建的,即在每次计算中重新构建一次计算图。因此,将张量作为函数的输出时,需要指定一个标量值作为损失函数,以便计算梯度。反向传播的过程是从损失函数开始,逐步向前计算每个计算步骤的梯度,直到达到需要求解的变量为止。因此,反向传播的计算过程必须以标量输出为起点。

在PyTorch中,如果将一个非标量张量作为函数的输出,那么在调用backward()方法时,将会收到一个RuntimeError异常,提示"grad can be implicitly created only for scalar outputs"。这是因为计算梯度需要沿着计算图向后传播,而非标量输出会导致计算图的多个分支汇聚在一起,无法确定要计算哪个分支的梯度,因此无法正确计算梯度。

因此,为了进行反向传播,需要将输出张量降维为标量,以便能够计算梯度。在降维过程中,可以使用一些常见的降维函数,如mean()、sum()等,将张量的所有元素合并为一个标量。
在这里插入图片描述

练习4

重新设计⼀个求控制流梯度的例⼦,运⾏并分析结果。
在这里插入图片描述
这段代码定义了一个函数f(x),它接受一个三行三列的张量x作为输入,然后对x进行三次循环,每次循环都把x乘以2,如果x的元素之和大于10,就把x的每个元素减去1,最后返回x。然后,它创建了一个随机生成的三行三列的张量x,并且设置了requires_grad为True,表示需要计算x的梯度。接着,它调用f(x)得到y,并对y的元素之和求导,得到x的梯度。最后,它打印出x的梯度。

结果显示,x的梯度是一个全为8的三行三列的张量。这是因为y是x的线性函数, y = 8 x − c y = 8x - c y=8xc,其中c是一个常数。因此,y对x的偏导数就是8。当我们对y的元素之和求导时,相当于对每个元素求导再求和,所以结果就是8乘以9(元素个数),即72。由于我们使用了backward()方法,它会自动把72分配给每个元素,所以x的梯度就是全为8的张量。

练习5

使 f ( x ) = s i n ( x ) f(x) = sin(x) f(x)=sin(x),绘制 f ( x ) f(x) f(x) d f ( x ) d x \frac{df(x)}{dx} dxdf(x)的图像,其中后者不使⽤ f ( x ) = c o s ( x ) f(x) = cos(x) f(x)=cos(x)
绘制f(x)的代码
绘制f(x)的图像
绘制f‘(x)的代码
绘制f’(x)的图像

2.6 概率

练习1

进⾏ m = 500 m = 500 m=500组实验,每组抽取 n = 10 n = 10 n=10个样本。改变 m m m n n n,观察和分析实验结果。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

练习2

给定两个概率为 P ( A ) P(A) P(A) P ( B ) P(B) P(B)的事件,计算 P ( A ∪ B ) P(A ∪ B) P(AB) P ( A ∩ B ) P(A ∩ B) P(AB)的上限和下限。(提示:使⽤友元图来展示这些情况。)

P ( A ∪ B ) P(A ∪ B) P(AB)的上限以及 P ( A ∩ B ) P(A ∩ B) P(AB)的下限:
在这里插入图片描述
P ( A ∪ B ) P(A ∪ B) P(AB)的下限以及 P ( A ∩ B ) P(A ∩ B) P(AB)的上限:

在这里插入图片描述

练习2

假设我们有⼀系列随机变量,例如 A 、 B A、B AB C C C,其中 B B B只依赖于 A A A,⽽ C C C只依赖于 B B B,能简化联合概率 P ( A , B , C ) P(A, B, C) P(A,B,C)吗?(提⽰:这是⼀个马尔可夫链。)

由于B只依赖于A,可知
P ( B ∣ A , C ) = P ( B ∣ A ) P(B|A, C) = P(B|A) P(BA,C)=P(BA)
由于B只依赖于A,可知
P ( C ∣ A , B ) = P ( C ∣ B ) P(C|A, B) = P(C|B) P(CA,B)=P(CB)
可得:
P ( A , B , C ) = P ( C ∣ A , B ) P ( A , B ) = P ( C ∣ A , B ) P ( B ∣ A ) P ( A ) = P ( C ∣ B ) P ( B ∣ A ) P ( A ) \begin{aligned} P(A, B, C)&= P(C|A, B)P(A, B)\\ &=P(C|A, B)P(B|A)P(A)\\ &=P(C|B)P(B|A)P(A) \end{aligned} P(A,B,C)=P(CA,B)P(A,B)=P(CA,B)P(BA)P(A)=P(CB)P(BA)P(A)

练习2

在 2.6.2节中,第⼀个测试更准确。为什么不运⾏第⼀个测试两次,⽽是同时运⾏第⼀个和第⼆个测试?

现实中我们不会让病人进行两次同种检验,另外如果进行相继两次的第一种测试,得到都为阳性的结果患者得病的概率为 1 − ( 1 − 0.1307 ) 2 = 0.24431751000000002 1-(1-0.1307)^2=0.24431751000000002 1(10.1307)2=0.24431751000000002,更加不现实了。

### 回答1: 动手深度学习v2是一本非常好的深度学习教材,是从谷歌机器习研究员李沐所主持的Gluon团队创作的。它提供了丰富的案例和实际应用,深入浅出地介绍了深度学习的基础理论和实践技能。 下载动手深度学习v2非常简单,可以通过访问官方网站来获取。首先,打开谷歌或百度搜索引擎,搜索"动手深度学习v2下载",就可以找到相关的下载链接。建议选择官网下载,因为官网下载最为安全可靠。 进入官网后,点击首页上的"下载"按钮,然后在目录下找到本书的下载链接,下载适合你的版本即可。此外,动手深度学习v2还有在线阅读的版本,方便习者随时随地习。 总的来说,动手深度学习v2是一本非常优秀的深度学习教材,相关下载链接也十分便捷,能够帮助广大习者更好地掌握深度学习相关的知识和技能。 ### 回答2: 动手深度学习v2是一本非常优秀的深度学习入门书籍,笔者十分推荐。如果您想要下载该书籍,可以使用以下方法: 1.进入动手深度学习v2的官网(https://zh.d2l.ai/),点击右上角的“Github”按钮,进入书籍的Github仓库。 2.在仓库中找到“releases”目录,选择最新的版本号,点击进入。 3.在该版本的页面中,找到“Source code (zip)”或“Source code (tar.gz)”选项,点击下载压缩包。 4.下载完成后,解压缩文件即可得到电子书的文件夹,其中包括PDF和HTML格式的书籍。 除此之外,您也可以在该官网中找到由中文社区翻译的在线电子书版本。在该电子书中,您可以直接在线阅读和习。值得注意的是,该书籍的在线翻译版本可能会比英文原版稍有滞后。如果您想要阅读最新的内容,请下载英文原版或者在该官网上查看最新的更新。 ### 回答3: 深度学习是现在的热门话题之一。而动手深度学习v2是一本非常好的深度学习教材,旨在为做实际项目的习者提供知识技能和实战经验。为了下载此书,您需要按照以下步骤进行。 首先,您需要访问动手深度学习官方网站,网址为d2l.ai。然后,您需要找到下载页面,这个页面可以通过页面上的“全书下载”按钮或主页面上的一个标签来访问。 在下载页面,您需要选择您所需要的版本,v2版本是最新版本。接着,您需要选择您所需的格式。您可以选择PDF格式或HTML格式,下方还提供了在线阅读链接。 若您选择了PDF格式,则需要点击下载链接,页面会跳到GitHub仓库中。在GitHub页面,您需要选择ZIP文件并下载。下载完成后,您就可以在本地解压并阅读这本书了。 若您选择了HTML格式,则不需下载,只需点击在线阅读链接即可。页面会跳转到包含书籍所有章节、实例代码、作者笔记等信息的HTML页面,您可以任意阅读或者下载章节(在左侧点击对应章节)。 总之,动手深度学习v2是一本亲身实践的深度学习教材,其深入浅出的讲解以及丰富的实战案例,能够帮助初者快速掌握深度学习这一技术,同时也是深度学习领域专业人士的必备读物。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FeatherWaves

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值