了解卷积层的工作原理

数据挖掘 美国有线电视新闻网 训练 卷积 反向传播
2021-10-01 10:16:03

在使用 Keras 和 Mnist 数据集处理众所周知的手写数字识别问题后,我提出了一些关于卷积层如何工作的问题。我可以理解卷积过程是什么。

卷积

我的第一个问题是:过滤器是什么?我能理解他们的目的。它们用于在图像上映射边缘、形状等。但是它们是如何被初始化的呢?它们是否具有随机初始值或是否有正在使用的标准图像过滤器?如果它们使用随机值进行初始化,那么这些值应该在网络的训练过程中发生变化。如果是这种情况,那么就会产生一个新问题,有人如何反向传播卷积层的过滤器?这个过程背后的算法是什么?

其次,我注意到我可以在 Keras 的卷积层中添加一个激活函数。输出的整个矩阵是否通过激活函数?激活函数的使用如何改变卷积层的学习过程?

最后但同样重要的是,卷积层是否像密集层一样具有权重和偏差?我们是否将卷积过程后的输出矩阵与权重矩阵相乘,并在通过激活函数之前添加一些偏差?如果这是真的,那么我们是否遵循与密集层相同的过程来训练这些权重和偏差?

4个回答

过滤器是什么?

过滤器/内核是一组使用反向传播算法学习的可学习权重。您可以将每个过滤器视为存储单个模板/模式。当您将此过滤器与相应的输入进行卷积时,您基本上是在尝试找出存储的模板与输入中不同位置之间的相似性。

但是它们是如何被初始化的呢?它们是否具有随机初始值或是否有正在使用的标准图像过滤器?

过滤器通常以看似任意的值初始化,然后您将使用梯度下降优化器来优化这些值,以便过滤器解决您的问题。

有许多不同的初始化策略。

  • 来自分布的样本,例如正态分布或均匀分布
  • 将所有值设置为 1 或 0 或其他常量
  • 还有一些启发式方法在实践中似乎效果很好,一种流行的方法是以 Xavier Glorot 命名的所谓的 glorot 初始化器,他在这里介绍了它们。Glorot 初始化器也从分布中采样,但会根据内核复杂度截断值。
  • 对于特定类型的内核,还有其他默认值似乎表现良好。例如见这篇文章

如果它们使用随机值进行初始化,那么这些值应该在网络的训练过程中发生变化。如果是这种情况,那么就会产生一个新问题,有人如何反向传播卷积层的过滤器?这个过程背后的算法是什么?

将卷积操作视为输入图像和随机权重矩阵之间的函数。当您优化模型的损失函数时,权重(和偏差)会更新,以便它们开始形成极好的区分空间特征。这就是反向传播的目的,它是使用您在模型架构中定义的优化器执行的。从数学上讲,还有一些概念涉及反向传播如何在卷积操作中发生(具有 180 次旋转的全卷积)。如果您有兴趣,请查看此链接

输出的整个矩阵是否通过激活函数?激活函数的使用如何改变卷积层的学习过程?

让我们将激活函数视为非线性“缩放”函数。给定一个输入,激活函数的工作是将数据“压缩”到给定的范围内(例如 -> Relu 将输入“压缩”到一个范围(0,inf)中,只需将每个负值设置为零,然后返回每个正值都原样)

现在,在神经网络中,激活应用在对输入特征、权重矩阵和偏差 (mx+c) 应用线性函数的节点上。因此,在 CNN 的情况下,也是如此。一旦您的前向传递获取输入图像,通过应用过滤器(权重矩阵)对其进行卷积函数,添加偏差,然后将输出发送到激活函数以在将其带到之前对其进行非线性“挤压”下一层。

很容易理解为什么激活会有所帮助。如果我有一个吐出的节点,x1 = m0*x0+b0然后将其发送到另一个吐出的节点x2 = m1*x1+b1,则整体正向传递与orx2 = m1*(m0*x0+b0)+b1相同这表明仅堆叠 2 个线性方程会给出另一个线性方程,因此实际上不需要 2 个节点,相反我可以只使用 1 个节点并使用新的 M 和 B 值从 x0 获得相同的结果 x2。x2 = (m1*m0*x0) + (m1*b0+b1)x2 = M*x0 + B

