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

机器算法验证 机器学习 神经网络 深度学习 特征工程 卷积神经网络
2022-02-02 05:50:13

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

我试图了解下图中的特征图之间的步骤中的实现细节,图中显示了 CNN 的层。

卷积神经网络层

根据这张图:

卷积图像

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

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

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

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

2个回答

通常从随机分布初始化网络,通常均值为零,并且在选择其方差时要小心。如今,随着优化技术(SGD+Momentum 等方法)和激活非线性(ReLU 和类似 ReLU 的激活允许更好地反向传播梯度信号,即使在更深的网络中)的进步,人们能够实际训练最先进的卷积来自随机初始化的神经网络。

关键属性如下:

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

  • 为什么说零?机器学习中的一种常见做法是将输入数据归零或归一化,这样原始输入特征(对于图像数据,这些特征是像素)平均为零。

    我们以零为中心我们的数据,我们将随机初始化我们网络的权重(你提到的矩阵)。我们应该选择什么样的分布?由于我们以零为中心,我们网络的输入数据分布均值为零。假设我们还将我们的偏差项初始化为零。当我们初始化网络训练时,我们没有理由偏爱一个神经元,因为它们都是随机的。一种做法是随机初始化我们的权重,使其在预期中都具有零激活输出。这样,没有一个神经元比任何其他神经元更喜欢“激活”(具有正输出值),同时由于随机初始化而破坏对称性。实现这一点的一个简单方法是选择均值零分布。

  • 我们如何选择方差?您不想选择太大的方差,即使它是均值为零。深度网络权重中的极值会导致激活输出的幅度呈指数增长,并且这个问题可能会随着网络的深度而复杂化。这会对我们网络的训练造成严重破坏。您也不想选择太小,因为这可能会减慢学习速度,因为我们正在计算非常小的梯度值。所以这里有一个平衡,特别是当涉及到更深的网络时,因为我们不希望我们的前向或后向传播在深度上呈指数增加或减少。

    有两种非常流行的权重初始化方案:Glorot Uniform(了解训练深度前馈神经网络的难度)和 He Normal 初始化器(Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification)。

    它们的构建都是为了训练深度网络,并牢记以下核心原则(引自 Delving Deeper into Rectifiers 文章):

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

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

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

由于声誉低下,我无法发表评论,所以我写这篇文章是为了回应 Felipe Almeida 的问题。Indie AI 完美回答之后,就没有什么可补充的了。如果要检测特定的形状(如 X),可以预先定义特定的过滤器,就像边缘检测一样。但这就是深度学习的美妙之处,有如此多的层、如此多的过滤器和如此多的迭代,以至于过滤器几乎可以自己学习所有必要的对象形状。所以理论上,如果有一个 X 被检测,其中一个过滤器将学习检测一个 X(作为黄色过滤器)