ニューラルネットワークが学習しない場合はどうすればよいですか?


147

ニューラルネットワークをトレーニングしていますが、トレーニングの損失は減りません。どうすれば修正できますか?

過剰適合や正則化については質問していません。ネットワークのパフォーマンスがトレーニングセットで改善されない問題を解決する方法について質問しています。


この質問は意図的に一般的なものであるため、ニューラルネットワークのトレーニング方法に関する他の質問は、この質問の複製として閉じることができます。釣りをする人、あなたは彼の人生の残りの間彼を養うことができる 議論については、このメタスレッドを参照してください。「私のニューラルネットワークが機能しないので、修正してください」という質問に答える最良の方法は何ですか?

ニューラルネットワークが一般化されていない場合は、次を参照してください:ニューラルネットワークが一般化されていない場合はどうすればよいですか?


1
NNが進行できなかった場合を次に示します。youtu.be/iakFfOmanJU?t=144
ジョシュア

4
Ivanovのブログ「Neural Networkが機能しない理由」、特にセクションII、III、IVが役立ちます。
user5228

回答:


187

ユニットテストはあなたの友達です

作家の中には「すべての文章は書き直しである」という言葉があります。つまり、文章の大部分は改訂されています。プログラマー(または少なくともデータサイエンティスト)にとって、この表現は「すべてのコーディングがデバッグしている」と言い換えることができます。

コードを書いているときはいつでも、意図したとおりに機能することを確認する必要があります。正当性を検証するために私が見つけた最良の方法は、コードを小さなセグメントに分割し、各セグメントが機能することを検証することです。これは、セグメントの出力を正しい答えであることがわかっているものと比較することで実行できます。これはユニットテストと呼ばれます。優れたユニットテストを作成することは、優れた統計学者/データ科学者/機械学習の専門家/ニューラルネットワークの実践者になるための重要な要素です。単に代替品はありません。

ネットワークのパフォーマンスを調整する前に、コードにバグがないことを確認する必要があります!それ以外の場合は、RMS Titanicでデッキチェアを再配置することもできます。

ニューラルネットワークには、検証を他のタイプの機械学習や統計モデルよりもさらに重要にする2つの機能があります。

  1. ニューラルネットワークは、ランダムフォレストまたはロジスティック回帰のように「既製の」アルゴリズムではありません。単純なフィードフォワードネットワークの場合でも、ネットワークの構成、接続、初期化、最適化の方法について多数の決定を行うのはユーザーの責任です。これはコードを書くことを意味し、コードを書くことはデバッグを意味します。

  2. 例外を発生させずにニューラルネットワークコードを実行した場合でも、ネットワークにバグがある可能性があります。これらのバグは、ネットワークが訓練する潜伏的な種類でさえあるかもしれませんが、次善の解決策に行き詰まっているか、または結果として得られるネットワークに必要なアーキテクチャがありません。(これは、構文エラーと意味エラーの違いの一例です。)

チェイス・ロバーツによるこの記事「機械学習コードの単体テスト方法」では、機械学習モデルの単体テストについて詳しく説明しています。この記事からバグのあるコードの例を借りました。

def make_convnet(input_image):
    net = slim.conv2d(input_image, 32, [11, 11], scope="conv1_11x11")
    net = slim.conv2d(input_image, 64, [5, 5], scope="conv2_5x5")
    net = slim.max_pool2d(net, [4, 4], stride=4, scope='pool1')
    net = slim.conv2d(input_image, 64, [5, 5], scope="conv3_5x5")
    net = slim.conv2d(input_image, 128, [3, 3], scope="conv4_3x3")
    net = slim.max_pool2d(net, [2, 2], scope='pool2')
    net = slim.conv2d(input_image, 128, [3, 3], scope="conv5_3x3")
    net = slim.max_pool2d(net, [2, 2], scope='pool3')
    net = slim.conv2d(input_image, 32, [1, 1], scope="conv6_1x1")
    return net

エラーが表示されますか?以前の結果は新しい変数で上書きされるため、さまざまな操作の多くは実際には使用されません。ネットワークでこのコードブロックを使用すると、トレーニングが行われ、重みが更新され、損失が減少する可能性もありますが、コードは意図したとおりに動作していません。(著者は一重引用符または二重引用符の使用についても一貫性がありませんが、それは純粋に文体的です。)

