目录

  • 1. 引言
  • 2. 数学定义
  • 3. 一种求解思路
  • 4. 具体计算过程示例
  • 5. 其他参考资料
  • 小结



1. 引言

   最近看的论文涉及到了双层规划问题的求解,双层规划问题其实是一种特殊的优化问题。考虑这样一个场景,我们国家建设了很多铁路,站在国家的角度,一定程度是要最大化铁路的收益;而铁路的收益离不开使用者的消费,也就是我们普通人在出行时需要买票,那么站在个人的角度,一般情况下我们是会选择费用最低的出行方案。那么如何在保证普通人消费最低的情况下实现总体铁路收益最大化呢?

   双层规划问题就是指这种优化问题:目标函数中的一组变量被约束为另一优化问题的最优解;更简单来说,就是一个优化问题的参数受限于另外一个优化问题,这两个问题相互影响。

   因为我最近使用双层规划问题的场景是在机器学习中,具体讲是训练网络的过程中优化超参数(例如学习率、正则项的系数),因此本文的内容限于机器学习中的双层规划。

 

2. 数学定义

python 双层规划模型 双层规划模型例题_梯度下降

其中:

  • python 双层规划模型 双层规划模型例题_python 双层规划模型_02
  • python 双层规划模型 双层规划模型例题_梯度下降_03:内部优化问题的目标函数(inner objection function)
  • python 双层规划模型 双层规划模型例题_梯度下降_04:外部变量/超参数(outer variable/hyper parameter)
  • python 双层规划模型 双层规划模型例题_梯度下降_05:内部变量(inner variable)

解释:

  1. 针对上述公式,我们的最终目的其实是求python 双层规划模型 双层规划模型例题_python 双层规划模型_02 的最小值,但它其中的一个参数(python 双层规划模型 双层规划模型例题_python 双层规划模型_07)是关于另外一个问题python 双层规划模型 双层规划模型例题_梯度下降_03解的函数;
  2. 上面的目标函数F和L可以通俗理解为训练网络的时候使用的损失函数,比如说网络预测值与真实值差值的平方和;
  3. 在机器学习中有一类应用是通过双层规划问题来优化超参数,超参数优化问题的基本思想是在给定一个度量标准的情况下,使用验证集构建一个超参数的响应函数(eg:验证集上的平均损失),然后在超参数空间寻找最优解;
  4. 在2的这种情况下,一般外部目标函数python 双层规划模型 双层规划模型例题_python 双层规划模型_02是基于验证集的,而内部目标函数python 双层规划模型 双层规划模型例题_梯度下降_03是基于训练集的。这样设置的一个直观的解释是:内部目标函数通过采用训练集样本不断优化内部变量,也就是不断优化网络各层的参数python 双层规划模型 双层规划模型例题_机器学习_11;而外部目标函数则通过采用验证集样本不断优化外部变量,也就是优化超参数。(这里先不用纠结如何进行优化,后续会详细介绍);

 

3. 一种求解思路

   求解双层规划问题是比较困难的,因为内部优化问题一般很难找到其闭和解(也称为解析解–>存在严格的公式,给定x就能求出y)。

   一种求解双层规划问题的思路是:

  • 固定外层超参数,优化内层参数:将内部优化问题的求解看做是一个迭代优化的过程,使用梯度下降或者其各类变体算法近似求解内层目标函数的解,即使用公式(2)进行多次梯度下降优python 双层规划模型 双层规划模型例题_梯度下降_05,假设经过T次梯度下降后,得到内层优化问题的一个近似解python 双层规划模型 双层规划模型例题_python 双层规划模型_13
    python 双层规划模型 双层规划模型例题_梯度下降_14
  • 固定内层参数,优化外层超参数:在获得内层近似解之后,针对外层,也采用梯度下降优化超参数:计算外层目标函数对超参数python 双层规划模型 双层规划模型例题_梯度下降_04的导数(称之为超梯度),如公式(3);然后更新超参数,如公式(4)。
    python 双层规划模型 双层规划模型例题_优化问题_16
    python 双层规划模型 双层规划模型例题_优化问题_17
  • 上述两个过程一般会进行多次迭代,具体在不同的应用中可以设置不同的循环停止条件,例如根据early stoping,或者根据训练误差和验证误差的关系。

 

4. 具体计算过程示例

[1]Franceschi, L., Donini, M., Frasconi, P., & Pontil, M. (2017). Forward and reverse gradient-based hyperparameter optimization. arXiv preprint arXiv:1703.01785.

  双层规划问题有多种不同的求解方法,即使是根据本文第3部分描述的求解思路,也有具体不同的实现方式,这里呈现的计算过程是根据上述引用的论文[1]进行整理的,其整体思路是基于反向自动微分。
  为了与上文进行符号统一,我修改了[1]中的符号表示,这其实并不影响对算法的理解;此外,论文[1]中针对内部优化使用的是带动量的梯度下降,为了简化理解,我采用了最简单的梯度下降。
  注意: (1)根据论文[1],这里的超参数python 双层规划模型 双层规划模型例题_梯度下降_04就等于内部梯度下降过程中的学习率python 双层规划模型 双层规划模型例题_梯度下降_04;在论文[1]中,作者使用的是带动量的梯度下降,因此它的超参数包括两个,当我简化为最基本的梯度下降后,超参数就变成了学习率;(2)也就是在下面4.1和4.2中,python 双层规划模型 双层规划模型例题_优化问题_20


