Norm 的计算

  1. Normalization - 图1:对激活值规整到均值为 0,方差为 1的正态分布范围内
    1. 均值:Normalization - 图2,m 是计算统计量的集合 S 的大小
    2. 标准差:Normalization - 图3
  2. Normalization - 图4:补偿 Normalization 操作后神经网络的非线性表达能力

不同的 Normalization 方法都是将神经元的激活值重整为均值为 0 方差为 1 的新数值,最大的不同在于计算统计量(均值、方差)的神经元集合 S 的划分方法上

  1. BN 采用同一个神经元,但来自 Mini-Batch 中不同训练实例导致的不同激活作为统计范围
  2. LayerNorm 采用同隐层的所有神经元
  3. Instance Norm 采用 CNN 中卷积层的单个通道作为统计范围
  4. GroupNorm 则是 Layer Norm 和 Instance Norm 的折衷,采用卷积层的通道分组,在划分为同一个分组的多个通道作为通道范围

适用场景

  1. 对于 RNN 这种动态的神经网络结构来说,目前只有 LayerNorm 是相对有效的
  2. GAN 等图片生成或图片内容改写类型的任务(细粒度的生成任务),可以优先尝试 InstanceNorm
  3. 如果使用场景约束 BatchSize 必须设置很,无疑此时考虑使用 GroupNorm
  4. 其它任务情形应该优先考虑使用 BatchNorm

Batch Normalization

机器学习领域有个很重要的假设:IID独立同分布假设,就是假设训练数据和测试数据是满足相同分布的,这是通过训练数据获得的模型能够在测试集获得好的效果的一个基本保障。
BatchNorm 就是在深度神经网络训练过程中使得每一层神经网络的输入保持相同分布的

深度神经网络随着网络深度加深,训练起来越困难,收敛越来越慢。解决方法:

  • ReLU 激活函数
  • 残差网络
  • Batch Normalization

Batch Normalization 要解决的问题:
“Internal Covariate Shift”问题:对于深度学习这种包含很多隐层的网络结构,在训练过程中,因为各层参数老在变,所以每个隐层都会面临 covariate shift 的问题,也就是在训练过程中,隐层的输入分布老是变来变去(就导致不符合 IID 独立同分布假设),这就是所谓的“Internal Covariate Shift”
解决方法 / BatchNorm 的基本思想:让每个隐层节点的激活输入分布固定下来

BatchNorm 的本质思想

  • 对于每个隐层神经元,把逐渐向非线性函数映射后向取值区间极限饱和区靠拢的输入分布强制拉回到均值为 0 方差为 1 的比较标准的正态分布,使得非线性变换函数的输入值落入对输入比较敏感的区域,以此避免梯度消失问题
    • 这里的输入指的是做非线性变换前的激活输入值,即 z = wx + b
    • BN:Normalization - 图5
  • 因为梯度一直都能保持比较大的状态,所以很明显对神经网络的参数调整效率比较高,就是变动大,就是说向损失函数最优值迈动的步子大,也就是说收敛地快

问题:通过 BN 操作,大部分输入落在激活函数的线性区内,降低了网络的表达能力
解决:对 BN 变换后得到的均值为 0 方差为 1 的分布 z’ 进行 scale 和 shift,即 z’’ = scale * z’ + shift

  • scale 和 shift 这两个参数通过训练学习得到
  • 通过 scale 和 shift 把这个值从标准正态分布左移或者右移一点并长胖一点或者变瘦一点,每个实例挪动的程度不一样,这样等价于非线性函数的值从正中心周围的线性区往非线性区动了动
  • 核心思想找到一个线性和非线性的较好平衡点,既能享受非线性的较强表达能力的好处,又避免太靠非线性区两头使得网络收敛速度太慢(梯度消失)

BN 计算统计量时神经元集合 S 范围的划定:BN 采用同一个神经元,但来自 Mini-Batch 中不同训练实例导致的不同激活作为统计范围

  • MLP:对于神经元 k 来说,假设某个 Batch 包含 n 个训练实例,那么每个训练实例在神经元 k 都会产生一个激活值,也就是说 Batch 中 n 个训练实例分别通过同一个神经元 k 的时候产生了 n 个激活值,BatchNorm 的集合 S 选择入围的神经元就是这 n 个同一个神经元被 Batch 不同训练实例激发的激活值

image.png

  • CNN:对于 CNN 某个卷积层对应的某个输出通道 k 来说,假设某个 Batch 包含 n 个训练实例,那么每个训练实例在这个通道 k 都会产生一个二维激活平面,也就是说 Batch 中 n 个训练实例分别通过同一个卷积核的输出通道 k 的时候产生了 n 个激活平面。假设激活平面长为 h,宽为 w,则激活平面包含 hw 个激活值,n 个不同实例的激活平面共包含 nhw 个激活值。那么 BatchNorm 的集合 S 的范围就是由这 nh*w 个同一个通道被 Batch 不同训练实例激发的激活平面中包含的所有激活值构成

image.png

Batch Normalization 的优点

  1. 可以加快模型收敛速度,不再依赖精细的参数初始化过程,可以调大学习率等各种方便
  2. 同时引入的随机噪声能够起到对模型参数进行正则化的作用,有利于增强模型泛化能力