ニューラルネットワークに関連する最も一般的なプログラミングエラーは次のとおりです。

  • 変数は作成されますが、使用されることはありません(通常はコピーアンドペーストエラーのため)。
  • 勾配更新の式は正しくありません。
  • 重みの更新は適用されません。
  • 損失関数は正しいスケールで測定されません(たとえば、クロスエントロピー損失は確率またはロジットの観点から表現できます)
  • 損失は​​タスクに適切ではありません(たとえば、回帰タスクにカテゴリクロスエントロピー損失を使用する)。

歩く前にクロールします。走る前に歩く

広くて深いニューラルネットワーク、およびエキゾチックな配線を備えたニューラルネットワークは、現在の機械学習のホットなものです。しかし、これらのネットワークは完全に存在するようにはなりませんでした。彼らのデザイナーは、より小さなユニットからそれらを構築しました。最初に、単一の非表示層で小さなネットワークを構築し、それが正しく機能することを確認します。次に、モデルの複雑さを段階的に追加し、それぞれが同様に機能することを確認します。

  • レイヤー内のニューロン少な すぎると、ネットワークが学習する表現が制限され、適合不足が発生します。ニューロンが多すぎると、ネットワークがトレーニングデータを「記憶」するため、過剰適合を引き起こす可能性があります。

    問題をモデル化するのに必要なニューロンの数が数学的に少ないことを証明できたとしても、「もう少し」ニューロンがあると、オプティマイザーが「適切な」構成を見つけやすくなります。(しかし、これがなぜそうなのか、だれも完全に理解しているとは思いません。)ここでXOR問題のコンテキストでこの例を提供します。

  • 隠れ層の数を選択すると、ネットワークは生データから抽象化を学習できます。ディープラーニングは最近大流行しており、多数の層を持つネットワークは印象的な結果を示しています。ただし、多くの隠れ層を追加すると、リスクが過剰になり、ネットワークの最適化が非常に難しくなります。

  • 賢いネットワーク配線を選択すると、多くの作業を行うことができます。あなたのデータソースは特殊なネットワークアーキテクチャに対応していますか?畳み込みニューラルネットワークは、「構造化された」データソース、画像または音声データで印象的な結果を達成できます。リカレントニューラルネットワークは、自然言語や時系列データなどのシーケンシャルデータタイプでうまく機能します。残留接続は、ディープフィードフォワードネットワークを改善できます。

ニューラルネットワークトレーニングはロックピッキングに似ています

最先端の、あるいは単に良い結果を得るには、連携して動作するように構成されたすべてのパーツをセットアップする必要があります。実際に学習するニューラルネットワーク構成をセットアップすることは、ロックを選択するようなものです。すべてのピースを適切に並べる必要があります1つのタンブラーを適切な場所に配置するだけでは不十分であるように、アーキテクチャのみ、またはオプティマイザーのみを正しくセットアップするだけでも十分ではありません。

構成の選択のチューニングは、ある種の構成の選択(学習率など)が他の選択肢(例:ユニット数)よりも重要であると言うほど単純ではありません。選択は他の場所でされた別の選択と組み合わせてうまくいくことができます

これは、構成オプションの完全なリストであり、正規化オプションや数値最適化オプションでもありません。

これらのトピックはすべて、活発な研究分野です。

非凸最適化は難しい

ニューラルネットワークの目的関数は、隠れユニットがなく、すべての活性化が線形で、設計行列がフルランクの場合にのみ凸型になります-この構成は通常の回帰問題であるためです。

