生の信号分類タスク用にCLDNN(たたみ込み、LSTM、ディープニューラルネットワーク)構造を構築しました。
各トレーニングEpochは約90秒間実行され、ハイパーパラメーターを最適化するのは非常に難しいようです。
私はハイパーパラメーターを最適化するさまざまな方法(ランダム検索やグリッド検索など)を研究しており、ベイズ最適化について知りました。
私はまだ最適化アルゴリズムを完全には理解していませんが、それが非常に役立つようにフィードします。
最適化タスクについていくつか質問したいと思います。
この問題についての洞察をいただければ幸いです。
私はまだ最適化アルゴリズムを完全には理解していませんが、それが非常に役立つようにフィードします。
まず、この部分について簡単に説明しましょう。ベイジアン最適化手法は、 多腕バンディット問題 での探査と開発のトレードオフに対処することを目的としています。この問題には、unknown関数があり、任意の時点で評価できますが、各評価コスト(直接ペナルティまたは機会コスト)、および目標は、できるだけ少ない試行を使用してその最大値を見つけることです。基本的に、トレードオフは次のとおりです。ポイントの有限セット(いくつかは良いものと悪いものがあります)で関数を知っているので、現在の極大値の周りの領域を試し、改善することを期待できます(活用)。または、完全に新しい領域を試すこともできます。これは、潜在的にはるかに良くなるか、はるかに悪くなる(探索)、またはその中間になる可能性があります。
ベイジアン最適化メソッド(PI、EI、UCBなど)は、 ガウスプロセス (GP)を使用してターゲット関数のモデルを構築し、各ステップでGPモデルに基づいて最も「有望な」ポイントを選択します( 「有望」は、特定の方法によって異なる方法で定義できることに注意してください)。
次に例を示します。
真の関数は、_[-10, 10]
_間隔でのf(x) = x * sin(x)
(黒い曲線)です。赤い点は各試行を表し、赤い曲線はGP平均、青い曲線は平均プラスまたはマイナス1標準です偏差。ご覧のとおり、GPモデルはどこでも真の機能と一致していませんが、オプティマイザは_-8
_の周りの「ホット」領域をかなり迅速に特定し、それを利用し始めました。
ディープネットワークに関してベイジアン最適化を設定するにはどうすればよいですか?
この場合、空間は(変換された可能性のある)ハイパーパラメーター、通常は多次元単位のハイパーキューブによって定義されます。
たとえば、学習率_α in [0.001, 0.01]
_、正規化子_λ in [0.1, 1]
_(両方連続)、および非表示レイヤーサイズ_N in [50..100]
_(整数)の3つのハイパーパラメーターがあるとします。最適化のためのスペースは、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エポック後の検証セットのコストですか?
正しい、ターゲット関数はニューラルネットワーク検証の精度です。明らかに、トレーニングには少なくともいくつかのエポックが必要であるため、各評価にはコストがかかります。
また、ターゲット関数はstochasticであることに注意してください。つまり、同じ点に対する2つの評価はわずかに異なる場合がありますが、ベイズ最適化のブロッカーではありませんが、明らかに不確実性が増加します。
スペアミントはこのタスクの良い出発点ですか?このタスクに関する他の提案はありますか?
spearmint は優れたライブラリであり、間違いなくそれで作業できます。 hyperopt もお勧めします。
私自身の研究では、基本的に2つの理由で、自分の小さなライブラリを作成することになりました:使用する正確なベイズ法をコード化したかった(特に、UCBとPIの ポートフォリオ戦略 が速く収束することを発見しました)他の何よりも、私の場合);さらに、トレーニング時間を最大50%節約できる別のテクニック 学習曲線予測 と呼ばれるものがあります(アイデアは、オプティマイザがモデルが次のように速く学習しないと確信している場合、完全な学習サイクルをスキップすることです)その他の地域)。私はこれを実装するライブラリーを知らないので、自分でコーディングし、最終的には成果を上げました。興味があれば、コードは GitHub上 です。