4.1 先给出算法

python 双层规划模型 双层规划模型例题_梯度下降_21

其中:

  • python 双层规划模型 双层规划模型例题_优化问题_22
  • python 双层规划模型 双层规划模型例题_梯度下降_23
  • python 双层规划模型 双层规划模型例题_python 双层规划模型_24

最后计算出:

  • python 双层规划模型 双层规划模型例题_优化问题_25

4.2 推导细节

1.给定初始的内部梯度下降参数的初始值:python 双层规划模型 双层规划模型例题_机器学习_26 和初始超参数值python 双层规划模型 双层规划模型例题_梯度下降_27(在这里也等于python 双层规划模型 双层规划模型例题_梯度下降_28)

2.固定外层超参数python 双层规划模型 双层规划模型例题_梯度下降_27,优化内层python 双层规划模型 双层规划模型例题_python 双层规划模型_30
python 双层规划模型 双层规划模型例题_机器学习_31

3.得到python 双层规划模型 双层规划模型例题_python 双层规划模型_32 后,我们认为内层优化问题已经找到了近似解,然后将固定内层参数,优化外层超参数:
(1) 优化外层超参数的第一步是求外层目标函数对超参数的超梯度:
   我们先考虑一般的情况:
python 双层规划模型 双层规划模型例题_优化问题_33
   然后由于我简化了论文[1],也就是超参数python 双层规划模型 双层规划模型例题_机器学习_34 ,因此公式(10)将简化为:
python 双层规划模型 双层规划模型例题_python 双层规划模型_35

python 双层规划模型 双层规划模型例题_梯度下降_36的计算是比较复杂的,因为python 双层规划模型 双层规划模型例题_python 双层规划模型_37python 双层规划模型 双层规划模型例题_python 双层规划模型_38python 双层规划模型 双层规划模型例题_梯度下降_27的函数,而python 双层规划模型 双层规划模型例题_python 双层规划模型_38又是python 双层规划模型 双层规划模型例题_机器学习_41python 双层规划模型 双层规划模型例题_梯度下降_27的函数,以此类推,直到python 双层规划模型 双层规划模型例题_优化问题_43,因此求python 双层规划模型 双层规划模型例题_梯度下降_36是一个嵌套的过程,因此根据链式法则,考虑python 双层规划模型 双层规划模型例题_梯度下降_45
python 双层规划模型 双层规划模型例题_梯度下降_46
   令python 双层规划模型 双层规划模型例题_python 双层规划模型_47,则公式(12)可以进一步表示为:
python 双层规划模型 双层规划模型例题_python 双层规划模型_48
   所以,公式(11)可以根据公式(13)进一步展开:
python 双层规划模型 双层规划模型例题_python 双层规划模型_49
  其中python 双层规划模型 双层规划模型例题_机器学习_50python 双层规划模型 双层规划模型例题_python 双层规划模型_51的定义见公式(6)和(7);在公式(14)的每一步展开中,含有python 双层规划模型 双层规划模型例题_python 双层规划模型_52的一项是不确定的,因为python 双层规划模型 双层规划模型例题_梯度下降_53总是依赖于python 双层规划模型 双层规划模型例题_python 双层规划模型_54,这一项直到python 双层规划模型 双层规划模型例题_python 双层规划模型_55才算展开结束;不过含有python 双层规划模型 双层规划模型例题_python 双层规划模型_51的一项是可以确定的;因此在4.1节展示的算法中,每次都是在总的梯度python 双层规划模型 双层规划模型例题_优化问题_57中加上公式(14)中含有python 双层规划模型 双层规划模型例题_python 双层规划模型_51的项,然后利用python 双层规划模型 双层规划模型例题_机器学习_50不断展开python 双层规划模型 双层规划模型例题_python 双层规划模型_52,直到当python 双层规划模型 双层规划模型例题_python 双层规划模型_55时计算出总的梯度。

(2)优化外层超参数的第二步是根据计算出的超梯度更新超参数,如公式(4)所示;

4.经过上述2和3,内层和外层参数都经过了一轮更新,是否需要循环进行2和3以及其停止条件需要根据具体应用进行设置。比如在我近期学习的论文中,作者根据early stopping决定外部优化的停止条件,根据训练误差和泛化误差的关系决定内部优化的停止条件。

 

5. 其他参考资料

关于反向自动微分:
https://stats.stackexchange.com/questions/224140/step-by-step-example-of-reverse-mode-automatic-differentiation

python 双层规划模型 双层规划模型例题_机器学习_62

小结

1.被双层规划以及超参数优化“折磨”了好久,终于能自己比较清晰的整理出一个思路。不过感觉写的还不是很好,还达不到让没接触过的人看起来不费劲的效果。下次要尝试怎么整理的更简单一些~

2.发现越是自己觉得简单的知识点越是弄不明白,在推导公式(14)的时候有好几次分不清梯度和偏导数,还翻出了微积分的课本,被自己傻到~数学太差啦,是时候把机器学习老师推荐的书翻出来啦hhh

要继续加油哇~