Вероятностное глубокое обучение

Введение

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

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

Статьи, опубликованные на данный момент:

  1. Нежное введение в вероятность TensorFlow: объекты распределения
  2. Нежное введение в вероятность TensorFlow: обучаемые параметры
  3. Оценка максимального правдоподобия с нуля в TensorFlow Probability
  4. Вероятностная линейная регрессия с нуля в TensorFlow
  5. Вероятностная и детерминированная регрессия с Tensorflow
  6. Частотник против байесовской статистики с Tensorflow

Мы разрабатываем наши модели, используя TensorFlow и TensorFlow Probability. TensorFlow Probability — это библиотека Python, построенная поверх TensorFlow. Мы собираемся начать с основных объектов, которые мы можем найти в TensorFlow Probability, и понять, как мы можем ими манипулировать. В течение следующих недель мы будем постепенно увеличивать сложность и объединять наши вероятностные модели с глубоким обучением на современном оборудовании (например, на графическом процессоре).

Как обычно, код доступен на моем GitHub.

Вероятностная и детерминированная регрессия

Определения

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

Если мы думаем о моделях линейной регрессии, сразу приходит на ум теорема Гаусса-Маркова, поскольку она устанавливает оптимальность оценки методом наименьших квадратов (МНК) при определенных предположениях. В частности, теорема Гаусса-Маркова утверждает, что МНК-оценка является лучшей линейной несмещенной оценкой (СИНЕЙ), что означает, что она имеет наименьшую дисперсию среди всех линейных несмещенных оценок. Однако теорема Гаусса-Маркова не решает проблемы неопределенности или достоверности оценок, что является ключевым аспектом вероятностных подходов.

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

Приведем простой пример, чтобы упростить понимание. Исследователь изучает взаимосвязь между временем подготовки студентов к тесту и их баллами. В этом сценарии исследователь может использовать метод МНК для оценки наклона и пересечения линии регрессии и использовать теорему Гаусса-Маркова для обоснования выбора этой оценки. Однако, как мы заявляли ранее, теорема Гаусса-Маркова не решает проблемы неопределенности или достоверности оценок. В вероятностном мире акцент делается на использовании вероятности для описания неопределенности или уверенности в модели или параметре, а не просто на оптимальности оценщика. Таким образом, мы могли бы использовать другой подход к оценке наклона и пересечения линии регрессии. Следовательно, мы можем прийти к другому выводу о взаимосвязи между временем обучения и результатами тестов на основе данных и априорных убеждений в значениях наклона и точки пересечения.

Байесовская статистика и компромисс между погрешностью и дисперсией

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

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

Нелинейная вероятностная регрессия

Давайте перейдем к примеру, чтобы упростить понимание этих концепций. Мы не будем рассматривать полностью байесовский подход, который повлечет за собой оценку эпистемической неопределенности — неопределенности модели. Мы изучим этот тип неопределенности в следующей статье. Тем не менее, мы будем оценивать другой вид неопределенности — алеаторическую неопределенность. Его можно определить как неопределенность в процессе генерации данных.

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

Мы начнем с создания некоторых данных, которые следуют нелинейному шаблону:

Обратите внимание, что шум 𝜖𝑖N(0,1) независим и одинаково распределен.

x = np.linspace(-1, 1, 1000)[:, np.newaxis]
y = np.power(x, 3) + (3/15)*(1+x)*np.random.randn(1000)[:, np.newaxis]

plt.scatter(x, y, alpha=0.1)
plt.show()

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

def negative_log_like(y_true, y_pred):
    return -y_pred.log_prob(y_true)

Как мы видели в предыдущих статьях, способ расширить наш детерминированный подход глубокого обучения до вероятностного — это использовать вероятностные слои, например. DistributionLambda . Напомним, что слой DistributionLambda возвращает объект распределения. Это также базовый класс для нескольких других вероятностных слоев, реализованных в TensorFlow Probability, которые мы будем использовать в будущих статьях.

Чтобы построить нашу модель, мы начинаем с добавления 2 плотных слоев. Первый имеет 8 единиц и сигмовидную функцию активации. Второй имеет 2 блока и не имеет функции активации. Мы не добавляем его, потому что хотим параметризовать наше распределение Гаусса, которое следует за вторым плотным слоем, с любым реальным значением. Распределение Гаусса определяется слоем theDistributionLambda. Помните, что масштаб распределения — это стандартное отклонение, и оно должно быть положительным значением. Как и прежде, мы передаем компонент тензора через функцию softplus, чтобы учесть это ограничение.

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

