ニューラルネットワークの正確さ
-
08-07-2019 - |
質問
この質問を他のAIの人々に尋ねましたが、私が満足する答えは実際には与えられていません。
以前に人工ニューラルネットワークをプログラミングしたことがある人は、その正確性をどのようにテストしますか?
別の言い方をすれば、ニューラルネットワークの背後にあるコードをどのようにデバッグするのでしょうか?
解決
正しさは、「ソフトコンピューティング」のほとんどで面白い概念です。私に言えることは、「ニューラルネットワークは、その設計のパラメーターを一貫して満たす場合に正しい」ということです。これを行うには、データでトレーニングし、他のデータで検証し、中間にフィードバックループを配置して、ニューラルネットワークが適切に機能しているかどうかを確認します。
これはもちろん、正確性の直接的な証明が不可能な十分に大きいニューラルネットワークのみの場合です。 XORまたは類似のものを学習するニューラルネットワークを構築しようとしている場合、分析を通じてニューラルネットワークが正しいことを証明することは可能ですが、そのクラスの問題ではaNNはほとんど必要ありません。
他のヒント
ニューラルネットワークでは、一般に、トレーニングされていないニューラルネットワークを使用し、所定のデータセットを使用してトレーニングしているため、期待どおりに応答します。これが取引です。通常、入力に対して一定の信頼レベルまでトレーニングします。一般的に(また、これは一般的であり、走行距離は異なる場合があります)、常に正しい答えを提供するニューラルネットワークを取得することはできません。むしろ、あなたは信頼範囲内で、正しい答えの推定を得ています。その信頼範囲は、ネットワークのトレーニング方法によって決まります。
ニューラルネットワークの結論が検証可能なほど正確であると確信できない場合に、なぜニューラルネットワークを使用するのかという疑問が生じます。答えは、ニューラルネットワークは線形時間で特定のクラスの問題(具体的にはNP完全問題)の信頼度の高い答えに到達できるのに対し、NP完全問題の検証可能な正しい解は多項式時間でしか到達できないということです。素人の言葉で言えば、ニューラルネットワークは「解決」できます。通常の計算ではできない問題。ただし、正しい答えを持っていると確信できるのは一定の割合だけです。トレーニング計画によってその自信を判断でき、通常は少なくとも99.9%の自信を持つことができます。
ここでは、予想以上に大きなワームの缶を開けています。
ちなみに、NNはおそらく汎用関数近似として最もよく考えられているので、このことについて考えるのに役立ちます。とにかく、あなたの質問に関してNNについて特別なことは何もありません。問題はあらゆる種類の学習アルゴリズムに適用されます。
提供する結果に対する信頼は、所有するトレーニングデータの量と品質(多くの場合、決定するのが難しい)の両方に依存します。
このようなものに本当に興味がある場合は、オーバートレーニングの問題とアンサンブルメソッド(バギング、ブーストなど)について少しお読みください。
実際の問題は、通常、「正確さ」に実際には興味がないことです。すでに見た特定の入力の回答の品質を参照してください。むしろ、まだ見たことがない入力の回答の品質を予測することに関心があります。これははるかに難しい問題です。その場合の典型的なアプローチは、「差し控える」ことです。トレーニングデータの一部(つまり、「正しい」答えを知っているもの)と、それに対してトレーニングされたシステムをテストします。しかし、十分なデータがないか、偏っているなどと考え始めると、微妙になります。したがって、基本的にこの種の問題について考えることに多くの時間を費やす多くの研究者がいます。
テストデータとトレーニングデータが存在するプロジェクトに取り組んでいるので、NNが認識していない一連の入力に対して予想される出力を知っています。
分類子の結果を分析する一般的な方法の1つは、ROC曲線の使用です。分類子とROC曲線の統計の概要は、診断テストの解釈
私はこの分野の完全なアマチュアですが、正しいとわかっている事前に決められたデータのセットを使用しませんか?
私の先生はいつも、経験則の80%を使用してNNをトレーニングし、残りの20%で検証することだと言っていました。そして、もちろん、データセットが必要なだけ包括的であることを確認してください。
ネットワークの逆伝播が正しいかどうかを知りたい場合、簡単な方法があります。
エラーランドスケープの派生物を計算するため、実装が数値的に正しいかどうかを確認できます。特定の重み∂ E /∂ wに関する誤差の導関数を計算します。あなたはそれを示すことができます
∂ E /∂ w =(E(w + e)-E(w-e))/(2 * e)+ O(e ^ 2)。
(ビショップ、機械学習とパターン認識、246ページ)
本質的に、重量の左側の誤差を評価し、数値の勾配が分析的勾配と同じ場合、重量の右側で誤差を評価します。
(実装は次のとおりです: http:// github.com/bayerj/arac/raw/9f5b225d6293974f8adfc5f20dfc6439cc1bed35/src/cpp/utilities/utilities.cpp )
おそらく、逆伝播の勾配である、検証に余分な労力を要する値は1つだけです。バイエルの答えは実際に一般的に使用され、提案されていると思います。これに追加のコードを書く必要がありますが、すべては順伝播行列の乗算であり、記述と検証が簡単です。
ベストアンサーを取得できない他の問題がいくつかあります。例:
- NNのコスト関数は凹ではないため、勾配降下法はグローバルな最適値を見つけることが保証されません。
- オーバー/アンダーフィッティング
- 「正しい」を選択しない機能/モデル
- etc
ただし、プログラミングのバグの範囲を超えていると思います。