ニューラルネットワーク:使用するコスト関数?


49

主にニューラルネットワークを使用した実験にTensorFlowを使用しています。かなりの実験(XOR-Problem、MNIST、いくつかのリグレッションなど)を行っていますが、全体的に初心者と見なされる可能性があるため、特定の問題に対して「正しい」コスト関数を選択するのに苦労しています。

TensorFlowに来る前に、PythonNumPyを使用して、完全に接続されたMLPとリカレントネットワークをいくつかコーディングしましたが、ほとんどの場合、単純な2乗誤差と単純な勾配不足で十分な問題がありました。

ただし、TensorFlowはカスタムコスト関数を作成するだけでなく、かなり多くのコスト関数を提供するので、ニューラルネットワークのコスト関数専用のチュートリアルがあるかどうか知りたいのですが?(私はすでに公式のTensorFlowチュートリアルの半分のように実行しましたが、特定のコスト関数または学習者が特定の問題に使用される理由を実際には説明していません-少なくとも初心者には)

いくつか例を挙げます:

cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(y_output, y_train))

1つのベクトルの合計が1になるように、両方の入力にsoftmax関数を適用すると思いますが、ロジットとのクロスエントロピーは正確には何ですか?私はそれが値を合計し、クロスエントロピーを計算すると思った...だからメトリック測定?!出力を正規化し、合計して二乗誤差を取ると、これは非常に同じではないでしょうか?さらに、なぜこれがMNISTなどに使用されるのですか(またはさらに難しい問題)?私は10または多分1000のクラスのように分類したい場合は、に関する情報破棄完全に値を合計しません。これは、実際の出力はクラスでしたの?

cost = tf.nn.l2_loss(vector)

これは何のため?l2の損失はほぼ二乗誤差であると考えましたが、TensorFlowのAPIは、入力が1つのテンソルに過ぎないことを示しています。まったく考えがつかないのですか?!

加えて、クロスエントロピーについてこれをかなり頻繁に見ました:

cross_entropy = -tf.reduce_sum(y_train * tf.log(y_output))

...しかし、なぜこれが使用されるのですか?数学的にクロスエントロピーの損失ではありません:

-1/n * sum(y_train * log(y_output) + (1 - y_train) * log(1 - y_output))

(1 - y_train) * log(1 - y_output)ほとんどのTensorFlowの例の一部はどこにありますか?不足していませんか?


回答:この質問は非常に開かれていることは知っていますが、すべての問題/コスト関数が詳細にリストされている10ページほどになるとは思いません。どのコスト関数を使用するかについての簡単な要約(一般的にもTensorFlowでも、私にとっては重要ではありません)と、このトピックに関する説明が必要です。および/または初心者向けのソース;)


1
良い質問。サイトへようこそ:)
Dawny33

2
通常、MSEは回帰に使用され、クロスエントロピーは分類に使用されます。分類指数(CFM)は、ハンプシャーとウェイベルによる「時間遅延ニューラルネットワークを使用した音素認識の改善のための新しい目的関数」で紹介されました。私がそれを正しく覚えていれば、彼らはなぜ彼らがしたようにCFMを設計したのかも説明します。
マーティントーマ

1
reduce_sum(y_train * tf.log(y_output))は、かなり一般的な「単純なケース」の例であるため、よく使用されると思います。各バッチのエラーの合計を実行します。つまり、batch_sizesが2倍の場合、エラーはコスト(および勾配の大きさ)の2倍になります。reduce_meanに簡単な変更を加えると、少なくともデバッグと設定の操作がより理解しやすくなります。
ニューロン

回答:


34

この回答は、TensorFlowに関連するものではなく、コスト関数の一般的な側面に関するものであり、主に質問の「このトピックに関する説明」の部分に対処します。

私が従ったほとんどの例/チュートリアルでは、使用されたコスト関数はいくぶんarbitrary意的でした。ポイントは、特にコスト関数ではなく、特定の方法を読者に紹介することでした。ツールに精通するためにチュートリアルに従うことを止めるべきではありませんが、私の答えはあなた自身の問題に対するコスト関数を選択する方法についてあなたを助けるべきです。

クロスエントロピー、ロジット、L2規範、または特定の何かに関する回答が必要な場合は、複数のより具体的な質問を投稿することをお勧めします。これにより、特定の知識を持つ人があなたの質問を見る可能性が高くなります。


