当社の機械学習ラボでは、数多くの高性能マシンで何万時間ものトレーニングを行って豊富な経験を蓄積してきました。このプロセスで、多くの知識を学んだのはコンピュータだけではありません。実は、私たち研究者も多くの間違いを犯し、多くの脆弱性を修正してきました。 この記事では、私たち自身の経験(主に TensorFlow に基づく)に基づいて、ディープ ニューラル ネットワークをトレーニングするための実用的なヒントをいくつか紹介します。これらのヒントのいくつかは、あなたにとっては馴染み深いものかもしれませんが、他の人にとってはそれほど明確ではないかもしれません。また、提案の中には、特定のタスクには当てはまらないものや、不適切なアドバイスになるものもあるため、注意して使用してください。 これらはよく知られた方法であり、私たちは巨人の肩の上に立っています。この記事の目的は、実際にそれらをどのように使用するかを高レベルでまとめることです。 一般的なヒント ADAM オプティマイザーを使用します。これは非常にうまく機能し、通常の勾配降下法のような従来の最適化ツールよりも ADAM を使用することを推奨します。 TensorFlow 環境で ADAM を使用する場合は、次の点に注意してください。モデルの重みを保存および復元する場合は、AdamOptimizer を設定した後に Saver を設定することを忘れないでください。ADAM にも復元する必要がある状態 (つまり、各重みに対応する学習率) があるためです。 ReLU は、Sublime が最高のテキスト エディターであるのと同じように、最高の非線形性 (活性化関数) です。しかし、正直に言うと、ReLU は最も高速かつ簡単に実行でき、驚くべきことに、動作中に勾配が消失することはありません (したがって、勾配消失を防ぎます)。シグモイドはよく使われる活性化関数ですが、DNN で勾配を伝播させる場合にはうまく機能しません。 出力層では活性化関数を使用しないでください。これは明らかなことですが、各レイヤーを共通関数から構築すると、簡単に間違いを犯す可能性があります。出力レイヤーでアクティベーション関数を使用しないようにしてください。 各レイヤーにバイアス項を追加します。これは機械学習の基本です。基本的に、バイアス項は平面を最も適合する位置に変換します。式 y=mx+b において、b は直線を最適な位置まで上下に移動できるようにするバイアス項です。 分散スケーリングを使用して初期化されます。 TensorFlow では、このメソッドは tf.contrib.layers.variance_scaling_initializer() として記述されます。私たちの実験によると、この初期化方法は、通常のガウス分布初期化、切り捨てガウス分布初期化、および Xavier 初期化よりも優れた一般化/スケーリング パフォーマンスを備えています。大まかに言えば、分散スケール初期化は、各レイヤーの入力または出力の数 (TensorFlow ではデフォルトで入力数) に基づいて初期ランダム重みの分散を調整し、勾配クリッピングやバッチ正規化などの他のトリックを必要とせずに、信号がネットワークのより深いところまで伝播できるようにします。 Xavier は、分散スケーリング初期化に似ていますが、Xavier の各層の分散はほぼ同じです。ただし、ネットワークの層のスケールが非常に異なる場合 (畳み込みニューラル ネットワークでは一般的)、これらのネットワークは各層の同じ分散を適切に処理できない可能性があります。 入力データを白色化(正規化)します。トレーニング中、サンプル ポイントの値はデータセットの平均から減算され、その標準偏差で除算されます。ネットワークの重みがあらゆる方向に伸びたり拡張したりする量が少ないほど、ネットワークの学習は速く簡単になります。データ入力を平均中心に保ち、分散を一定に保つことで、これを実現できます。また、各テスト入力に対して同じ正規化プロセスを実行する必要があるため、トレーニング セットが実際のデータに類似していることを確認してください。 ダイナミック レンジを適切に維持する方法で入力データをスケーリングします。この手順は正規化に関連していますが、正規化操作の前に実行する必要があります。たとえば、現実の世界では、[0, 140000000] の範囲のデータ x は通常、「tanh(x)」または「tanh(x/C)」を使用して操作できます。ここで、C は、tanh 関数の動的に傾斜した (傾きが大きい) 部分で、より広い入力範囲にわたってデータを適合させるために曲線を伸ばす定数です。特に、入力データが関数の一方または両方の端で制限されていない場合、データが (0,1) にあるときにニューラル ネットワークはより適切に学習します。 通常は学習率の減衰は使用しません。確率的勾配降下法 (SGD) では学習率を下げるのが一般的ですが、ADAM ではこれが自然に考慮されます。モデルのパフォーマンスを本当に最大にしたい場合は、トレーニングの終わり近くに短期間学習率を下げます。すると、突然、エラーがわずかに減少しますが、その後、再び平坦になります。 畳み込み層に 64 個または 128 個のフィルターがある場合は、これで十分です。特にディープネットワークの場合、128 個のフィルターは多すぎます。すでに多数のフィルターがある場合は、さらに追加してもパフォーマンスが向上しない可能性があります。 プーリングは変換不変性のためです。プーリングにより、ネットワークは本質的に画像の「特定の部分」の「一般的な概念」を学習できるようになります。たとえば、プーリングは、畳み込みネットワークが画像内の特徴の移動、回転、およびスケーリングに対して堅牢であるのに役立ちます。 ニューラルネットワークのデバッグ ネットワークの学習が不十分な場合 (つまり、トレーニング中にネットワークの損失/精度が収束しない、または期待する結果が得られない)、次のヒントを試すことができます。 オーバーフィット! ネットワークがうまく学習していない場合は、まず 1 つのトレーニング データ ポイントをオーバーフィットする必要があります。精度は基本的に 100% または 99.99% に達するか、誤差が 0 に近くなるはずです。ニューラル ネットワークがデータ ポイントをオーバーフィットできない場合は、モデル アーキテクチャに重大な問題がある可能性がありますが、その問題は非常に微妙なものである可能性があります。 1 つのデータ ポイントにオーバーフィットできるが、より大きなセットでトレーニングしても収束できない場合は、次の提案を試してください。 学習率を下げます。ネットワークの学習は遅くなりますが、ステップ サイズを大きくすると、これまで見つけられなかった最小値を見つけられる可能性があります。 (直感的に、道路脇の溝を歩いているところを想像してみてください。溝の最も深い部分、つまりモデルの誤差が最も小さくなる部分を歩きたいのです。) 学習率を上げます。これにより、トレーニングがスピードアップし、フィードバック ループが強化されます。つまり、ネットワークが機能しているかどうかを大まかにすぐに把握できるということです。これにより、ネットワークはより速く収束するはずですが、トレーニング結果はあまり良くない可能性があり、「収束」状態は実際には繰り返し振動する可能性があります。 (ADAM オプティマイザーを使用する場合、多くの実験シナリオでは ~0.001 が適切な学習率であると考えています。) (ミニ)バッチ処理のサイズを縮小します。バッチ サイズを 1 に減らすと、重みの更新に関するよりきめ細かいフィードバックが得られるため、TensorBoard (またはその他のデバッグ/視覚化ツール) で視覚化する必要があります。 バッチ正規化レイヤーを削除します。そうすると、バッチ サイズを 1 に減らしたときに、勾配が消失したり爆発したりするなどの問題が発生します。数週間にわたって収束しないネットワークに遭遇したことがあります。バッチ正規化レイヤー (BN レイヤー) を削除した後、2 回目の反復の出力がすべて NaN であることに気付きました。ここでバッチ正規化レイヤーを使用することは、止血帯が必要な傷に絆創膏を貼るようなものです。バッチ正規化は効果的ですが、ネットワークにバグがないことが確実な場合に限られます。 (小さな)バッチ処理のサイズを大きくします。より大きなバッチ サイズを使用すると (それが十分でない場合は、可能であればトレーニング セット全体を使用することもできます)、勾配更新の分散が低減され、各反復の精度が向上します。言い換えれば、重みの更新は正しい方向に進んでいます。しかし、その効果には上限があり、物理的なメモリ制限もあります。この提案は、一般的に、前の 2 つの提案 (バッチ サイズを 1 に減らす、バッチ正規化レイヤーを削除する) よりも役に立たないことがわかりました。 マトリックスの形状変更を確認します。大規模な行列の再構築 (画像の X、Y 次元の変更など) は空間の局所性を破壊し、ネットワークが再構築も学習する必要があるため、ネットワークの学習をより困難にします。 (自然の特徴は断片化されます。自然の特徴が空間的にローカルであるという事実は、畳み込みニューラル ネットワークが非常に効果的な理由です!) 複数の画像/チャネルを使用して再構築する場合は注意してください。numpy.stack() を使用して適切に配置してください。 損失関数を再確認してください。複雑な関数を扱っている場合は、それを L1 や L2 のような形式に簡略化してみることができます。 L1 は外れ値に対してそれほど敏感ではなく、ノイズの多いバッチやトレーニング ポイントに遭遇したときにわずかに調整できることが分かりました。 可能であれば、視覚化を再確認してください。視覚化ライブラリ (matplotlib、OpenCV など) はデータ値を拡大縮小したり、クリップしたりしますか? 視覚的に均一な配色の使用を検討してください。 ケーススタディ 上記のプロセスをよりわかりやすくするために、構築した畳み込みニューラル ネットワークを説明する実際の回帰実験から得られた損失グラフ (TensorBoard で視覚化) をいくつか示します。 最初、ネットワークは何も学習しません。 データ値が範囲を超えないようにクリップします。 これらの平滑化されていない値がいかにおかしいか見てください。学習率が高すぎますか? 学習率を下げて、入力データセットでトレーニングしてみましょう。 学習率の最初の数回の変化がどこで発生するかを確認できます (約 300 および 3000 のトレーニング ステップ)。明らかに、ここでは学習率を急速に下げすぎています。したがって、学習率の減衰時間を長くすると、パフォーマンスが向上します(損失が低くなります)。 2000ステップ目と5000ステップ目で学習率が低下していることがわかります。これは改善されましたが、損失が 0 まで下がっていないため、まだ完璧ではありません。 次に、学習率の減衰を停止し、tanh 関数を使用して入力値をより狭い範囲に移動してみます。これにより、明らかに誤差は 1 未満になりますが、トレーニング セットをオーバーフィットすることはできません。 ここで、バッチ正規化レイヤーを削除すると、ネットワークは 1 回または 2 回の反復後にすぐに NaN を出力することがわかります。バッチ正規化を無効にし、初期化方法を分散スケーリングに変更しました。これが大きな違いです。1 つまたは 2 つの入力のみを含むテスト セットにオーバーフィットできます。ただし、下のグラフでは Y 軸がクリップされています。初期のエラー値は 5 よりはるかに高く、エラーが 4 桁近く減少したことを意味します。 上のプロットは非常に滑らかですが、テスト入力に非常に早く過剰適合し、時間の経過とともにトレーニング セット全体の損失が 0.01 未満に低下することがわかります。このプロセスでは学習率は低下しません。その後、学習率を 1 桁下げてトレーニングを継続し、さらに良い結果を達成しました。 はるかに良い結果です。しかし、トレーニングを 2 つの部分に分割するのではなく、学習率を幾何級数的に下げるとどうなるでしょうか? 各ステップで学習率を 0.9995 倍にするのはあまりうまく機能しません。 これはおそらく、学習率が急速に低下したためと思われます。乗数は 0.999995 の方が良いですが、結果は減衰なしとほぼ同じになります。この特定の一連の実験から、バッチ正規化によって不適切な初期化によって生じた勾配爆発が隠され、学習率を下げても、*** での意図的に設計された学習率低下を除いて、ADAM オプティマイザーに特に役立たないという結論に達しました。バッチ正規化と同様に、値をクリッピングすると実際の問題が隠されてしまいます。また、tanh関数を使用して分散の高い入力値を制御します。 これらの基本的なヒントが、ディープ ニューラル ネットワークの構築に慣れる上で役立つことを願っています。多くの場合、大きな違いを生むのは単純なことです。 [この記事は51CTOコラム「Machine Heart」、WeChatパブリックアカウント「Machine Heart(id:almosthuman2014)」によるオリジナル翻訳です] この著者の他の記事を読むにはここをクリックしてください |
<<: ビジネス界がディープラーニングの導入に消極的である4つの理由
誰もが美を愛しますが、誰もが生まれながらに美しさを持っているわけではないので、さまざまな種類の写真美...
ベクトル データベースは、LLM と外部情報の間のブリッジとして機能し、生成 AI システムの基本機...
コード補完機能は IDE では非常に一般的です。優れたコード自動補完機能により、作業効率が大幅に向上...
建設業界の市場競争はますます激しくなっています。建設会社は生き残りと発展のために大きなプレッシャーに...
この記事は、公開アカウント「Reading the Core」(ID: AI_Discovery)か...
モノのインターネットは膨大な量のデータを生成します。そのデータは、都市が事故や犯罪を予測するのに役立...
執筆者 | Mo Yan & Yun Zhao 「国家チーム」テンセント渾源モデルがついに本...
1. ミュージックXRメーカーMusic XR Makerは、テンセントミュージック初のオーディオお...
国内の科学技術イノベーション主体はいずれも「中核技術を自主的に掌握し、外国の独占を打ち破る」という目...
アップルに3年間在籍した後、同社の機械学習担当ディレクターのイアン・グッドフェロー氏が突然辞任を発表...
感情分析または意味分析は、構造化されていないテキスト内の感情や意見を識別するプロセスです。テキストは...