疑问:SpectralNorm紧随BatchNorm后是否会被完全抵消?
问题:Spectral Norm是否会被后续的Batch Norm完全抵消?
我在实现FastGAN时,发现官方仓库中直接在Spectral Norm之后使用Batch Norm。请问Spectral Norm是否会被后续的Batch Norm完全抵消?我认为确实如此,还编写了简单的演示代码,想确认自己有没有遗漏基础要点,以及作者是否真的存在失误?
推理过程
- Spectral normalization对线性算子
O进行缩放,缩放因子为其谱范数的倒数1 / sigma(O) - 不带可学习参数
beta、gamma的Batch Norm会对输入进行平移和缩放:BN(O(x)) = (O(x) - E[O(x)]) / (std[O(x)])- 基于此,对于任意输入
x和常数因子k,有BN(k*O(x)) = BN(O(x))——因为缩放因子k会在标准化过程中被完全抵消:(k*O(x) - k*E[O(x)]) / (k*std[O(x)]) = (O(x) - E[O(x)])/std[O(x)]
- 基于此,对于任意输入
演示代码
import torch import torch.nn as nn from torch.nn.utils import spectral_norm # BatchNormed Convolution conv = nn.Conv2d(3,1,3,1,0, bias=False) c_dict = dict(conv.named_parameters()) c_dict["weight"].data = torch.ones_like(c_dict["weight"].data) bn1 = nn.BatchNorm2d(1, affine=False) # BatchNormed SpectralNormed Convolution conv2 = nn.Conv2d(3,1,3,1,0, bias=False) c_dict = dict(conv2.named_parameters()) c_dict["weight"].data = torch.ones_like(c_dict["weight"].data) # 对第二个卷积应用谱归一化 sn_conv = spectral_norm(conv2) bn2 = nn.BatchNorm2d(1, affine=False) # 生成测试输入 im = torch.randn(size=(2,3,4,4)) cim = conv(im) sncim = sn_conv(im) # 设置BatchNorm为训练模式 bn1.train() bn2.train() # 多次通过BatchNorm更新统计量 for i in range(1000): cimbn = bn1(cim) sncimbn = bn2(sncim) # 验证结果是否一致 assert torch.isclose(cimbn, sncimbn).all() # 执行后断言成立,两者输出完全一致
我认为BN(SN(Conv))与BN(Conv)之间唯一的有效区别仅在于初始化阶段的函数行为略有不同?
内容的提问来源于stack exchange,提问作者Ronald
相关产品推荐
相关产品推荐

