我也一直在努力解决这种困惑,似乎每次我都需要重温《盗梦空间》论文。
比较的正确设置是考虑一个 5x5 形状的玩具示例输入图像。要生成具有 5x5 卷积的 5x5 输出图像,您需要在原始图像的顶部、底部和侧面使用 2 个额外的填充像素来填充原始图像,然后继续进行通常的 5x5 卷积。卷积滤波器有25个权重参数,输出的每个像素都需要输入25项的加权和。
现在,我们将执行两个阶段,而不是 5x5 过滤器。首先,我们将在原始图像的顶部、底部和侧面额外填充 1 个像素,以使其在每个点都符合标准的 3x3 卷积。
这会生成一个中间图像,由于填充,形状与输入相同,但其中每个像素是 3x3 卷积的结果(因此每个像素控制 9 个项目的加权和)。
现在我们将从第一个 3x3 卷积的中间图像开始,对最后阶段的 3x3 卷积再次重复此操作。同样,我们在顶部、底部和侧面填充 1 个像素,输出的每一项都是通过输入的 9 项的加权和来实现的。
您在问题中提供的图表演示了这如何允许聚合 5x5 卷积的相同空间信息跨度,但只是通过两个 3x3 卷积的一组不同的两个加权和来计算。需要明确的是,计算是不一样的,因为两个 9-d 系数滤波器不必学习与 25-d 系数滤波器相同。它们可能具有不同的权重,但它们可以按顺序跨越与 5x5 卷积相同的原始图像距离。
最后,我们可以看到,在 5x5 的情况下,每个输出单元需要 25 个乘加运算。在顺序 3x3 情况下,最终输出的每个单元需要先进行 9 次乘加以构成第一个 3x3 卷积的单元,然后再进行 9 次乘加以构成最终输出的单元。
关于“激活共享”的具体注释是指您只计算一次中间3x3卷积的值。您为每个单元花费 9 个操作,但是一旦创建它们,您只需再花费 9 个操作即可到达最终输出单元。您不会为最终输出的每个单元一遍又一遍地重复创建第一个 3x3 卷积的工作。
这就是为什么它不计为每个输出单元需要 81 次操作。当你碰到 final 3x3 卷积输出的下一个 (i, j) 位置时,你正在重新使用 intermediate 3x3 卷积的一堆像素,所以你'每次只多做 9 次操作才能得到最终输出。
5x5 输入的 5x5 填充卷积的操作数为 25 * 25。
第一个 3x3 填充卷积的操作数为 25 * 9,从那里添加另一个填充 3x3 卷积的成本,因此总体上变为 25 * 9 + 25 * 9 = 25 * 18。
这就是他们得到 (25 * 25) / (25 * 18) = 25/18 的比率的方式。
事实上,这也是参数总数的减少。
我认为关键是原始图表(来自论文和您的问题)做得非常糟糕,表明您将首先支付标准的 3x3 卷积成本来创建整个原始 5x5 的中间像素集输入,包括填充。 然后您将在该中间结果上运行第二个 3x3 卷积(这就是他们所说的重用激活)。
图片使它看起来像是单独的,对于每个最终输出像素,您将围绕整个 3x3 中间层的所有正确点滑动原始 3x3 卷积,每次计算 9-ops 加权和(总共 81 个 ops) , 然后计算最终的 9-ops 加权和以获得单个像素的输出。然后回到原来的位置,将卷积颠倒 1 个点,然后重复。但这是不正确的,不会“重用”中间卷积层,而是会为最终输出层的每个单元单独重新计算。
不过,总的来说,我同意这是非常重要且难以思考的。这篇论文确实掩盖了它,并假设读者已经想到了很多上下文。