ニューラルネットワークを回帰用にトレーニングすると、常に平均が予測されます


9

私は回帰のための単純な畳み込みニューラルネットワークをトレーニングしています。ここでのタスクは、画像内のボックスの(x、y)位置を予測することです。例:

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ネットワークの出力には、x用とy用の2つのノードがあります。ネットワークの残りの部分は、標準の畳み込みニューラルネットワークです。損失は​​、ボックスの予測位置とグラウンドトゥルースの位置との間の標準的な平均二乗誤差です。私はこれらの画像の10000でトレーニングをしており、2000で検証しています。

私が抱えている問題は、重要なトレーニングを行った後でも、損失が実際には減少しないことです。ネットワークの出力を観察すると、両方の出力ノードで、ネットワークがゼロに近い値を出力する傾向があることに気付きました。そのため、ボックスの位置の予測は常に画像の中心になります。予測には多少のずれがありますが、常にほぼゼロです。以下は損失を示しています:

ここに画像の説明を入力してください

このグラフに示されているよりも多くのエポックでこれを実行しましたが、損失はまだ減少していません。ここで興味深いことに、実際にはある時点で損失が増加しています。

したがって、ネットワークは、適切な適合を学習するのではなく、トレーニングデータの平均を予測しているだけのようです。なぜこれがそうなのかについてのアイデアはありますか?Adamをオプティマイザとして使用しています。初期学習率は0.01で、relusをアクティベーションとして使用しています。


私のコード(Keras)の一部に興味がある場合は、以下に示します。

# Create the model
model = Sequential()
model.add(Convolution2D(32, 5, 5, border_mode='same', subsample=(2, 2), activation='relu', input_shape=(3, image_width, image_height)))
model.add(Convolution2D(64, 5, 5, border_mode='same', subsample=(2, 2), activation='relu'))
model.add(Convolution2D(128, 5, 5, border_mode='same', subsample=(2, 2), activation='relu'))
model.add(Flatten())
model.add(Dense(100, activation='relu'))
model.add(Dense(2, activation='linear'))


# Compile the model
adam = Adam(lr=0.01, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0)
model.compile(loss='mean_squared_error', optimizer=adam)


# Fit the model
model.fit(images, targets, batch_size=128, nb_epoch=1000, verbose=1, callbacks=[plot_callback], validation_split=0.2, shuffle=True)

画像は実際のサンプルの上位の例にありますか?それは5つの別々のサンプルですか?一般化に役立つ情報が画像に含まれていないようです。つまり、白い四角形のX、Y位置を見つけるのにニューラルネットは必要ありません。画像を解析して白いピクセルを探すだけです。このモデルのビジョンについてもう少し説明してください。次の場所を予測する時間的なパターンはありますか?
photox

こんにちは、はい、画像は5つの別々のサンプルです。それらがどのようにレンダリングされるかはわかりませんが、5つの個別の正方形の画像である必要があります(役立つようにレイアウトを少し変更しました...)。はい、このタスクにニューラルネットワークは必要ないことを理解していますが、これはニューラルネットワークを使用して回帰を行う方法を学ぶための単なるテスト実験です。一般化に役立つ情報がないという意味がわかりません。各トレーニングペアは、正方形の画像と、正方形の(x、y)位置の2次元ベクトルで構成されています。ありがとう:)
Karnivaurus

1
1)最初のコンバージョンレイヤーの入力形状は3(rbg)チャネルを使用していますが、データはグレースケール(1チャネル)です2)多くのコンバージョンレイヤーとフィルターは必要ありません。実際、単一のレイヤーだと思います。少数の小さなカーネルで問題ありません。
photox 2017

画像が本当にターゲットに対応していることを確信していますか?
user31264 2017

1
@photoxが言うように、変換レイヤーは必要ありません。これらを追加すると、オプティマイザが適切なソリューションを見つけることが困難になります。3つのconvレイヤーを削除すると、「モデル」は機能すると思われます。
Pieter

回答:


9

オプティマイザーは(準)最適解に収束できません。どうして?問題が簡単すぎるか、モデルが複雑すぎます。

簡単すぎる問題

@photoxがすでに言ったように、この問題は単一の隠れ層で解決できます。私はそれが隠された層なしで行うことができるとさえ思っています。これは、この問題が線形分離可能であるためです

1/height/width2/heightwidthnn/heightwidthheightwidthピクセルは非ゼロです(たとえば、バイアスは灰色の値に等しい)。x出力のアクティブ化は、正方形の中心に等しくなります。したがって、線形関数は正方形の位置を計算できます。

いくつかの解決策があります:

  • より難しい問題、たとえば画像分類を選択してください
  • 塩コショウホワイトノイズなどのノイズを追加します
  • 背景に色の異なる多数の円がある間に赤い正方形の位置を予測するなどして、問題をより困難にします。

複雑すぎるモデル

モデルにはいくつかのパーツがあり、オプティマイザが最適なスイートを見つけるのに役立ちませんが、かなり複雑になります。

5×5

もう1つの例は、多くの追加パラメーターを持つAdamオプティマイザーです。Adamオプティマイザはこれらのパラメータでうまく機能するかもしれませんがSGD、デフォルト値を持つ単純なオプティマイザから始めてみませんか。