他のすべての場合、最適化の問題は非凸であり、非凸の最適化は困難です。ニューラルネットワークのトレーニングの課題はよく知られています(「ディープニューラルネットワークのトレーニングが難しいのはなぜですか?」を参照)。さらに、ニューラルネットワークには非常に多数のパラメーターがあるため、1次のメソッドのみに制限されます(参照:機械学習でNewtonのメソッドが広く使用されない理由を参照してください)。これは非常に活発な研究分野です。

  • 学習率の設定が大きすぎると、「キャニオン」の一方から他方に跳躍するため、最適化が発散します。この設定が小さすぎると、実際の進行が妨げられ、SGDに固有のノイズが勾配推定を圧倒する可能性があります。

  • グラデーションクリッピングは、しきい値を超えるとグラデーションのノルムを再スケーリングします。これは、通常1.0の設定忘れパラメータだと思っていましたが、0.25に設定することでLSTM言語モデルを劇的に改善できることがわかりました。なぜだか分かりません。

  • 学習率のスケジューリングは、トレーニング中に学習率を低下させる可能性があります。私の経験では、スケジューリングの使用は正規表現によく似ています。1つの問題(「特定のエポック後に継続する学習を取得する方法」)を2つの問題(「特定のエポック後に継続する学習を取得する方法) 「」と「良いスケジュールを選択するにはどうすればよいですか」)。他の人々は、スケジューリングが不可欠であると主張しています。決めさせてあげます。

  • 適切なミニバッチサイズを選択すると、間接的に学習プロセスに影響を与える可能性があります。これは、大きなミニバッチは小さなミニバッチよりも分散(小さくなる傾向があるためです。ミニバッチは、勾配の方向を知るのに十分な大きさでありながら、SGDがネットワークを正規化できるほど小さい必要があります。

  • 確率的勾配降下法には、バニラSGDを改善するために、運動量、適応学習率、Nesterovの更新などを使用する多数のバリアントがあります。より良いオプティマイザーの設計は、非常に活発な研究分野です。いくつかの例:

  • 最初に登場したとき、Adamオプティマイザーは多くの関心を集めました。しかし、最近のいくつかの研究では、勢いのあるSGDがニューラルネットワークの適応勾配法よりも優れていることがわかっています。「機械学習における適応勾配法の限界値」by Ashia C. Wilson、Rebecca Roelofs、Mitchell Stern、Nathan Srebro、Benjamin Recht

  • しかし、他方では、このごく最近の論文は、適応速度法と勢いのあるSGDとの間のギャップを埋めると思われる新しい適応学習速度オプティマイザを提案しています。「深層ニューラルネットワークのトレーニングにおける適応勾配法の一般化ギャップの解消」by Jinghui Chen、Quanquan Gu

    学習勾配を自動的に調整するために履歴勾配情報を採用する適応勾配法は、ディープニューラルネットワークのトレーニングの勢いで確率的勾配降下(SGD)よりも悪いことを一般化することが観察されています。これにより、適応勾配法の一般化のギャップをどのように埋めるかが未解決の問題になります。この作業では、Adam、Amsgradなどの適応勾配法が「過剰適応」される場合があることを示します。部分適応運動量推定法(Padam)と呼ばれる新しいアルゴリズムを設計します。このアルゴリズムは、Adam / AmsgradをSGDと統合して、両方の世界から最高の結果を出します。標準ベンチマークの実験では、PadamがAdam / Amsgradとして高速収束率を維持しながら、ディープニューラルネットワークのトレーニングでSGDを一般化できることを示しています。

正規化

データの規模は、トレーニングに大きな違いをもたらします。

正則化

ネットワークの正則化の選択と調整は、一般化が良好なモデル(つまり、トレーニングデータに過剰適合しないモデル)を構築する重要な部分です。ただし、ネットワークが学習データの損失を減らすのに苦労しているとき(ネットワークが学習していないとき)、正則化は問題の内容を曖昧にする可能性があります。

ネットワークが学習しない場合、すべての正規化をオフにして、正規化されていないネットワークが正しく機能することを確認します。次に、各正則化ピースを追加し直し、それらのそれぞれが途中で機能することを確認します。

この戦術は、一部の正則化が不十分に設定される可能性がある場所を正確に特定できます。いくつかの例は

実験のログブックを保持する

ニューラルネットワークをセットアップするとき、パラメーター設定をハードコーディングしません。代わりに、実行時にネットワーク構成の詳細を読み込むために読み取られ、使用される構成ファイル(JSONなど)でそれを行います。これらの構成ファイルはすべて保持しています。パラメーターを変更する場合は、新しい構成ファイルを作成します。最後に、トレーニングと検証のためのエポックごとの損失すべてをコメントとして追加します。

私が古い結果を保持することに執着している理由は、以前の実験に戻って確認することが非常に簡単になるためです。また、同じ行き止まりの実験を誤って繰り返すことを防ぎます。心理的には、「振り返ってみると、このプロジェクトは今日の望みどおりではないかもしれませんが、週間前と比べて進歩しています。」k

例として、私はLSTM言語モデルについて学びたかったので、他のTwitterユーザーに応答して新しいツイートを書き込むTwitterボットを作成することにしました。大学院と仕事の間の自由時間にこれに取り組みました。約1年かかり、150を超えるさまざまなモデルを繰り返してから、私がやりたいと思っていた(意味のある)新しい英語のテキストを生成するモデルに到達しました。(重要なポイントの1つであり、非常に多くの試行を行った理由の一部は、初期の低損失モデルがトレーニングデータを記憶することができたため、単純に低サンプル外損失を得るだけでは不十分であったことです。そのため、プロンプトへの応答としてテキストの密接なブロックをそのまま再現していました。モデルをより自然に、そして低損失にするために微調整が必​​要でした)


11
たくさんの良いアドバイスがあります。MCMCサンプリングスキームを使用した複雑なモデルのパラメーターの推定や予測のデバッグに関して、私が作成した(または他のユーザーが作成した)コメントにどれだけ多くのコメントが似ているかは興味深いです。(たとえば、コードが正しく実装されていない場合に動作するように見える場合があります。)
グレン_b

11
@Glen_bコーディングのベストプラクティスは、ほとんどの統計/機械学習カリキュラムで十分に強調されているとは思わないので、その点を非常に強調しました。OPが「おお、今はバグを見つけました」というコメントを残したNNの投稿をいくつか見てきました。
Sycorax

7
私はPythonでデータサイエンスのプログラミングコースを教えています。実際、初日に概念と機能のテストを単体で行います。良い戦いを戦う。
マシュードゥルーリー

8
「すべてのコーディングがデバッグ中」の場合は+1。私は、SOの多くのポスターが、コーディングはほとんど労力を必要としない単純な演習であると考えているように思えます。初めて実行したときにコードが正しく機能することを期待している人。そして、それが上手くいかない人は先に進むことができないようです。面白いのは、それらが半分正しいということです。コーディング簡単ですが、プログラミングは難しいです。
ボブジャービス

41

投稿された回答は素晴らしく、過去に私を大いに助けてくれた「Sanity Checks」をいくつか追加したかった。

1)単一のデータポイントでモデルをトレーニングします。これが機能する場合、出力が異なる2つの入力でトレーニングします。

