2016-05-26 7 views
11

回帰問題のためにTensorflowとAdamOptimizerを使った非常に簡単なANNがあります。今はすべてのハイパーパラメータをチューニングする時点です。ニューラルネットワークのハイパーパラメータをどのように調整する必要がありますか?

  • 学習率:

    は今のところ、私は私が調整する必要があり、多くの異なるハイパー見た初期学習率、レート崩壊学習をAdamOptimizerは4つの引数が必要

  • (学習レート、ベータ1、ベータ2 、イプシロン)ので、我々は調子にそれらを必要とする - の反復
  • ラムダL2-正則化パラメータ
  • の少なくともイプシロン
  • バッチサイズ
  • NBニューロンの
  • 数、層数
  • 出力層のための隠れ層のための活性化関数の種類、
  • ドロップアウトパラメータ

私は2つの質問があります。

1)あなたがいます私が忘れてしまったかもしれない他のハイパーパラメータを見ますか?

2)今のところ、私のチューニングはかなり「マニュアル」であり、私はすべてを適切な方法でやっていないとは確信していません。 パラメータを調整する特別な命令はありますか?たとえば、学習率を最初に、次にバッチサイズを、次に... これらのパラメータがすべて独立しているかどうかは確かではありません。実際には、一部のパラメータが独立しているとは確信しています。どちらが明確に独立しており、どちらが明らかに独立していないのですか?それらを一緒に調整すべきか? すべてのパラメータを特別な順序で適切にチューニングすることについて話し合っている論文や記事はありますか?

EDIT: ここでは、さまざまな初期学習率、バッチサイズ、および正則化パラメータについて得られたグラフを示します。紫色のカーブは私のために完全に奇妙です...コストはゆっくりと他のものと比べて下がりますが、精度は低くなります。モデルが極小に詰まっている可能性はありますか? LR(t)はLRI/SQRT(エポック)あなたの助けを

感謝を=:学習率については

Accuracy

Costは、私は崩壊を使用しました! ポール

+0

こんにちはPaul、なぜLRI/sqrt(epoch)を学習率減衰として使うのだろうか?私は 'epoch_0'を' 'LRI/max(epoch_0、epoch)''を使用しています。私は' 'epoch_0''を崩壊を開始したい時代に設定していますが、分母の2乗根をとると、あなたがやる。あなたはその学習率の衰退のための参照を持っていますか、それとも多かれ少なかれ自分自身を思い付いたのですか? – HelloGoodbye

+0

こんにちは@HelloGoodbye! アダムオプティマイザ(https://arxiv.org/pdf/1412.6980.pdf)の記事では、定理4.1の収束を証明するために、ラーニングレートに平方根減衰を使用しています。 –

答えて

2

あまり重要でないパラメータの場合は、妥当な値を選択してそれに固執するだけです。

あなたが言ったように、これらのパラメータの最適値はすべて互いに依存しています。最も簡単なことは、各ハイパーパラメータの値の合理的な範囲を定義することです。次に、各範囲のパラメータをランダムにサンプリングし、その設定でモデルをトレーニングします。これを何度も繰り返し、最高のモデルを選んでください。あなたが運が良ければ、どのようなハイパーパラメータ設定が最も効果的かを分析し、そこからいくつかの結論を出すことができます。

+0

あなたの答えをありがとう! したがって、すべてのハイパーパラメータの値をランダムに選択し、それぞれを個別にチューニングするよりも、チューニングする方が良いでしょうか? –

+0

はい。あなたが知っているいくつかのハイパーパラメータがそれほど重要でない限り。それらの場合は、値を選択して残りの部分を最適化するだけです。たとえば、人々は2つのレイヤーとシグモイドアクティベーションを任意に使用することを決めた後、各レイヤーのサイズを最適化することができます。 – Aaron

+0

ありがとう!初期学習率、正規化パラメータ、バッチサイズの値のランダム化の選択から得たグラフを追加しました。私はなぜモデルがそのような低い精度で立ち往生するのか理解できません... –

3

テンソルボードを実行してください。そこにエラーをプロットしてください。 TBがプロットするデータを探すパスにサブディレクトリを作成する必要があります。私はスクリプトでそのサブディレクトリの作成を行います。だから私はスクリプト内のパラメータを変更し、そこに名前を付けて実行し、すべての試行を同じチャートにプロットします。あなたはすぐにグラフとデータの最も効果的な設定を感じるでしょう。

+0

ありがとう!同じTensorboardウィンドウに異なるグラフを表示できるかどうかはわかりませんでした。たとえそれが私の最初の質問にかなり答えなくても、そのように見えます。 –

5

私の一般的な順序は次のとおりです。

  1. バッチサイズ、それは主に将来の実験のトレーニング時間に影響を与えるだろうと。ネットワークの
  2. アーキテクチャ:ネットワーク内のニューロンの
    • 数層の
    • 番号
  3. レスト(ドロップアウト、L2のREG等)

依存性:

私は、最適なva

  • の梅毒ニューロンと層

の数の

  • 数は互いに強く依存ニューロンの割合と数を学習率とバッチサイズ
  • を学びます。私はその分野の専門家ではない。あなたのハイパーパラメータについては

    :アダム・オプティマイザについては

    • : "紙での推奨値はEPSある= 1E-8、ベータ1 = 0.9、ベータ2 = 0.999。" (source
    • アダムとRMSPropの学習率については、ほとんどの問題に対して0.001程度の値が最適であることがわかりました。
    • Adamの代わりに、RMSPropを使用することもできます.RMSPropは、メモリ使用量を最大33%削減します。詳細は、this answerを参照してください。
    • 初期重量値を調整することもできます(All you need is a good initを参照)。しかし、Xavierイニシャライザは、体重を調整するのを防ぐための良い方法と思われます。
    • 私は、反復/エポックの数をハイパーパラメータとして調整しません。検証エラーが収束するまでネットを訓練する。しかし、私は各実行に時間予算を与えます。
  • +0

    RMSpropは、 'beta1 = 0'のAdamOptimizerとほぼ同等です。 (AdamOptimizerは最初はRMS項のバイアスを補正しますが、バイアスと補正の両方が十分なトレーニングステップの後にゼロに近づきます) –

    +0

    @CharlesStaats入力していただきありがとうございます! AdamsとRMSpropの違いを検索すると、私はこれを発見しました:http://cs231n.github.io/neural-networks-3/#ada "このアップデートは、"スムーズな "バージョンを除いてRMSPropアップデートと正確に見えることに注意してください勾配ベクトルdxの代わりに、勾配ベクトルmの代わりに勾配ベクトルmが使用されています(eps = 1e-8、beta1 = 0.9、beta2 = 0.999)。 RMSPropよりもわずかに優れています。 あなたは正しいです。私は今からアダムを使用します。 –

    0

    テンソルフローに固有のツールはありませんが、学習率0.01、0.001、weight_decay 0.005、0.0005などの基本的なハイパーパラメータから始めてください。そしてそれらを調整してください。手動で行うには多くの時間がかかりますが、caffeを使用している場合は、入力値のセットからハイパーパラメータを取得し、最適なセットを提供する最適なオプションです。最初

    層の数についてはhttp://fastml.com/optimizing-hyperparams-with-hyperopt/

    が、私はあなたが何をする提案された小さなネットワークを作成し、データを増やす:

    https://github.com/kuz/caffe-with-spearmint

    詳細については、あなたにも、このチュートリアルに従うことができます十分なデータが得られたら、モデルの複雑さを増やしてください。

    関連する問題