一、问题背景
问题是这样的,在做一个图像生成的任务中(基于GAN),出现了局部噪声的问题,表现为下图所示,在和几位老师傅交流之后,推测是因为BN的问题。关于BatchNorm、LayerNorm、InstanceNorm、WeightNorm等介绍移步大佬博客。
那么怎么解决呢?参考StyleGAN2中,使用EqualConv2d替换掉Conv+BN的方式解决(经过实验,使用Layer Norm也能避免此问题)。EqualConv2d其实就是在初始化参数的时候,对卷积参数进行一次缩放处理。公式如下:
w
i
j
k
′
=
w
i
j
k
′
′
/
c
i
n
∗
k
∗
k
w'_{ijk}=w''_{ijk} / \sqrt{c_{in}*k*k}
wijk′=wijk′′/cin∗k∗k
其中
c
i
n
c_{in}
cin表示输入通道数,k表示卷积核尺度,代码在这里;在对卷积参数进行缩放之外,通过对卷积的处理使得输出恢复到单位标准差:
w
i
j
k
=
w
i
j
k
′
/
∑
i
,
k
(
w
i
j
k
′
)
2
+
ϵ
w_{ijk}=w'_{ijk}/\sqrt{\sum_{i,k}(w'_{ijk})^2+\epsilon}
wijk=wijk′/i,k∑(wijk′)2+ϵ
其实这一段比较好理解,带入到卷积运算公式之后,再求方差可以把卷积参数带来的方差变化给约掉,也就是卷积参数不会导致特征的整体方差发生变化,代码在这里。
那么问题来了,到底什么时候用BN?什么时候用Weight Norm?什么是时候用Layer Norm呢?
二、先从StyleGAN说起
2.1 StyleGAN中的问题
StyleGAN用于生成图像的,通过输入不同的噪声,控制生成的图像具备不同特征,比如性别、头发、肤色等。虽然StyleGAN的效果很好,但是在生成图像时会存在『水滴状』噪声问题,如下图所示。
2.2 StyleGAN2
StyleGAN2提到StyleGAN中采用AdaIN进行归一化,导致出现这个问题的,将AdaIN去掉之后这个问题就没有了,然后又提出第一章介绍的权重解调来实现特征的归一化。AdaIN最开始提出用于风格迁移任务中,代码在这里。计算公式如下:
A
d
a
I
N
(
x
,
y
)
=
σ
(
y
)
x
−
μ
(
x
)
σ
(
x
)
+
μ
(
y
)
AdaIN(x,y)=\sigma(y)\frac{x-\mu(x)}{\sigma(x)}+\mu(y)
AdaIN(x,y)=σ(y)σ(x)x−μ(x)+μ(y)
其中x表示源图像,y表示风格,也就是AdaIN可以将x图像迁移到y中风格中。用直白的语言说就是统一不同图像风格的变化,而BN、IN、LN是从不同纬度对特征分布进行统一。
三、不同网络及任务使用的归一化方法
下面对一些经典的算法进行统计,主要是图像、GAN相关算法,也涉及少量的文本、语音相关的内容。
算法 | 任务 | 网络 | 结构 | 归一化方式 | 卷积 | 备注 |
---|---|---|---|---|---|---|
StyleGAN | 图像生成 | StyleGAN | 上采样 | AdaIN | 普通卷积 | |
StyleGAN2 | 图像生成 | StyleGAN2 | 上采样 | Weight Demodulate | 普通卷积 | |
AdaIN | 图像风格迁移 | VGG | UNet | AdaIN | 普通卷积 | |
IN | 图像风格迁移 | VGG | UNet | AdaIN | 普通卷积 | |
MobileFSGAN | 换脸 | MobileFSGAN | UNet | G:BN;D:spectral_norm | 普通卷积 | |
单阶段-多阶段检测相关 | 目标检测、分类 | ResNet等 | 下采样 | BN | 普通卷积 | |
SegNet | 语义分割 | VGG | UNet | BN | 普通卷积 | |
FCN | 语义分割 | FCN | 下采样 | - | 普通卷积 | |
DenseNet | 图像分类、检测 | DenseNet | 下采样 | BN | 普通卷积 | 轻量化 |
MobileNet | 图像分类、检测 | MobileNet | 下采样 | 无 | DepthWiseConv | 轻量化 |
ShuffleNet | 图像分类、检测 | ShuffleNet | 下采样 | GN | Group Conv | 轻量化 |
Weight Normalization | 图像分类、生成 | - | - | WN | - | |
Transformer | 文本 | Transformer | - | LN | - | |
deepspeech | 语音 | RNN | - | BN | 普通卷积 |
四、分析各种归一化应用情况
4.1 BN
最常见的归一化方法,在目标检测、图像分类任务中使用的骨干网络中(如ResNet相关,ResNet、ResNext、ResNeSt等)。对于GAN相关的网络用的比较少,但是也有一些算法会用。
缺点:计算mean、var时受mini-batch影响,容易引入噪声,尤其是在GAN相关的算法中,可能会出现水滴状的问题。
注意:在图像分类、检测、分割等任务中,往往使用预训练模型,所以即使batchsize=1也不会导致太差的结果。
4.2 LN
针对单个样本,不受mini-batch影响,在RNN系列模型用的比较多,NLP任务中常用。
4.3 IN
对于图像而言,有点像是对每个像素进行归一化,用于风格迁移中。
4.4 WN
不依赖数据的统计量,感觉有点类似于万金油。BN、LN都是基于特征的统计量,而WN是对权重进行处理的。
4.5 GN
常用于分组卷积或分组相关运算中。
4.6 DepthWiseConv
不用norm,猜测其实每个卷积都是独立的,不像普通卷积一样进行多个纬度的累加,所以输出特征比较稳定。猜想普通卷积多个纬度相加,特征值可能会出现变化比较大的情况,所以需要各种norm给拉回来,利用网络优化,而DWC就一个小卷积核,不怕不怕。
引用:
[1] BN、LN、IN、GN等介绍
https://zhuanlan.zhihu.com/p/33173246
https://zhuanlan.zhihu.com/p/115949091
[2] 论文
上面涉及的所有论文,懒得一个个贴了。
即兴写的不免有很多疏漏,若有问题欢迎交流!