これはいくつかのことを検証します。まず、モデルがデータをオーバーフィットできるかどうかをチェックすることで、モデルが学習できることをすぐに示します。私の場合、私は常にバイナリ予測に対してDense(1,activation='softmax')vs Dense(1,activation='sigmoid')を行うというばかげた間違いを犯し、最初のものはゴミの結果を出します。

モデルが少数のデータポイントをオーバーフィットできない場合、小さすぎる(今日の時代ではありそうにない)か、構造または学習アルゴリズムに何らかの問題があります。

2)最初の損失に注意してください。

バイナリの例を続けると、データが30%0'sと70%1'sの場合、付近の初期の予想される損失です。これは、モデルがランダムな推測に近い状態で開始する必要があるためです。L=0.3ln(0.5)0.7ln(0.5)0.7

多くの場合、6.5などのばかげたものが最初に失われます。概念的には、これは、たとえば0に向かって、出力が大きく飽和していることを意味します。たとえば、なので、1より大きい損失が見られる場合は、モデルは非常に歪んでいます。これは通常、ニューラルネットワークの重みが適切にバランスされていない場合、特にソフトマックス/シグモイドに近い場合に発生します。だから、これはあなたの初期化が悪いかどうかを教えてくれます。0.3ln(0.99)0.7ln(0.01)=3.2

モデルを数千の例で予測し、出力をヒストグラム化することにより、これをさらに学習できます。これは、データが正しく正規化されていることを確認するのに特に役立ちます。例として、出力が0に大きく偏ると予想される場合、予想される出力の平方根を取得して予想される出力(トレーニングデータ)を変換することをお勧めします。これにより、出力で飽和シグモイドの勾配の問題を回避できます。

3)モデル出力を一般化してデバッグする

例として、時系列データから予測を行うためにLSTMを使用していると想像してください。たぶんあなたの例では、あなたは最新の予測のみに関心があるので、LSTMはシーケンスではなく単一の値を出力します。各ステップで予測を返すようにLSTMを切り替えます(ケラで、これはですreturn_sequences=True)。次に、すべてのステップの後に非表示状態の出力を見て、それらが実際に異なることを確認できます。これの用途は、シーケンスをマスクする(つまり、データを同じ長さになるようにパディングする)ときに、LSTMがマスクされたデータを正しく無視するようにすることです。モデル一般化しないと、この問題を見つけることはできません

