【机器学习】卷积和反向传播

一、说明

自从 AlexNet 在 2012 年赢得 ImageNet 竞赛以来,卷积神经网络 (CNN) 就变得无处不在。从不起眼的 LeNet 到 ResNets 再到 DenseNets,CNN 无处不在。

您是否想知道 CNN 的反向传播中会发生什么,特别是反向传播在 CNN 中的工作原理。如果您读过反向传播,您就会了解它是如何在具有全连接层的简单神经网络中实现的。 (Andrew Ng 在 Coursera 上的课程对此做了很好的解释)。但是,对于我的一生,我无法理解反向传播如何与卷积层一起工作。

我知道,您不必了解反向传播的数学复杂性即可实现 CNN。您不必手动实现它们。因此,大多数深度学习书籍也没有涵盖它。

这篇文章最重要的是向您展示这一点:

我们都知道卷积层的前向传递使用卷积。但是,反向传播期间的反向传递也使用了卷积!

但如果您已经了解反向传播中的链式法则,那么您可以跳到下一节

二、了解反向传播中的链式法则

考虑这个方程

f(x,y,z) = (x + y)z

为了让它更简单,让我们把它分成两个方程。

现在,让我们为其绘制一个计算图,其中 x、y、z 的值为x = -2、y = 5、z = 4。

f = q*z 的计算图,其中 q = x + y

当我们求解方程时,当我们从左向右移动时("前向传递"),我们得到的输出为f = -12

现在让我们进行向后传递。比如说,就像在反向传播中一样,我们在每个阶段导出从右到左移动的梯度。因此,最后,我们必须得到输入 x、y 和 z 的梯度值 --- ∂f/∂x ∂f/∂y ∂f/∂z用 x 来区分函数 f, y 和 z)

从右到左,在乘法门处,我们可以对f进行微分以获得 qz 处的梯度--- ∂f/∂q 和**∂f/∂z** 。在加法门,我们可以对q进行微分以获得 xy 处的梯度--- ∂q/∂x 和**∂q/∂y。**
计算计算图中的梯度及其值

我们必须找到**∂f/∂x** 和**∂f/∂y ,但我们只得到** ∂q/∂x 和∂q/∂y的值**。**那么,我们该怎么做呢?
我们如何找到 ∂f/∂x∂f/∂y

这可以使用微分链式法则来完成。根据链式法则,我们可以求出**∂f/∂x**为
微分链式法则

我们可以将**∂f/∂x** 和**∂f/∂y**计算为:
具有所有梯度的计算图的向后传递

三、卷积层中的链式法则

现在我们已经完成了一个简单的计算图,我们可以将 CNN 想象成一个巨大的计算图。假设计算图中有一个门f ,输入为 x 和 y ,输出为 z。
一个简单的函数 f,将 x 和 y 作为输入并输出 z

我们可以轻松计算局部梯度------将 z 相对于 x 和 y 微分 为**∂z/∂x** 和**∂z/∂y**

对于前向传播,我们穿过 CNN,遍历其各层,最后使用损失函数获得损失。当我们开始逐层向后计算损失时,我们从前一层得到损失的梯度为**∂L/∂z** 为了将损失传播到其他门,我们需要找到**∂L/∂x** 和**∂L/∂y**。
局部梯度可以使用函数 f 计算。我们需要找到 𝛛 L/ 𝛛 x 和 𝛛 L/ 𝛛 **y,**因为它需要传播到其他层。

链式法则对我们有帮助。使用链式法则,我们可以计算**∂L/∂x** 和**∂L/∂y,**这将馈送到扩展计算图中的其他门
求 x 和 y 的损失梯度

那么,这与 CNN 卷积层中的反向传播有什么关系呢?

现在,假设函数f 是输入 X 和滤波器 F 之间的 ***卷积。***输入 X 是 3x3 矩阵,滤波器 F 是 2x2 矩阵,如下所示:
具有输入 X 和滤波器 F 的简单卷积层示例

输入 X 和滤波器 F 之间的卷积得到输出 O。这可以表示为:
X 和 F 之间的卷积函数,给出输出 O

卷积运算给出输出 O 的值

这给了我们前向传球!让我们来看看向后传递。如前所述,在向后传递期间,我们得到相对于下一层输出 O 的损失梯度为**∂L/∂O**。结合我们之前使用链式法则和反向传播的知识,我们得到:
向后传递期间的函数 f

如上所示,我们可以找到相对于输出 O 的局部梯度**∂O/∂X** 和**∂O/∂F 。利用前几层的损失梯度 ---** ∂L/∂O 并使用链式法则,我们可以计算**∂L /∂X** 和**∂L/∂F**。
好吧,但是为什么我们需要找到**∂L/∂X** 和**∂L/∂F**呢?
为什么我们需要找到 ∂L/∂X 和 ∂L/∂F

