私はニューラルネットワークについて少し前に読みましたが、ANN(特に、バックプロパゲーションを介して学習する多層パーセプトロン)がイベントをtrueまたはfalseに分類する方法を学習できることを理解しています。
私は2つの方法があると思います:
1)1つの出力ニューロンを取得します。値が0.5より大きい場合、イベントは真である可能性が高く、値が0.5以下の場合、イベントは偽である可能性があります。
2)最初の値が2番目の値よりも大きい場合、2つの出力ニューロンを取得します。イベントは真である可能性が高く、その逆も同様です。
これらの場合、ANNは、イベントが真であるか偽であるかを通知します。それがどれほど可能性があるかはわかりません。
この値をオッズに変換する方法、またはANNから直接オッズを取得する方法はありますか? 「イベントの確率は84%である」などの出力を取得したい
NNが訓練されると、質問で述べたようにバックプロゲーションを使用することにより(バックプロゲーションロジックは、エラー関数を最小化する方法で重みを「ナッジ」します)、すべての個々の入力(「外部」入力またはNN内入力)に関連付けられた重みは固定されます。その後、NNは分類目的に使用できます。
これにより、学習フェーズ中の数学(および「オプション」)が少し厚くなる可能性がありますが、分類子として動作する場合は比較的単純で単純です。主なアルゴリズムは、各ニューロンのアクティブ化値を、そのニューロンの入力x重みの合計として計算することです。次に、この値は、正規化してブール値に変換することを目的とするアクティブ化関数に送られます(一部のネットワークでは、一部のネットワークにオールオアナッシングルールがないため、これをブール値に変換します)。アクティベーション関数は、指定したものよりも複雑になる可能性があります。特に、線形である必要はありませんが、その形状(通常はS字型)は同じように動作します。アクティベーションが曲線のどこに適合するかを調べ、該当する場合は上記のようにしますまたはしきい値未満。次に、基本的なアルゴリズムは、特定の層のすべてのニューロンを処理してから、次の層に進みます。
これを念頭に置いて、パーセプトロンの能力を使用して、その推測(または実際に推測-複数)をパーセント値で修飾するという質問は、簡単な答えを見つけます。それは可能であり、その出力は(もしあれば)実際の値です正規化する必要があります)質問で説明されているアクティベーション関数としきい値/比較メソッドを使用して、離散値(複数のカテゴリの場合はブール値またはカテゴリID)に変換する前に。
だから...どのようにしてどこで「私のパーセンテージ」を得るのですか?...すべてはNN実装に依存し、さらに重要なことに、実装は0-1のアクティベーション値をもたらすために使用できる正規化関数のタイプを指示します範囲およびで、すべてのパーセンテージの合計が1に「加算」されます。最も単純な形式では、アクティブ化関数を使用して、出力レイヤーへの入力の値と重みは、1つの質問への「合計」を確実にするための要素として使用できます(これらの重みが実際にそれ自体で正規化されている場合)。
エボラ!
説明:(マシューのメモに従います)
ニューラルネットワーク自体が機能する方法を変更する必要はありません。必要なことは、outputニューロンのロジックを何らかの方法で "フック"して、計算した[実数値]アクティベーション値にアクセスするか、またはより良い、活性化関数の実数値の出力にアクセスするには、そのブール変換の前に(これは通常、しきい値またはいくつかの確率関数に基づいています) )。
つまり、NNは以前と同じように機能し、そのトレーニングロジックも認識ロジックも変更されず、NNへの入力は同じままです。さまざまなレイヤー間の接続も同様です。実際のアクティブ化のコピーのみが取得されます。出力層のニューロン。これを使用してパーセンテージを計算します。パーセンテージ計算の実際の式は、アクティベーション値の性質とそれに関連する関数(そのスケール、他のニューロンの出力に対する範囲など)によって異なります。
ここにいくつかの簡単なケースがあります(質問の推奨出力ルールから取得)1)単一の出力ニューロンがある場合:アクティベーション関数によって提供される値とその関数の範囲との比率。 2)たとえば、分類子のように2つ(またはそれ以上)の出力ニューロンがある場合:すべての出力ニューロンが同じ活性化関数を持っている場合、特定のニューロンのパーセンテージは、その活性化関数値をすべての活性化関数の合計で割ったものです。値。アクティベーション関数が異なる場合、ケースバイケースの状況になります。これは、個別のアクティベーション関数が一部のニューロンにより多くの重みを与える意図的な欲求を示している可能性があり、パーセンテージがこれを尊重する必要があるためです。
あなたができることは、出力層ノードで シグモイド伝達関数 を使用することです(データ範囲(-inf、inf)を受け入れ、[-1,1]で値を出力します)。
次に、1-of-n出力エンコーディング(クラスごとに1つのノード)を使用して、範囲[-1 、1]から[0,1]までを各クラス値の確率として使用します(これは2つ以上のクラスで自然に機能することに注意してください)。
単一の出力ニューロンの活性化値は線形加重和であり、ネットワークが出力に0から1の範囲を与えるようにトレーニングされている場合、おおよその確率として直接解釈される可能性があります。これは、伝達関数(または出力関数)は、前のステージと最終出力の両方で0から1の範囲にあります(通常、シグモイドロジスティック関数)。ただし、保証はいたしかねますが、修理は可能です。さらに、シグモイドがロジスティックで、重みが正で合計が1になるように制約されていない限り、その可能性は低いです。通常、ニューラルネットワークは、tanhシグモイドと、正と負の範囲の重みとアクティブ化を使用して、よりバランスのとれた方法でトレーニングします(このモデルの対称性のため)。別の要因は、クラスの有病率です。50%の場合、ロジスティクスには0.5のしきい値が、tanhには0.0のしきい値が効果的です。シグモイドは、物を範囲の中心に向かって(バックプロパゲーションで)プッシュし、範囲から外れないように(フィードフォワードで)制限するように設計されています。 (ベルヌーイ分布に関する)パフォーマンスの重要性は、ニューロンが推測ではなく実際の予測を行っている確率として解釈することもできます。理想的には、ポジティブに対する予測子のバイアスは、現実の世界におけるポジティブの有病率と一致する必要があります(これは、さまざまな時間や場所で変動する可能性があります。 )-確率に合わせて調整すると、任意のバイアスを簡単に設定できるという利点があります。
2つのクラスに2つのニューロンがある場合、それぞれは上記のように独立して解釈でき、それらの間の差は半分になる場合もあります。それは、ネガティブクラスのニューロンを反転して平均するようなものです。差異は、有意確率の推定を引き起こす可能性もあります(T検定を使用)。
ブライアスコアとそのマーフィー分解は、平均回答が正しい確率のより直接的な推定を提供しますが、インフォームドネスは、分類子が推測ではなく情報に基づいた決定を行う確率を提供します。ROCAUCは、ポジティブクラスがランク付けされる確率を提供します(ポジティブな予測子による)ネガティブクラスよりも高く、Kappaは、有病率=バイアスの場合、インフォームドネスに一致する同様の数値を提供します。
通常必要なのは、分類子全体の有意確率(ゲスト評価の架空のフレームワークではなく、実際のフィールドでプレイしていることを確認するため)と特定の例の確率推定の両方です。キャリブレーションにはさまざまな方法があります。たとえば、回帰(線形または非線形)と確率を比較したり、その逆関数を使用してより正確な確率推定に再マッピングしたりします。これは、ブライアスコアが改善し、キャリブレーションコンポーネントが0に向かって減少することで確認できますが、ROC AUCとインフォームドネスがそうであるように、差別コンポーネントは同じままです(カッパはバイアスの影響を受け、悪化する可能性があります)。
確率に合わせて調整する簡単な非線形の方法は、ROC曲線を使用することです。単一のニューロンの出力または2つの競合するニューロン間の差のしきい値が変化するので、ROC曲線に真と偽の陽性率の結果をプロットします(実際にはポジティブではないものはネガティブであるため、偽および真のネガティブ率は自然に補数です。次に、サンプルごとに(勾配が変化するたびに)ROC曲線(ポリライン)をポイントごとにスキャンし、陽性サンプルの比率により、そのポイントを生成した神経閾値に対応する陽性の確率推定値が得られます。カーブ上のポイント間の値は、キャリブレーションセットで表されるポイント間で線形に補間できます。実際、ROCカーブの不良ポイントは、凸面(デント)で表され、凸包によって平滑化できます。ハルセグメントの端点。 FlachとWuは、実際にセグメントを反転させる手法を提案していますが、これは間違った方法で使用された情報に依存し、キャリブレーションセットの任意の改善のために繰り返し使用される可能性がありますが、テスト状況に一般化する可能性はますます低くなります。
(私はここに来て、これらのROCベースのアプローチについて何年も前に見た論文を探していました。そのため、これは記憶からのものであり、これらの失われた参照はありません。)
ニューラルネットワーク(実際には任意の機械学習分類器)の出力を確率として解釈することに、私は非常に慎重になります。マシンは、確率密度を推定するのではなく、クラスを区別するようにトレーニングされています。実際、この情報はデータに含まれていません。推測する必要があります。私の経験では、出力を確率として直接解釈することは誰にも勧めません。
あなたは教授を試みましたか?ソフトマックス活性化関数とクロスエントロピーエラーでネットワークをトレーニングするというヒントンの提案?
例として、次の3層ネットワークを作成します。
linear neurons [ number of features ]
sigmoid neurons [ 3 x number of features ]
linear neurons [ number of classes ]
次に、お気に入りのオプティマイザの確率的降下/ iprop plus/grad降下を使用して、クロスエントロピーエラーソフトマックス転送でそれらをトレーニングします。トレーニング後、出力ニューロンは1の合計に正規化されます。
詳細は http://en.wikipedia.org/wiki/Softmax_activation_function をご覧ください。 Shark Machine Learningフレームワークは、2つのモデルを組み合わせてSoftmax機能を提供します。そして教授。 Hintonは、詳細についての優れたオンラインコース@ http://coursera.com です。
ANNを2クラス分類に使用し、ロジスティックシグモイドアクティベーション関数を出力層で使用すると、出力値は確率として解釈される可能性があります。
したがって、2つのクラスから選択する場合は、1-of-Cエンコーディングを使用してトレーニングします。2つのANN出力には、クラスごとにトレーニング値(1,0)と(0,1)があります。
最初のクラスの確率をパーセントで取得するには、最初のANN出力を100に乗算します。他のクラスの確率を取得するには、2番目の出力を使用します。
これは、ソフトマックス活性化関数を使用したマルチクラス分類に対して一般化できます。
確率論的解釈の証明を含む詳細については、こちらをご覧ください。
[1] Bishop、Christopher M.パターン認識のためのニューラルネットワーク。オックスフォード大学出版局、1995年。
「ニューラルコンピューティングの理論の紹介(ヘルツクロフパーマー)」の本で、結果の確率を概算するためにバックプロパゲーションでトレーニングされたニューラルネットワークの例を見たのを覚えています。この例の鍵は特別な学習ルールであったため、ユニットの出力を確率に変換する必要はなく、代わりに出力として確率が自動的に得られました。
機会があれば、その本をチェックしてみてください。
(ちなみに、「boltzmanマシン」はそれほど有名ではありませんが、確率分布を学習するために特別に設計されたニューラルネットワークです。同様にチェックすることもできます)