4)個々のレイヤーを見る

Tensorboardは、レイヤー出力視覚化する便利な方法を提供します。これにより、各レイヤーで入力/出力が適切に正規化されるようになります。また、バグのあるアクティベーションをキャッチすることもできます。また、予測のバッチでケラのレイヤー出力を照会し、アクティブ化が疑わしい(すべて0またはすべて非ゼロ)レイヤーを検索することもできます。

5)より単純なモデルを最初に構築する

問題を解決する最善の方法は、CNNをバウンディングボックス検出器と組み合わせて使用​​し、画像トリミングをさらに処理してから、LSTMを使用してすべてを結合することであると判断しました。GPUがモデルを初期化するのに10分かかります。

代わりに、偽データ(同じ形状)のバッチを作成し、モデルをコンポーネントに分解します。次に、各コンポーネントの代わりにダミーモデルを作成します(「CNN」は、2つの2x2 20ストライドコンボリューション、2つの隠されたユニットのみを備えたLSTMになります)。これは、モデル構造が正しいこと、および余分な問題がないことを確認するのに役立ちます。私はそのようなモデルでしばらく苦労しましたが、簡単なバージョンを試してみると、ケラスのバグのためにレイヤーの1つが適切にマスクされていないことがわかりました。内部モデルレイヤーを簡単に(かつ迅速に)クエリし、グラフが正しく設定されているかどうかを確認できます。

6)前処理およびパッケージバージョンを標準化する

特にニューラルネットワークは、データのわずかな変更に非常に敏感です。例として、2つの人気の画像の読み込みパッケージがあるcv2PIL。JPEG を開くだけで、これらのパッケージはどちらもわずかに異なる画像を生成します。通常、違いはごくわずかですが、この種の要因によりモデルのパフォーマンスが低下する場合があります。また、デバッグが悪夢になります。トレーニング中に検証スコアを取得し、後で別のローダーを使用して、同じDarnデータセットで異なる精度を取得します。

そのため、GitHubから誰かのモデルをダウンロードする場合は、前処理に細心の注意を払ってください。どの画像ローダーを使用しますか?どのような画像前処理ルーチンを使用していますか?画像のサイズを変更するとき、どの補間を使用しますか?最初にサイズを変更してから画像を正規化しますか?またはその逆ですか?RGB画像のチャンネルの順序は何ですか?

パッケージを標準化する最も安全な方法はrequirements.txt、トレーニングシステムのセットアップのように、keras==2.1.5バージョン番号まですべてのパッケージの概要を示すファイルを使用することです。理論的には、トレーニングシステムと同じGPUでDockerを使用すると、同じ結果が得られます。


7
(+1)初期損失を確認することは素晴らしい提案です。回答から除外したことを後悔しています。
Sycorax

7
モデルがオーバーフィットできることを確認するのは素晴らしいアイデアです。私は、過剰適合を弱点として考えることに慣れているので、過剰適合の能力は実際には長所であると(あなたが言及するまで)明確に考えたことはありません。
ジョンコールマン

15

最初からニューラルネットワークをトレーニングしないでください!

すべての答えは素晴らしいですが、言及すべき1つのポイントがあります。あなたのデータから学ぶべきことはありますか?(これは何らかのテストと見なすことができます)。

予測しようとしているラベルが機能から独立している場合、トレーニングの損失を減らすのに苦労する可能性があります。

代わりに、線形回帰、ランダムフォレスト(またはハイパーパラメーターの数が少なく、動作が理解できる任意の方法)のキャリブレーションを開始します。

次に、これらのモデルで適切なパフォーマンスを達成した場合(ランダムな推測よりも優れている場合)、ニューラルネットワークの調整を開始できます(@Sycoraxの答えがほとんどの問題を解決します)。


5
私はこの答えに同意します。ニューラルネットワークおよびその他の形式のMLは、「今とても暑い」です。多くの場合、より単純な形式の回帰は見落とされます。また、モデルの説明になると、誰かがやって来て「結果に対するの影響は何ですか?」と尋ねます。肩をすくめるだけです。機械学習ソリューションは、より単純な手法で失敗した場合にのみ検討してください。xk
インゴリフ

11