四、所以我们来求 X 和 F 的梯度 --- ∂L/∂X 和**∂L/∂F**

4.1 求 ∂L/∂F

正如我们之前所做的那样,这有两个步骤。

  • 求局部梯度**∂O/∂F**
  • 使用链式法则求**∂L/∂F**

步骤 1:求局部梯度 --- ∂O/∂F:

这意味着我们必须区分输出矩阵 O 和滤波器 F。通过我们的卷积运算,我们知道这些值。因此,让我们开始区分 O- O11 的第一个元素与 F --- F11 、 F12、F21 和 F22 的元素

步骤 2:使用链式法则:

正如我们之前的例子中所描述的,我们需要找到**∂L/∂F**:

OF 是矩阵。并且**∂O/∂F** 将是矩阵O 对于矩阵F的偏导数!最重要的是我们必须使用链式法则。这看起来确实很复杂,但幸运的是我们可以使用下面的公式来扩展它。
使用链式法则导出矩阵相对于矩阵的偏导数的公式

展开,我们得到..
∂L/∂F的导数

将方程 A 中的局部梯度值 --- ∂O/∂F 代入,我们得到
使用方程 A 中的局部梯度值

如果你仔细观察的话,这就是我们非常熟悉的操作。我们可以将其表示为输入 X 和损失梯度**∂L/∂O 之间的卷积运算,如下所示:**
∂L/∂F = 输入矩阵 X 与损失梯度 ∂L/∂O 的卷积

∂L/∂F 只不过是输入 X 和下一层的损失梯度 ∂L/∂O 之间的卷积

4.2 求 ∂L/∂X:

步骤 1:求局部梯度 --- ∂O/∂X:

与我们之前找到局部梯度的方式类似,我们可以找到**∂O/∂X**:
局部梯度 ∂O/∂X

步骤 2:使用链式法则:

将其展开并代入方程 B,我们得到
使用方程中的局部梯度计算 ∂L/∂X的导数

好的。现在我们有了 ∂L/∂X 的值**。**不管你相信与否,这甚至可以表示为卷积运算。

∂L/∂X 可以表示为 180 度旋转滤波器 F 和损失梯度 ∂L/∂O 之间的"完全"卷积

首先,让我们将滤镜 F 旋转 180 度。这是通过先垂直翻转然后水平翻转来完成的。
将滤镜 F 翻转 180 度 --- 垂直和水平翻转

现在,让我们在这个翻转的滤波器 F 和 ∂L/∂O 之间进行"完全"卷积,如下所示:(这就像将一个矩阵从右到左、从下到上滑动到另一个矩阵上)
180 度翻转滤波器 F 和损失梯度 ∂L/∂O 之间的全卷积运算可视化

上面的全卷积生成 ∂L/∂X 的值,因此我们可以将 ∂L/∂X 表示为
∂L/∂X 可以表示为 180 度旋转滤波器 F 和损失梯度 ∂L/∂O 之间的"完全"卷积

好了,现在我们已经找到了 ∂L/∂X 和 ∂L/∂F ,我们现在可以得出这个结论

卷积层的前向传播和反向传播都是卷积

总结一下:
如何计算 ∂L/∂X 和 ∂L/∂F

五、结束语

希望这有助于解释反向传播在 CNN 卷积层中的工作原理。如果您想了解更多相关信息,请查看下面的链接。并通过为这篇文章鼓掌来表达一些爱。

相关推荐
数据分析能量站2 分钟前
神经网络-ResNet
人工智能·深度学习·神经网络
102112345678905 分钟前
怎么把多个PDF合并到一起-免费实用PDF编辑处理工具分享
人工智能·科技·adobe·pdf·wps·格式工厂·福昕阅读器
数据分析能量站5 分钟前
神经网络-DenseNet
人工智能·深度学习·神经网络
伊克罗德信息科技14 分钟前
亚马逊云科技 | Amazon Nova:智能技术新势力
人工智能
界面开发小八哥15 分钟前
报表工具DevExpress Reporting v24.2亮点 - AI功能进一步强化
人工智能·.net·报表·界面控件·devexpress·ui开发
EterNity_TiMe_15 分钟前
【论文复现】农作物病害分类(Web端实现)
前端·人工智能·python·机器学习·分类·数据挖掘
深蓝海拓34 分钟前
使用sam进行零样本、零学习的分割实践
人工智能·深度学习·学习·目标检测·计算机视觉
香橙薄荷心34 分钟前
学一学前沿开发语言之Python
人工智能·python
人类群星闪耀时1 小时前
利用AI进行系统性能优化:智能运维的新时代
运维·人工智能·性能优化
AZDNA1 小时前
搭建医疗行业AI知识库:提升信息管理与服务效能
大数据·人工智能