多くの場合、あなたは深い学習トレーニングモデル、それを使用して結果を改善する方法を尋ねましたか?そして、すべての無知な力は、まず、私はあまり理解して、第二は、あまりの実験ではない、3つのメモリは忘れていません。だから、自分自身の経験のいくつかを記録するために、このブログだけでなく、他の人の書き込み。
イリヤSutskever(ヒントン学生)の深さ洞察力や実用的なアドバイスを学びます:
データ収集:高品質の入力/出力データ・セットを確認する必要があり、データセットが十分に大きいと代表ラベルが比較的明確に持っています。データセットの欠如は、成功することは困難です。
前処理:集中化されたデータは、つまり、非常に重要であるゼロ平均データを作成するために、各次元の各変化が1になるように。入力はソートの大きさ順に変更したときに時々、それは(1 + X)をログ寸法を使用するのが最適です。基本的には、信頼できる寸法コーディングと0値の自然境界を見つけることが重要です。そうすることで、より良い仕事することを学ぶことができます。WIJの変更\ propto XIDL / dyj(xは重量yを層から層へ表しwは、Lは損失関数である):重みが式で更新されるので、このようなは、ケースです。xが多く(例えば100)を意味している場合、更新された重みが非常に大きくなり、学習が貧しいと遅くなりますされ、相互に関連しています。ゼロ平均と小さな分散を維持することは重要な成功要因です。
バッチ:のみ、今日のコンピュータにおける学習サンプルの各実装は非常に非効率的です。128バッチの一例である一方、効率が大幅に、その出力の非常に印象的である改善されます。実際にだけでなく、オーバーフィッティング低減しながら性能を向上させるために利用可能であるだけでなく、バッチ1のオーダーの効果を使用する;これは大規模なバッチを超えてなりやすいです。非効率的とオーバーフィッティング過度にそこにつながる可能性があるため、しかし、あまりにも大規模なバッチを使用しないでください。だから私のアドバイスは次のとおりです。彼らの手段に従って、適切なハードウェア構成のバッチスケールを選択して、より効率的に。
正規化された勾配:勾配はバッチの大きさに応じて分割します。バッチが(あまりない、どのような場合には)学習率を変えずに、乗算(または縮小倍)場合ので、良いアイデアです。
料金プランを学習:ノーマルサイズの学習率(LR)は縮小の終わりに向かって始めたから。
1LR典型的な値は0.1であり、驚くべきことに、ニューラルネットワークの問題の多数のために、0.1は、良好な学習率値です。通常、小さな学習率ではなく、大きなを好みます。
ときに停止すると(たとえば、検証エラーがセットされると増加し始めた場合など)、学習率の訓練を軽減する時期を決定するために、トレーニングセットせずにトレーニングのコレクション-バリデーションセットを使用してください。
練習は、料金プランを学ぶお勧めします:それは検証セットのボトルネック発見された場合、継続し、その後、2(または5)で割ったLRに望むことができます。最後に、LRも訓練を停止する時間である、非常に小さくなります。これは、被害の性能検証は、あなたが収まらない時にトレーニングデータを(またはオーバーフィット)ことを保証します。LRが正しいアプローチであるバリデーションセットによって制御され、LRを低減することが重要です。
しかし、最も重要なことは、学習率に焦点を当てることです。一部の研究者は、方法(例えばアレックスKrizhevskyなど)、ノルムを用いると重量ノルム間の比の更新値を監視しています。比の値は約10 3です。値が小さすぎる場合には、学習は非常に遅くなり、値が大きすぎる場合、学習は非常に不安定になり、さらには失敗します。
重みの初期化。無作為研究の開始時に初期化重みをご覧ください。
あなたが怠惰になりたい場合は、0.02 *関数randn(num_params)をしてみてください。この範囲の値は、さまざまな問題に適しています。もちろん、小さい(またはそれ以上)の値も試してみる価値があります。
それがうまく機能した場合(例えば、型にはまらない、および/または非常に深いニューラルネットワークアーキテクチャ)は、各重み行列を初期化するために/ SQRT(layer_width)*関数randnをinit_scale使用する必要があります。この場合、init_scaleは1又は0.1、又は同様の値に設定されるべきです。
深さとサイクルネットワークは、ランダムな初期化は非常に重要です。うまく処理されない場合は、何も学んでいないように、それが見えます。我々は条件が設定されると、ニューラルネットワークは学習、ということを知っています。
興味深い話:何年もの間、研究者はSGDがランダムに初期化の深さから、ニューラルネットワークを訓練することができないと信じていました。それぞれの試みは失敗に終わりました。浅いネットワーク上の実際にはほとんど価値が非常にうまく動作しますが、ネットワークの深さのパフォーマンスが良くありませんが恥ずかしい、彼らは、理由は初期化するための「小さなランダム重み」を使用することで成功しませんでした。ネットワークが非常に深い場合、重み行列の間の数の積になり、結果が拡大されていません。
それは浅いネットワークである場合でも、SGDは、私たちは、この問題を解決することができます。
だから、心配初期化が必要です。異なる初期化の様々なを試してみてください、努力が報われる。ネットワークが完全に動作しない場合(すなわち、実施形態ではない)、ランダムな初期化を改善し続けて正しい選択です。
あなたは、ハードの制約ノルムを使用して(勾配がバッチサイズで分割されている覚えている)の勾配に、RNNやLSTMを訓練している場合。私の個人的な実験では15のまたは5ような制約と同じようにうまく動作します。バッチのサイズで割って、それが15以上(または5)のための規範だかどうかを確認グラデーションしてください。それがない場合は、15(または5)に削減されます。遊びRNNとLSTMトレーニングで重要な役割は、そうしていないこの小さなトリックは、爆発的な勾配が失敗したことを学習につながる、そして最終的には1E-6学習率ほど小さなと無用を使用していただろう。
勾配の値をチェックします。noすぎたりTheanoトーチ、勾配が手だけを達成した場合。勾配の実現でミスを犯すことは非常に簡単なので、数値勾配のチェックを使用することが不可欠です。そうすることで自分のコードで、あなたが自信を持って行います。(そのような学習率や初期化など)スーパー調整パラメータは非常に貴重なので、良いナイフを賢く使用する必要があります。
あなたがLSTMを使用している場合は、同じ時間は広い範囲でそれらを訓練したいことは問題に依存し、それは忘れられるべきでLSTM偏差マークは、より大きな値に初期化されます。デフォルトでは、入力の全てがマークSタイプを忘れされ、値は忘却マークは、問題の一部のみに有効である0.5に設定され、電力が小さいです。これは初期化さLSTMへの警告です。
データ(データ増強)を増加させる:トレーニング例の数を増加させるためにアルゴリズムを使用する創造的なアプローチです。画像場合は、そのためその回転を変換する必要があり、音声部分が雑音と混合プロセスのすべてのタイプには明らかであるべきである場合。データを追加することは常識のある程度が必要、(画像の処理を除く)技術です。
ドロップアウト:ドロップアウトは、パフォーマンスを向上させるための簡単な方法を提供します。(つまり、1ドロップアウト率)中退率を調整することではなく、ドロップアウトをテストするときに、製品の価値を発見する権利をオフにすることを忘れないでください覚えておいてください。もちろん、ネットワークは少し長く訓練することを確実にします。通常の訓練とは違って、徹底的なトレーニングを入力した後、検証エラーは、通常は増加します。より良い、より良い仕事をする時間をかけてドロップアウトネットワーク、忍耐が鍵となります。
統合(Ensembling)。ニューラルネットワーク10を訓練し、そのデータの平均予想。アプローチはシンプルですが、それはより直接的かつ大幅なパフォーマンス向上を得ることができます。平均的には非常に効果的である理由一部の人々は不思議に思われるかもしれませんか?これは、実施例により説明されるかもしれない:正しい率が高いままである場合、70%の2分類誤り率場合、前記予測が正しい結果の平均に近いであろう。結果が間違っているとき、ネットワークが信頼できるない、信憑性の結果であるとき、この効果は、信頼できるネットワークのためのより顕著です。
(以下の点は、上記の簡易版です)