
文档教程人工智能深度学习NLP计算机视觉强化学习【免费下载链接】d2l-enInteractive deep learning book with multi-framework code, math, and discussions. Adopted at 500 universities from 70 countries including Stanford, MIT, Harvard, and Cambridge.项目地址https://gitcode.com/gh_mirrors/d2/d2l-en点击查看免费下载亚里士多德在《尼各马可伦理学》中说过For the things we have to learn before we can do them, we learn by doing them.对于必须先学会才能做的事情我们正是通过做去学会它们。d2l-enDive into Deep Learning交互式深度学习教材的整个编写思路都贯彻了这一理念每个章节在讲完概念后都会搭配一组可运行的动手练习让读者把上一课学到的知识立刻付诸实践。本文对应仓库 contrib/chapter_crashcourse/chapter-one-problem-set.md 这套急训章题集共包含 8 道题覆盖四个主题NDArray 基础操作、线性代数、概率与自动微分autograd。通过完成这些题目你将掌握在 GPU 上分配张量内存并求最大值下标、构造与验证单位矩阵、用逐元素运算循环构建高维张量、计算向量的和与均值、用点积与反余弦求向量夹角、用多项式分布采样模拟 Risk 游戏掷骰胜率、以及用自动微分求抛物线斜率并画图验证。每一题我们都会给出可直接运行的参考实现并指出其背后的教材章节与源码依据。一、题集背景与使用方式这套题集是 d2l-en 早期急训crash course路线的产物目标是让读者在正式进入第二章之前先用最短的时间把张量、线性代数、概率和自动微分四块基本功练一遍。原文档在 contrib/chapter_crashcourse 目录下以Problem Set为名组织成若干Work Area工作区代码块读者在对应的# Problem N Work Area注释下方填入自己的解法。一个值得注意的细节是原题集中问题 6Risk 游戏引用了sample_multinomial函数问题 1 引用了 MXNet 的 NDArray 与argmax。这些 API 属于 MXNet 时代的写法。在 d2l-en 仓库中同一套概念现在分别以多框架形式出现在主教材章节里例如NDArray 基础chapter_preliminaries/ndarray.md线性代数点积、范数、矩阵乘法、和与均值chapter_preliminaries/linear-algebra.md概率与多项式分布采样chapter_preliminaries/probability.md自动微分chapter_preliminaries/autograd.md。因此本文在给出参考实现时会同时覆盖 MXNet贴合原题语境与现代 PyTorch 两种写法便于对照。二、Problem 1GPU 上分配 NDArray 并求 argmax题目要求初始化一个维度为1x256的 NDArray要求在 GPU 上分配且不覆盖其内存即不做初始化、直接分配内存然后找出数组中最大值对应的下标argmax。这题考察两个知识点张量既可以带初值创建如zeros、ones也可以只分配内存、内容未初始化创建argmax返回的是沿指定轴最大值的下标是分类问题中取预测类别的核心操作。参考实现MXNet 语境from mxnet import np, npx npx.set_np() # 在 GPU 上分配 1x256 的未初始化内存 # mxnet.np.empty 只分配内存不保证内容等价于不覆盖其内存 x np.empty((1, 256), ctxnpx.gpu(0)) # 找最大值下标沿 axis1 求 argmax idx x.argmax(axis1) print(x.shape, idx)关于设备的选择仓库工具函数 d2l/mxnet.py 中封装了gpu(i)、num_gpus()、try_gpu(i)与try_all_gpus()四个函数其中try_gpu(i)的逻辑是如果第 i 块 GPU 存在就返回它否则回退到 CPU非常适合在不确定机器是否有 GPU 时使用。因此更稳妥的写法是from mxnet import np, npx from d2l import mxnet as d2l npx.set_np() ctx d2l.try_gpu() # 有 GPU 用 GPU没有则用 CPU x np.empty((1, 256), ctxctx) idx x.argmax(axis1)参考实现PyTorch 语境import torch # 在 GPU 上分配 1x256 的未初始化内存 x torch.empty(1, 256, devicecuda if torch.cuda.is_available() else cpu) # 找最大值下标沿 axis1 求 argmax idx x.argmax(dim1) print(x.shape, idx)考点说明empty与zeros的区别empty只分配内存内容取决于该内存块上残留的旧值因此每次运行结果可能不同zeros则会把所有元素显式清零。原题强调不覆盖其内存正是为了让你理解分配与初始化是两回事。这一点在主教材 chapter_preliminaries/ndarray.md 中有多处体现例如np.zeros((2, 3, 4))、torch.zeros((2, 3, 4))等显式初始化写法。argmax的轴参数对1x256的二维张量axis1表示沿第二维256 个元素那一维取最大值的下标返回形状为(1,)。GPU 上下文MXNet 中张量的设备由ctx参数控制PyTorch 中则由device控制try_gpu封装了探测可用 GPU 并自动回退 CPU的健壮逻辑。三、Problem 2随机矩阵 × 单位矩阵验证乘法还原题目要求创建一个4x4的随机矩阵元素在[0, 1]区间上均匀分布再创建一个4x4的单位矩阵identity matrix即主对角线全为 1、其余全为 0 的方阵。把两者相乘验证结果等于原矩阵。这题的核心是验证单位矩阵的乘法性质任何矩阵乘以其同阶单位矩阵结果仍是它本身即 $\mathbf{A}\mathbf{I} \mathbf{A}$单位矩阵是矩阵乘法的幺元。参考实现MXNet 语境from mxnet import np, npx npx.set_np() # [0, 1) 均匀分布的 4x4 随机矩阵 A np.random.uniform(0, 1, (4, 4)) # 4x4 单位矩阵主对角线为 1其余为 0 I np.eye(4) # 矩阵乘法验证 A I A result np.dot(A, I) print(result) print(np.allclose(result, A)) # 应输出 True参考实现PyTorch 语境import torch A torch.rand(4, 4) # [0, 1) 均匀随机 I torch.eye(4) # 4x4 单位矩阵 result A I # 或 torch.matmul(A, I) print(result) print(torch.allclose(result, A)) # 应输出 True考点说明均匀随机 vs 标准正态np.random.uniform(0, 1, shape)/torch.rand(shape)生成的是[0, 1)均匀分布而np.random.normal/torch.randn生成的是标准正态分布。题目明确要求均匀分布不要用错。矩阵乘法与逐元素乘法矩阵乘法np.dot/torch.matmul/与逐元素乘法Hadamard 积A * B是线性代数中极易混淆的两个概念主教材 chapter_preliminaries/linear-algebra.md 中同时给出了np.dot(A, B)、torch.matmul(A, B)的矩阵乘法示例与A * B的逐元素乘法示例本题要求的是前者。浮点比较由于浮点运算存在舍入误差验证相等时应使用allclose带容差而不是。四、Problem 3用逐元素运算构造 3×3×20 的斐波那契张量题目要求创建一个形状为3x3x20的张量要求在每个(x, y)坐标上沿z轴的元素构成斐波那契数列z0处 3×3 矩阵全为 1z1处全为 1z2处全为 2z3处全为 3依此类推。提示先手工构造前两个矩阵再在循环里用逐元素elementwise运算构造张量的其余部分。参考实现MXNet 语境from mxnet import np, npx npx.set_np() # 前两个切片F0 1, F1 1 slices [np.ones((3, 3)), np.ones((3, 3))] for i in range(2, 20): # 逐元素加法新切片 前两个切片之和 slices.append(slices[i - 1] slices[i - 2]) # 沿新轴堆叠为 3x3x20 tensor np.stack(slices, axis2) print(tensor.shape) # (3, 3, 20) print(tensor[0, 0, :10]) # 应为 1 1 2 3 5 8 13 21 34 55参考实现PyTorch 语境import torch slices [torch.ones(3, 3), torch.ones(3, 3)] for i in range(2, 20): slices.append(slices[i - 1] slices[i - 2]) # 逐元素加法 tensor torch.stack(slices, dim2) # 堆叠为 3x3x20 print(tensor.shape) # torch.Size([3, 3, 20]) print(tensor[0, 0, :10]) # 1 1 2 3 5 8 13 21 34 55考点说明逐元素运算slices[i-1] slices[i-2]是逐元素加法两个(3, 3)张量对应位置相加这正是主教材 chapter_preliminaries/linear-algebra.md 中介绍的 Hadamard 运算思想的延伸——不过这里是逐元素相加而非相乘。张量堆叠np.stack(slices, axis2)/torch.stack(slices, dim2)沿第三维新轴把 20 个(3,3)切片叠成(3,3,20)。这与主教材中用np.arange(24).reshape(2, 3, 4)展示的多维张量如何由低维数据组合而来一脉相承。广播的妙用由于每个切片的每个元素都是同一个斐波那契数3x3切片里所有位置数值相同因此沿z轴观察任意(x, y)位置都会得到完整的斐波那契数列。五、Problem 4求向量的和与均值题目要求对你创建的向量承接 Problem 3 的成果可以取斐波那契张量展平后的向量也可以自行构造一个向量求和sum并求均值mean。参考实现# MXNet from mxnet import np, npx npx.set_np() v np.arange(10, dtypefloat32) print(v.sum(), v.mean()) # 45.0 4.5# PyTorch import torch v torch.arange(10, dtypetorch.float32) print(v.sum(), v.mean()) # tensor(45.) tensor(4.5)考点说明求和与均值是张量归约reduction操作中最基础的两个主教材 chapter_preliminaries/linear-algebra.md 中系统讲解了两点均值 总和 / 元素个数即A.mean() A.sum() / A.sizePyTorch 中为A.sum() / A.numel()归约操作可以指定axis沿某一维进行例如A.mean(axis0)求每列均值、A.sum(axis1)求每行之和若希望保持维度不变以便广播可加keepdimsTrue。六、Problem 5用点积与反余弦求两向量夹角题目要求创建向量[0, 1]和[1, 0]用框架计算它们之间的夹角。提示两向量的点积等于它们夹角的余弦值而arccos反余弦是余弦的逆函数。数学原理对两个同维向量 $\mathbf{x}, \mathbf{y}$点积满足$$ \mathbf{x}^\top \mathbf{y} |\mathbf{x}| |\mathbf{y}| \cos \theta $$其中 $\theta$ 是两向量夹角$|\cdot|$ 是范数长度。因此$$ \theta \arccos\left(\frac{\mathbf{x}^\top \mathbf{y}}{|\mathbf{x}| |\mathbf{y}|}\right) $$主教材 chapter_preliminaries/linear-algebra.md 中明确指出把两个向量归一化为单位长度后点积就等于它们夹角的余弦值After normalizing two vectors to have unit length, the dot products express the cosine of the angle between them。[0, 1]与[1, 0]恰好都是单位向量且互相正交预期夹角为 $90°$$\pi/2$ 弧度。参考实现MXNet 语境from mxnet import np, npx npx.set_np() x np.array([0, 1], dtypefloat32) y np.array([1, 0], dtypefloat32) cos_theta np.dot(x, y) / (np.linalg.norm(x) * np.linalg.norm(y)) theta np.arccos(cos_theta) print(theta) # ≈ 1.5708即 pi/2 弧度90 度参考实现PyTorch 语境import torch x torch.tensor([0.0, 1.0]) y torch.tensor([1.0, 0.0]) cos_theta torch.dot(x, y) / (torch.norm(x) * torch.norm(y)) theta torch.acos(cos_theta) print(theta) # tensor(1.5708)考点说明点积np.dot/torch.dot即内积 $\mathbf{x}^\top\mathbf{y}$主教材给出了等价写法np.sum(x * y)逐元素相乘后求和范数np.linalg.norm/torch.norm默认计算 L2 范数欧氏长度主教材中用np.linalg.norm(u)演示了同样的用法反余弦MXNet 用np.arccosPyTorch 用torch.acos返回的是弧度值转换为角度需乘以 $180/\pi$数值稳定性由于浮点误差cos_theta可能略微超出[-1, 1]实际工程中常先做clip(-1, 1)再求反余弦。七、Problem 6用多项式分布模拟 Risk 游戏掷骰胜率题目要求在经典桌游 Risk《大战役》中进攻方最多掷 3 个骰子防守方最多掷 2 个骰子。使用多项式分布采样函数原题写作sample_multinomial模拟双方都掷满最大骰子数的情形估计进攻方获胜的胜率。数学建模进攻方掷 3 个六面骰防守方掷 2 个六面骰每面概率相等即概率向量[1/6]*6双方各自把骰子结果从大到小排序然后按位比较进攻方的最大骰 vs 防守方的最大骰进攻方的次大骰 vs 防守方的次大骰点数大者赢平局视为防守方赢Risk 规则中平局防守方胜进攻方在两轮比较中赢的次数多于防守方才算整局获胜。注意由于多项式分布一次采样返回的是每个面出现的次数而非具体点数序列直接用Multinomial(3, fair_probs).sample()无法区分每个骰子的点数。因此更直接的做法是用均匀分布掷骰randint(1, 7)生成点数再排序比较。原题提到的sample_multinomial在多框架时代已被各框架的均匀/整数采样所取代见主教材 chapter_preliminaries/probability.md 中对multinomial/Multinomial用法与样本数越大频率越接近概率大数定律的讨论。参考实现PyTorch 语境多次模拟取平均import torch num_sims 100000 attacker_wins 0.0 for _ in range(num_sims): att torch.sort(torch.randint(1, 7, (3,)), descendingTrue).values # 进攻方 3 骰降序 de torch.sort(torch.randint(1, 7, (2,)), descendingTrue).values # 防守方 2 骰降序 wins_att (att[0] de[0]) (att[1] de[1]) # 两轮比较平局算防守方赢 wins_def 2 - wins_att if wins_att wins_def: attacker_wins 1 print(f进攻方胜率 ≈ {attacker_wins / num_sims:.3f}) # 通常约 0.37 左右考点说明多项式分布与大数定律主教材 chapter_preliminaries/probability.md 以抛硬币为例演示了multinomial(100, fair_probs)采样并指出当重复次数增大时估计值以 $1/\sqrt{n}$ 的速度收敛到真实概率中心极限定理。本题的模拟次数越大估计的胜率越稳定采样 API 对照MXNet 为np.random.multinomial(n, probs)PyTorch 为torch.distributions.multinomial.Multinomial(n, probs).sample()TensorFlow 为tfd.Multinomial(n, probs).sample()JAX 的jax.random未实现多项式分布可退化为np.random.multinomial平局归属Risk 规则中平局算防守方赢直接体现为att[i] de[i]的严格大于判断。八、Problem 7用 autograd 求抛物线斜率题目要求抛物线公式为 $y ax^2 bx c$已知 $a 5$、$b 13$求 $y$ 在 $x0$ 处的斜率以及 $x7$ 处的斜率。数学解析$y 5x^2 13x c$ 对 $x$ 求导$$ \frac{dy}{dx} 10x 13 $$因此$x 0$ 时斜率为 $13$$x 7$ 时斜率为 $10 \times 7 13 83$。这道题的用意在于先用微积分知识手算出解析结果再用自动微分框架验证体会手算解析导数与框架自动求梯度的一致性。参考实现MXNet 语境MXNet 的自动微分流程在主教材 chapter_preliminaries/autograd.md 中有标准三步调用attach_grad为张量分配梯度存储在autograd.record()作用域内构建计算图然后backward()并通过grad属性读取梯度。from mxnet import autograd, np, npx npx.set_np() a, b 5.0, 13.0 x np.array(0.0) x.attach_grad() # 为 x 分配梯度存储 with autograd.record(): # 记录计算图 y a * x * x b * x y.backward() # 反向传播 print(x.grad) # 13.0再对 $x7$ 求一次x2 np.array(7.0) x2.attach_grad() with autograd.record(): y2 a * x2 * x2 b * x2 y2.backward() print(x2.grad) # 83.0参考实现PyTorch 语境import torch a, b 5.0, 13.0 x torch.tensor(0.0, requires_gradTrue) # 等价于先建张量再 requires_grad_(True) y a * x * x b * x y.backward() print(x.grad) # tensor(13.) x2 torch.tensor(7.0, requires_gradTrue) y2 a * x2 * x2 b * x2 y2.backward() print(x2.grad) # tensor(83.)考点说明主教材 chapter_preliminaries/autograd.md 以 $y 2\mathbf{x}^\top\mathbf{x}$ 为例展示了同样的模式并强调两个工程细节梯度缓冲区MXNet 在记录新计算图时会重置梯度缓冲而 PyTorch 会把新梯度累加到已存储的梯度上需要手动调用x.grad.zero_()清零。本题中我们为每个x单独建张量规避了累加问题若复用同一个张量务必先清零。梯度形状与x一致标量函数对向量 $\mathbf{x}$ 的梯度是与其同形状的向量主教材用x.grad 4 * x验证了自动微分结果 解析结果。九、Problem 8绘图观察斜率并与解析结果对照题目要求把 Problem 7 的抛物线画出来观察 $x0$ 与 $x7$ 处的切线斜率验证是否与上一题用 autograd 算出的结果一致。参考实现仓库工具 d2l/mxnet.py 中封装了set_figsize、plot等绘图函数可直接复用# MXNet d2l 绘图工具 from mxnet import np, npx from d2l import mxnet as d2l npx.set_np() xs np.arange(-2.0, 8.0, 0.1) ys 5 * xs * xs 13 * xs d2l.set_figsize((4.5, 3.5)) d2l.plt.plot(xs, ys, labely 5x^2 13x) # 标注 x0 处的切线斜率 13与 x7 处的切线斜率 83 d2l.plt.plot(xs, 13 * xs, m--, labeltangent at x0 (slope13)) d2l.plt.plot(xs, 83 * (xs - 7) 5 * 49 13 * 7, g-., labeltangent at x7 (slope83)) d2l.plt.xlabel(x); d2l.plt.ylabel(y); d2l.plt.legend(); d2l.plt.grid() d2l.plt.show()考点说明抛物线 $y 5x^2 13x$ 在 $x0$ 附近几乎水平切线斜率为 13比较平缓而在 $x7$ 处急剧上升斜率 83从图中可以直观看到导数 切线斜率这一几何意义观察切线与曲线的贴合程度即可交叉验证 Problem 7 中用 autograd 求出的数值绘图函数的默认figsize(3.5, 2.5)可通过set_figsize调整该工具函数的实现位于 d2l/mxnet.py 的set_figsize定义中。十、题集小结与后续路线8 道题覆盖了深度学习入门最核心的四块肌肉记忆题目主题关键 API / 概念对应教材章节1NDArrayempty、GPU 上下文、argmaxndarray.md2线性代数均匀随机、eye、矩阵乘法、allcloselinear-algebra.md3线性代数逐元素加法、循环构造、stacklinear-algebra.md4线性代数sum、mean、归约与axislinear-algebra.md5线性代数dot、norm、arccos、向量夹角linear-algebra.md6概率多项式/均匀采样、大数定律、蒙特卡洛估计probability.md7自动微分attach_grad、record、backward、gradautograd.md8自动微分 可视化切线斜率、plot绘图验证autograd.md完成这套题集后原文档建议读者进入第二章从零实现线性回归对应主教材 chapter_linear-regression/linear-regression-scratch.md。届时你会看到Problem 2 的单位矩阵、Problem 5 的向量夹角、Problem 7 的自动微分正是后续手写梯度下降、验证模型收敛时反复使用的底层工具。如果对题目本身有疑问或发现错误仓库的 CONTRIBUTING.md 说明了贡献与提 issue 的流程。本文所有参考实现均为可直接复制运行的完整代码建议在 Jupyter Notebook 中逐题执行、对照输出真正践行亚里士多德所说的learn by doing。赞分享文档教程人工智能深度学习NLP计算机视觉强化学习【免费下载链接】d2l-enInteractive deep learning book with multi-framework code, math, and discussions. Adopted at 500 universities from 70 countries including Stanford, MIT, Harvard, and Cambridge.项目地址https://gitcode.com/gh_mirrors/d2/d2l-en点击查看免费下载相关推荐合成回归数据生成与 DataLoader 实践d2l-en 线性回归数据管线全解析合成回归数据生成与 DataLoader 实践d2l en 线性回归数据管线全解析 导读 本文围绕《Dive into Deep Learning》d2l文档教程人工智能深度学习NLP计算机视觉强化学习Mangum生命周期管理如何正确配置startup和shutdown事件Mangum生命周期管理如何正确配置startup和shutdown事件 Mangum是一款为ASGI应用提供AWS Lambda支持的工具能够帮助开发者轻后端3步解锁英雄联盟游戏资源Obsidian终极Wad文件编辑器完全指南3步解锁英雄联盟游戏资源Obsidian终极Wad文件编辑器完全指南 你是否曾经好奇英雄联盟游戏中的精美皮肤、炫酷特效和界面元素是如何存储和管理的当你想要自桌面应用游戏开发上一篇Navicat无限试用终极指南三步实现Mac版Navicat16/17永久免费使用下一篇Navicat永久免费使用终极方案三步解除Mac版数据库管理工具试用限制创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考