7.7.1. 从ResNet到DenseNet¶
回想一下任意函数的泰勒展开式(Taylor
expansion),它把这个函数分解成越来越高阶的项。在\(x\)接近0时,
(7.7.1)¶\[f(x) = f(0) + f'(0) x + \frac{f''(0)}{2!} x^2 + \frac{f'''(0)}{3!} x^3 + \ldots.\]
同样,ResNet将函数展开为
(7.7.2)¶\[f(\mathbf{x}) = \mathbf{x} + g(\mathbf{x}).\]
也就是说,ResNet将\(f\)分解为两部分:一个简单的线性项和一个复杂的非线性项。
那么再向前拓展一步,如果我们想将\(f\)拓展成超过两部分的信息呢?
一种方案便是DenseNet。
图7.7.1 ResNet(左)与
DenseNet(右)在跨层连接上的主要区别:使用相加和使用连结。¶
如
图7.7.1所示,ResNet和DenseNet的关键区别在于,DenseNet输出是连接(用图中的\([,]\)表示)而不是如ResNet的简单相加。
因此,在应用越来越复杂的函数序列后,我们执行从\(\mathbf{x}\)到其展开式的映射:
(7.7.3)¶\[\mathbf{x} \to \left[
\mathbf{x},
f_1(\mathbf{x}),
f_2([\mathbf{x}, f_1(\mathbf{x})]), f_3([\mathbf{x}, f_1(\mathbf{x}), f_2([\mathbf{x}, f_1(\mathbf{x})])]), \ldots\right].\]
最后,将这些展开式结合到多层感知机中,再次减少特征的数量。
实现起来非常简单:我们不需要添加术语,而是将它们连接起来。
DenseNet这个名字由变量之间的“稠密连接”而得来,最后一层与之前的所有层紧密相连。
稠密连接如 图7.7.2所示。
图7.7.2 稠密连接。¶
稠密网络主要由2部分构成:稠密块(dense
block)和过渡层(transition layer)。
前者定义如何连接输入和输出,而后者则控制通道数量,使其不会太复杂。