在 Kaiming He 在幻灯片 40 上的resnet 演示中,他说:“时间复杂度低于 VGG-16/19。” 当 resnet 更深时,为什么会出现这种情况?
为什么resnet比vgg快
更新以解决@mrgloom 的评论
在我最初的回答中,我说 VGG-16 有大约 1.38 亿个参数,而 ResNet 有 2550 万个参数,因此它更快,这是不正确的。参数数量减少了存储网络所需的空间量,但这并不意味着它更快。Resnet 比 VGG 快,但原因不同。
此外,正如@mrgloom 指出的那样,计算速度可能在很大程度上取决于实现。下面我将讨论简单的计算案例。此外,我将避免计算激活函数和池化层的 FLOP,因为它们的成本相对较低。
首先,卷积的速度将取决于输入的大小。假设您有灰色(1 通道)100x100 图像,并且您应用了一个 3x3 卷积滤波器,其步幅为 1,填充为 0。此操作将需要您 ~163k FLOPs。这很容易计算。如果你知道卷积是如何工作的,你应该知道从 100x100 图像中你会得到 98x98(使用上述设置)。为了从 98x98 输出图像中计算每个值,您需要进行 9 次乘法和 8 次加法,总共对应于每个值 17 次操作。如果你把所有的东西结合起来,你会得到 98 * 98 * 17,它等于 163,268。现在,假设您在更大的图像上应用相同的滤镜,比如 200x200。图像的面积大了 4 倍,因此您将获得大约 4 倍的 FLOP。
现在,我将从 VGG19 和 Resnet 34 之间的比较开始,因为这是他们在原始论文中使用的图像。
在图 3 中,他们将架构分解为一组用不同颜色标记的块。最后,每个块将高度和宽度减少两倍。在前两层中,Resnet 设法将图像的高度和宽度降低了 4 倍。
从 VGG19 可以看出,前两层在完整的 224x224 图像之上应用卷积,这非常昂贵。如果您应用与我在上面所做的类似计算,您会发现第一层执行 ~170M FLOPs,但它从 3x224x224 图像产生 64x224x224 输出。由于 layer 应用了相同的 conv 过滤器,您应该看到 FLOP 的数量应该接近 170M * (64 / 3)。事实上,它几乎是 3.7B FLOPs。仅这一层就具有与整个 Resnet-34 一样多的 FLOP。为了避免 Resnet 中的这个计算问题,他们在第一层解决了这个问题。它将行和列的数量减少了 2 倍,并且它仅使用 240M FLOP,并且下一个最大池操作应用了另一个 2 倍的减少。
相比之下,VGG19 中的这四个卷积层产生了大约 10B 的 FLOP。
接下来,Resnet 中的卷积过滤器会慢慢建立起来。您可以看到,与 VGG 相比,它们使用的内核更少,但它们中的更多内核在卷积运算和非线性激活函数之间交替堆叠。这是@mrgloom 指出的另一件事。他们利用了使用更薄但更深的网络的想法。
接下来的 Resnet 层遵循相同的策略,试图使其更薄更深。
此外,从论文的表 1 中,您可以注意到 Renet 50、Resnet 101 和 Resnet 152 的卷积块看起来有些不同。这就是它在视觉上的样子。
使用它是为了进一步减少操作数量,同时在卷积层中使用具有更多过滤器的网络。1x1 卷积层的想法允许在应用 3x3 卷积之前减少通道深度,然后将其放大回来。