最近看到一篇博客,将LookAhead和RAdam结合产生了一个新的算法——Ranger,获得了比单独使用RAdam要好的效果。后来有人将LARS与Ranger结合,效果取得了进一步提升。最近Ranger的提出者又将GC(Gradient Centralization)方法与Ranger结合,也取得了比Ranger好的效果。这里我会分四篇文章分享我个人在阅读这四个方法对应的论文时的总结和体会。由于LookAhead优化器与SWA比较相似,所以还会开辟一篇文章介绍SWA和Fast SWA优化器。本篇文章为系列文章第四篇。
方法
Batch Normalization(BN)和Weight Standardization (WS)都可以提高模型的泛化能力和训练速度,之前的文献对BN和WS的理论分析指出二者都使得梯度具有更好的Lipschitz平滑性(Lipschitz smooth的介绍),并使得权重空间路径更加平滑,从而可以提升模型训练的稳定性。这两个方法分别是对激活值和权重进行Z-score标准化。从这两个方法得到灵感,作者便尝试是不是也可以对梯度进行Z-score标准化,以提升模型训练效率。遗憾的是对梯度进行Z-score标准化并不能提升模型训练的稳定性,但是作者发现进行梯度中心化(Gradient Centralization, GC)处理却能提高模型的泛化能力和训练速度。作者分别从理论和实验角度论证了GC有效性。GC很简洁,可以轻易嵌入到已有优化算法中,下图是将GC加入到优化过程中的流程,以及GC在卷积层和全连接层的执行方式:
符号说明
用 表示网络某一层的权重,对于全连接层来说,对于卷积层,表示卷积核大小,表示卷积核维度,表示卷积核数量。用表示的第列,用表示目标函数,用和分别表示目标函数对和的(偏)导数。表示某一层的输入特征值,表示输出。用表示维单位列向量,表示单位矩阵。
GC计算公式
根据上面的符号,可以表示GC的计算公式:
使用矩阵方式表示如下:
从上面的公式可以看出,对于卷积层,中心化操作首先是计算每个卷积核的权重梯度均值,然后用卷积核中的每个权重梯度减去这个均值得到中心化后的权重梯度,对于全连接层则是对负责计算同一激活值的权重进行中心化。下面是官方实现的Pytorch版GC(x为某层权重):
x.add_(-x.mean(dim = tuple(range(1,len(list(x.size())))), keepdim = True))
可以看出GC是很简单的,这也体现在它很容易集成到目前以后的优化器中,下面是将GC集成到SGD和Adam中的算法流程:
GC理论分析
泛化作用
GC使得模型具有更好的泛化效果的原因是它能够对权重和特征空间进行正则化。
权重空间正则化
对上面的矩阵使用简单的矩阵运算便可以得出下面的结论:
从上面的结论可以看出,实际上矩阵是一个投影矩阵,其将梯度投影到以为法向量的平面(投影后的向量为)。作者指出,之前就有研究工作证明,梯度投影会起到将权重限制在一个超平面上(或称为黎曼流形),而GC便具有这样的能力。从下面的图中可以形象地看出,时刻权重的更新方向总是在一个特定的超平面上,而这个超平面是由决定的,即权重的更新方向一直处于该超平面上(),其实是由初始权重和法向量决定,可由下面的推导得到:将公式中的调整到等号左边,等式两边再同时左乘,利用上面的结论,得,不断做同样的推理可得。这说明在训练中一直是个常量。从数学角度解释的话,具有GC的优化过程是带有对权重约束条件的优化过程:
输出(激活值)空间正则化
对于使用GC的SGD优化器,对于任意输入,权重具有下面的性质(详细证明见原论文):
该性质说明,当某层(卷积层或全连接层)的输出发生常量的强度变化(constant intensity change)时,经过权重计算后产生的输出变化只与初始权重和标量有关(为缩放过的初始权重向量的均值)。当初始权重很小的时候,该变化就会很小,那么输出特征空间对训练样本变化具有一定的鲁棒性(不理解怎样的(噪声)变化会是样子的?)。而实际上,不管是从头训练还是从ImageNet预训练模型开始训练,初始化的参数都是很小的,所以基本可以肯定GC具有对输出空间正则化的效果。
加快训练作用
之前的文献已经证明,BN和WS都具有可以平滑化优化参数空间路径的作用,从而使得训练更加稳定,即起到加速训练的作用。而有关BN和WS的文献指出, BN和WS的权重梯度和海森矩阵分别具有上界和,这样的上界导致原始的损失函数具有更好的Lipschitz性质,从而使得优化过程更加平滑。作者证明GC也具有这样的性质(具体证明见原论文):
以上性质说明GC也具有加速训练的作用。
另外,作者还指出GC还具有梯度裁剪的作用,从而可以抑制梯度爆炸。
实验效果
作者在不同的视觉任务上做了全面实验,从而验证GC的有效性:
Mini-ImageNet上验证加速训练和提高测试集泛化的作用
CIFAR100上验证不同优化器和不同网络上的有效性
CIFAR100上验证不同的超参配置上的有效性
大型数据集ImageNet上验证加速训练和提高测试集泛化的作用
细粒度分类数据集上验证有效性
对象检测和分割上验证有效性
从数据上看,GC在检测和分割上的表现并不是很出色,当然这也和任务的难度有关。