通过损失函数优化提高训练速度、准确性和数据利用率
论文: Improved Training Speed, Accuracy, and Data Utilization Through Loss Function Optimization
简介
该论文的主要贡献是提出了Genetic Loss-function Optimization (GLO) 框架来搜索新的损失函数。该框架可以分成层两个如下图示的两个阶段:
- 搜索loss函数的形式:比如 $loss(x,y)=a \cdot x^2 + b \cdot x\cdot y^2+ c$
- 优化loss函数的系数:即优化上面例子中的$a,b,c$这三个系数,其中$x,y$分别表示真实和预测值。

搜索损失函数
GLO使用population-based的进化搜索策略,损失函数被编码成树结构。树节点上的操作从如下的搜索空间总进行搜索:
- Unary operators: $log(o), o^2, \sqrt{o}$
- Binary operators: $+, -, \times, \div$
- Leaf nodes: $x,y,1,-1$, 其中$x,y$分别表示真实和预测值。
这三类操作的权重比例是: 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 (5x+y)=15x+3y$,原本需要优化3个系数,现在只需要优化一个了。具体的优化算法采用的是 协方差矩阵自适应进化算法(CMA-ES) [1],论文里对这个算法没有细节的介绍,建议看看这个博文,写的浅显易懂。

实验评估
论文中采用了MNIST和CIFAR-10作为测试数据集,并且将搜索到的损失函数命名为 Baikal,意思是贝加尔湖,文中的解释是因为它的形状像贝加尔湖hhh,函数表达式如下:
\[\mathcal{L}_{\text {Baikal }}=-\frac{1}{n} \sum_{i=0}^{n} \log \left(y_{i}\right)-\frac{x_{i}}{y_{i}} \\\]使用CMA-ES算法搜索到的系数如下:
\[\mathcal{L}_{\text {BaikalCMA }}=-\frac{1}{n} \sum_{i=0}^{n} c_{0}\left(c_{1} * \log \left(c_{2} * y_{i}\right)-c_{3} \frac{c_{4} * x_{i}}{c_{5} * y_{i}}\right) \\\]其中$c_{0}=2.7279, c_{1}=0.9863, c_{2}=1.5352, c_{3}=-1.1135, c_{4}=1.3716, c_{5}=-0.8411$
在MNIST数据集上的平均实验结果(10个模型)如下:
- Testing accuracy
| Loss function | Accuracy |
|---|---|
| Crossentropy | 0.9899 |
| Baikal | 0.9933 |
| BaikalCMA | 0.9947 |
- Training speed

- Training data requirements

- 迁移至CIFAR-10的结果

分析:为什么Baikal损失函数更优?
为了方便分析为什么Baikal损失函数效果更好,这里以二分类为例进行介绍
\[\begin{align} \mathcal{L}_{\text {Baikal2D }}&=-\frac{1}{2}\left(\log \left(y_{0}\right)-\frac{x_{0}}{y_{0}}+\log \left(y_{1}\right)-\frac{x_{1}}{y_{1}}\right) \\ \overset{x_1=1-x_0}{\Longrightarrow}&\propto-\log \left(y_{0}\right)+\frac{x_{0}}{y_{0}}-\log \left(1-y_{0}\right)+\frac{1-x_{0}}{1-y_{0}} \end{align} \\\]下图展示了$x_0=1$时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