这就是添加激活函数有帮助的地方。添加激活函数允许您堆叠神经网络层,以便您可以正确探索非线性模型空间,否则您将只能被y=mx+c模型空间探索,因为线性函数的所有线性组合本身就是线性模型。

卷积层是否像密集层一样具有权重和偏差?

是的,它确实。在使用卷积运算将权重矩阵(滤波器)应用于输入图像之后添加它conv(inp, filter)

我们是否将卷积过程后的输出矩阵与权重矩阵相乘,并在通过激活函数之前添加一些偏差?

在输入图像的一部分和滤波器之间进行点积运算,同时对较大的输入图像进行卷积。然后将输出矩阵与偏差(广播)相加,并通过激活函数传递给“挤压”。

如果这是真的,那么我们是否遵循与密集层相同的过程来训练这些权重和偏差?

是的,我们在前向传递中遵循完全相同的过程,只是在整个混合中添加了一个新操作,即卷积。它改变了动态,特别是向后传球,但本质上,整体直觉保持不变。


直觉的关键是——

  • 不要混淆特征和过滤器。过滤器可帮助您使用点、卷积、偏差和激活等操作从输入图像中提取特征(基本模式)
  • 每个过滤器都允许您提取图像上存在的一些简单图案(例如边缘)的 2D 地图。如果您有 20 个过滤器,那么您将获得 3 通道图像的 20 个特征图,这些特征图在输出中作为通道堆叠。
  • 许多捕获不同简单模式的此类特征作为训练过程的一部分被学习,并成为下一层(可能是另一个 CNN 或密集)的基本特征
  • 这些功能的组合允许您执行建模任务。
  • 通过使用反向传播优化以最小化损失函数来训练过滤器。它遵循反向推理:
      - How can I minimize my loss?
      - How can I find the best features that minimize the loss?
      - How can I find the best filters that generate the best features? 
      - What are the best weights and biases which give me the best filters?

这是一个很好的参考图像,在使用 CNN 时要牢​​记(只是为了加强直觉)

在此处输入图像描述

希望能回答你的问题。

CNN 的学习方式与密集神经网络的学习方式相同,即 Forwardpass 和 Backpropagation
我们在这里学到的是过滤器的权重

因此,回答您的个人问题 -

  • 但是它们是如何被初始化的呢?-标准初始化。例如 glorot_uniform
  • 那么值应该在网络的训练过程中改变是的
  • 有人如何反向传播卷积层的过滤器?这个过程背后的算法是什么?-就像使用 GradientDescent 的 ANN 反向传播
  • 我可以在 Keras 的卷积层中添加一个激活函数。输出的整个矩阵是否通过激活函数?-是的,我们大部分时间都保留 ReLU
  • 激活函数的使用如何改变卷积层的学习过程?-这与我们在 ANN 中使用它的原因相同,即非线性
  • 卷积层是否像密集层一样具有权重和偏差?-是的
  • 如果这是真的,那么我们是否遵循与密集层相同的过程来训练这些权重和偏差? 是的,只是添加了共享权重/过滤器/卷积和池化的概念


我将尝试解释CNN的一些关键点以澄清上述答案-

  • 每个过滤器在 nD 体积上进行卷积,例如 RGB 的 3-D
  • 因此,它对像素进行逐元素乘法,输出相加并通过激活函数
  • 这成为一个特征图的单个元素
  • 每个过滤器创建一个特征图。
  • 过滤器深度将等于特征图的数量,例如,如果您对第一张 RGB 图像使用了 20 个过滤器。它将创建 20 个特征图,如果您在该层上使用 5x5 过滤器,则过滤器大小 = 5x5x20
  • 每个过滤器将添加参数 = 其大小,例如最后一个示例为 25
  • 如果你想像一个简单的神经网络一样可视化。见下图所有 theta 都相乘、相加并通过激活函数。反向传播的发生方式与密集神经网络相同

在此处输入图像描述
图片来源 - 杰里米乔丹