基本的に、NN / DNNモデルをトレーニングするための基本的なワークフローはほぼ同じです。

  1. NNアーキテクチャを定義します(いくつのレイヤー、どの種類のレイヤー、レイヤー間の接続、アクティベーション関数など)

  2. いくつかのソース(インターネット、データベース、ローカルファイルセットなど)からデータを読み取り、いくつかのサンプルを見て(インポートが正常に行われたことを確認するため)、必要に応じてデータクリーニングを実行します。このステップは、人々が通常想定しているほど簡単ではありません。その理由は、DNNの場合、通常、より標準的な非線形パラメトリック統計モデル(理論的にはNNはこのファミリーに属します)に適合する場合、従来よりも数桁大きい巨大なデータセットを扱うためです。

  3. 何らかの方法でデータを正規化または標準化します。NNは非線形モデルであるため、データの正規化は、数値の安定性だけでなく、トレーニング時間、およびNN出力にも影響を与える可能性があります(正規化などの線形関数は、非線形階層関数と交換できません)。

  4. トレーニング/検証/テストセット、または交差検証を使用している場合は複数の分割でデータを分割します。

  5. ニューラルネットワークをトレーニングすると同時に、検証セットの損失を制御します。ここでは、非凸最適化の魂を揺るがす喜びを楽しむことができます。ソリューションが存在するかどうか、複数のソリューションが存在するかどうかはわかりませんそれ。トレーニング損失と検証損失曲線の比較は、もちろんあなたを導きますが、NN(および特にDNN)の困難な態度を過小評価しないでください:彼らはしばしば、コードの不具合を修正します。

  6. テストセットの精度を確認し、診断プロット/テーブルを作成します。

  7. 結果が良くないので、ポイント1に戻ります。広告の吐き気を繰り返します

もちろん、詳細は特定のユースケースに基づいて変わりますが、この大まかなキャンバスを念頭に置いて、何がうまくいかないかを考えることができます。

基本アーキテクチャのチェック

これは問題の原因になる可能性があります。通常、これらの予備チェックを行います。

  • 問題に適したシンプルなアーキテクチャを探し(たとえば、画像分類の場合はMobileNetV2)、適切な初期化を適用します(このレベルでは、通常はランダムに実行されます)。これがあなたのデータで正しく訓練されていれば、少なくともあなたはデータセットに明白な問題がないことを知っています。あなたのケースで動作するシンプルでテスト済みのアーキテクチャが見つからない場合は、シンプルなベースラインを考えてください。たとえば、分類用の単純ベイズ分類器(または常に最も一般的なクラスを単に分類すること)、または時系列予測用のARIMAモデル

  • 単体テストを構築します。これを怠ること(および血まみれのJupyter Notebookの使用)は、通常、特にモデルが実稼働で展開されることになっている場合、確認するように求められているNNコードの問題の根本的な原因です。最も賛成の答えはすでに単体テストをカバーしているので、NNの単体テスト開発をサポートするライブラリが存在することを追加します(残念ながらTensorflowのみ)。

トレーニングセット

入力データを再確認してください。たとえば、トレーニングセットとテストセットのラベルを逆にしたかどうか(一度-___-が私に起こった)、または間違ったファイルをインポートしたかどうかを確認します。いくつかの入力サンプルと関連するラベルを見て、それらが意味をなすことを確認してください。正規化されたデータが実際に正規化されていることを確認してください(範囲を確認してください)。また、実世界のデータセットはダーティです:分類のために、高レベルのラベルノイズ(クラスラベルが間違っているサンプル)があるか、多変量時系列予測のために、時系列コンポーネントの一部に多くの欠損データがある場合があります(一部の入力については、94%という高い数値を見てきました)。

トレーニング中にトレーニングセットがネットに供給される順序が影響する場合があります。トレーニングセットのランダムシャッフルを試して(入力と出力の間の関連付けを壊さずに)、トレーニング損失が減少するかどうかを確認します。

最後に、トレーニングセットの問題があるかどうかを確認する最善の方法は、別のトレーニングセットを使用することです。収集した画像ではなく、画像分類を行う場合は、CIFAR10やCIFAR100などの標準データセットを使用します(または、トレーニングが可能な場合はImageNet )。これらのデータセットは十分にテストされています。トレーニングの損失がここで下がっても元のデータセットではなく、データセットに問題がある場合があります。

ゴールデンテストを行う