Batch Normalization 的缺点

  1. 如果 Batch Size 太小,则 BN 效果明显下降
  • 当 batch size < 8 时,对分类效果有明显的负面影响
  • BN 无法应用在 Online Learning 中,因为在线模型是单实例更新模型参数的,难以组织起 Mini-Batch 结构
  1. 对于有些像素级图片生成任务来说,BN 效果不佳
  • 对于图片分类等任务,只要能够找出关键特征,就能正确分类,这算是一种粗粒度的任务,在这种情形下通常 BN 是有积极效果的
  • 但是对于有些输入输出都是图片的像素级别图片生成任务,比如图片风格转换等应用场景,使用 BN 会带来负面效果,这很可能是因为在 Mini-Batch 内多张无关的图片之间计算统计量,弱化了单张图片本身特有的一些细节信息
  1. RNN 等动态网络使用 BN 效果不佳且使用起来不方便
  • 对于 RNN 来说,尽管其结构看上去是个静态网络,但在实际运行展开时是个动态网络结构,因为输入的 Sequence 序列是不定长的,这源自同一个 Mini-Batch 中的训练实例有长有短。对于类似 RNN 这种动态网络结构,BN 使用起来不方便,因为要应用 BN,那么 RNN 的每个时间步需要维护各自的统计量,而 Mini-Batch 中的训练实例长短不一,这意味着 RNN 不同时间步的隐层会看到不同数量的输入数据,而这会给 BN 的正确使用带来问题
  1. 训练时和推理时统计量不一致
  • 因为在线推理或预测的时候,是单实例的,不存在 Mini-Batch,所以就无法获得 BN 计算所需的均值和方差,一般解决方法是采用训练时刻记录的各个 Mini-Batch 的统计量的数学期望,以此来推算全局的均值和方差,在线推理时采用这样推导出的统计量。虽说实际使用并没大问题,但是确实存在训练和推理时刻统计量计算方法不一致的问题。

以上四个缺点都源自于BN 要求计算统计量的时候必须在同一个 Mini-Batch 内的实例之间进行统计,因此形成了 Batch 内实例之间的相互依赖和影响的关系
根本解决方法:转换统计集合范围,在统计均值方差的时候,不依赖 Batch 内数据,只用当前处理的单个训练数据来获得均值方差的统计量,这样因为不再依赖 Batch 内其它训练数据,那么就不存在因为 Batch 约束导致的问题

  • 问题:对于单个训练实例,统计范围怎么算?
    • Layer Normalization、Instance Normalization、Group Normalization

Layer Normalization

思想/原理在同隐层内计算统计量,即直接用同层隐层所有神经元的响应值作为集合 S 的范围来求均值和方差

  • MLP 用同隐层的所有神经元
  • CNN 同一个卷积层包含 k 个输出通道,每个通道 mn 个神经元,共 km*n 个神经元
  • RNN 的一个时间步的隐层包含的所有神经元

image.pngimage.png
image.png

适用范围:

  • Layer Normalization 目前只适用于 RNN 这种动态网络;且在 RNN 中也只有 Layer Normalization 相对有效,其它 Norm 方式都不太行
  • 在 CNN 等场景下 Layer Normalization 效果不如 Batch Normalization 或 Group Normalization

Instance Normalization

思想/原理在 Layer Normalization 的基础上进一步将统计范围缩小

  • CNN 可以进一步把统计范围缩小到单个卷积核对应的输出通道内部,即 m*n 个神经元
  • MLP 和 RNN 无法在同一隐层继续缩小范围,再缩小就只剩下单独一个神经元,输出也是单值而非CNN的二维平面,因此 MLP 和 RNN 不能使用 Instance Normalization

image.png

看上去 Instance Normalization 像是 Batch Normalization 的一种 Batch Size=1 的特例情况。但是,Instance Normalization 可以用在任意 Batch size 下,Batch size 这个超参数的设置是自由的;而 BN 这种要模拟 IN 必须将 Batch size 设为 1,并且 batch size 设为 1 就不再是 mini-batch SGD 了,就退化成了单例 SGD,实际上并没有 Normalization 了(只在一个样本上同一个神经元计算均值、方差,相当于没做 Norm),BN 失效

适用范围:CNN

  • Instance Normalization 对于一些图片生成类的任务比如图片风格转换来说效果是明显优于BN
  • 但在很多其它图像类任务比如分类等场景效果不如 BN

Group Normalization

思想/原理:Layer Normalization 和 Instance Normalization 取折中

  • CNN:对 CNN 中某一层卷积层的输出或者输入通道进行分组,在分组范围内进行统计(而 Layer Normalization 是将同层所有神经元作为统计范围,Instance Normalization 则是 CNN 中将同一卷积层中每个卷积核对应的输出通道单独作为自己的统计范围,是两种极端情况)
  • 理论上 MLP 和 RNN 也可以引入这种模式,但是还没有看到相关研究,不过从道理上考虑,MLP 和 RNN 这么做的话,分组内包含神经元太少,估计缺乏统计有效性,猜测效果不会太好

image.png

适用范围:

  • Group Normalization 是 CNN 常用的模型优化技巧
  • Group Normalization 在要求 Batch Size 比较小的场景下或者物体检测/视频分类等应用场景下效果是优于 BN 的