贝叶斯优化理论学习

贝叶斯优化流程:

  1. 选定代理模型

    • 代理模型:就是一个对真实目标事物模拟(黑盒函数/真实世界的实验/被模拟的函数)的一个算法或者模型,输入到输出的映射,可以是机器学习模型、神经网络、高斯过程函数等等
  2. 获取不确定性

    • 对于代理函数的输出要有不确定性数据,例如: 期望和方差
  3. 使用采集函数查找下一个优化点

    • 使用代理模型的输出和不确定性数据,来计算下一个优化点在哪里
  4. 优化点值的计算

    • 对目标事物执行计算

      • 例如:

        • 实验:把找到的优化参数,代入化学实验,做实验,得到实验结果
        • 被拟合的真实函数或黑盒函数:把得到的优化点 X,代入黑盒函数 f(x), 求出结果 y
  5. 把输出结果(X,y)和其他训练数据代入代理模型训练,开启下一轮贝叶斯优化

贝叶斯优化组件:

  1. 概率代理模型(probabilistic surrogate model)

    • 实际包括两个小模型

      1. 先验概率 模型(prior)

        • p(Bi)
      2. 观测模型

        • 作用:模拟真实目标函数
        • 即: 似然分布 p(A|Bi), (likelihood)
        • 即各处参数 X,可以评估得到结果 y
  2. 采集函数(acquisition function)

    • 使用了后验概率分布
    • 作用:

      • 根据 后验概率 (posterior)计算下一个最合适的样本采集点

        • 注:后验概率可以通过
    • 后验概率

      • P(Bi|A)
      • 已知结果 A,是输入事件 Bi 的概率
  3. 真实函数的执行(采样)

    • 采集函数计算出 采样点 后,执行真实函数计算

贝叶斯优化需由考虑的问题:

  1. 不确定区域的探索和已知区域有更好结果的区域探索(挖黄金例子)

挖黄金例子解析

参考:

辨析两个任务目标

  1. 探查黄金在地底的分布曲线

    • 目标:整个曲线的模拟
    • 适合场景: 类似主动学习
  2. 探查哪里黄金最多

    • 不需要知道所有位置的黄金分布密度
    • 只关心哪里黄金最多,即:最优点(最大值点)搜索
    • 目标:最优先搜索
    • 适合场景: 贝叶斯优化

相关词汇

  1. Active learning

    • 主动学习
  2. 序贯决策

    • 即,动态决策
  3. 似然

  4. 概率

    • probability
    • 概率是在特定环境下某件事情发生的可能性,也就是结果没有产生之前依据环境所对应的参数来预测某件事情发生的可能性。
  5. 全概率公式

    • 根据子事件的概率和子事件下复杂时间的条件概率,求复杂事件的全概率
  6. 贝叶斯概率公式(条件概率)

    • 作用:

      • 知道结果,求原因(由果求因)
    • 参考:

    • 根据全概率,求复杂事件下子事件的条件概率
    • 复杂事件(A),是已知结果
    • 子事件 (Bi),是可能的原因
    • P(Bi), 是原因发生的概率, 也叫做 先验概率
    • P(A|Bi) 是原因发生的条件下,结果发生的概率, 也叫 似然
    • P(A), 总概率(全概率公式可以求出)
    • P(Bi|A), 已知结果,原因发生的概率,也叫做 后验概率
  7. 共轭分布

  8. 输入空间

    • 子事件 B 的取值范围
  9. 观测空间

    • 复杂事件 A 的取值范围
  10. 超参数空间
  11. 先验概率

    • 子事件概率 P(B)
    • 英语: prior
  12. 后验概率

    • P(B|A)
    • 英语: posterior
  13. 采集函数

    • acquisition function
    • 贝叶斯优化的采集函数
    • 作用:

      • 用来评估一个点是否是,最想要评估的点(挖黄金例子:挖掘探测)
    • 特点:

      • 每次“探测”后都要“更新”采集函数
  14. 概率代理模型

    • 一个贝叶斯模型
    • 作用:

      • 一个用来表示每个点的不确定性
      • 用来模拟真实目标函数
    • 特点:

      • 每次“探测”后都要“更新”模型
  15. argmax 函数

    • 作用:

      • 求当目标函数 $\alpha(x)$ 取得最大值时,自变量 x 的点集
  16. CDF

    • cumulative distribution function (概率)累计分布函数
  17. PDF

    • probability distribution(density) function 概率(密度)分布函数
  18. 高斯过程

  19. 协方差

  20. 方差

    • variance
  21. 偏差

    • bias

深度学习算法 + 贝叶斯优化

bayesian-optimization, bayes_opt 库使用说明