望ましい結果を達成するために適切なコスト関数を選択することは、機械学習の問題の重要なポイントです。基本的なアプローチは、メソッドに何が必要か正確にわからない場合、回帰問題には平均二乗誤差(Wikipedia)を使用し、分類問題には誤差の割合を使用することです。ただし、メソッドから良好な結果が必要な場合は、good定義する必要があるため、適切なコスト関数を定義する必要があります。これは、ドメインの知識(データは何で、何を達成しようとしているのか)と、自由に使えるツールの知識の両方から得られます。

ツールの知識がほとんどないため、TensorFlowに既に実装されているコスト関数をガイドできるとは思いませんが、さまざまなコスト関数を記述および評価する方法の例を示すことができます。


コスト関数のさまざまな違いを説明するために、バイナリ分類問題の例を使用します。サンプルごとに、クラスです。xnf(xn){0,1}

計算プロパティから始めます。「同じこと」を測定する2つの関数がどのように異なる結果につながるか。次の単純なコスト関数を使用します。エラーの割合。サンプルがある場合、は予測クラスであり、は真のクラスです。Nf(yn)yn

  • 1Nn{1 if f(xn)yn0 otherwise=nyn[1f(xn)]+[1yn]f(xn)

このコスト関数には、簡単に解釈できるという利点があります。ただし、スムーズではありません。サンプルが2つしかない場合、関数は0から0.5、1に1に「ジャンプ」します。この関数で勾配降下を使用しようとすると、矛盾が生じます。それを回避する1つの方法は、割り当ての確率を使用するようにコスト関数を変更することです。。関数はp(yn=1|xn)

  • 1Nnynp(yn=0|xn)+(1yn)p(yn=1|xn)

この関数はよりスムーズで、勾配降下アプローチでより良く機能します。「精巧な」モデルが得られます。ただし、他の問題があります。あいまいなサンプルがある場合、より良いことを言うのに十分な情報がないとしましょう。次に、このコスト関数で勾配降下を使用すると、この確率が可能な限り増加するモデルが得られ、したがって、おそらくオーバーフィットになります。p(yn=1|xn)=0.5

この関数のもう1つの問題は、で場合、正しいことは確かですが、間違っているということです。この問題を回避するために、確率のを取得できます。と、問題はありません。次の関数は、前の段落で説明しました:p(yn=1|xn)=1yn=0logp(yn|xn)log(0)=log(1)=0

  • 1Nnynlogp(yn=0|xn)+(1yn)logp(yn=1|xn)

これは、同じこと、エラーの割合、最適化を計算するために、定義が異なると定義が異なると結果が異なる可能性があることを示しているはずです。

コスト関数とが同じ概念を測定することは可能ですが、はメソッドをよりも良い結果に導く可能性があります。ABAB


次に、さまざまなコスト関数がさまざまな概念を測定する方法を見てみましょう。Google検索のように(ランキングを無視する場合)情報検索のコンテキストでは、返される結果を

アルゴリズムがすべてを返す場合、関連するすべての結果が返されるため、再現率は高くなりますが、精度は非常に低くなります。一方、1つの要素のみを返す場合、最も確実な要素が関連している場合、高精度ですが、再現率は低くなります。

このようなアルゴリズムを判断するための一般的なコスト関数はスコア(Wikipedia)です。一般的なケースは -scoreです。これは精度とリコールに等しい重みを与えますが、一般的なケースは -scoreであり、を微調整して取得できます。FF1Fββ

  • を使用した場合の再現率が高いβ>1
  • を使用した場合のより高い精度。β<1

そのようなシナリオでは、コスト関数を選択することは、アルゴリズムが行うべきトレードオフを選択することです

しばしば取り上げられる別の例は、医学診断の場合です。望ましいものに応じて、より多くの偽陰性または偽陽性を処罰するコスト関数を選択できます。

  • より健康な人は病気に分類されます(しかし、私たちは健康な人を治療するかもしれません。
  • より多くの病気の人が健康と分類されている(しかし、治療せずに死亡するかもしれない)

結論として、コスト関数を定義することは、アルゴリズムの目標を定義することです。アルゴリズムはそこに到達する方法を定義します。


サイドノート:一部のコスト関数には、目標を達成するための優れたアルゴリズム方法があります。たとえば、SVM(Wikipedia)の二重問題を解決することにより、ヒンジ損失(Wikipedia)を最小限に抑える優れた方法が存在します。


10

クロスエントロピーに関する質問に答えるために、あなたが述べたことは両方とも同じものであることに気付くでしょう。

1n(y_trainlog(y_output)+(1y_train)log(1y_output))

あなたが言及したのは、が0/1スカラーであり、が再び出力が1である確率を示すスカラーであると仮定するバイナリクロスエントロピー損失です。y_trainy_output

あなたが述べた他の方程式は、複数のクラスに拡張するより一般的なバリアントです

-tf.reduce_sum(y_train * tf.log(y_output)) 書くのと同じこと

ntrain_problog(out_prob)

ここで、合計は複数のクラスについてであり、確率は各クラスについてです。バイナリの場合は明らかに、前述の内容とまったく同じです。それは一定であるとして、それは損失の最小化にどのような方法で貢献しないような用語が省略されています。n


4

BLUF:データのサブセットとmatplotlibを使用した反復的な試行錯誤。

長い答え:

私のチームは、それほど前ではなく、この同じ質問に苦労していました。ここでのすべての答えは素晴らしいですが、コンテキストの「初心者向けの答え」として、また機械学習の初心者向けの出発点として、皆さんと共有したかったのです。

アルゴリズムとデータセットの特定の選択のために、滑らかで凸型のコスト関数を目指します。これは、アルゴリズムが重みを自信を持って効率的に調整し、最終的にそのコスト関数のグローバルな最小値に到達できるようにするためです。コスト関数がローカルの最大値と最小値で「バンプ」であり、かつ/またはグローバルな最小値がない場合、アルゴリズムの収束に苦労する可能性があります。その重みはあちこちに飛び回るだけで、最終的には正確で一貫した予測を行うことができません。

たとえば、身長(実数、インチ)と年齢(実数、年)に基づいて誰かの体重(実数、ポンド)を予測するために線形回帰を使用している場合、平均二乗誤差コスト関数はきれいで滑らかな凸曲線。アルゴリズムの収束に問題はありません。

ただし、代わりに、バイナリ分類問題にロジスティック回帰アルゴリズムを使用しているとしましょう。たとえば、過去30日間におむつを購入したかどうか、過去30日間にビールを購入したかどうかに基づいて、性別を予測します。この場合、平均二乗誤差では滑らかな凸面が得られない可能性があり、これはトレーニングには不適切です。そして、あなたは実験によってそれを伝えるでしょう。

MSEとデータの小さくシンプルなサンプルを使用して、またはこの実験用に生成した模擬データを使用して、試用版を実行することから開始できます。matplotlibで何が起こっているのかを視覚化します(または、任意のプロットソリューション)。結果の誤差曲線は滑らかで凸状ですか?追加の入力変数を使用して再試行してください...結果の表面はまだ滑らかで凸状ですか?この実験により、MSEは問題/解決策に適合しませんが、クロスエントロピーにより、ニーズに合った滑らかな凸形状が得られることがわかります。したがって、より大きなサンプルデータセットでそれを試して、仮説がまだ成り立つかどうかを確認できます。そして、もしそうなら、あなたは完全なトレーニングセットでそれを数回試してみて、それがどのように実行され、一貫して同様のモデルを提供するかを見ることができます。そうでない場合は、別のコスト関数を選択して、プロセスを繰り返します。

このタイプの非常に反復的な試行錯誤プロセスは、私と初心者のデータサイエンティストのチームにとって非常にうまく機能しており、コスト関数の選択とモデルの最適化。

もちろん、この試行錯誤の多くはすでに他の人によって行われているため、一般の知識を活用して、プロセスの早い段階でコスト関数となる可能性のあるものの選択をフィルタリングすることもできます。たとえば、クロスエントロピーは、上の例のようなロジスティック回帰によるバイナリ分類であっても、出力としてsoftmaxレイヤーを持つより複雑なマルチラベル分類であっても、一般に分類問題に適しています。一方、MSEは、既知の可能なカテゴリのセットから既知のカテゴリのメンバーシップの可能性の代わりにスカラー予測を求めている線形回帰問題の最初の良い選択です。この場合、出力としてsoftmaxレイヤーの代わりにdは、活性化関数なしで、入力にバイアスを加えた重み付き合計を持つことができます。

この答えが、過度に単純化しすぎないように、他の初心者に役立つことを願っています。


3

質問の採点

TensorFlowのほとんどの例では、(1-y_train)* log(1-y_output)の部分はどこにありますか?不足していませんか?

答えは、ほとんどの出力関数がソフトマックスであるということです。つまり、間違った場合にすべての確率を減らす必要はありません。正しい確率を増やすと自動的に確率が減るからです。

例えば:

最適化前

y_output = [0.2, 0.2, 0.6] そして y_train = [0, 0, 1]

最適化後

y_output = [0.15, 0.15, 0.7] そして y_train = [0, 0, 1]

ここでは、3番目の用語を増やしただけで、他のすべての用語は自動的に減少することを観察します。

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