frn

https://github.com/gupta-abhay/pytorch-frn

原文:https://mp.weixin.qq.com/s?__biz=MzUyMjE2MTE0Mw==&mid=2247488803&idx=1&sn=c63149a91fefe07173a12271231f9a4b&chksm=f9d14bbbcea6c2adce882b38231562b22f6166c2cd340937fa31c217b935366d438b3acc9fa0&mpshare=1&scene=1&srcid=&sharer_sharetime=1582292536893&sharer_shareid=ab5aa3530015c5ae813227bf34b4fc84&key=503aabc154a85e83f8db6cf28698bffaee080da9697f9ee676b65d390e67cb6b18601caad54854a4814c5889644f1fb3f567fb2c6f018a3c35fc953f218937e7175c6cda7997a40b2494f099f166c49d&ascene=1&uin=MjIzODAyMTI0MA%3D%3D&devicetype=Windows+10&version=62080079&lang=zh_CN&exportkey=Acv0YgsXcYiaSDfFKgFJs0w%3D&pass_ticket=Th2KBE%2BgiOixtB%2BMndZQ6gX7CyMUt9FTskdZqdXnyP63ONs0eZn%2Fz817ZevKb4CT

谷歌的提出的FRN层包括归一化层FRN(Filter Response Normalization)和激活层TLU(Thresholded Linear Unit),如图3所示。FRN层不仅消除了模型训练过程中对batch的依赖,而且当batch size较大时性能优于BN。

图3 FRN层结构示意图

其中FRN的操作是(H, W)维度上的,即对每个样例的每个channel单独进行归一化,这里就是一个N维度(HxW)的向量,所以FRN没有BN层对batch依赖的问题。BN层采用归一化方法是减去均值然后除以标准差,而FRN却不同,这里没有减去均值操作,公式中的的二次范数的平均值。这种归一化方式类似BN可以用来消除中间操作(卷积和非线性激活)带来的尺度问题,有助于模型训练。

公式里的是一个很小的正常量,以防止除0。FRN是在H,W两个维度上归一化,一般情况下网络的特征图大小N=HxW较大,但是有时候可能会出现1x1的情况,比如InceptionV3和VGG网络,此时就比较关键,图4给出了当N=1时不同下归一化的结果。当值较小时,归一化相当于一个符号函数(sign function),这时候梯度几乎为0,严重影响模型训练;当值较大时,曲线变得更圆滑,此时的梯度利于模型学习。对于这种情况,论文建议采用一个可学习的。对于不含有1x1特征的模型,论文中采用的是一个常量值1e-6。值得说明的是IN也是在H,W维度上进行归一化,但是会减去均值,对于N=1的情况归一化的结果是0,但FRN可以避免这个问题。

图4 当N=1时不同e对FRN归一化的影响

归一化之后同样需要进行缩放和平移变换,这里的也是可学习的参数(参数大小为C):

FRN缺少去均值的操作,这可能使得归一化的结果任意地偏移0,如果FRN之后是ReLU激活层,可能产生很多0值,这对于模型训练和性能是不利的。为了解决这个问题,FRN之后采用的阈值化的ReLU,即TLU:

这里的是一个可学习的参数。论文中发现FRN之后采用TLU对于提升性能是至关重要的。

FRN层的实现也是极其容易,在TensorFlow中的实现代码如下所示:

    def FRNLayer(x, tau, beta, gamma, eps=1e-6):        # x: Input tensor of shape [BxHxWxC].        # alpha, beta, gamma: Variables of shape [1, 1, 1, C].        # eps: A scalar constant or learnable variable.        # Compute the mean norm of activations per channel.        nu2 = tf.reduce_mean(tf.square(x), axis=[1, 2],                    keepdims=True)        # Perform FRN.        x = x * tf.rsqrt(nu2 + tf.abs(eps))        # Return after applying the Offset-ReLU non-linearity.        return tf.maximum(gamma * x + beta, tau)

FRN层的效果也是极好的,下图给出了FRN与BN和GN的效果对比:

图5 ResNet50模型采用FRN,BN,GN在ImageNet上不同batch size下的性能差异

可以看到FRN是不受batch size的影响,而且效果是超越BN的。论文中还有更多的对比试验证明FRN的优越性。

03

小结

BN目前依然是最常用的归一化方法,GN虽然不会受batch size的影响,但是目前还没大范围采用,不知道FRN的提出会不会替代BN,这需要时间的检验。

发布了2672 篇原创文章 · 获赞 973 · 访问量 527万+

猜你喜欢

转载自blog.csdn.net/jacke121/article/details/104436087
frn
FPN
frp
Fre
FCN
fbn