1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
//! Модуль, реализующий функцию потерь Бинарной Перекрестной Энтропии (BCE).
use crateTensor;
/// Вычисляет Бинарную Перекрестную Энтропию (Binary Cross-Entropy Loss).
///
/// Эта функция потерь идеально подходит для задач бинарной классификации (когда
/// есть только два класса, 0 и 1). Она ожидает, что предсказания модели
/// (`p`) находятся в диапазоне `[0, 1]`, что обычно достигается с помощью
/// `sigmoid` активации на выходе.
///
/// Формула: `Loss = -sum(y * log(p) + (1 - y) * log(1 - p))`.
///
/// # Аргументы
///
/// * `p` - Тензор с предсказанными вероятностями (выходы модели после `sigmoid`).
/// * `y` - Тензор с истинными метками (должны быть 0.0 или 1.0).
///
/// # Возвращает
///
/// Скалярный `Tensor`, содержащий значение ошибки.
///
/// # Примеры
///
/// # use rusty_gradients::tensor::Tensor;
/// # use rusty_gradients::losses::bce_loss;
/// # use ndarray::array;
/// let predictions = Tensor::new(array![0.9, 0.2, 0.8].into_dyn(), true);
/// let targets = Tensor::new(array![1.0, 0.0, 1.0].into_dyn(), false);
///
/// let loss = bce_loss(&predictions, &targets);
///
/// // loss = - (1*log(0.9) + 0*log(0.8) + 1*log(0.8))
/// // loss = - ( -0.1053 + 0 + -0.2231 ) = 0.3284
/// assert!((loss.data.borrow().sum() - 0.3284).abs() < 1e-4);
/// ```