В чем смысл реализации KL-дивергенции в Керасе?

Я немного запутался в том, как применяется расхождение KL, особенно в Keras, но я думаю, что этот вопрос является общим для приложений глубокого обучения. В keras функция потерь KL определяется следующим образом:

def kullback_leibler_divergence(y_true, y_pred):
    y_true = K.clip(y_true, K.epsilon(), 1)
    y_pred = K.clip(y_pred, K.epsilon(), 1)
    return K.sum(y_true * K.log(y_true / y_pred), axis=-1)

В моей модели y_true и y_pred — матрицы; каждая строка y_true представляет собой однократное кодирование для одного обучающего примера, а каждая строка y_pred представляет собой вывод модели (распределение вероятностей) для этого примера.

Я могу запустить этот расчет расхождения KL для любой заданной пары строк из y_true и y_pred и получить ожидаемый результат. Среднее значение этих результатов расхождения KL по строкам соответствует потере, о которой сообщил Керас в истории обучения. Но эта агрегация — выполнение расхождения KL в каждой строке и получение среднего значения — не происходит в функции потерь. Напротив, я понимаю, что MAE или MSE объединяются в примерах:

def mean_squared_error(y_true, y_pred):
    return K.mean(K.square(y_pred - y_true), axis=-1)

Что касается дивергенции KL, то для меня не совсем очевидно, что брать среднее значение в примерах правильно. Я предполагаю, что идея состоит в том, что примеры являются случайными выборками из истинного распределения, поэтому они должны появляться пропорционально их вероятности. Но это, кажется, делает довольно сильное предположение о том, как собирались обучающие данные. На самом деле я не видел, чтобы этот аспект (объединение выборок из набора данных) рассматривался в онлайн-обработках дивергенции KL; Я просто вижу много переопределений базовой формулы.

Итак, мои вопросы:

  1. Верна ли эта интерпретация того, что делает Керас, чтобы получить потерю расхождения KL (т. Е. Усреднение по расхождению строк KL)?

  2. Почему это правильно?

  3. С точки зрения реализации, почему определение функции потерь в Keras не выполняет агрегацию по строкам так, как это делают MAE или MSE?


person mechner    schedule 05.06.2017    source источник


Ответы (1)


Дивергенция Кульбака-Лейблера является мерой сходства между двумя распределениями вероятностей. Дивергенция KL, реализованная в Keras, предполагает два дискретных распределения вероятностей (отсюда и сумма).

Точный формат вашей функции потерь KL зависит от основных распределений вероятностей. Обычный вариант использования состоит в том, что нейронная сеть моделирует параметры распределения вероятностей P (например, гауссова), а расхождение KL затем используется в функции потерь для определения сходства между смоделированным распределением и некоторым другим известным распределением (потенциально гауссовым). также). Например. сеть выводит два вектора mu и sigma^2. Mu формирует среднее значение гауссовского распределения P, а sigma^2 является диагональю ковариационной матрицы Sigma. Тогда возможной функцией потерь является расхождение KL между гауссианом P, описываемым mu и Sigma, и единичным гауссианом N(0, I). Точный формат расхождения KL в этом случае может быть получен аналитически, что даст пользовательскую функцию потерь keras, которая совсем не равна расхождению KL, реализованному в Keras.

В оригинальной статье, посвященной вариационным автокодировщикам, функция потерь суммируется по образцам в мини-пакете, а затем умножается на коэффициент (N/M), где N — размер всего набора данных, а M — размер минипакет. См. уравнения 8 и 10 в https://arxiv.org/abs/1312.6114.

person datwelk    schedule 06.06.2017
comment
и единица Гаусса. Я думаю, вы должны объяснить, почему единица Гаусса. - person nbro; 29.10.2019
comment
Это зависит от ваших данных и вашей графической модели. Существуют различные причины, по которым вы можете захотеть, чтобы смоделированное распределение вероятностей напоминало единицу Гаусса. - person datwelk; 01.04.2020
comment
Если есть разные причины, то вы можете легко привести одну причину/пример! - person nbro; 01.04.2020