Я немного запутался в том, как применяется расхождение 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; Я просто вижу много переопределений базовой формулы.
Итак, мои вопросы:
Верна ли эта интерпретация того, что делает Керас, чтобы получить потерю расхождения KL (т. Е. Усреднение по расхождению строк KL)?
Почему это правильно?
С точки зрения реализации, почему определение функции потерь в Keras не выполняет агрегацию по строкам так, как это делают MAE или MSE?