虽然我还没有完全理解优化
算法,我喜欢它会对我有很大帮助。
首先,我先简单介绍一下这一部分。
贝叶斯优化方法旨在处理探索与利用的权衡多臂老虎机问题 https://en.wikipedia.org/wiki/Multi-armed_bandit。在这个问题中,有一个unknown函数,我们可以在任何点进行评估,但每次评估都会产生成本(直接惩罚或机会成本),目标是使用尽可能少的试验找到其最大值。基本上,权衡是这样的:你知道有限点集中的函数(其中一些是好的,一些是坏的),所以你可以尝试当前局部最大值周围的区域,希望能够改进它(利用),或者你可以尝试一个全新的空间区域,这可能会好得多,也可能会差得多(探索),或者介于两者之间。
贝叶斯优化方法(例如 PI、EI、UCB)使用高斯过程 https://en.wikipedia.org/wiki/Gaussian_process(GP),并在每一步根据 GP 模型选择最“有前途”的点(请注意,“有前途”可以通过不同的特定方法进行不同的定义)。
这是一个例子:
真正的函数是f(x) = x * sin(x)
(黑色曲线)开启[-10, 10]
间隔。红点代表每次试验,红色曲线是GPmean,蓝色曲线是平均值加或减一标准差。
正如您所看到的,GP 模型并不与所有地方的真实函数匹配,但优化器很快就识别出了周围的“热门”区域-8
并开始利用它。
如何设置关于深度的贝叶斯优化
网络?
在这种情况下,空间由(可能经过变换的)超参数定义,通常是多维单位超立方体。
例如,假设您有三个超参数:学习率α in [0.001, 0.01]
,正则化器λ in [0.1, 1]
(都是连续的)和隐藏层大小N in [50..100]
(整数)。优化空间是一个3维立方体[0, 1]*[0, 1]*[0, 1]
。每个点(p0, p1, p2)
在这个立方体中对应于一个三位一体(α, λ, N)
通过以下变换:
p0 -> α = 10**(p0-3)
p1 -> λ = 10**(p1-1)
p2 -> N = int(p2*50 + 50)
我想优化的功能是什么?是不是成本
N epoch 后的验证集?
正确,目标函数是神经网络验证准确性。显然,每次评估都是昂贵的,因为它至少需要几个时期的训练。
另请注意,目标函数是随机,即对同一点的两次评估可能略有不同,但这并不是贝叶斯优化的障碍,尽管它明显增加了不确定性。
留兰香是这项任务的良好起点吗?任何其他
对这项任务的建议?
薄荷 https://github.com/kuz/caffe-with-spearmint是一个很好的库,你绝对可以使用它。我也可以推荐hyperopt http://hyperopt.github.io/hyperopt/.
在我自己的研究中,我最终编写了自己的小型库,基本上有两个原因:我想编写精确的贝叶斯方法来使用(特别是,我发现了一个投资组合策略 https://arxiv.org/pdf/1009.5419.pdf在我的例子中,UCB 和 PI 的收敛速度比其他任何东西都快);另外还有另一种技术可以节省高达 50% 的训练时间,称为学习曲线预测 http://aad.informatik.uni-freiburg.de/papers/15-IJCAI-Extrapolation_of_Learning_Curves.pdf(这个想法是当优化器确信模型的学习速度不如其他领域时跳过完整的学习周期)。我不知道有任何库实现了这个,所以我自己编码了它,最终它得到了回报。如果您有兴趣,代码是在 GitHub 上 https://github.com/maxim5/hyper-engine.