Skip to content

Commit

Permalink
ch1, ch2 (d2l-ai#681)
Browse files Browse the repository at this point in the history
  • Loading branch information
xiaotinghe authored Mar 4, 2021
1 parent c71c274 commit 39f837c
Show file tree
Hide file tree
Showing 10 changed files with 92 additions and 87 deletions.
37 changes: 20 additions & 17 deletions chapter_installation/index.md
Original file line number Diff line number Diff line change
@@ -1,21 +1,24 @@
# 安装
:label:`chap_installation`

我们需要设置一个环境来运行 PythonJupyter Notebook相关库以及运行本书所需的代码,以快速入门并获得动手学习经验。
我们需要配置一个环境来运行 PythonJupyter Notebook相关库以及运行本书所需的代码,以快速入门并获得动手学习经验。

## 安装 Miniconda

最简单的方法就是安装依赖 Python 3.x 的 [Miniconda](https://conda.io/en/latest/miniconda.html)。如果已安装 conda,则可以跳过以下步骤。从网站下载相应的 Miniconda sh 文件,然后使用 `sh <FILENAME> -b` 从命令行执行安装。对于 macOS 用户:
最简单的方法就是安装依赖 Python 3.x 的 [Miniconda](https://conda.io/en/latest/miniconda.html)。如果已安装 conda,则可以跳过以下步骤。
从网站下载相应的 Miniconda sh 文件,然后使用 `sh <FILENAME> -b` 从命令行执行安装。

对于 macOS 用户:

```bash
# The file name is subject to changes
# 文件名可能会更改
sh Miniconda3-latest-MacOSX-x86_64.sh -b
```

对于 Linux 用户:

```bash
# The file name is subject to changes
# 文件名可能会更改
sh Miniconda3-latest-Linux-x86_64.sh -b
```

Expand All @@ -25,15 +28,15 @@ sh Miniconda3-latest-Linux-x86_64.sh -b
~/miniconda3/bin/conda init
```

现在关闭并重新打开当前的 shell。你应该能够创建一个新的环境,如下所示
现在关闭并重新打开当前的 shell。你应该能用下面的命令创建一个新的环境

```bash
conda create --name d2l python=3.8 -y
```

## 下载 D2L Notebook

接下来,需要下载这本书的代码。你可以点击任何 HTML 页面顶部的 “Jupyter 笔记本文件” 选项卡下载,并解压代码。或者可以按照如下方式进行下载:
接下来,需要下载这本书的代码。你可以点击任何 HTML 页面顶部的 “Jupyter 记事本文件” 选项下载后解压代码。或者可以按照如下方式进行下载:

```bash
mkdir d2l-zh && cd d2l-zh
Expand All @@ -51,9 +54,9 @@ conda activate d2l

## 安装框架和 `d2l` 软件包

在安装深度学习框架之前,请先检查你的计算机上是否有正确的 GPU(在标准笔记本电脑上为显示器提供电源的 GPU 不计入我们的目的)。如果要在 GPU 服务器上安装,请继续执行 :ref:`subsec_gpu` 以获取有关安装 GPU 支持版本的说明
在安装深度学习框架之前,请先检查你的计算机上是否有可用的 GPU(在笔记本电脑上为显示器提供输出的GPU不算)。如果要在 GPU 机器上安装,请继续在 :ref:`subsec_gpu` 获取有关安装GPU支持版本的说明

或者,你可以按照如下方法安装CPU版本。这将足够帮助你完成前几章,但你需要在运行更大的模型之前访问 GPU
或者,你可以按照如下方法安装CPU版本。这将足够帮助你完成前几章,但你需要在运行更大模型之前获取GPU

:begin_tab:`mxnet`

Expand All @@ -77,50 +80,50 @@ pip install tensorflow tensorflow-probability
```
:end_tab:

我们还安装了 `d2l` 软件包,它封装了本书中常用的函数和类。
你还需要安装 `d2l` 软件包,它封装了本书中常用的函数和类。

```bash
# -U:将所有包升级到最新的可用版本
pip install -U d2l
```

安装完成后,我们现在通过运行以下操作打开 Jupyter 笔记本:
安装完成后,我们通过运行以下命令打开 Jupyter 笔记本:

```bash
jupyter notebook
```

此时,你可以在 Web 浏览器中打开 <http://localhost:8888>(通常会自动打开)。然后我们可以运行这本书的每个部分的代码。在运行书籍代码或更新深度学习框架或 `d2l` 软件包之前,请始终执行 `conda activate d2l` 以激活运行时环境。要退出环境,请运行 `conda deactivate`
现在,你可以在 Web 浏览器中打开 <http://localhost:8888>(通常会自动打开)。然后我们可以运行这本书中每个部分的代码。在运行书籍代码、更新深度学习框架或 `d2l` 软件包之前,请始终执行 `conda activate d2l` 以激活运行时环境。要退出环境,请运行 `conda deactivate`

## GPU 支持
:label:`subsec_gpu`

:begin_tab:`mxnet`
默认情况下,安装MXNet时不支持 GPU,以确保它在任何计算机(包括大多数笔记本电脑)上运行。本书的一部分要求或建议使用 GPU 运行。如果你的计算机具有 NVIDIA 显卡并且已安装 [CUDA](https://developer.nvidia.com/cuda-downloads)则应安装启用 GPU 的版本。如果你已经安装了仅 CPU 版本,则可能需要首先通过运行以下操作将其删除
默认情况下,安装的MXNet不支持GPU。这可以确保它在任何计算机(包括大多数笔记本电脑)上运行。本书的部分内容建议或要求使用 GPU 运行。如果你的计算机带有 NVIDIA 显卡并且已安装 [CUDA](https://developer.nvidia.com/cuda-downloads)则应安装支持 GPU 的版本。如果你已经安装了仅支持 CPU 版本,则可能需要先通过运行以下命令将其删除

```bash
pip uninstall mxnet
```


然后,我们需要找到你安装的 CUDA 版本。你可以通过 `nvcc --version``cat /usr/local/cuda/version.txt` 查看它。假定你已安装 CUDA 10.1,则可以使用以下命令进行安装:
然后,我们需要找到安装的 CUDA 版本。你可以通过 `nvcc --version``cat /usr/local/cuda/version.txt` 查看。假设你已安装 CUDA 10.1,则可以使用以下命令进行安装:


```bash
# For Windows users
# 对于 Windows 用户:
pip install mxnet-cu101==1.7.0 -f https://dist.mxnet.io/python

# For Linux and macOS users
# 对于 Linux macOS 用户:
pip install mxnet-cu101==1.7.0
```


你可以根据你的 CUDA 版本更改最后一位数字,例如:CUDA 10.0 `cu100`CUDA 9.0 `cu90`
你可以根据你的 CUDA 版本更改最后一位数字,例如:CUDA 10.0 `cu100`CUDA 9.0 `cu90`
:end_tab:

:begin_tab:`pytorch,tensorflow`
默认情况下,深度学习框架安装了GPU支持。
如果你的计算机有NVIDIA GPU,并且已经安装了[CUDA](https://developer.nvidia.com/cuda-downloads)那么你应该已经设置好了
如果你的计算机有NVIDIA GPU,并且已经安装了[CUDA](https://developer.nvidia.com/cuda-downloads)那么你应该已经配置好了
:end_tab:

## 练习
Expand Down
8 changes: 4 additions & 4 deletions chapter_notation/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,14 @@
* $\mathbf{X}$:矩阵
* $\mathsf{X}$:张量
* $\mathbf{I}$:单位矩阵
* $x_i$, $[\mathbf{x}]_i$:向量$\mathbf{x}$的第$i$个元素
* $x_i$, $[\mathbf{x}]_i$:向量$\mathbf{x}$$i$个元素
* $x_{ij}$, $[\mathbf{X}]_{ij}$:矩阵$\mathbf{X}$第$i$行第$j$列的元素

## 集合论

* $\mathcal{X}$: 集合
* $\mathbb{Z}$: 整数的集合
* $\mathbb{R}$ 实数的集合
* $\mathbb{Z}$: 整数集合
* $\mathbb{R}$ 实数集合
* $\mathbb{R}^n$: $n$维实数向量
* $\mathbb{R}^{a\times b}$: 包含$a$行和$b$列的实数矩阵
* $\mathcal{A}\cup\mathcal{B}$: 集合$\mathcal{A}$和$\mathcal{B}$的并集
Expand Down Expand Up @@ -47,7 +47,7 @@
* $\frac{dy}{dx}$:$y$关于$x$的导数
* $\frac{\partial y}{\partial x}$:$y$关于$x$的偏导数
* $\nabla_{\mathbf{x}} y$:$y$关于$\mathbf{x}$的梯度
* $\int_a^b f(x) \;dx$: $f$$a$到$b$关于$x$的定积分
* $\int_a^b f(x) \;dx$: $f$$a$到$b$区间上关于$x$的定积分
* $\int f(x) \;dx$: $f$关于$x$的不定积分

## 概率与信息论
Expand Down
6 changes: 3 additions & 3 deletions chapter_preliminaries/autograd.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

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

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


Expand Down Expand Up @@ -40,9 +40,9 @@ x

```{.python .input}
# 我们通过调用attach_grad`来为一个张量的梯度分配内存
# 我们通过调用`attach_grad`来为一个张量的梯度分配内存
x.attach_grad()
# 在我们计算关于`x`的梯度后,我们将能够通过' grad '属性访问它,它的值被初始化为0
# 在我们计算关于`x`的梯度后,我们将能够通过'grad'属性访问它,它的值被初始化为0
x.grad
```

Expand Down
38 changes: 20 additions & 18 deletions chapter_preliminaries/calculus.md
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
# 微分
:label:`sec_calculus`

直到至少2500年前,古希腊人把一个多边形分成三角形,并把它们的面积相加,才找到计算多边形面积的方法。
为了求出曲线形状(比如圆)的面积,古希腊人在这样的形状上刻内接多边形。如 :numref:`fig_circle_area` 所示,内接多边形的等长边越多,就越接近圆。这个过程也被称为 *穷举法*(method of exhaustion)。
在2500年前,古希腊人把一个多边形分成三角形,并把它们的面积相加,才找到计算多边形面积的方法。
为了求出曲线形状(比如圆)的面积,古希腊人在这样的形状上刻内接多边形。如 :numref:`fig_circle_area` 所示,内接多边形的等长边越多,就越接近圆。这个过程也被称为 *逼近法*(method of exhaustion)。

![用穷举法求圆的面积](../img/polygon-circle.svg)
![用逼近法求圆的面积](../img/polygon-circle.svg)
:label:`fig_circle_area`

事实上,穷举法就是 *积分*(integral calculus)的起源,我们将在 :numref:`sec_integral_calculus` 中详细描述。2000 多年后,微积分的另一支,*微分*(differential calculus),被发明出来。在微分学最重要的应用中,优化问题考虑如何把事情做到最好。正如在 :numref:`subsec_norms_and_objectives` 中讨论的那样,这种问题在深度学习中是无处不在的。
事实上,逼近法就是 *积分*(integral calculus)的起源,我们将在 :numref:`sec_integral_calculus` 中详细描述。2000 多年后,微积分的另一支,*微分*(differential calculus),被发明出来。在微分学最重要的应用是优化问题,即考虑如何把事情做到最好。正如在 :numref:`subsec_norms_and_objectives` 中讨论的那样,这种问题在深度学习中是无处不在的。

在深度学习中,我们“训练”模型,不断更新它们,使它们在看到越来越多的数据时变得越来越好。通常情况下,变得更好意味着最小化一个 *损失函数*(loss function),即一个衡量“我们的模型有多*糟糕*”这个问题的分数。这个问题比看上去要微妙得多。最终,我们真正关心的是生成一个能够在我们从未见过的数据上表现良好的模型。但我们只能将模型与我们实际能看到的数据相拟合。因此,我们可以将拟合模型的任务分解为两个关键问题:i) *优化*(optimization):用模型拟合观测数据的过程;ii) *泛化*(generalization):数学原理和实践者的智慧,能够指导我们生成出有效性超出用于训练的数据集本身的模型。
在深度学习中,我们“训练”模型,不断更新它们,使它们在看到越来越多的数据时变得越来越好。通常情况下,变得更好意味着最小化一个 *损失函数*(loss function),即一个衡量“我们的模型有多糟糕”这个问题的分数。这个问题比看上去要微妙得多。最终,我们真正关心的是生成一个能够在我们从未见过的数据上表现良好的模型。但我们只能将模型与我们实际能看到的数据相拟合。因此,我们可以将拟合模型的任务分解为两个关键问题:(1)*优化*(optimization):用模型拟合观测数据的过程;(2)*泛化*(generalization):数学原理和实践者的智慧,能够指导我们生成出有效性超出用于训练的数据集本身的模型。

为了帮助你在后面的章节中更好地理解优化问题和方法,这里我们对深度学习中常用的微分知识提供了一个非常简短的入门教程。

Expand Down Expand Up @@ -81,13 +81,15 @@ $$f'(x) = y' = \frac{dy}{dx} = \frac{df}{dx} = \frac{d}{dx} f(x) = Df(x) = D_x f

其中符号 $\frac{d}{dx}$ 和 $D$ 是*微分运算符*,表示*微分*操作。我们可以使用以下规则来对常见函数求微分:

* $DC = 0$ ($C$ 是一个常数)
* $Dx^n = nx^{n-1}$ (*幂律*(power rule), $n$是任意实数)
* $De^x = e^x$,
* $D\ln(x) = 1/x.$
* $DC = 0$ ($C$ 是一个常数)
* $Dx^n = nx^{n-1}$ (*幂律*(power rule), $n$是任意实数)
* $De^x = e^x$
* $D\ln(x) = 1/x$

为了微分一个由一些简单函数(如上面的常见函数)组成的函数,下面的法则使用起来很方便。
假设函数$f$和$g$都是可微的,$C$是一个常数,我们有*常数相乘法则*
假设函数$f$和$g$都是可微的,$C$是一个常数,我们有:

*常数相乘法则*
$$\frac{d}{dx} [Cf(x)] = C \frac{d}{dx} f(x),$$

*加法法则*
Expand All @@ -104,11 +106,11 @@ $$\frac{d}{dx} \left[\frac{f(x)}{g(x)}\right] = \frac{g(x) \frac{d}{dx} [f(x)] -

现在我们可以应用上述几个法则来计算 $u' = f'(x) = 3 \frac{d}{dx} x^2-4\frac{d}{dx}x = 6x-4$。因此,通过令 $x = 1$ ,我们有 $u' = 2$ :这一点得到了我们在本节前面的实验的支持,在这个实验中,数值结果接近$2$。当 $x=1$ 时,此导数也是曲线 $u = f(x)$ 切线的斜率。

[**为了对导数的这种解释进行可视化,**]我们将使用 `matplotlib`一个Python中流行的绘图库。要配置`matplotlib`生成图形的属性,我们需要(**定义几个函数**)。
[**为了对导数的这种解释进行可视化,**]我们将使用 `matplotlib`这是一个Python中流行的绘图库。要配置`matplotlib`生成图形的属性,我们需要(**定义几个函数**)。
在下面,`use_svg_display` 函数指定 `matplotlib` 软件包输出svg图表以获得更清晰的图像。

注意,注释`#@save`是一个特殊的标记,会将对应的函数、类或语句保存在`d2l`包中
因此,以后无需重新定义就可以直接调用它们(例如,`d2l.use\u svg\u display()`)。
因此,以后无需重新定义就可以直接调用它们(例如,`d2l.use_svg_display()`)。

```{.python .input}
#@tab all
Expand All @@ -117,7 +119,7 @@ def use_svg_display(): #@save
display.set_matplotlib_formats('svg')
```

我们定义 `set_figsize` 函数来指定图表大小。注意,这里我们直接使用 `d2l.plt`,因为导入语句 `from matplotlib import pyplot as plt` 已在`d2l` 软件包的开头被标记为保存
我们定义 `set_figsize` 函数来设置图表大小。注意,这里我们直接使用 `d2l.plt`,因为导入语句 `from matplotlib import pyplot as plt` 已在前言中标记为保存到`d2l` 包中

```{.python .input}
#@tab all
Expand Down Expand Up @@ -194,11 +196,11 @@ plot(x, [f(x), 2 * x - 3], 'x', 'f(x)', legend=['f(x)', 'Tangent line (x=1)'])

到目前为止,我们只讨论了仅含一个变量的函数的微分。在深度学习中,函数通常依赖于许多变量。因此,我们需要将微分的思想推广到这些 *多元函数* (multivariate function)上。

设 $y = f(x_1, x_2, \ldots, x_n)$ 是一个具有 $n$ 个变量的函数。$y$ 相对于第$i^\mathrm{th}$ 个参数$x_i$*偏导数*(partial derivative)为:
设 $y = f(x_1, x_2, \ldots, x_n)$ 是一个具有 $n$ 个变量的函数。$y$ 关于第$i$ 个参数$x_i$*偏导数*(partial derivative)为:

$$ \frac{\partial y}{\partial x_i} = \lim_{h \rightarrow 0} \frac{f(x_1, \ldots, x_{i-1}, x_i+h, x_{i+1}, \ldots, x_n) - f(x_1, \ldots, x_i, \ldots, x_n)}{h}.$$

为了计算 $\frac{\partial y}{\partial x_i}$,我们可以简单地将 $x_1, \ldots, x_{i-1}, x_{i+1}, \ldots, x_n$ 看作常数,并计算 $y$相对于$x_i$ 的导数。对于偏导数的表示,以下是等价的:
为了计算 $\frac{\partial y}{\partial x_i}$,我们可以简单地将 $x_1, \ldots, x_{i-1}, x_{i+1}, \ldots, x_n$ 看作常数,并计算 $y$关于$x_i$ 的导数。对于偏导数的表示,以下是等价的:

$$\frac{\partial y}{\partial x_i} = \frac{\partial f}{\partial x_i} = f_{x_i} = f_i = D_i f = D_{x_i} f.$$

Expand All @@ -213,9 +215,9 @@ $$\nabla_{\mathbf{x}} f(\mathbf{x}) = \bigg[\frac{\partial f(\mathbf{x})}{\parti

假设$\mathbf{x}$为$n$维向量,在微分多元函数时经常使用以下规则:

* 对于所有$\mathbf{A} \in \mathbb{R}^{m \times n}$,都有 $\nabla_{\mathbf{x}} \mathbf{A} \mathbf{x} = \mathbf{A}^\top$,
* 对于所有$\mathbf{A} \in \mathbb{R}^{n \times m}$,都有 $\nabla_{\mathbf{x}} \mathbf{x}^\top \mathbf{A} = \mathbf{A}$,
* 对于所有$\mathbf{A} \in \mathbb{R}^{n \times n}$,都有 $\nabla_{\mathbf{x}} \mathbf{x}^\top \mathbf{A} \mathbf{x} = (\mathbf{A} + \mathbf{A}^\top)\mathbf{x}$,
* 对于所有$\mathbf{A} \in \mathbb{R}^{m \times n}$,都有 $\nabla_{\mathbf{x}} \mathbf{A} \mathbf{x} = \mathbf{A}^\top$
* 对于所有$\mathbf{A} \in \mathbb{R}^{n \times m}$,都有 $\nabla_{\mathbf{x}} \mathbf{x}^\top \mathbf{A} = \mathbf{A}$
* 对于所有$\mathbf{A} \in \mathbb{R}^{n \times n}$,都有 $\nabla_{\mathbf{x}} \mathbf{x}^\top \mathbf{A} \mathbf{x} = (\mathbf{A} + \mathbf{A}^\top)\mathbf{x}$
* $\nabla_{\mathbf{x}} \|\mathbf{x} \|^2 = \nabla_{\mathbf{x}} \mathbf{x}^\top \mathbf{x} = 2\mathbf{x}$

同样,对于任何矩阵 $\mathbf{X}$,我们都有 $\nabla_{\mathbf{X}} \|\mathbf{X} \|_F^2 = 2\mathbf{X}$。正如我们之后将看到的,梯度对于设计深度学习中的优化算法有很大用处。
Expand Down
Loading

0 comments on commit 39f837c

Please sign in to comment.