在阅读了有关batchnorm的研究论文及其在论坛中的各种描述后,我仍然不清楚基本计算是如何执行的。我的问题的核心是:向量相对于它所属的集合进行归一化;因此,我们可以使用从训练集中选择的批次对输入到第 1 层的向量进行归一化。下一层的每个输入向量都需要根据其所属的集合进行归一化,但是我们如何获得该集合?
更准确地说,让
BN(X1j, B1), j = 1..n,可以计算,因为我们知道 B1。它们是第 1 层的输入。
我们需要 BN(X2j, B2), j = 1..n 来输入第 2 层,但我们没有现成的 B2。我的问题是如何获得 B2、B3 等
我们可以通过第 1 层处理每个 BN(X1j, B1), j = 1..n,并将输出记住为 X2j(该集合将是 B2)。然后通过相对于 B2 进行归一化来计算每个 j 的 BN(x2j, B2) 并将它们输入到第 2 层等。因此前向传递将包含许多这样的步骤。为了简单起见,我忽略了比例和移位步骤,因为这与我的问题无关。
作为这个主题的新手,我希望得到专家的意见。
批归一化首先减去平均值,使输出以零为中心。然后批量归一化除以标准导数,将输出缩放至单位方差。
这意味着每个向量都根据其所属的批次进行归一化。假设您在第一层运行 x,我们将其输出称为 y1。然后以
(y1 - y1.mean()) / y.std()
的形式将批量归一化应用于 y1。你所说的“集合”只是向量 y1,即该层的输出。
所有这些当然都忽略了带有偏见和推导的版本。
根据您的符号,BN(X1j, B1) 的大小为 N,因为对于每个 j 都会有一个输出。应用此激活函数,我们得到下一层的 N 个新值。