문제
손실 함수는 모델의 실수를 최소화할 하나의 숫자로 바꿉니다. n을 예측 개수라고 할 때, 자주 쓰이는 세 가지 손실에 대해 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})
예시
입력:
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입니다.
입력:
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. 자신 있게 맞힌 예측은 손실이 작습니다.
접근 방법
먼저 스스로 풀어 본 뒤 힌트를 하나씩 열어 보세요.
힌트 1
각 loss는 예측값과 target을 원소별로 비교한 뒤, 예제별 오차를 평균냅니다.
힌트 2
cross-entropy에서는 로그를 취하기 전에 prediction을 0과 1에서 살짝 떨어뜨려 clamp하세요.
힌트 3
절댓값과 제곱은 다르다는 점을 기억하고, cross-entropy는 target을 각 log 항의 가중치로 사용합니다.
예상 복잡도
시간 O(n), 추가 공간 O(1)
참고 자료
이 문제는 CodeUtility에 맞게 수정되었습니다. 위의 설명과 제한 조건을 따르세요.