博客
关于我
经典论文系列 | Group Normalization & BN的缺陷
阅读量:584 次
发布时间:2019-03-10

本文共 2318 字,大约阅读时间需要 7 分钟。

Group Normalization:解决Batch Normalization的局限性

引言

Batch Normalization(BN)是深度学习领域的重要突破,它使得许多模型能够进行训练。然而,BN在处理小批量数据时表现出显著的性能下降,这限制了其在需要小批次的计算机视觉任务中的应用,如目标检测、语义分割和视频分类等。此外,BN的依赖性与批次大小使得在内存受限的环境中使用预训练模型变得困难。为此,我们提出了一种新的归一化方法——Group Normalization(GN),它有效地解决了这些问题。

主要思想

Batch Normalization通过对批次内的通道数据进行归一化,显著提高了模型的训练效率。然而,BN的计算依赖于批次大小的变化,导致在小批次下表现不稳定。此外,BN的参数依赖于批次大小,使得在需要小批次的任务中难以直接使用预训练模型。

Group Normalization通过将通道分为若干组,分别对每组数据进行归一化。与BN不同,GN的归一化过程不依赖于批次大小,且计算结果的精度在各种批次大小下保持一致。这种方法不仅解决了BN在小批次下的性能问题,还实现了对预训练模型的更好适应。

在ImageNet训练的ResNet-50模型中,GN在批次大小为2时的错误率低于BN的10.6%。与其他归一化方法(如Layer Normalization和Instance Normalization)相比,GN在不同批次大小下的性能表现更加稳定。

细节

Batch Normalization概述

Batch Normalization通过对批次内的通道数据计算均值和方差进行归一化,然后应用尺度缩放和偏移参数。BN的计算依赖于批次大小,且β和ɣ(缩放和偏移参数)在训练过程中逐步学习。这一特性在批次大小较小时导致统计估计不准确,从而影响模型性能。

Group Normalization的优势

Group Normalization通过将通道分为若干组,分别对每组数据进行归一化。这种方法的关键在于归一化的计算不依赖于批次大小。GN的计算过程与BN相同,只是归一化所使用的数据范围不同。

实现代码

以下是Group Normalization在TensorFlow中的实现代码示例:

import tensorflow as tfdef group_norm(inputs, groups=32):    """    Group Normalization层。    Args:        inputs: 输入张量,形状为[batch_size, channels, height, width]        groups: 分组的数量    Returns:        输出张量    """    channels = inputs.shape[1]    group_size = channels // groups    # 分组操作    perm = tf.image.permute_coordinates(inputs, [3, 1, 2])    perm = tf.reshape(perm, (-1, group_size, channels, 1))    x = tf.nn.reduce_mean(perm, axis=[1, 2])    y = tf.nn.reduce_variance(perm, axis=[1, 2], sample_size=group_size)    # 计算归一化因子    scale = tf.sqrt(tf.cast(group_size, tf.float32))    x_hat = (x - tf.reduce_mean(x, axis=3)) / (y + 1e-6)    x_hat *= scale / scale    # 恢复空间维度    x_hat = tf.reshape(x_hat, (-1, 1, group_size, 1))    x_hat = tf.image.permute_coordinates(x_hat, [2, 0, 1])    x_hat = tf.reshape(x_hat, (tf.shape(inputs)[0], inputs.shape[1], -1))    return x_hat# 示例使用x = tf.random.normal([10, 28, 32, 32])y = group_norm(x)print(y.shape)  # [10, 28, 32, 32]

实验结论

实验结果表明,Group Normalization在不同批次大小下的性能表现更加稳定。与BN相比,GN在小批次下的错误率显著降低,并且在大批次下的性能表现优于BN。同时,GN在与Layer Normalization和Instance Normalization的对比中表现更优,证明了其在多种任务中的通用性。

在ImageNet分类任务中,GN在批次大小为2时的错误率低于BN的10.6%。在目标检测和语义分割任务中,GN的模型性能优于基于BN的同类模型。此外,GN在视频分类任务中的表现同样出色,表明其在计算机视觉领域的广泛适用性。

Group Normalization的简单实现(仅需几行代码)使其在实际应用中易于部署。通过本文的研究,可以看出Group Normalization作为Batch Normalization的替代方案,具有广阔的应用前景。

转载地址:http://uazvz.baihongyu.com/

你可能感兴趣的文章
none 和 host 网络的适用场景 - 每天5分钟玩转 Docker 容器技术(31)
查看>>
None还可以是函数定义可选参数的一个默认值,设置成默认值时实参在调用该函数时可以不输入与None绑定的元素...
查看>>
NoNodeAvailableException None of the configured nodes are available异常
查看>>
Vue.js 学习总结(16)—— 为什么 :deep、/deep/、>>> 样式能穿透到子组件
查看>>
nopcommerce商城系统--文档整理
查看>>
NOPI读取Excel
查看>>
NoSQL&MongoDB
查看>>
NoSQL介绍
查看>>
NoSQL数据库概述
查看>>
Notadd —— 基于 nest.js 的微服务开发框架
查看>>
NOTE:rfc5766-turn-server
查看>>
Notepad ++ 安装与配置教程(非常详细)从零基础入门到精通,看完这一篇就够了
查看>>
Notepad++在线和离线安装JSON格式化插件
查看>>
notepad++最详情汇总
查看>>
notepad++正则表达式替换字符串详解
查看>>
notepad如何自动对齐_notepad++怎么自动排版
查看>>
Notes on Paul Irish's "Things I learned from the jQuery source" casts
查看>>
Notification 使用详解(很全
查看>>
NotImplementedError: Cannot copy out of meta tensor; no data! Please use torch.nn.Module.to_empty()
查看>>
NotImplementedError: Could not run torchvision::nms
查看>>