質問

使ってます Tensorflow 主にニューラルネットワークを使用した実験の場合。私はかなりの実験(Xor-Problem、Mnist、いくつかの回帰のもの、...)を行ってきましたが、私は全体的に初心者と見なされる可能性があるため、特定の問題に対して「正しい」コスト関数を選択するのに苦労しています。

Tensorflowに来る前に、私は完全に接続されたMLPといくつかの再発ネットワークを独力でコーディングしました Pythonnumpy しかし、ほとんどの場合、単純な四角いエラーと単純な勾配の降下で十分な問題がありました。

ただし、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で、私にとってはそれほど重要ではないか)を使用する時期についての短い要約が必要です。初心者向けのソース;)

役に立ちましたか?

解決

この答えは次のとおりです 全般的 Tensorflowとは関係のないコスト関数の側面であり、主に「このトピックについてのいくつかの説明」の一部に質問します。

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

交差点、ロジット、L2規範、または特定のものに関する回答が必要な場合は、複数のより具体的な質問を投稿することをお勧めします。これにより、特定の知識を持っている人があなたの質問を見る確率が高まります。


目的の結果を達成するために適切なコスト関数を選択することは、機械学習の問題の重要なポイントです。基本的なアプローチは、あなたがあなたの方法から何を望んでいるかを正確に知らない場合、使用することです 平均平方エラー(ウィキペディア) 回帰問題と分類問題のエラーの割合。ただし、必要に応じて 良い あなたの方法から結果、あなたはそうする必要があります 良いものを定義します, 、したがって、適切なコスト関数を定義します。これは、ドメインの知識(データは何ですか、何を達成しようとしているのか)と、自由に使えるツールの知識の両方に由来しています。

ツールの知識がほとんどないため、Tensorflowで既に実装されているコスト関数をガイドできるとは思いませんが、さまざまなコスト関数の書き込みと評価方法について例を挙げてもらえます。


コスト関数間のさまざまな違いを説明するために、各サンプルに対して、必要なバイナリ分類問題の例を使用してみましょう $ x_n $, 、 クラス $ f(x_n) in {0,1 } $.

で始まります 計算プロパティ; 「同じもの」を測定する2つの機能が異なる結果につながる可能性があります。次の単純なコスト関数を取得します。エラーの割合。あなたが持っている場合 $ n $ サンプル、 $ f(y_n)$ 予測されたクラスです $ y_n $ 本当のクラス、あなたは最小化したいです

  • $ frac {1} {n} sum_n left { begin {array} {ll} 1& text {if} f(x_n) not = y_n 0& text {それ以外の} end {array} 右。 = sum_n y_n [1-f(x_n)] + [1-y_n] f(x_n)$.

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

  • $ frac {1} {n} sum_n y_n p(y_n = 0 | x_n) +(1 -y_n)p(y_n = 1 | x_n)$.

この関数はよりスムーズで、勾配降下アプローチによりうまく機能します。 「より細かい」モデルが取得されます。ただし、他にも問題があります。あいまいなサンプルがある場合は、より良いことを言うのに十分な情報がないとしましょう。 $ p(y_n = 1 | x_n)= 0.5 $. 。次に、このコスト関数に勾配降下を使用すると、この確率を可能な限り増加させるモデルにつながります。

この関数のもう1つの問題は、ifです $ p(y_n = 1 | x_n)= 1 $ その間 $ y_n = 0 $, 、あなたは正しいことは確かですが、あなたは間違っています。この問題を回避するために、確率のログを取得できます。 $ log p(y_n | x_n)$. 。として $ log(0)= infty $$ log(1)= 0 $, 、次の関数には、前の段落で説明されている問題はありません。

  • $ frac {1} {n} sum_n y_n log p(y_n = 0 | x_n) +(1 -y_n) log p(y_n = 1 | x_n)$ $.

これは、それを最適化するためにそれを示すはずです 同じこと, 、エラーの割合は、異なる定義が、計算的に理解しやすい場合、異なる結果をもたらす可能性があります。

コスト関数が可能です $ a $$ b $ を測定する 同じ概念, 、 しかし $ a $ あなたの方法をより良い結果よりも導くかもしれません $ b $.


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

アルゴリズムが返された場合に注意してください すべての, 、それは可能な限りすべての関連する結果を返し、したがって高いリコールを持っていますが、精度が非常に低くなります。一方、それが戻る場合のみ 1 要素、それが最も確実なものであるものは関連性があり、高精度ではあるが低いリコールがあります。

このようなアルゴリズムを判断するために、共通のコスト関数は $ f $- スコア(ウィキペディア). 。一般的なケースはです $ f_1 $- スコア、精度とリコールに等しい重みを与えますが、一般的なケース $ f_ beta $- スコア、そしてあなたは調整することができます $ beta $ 取得するため

  • 使用する場合は、より高いリコール $ beta> 1 $
  • 使用する場合、より高い精度 $ beta <1 $.

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

よく育てられるもう1つの例は、医療診断の場合です。好ましいものに応じて、より多くの虚偽のネガまたは誤検知を罰するコスト関数を選択できます。

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

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


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

他のヒント

交差エントロピーに関する質問に答えるために、あなたが言及したことの両方が同じことであることに気付くでしょう。

$ - frac {1} {n} sum(y _train * log(y _output) +(1 -y _train) cdot log(1 -y _output)$ $

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

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

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

$ - sum_n train _prob cdot log(out _prob)$

総合が複数のクラスを超えており、各クラスの確率はあります。明らかにバイナリの場合、それは前述のものとまったく同じものです。 $ n $の用語は、一定であるため、損失の最小化に何らかの形で寄与しないため、省略されています。

Bluf:データとMatplotlibのサブセットを備えた反復試行と誤文。

長い答え:

私のチームは、それほど前に同じ質問に苦労していました。ここでのすべての答えは素晴らしいですが、私はあなたと、コンテキストのために私の「初心者の答え」を、機械学習に慣れていない人々の出発点として共有したいと思いました。

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

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

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

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

このタイプの非常に反復的な試行と誤差のプロセスは、私と初心者のデータサイエンティストのチームにとって非常にうまく機能しており、コスト関数の選択とコスト関数の選択の背後にある数学理論に深く飛び込むことなく、質問の解決策を見つけることに集中させることができます。モデルの最適化。

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

この答えが、過度に単純で明白であることなく、他の初心者に役立つことを願っています。

あなたの質問を再生します

ほとんどのTensorflowの例の(1 -y_train) * log(1 -y_output)部分はどこにありますか?見逃していませんか?

答えは、ほとんどの出力関数がsoftmaxであるということです。つまり、正しい場合の確率を増やすと自動的に削減されるため、間違った場合のすべての確率を必ずしも減らす必要はありません。

例えば:

最適化前

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期を増やしただけでも、他のすべての用語が自動的に減少したことを観察します

ライセンス: CC-BY-SA帰属
所属していません datascience.stackexchange
scroll top