Skip to content

Commit

Permalink
ch3 && elementwise->按元素 & 偏差->偏置 (d2l-ai#685)
Browse files Browse the repository at this point in the history
  • Loading branch information
xiaotinghe committed Mar 7, 2021
1 parent f293fac commit 26fd28c
Show file tree
Hide file tree
Showing 30 changed files with 105 additions and 105 deletions.
2 changes: 1 addition & 1 deletion chapter_attention-mechanisms/transformer.md
Original file line number Diff line number Diff line change
Expand Up @@ -558,7 +558,7 @@ enc_attention_weights = d2l.reshape(
enc_attention_weights.shape
```

在编码器的自我注意中,查询和键来自相同的输入序列。由于填充令牌不具有意义,并且输入序列的指定有效长度,因此没有查询参与填充令牌的位置。在以下内容中,将逐行呈现两层多头注意力权重。每位负责人都根据查询、键和值的单独表示子空间独立出席。
在编码器的自我注意中,查询和键来自相同的输入序列。由于填充令牌不具有意义,并且输入序列的指定有效长度,因此没有查询参与填充令牌的位置。在以下内容中,将按行呈现两层多头注意力权重。每位负责人都根据查询、键和值的单独表示子空间独立出席。

```{.python .input}
d2l.show_heatmaps(
Expand Down
6 changes: 3 additions & 3 deletions chapter_convolutional-modern/alexnet.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,15 @@

在LeNet提出后,卷积神经网络在计算机视觉和机器学习领域中很有名气。但卷积神经网络并没有主导这些领域。这是因为虽然 LeNet 在小数据集上取得了很好的效果,但是在更大、更真实的数据集上训练卷积神经网络的性能和可行性还有待研究。事实上,在上世纪90年代初到2012年之间的大部分时间里,神经网络往往被其他机器学习方法超越,如支持向量机(support vector machines)。

在计算机视觉中,直接将神经网络与其他机器学习方法进行比较也许不公平。这是因为,卷积神经网络的输入是由原始像素值或是经过简单预处理(例如居中、缩放)的像素值组成的。但在使用传统机器学习方法时,从业者永远不会将原始像素作为输入。在传统机器学习方法中,计算机视觉工作流是由经过人的手工精心设计的特征工作流组成的。对于这些传统方法,大部分的进展都来自于对特征有了更聪明的想法,并且学习到的算法往往归于事后的解释。
在计算机视觉中,直接将神经网络与其他机器学习方法进行比较也许不公平。这是因为,卷积神经网络的输入是由原始像素值或是经过简单预处理(例如居中、缩放)的像素值组成的。但在使用传统机器学习方法时,从业者永远不会将原始像素作为输入。在传统机器学习方法中,计算机视觉流水线是由经过人的手工精心设计的特征流水线组成的。对于这些传统方法,大部分的进展都来自于对特征有了更聪明的想法,并且学习到的算法往往归于事后的解释。

虽然上世纪90年代就有了一些神经网络加速器,但仅靠它们还不足以开发出有大量参数的深层多通道多层卷积神经网络。此外,当时的数据集仍然相对较小。除了这些障碍,训练神经网络的一些关键技巧仍然缺失,包括启发式参数初始化、随机梯度下降的巧妙变体、非挤压激活函数和有效的正则化技术。

因此,与训练*端到端*(从像素到分类结果)系统不同,经典机器学习的工作流看起来更像下面这样
因此,与训练*端到端*(从像素到分类结果)系统不同,经典机器学习的流水线看起来更像下面这样

1. 获取一个有趣的数据集。在早期,收集这些数据集需要昂贵的传感器(在当时最先进的图像也就100万像素)。
2. 根据光学、几何学、其他知识以及偶然的发现,手工对特征数据集进行预处理。
3. 通过标准的特征提取算法(如SIFT(尺度不变特征变换) :cite:`Lowe.2004` 、SURF(加速鲁棒特征) :cite:`Bay.Tuytelaars.Van-Gool.2006` 或其他手动调整的工作流来输入数据
3. 通过标准的特征提取算法(如SIFT(尺度不变特征变换) :cite:`Lowe.2004` 、SURF(加速鲁棒特征) :cite:`Bay.Tuytelaars.Van-Gool.2006` 或其他手动调整的流水线来输入数据
4. 将提取的特征放到最喜欢的分类器中(例如线性模型或其它核方法),以训练分类器。

如果你和机器学习研究人员交谈,你会发现他们相信机器学习既重要又美丽:优雅的理论去证明各种模型的性质。机器学习是一个正在蓬勃发展、严谨且非常有用的领域。然而,如果你和计算机视觉研究人员交谈,你会听到一个完全不同的故事。他们会告诉你图像识别的诡异事实————推动领域进步的是数据特征,而不是学习算法。计算机视觉研究人员相信,从对最终模型精度的影响来说,更大或更干净的数据集、或是稍微改进的特征提取,比任何学习算法带来的进步要大得多。
Expand Down
4 changes: 2 additions & 2 deletions chapter_convolutional-modern/batch-norm.md
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ $$\begin{aligned} \hat{\boldsymbol{\mu}}_\mathcal{B} &= \frac{1}{|\mathcal{B}|}
### 全连接层

通常,我们将批量归一化层置于全连接层中的仿射变换和激活函数之间。
设全连接层的输入为 u ,权重参数和偏差参数分别为 $\mathbf{W}$ 和 $\mathbf{b}$ ,激活函数为 $\phi$ ,批量归一化的运算符为 $\mathrm{BN}$ 。
设全连接层的输入为 u ,权重参数和偏置参数分别为 $\mathbf{W}$ 和 $\mathbf{b}$ ,激活函数为 $\phi$ ,批量归一化的运算符为 $\mathrm{BN}$ 。
那么,使用批量归一化的全连接层的输出的计算详情如下:

$$\mathbf{h} = \phi(\mathrm{BN}(\mathbf{W}\mathbf{x} + \mathbf{b}) ).$$
Expand Down Expand Up @@ -500,7 +500,7 @@ Ali Rahimi 在接受 2017 年 NeurIPS 大会的“接受时间考验奖”(Tes

## 练习

1. 在使用批量归一化之前,我们是否可以从全连接层或卷积层中删除偏差参数?为什么?
1. 在使用批量归一化之前,我们是否可以从全连接层或卷积层中删除偏置参数?为什么?
1. 比较LeNet在使用和不使用批量归一化情况下的学习率。
1. 绘制训练和测试准确度的提高。
1. 你的学习率有多高?
Expand Down
2 changes: 1 addition & 1 deletion chapter_convolutional-modern/index.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# 深度卷积神经网络
# 现代卷积神经网络
:label:`chap_modern_cnn`

上一章我们介绍了卷积神经网络的基本原理,本章我们将带你了解现代的卷积神经网络结构,许多现代卷积神经网络的研究都是建立在这一章的基础上的。
Expand Down
4 changes: 2 additions & 2 deletions chapter_convolutional-modern/resnet.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
## 函数类

首先,假设有一类特定的神经网络结构 $\mathcal{F}$,它包括学习速率和其他超参数设置。
对于所有 $f \in \mathcal{F}$,存在一些参数集(例如权重和偏差),这些参数可以通过在合适的数据集上进行训练而获得。
对于所有 $f \in \mathcal{F}$,存在一些参数集(例如权重和偏置),这些参数可以通过在合适的数据集上进行训练而获得。
现在假设 $f^*$ 是我们真正想要找到的函数,如果是 $f^* \in \mathcal{F}$,那我们可以轻而易举的训练得到它,但通常我们不会那么幸运。
相反,我们将尝试找到一个函数 $f^*_\mathcal{F}$,这是我们在 $\mathcal{F}$ 中的最佳选择。
例如,给定一个具有 $\mathbf{X}$ 特性和 $\mathbf{y}$ 标签的数据集,我们可以尝试通过解决以下优化问题来找到它:
Expand Down Expand Up @@ -43,7 +43,7 @@ $$f^*_\mathcal{F} := \mathop{\mathrm{argmin}}_f L(\mathbf{X}, \mathbf{y}, f) \te
让我们聚焦于神经网络局部:如图 :numref:`fig_residual_block` 所示,假设我们的原始输入为 $x$ ,而希望学出的理想映射为 $f(\mathbf{x})$ (作为 :numref:`fig_residual_block` 上方激活函数的输入)。
:numref:`fig_residual_block` 左图虚线框中的部分需要直接拟合出该映射 $f(\mathbf{x})$ ,而右图虚线框中的部分则需要拟合出残差映射 $f(\mathbf{x}) - \mathbf{x}$ 。
残差映射在现实中往往更容易优化。
以本节开头提到的恒等映射作为我们希望学出的理想映射 $f(\mathbf{x})$ ,我们只需将 :numref:`fig_residual_block` 中右图虚线框内上方的加权运算(如仿射)的权重和偏差参数设成 0,那么 $f(\mathbf{x})$ 即为恒等映射。
以本节开头提到的恒等映射作为我们希望学出的理想映射 $f(\mathbf{x})$ ,我们只需将 :numref:`fig_residual_block` 中右图虚线框内上方的加权运算(如仿射)的权重和偏置参数设成 0,那么 $f(\mathbf{x})$ 即为恒等映射。
实际中,当理想映射 $f(\mathbf{x})$ 极接近于恒等映射时,残差映射也易于捕捉恒等映射的细微波动。
:numref:`fig_residual_block` 右图是 ResNet 的基础结构-- *残差块*(residual block)。
在残差块中,输入可通过跨层数据线路更快地向前传播。
Expand Down
2 changes: 1 addition & 1 deletion chapter_convolutional-neural-networks/channels.md
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ $1 \times 1$ 卷积,即 $k_h = k_w = 1$,看起来似乎没有多大意义。
这里输入和输出具有相同的高度和宽度,输出中的每个元素都是从输入图像中同一位置的元素的线性组合。
我们可以将 $1\times 1$ 卷积层看作是在每个像素位置应用的全连接层,以 $c_i$ 个输入值转换为 $c_o$ 个输出值。
因为这仍然是一个卷积层,所以跨像素的权重是一致的。
同时,$1\times 1$ 卷积层需要的权重维度为 $c_o\times c_i$ ,再额外加上一个偏差
同时,$1\times 1$ 卷积层需要的权重维度为 $c_o\times c_i$ ,再额外加上一个偏置


![互相关计算使用了具有3个输入通道和2个输出通道的 $1\times 1$ 卷积核。其中,输入和输出具有相同的高度和宽度。](../img/conv-1x1.svg)
Expand Down
12 changes: 6 additions & 6 deletions chapter_convolutional-neural-networks/conv-layer.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
:label:`fig_correlation`

在二维互相关运算中,卷积窗口从输入张量的左上角开始,从左到右、从上到下滑动。
当卷积窗口滑动到新一个位置时,包含在该窗口中的部分张量与卷积核张量进行逐元素相乘,得到的张量再求和得到一个单一的标量值,由此我们得出了这一位置的输出张量值。
当卷积窗口滑动到新一个位置时,包含在该窗口中的部分张量与卷积核张量进行按元素相乘,得到的张量再求和得到一个单一的标量值,由此我们得出了这一位置的输出张量值。
在如上例子中,输出张量的四个元素由二维互相关运算得到,这个输出高度为 $2$ 、宽度为 $2$ ,如下所示:

$$
Expand Down Expand Up @@ -86,11 +86,11 @@ corr2d(X, K)

## 卷积层

卷积层对输入和卷积核权重进行互相关运算,并在添加标量偏差之后产生输出
所以,卷积层中的两个被训练的参数是卷积核权重和标量偏差
卷积层对输入和卷积核权重进行互相关运算,并在添加标量偏置之后产生输出
所以,卷积层中的两个被训练的参数是卷积核权重和标量偏置
就像我们之前随机初始化全连接层一样,在训练基于卷积层的模型时,我们也随机初始化卷积核权重

基于上面定义的 `corr2d` 函数实现二维卷积层。在 `__init__` 构造函数中,将 `weight``bias` 声明为两个模型参数。前向传播函数调用 `corr2d` 函数并添加偏差
基于上面定义的 `corr2d` 函数实现二维卷积层。在 `__init__` 构造函数中,将 `weight``bias` 声明为两个模型参数。前向传播函数调用 `corr2d` 函数并添加偏置

```{.python .input}
class Conv2D(nn.Block):
Expand Down Expand Up @@ -185,7 +185,7 @@ corr2d(d2l.transpose(X), K)
如果我们只需寻找黑白边缘,那么以上 `[1, -1]` 的边缘检测器足以。然而,当有了更复杂数值的卷积核,或者连续的卷积层时,我们不可能手动设计过滤器。那么我们是否可以学习由 `X` 生成 `Y` 的卷积核呢?

现在让我们看看是否可以通过仅查看“输入-输出”对来了解由 `X` 生成 `Y` 的卷积核。
我们先构造一个卷积层,并将其卷积核初始化为随机张量。接下来,在每次迭代中,我们比较 `Y` 与卷积层输出的平方误差,然后计算梯度来更新卷积核。为了简单起见,我们在此使用内置的二维卷积层,并忽略偏差
我们先构造一个卷积层,并将其卷积核初始化为随机张量。接下来,在每次迭代中,我们比较 `Y` 与卷积层输出的平方误差,然后计算梯度来更新卷积核。为了简单起见,我们在此使用内置的二维卷积层,并忽略偏置

```{.python .input}
# 构造一个二维卷积层,它具有1个输出通道和形状为(1,2)的卷积核
Expand Down Expand Up @@ -305,7 +305,7 @@ d2l.reshape(conv2d.get_weights()[0], (1, 2))

## 小结

* 二维卷积层的核心计算是二维互相关运算。最简单的形式是,对二维输入数据和卷积核执行互相关操作,然后添加一个偏差
* 二维卷积层的核心计算是二维互相关运算。最简单的形式是,对二维输入数据和卷积核执行互相关操作,然后添加一个偏置
* 我们可以设计一个卷积核来检测图像的边缘。
* 我们可以从数据中学习卷积核的参数。
* 学习卷积核时,无论用严格卷积运算或互相关运算,卷积层的输出不会受太大影响。
Expand Down
2 changes: 1 addition & 1 deletion chapter_convolutional-neural-networks/why-conv.md
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ $$[\mathbf{H}]_{i, j} = u + \sum_{a = -\Delta}^{\Delta} \sum_{b = -\Delta}^{\Del
简而言之, :eqref:`eq_conv-layer` 是一个卷积层,而卷积神经网络是包含卷积层的一类特殊的神经网络。
在深度学习研究社区中, $\mathbf{V}$ 被称为 *卷积核* (convolution kernel) 或者 *滤波器* (filter),是可学习的权重。
当图像处理的局部区域很小时,卷积神经网络与多层感知机的训练差异可能是巨大的:以前,多层感知机可能需要数十亿个参数来表示,而现在卷积神经网络通常只需要几百个参数,而且不需要改变输入或隐藏表示的维数。
以上所有的权重学习都依赖于归纳偏差,当这种偏差与实际情况相符时,我们就可以得到有效的模型,这些模型能很好地推广到不可见的数据中。
以上所有的权重学习都依赖于归纳偏置,当这种偏置与实际情况相符时,我们就可以得到有效的模型,这些模型能很好地推广到不可见的数据中。
但如果这些假设与实际情况不符,比如当图像不满足平移不变时,我们的模型可能难以拟合。


Expand Down
2 changes: 1 addition & 1 deletion chapter_deep-learning-computation/custom-layer.md
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ tf.reduce_mean(Y)

既然我们知道了如何定义简单的层,那么让我们继续定义具有参数的层,这些参数可以通过训练进行调整。我们可以使用内置函数来创建参数,这些参数提供一些基本的管理功能。比如管理访问、初始化、共享、保存和加载模型参数。这样做的好处之一是,我们不需要为每个自定义层编写自定义序列化程序。

现在,让我们实现自定义版本的全连接层。回想一下,该层需要两个参数,一个用于表示权重,另一个用于表示偏差项。在此实现中,我们使用ReLU作为激活函数。该层需要输入参数:`in_units``units`,分别表示输入和输出的数量。
现在,让我们实现自定义版本的全连接层。回想一下,该层需要两个参数,一个用于表示权重,另一个用于表示偏置项。在此实现中,我们使用ReLU作为激活函数。该层需要输入参数:`in_units``units`,分别表示输入和输出的数量。

```{.python .input}
class MyDense(nn.Block):
Expand Down
8 changes: 4 additions & 4 deletions chapter_deep-learning-computation/parameters.md
Original file line number Diff line number Diff line change
Expand Up @@ -66,11 +66,11 @@ print(net[2].state_dict())
print(net.layers[2].weights)
```

输出的结果告诉我们一些重要的事情。首先,这个全连接层包含两个参数,分别是该层的权重和偏差。两者都存储为单精度浮点数(float32)。注意,参数名称允许我们唯一地标识每个参数,即使在包含数百个层的网络中也是如此。
输出的结果告诉我们一些重要的事情。首先,这个全连接层包含两个参数,分别是该层的权重和偏置。两者都存储为单精度浮点数(float32)。注意,参数名称允许我们唯一地标识每个参数,即使在包含数百个层的网络中也是如此。

### 目标参数

注意,每个参数都表示为参数(parameter)类的一个实例。要对参数执行任何操作,首先我们需要访问底层的数值。有几种方法可以做到这一点。有些比较简单,而另一些则比较通用。下面的代码从第二个神经网络层提取偏差,提取后返回的是一个参数类实例,并进一步访问该参数的值。
注意,每个参数都表示为参数(parameter)类的一个实例。要对参数执行任何操作,首先我们需要访问底层的数值。有几种方法可以做到这一点。有些比较简单,而另一些则比较通用。下面的代码从第二个神经网络层提取偏置,提取后返回的是一个参数类实例,并进一步访问该参数的值。

```{.python .input}
print(type(net[1].bias))
Expand Down Expand Up @@ -224,7 +224,7 @@ print(rgnet)
print(rgnet.summary())
```

因为层是分层嵌套的,所以我们也可以像通过嵌套列表索引一样访问它们。例如,我们下面访问第一个主要的块,其中第二个子块的第一层的偏差项
因为层是分层嵌套的,所以我们也可以像通过嵌套列表索引一样访问它们。例如,我们下面访问第一个主要的块,其中第二个子块的第一层的偏置项

```{.python .input}
rgnet[0][1][0].bias.data()
Expand All @@ -249,7 +249,7 @@ rgnet.layers[0].layers[1].layers[1].weights[1]
:end_tab:

:begin_tab:`pytorch`
默认情况下,PyTorch会根据一个范围均匀地初始化权重和偏差矩阵,这个范围是根据输入和输出维度计算出的。PyTorch的`nn.init`模块提供了多种预置初始化方法。
默认情况下,PyTorch会根据一个范围均匀地初始化权重和偏置矩阵,这个范围是根据输入和输出维度计算出的。PyTorch的`nn.init`模块提供了多种预置初始化方法。
:end_tab:

:begin_tab:`tensorflow`
Expand Down
2 changes: 1 addition & 1 deletion chapter_linear-networks/image-classification-dataset.md
Original file line number Diff line number Diff line change
Expand Up @@ -277,7 +277,7 @@ for X, y in train_iter:

## 练习

1. 将减少 `batch_size`(如减少到 1)是否会影响读取性能?
1. 减少 `batch_size`(如减少到 1)是否会影响读取性能?
1. 数据迭代器的性能非常重要。你认为当前的实现足够快吗?探索各种选择来改进它。
1. 查阅框架的在线API文档。还有哪些其他数据集可用?

Expand Down
Loading

0 comments on commit 26fd28c

Please sign in to comment.