如何初始化过滤矩阵的元素?


24

我试图通过编写不依赖库的Python代码(例如Convnet或TensorFlow)来更好地理解卷积神经网络,并且我陷入了如何选择内核矩阵值的文献中。在图像上执行卷积。

我试图在下图显示CNN图层的功能图之间的步骤中了解实现细节。

卷积神经网络层

根据此图:

卷积图像

内核矩阵内核在图像上“步进”,创建特征图,其中每个像素是内核(或滤波器矩阵)的每个权重与输入图像的相应像素值之间的所有按元素乘积的总和。

我的问题是:我们如何初始化内核(或过滤器)矩阵的权重?

在上面的演示中,它们只是1和0,但是我认为这是从图中简化的。

是否在某些预处理步骤中对这些权重进行了训练?还是由用户明确选择?

Answers:


19

通常从随机分布(通常为零)初始化网络,并在选择方差时要格外小心。如今,随着优化技术(SGD +动量以及其他方法)和激活非线性(ReLU和类似ReLU的激活,即使在更深的网络中也可以对梯度信号进行更好的反向传播)的进步,人们才能够实际训练最先进的卷积技术随机初始化的神经网络。

关键属性如下:

  • 为什么随机?为什么不将它们全部初始化为0?这里的一个重要概念称为对称破坏。如果所有神经元的权重相同,它们将产生相同的输出,我们将不会学习不同的功能。我们不会学习其他功能,因为在反向传播步骤中,所有权重更新将完全相同。因此,从随机分布开始,我们可以将神经元初始化为不同的神经元(概率非常高),并允许我们学习丰富多样的特征层次结构。

  • 为什么是零?机器学习的一种常见做法是对输入数据进行零中心化或归一化处理,以使原始输入特征(对于图像数据而言,它们将是像素)平均为零。

    我们以数据为零中心,并随机初始化网络的权重(您所引用的矩阵)。我们应该选择哪种发行方式?由于我们以零为中心,因此输入数据到我们的网络的分布均值为零。假设我们还将偏差项初始化为零。当我们初始化网络训练时,我们没有理由偏爱一个神经元,因为它们都是随机的。一种做法是,以一种期望值全都具有零激活输出的方式来随机初始化权重。这样,没有一个神经元比任何其他神经元都更喜欢“激活”(具有正输出值),同时由于随机初始化而同时破坏对称性。一个简单的方法是选择平均零分布。

  • 我们如何选择方差?您不希望选择方差太大,即使方差为零也是如此。深网络权重中的极值可能导致激活输出的大小成指数增长,并且此问题可能与网络的深度相加。这会严重破坏我们的网络培训。您也不想选择它太小,因为我们正在计算非常小的梯度值,这可能会减慢学习速度。因此,这里有一个平衡点,尤其是在涉及更深的网络时,因为我们不希望前向或后向传播的深度成倍增加或减少。

    有两种非常流行的权重初始化方案:Glorot统一(了解训练深层前馈神经网络的难度)和He Normal初始化器(深入研究整流器:在ImageNet分类上超越人类水平的性能)。

    两者的构造都是为了在训练深层网络时牢记以下核心原则(引自“深入研究整流器”一文):

    “适当的初始化方法应避免按指数形式减小或放大输入信号的幅度。”

    粗略地讲,这两种初始化方案初始化每层的方差,以使每个神经元的输出分布相同。《深入整流器》的第2.2节提供了深入的分析。

最后一点:有时您还会看到人们在所有图层上使用的标准偏差等于.005或.01或其他“小”标准偏差的高斯。其他时候,您会看到人们用手摆弄各种差异,基本上是执行交叉验证以找到性能最佳的配置。


1
但是,上面的GIF中的黄色滤镜的“ X”形(由1制成)呢?我知道这是我想用来检测图片中任何位置的“ X”形状的方法,但是我如何知道“ X”是我想要的形状?我的印象是过滤器形状是自动学习的,但我不知道如何。也许这也是OP的问题?
菲利佩·阿尔梅达

2

由于声誉低下,我无法发表评论,因此我写这篇文章是为了回应Felipe Almeida的问题。在独立AI给出了完美的答案之后,没有什么可添加的了。如果要检测特定的形状(如X),可以像边缘检测一样预先定义特定的过滤器。但这就是深度学习的魅力,因为有太多的层,如此多的过滤器和如此多的迭代,因此过滤器自己学习几乎每种所需的对象形状。因此,从理论上讲,如果要检测到X,则其中一个过滤器将学会检测X(作为黄色过滤器)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.