Skip to content

Commit

Permalink
Preliminaries (d2l-ai#585)
Browse files Browse the repository at this point in the history
  • Loading branch information
xiaotinghe authored and astonzhang committed Feb 17, 2021
1 parent 7c0b155 commit 0b7f2a1
Show file tree
Hide file tree
Showing 7 changed files with 172 additions and 171 deletions.
18 changes: 9 additions & 9 deletions chapter_preliminaries/autograd.md
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
# 自动求导
:label:`sec_autograd`

正如我们在 :numref:`sec_calculus` 中所说的那样,求导是几乎所有深度学习优化算法的关键步骤。虽然采用虽然求导的计算很简单,只需要一些基本的微积分,对于复杂的模型,手工进行更新是一件很痛苦的事情(而且经常容易出错)。
正如我们在 :numref:`sec_calculus` 中所说的那样,求导是几乎所有深度学习优化算法的关键步骤。虽然求导的计算很简单,只需要一些基本的微积分,但对于复杂的模型,手工进行更新是一件很痛苦的事情(而且经常容易出错)。

深度学习框架通过自动计算导数(即 *自动求导*来加快这项工作。实际中,根据我们设计的模型,系统会构建一个 *计算图*(computational graph),来跟踪数据通过若干操作组合产生输出。自动求导使系统能够随后反向传播梯度。
这里,*反向传播*(backpropagate)只是意味着跟踪整个计算图,填充对每个参数的偏导数
深度学习框架通过自动计算导数(即 *自动求导*(automatic differentiation))来加快这项工作。实际中,根据我们设计的模型,系统会构建一个 *计算图*(computational graph),来跟踪数据通过若干操作组合起来产生输出。自动求导使系统能够随后反向传播梯度。
这里,*反向传播*(backpropagate)只是意味着跟踪整个计算图,填充关于每个参数的偏导数

```{.python .input}
from mxnet import autograd, np, npx
Expand Down Expand Up @@ -42,8 +42,8 @@ x = tf.range(4, dtype=tf.float32)
x
```

在我们计算$y$关于$\mathbf{x}$的梯度之前,我们需要一个地方来存储它
重要的是,我们不会在每次对一个参数求导时都分配新的内存。因为我们经常会成千上万次地更新相同的参数,每次篼分配新的内存可能很快就会耗尽内存。注意,标量值函数关于向量$\mathbf{x}$的梯度本身是向量值的,并且与$\mathbf{x}$具有相同的形状。
在我们计算$y$关于$\mathbf{x}$的梯度之前,我们需要一个地方来存储梯度
重要的是,我们不会在每次对一个参数求导时都分配新的内存。因为我们经常会成千上万次地更新相同的参数,每次都分配新的内存可能很快就会将内存耗尽。注意,标量函数关于向量$\mathbf{x}$的梯度是向量,并且与$\mathbf{x}$具有相同的形状。

```{.python .input}
Expand Down Expand Up @@ -240,7 +240,7 @@ t.gradient(y, x) == 2 * x

## Python控制流的梯度计算

使用自动求导的一个好处是,即使构建函数的计算图需要通过 Python控制流(例如,条件、循环或任意函数调用),我们仍然可以计算结果变量的梯度。在下面的代码中,`while` 循环的迭代次数和 `if` 语句的结果都取决于输入 `a` 的值。
使用自动求导的一个好处是,即使构建函数的计算图需要通过 Python控制流(例如,条件、循环或任意函数调用),我们仍然可以计算得到的变量的梯度。在下面的代码中,`while` 循环的迭代次数和 `if` 语句的结果都取决于输入 `a` 的值。

```{.python .input}
def f(a):
Expand Down Expand Up @@ -306,7 +306,7 @@ d_grad = t.gradient(d, a)
d_grad
```

我们现在可以分析上面定义的 `f` 函数。请注意,它在其输入 `a` 中是分段线性的。换句话说,对于任何 `a`存在一些常量标量 `k`这样 `f(a) = k * a`,其中 `k` 的值取决于输入 `a`。因此,`d / a` 允许我们验证梯度是否正确。
我们现在可以分析上面定义的 `f` 函数。请注意,它在其输入 `a` 中是分段线性的。换言之,对于任何 `a`存在某个常量标量 `k`使得 `f(a) = k * a`,其中 `k` 的值取决于输入 `a`。因此,`d / a` 允许我们验证梯度是否正确。

```{.python .input}
a.grad == d / a
Expand All @@ -324,11 +324,11 @@ d_grad == d / a

## 小结

* 深度学习框架可以自动计算导数。为了使用它,我们首先给需要偏导数的变量附加梯度。然后我们记录目标值的计算,执行它的反向传播函数,并访问得到的梯度。
* 深度学习框架可以自动计算导数。为了使用它,我们首先将梯度附加到想要对其计算偏导数的变量上。然后我们记录目标值的计算,执行它的反向传播函数,并访问得到的梯度。

## 练习

1. 为什么二阶导数比一阶导数要开销更大
1. 为什么计算二阶导数比一阶导数的开销要更大
1. 在运行反向传播函数之后,立即再次运行它,看看会发生什么。
1. 在控制流的例子中,我们计算 `d` 关于 `a` 的导数,如果我们将变量 `a` 更改为随机向量或矩阵,会发生什么?此时,计算结果 `f(a)` 不再是标量。结果会发生什么?我们如何分析这个结果?
1. 重新设计一个求控制流梯度的例子。运行并分析结果。
Expand Down
13 changes: 7 additions & 6 deletions chapter_preliminaries/index.md
Original file line number Diff line number Diff line change
@@ -1,17 +1,18 @@
# 预备知识
:label:`chap_preliminaries`

要开始深度学习,我们需要开发一些基本技能。所有机器学习都关注从数据中提取信息。因此,我们将首先学习存储、操作和预处理数据的实用技能。
要开始深度学习课程的学习,我们需要掌握一些基本技能。所有的机器学习方法都涉及从数据中提取信息。因此,我们首先将学习存储、操作和预处理数据的实用技能。

此外,机器学习通常需要使用大型数据集,我们可以将其视为表,其中行对应于示例,列对应于属性。线性代数为我们提供了一组强大的技术来处理表格数据。我们不会走得太远,而是把重点放在基础的矩阵操作及其实施
机器学习通常需要处理大型数据集。我们可以将数据集视为表,其中表的行对应于样本,列对应于属性。线性代数为我们提供了一些用来处理表格数据的技术。我们不会太深入细节,而是将重点放在矩阵运算的基本原理及其实现上

此外,深度学习也是关于优化的。我们有一个带有一些参数的模型,我们希望找到适合我们数据 * 最好 * 的模型。确定在算法的每个步骤中移动每个参数的方式需要一点微积分,这将简要介绍。幸运的是,`autograd` 软件包会自动为我们计算差异,接下来我们将介绍它
深度学习是关于优化的。我们有一个带有参数的模型,我们想要找到那些能拟合数据最好的模型。在算法的每个步骤中,决定以何种方式移动每个参数需要一点微积分知识。在本节中将简要介绍这些知识。幸运的是,`autograd`包会自动为我们计算微分,在本节中我们也将介绍它

接下来,机器学习关注预测:鉴于我们观察到的信息,某些未知属性的可能价值是什么?为了在不确定性下严格推理,我们需要调用概率的语言
接下来,机器学习涉及如何做出预测:给定我们观察到的信息,某些未知属性的可能值是多少?要在不确定的情况下进行严格的推理,我们需要引用概率语言

最后,官方文档提供了大量本书以外的描述和示例。为了结束本章,我们将向您展示如何查找所需信息的文档
最后,官方文档提供了本书之外的大量描述和示例。作为本章的结束,我们将向你展示如何在文档中查找所需信息

这本书保持了数学内容的最低限度,以获得正确的理解深度学习。然而,这并不均值这本书是数学免费的。因此,本章提供了基本数学和常用数学的快速介绍,让任何人都能理解至少 * 最 * 本书的数学内容。如果您希望了解 * 全部 * 数学内容,进一步审查 [online appendix on mathematics](https://d2l.ai/chapter_appendix-mathematics-for-deep-learning/index.html) 就足够了。
这本书将对数学的要求保持在正确理解深度学习所需的最低限度。然而,这并不意味着这本书是没有数学的。
因此,本章提供了基本且常用的数学知识的快速介绍,使任何人能够至少理解书中的大部分数学内容。如果你希望理解全部的数学内容,进一步学习[数学的在线附录](https://d2l.ai/chapter_appendix-mathematics-for-deep-learning/index.html)就足够了。

```toc
:maxdepth: 2
Expand Down
Loading

0 comments on commit 0b7f2a1

Please sign in to comment.