为什么卷积神经网络中的卷积滤波器是翻转的?

Why is the convolutional filter flipped in convolutional neural networks?

我不明白为什么在使用卷积神经网络时需要翻转过滤器。

根据烤宽面条文档,

flip_filters : bool (default: True)

Whether to flip the filters before sliding them over the input, performing a convolution (this is the default), or not to flip them and perform a correlation. Note that for some other convolutional layers in Lasagne, flipping incurs an overhead and is disabled by default – check the documentation when using learned weights from another layer.

这是什么意思?我从来没有在任何神经网络书籍中读过关于卷积时翻转过滤器的内容。有人可以澄清一下吗?

转置卷积滤波器的根本原因是卷积运算的定义 - 这是信号处理的结果。执行卷积时,您希望内核相对于执行卷积的轴翻转,因为如果不这样做,您最终会计算信号与其自身的相关性。如果您考虑将一维卷积应用于相关函数变化非常剧烈的时间序列,那么理解起来会容易一些——您不希望卷积因信号而偏斜或与之相关。

来自数字信号处理堆栈交换站点的

This answer 给出了一个很好的解释,它通过数学解释了为什么将卷积滤波器定义为沿信号的相反方向。

This page 介绍完成翻转的详细示例。这是一种用于边缘检测的特殊类型的滤波器,称为 Sobel 滤波器。它没有解释为什么要完成翻转,但是很好,因为它为您提供了一个二维的示例。

我提到在 1D 情况下(来自 DSP SE 站点的答案)更容易理解 为什么(如,为什么卷积是这样定义的)真是一个很好的解释);但是这个约定也适用于 2D 和 3D(Conv2DDNN 和 Conv3DDNN 层都有 flip_filter 选项)。然而,归根结底,因为卷积滤波器权重不是人类程序,而是网络"learned",它完全是任意的——除非你从另一个网络加载权重,在这种情况下你必须与该网络中的卷积定义一致。如果正确定义了卷积(即,根据惯例),过滤器将被翻转。如果它定义不正确(在更多 "naive" 和 "lazy" 方式中),它不会。

卷积所涉及的更广泛领域是 "linear systems theory",因此搜索该术语可能会发现更多关于此的内容,尽管在神经网络的上下文之外。

请注意 convolution/correlation 的区别在千层面中 corrmm.py class 的文档字符串中也提到了:

flip_filters : bool (default: False) Whether to flip the filters and perform a convolution, or not to flip them and perform a correlation. Flipping adds a bit of overhead, so it is disabled by default. In most cases this does not make a difference anyway because the filters are learnt. However, flip_filters should be set to True if weights are loaded into it that were learnt using a regular :class:lasagne.layers.Conv2DLayer, for example.

首先,由于 CNN 是从头开始训练的,而不是人为设计的,如果需要进行翻转操作,则学习的过滤器将是翻转后的过滤器,并且 实现了与翻转滤波器的互相关。 其次,翻转在一维时间序列处理中是必要的,因为过去的输入会影响给定“当前”输入的当前系统输出。但是在2D/3D图像空间卷积中,没有“时间”的概念,也就没有“过去”的输入及其对“现在”的影响,因此,我们不需要考虑“信号”和“系统”的关系,并且只有“信号”(图像块)和“信号”(图像块)的关系,这意味着我们只需要互相关而不是卷积(尽管DL从信号处理中借用了这个概念)。 因此,实际上不需要翻转操作。 (我猜。)

I never read about flipping filters when convolving in any neural network book.

您可以尝试一个简单的实验。以最中心像素为值 1 的图像和值为 0 的所有其他像素。现在使用任何小于图像的过滤器(假设一个 3 x 3 过滤器,值为 1-9)。现在做一个简单的相关而不是卷积。您最终得到翻转过滤器作为操作后的输出。

现在自己翻转过滤器,然后做同样的操作。你显然最终得到了原始过滤器作为输出。

第二个操作似乎更整洁。这就像乘以 1 和 returning 相同的值。但是第一个不一定是错的。它在大多数情况下都有效,即使它可能没有很好的数学特性。毕竟,程序为什么要关心操作是否关联。它只是完成它被告知要做的工作。此外,滤波器可以是对称的。翻转它 return 相同的滤波器,因此相关运算和卷积运算 return 相同的输出。

在某些情况下,这些数学特性有帮助吗?当然,他们有!如果 (ab)c 不等于 a(bc),那么我将无法组合 2 个滤镜,然后将结果应用到图像上。为了澄清,假设我有 2 个过滤器 a、b 和一个图像 c。我必须首先在图像 'c' 上应用 'b',然后在上述结果上应用 'a',以防相关。在卷积的情况下,我可以先做 'a b',然后将结果应用到图像上 'c'。如果我有一百万张图片要处理,由于合并过滤器 'a' 和 'b' 而获得的效率开始变得明显。

卷积满足的每一个数学 属性 都会带来一定的好处,因此如果我们有选择(我们当然有),我们应该更喜欢卷积而不是相关性。它们之间的唯一区别是 - 在卷积中我们在进行乘法运算之前翻转滤波器,而在相关中 - 我们直接进行乘法运算。

应用卷积满足了我们所有人内心的数学家,也给了我们一些实实在在的好处。

虽然现在图像中的特征工程完全由 Mrs DL 自己完成 end-to-end,我们甚至不需要为此操心,但还有其他传统图像操作可能需要此类操作。