关键点:
1、关于filter正交
将一层中的一个$k imes k imes c$的卷积核展开为$k * k * c$的向量,表示为$f$。一层中有$J_{ell}$个卷积核,$oldsymbol{W}_{ell}$为一个矩阵,矩阵的行 为卷积核展开的向量,行数为卷积核数$J_{ell}$。
首先对于矩阵$oldsymbol{W}_{ell}$做标准化。
egin{equation}
hat{oldsymbol{W}}_{ell}=oldsymbol{W}_{ell} /left|oldsymbol{W}_{ell}
ight|
end{equation}
一层之中卷积核间的正交性用$O_{ell}^{f}$表示。
egin{equation}
oldsymbol{P}_{ell}=left|hat{oldsymbol{W}}_{ell} imes hat{oldsymbol{W}}_{ell}^{T}-I
ight|
end{equation}
egin{equation}
O_{ell}^{f}=frac{sum P_{ell}[f]}{J_{ell}}
end{equation}
$oldsymbol{P}_{ell}$是大小为$J_{ell} imes J_{ell}$的矩阵,$P[i]$表示矩阵$oldsymbol{P}_{ell}$的$i^{t h}$行。
作者认为如果$i^{t h}$行对应的卷积核与其他的卷积核正交,那么该行的sum值应该是最小的。然后按照这个标准在层内对filter进行排序。
因为文中,作者先去构建了一个两层的网络,针对于CIFAR-10数据集,drop filter之后发现后面的层drop filter对于最后的准确度的影响相对来说要更小,所以作者就剪去更深层的filter。
2、重新初始化权重
作者在剪去不重要的权重之后,继承权重进行训练,进行一定epoch之后,将剪去的卷积核再拿来重新初始化后添加进网络,但是问题的关键在于如何进行初始化的,如果随便的进行初始化会不会有效果,作者是将新添加进来的卷积核和未添加卷积核之前的网络卷积核正交的方式来初始化的权重数据。
分析:
在github上找到了别人实现的工程:https://github.com/siahuat0727/RePr
还有相对应的复现过程记录博客:https://siahuat0727.github.io/2019/03/17/repr/
复现者有些思考方向是值得借鉴的:
1、复现者开始复现后结果并没有论文中这么好。然后开始对比自己的loss曲线和论文中的loss曲线之间的差别,发现自己复现的einitialize 之后train精度特别明显的回升,而论文中的曲线回升明显并且精度值比较高,所以作者就怀疑是不是pytorch中数据增强的问题,data augmentation,torchvision.transforms.RandomCrop
。
2、复现者不使用data augmentation,发现效果还是不好,这时候复现者没有就此放弃,而是做了其他的尝试,调低了学习率,发现论文中的方法的却是有效的。
3、这时候作者重新恢复使用data augmentation,使用现在的学习率,但是没有使用论文中的方法,发现data augmentation的效果更好。
总而言之,复现还存在问题。