CNN - 权重共享的反向传播如何准确地工作?

数据挖掘 神经网络 美国有线电视新闻网
2021-10-01 06:16:01

考虑使用卷积神经网络 (CNN) 进行图像分类。为了检测局部特征,在同一卷积层中的单元之间使用权重共享。在这样的网络中,内核权重通过反向传播算法进行更新。

内核权重的更新hj在层l如下:

hjl=hjlηδRδhjl=hjlηδRδxjLδxjLδxjL1...δxjlδhjl

如何更新内核权重并且仍然保持相同(=共享)?

我有两种可能的解释:

  1. 初始化为相同值的同一层的权重将保持不变(与输入无关)。这意味着表达式δRδhjl 所有这些权重都相同 h1lhJl. 这没有意义,因为xjl对于不同的j来说是不同的。或者我在这里错过了什么?

  2. 有一个技巧,例如在反向传播更新之后,共享权重被设置为它们的平均值。

编辑 我的困惑是我没有考虑到如果权重是共享的,它的参数hjl在损失函数中多次出现。当区分为hjl,几个术语(考虑到相应的输入)将“生存”。因此更新将是相同的。

2个回答

我想你误解了这里的“体重分享”是什么意思。卷积层通常由许多“过滤器”组成,通常为 2x2 或 3x3。这些过滤器应用于整个图层输入的“滑动窗口”。“权重共享”在整个输入中为此过滤器使用固定权重。这并不意味着所有过滤器都是等效的。

具体来说,让我们想象一个 2x2 过滤器 F 跨越 3x3 输入 X有填充,所以过滤器被应用了 4 次。让我们表示展开的过滤器β.

X=[x11x12x13x21x22x23x31x32x33]

F=[w11w12w21w22]

β=[w11,w12,w21,w22]

FX=[β[x11,x12,x21,x22]β[x12,x13,x22,x23]β[x21,x22,x31,x32]β[x22,x23,x32,x33]]

“权重共享”意味着当我们将这个 2x2 过滤器应用于 3x3 输入时,我们在整个输入中重复使用过滤器给出的相同的四个权重。另一种方法是每个过滤器应用程序都有自己的一组输入(这实际上是图像的每个区域的单独过滤器),总共提供 16 个权重,或者具有 4 个节点的密集层提供 36 个权重。

以这种方式共享权重显着减少了我们必须学习的权重数量,从而更容易学习非常深的架构,此外还允许我们学习与正在考虑的输入区域无关的特征。

编辑:为了进一步激发这一点,这是一个应用于 5x5 输入的 3x3 过滤器的动画

在此处输入图像描述

我不确定您是否可以更改已接受的答案,但由于您对反向传播问题的唯一答案是关于正向传播的问题,因此我决定试一试。

本质上,您处理权重增量 (δRδhjl) 与线性神经元的权重增量相同,但每次在输入上覆盖滤波器(内核)时对其进行一次训练,所有这些都在一个反向传播过程中。结果是过滤器所有叠加层的增量总和。我认为在你的符号中,这将是δRδhjl=i=1nxil1δRδxjl+1在哪里xl1是乘以的输入hjl对于前向传播期间的覆盖之一,以及xl+1是由该覆盖产生的输出。

在通过卷积层(参数增量和输入增量)进行反向传播的两个结果之间,听起来您对参数增量更感兴趣,或者更具体地说,权重矩阵增量(δRδhjl)。为了完整起见,我将介绍两者,以下是我们的示例层:

如果您有一组 1D 输入[1,2,3], 和一个过滤器[0.3,0.5] 使用步幅 1、无填充、零偏差和无激活函数应用,那么您的过滤器的激活将看起来像 [10.3+20.5,20.3+30.5]=[1.3,2.1]. 当您在反向传播过程中通过这一层返回时,假设您用于计算的激活增量是[0.1,0.2].

重量增量:

当你通过前向传递时,你缓存了你的输入 [1,2,3],我们称它为 A_prev,因为它很可能是您上一层的激活。对于过滤器的每个潜在覆盖(在这种情况下,您只能将其覆盖在两个位置 [ 1,2,3 ] 和 [1, 2,3 ] 的输入上),取输入 A_slice 的那个切片,乘以每个通过相关的输出 delta dZ 元素,并将其添加到此通过的权重 delta dW。在此示例中,您将添加[10.1,20.1] dW 为第一个叠加层,然后添加 [20.2,30.2]对于第二个叠加层。总而言之,你在这个反向传播通道上这个卷积层的 dW 是[0.3,0.4].

偏差增量:

与权重增量相同,但只需添加输出增量而不乘以输入矩阵。

输入增量:

重建该层输入的形状,将其命名为 dA_prev,将其初始化为零,然后遍历将过滤器覆盖在输入上的配置。对于每个叠加层,将权重矩阵乘以与此叠加层关联的输出增量,并将其添加到与此叠加层关联的 dA_prev 切片中。也就是说overlay 1会添加[0.30.1,0.50.1]=[0.03,0.05] 到 dA_prev 导致 [0.03,0.05,0], 然后叠加 2 将添加 [0.30.2,0.50.2]=[0.06,0.1], 导致 [0.03,0.01,0.1] 对于 dA_prev。

如果您想以不同的方式阅读相同的答案,这是一个很好的来源:链接

其它你可能感兴趣的问题