KLDivergence¶
Описание¶
Функция потерь, вычисляющая расстояние (дивергенцию, расхождение) Кульбака-Лейблера (Kullback–Leibler divergence). Отражает, как и CrossEntropy, меру ошибки при представлении одной плотности (реальной) вероятностей другой (предсказанной)
Применяется в задачах классификации.
Формула функции ошибки:
где
P, Q - непрерывные случайные величины в пространстве R^d;
KL(P || Q) - расстояние Кульбака-Лейблера для распределений P и Q;
p(x), q(x) - плотности распределений величин P и Q соответственно.
Связь с энтропией и кросс-энтропией:
где
H(p) - энтропия распределения P;
H(p, q) - перекрёстная энтропия распределений P и Q.
Инициализация¶
def __init__(self, maxlabels=None, normTarget=False):
Параметры
Параметр | Возможные типы | Описание | По умолчанию |
---|---|---|---|
maxlabels | int | Индекс последнего возможного класса | None |
normTarget | bool | Производить ли нормировку целевого распределения | False |
Пояснения
maxlabels
- нужен для дополнительной проверки при работе с загруженными целевыми лейблами, т.е. если в целевых лейблах присутствуют значения большие, чем переданная в этом аргументе величина, класс выкинет ошибку;
normTarget
- при выставлении этого флага будет произведена нормировка значений целевого тензора классов софтмакс функцией, т.е., если целевой тензор получен в "сыром" виде со значениями x_i\in{R}, то при поднятом флаге x_i\in[0, 1], причём \sum_{i=0}^N x_i = 1.
Примеры¶
Необходимые импорты:
import numpy as np
from PuzzleLib.Backend import gpuarray
from PuzzleLib.Cost import KLDivergence
Info
gpuarray
необходим для правильного размещения тензора на GPU.
Синтетические целевой и предсказательный тензоры:
scores = gpuarray.to_gpu(np.random.randn(10, 10).astype(np.float32))
labels = gpuarray.to_gpu(np.random.randn(10, 10).astype(np.float32))
Important
Не забывайте, что первым измерением целевого и предсказательного тензоров является размер батча.
Инициализация функции ошибки:
div = KLDivergence(normTarget=True)
Расчёт ошибки и градиента на батче:
error, grad = div(pred, target)