損失関数とメトリック
CNTKには、一般的な定義済みの損失関数 (トレーニング中に最適化するトレーニング条件) とメトリック (またはパフォーマンス追跡の評価基準) が含まれています。 さらに、カスタム損失関数/メトリックは、BrainScript 式として定義できます。
CrossEntropy() , CrossEntropyWithSoftmax()
カテゴリ別クロスエントロピー損失 (または 2 つの確率分布間のクロス エントロピー) を計算します。
CrossEntropy (y, p)
CrossEntropyWithSoftmax (y, z)
パラメーター
y
:ラベル (1 ホット)、またはより一般的には参照分布。 合計は 1 にする必要があります。p
(forCrossEntropy()
): 参照に対してスコアを付ける事後確率分布。 合計は 1 にする必要があります。z
(forCrossEntropyWithSoftmax()
): 参照に対してスコアを付けるために事後確率分布を計算する Softmax 演算への入力
戻り値
この演算は、次のように定義された 2 つの確率分布とp
、次のように定義された間のクロスエントロピーを計算しますy
。
ce = E_y{-log p} = -sum_i y_i log p_i
すべてのi
要素y
を反復処理して.p
p
の場合CrossEntropyWithSoftmax()
は、入力パラメーターz
から次のように計算されます。
p = Softmax (z)
説明
これらの関数は、2 つの確率分布の クロスエントロピー を計算します。 カテゴリクロスエントロピーは、単一クラス分類の最も一般的なトレーニング条件 (損失関数) です。ここで、カテゴリ ラベルは y
1 ホット ベクターとしてエンコードされます。
もう 1 つの用途は、確率分布回帰の損失関数として、一 y
致する p
対象分布です。
損失関数として使用する場合、CNTKの SGD プロセスは、ミニバッチ内のすべての個々のサンプルのクロス エントロピー値を合計し、エポック全体でこれらを集計することでエポックごとの損失を計算します。
次に、サンプルあたりの平均損失とS
サンプル数を示す形式 L * S
L
で報告されます。 たとえば、 -1.213 * 3600000
-1.213 の平均クロスエントロピー損失を意味し、3,600,000 サンプルのエポックで平均されます。
CrossEntropyWithSoftmax()
は、Softmax の特定の形式を利用するカテゴリクロスエントロピーの最も一般的なユース ケースの最適化です。
正規化された確率の代わりに、Softmax 操作への引数を入力として受け入れます。これは、"logit" とも呼ばれる、正規化されていないバージョンのログ Softmax と同じです。
これは、カテゴリ間エントロピー条件を計算するCNTKで推奨される方法です。
カテゴリクロスエントロピーは、1 を含む複数の位置を y
含む多クラスラベルに適した損失関数ではないことに注意してください。
この場合は、Softmax の代わりに損失を伴う使用 Sigmoid()
を Logistic()
検討してください。
この記事も参照してください。
代替定義
CrossEntropyWithSoftmax()
は現在、制限があるCNTK プリミティブです。
より柔軟で推奨される代替手段は、次のように手動で定義する方法です。
CrossEntropyWithSoftmax (y, z) = ReduceLogSum (z) - TransposeTimes (y, z)
スパース ラベル
スパース ラベルを使用してクロス エントロピーを計算するには (./Input#input を使用して Input
読み取るなど){..., sparse=true}
、上記の代替形式を使用する必要があります。
ランク>1 のテンソルを超える Softmax
CrossEntropyWithSoftmax()
計算するには、ランク>1 のテンソルに適用する場合 (たとえば、タスクが 2D グリッド上の場所を決定する場合など)、さらに別の別の形式を使用する必要があります。
CrossEntropyWithSoftmax (y, z, axis=None) = ReduceLogSum (z, axis=axis) - ReduceSum (y .* z, axis=axis)
このフォームでは、特定の軸にのみ Softmax 操作を適用することもできます。
たとえば、入力とラベルに図形 [10 x 20]
があり、Softmax を 20 列ごとに個別に計算する必要がある場合は、次のように指定します axis=1
。
例
labels = Input {9000}
...
z = W * h + b
ce = CrossEntropyWithSoftmax (labels, z)
criterionNodes = (ce)
スパース ラベルでも同じです。
labels = Input {9000, sparse=true}
...
z = W * h + b
ce = ReduceLogSum (z) - TransposeTimes (labels, z)
criterionNodes = (ce)
ロジスティック{}、重み付けLogistic{}
ロジスティック損失関数を計算します。
Logistic (y, p)
WeightedLogistic (y, p, instanceWeight)
パラメーター
y
: グラウンド・トゥルース・ラベル、0 または 1p
: クラスの事後確率1
戻り値
次のように定義された (加重) ロジスティック損失を計算します。
ll = -sum_i { y_i * log(p_i) + (1-y_i)*log(1-p_i))} * weight
(ここでは Logistic()
、重みは 1 です)。
説明
この関数はロジスティック損失関数です。
Logistic (y, Softmax (z))
は、2 つの (補完的な) グラウンド トゥルース ラベルの 1 つだけが与えられる Logistic()
2 クラスの問題と同じですCrossEntropyWithSoftmax (y, z)
。
マルチクラス分類子のトレーニングについても 、この記事 を参照してください。
例
multiLabels = Input {1000} # 0 or 1 for each value
...
p = DenseLayer {1000, activation=Sigmoid} (h) # element-wise predictor for 1000 values
ll = Logistic (multiLabels, p)
trainingCriterion = (ll)
ClassificationError{}
カテゴリ ラベルの予測の誤差率を計算します。 バイナリ ラベルの場合は 、hamming loss を使用できます。
ClassificationError (y, z)
パラメーター
y
: 1 ホット形式のカテゴリ ラベルz
: 予測スコアのベクトル (ログ確率など)
戻り値
最大値が 1 の位置y
にある場合は 1。それ以外のz
場合は 0。ミニバッチ全体で合計されます。
説明
この関数は、事後確率、ロジット、またはその他の一致するスコアのベクトルを受け入れます。各要素は、クラスまたはカテゴリの一致スコアを表します。
この関数は、最上位スコアリングの位置に 1 が含まれているかどうかをテストすることによって、最上位スコアリング クラスがラベル入力 y
によって示されるクラスと等しいかどうかを判断します。
評価基準として使用すると、SGD プロセスはエポック上のすべての値を集計し、平均 (エラー率) を報告します。
ClassificationError()
スパース ラベルでは使用できません。
注: バージョン 1.7 より前のCNTKでは、この操作が呼び出ErrorPrediction()
されました。
名前は引き続き使用できますが、非推奨です。
例
labels = Input {9000}
...
z = W * h + b
errs = ClassificationError (labels, z)
evaluationNodes = (errs)