一、来源
梯度中心化是来自论文:Gradient Centralization: A New Optimization Technique for Deep Neural Networks
二、方法
对每个batch样本的梯度去中心化(grad-mean(grad)。该方法可以适当提高模型的泛化能力和梯度下降的效率。其原始理念来源于batchnorm。
三、tensorflow中的应用
该方法在tensorflow中的应用代码,我没有找到确切的大牛代码。我自己根据tensorflow的语法写了一个,大家可以作为参考。经本人测试,该方法虽然没有出现论文中的好效果,但是可以稍微降低损失函数,以及加快损失函数的下降速度。
下面将Gradient Centralization运用于MomentumOptimizer优化器,其他的优化方法加入的代码也是一样的。
optimizer = tf.train.MomentumOptimizer(learning_rate=config.training.learningRate,momentum=0.1)
gradsAndVars = optimizer.compute_gradients(transformer.loss)
mean_grad = tf.zeros(())
for grad, var in gradsAndVars:
mean_grad += tf.reduce_mean(grad)
mean_grad /= len(gradsAndVars)
grads_and_vars = [(grad-mean_grad, var) for grad, var in gradsAndVars]
trainOp = optimizer.apply_gradients(gradsAndVars, global_step=globalStep)