使用方法(流程)

自动探测

写一个自动执行黑盒函数的方法,探索过 minimize() 自动开始优化,找到最大的 (X,ymax)

  1. 使用 optimzer.minimize(init_points, n_tries)

全手动 suggest + evaluate + register 流程

参考:

流程:

  1. suggest: 生成探测点,获得 X

    • 注意:第一次 suggest 时,因为没有缓存的数据,不会发生高斯过程训练,第二次以后会触发 高斯过程训练
  2. evaluate: 手动执行获取结果 y

    • 执行黑盒函数,y = blackbox_fun(X)
    • 手动做实验, 使用实验参数 X 做实验,获得结果 y
  3. register: 把探测的结果 (X, y) 注册到 optimizer

离散型输入参数处理方法

内部高斯过程模型调参

采集函数 acquisition_function 的选择

参考:

  1. ucb 函数(置信上界, upper confident bound):

    • 偏向开发:kappa = 0.1 –> exploitation
    • 偏向探索:kappa = 10 –> exploration
  2. ei 函数(期望提升, expected improvement)

    • 偏向开发: xi =0 (1e-4)
    • 偏向探索: xi = 0.1
  3. poi 函数(Probility of Improvement)

    • 偏向开发: xi =0 (1e-4)
    • 偏向探索: xi = 0.1

探测点的获取

两种方式:

  1. 使用 init_points 创建的,存储在 optimizer._queue 中的点

    • 注意:这些点没有被存放在 optimizer._space._params 中, 在调用 optimizer.probe(params) 之后才会存储到 self._space._params 和 self._space._target 中
  2. 通过采集函数获取的点,获得方法: optimizer.suggest(acquisition_function)

    • 作用:

      • 如果 optimizer._space.params 不为空(即有训练数据)

        1. 把现有的所有数据( _space._params, _space._target),用来训练高斯过程模型
        2. 使用 采集函数概率代理模型(高斯过程) 生成下一个最优的探测点

          • 调用了 bayes_opt.util.acq_max(...) 函数选择最最优点
      • params 为空:

        • 随机生成一个 target_function 的输入参数(一个 params)

optimizer, BayesianOptimization 类,优化器

init_points 参数

作用:

  • 用来创建 init_points 个随机产生的输入参数点 self._space._params

注意:

  • init_points 指定的个数通过 self._prime_que(init_points) 来创建 params

    • 但是这些 params 还没有被执行,需要使用 self.probe(param) 来获取对应的 target

用到的地方:

1
2
3
4
optimizer.maximize(
    init_points=2,
    n_iter=3,
)

_queue 探测点队列

作用:

  • 存储用来探测的数据点
  • lazy 模式下:

    • self.probe(x_probe) 存起来的点

数据来源:

  • init_points 参数规定,并使用 self._space 随机生成的

optimizer.probe(x_probe)

x_probe: 就是各个地方说的 params, 给一个店的输入参数

作用:

  • 调用 self._space.probe(x_probe)

    • 黑盒函数执行,获取对应的结果 (target)
    • 把(params, target)(一个点的 X,y)存储到 self._space 保存起来

optimizer.suggest()

作用:

  1. 如果 optimizer._space 生成随机输入参数点(params) 中没有存储 params, 生成一个看
  2. 如果 optimizer._space 己经存储了参数点(一般是 optimzer.probe(params) 存进去的)

    1. 训练一遍高斯过程函数, optimzer._gp
    2. 获取下一个 取得最大值的 params

      • 搜索 params 定义域

        • acq_max() 函数
        • 高斯过程训练好的模型
        • 采集函数
        • ymax
        • params bounds 等
      • acq_max 搜索 target 取最大值的 params 的方法

        • 使用了两种方法搜索取得 target 最大的的 params

          1. 在定义域使用均匀分布获取 n_warmup(默认 10000) 个随机值

            • 通过 aquisition_function 计算比较求得最大值
          2. 通过 scipy.optimize.minimize(acquisition_function) 寻找最大值

            • 通过尝试 n 个 随机 x0, 找 n 次

TargetSpace

optimizer._space: 用来存储参数的 pbounds 和 target_function 等信息

属性:

  • target: target_function 输出值
  • param: target_function 输入参数
  • target_function: 黑盒函数

方法:

  • self._as_array(params: dict) -> array
  • self.probe(params: dict) -> target_value

    • 黑盒函数执行把 params 作为输入参数执行,并加入到 self._params, self._target 中,用来做训练
  • self.__len__:

    • 长度,存储的数据点的数量

作用:

  1. 更具 pbounds(上下限), target(参数的名称)等信息生成随机入参数据点