TLDR: мы показываем, как модели регрессии среднеквадратичной ошибки могут быть обобщены таким образом, чтобы модель выдавала нормальное распределение вместо одного прогноза. Проверьте этот блокнот для кода.

Допустим, мы строим регрессионную модель для предсказания завтрашней температуры. Модель предсказывает 21,3 градуса по Цельсию. Но что это значит? Можем ли мы быть уверены, что температура не будет ниже 20 градусов?

Обучение регрессионных моделей выходным вероятностным распределениям

В этой записи блога мы объясним, как обучить регрессионную модель таким образом, чтобы вместо одного прогноза она выдавала распределение вероятностей. Мы выбираем нормальное распределение, поэтому модель будет выводить среднее значение (например, 21,3 градуса) и стандартное отклонение (например, 2,7 градуса) . В результате мы можем судить о том, какой диапазон возможных значений температуры, по мнению модели, является вероятным.

Обратите внимание, что это то, что мы уже имеем для моделей классификации, где модели обычно присваивают вероятность каждому из возможных классов. При бесконечном количестве возможных значений в случае регрессионных моделей приходится прибегать к параметрическим моделям, таким как нормальное распределение. Эти модели могут быть описаны с использованием фиксированного набора параметров. Преимущества распределения вероятностей вместо одиночного прогноза включают в себя:

  • Мы получаем количественную оценку достоверности модели, что позволяет нам лучше судить о том, каким предсказаниям мы можем доверять.
  • Мы можем использовать его для запуска симуляций. Например, предположим, что нас действительно интересует прогнозирование затрат на энергию. Мы могли бы сделать выборку из нашего распределения вероятностей температуры и ввести ее в моделирование стоимости энергии.

Пример: прогнозирование температуры по историческим данным

В качестве примера возьмем набор данных дневных минимальных температур в Мельбурне. Первый взгляд на данные показывает, что существует сильная годовая закономерность:

Для целей этого урока мы будем использовать очень простую архитектуру модели: нейронная сеть без скрытого слоя, по сути, линейная регрессия. Однако в дополнение к блоку вывода предсказания температуры мы добавим еще один для стандартного отклонения:

Далее мы дадим общее описание того, как можно обучить такую ​​модель. Если вы хотите увидеть код, вы можете следить за ним в этом автономном блокноте Jupyter Notebook.

Определение пользовательской функции потерь

Обычно блок прогнозирования температуры обучается с использованием функции потерь Mean Squared Error, которая поставляется с библиотеками глубокого обучения, такими как TensorFlow. Однако это не даст обучающего сигнала блоку вывода стандартного отклонения.

Поэтому мы выводим нашу собственную функцию потерь, основанную на отрицательном логарифмическом правдоподобии обучающих данных, где правдоподобие вычисляется из функции плотности вероятности нормального распределения:

Здесь x — температура обучающей выборки, μ — прогноз температуры модели, а σ — стандартное отклонение. Если f(x) — это вероятность, отрицательное логарифмическое правдоподобие равно:

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

Игра с моделью

В качестве игрушечного примера давайте скормим сети ничего, кроме горячей кодировки текущего месяца в качестве единственного входного признака. Все, что модель действительно может сделать, — это выучить среднемесячные значения и стандартные отклонения.

Вот график температур 1990-х годов, прогнозы и доверительные интервалы:

Серая область соответствует прогнозу плюс/минус одно стандартное отклонение или, эквивалентно, доверительному интервалу 68%. Как и ожидалось, прогнозы постоянны в течение одного месяца, и большинство фактических температур попадают в доверительный интервал.

Обратите внимание, что эти прогнозы вычисляются на подмножестве обучающих данных. Как правило, лучше всего разделить данные на подмножества обучения и разработки, чтобы измерить и бороться с переоснащением.

Переход к сложным функциям и моделям

Теперь нам не нужно глубокое обучение для вычисления средних значений и стандартных отклонений. Прелесть подхода в том, что вы можете подключить свою причудливую рекуррентную нейронную сеть и добавить множество функций, и все будет работать точно так же.

Например, если мы добавим среднее значение и стандартное отклонение температуры за последние семь дней к вектору признаков модели, мы увидим, что модель уже начинает более точно предсказывать фактическую температуру:

Вывод

Мы показали, как относительно простая модификация стандартной цели обучения регрессии может привести к моделям, способным выводить параметризованные распределения вероятностей вместо изолированных оценок. Этот подход широко применим и не ограничивается конкретной архитектурой нейронной сети.

Еще раз взгляните на код, если вам интересны некоторые детали реализации. Если вы попробуете этот подход в своем проекте, напишите нам, чтобы мы знали, как все прошло :)