したがって、いくつかの最適化を行うことができます。

  • LinearRegressionscikit-learnから使用します。OK、これはあなたが望むものではありませんが、このモデルがどれほど複雑であるかを説明したいだけです。
  • 変換レイヤーを削除する
  • 非表示のDenseレイヤーのサイズを小さくする
  • デフォルトのSGDオプティマイザを使用する
  • 非表示のレイヤーを使用している場合は、sigmoidアクティブ化を試してください。非表示レイヤーの各ノードは、正方形が特定の場所にあるかどうかを検出するものと考えることができます。
  • これでうまくいかない場合は、学習率を少し実験して、高すぎるか低すぎるかを確認してください。

PS

Adit Deshpandeによるこのブログ投稿を気に入っていただけると思います。


これらのソリューションがオプティマイザの動作を変更したかどうかをお知らせください。
Pieter

おかげで、それは非常に便利です。私はあなたの提案を試すことに取り組んでいます。しかし、私はあなたの最初のポイントを理解していません。問題が単純すぎると、より複雑な問題よりも最適化が難しくなる理由について、私は混乱しています。特定のネットワークで、単純な問題の方が複雑な問題よりも最適化が難しいのはなぜですか?単純な問題では、非常に強力な勾配と強力なグローバル最適値が存在すると考えていました。しかし、最初のポイントは、問題の単純さが最適化を困難にするということであり、より複雑な問題が最適化に役立つことを示唆しています...
Karnivaurus

0

それは典型的な過剰適合問題のように見えます。あなたのデータは、より良い結果を得るために十分な情報を提供していません。トレーニングで複雑な NNを選択して、トレーニングデータのすべてのニュアンスを記憶します。グラフ上では、損失がゼロになることはありません。ところで、検証にバグがあるか、検証セットが検証に適していないようです。検証の損失もゼロになっているためです。


4
質問は、ネットワークがほとんど常にゼロを出力すると言います。それは、過剰適合ではなく、深刻な過小適合の場合です。また、学習曲線のトレーニングエラーと検証エラーの間にギャップはありません。これは、過剰適合が問題ではないことを示します(エラーはゼロではなく、スケールは対数です)
user20160

0

データセットでも同じ問題に直面しています。私の場合、予測子は非常に小さな分散で非常に集中していることがわかります。予測変数の分散を確認し、それがどのように分布しているかを確認する必要があります。予測しようとしている変数の分布

ただし、出力変数の一部の変換を実行して、スケールを変更または変更できます。これにより、タイプ分布がより均一になる可能性があります。たとえば、画像認識タスクでは、ヒストグラムのイコライゼーションまたはコントラストの強調が、正しい意思決定に有利に機能することがあります。


-1

私は実際に非常に類似した問題に取り組んでいました。基本的に、私は白い背景にたくさんのドットがあり、最初に背景に配置されたドットを認識するようにNNをトレーニングしていました。私が見つけた方法は、ニューロンの1つの完全に接続された層(つまり1層NN)を使用することでした。たとえば、100x100の画像の場合、10,000個の入力ニューロン(ピクセル)が2つの出力ニューロン(座標)に直接接続されます。PyTorchでは、ピクセル値をテンソルに変換すると、平均を減算して標準偏差で割ることによって、データが自動的に正規化されていました。通常の機械学習の問題ではこれは問題ありませんが、画像の色付きピクセル数に差異がある可能性がある画像(つまり、ごく少数の白いピクセルしかないもの)には当てはまりません。そう、すべてのピクセル強度値を255で割ることにより手動で正規化しました(すべての強度値を正規分布に当てはめようとする一般的な正規化手法を使用せずに、0から1の範囲になりました)。その後、トレーニングセットのピクセルの平均座標を予測していたため、依然として問題がありました。したがって、私の解決策は、学習率を非常に高く設定することでした。これは、ほとんどすべてのMLインストラクターとチュートリアルに反します。ほとんどの人が言うように、1e-3、1e-4、1e-5を使用する代わりに、確率的勾配降下法で1または0.1の学習率を使用していました。これで私の問題は解決し、私のネットワークは最終的に私のトレーニングセットを記憶することを学びました。それはテストセットに一般化しすぎませんが、少なくともある程度は機能します。これは、他のほとんどの人があなたの質問で提案したものよりも優れたソリューションです。すべての強度値を正規分布に適合させようとする一般的な正規化手法を使用せずに、0〜1の範囲に戻ります。その後、トレーニングセットのピクセルの平均座標を予測していたため、依然として問題がありました。したがって、私の解決策は、学習率を非常に高く設定することでした。これは、ほとんどすべてのMLインストラクターとチュートリアルに反します。ほとんどの人が言うように、1e-3、1e-4、1e-5を使用する代わりに、確率的勾配降下法で1または0.1の学習率を使用していました。これで私の問題は解決し、私のネットワークは最終的に私のトレーニングセットを記憶することを学びました。それはテストセットに一般化しすぎませんが、少なくともある程度は機能します。これは、他のほとんどの人があなたの質問で提案したものよりも優れたソリューションです。すべての強度値を正規分布に適合させようとする一般的な正規化手法を使用せずに、0〜1の範囲に戻ります。その後、トレーニングセットのピクセルの平均座標を予測していたため、依然として問題がありました。したがって、私の解決策は、学習率を非常に高く設定することでした。これは、ほとんどすべてのMLインストラクターとチュートリアルに反します。ほとんどの人が言うように、1e-3、1e-4、1e-5を使用する代わりに、確率的勾配降下法で1または0.1の学習率を使用していました。これで私の問題は解決し、私のネットワークは最終的に私のトレーニングセットを記憶することを学びました。それはテストセットに一般化しすぎませんが、少なくともある程度は機能します。これは、他のほとんどの人があなたの質問で提案したものよりも優れたソリューションです。

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