您可以阅读这些参考资料来培养黑白直觉。
CS231n:2016 年冬季
Jeremy Jordan 博客
Numpy 实施

在某些方面,卷积不会引入与标准架构的根本背离。因为应用于过滤输入(最大值、最小值、平均值等)的操作是连续的,所以这些过滤器相当于网络的有损“层”。你直觉过滤器参数可以被训练是正确的——所以一个过滤器可以根据 [0,1,2,0] 变换一个 2x2 正方形,然后在一个训练周期内产生最大值,它可以根据 [.1, 变换。 9,1.7,0] 并在下一个产生最大值。这种训练可以使用 SGD 来完成。您可以将转换矩阵视为等效地表示为一组权重和偏差以及一个函数——尽管它可能不会在每个包中都被实例化(我没有使用过 keras)。

然而,据我所知,过滤器函数在训练期间不会发生变化——“max”层不会变成“mean”层。想想为什么会这样。

关于激活函数——它们只是给结果引入了更多的非线性。此外,如果它们是单调的(通常是这种情况),那么它们应该能够与许多常见的过滤器操作进行通勤——比如 max、min、mean 等。所以层输出可能看起来像 Max(Relu(Filter (Input))) 或 Relu(Max(Filter(Input))),前一种情况可能有点特殊。

我的第一个问题是:过滤器是什么?

深度学习中的约定是将卷积中使用的权重称为过滤器或同义词内核。其他领域对这两个术语进行了区分——在我的书中,权重数组是内核,而与这些权重执行卷积的操作是过滤器。即,过滤器是一个函数,它接受一些输入(例如图像)并为您提供经过过滤的图像。理解我们在谈论卷积过滤器,训练内核就相当于训练过滤器,因为过滤器完全由内核中的权重定义。

(从数学上讲,卷积滤波器是一类具有紧凑支持的线性时不变滤波器。)

但是它们是如何被初始化的呢?

有很多方法,请参阅其他答案。

有人如何反向传播卷积层的过滤器

这就是理解区分过滤器和内核的地方。您实际上正在做的是将两个参数传递给卷积操作:kernelinput

f(k,x)=kx
过滤器是 f 部分应用于内核:
fk=xf(k,x)
你最终感兴趣的;训练后内核将被固定,因此过滤器只是x. 但是你不能真正反向传播过滤器(至少在通用框架中),因为它是一个函数。你反向传播的是kernel,它的工作方式与你反向传播任何其他参数的方式相同:你评估f 连同它的衍生物(两个论点!)对于一个特定的 x 在前向传播中,然后在后向传播中发送一个对偶向量,告诉你两者的梯度贡献 xk. 那个在x 您进一步回传到前一层,即 k 您用于学习更新。

其次,我注意到我可以在 Keras 的卷积层中添加一个激活函数

是的,但是激活并不是卷积操作的一部分。最好将其理解为一个单独的层,但因为它没有任何参数,而且 CNN 通常在每个卷积之后都包含一个 Relu,Keras 对此有一个捷径。

g(k,x)=Relu(fk(x))
gk=(xRelu(fk(x)))=Relufk
为了反向传播,您首先将反向传递拉过激活的导数,然后再进行卷积。

最后但同样重要的是,卷积层是否像密集层一样具有权重和偏差?

是的,权重在内核中,通常您也会添加偏差,其工作方式与完全连接的架构完全相同。

在卷积架构中很重要且通常没有得到很好解释的一件事是,一个这样的层实际上不仅仅是一个卷积滤波器,而是一整套这样的滤波器,每个滤波器都有自己的内核。因此,对于每个输入,您都会获得一整套输出,称为通道

fi(k,x)=f(ki,x)
然后,您将所有这些传递到下一层,即这些层还需要接受多个通道——这再次通过具有多个内核来处理,即您有一个完整的内核矩阵看待这一点的数学方法是信号流在空间中不包含向量I 图像,但在张量积空间中 RmI, 在哪里 m是通道数。而在“通道空间”上,你实际上是完全连接的。(当人们谈论1×1 卷积层,这意味着它们实际上根本没有执行有意义的卷积,而只是通道之间的全连接矩阵。)