这篇论文是CVPR2020的oral,在神经网络可解释性方面做了一定工作。为了对神经网络的基础原理有更深入的理解,我决定学习此文。论文内容的介绍网上有不少,请各位自行搜索,本着深入学习论文的目的,这里对论文的部分内容进行复现试验,下面把我的试验数据忠实记录下来。
论文:https://arxiv.org/pdf/1905.13545.pdf
论文首先提出了一个有趣的现象,就是:把一张图像经过傅里叶变换分成高频和低频部分,把两部分分别重建,然后对两幅图像分别用已训练好的模型识别会发现,肉眼看起来和原图相似的低频图像反而会被识别错误,而肉眼几乎看不出什么的高频图像反而会被正确识别。作者认为这说明人眼难以的观察的高频信息也可能与标签相互关联,这些高频信息会降低模型的泛化性能,正是从这个现象的观察出发,作者引出对整篇文章的讨论。下图是原文进行的示例:
我们先来复现对这个现象的观察:
(1)和原文一样,使用ResNet18和cifar10。我用的ResNet18代码见:https://github.com/kuangliu/pytorch-cifar,在cifar10上训练200epoch后,在验证集上最高精度达到95.33%。
(2)cifar10的验证集共10000张图片32×32×3的彩色图片,共10类,每类1000张。对这些图片按照高频和低频分离并分别重建。由于论文中没有说明高频和低频分界时使用的半径是多少,所以我将半径从0~16都进行了试验。
说明:对图像进行傅里叶变换再移频后,低频分量集中在图像中心区域,高频分量在边缘区域,因此如果以频域图像中心为圆点,半径r制作圆形掩膜,就可以把低频和高频分量分离出来,然后再分别重建即可得到低频分量图片和高频分量图片。半径0时高频分量和原图一样,低频分量为纯黑;由于图片中心到角点的长度为 16 2 16\sqrt{2} 162,因此半径16时低频分量仍比原图少一点信息。操作代码可参见我之前的csdn博客。
下表给出低频和高频图像识别正确的个数(总数10000),以及各种交叉情况的个数:
半径r | 低频正确高频错误 | 低频错误高频正确 | 都正确 | 都错误 | 低频正确 | 高频正确 |
---|---|---|---|---|---|---|
0 | 118 | 8651 | 882 | 349 | 1000 | 9533 |
2 | 486 | 4785 | 1072 | 3657 | 1558 | 5887 |
4 | 1113 | 2543 | 796 | 5548 | 1909 | 3339 |
5 | 1469 | 1502 | 689 | 6340 | 2158 | 2191 |
6 | 1961 | 728 | 611 | 6700 | 2572 | 1339 |
8 | 3909 | 384 | 620 | 5087 | 4529 | 1004 |
12 | 7547 | 229 | 774 | 1450 | 8321 | 1003 |
16 | 8437 | 150 | 850 | 563 | 9287 | 1000 |
从试验结果可以看出,是有一些低频图片识别错误而高频图片识别正确的情况,论文中说这种情况大约有600张,也许对应的是半径6,但是我们可以看到此时有更多的低频正确而高频错误的情况。我觉得似乎作者为了证明他的观点只提了支撑证据成立,而没有提及反对证据是否不成立。如果据此认为高频信息和标签也有关联,那么也可以认为低频信息和标签反而有更多的关联,这更可能只是一种随机性现象,不应据此说明高频分量也蕴含了和标签有关的信息。此外我还试验了DenseNet121等其他网络,情况差不多。
当然,这个引子可能有点问题,但也不影响作者后续的试验分析。
论文又在cifar10上使用resnet18进行了不同低频分量的shuffle label试验。shuffle label试验由Bengio在《A Closer Look at Memorization in Deep Networks》中提到,我的另一篇博客https://blog.csdn.net/Brikie/article/details/113237509也有介绍。所谓shuffle label试验就是把训练集的标签完全打乱,由于完全没有了规律性,这时网络训练就是完全靠死记每个样本和标签的对应关系。
论文试验结果如下图,从图中可以看出,训练初期低频和高频精度基本一样,但随着训练的增加,高频的作用逐渐体现,作者认为可以得出结论:CNN会优先学习低频信息。
(1)使用和第一部分一样的ResNet18和cifar10。
(2)和论文说明的参数一样:Adam, lr=0.0001, batch size=100。
曲线形态和原文不同,这可能是模型某些参数细节不同造成的,但反映出来的规律和结论和原文一致。
注:这部分试验我开始理解成不同半径的低频图像分别训练观察精度变化,结果和论文曲线完全不同。后来仔细观察Figure3曲线的毛刺抖动都是一致的,细想才理解这个试验是用原始的Train数据训练,然后分别对不同半径的Train低频图像进行推理,观察同一个训练模型下各种频率分量的精度。
作者然后又分别在低频(LFC)和高频(HFC)分量图上进行了真实标签的训练和测试,得到数据如下表,作者的结论是低频信息有更好的泛化能力。
(1)使用和第一部分一样的ResNet18和cifar10。
(2)Adam, lr=0.0001, batch size=100。
对Table1的复现如下表:
LFC | HFC | |||
---|---|---|---|---|
r | train acc | test acc | train acc | test acc |
4 | 0.99 | 0.64 | 0.99 | 0.35 |
8 | 0.99 | 0.79 | 0.96 | 0.14 |
12 | 0.99 | 0.84 | 0.99 | 0.10 |
16 | 0.99 | 0.86 | 0.98 | 0.11 |
经验证,考虑到可能是模型某些参数细节不同造成了一些数值差异,但反映出的规律和原文Table1是基本一致的。
作者又分别分析了模型其他一些超参变化时高、低频域图像上训练精度的变化,如BatchSize 、Vanilla、Dropout、Mix-up、BatchNorm、Adervisal Trainning等。结果如下,作者认为可以得出的结论是:小的batch size可以提高训练和测试准确率,而高的batch size可以缩小泛化差距。还有一点就是BatchNorm能够显著提升高频分量的捕捉能力。
(1)使用和第一部分一样的ResNet18和cifar10。
(2)只使用cifar10中5000张图片,Adam, lr=0.01, batch size=100。使用图片较少是为了加快速度。对Figure5只试验了BatchNorm的情况。
由于显存不够,batch size最大只能试到100,能够看出batch size大时训练会慢一些。
BatchNorm的试验没有成功复现原文高频分量精度较高的现象,原因不明。
作者在论文中还继续进行了对抗训练的分析等等,我对这些部分不熟悉,暂不进行复现了。
总的来说,
(1)本文通过频域分量的拆解,分析了CNN在图像高低频域分量上的表现,低频泛化能力强,高频更接近噪声。
(2)通过复现此文学习了图像频域分析的相关技术,理解了高低频分量的意义和作用。
本文不承诺进行了严格复现,我只是为了加深学习进行试验,仅忠实列出我试验的结果,文中理解不对,试验不对的地方,还请各位批评指正。