每层末尾的批量归一化而不是输入?

机器算法验证 Python 循环神经网络 卷积 喀拉斯 批量标准化
2022-03-30 14:56:13

我目前正在研究网络实现RCNN的论文。

RCNN 中的核心模块是循环卷积层(RCL),其状态在离散的时间步长上演变。

该网络类似于 ResNet。

每个 RCL 块都被定义为...

def RCL(feed_forward_input,num_of_filter, filtersize, alpha,pool):
    conv = Conv2D(filters=num_of_filter, kernel_size=filtersize, padding='same')
    recurrent_input = conv(feed_forward_input) #Yes I could have used a less confusing name... 
    merged = add([feed_forward_input,recurrent_input])
    conv_relu = Activation(create_relu_advanced(alpha_val=alpha))(merged)
    conv_relu_batchnorm = BatchNormalization()(conv_relu)
    if pool:
        conv_relu_batchnorm_pool = MaxPooling2D()(conv_relu_batchnorm)
        return conv_relu_batchnorm_pool
    else:

        return conv_relu_batchnorm

我不明白为什么批量标准化是在最后而不是在开始时进行的?标准化输入是否有意义?对输入进行归一化是有意义的,但是对每一层的输出进行归一化有意义吗?

我猜让我感到困惑的是,它通常在开始时使用,所以在最后这样做似乎有点......不寻常?- 如herehere以及here所述。

σ(x)=fn(g(x))是两个非线性函数的组合。内部的g(x)可以是传统的 sigmoid 函数g(x)=>1/(1+ex)或整流线性单元 (ReLU) [21] g(x)=maxx,>0与使用 sigmoid 函数相比,具有 ReLU 的模型通常收敛速度更快,并且往往获得更好的性能。然而,更快的收敛带来了“梯度爆炸”的问题,这需要更小的学习率和必要的归一化。外部函数fn(·)表示适当的归一化函数。这里采用批量归一化方法[14]

它是在 Relu 之后完成的……奇怪吗?.

1个回答

根据Ioffe 和 Szegedy (2015) 的说法,批量归一化用于稳定非线性激活函数的输入。

“批量归一化在整个训练过程中寻求激活值的稳定分布,并对非线性的输入进行归一化,因为这是匹配矩更有可能稳定分布的地方”

所以通常,它是在密集层之后和非线性之前插入的。下面是 CS231n 讲义的一部分。

在此处输入图像描述