すべてのチャレンジ
簡単 0件解決済み 正答率0%

カテゴリカル交差エントロピー損失

多クラス分類器の損失を、予測確率と正解クラスから計算します。

このチャレンジで学べること

  • 予測確率を正しいクラスと照らして評価する
  • サンプル全体で損失を平均する
  • 範囲を制限して log(0) を避ける

問題

原文(英語)を表示

多クラス分類器はクラスごとに確率を出力します(たとえばソフトマックスから)。カテゴリカル交差エントロピーは、正解クラスに低い確率を与えたときにペナルティを与えます。

loss = -(ln(p₁) + ln(p₂) + … + ln(pₙ)) / n

ここで pᵢ は、サンプル i の正解クラスにモデルが与えた確率です。ln(0) を避けるため、まず 0.0000001 未満の確率は 0.0000001 に引き上げてください。

categorical_cross_entropy(probabilities, labels) を実装してください。

入力

probabilities: サンプルごとに1行、クラスごとに1つの確率。

labels: 各サンプルの正解クラスのインデックス(0 から始まる)。

出力

平均損失を小数で返してください。

制約

1 ≤ サンプル数 ≤ 1,000、2 ≤ クラス数 ≤ 100

0 ≤ 各確率 ≤ 1

0 ≤ labels[i] < クラス数

例

例 1
入力:
labels = [0, 1]
probabilities = [
    [0.7, 0.2, 0.1],
    [0.1, 0.8, 0.1]
]

期待される出力:
expected = 0.289909
入力:
std::vector<long long> labels = {0, 1};
std::vector<std::vector<double>> probabilities = {
    {0.7, 0.2, 0.1},
    {0.1, 0.8, 0.1}
};

期待される出力:
double expected = 0.289909;
入力:
long[] labels = new long[] {0, 1};
double[][] probabilities = new double[][] {
    new double[] {0.7, 0.2, 0.1},
    new double[] {0.1, 0.8, 0.1}
};

期待される出力:
double expected = 0.289909;

解説

正解クラスの確率は 0.7 と 0.8 です:-(ln(0.7) + ln(0.8)) / 2 = -(-0.356675 - 0.223144) / 2 ≈ 0.289909。

例 2
入力:
labels = [1]
probabilities = [
    [1.0, 0.0]
]

期待される出力:
expected = 16.118096
入力:
std::vector<long long> labels = {1};
std::vector<std::vector<double>> probabilities = {
    {1.0, 0.0}
};

期待される出力:
double expected = 16.118096;
入力:
long[] labels = new long[] {1};
double[][] probabilities = new double[][] {
    new double[] {1.0, 0.0}
};

期待される出力:
double expected = 16.118096;

解説

正解クラスの確率は 0 で、0.0000001 に引き上げられるので、損失は -ln(0.0000001) ≈ 16.118096 です。自信満々の誤答には大きなペナルティがかかります。

参考資料

この課題はCodeUtility用に調整されています。上記の説明と制約に従ってください。

他の人の解答から学ぶ

コミュニティの解答

まだ公開された解答がありません。この課題を解いて最初の解答を共有しましょう。