使用贝叶斯优化的深度学习结构超参数优化

Hyperparameter optimization for Deep Learning Structures using Bayesian Optimization

我已经构建了一个用于原始信号分类任务的 CLDNN(卷积、LSTM、深度神经网络)结构。

每个训练 epoch 运行大约 90 秒,超参数似乎很难优化。

我一直在研究优化超参数的各种方法(例如随机或网格搜索)并发现了贝叶斯优化。

虽然我对优化算法还没有完全理解,但我喜欢它会对我有很大帮助。

我想问几个关于优化任务的问题。

  1. 如何针对深度网络设置贝叶斯优化?(我们要优化的成本函数是什么?)
  2. 我要优化的功能是什么?是N个epoch后验证集的代价吗?
  3. 留兰香是这项任务的良好起点吗?对于此任务还有其他建议吗?

非常感谢任何对此问题的见解。

Although I am still not fully understanding the optimization algorithm, I feed like it will help me greatly.

首先,让我简单说明一下这部分。 贝叶斯优化方法旨在处理 multi-armed bandit problem 中的探索-开发权衡。在这个问题中,有一个 unknown 函数,我们可以在任意点对其进行评估,但是每次评估都有成本(直接惩罚或机会成本),目标是找到它的最大值 as尽可能少的试验。基本上,权衡是这样的:你知道有限点集中的函数(其中一些是好的,一些是坏的),所以你可以尝试当前局部最大值周围的区域,希望改进它(开发),或者您可以尝试 space 的全新区域,它可能更好或更差(探索),或介于两者之间。

贝叶斯优化方法(例如 PI、EI、UCB),使用 Gaussian Process (GP) 构建目标函数的模型,并在每一步选择最 "promising" 点基于它们GP模型(注意"promising"可以通过不同的特定方法定义不同)。

这是一个例子:

真正的函数是f(x) = x * sin(x)(黑色曲线)在[-10, 10]区间。红点代表每次试验,红色曲线是 GP 平均值,蓝色曲线是平均值加减一标准差。 如您所见,GP 模型并非处处都与真实函数匹配,但优化器相当快地识别出 -8 周围的 "hot" 区域并开始利用它。

How do I set up the Bayesian Optimization with regards to a deep network?

在这种情况下,space 由(可能转换的)超参数定义,通常是多维单位超立方体。

例如,假设您有三个超参数:学习率 α in [0.001, 0.01]、正则化器 λ in [0.1, 1](均为连续)和隐藏层大小 N in [50..100](整数)。优化的space是一个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)

What is the function I am trying to optimize? Is it the cost of the validation set after N epochs?

正确,目标函数是神经网络验证精度。显然,每次评估都是昂贵的,因为它至少需要几个 epoch 进行训练。

另请注意,目标函数是随机,即对同一点的两次评估可能略有不同,但这不是贝叶斯优化的障碍,尽管它明显增加了不确定性.

Is spearmint a good starting point for this task? Any other suggestions for this task?

spearmint is a good library, you can definitely work with that. I can also recommend hyperopt.

在我自己的研究中,我最终编写了自己的小型库,主要有两个原因:我想编写精确的贝叶斯方法来使用(特别是,我发现了一个 portfolio strategy of UCB and PI converged faster than anything else, in my case); plus there is another technique that can save up to 50% of training time called learning curve prediction (the idea is to skip full learning cycle when the optimizer is confident the model doesn't learn as fast as in other areas). I'm not aware of any library that implements this, so I coded it myself, and in the end it paid off. If you're interested, the code is on GitHub.