KLDivergence

Описание

Функция потерь, вычисляющая расстояние (дивергенцию, расхождение) Кульбака-Лейблера (Kullback–Leibler divergence). Отражает, как и CrossEntropy, меру ошибки при представлении одной плотности (реальной) вероятностей другой (предсказанной)

Применяется в задачах классификации.

Формула функции ошибки:

KL(P || Q) = \int\limits_{R^d} p(x)\log{\frac{p(x)}{q(x)}}dx

где

P, Q - непрерывные случайные величины в пространстве R^d;
KL(P || Q) - расстояние Кульбака-Лейблера для распределений P и Q;
p(x), q(x) - плотности распределений величин P и Q соответственно.

Связь с энтропией и кросс-энтропией:

KL(P || Q) = \int p(x)\log{\frac{p(x)}{q(x)}}dx = \int p(x)\log{p(x)}dx - \int p(x)\log{q(x)}dx = H(p) + H(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)