私がゴールデンテストと呼んでいる2つのテストがあります。これらは、訓練していないNNの問題を見つけるのに非常に便利です。

  • トレーニングセットを1サンプルまたは2サンプルに減らし、これについてトレーニングします。NNはすぐにトレーニングセットをオーバーフィットし、トレーニングセットで100%の精度に非常に迅速に到達する必要がありますが、検証/テストセットでの精度は0%になります。これが発生しない場合、コードにバグがあります。

  • 逆のテスト:トレーニングセット全体を保持しますが、ラベルをシャッフルします。NNが学習できる唯一の方法は、トレーニングセットを記憶することです。つまり、トレーニング損失は非常にゆっくり減少し、テスト損失は非常に急速に増加します。特に、テストセットでランダムチャンス損失に到達する必要があります。つまり、クラスが1000個ある場合、0.1%の精度に達するはずです。ラベルをシャッフルする前と後のトレーニング損失に違いが見られない場合、これはコードにバグがあることを意味します(前のステップでトレーニングセットのラベルを既にチェックしていることを思い出してください)。

トレーニング指標が意味をなすことを確認してください

クラスの不均衡が強い場合、精度(0-1損失)は安易なメトリックです。クロスエントロピー損失など、もっと意味のあるものを試してください。正しく分類したいだけでなく、高い精度で分類したいのです。

大きな銃を引き出す

何も役に立たなかったら、今こそハイパーパラメーターをいじり始める時です。これは簡単にNNトレーニングの悪い部分ですが、これらは非凸最適化を解決することによりパラメーターが適合する巨大で識別不可能なモデルであるため、これらの反復はしばしば避けられません。

  • さまざまなオプティマイザーを試してください:SGDのトレーニングは遅くなりますが、一般化エラーは低くなりますが、Adamは速くトレーニングされますが、テスト損失は高い値になります
  • バッチサイズを小さくしてみてください
  • 最初に学習率を上げてから減衰させるか、循環学習率を使用します
  • レイヤーを追加
  • 非表示のユニットを追加
  • 正規化を徐々に削除します(いくつかのレイヤーのバッチ基準を切り替えることがあります)。トレーニングの損失は減少するはずですが、テストの損失は増加する可能性があります。
  • 各レイヤーの重みとバイアスの分布を視覚化します。ここに来る必要はありませんでしたが、BatchNormを使用している場合は、ほぼ標準の正規分布が期待できます。エポックで重みのノルムが異常に増加しているかどうかを確認します。
  • トレーニング時にエラーが発生する場合は、そのエラーをグーグルで検索してください。ある朝、完全に機能するアーキテクチャを修正しようとして無駄になりましたが、インストールしたKerasのバージョンにバグのあるマルチGPUサポートがあり、更新する必要があることがわかりました。時々、反対のこと(パッケージバージョンのダウングレード)をしなければなりませんでした。
  • あなたの履歴書を更新し、別の仕事を探し始める:-)

+1、しかし「ブラッディジュピターノートブック」?それについてコメントしてください。:)
アメーバ

2
ここだ、私はJupyterノートブックを憎む理由。TL; DR:隠された状態、差分は苦痛、セキュリティの問題であり、ユニット/回帰/統合テストを使用しないなど、悪いプログラミング慣行を助長します。プログラミングの基本を人々が忘れることなく、NNのトレーニングはすでに十分に困難です。
DeltaIV

2
私はネガティブすぎるかもしれませんが、率直に言って、GitHubからJupyter Notebooksをクローンする人々で十分でした。コードをユースケースに適合させるのはほんの数分で、何も機能しないと不満を言うのです。クレープのために、ノートブックを作成するのではなく、PyCharmやVisualStudio Codeなどの実際のIDEを入手して、適切に構造化されたコードを作成してください!特に、モデルを本番環境に出荷することを計画している場合は、物事がずっと簡単になります。
DeltaIV

2
笑。「ジュピターノートブック」と「ユニットテスト」は反相関関係にあります。
Sycorax

2
(+1)これは良い評価です。ランダム化テストの提案は、バグのあるネットワークを取得するための本当に素晴らしい方法です。
Sycorax

6

モデルが学習していない場合、逆伝播が機能していない可能性が十分にあります。しかし、Neural Networkのようなブラックボックスモデルでは多くの問題が発生する可能性があるため、確認する必要のある事項がたくさんあります。SycoraxとAlexはどちらも非常に優れた総合的な答えを提供すると思います。まだ議論されていない1つのテクニックを追加したいだけです。

ϵ

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.