model = Sequential([
    Dense(input_shape=(1,), units=8, activation='sigmoid'),
    Dense(2),
    tfpl.DistributionLambda(lambda p:tfd.Normal(loc=p[...,:1], scale=tf.math.softplus(p[...,1:])))
])

model.compile(loss=negative_log_like, optimizer=RMSprop(learning_rate=0.01))
model.summary()

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

y_model = model(x)
y_sample = y_model.sample()
y_model

<tfp.distributions._TensorCoercible 'tensor_coercible' batch_shape=[1000, 1] event_shape=[] dtype=float32>

Мы можем использовать оболочку, которую предоставляет TensorFlow Probability, чтобы упростить реализацию нашего последнего слоя и сделать его более соответствующим тому, что мы ожидаем получить в качестве выходной формы. Используя theIndependentNormallayer, мы можем построить аналогичный дистрибутив, который мы построили с DistributionLambda. В то же время мы можем использовать статический метод, который выводит количество параметров, необходимых вероятностному слою для определения количества единиц в предыдущем Dense слое: tfpl.IndependentNormal.params_size.

model = Sequential([
    Dense(input_shape=(1,), units=8, activation='sigmoid'),
    Dense(tfpl.IndependentNormal.params_size(event_shape=1)),
    tfpl.IndependentNormal(event_shape=1)
])

model.compile(loss=negative_log_like, optimizer=RMSprop(learning_rate=0.01))
model.summary()

Как мы видим, форма теперь указана правильно, так как дополнительное измерение в форме партии было перемещено в форму события.

y_model = model(x)
y_sample = y_model.sample()
y_model

<tfp.distributions._TensorCoercible 'tensor_coercible' batch_shape=[1000, 1] event_shape=[] dtype=float32>

Пришло время подогнать модель под наши синтетически сгенерированные данные.

model.fit(x=x, y=y, epochs=500, verbose=False)
model.evaluate(x, y)

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

y_hat = y_model.mean()
y_sd = y_model.stddev()
y_hat_u = y_hat -2 * y_sd
y_hat_d = y_hat + 2*y_sd

fig, (ax_0, ax_1) =plt.subplots(1, 2, figsize=(15, 5), sharey=True)
ax_0.scatter(x, y, alpha=0.4, label='data')
ax_0.scatter(x, y_sample, alpha=0.4, color='red', label='model sample')
ax_0.legend()
ax_1.scatter(x, y, alpha=0.4, label='data')
ax_1.plot(x, y_hat, color='red', alpha=0.8, label='model $\mu$')
ax_1.plot(x, y_hat_u, color='green', alpha=0.8, label='model $\mu \pm 2 \sigma$')
ax1.plot(x, y_hat_d, color='green', alpha=0.8)
ax1.legend()
plt.show()

Заключение

В этой статье исследованы основные различия между детерминированной и вероятностной регрессией. Мы увидели, что детерминированная регрессия практична, когда взаимосвязь между независимыми и зависимыми переменными хорошо изучена и относительно стабильна. С другой стороны, вероятностная регрессия более уместна, когда в данных есть неопределенность или изменчивость. Затем в качестве упражнения мы подобрали вероятностную модель к нелинейным данным. Добавив дополнительный плотный слой с функцией активации в начале нашей модели, мы можем изучить нелинейные закономерности в данных. Наш последний слой — это вероятностный слой, который выводит объект распределения. Чтобы быть более последовательным с нашей постановкой задачи, мы расширили наш подход к использованию слоя IndependentNormal, который мы исследовали несколько статей назад. Это позволило нам переместить размеры пакета в форму события. Затем мы успешно подогнали данные, предоставив меру алеаторической неопределенности. Наконец, мы создали новые выборки, которые точно следовали исходному процессу генерации данных.

На следующей неделе мы рассмотрим различия между частотным и байесовским подходами. Тогда увидимся!

Оставайтесь на связи: LinkedIn

Ссылки и материалы

[1] — Coursera: специализация глубокого обучения

[2] — Coursera: TensorFlow 2 для глубокого обучения Специализация

[3] — Руководства и учебные пособия по вероятностям TensorFlow

[4] — Сообщения о вероятностях TensorFlow в блоге TensorFlow