diff --git a/chapter_convolutional-neural-networks/googlenet.md b/chapter_convolutional-neural-networks/googlenet.md index db4cdc36cb077a8c806061b3b87b965008f71178..14e3c36ef4259ee2bac747fe50cd0976ecc863cf 100644 --- a/chapter_convolutional-neural-networks/googlenet.md +++ b/chapter_convolutional-neural-networks/googlenet.md @@ -99,7 +99,7 @@ net = nn.Sequential() net.add(b1, b2, b3, b4, b5, nn.Dense(10)) ``` -GoogLeNet模型的计算复杂,而且不如VGG那样便于修改通道数。本节里我们将输入高宽从224降到96来加速计算。下面演示各个块之间的输出的形状变化。 +GoogLeNet模型的计算复杂,而且不如VGG那样便于修改通道数。本节里我们将输入高宽从224降到96来简化计算。下面演示各个块之间的输出的形状变化。 ```{.python .input n=7} X = nd.random.uniform(shape=(1, 1, 96, 96)) diff --git a/chapter_convolutional-neural-networks/resnet.md b/chapter_convolutional-neural-networks/resnet.md index 02cf26ee5404b3d8b22e6b438b2eef7af6b8809f..78f069393c46707a2a8ba84a48327cfc61bbf6ed 100644 --- a/chapter_convolutional-neural-networks/resnet.md +++ b/chapter_convolutional-neural-networks/resnet.md @@ -1,13 +1,13 @@ # 残差网络(ResNet) -上一小节介绍的批量归一化层对网络中间层的输出做归一化,使得训练时数值更加稳定和收敛更容易。但对于深层网络来说,还有一个问题困扰着训练:在进行梯度反传计算时,我们从误差函数(顶部)开始,朝着输入数据方向(底部)逐层计算梯度。当我们将层串联在一起时,根据链式法则每层的梯度会被乘在一起,这样便导致梯度数值以指数衰减。最后,在靠近底部的层只得到很小的梯度,对应的权重更新量也变小,使得他们的收敛缓慢。 +上一节介绍的批量归一化层对网络各层的中间输出做标准化,从而使训练时数值更加稳定。但对于深度模型来说,还有一个问题困扰着模型的训练。回忆[“正向传播、反向传播和计算图”](../chapter_deep-learning-basics/backprop.md)一节。在反向传播时,我们从输出层开始,朝着输入层方向逐层计算权重参数和中间变量的梯度。当我们将这些层串联在一起时,靠近输入层的权重梯度是该层与输出层之间每层中间变量梯度的乘积。假设这些梯度的绝对值小于1,靠近输入层的权重参数只得到很小的梯度,因此这些参数也很难被更新。 -ResNet成功地通过增加跨层的数据线路来允许梯度快速地到达底部层,从而避免这一情况 [1]。这一节我们将介绍ResNet的工作原理。 +针对上述问题,ResNet增加了跨层的数据线路,从而允许中间变量的梯度快速向输入层传递,并更容易更新靠近输入层的模型参数 [1]。这一节我们将介绍ResNet的工作原理。 ## 残差块 -ResNet的基础块叫做残差块 (Residual Block) 。如图5.9所示,它将层A的输出在输入给层B的同时跨过B,并和B的输出相加作为下面层的输入。它可以看成是两个网络相加,一个网络只有层A,一个则有层A和B。这里层A在两个网络之间共享参数。在求梯度的时候,来自层B上层的梯度既可以通过层B也可以直接到达层A,从而让层A更容易获取足够大的梯度来进行模型更新。 +ResNet的基础块叫做残差块 (residual block) 。如图5.9所示,它将层A的输出在输入给层B的同时跨过B,并和B的输出相加作为下面层的输入。它可以看成是两个网络相加,一个网络只有层A,一个则有层A和B。这里层A在两个网络之间共享参数。在求梯度的时候,来自层B上层的梯度既可以通过层B也可以直接到达层A,从而让层A更容易获取足够大的梯度来进行模型更新。 ![残差块(左)和它的分解(右)。](../img/resnet.svg)