昨天完成了SMBO的迁移学习,现在记录一下具体做了哪些修改,方便以后复盘。

首先是在resource_manager.py中,调用from dsmac.runhistory.runhistory_db import RunHistoryDB的ORM类做数据库迁移。

修改了dsmac.runhistory.runhistory.RunHistory#get_incumbent,取最优解的时候加了等于当前instance的限制条件。

dsmac.optimizer.ei_optimization.LocalSearch#_get_initial_points,做近邻搜索的部分。configs_previous_runs表示之前搜索过的点,然后在这些点附近做近邻搜索。对于这些点同样加上了instance限制条件。

最后就是dsmac.intensification.intensification.Intensifier#intensify函数了。
首先在dsmac/intensification/intensification.py:191这里加了对于challenger是否存在runhistory中instance为当前instance的判断。

对于dsmac.intensification.intensification.Intensifier#_race_challenger函数,dsmac/intensification/intensification.py:371有个for循环有点诡异,删除了,后面try代码块中的表达式也做了相应的修改。

每次迭代完在dsmac/intensification/intensification.py:239这个地方都会打印个信息,其中有个run多少的信息,是从这来的:

inc_runs = run_history.get_runs_for_config(incumbent)

这个是什么意思呢,可以理解为对于当前最优解,从运行历史中取出所有config_id相同的RunKey。

在当前做了迁移学习重构的系统中,可以理解为:

1: 最优解第一次出现
2: 最优解第二次出现
类推


突然有了个idea,关于SMBO迁移学习的。
学习器在小样本上run了A,B,C … Z 这26个样本点,结果分别是p1,p2,…,p26

现在要将小样本的经验迁移到大样本上。从小样本中采样足够数量的样本,在大样本上对这些采样的超参(样本点)再run一次,假设是ABC,表现是p1,p2,p3

然后做一个线性回归,然后对小样本的数据进行修正。最后做一下数据库迁移,搞定