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

損失関数:MSE、MAE、交差エントロピー

平均二乗誤差、平均絶対誤差、二値交差エントロピーで、予測がどれだけ間違っているかを測ります。

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

  • 3 つの方法で予測の誤差を測る
  • log(0) を避けるため確率を範囲内に収める
  • 回帰と分類で損失関数を選ぶ

問題

原文(英語)を表示

損失関数は、モデルの誤りを最小化すべき1つの数値に変えます。n を予測の数として、よく使われる3つの損失について compute_loss(kind, predictions, targets) を実装してください。

  • "mse"(平均二乗誤差):(p - t)² の平均
  • "mae"(平均絶対誤差):|p - t| の平均
  • "binary_cross_entropy":[t × ln(p) + (1 - t) × ln(1 - p)] の平均の符号を反転したもの。ln(0) を計算しないよう、まず各予測 p を [0.0000001, 0.9999999] の範囲に収めてください。

入力

kind: "mse"、"mae"、"binary_cross_entropy" のいずれか。

predictions: モデルの予測。

targets: 正しい値(同じ長さ)。交差エントロピーでは 0 または 1 で、予測は 0 から 1 の間です。

出力

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

制約

1 ≤ 長さ ≤ 1,000

-1,000 ≤ 各値 ≤ 1,000(交差エントロピーでは 0 ≤ p ≤ 1、t ∈ {0, 1})

例

例 1
入力:
kind = "mse"
targets = [3.0, -0.5, 2.0]
predictions = [2.5, 0.0, 2.0]

期待される出力:
expected = 0.166667
入力:
std::string kind = "mse";
std::vector<double> targets = {3.0, -0.5, 2.0};
std::vector<double> predictions = {2.5, 0.0, 2.0};

期待される出力:
double expected = 0.166667;
入力:
string kind = "mse";
double[] targets = new double[] {3.0, -0.5, 2.0};
double[] predictions = new double[] {2.5, 0.0, 2.0};

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

解説

二乗誤差:0.5² = 0.25、0.5² = 0.25、0² = 0。その平均は 0.5 / 3 ≈ 0.166667 です。

例 2
入力:
kind = "binary_cross_entropy"
targets = [1.0, 0.0]
predictions = [0.9, 0.2]

期待される出力:
expected = 0.164252
入力:
std::string kind = "binary_cross_entropy";
std::vector<double> targets = {1.0, 0.0};
std::vector<double> predictions = {0.9, 0.2};

期待される出力:
double expected = 0.164252;
入力:
string kind = "binary_cross_entropy";
double[] targets = new double[] {1.0, 0.0};
double[] predictions = new double[] {0.9, 0.2};

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

解説

-(ln(0.9) + ln(1 - 0.2)) / 2 = -(-0.105361 - 0.223144) / 2 ≈ 0.164252。自信を持った正しい予測は損失が小さくなります。

参考資料

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

他の人の解答から学ぶ

コミュニティの解答

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