通过损失函数优化提高训练速度、准确性和数据利用率

论文: Improved Training Speed, Accuracy, and Data Utilization Through Loss Function Optimization

简介

该论文的主要贡献是提出了Genetic Loss-function Optimization (GLO) 框架来搜索新的损失函数。该框架可以分成层两个如下图示的两个阶段:

  • 搜索loss函数的形式:比如 [公式]
  • 优化loss函数的系数:即优化上面例子中的[公式]这三个系数,其中[公式]分别表示真实和预测值。

搜索损失函数

GLO使用population-based的进化搜索策略,损失函数被编码成树结构。树节点上的操作从如下的搜索空间总进行搜索:

  • Unary operators: [公式]
  • Binary operators: [公式]
  • Leaf nodes: [公式], 其中[公式]分别表示真实和预测值。

这三类操作的权重比例是: Unary : Binary : leaf= 3 : 2 : 1

搜索过程中出现如下情况的树,其fitness会被赋值为0

  • 一颗树中不同时包含至少有一个x和y
  • 模型训练过程中出现NaN

Crossover

树结构的crossover的方式是对于给定的两个parent trees, 分别随机选择一个节点作为crossover point。那么以crossover point作为根节点可以得到两个subtrees。那么crossover其实就是按照一定概率交换这两个subtrees, 论文中给出的概率是80%。

如下图示,上面两个是parent trees,红色直线截取位置的节点即为crossover point,在crossover之后即可得到下面的树结构。

Mutation

Mutation操作如下:

优化损失函数系数

搜索到损失函数表达式后,每个节点的系数都默认为1,如下图示。很显然需要优化系数数等于节点数,但是其实通过表达式简化可以减少需要优化的系数数,比如 [公式],原本需要优化3个系数,现在只需要优化一个了。具体的优化算法采用的是 协方差矩阵自适应进化算法(CMA-ES) [1],论文里对这个算法没有细节的介绍,建议看看这个博文,写的浅显易懂。

实验评估

论文中采用了MNIST和CIFAR-10作为测试数据集,并且将搜索到的损失函数命名为 Baikal,意思是贝加尔湖,文中的解释是因为它的形状像贝加尔湖hhh,函数表达式如下:

[公式]

使用CMA-ES算法搜索到的系数如下:

[公式]

其中[公式]

在MNIST数据集上的平均实验结果(10个模型)如下:

  • Testing accuracy
Loss functionAccuracy
Crossentropy 0.9899
Baikal 0.9933
BaikalCMA 0.9947
  • Training speed

  • Training data requirements

  • 迁移至CIFAR-10的结果

分析:为什么Baikal损失函数更优?

为了方便分析为什么Baikal损失函数效果更好,这里以二分类为例进行介绍

[公式]

下图展示了[公式]时Baikal损失函数2D可视化,可以看到当预测值趋近于真实值(即1)的时候,交叉熵损失单调递减;而对于Baikal函数,当预测值非常接近于真实值的时候,loss值反而会上升,这可能有点反直觉,但是这样的好处时可以避免模型对自己的预测太过于自信,因此也可以理解成一种正则化。

参考文献

  • [1] N. Hansen and A. Ostermeier, “Adapting arbitrary normal mutation distributions in evolution strategies: The covariance matrix adaptation,” in Proceedings of IEEE international conference on evolutionary computation.IEEE, 1996, pp. 312–317.

微信公众号:AutoML机器学习

MARSGGBO♥原创
如有意合作或学术讨论欢迎私戳联系~
邮箱:marsggbo@foxmail.com
2020-11-18 09:03:50

原文地址:https://www.cnblogs.com/marsggbo/p/14317883.html