Посмотрите часть 1 (здесь) и часть 2 (здесь) этой серии. Эта статья изначально была опубликована в блоге Comet.

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

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

В ситуациях с ограничениями задержки такие методы, как отсев MC, могут оказаться непригодными для оценки интервала прогнозирования. Что мы можем сделать, чтобы уменьшить количество прогнозов, необходимых для оценки интервала?

Использование метода максимального правдоподобия (MLE) для оценки интервалов

В части 1 этой серии мы сделали предположение, что средний отклик нашей зависимой переменной μ(y|x), имеет нормальное распределение.

Метод MLE включает в себя создание двух моделей: одна для оценки условного среднего ответа, μ(y|x), а другая — для оценки дисперсии, σ², в прогнозируемом ответе.

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

Вторая модель, mσ², обучается с использованием второй половины данных и квадратов невязок в качестве зависимой переменной.

Окончательный интервал предсказания может быть выражен следующим образом

Здесь α — желаемый уровень уверенности в соответствии с распределением Гаусса.

Давайте попробуем

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

Mean Variance Estimation Method
dataset_path = keras.utils.get_file("auto-mpg.data", "http://archive.ics.uci.edu/ml/machine-learning-databases/auto-mpg/auto-mpg.data")
column_names =['MPG','Cylinders','Displacement','Horsepower','Weight',
                'Acceleration', 'Model Year', 'Origin']
raw_dataset = pd.read_csv(dataset_path, names=column_names,
                      na_values = "?", comment='\t',
                      sep=" ", skipinitialspace=True)
dataset = raw_dataset.copy()
dataset = dataset.dropna()
origin = dataset.pop('Origin')
dataset['USA'] = (origin == 1) * 1.0
dataset['Europe'] = (origin == 2) * 1.0
dataset['Japan'] = (origin == 3) * 1.0
train_dataset = dataset.sample(frac=0.8,random_state=0)
test_dataset = dataset.drop(train_dataset.index)mean_dataset = train_dataset.sample(frac=0.5 , random_state=0)
var_dataset = train_dataset.drop(mean_dataset.index)

Далее мы собираемся создать две модели для оценки среднего значения и дисперсии наших данных.

MC Dropout Method
import keras
from keras.models import Model
from keras.layers import Input, Dense, Dropout
dropout_rate = 0.5
def model_fn():
    inputs = Input(shape=(9,))
    x = Dense(64, activation='relu')(inputs)
    x = Dropout(dropout_rate)(x)
    x = Dense(64, activation='relu')(x)
    x = Dropout(dropout_rate)(x)
    outputs = Dense(1)(x)
    
    model = Model(inputs, outputs)
    
    return model
mean_model = model_fn()
mean_model.compile(loss="mean_squared_error", optimizer='adam')
var_model = model_fn()
var_model.compile(loss="mean_squared_error", optimizer='adam')

Наконец, мы собираемся нормализовать наши данные и начать обучение.

train_stats = train_dataset.describe()
train_stats.pop("MPG")
train_stats.transpose()
def norm(x):
    return (x - train_stats.loc['mean']) / train_stats.loc['std']
normed_mean_data = norm(mean_dataset)
normed_var_data = norm(var_dataset)
normed_test_data = norm(test_dataset)
train_labels = train_dataset.pop('MPG')
test_labels = test_dataset.pop('MPG')
mean_labels = mean_dataset.pop('MPG')
var_labels = var_dataset.pop('MPG')

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

EPOCHS = 100
mean_model.fit(normed_mean_data, mean_labels, epochs=EPOCHS, validation_split=0.2, verbose=0)
mean_predictions = mean_model.predict(normed_var_data)
squared_residuals = (var_labels.values.reshape(-1,1) - mean_predictions) ** 2
var_model.fit(normed_var_data, squared_residuals, epochs=EPOCHS, validation_split=0.2, verbose=0)

Давайте посмотрим на интервалы, полученные с помощью этого подхода.

Вы заметите, что очень неточные прогнозы имеют гораздо большие интервалы вокруг среднего значения.

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

Использование квантильной регрессии для оценки интервалов

Что, если мы не хотим делать предположения о распределении нашей переменной отклика, а хотим напрямую оценить верхний и нижний пределы нашей целевой переменной?

Квантильная потеря может помочь нам оценить ответ целевого процентиля, а не средний ответ. то есть прогнозирование 0,25-го значения квантиля нашей цели скажет нам, что, учитывая наш текущий набор функций, мы ожидаем, что 25% целевых значений будут равны или меньше нашего прогноза.

Если мы обучим две отдельные модели регрессии, одну для процентиля 0,025, а другую для процентиля 0,9725, мы фактически говорим, что ожидаем, что 95% наших целевых значений попадут в этот интервал, т.е. Интервал прогнозирования 95%

Давайте попробуем

Keras не имеет квантильной потери по умолчанию, поэтому мы собираемся использовать следующую реализацию из Sachin Abeywardana.

import keras.backend as K
def tilted_loss(q,y,f):
    e = (y-f)
    return K.mean(K.maximum(q*e, (q-1)*e), axis=-1)model = 
model_fn()
model.compile(loss=lambda y,f: tilted_loss(0.5,y,f), optimizer='adam')
lowerq_model = model_fn()
lowerq_model.compile(loss=lambda y,f: tilted_loss(0.025,y,f), optimizer='adam')
upperq_model = model_fn()
upperq_model.compile(loss=lambda y,f: tilted_loss(0.9725,y,f), optimizer='adam')

Полученные прогнозы выглядят так

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

Оценка прогнозируемых интервалов

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

Сравнение методов оценки неопределенности в нейронных сетях

Мы видим, что метод оценки средней дисперсии создает интервалы с наименьшей шириной, что приводит к уменьшению его оценки PICP. Выпадение MC и квантильная регрессия дают очень широкие интервалы, что приводит к идеальному показателю PICP.

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

Заключение

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

Надеюсь, вам понравилась наша серия статей о неопределенности. Продолжайте смотреть это пространство для большего количества отличного контента!!

Примечание редактора. Heartbeat — это интернет-издание и сообщество, созданное участниками и посвященное предоставлению лучших образовательных ресурсов для специалистов по науке о данных, машинному обучению и глубокому обучению. Мы стремимся поддерживать и вдохновлять разработчиков и инженеров из всех слоев общества.

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

Если вы хотите внести свой вклад, перейдите к нашему призыву к участию. Вы также можете подписаться на получение наших еженедельных информационных бюллетеней (Еженедельник глубокого обучения и Информационный бюллетень Comet), присоединиться к нам в Slack и следить за Comet в Twitter и LinkedIn, чтобы получать ресурсы, события и многое другое, что поможет вам быстрее создавать лучшие модели машинного обучения.