Когда люди не знают ответа на конкретный вопрос, они говорят: "Я не знаю". Но применимо ли это также к моделям глубокого обучения?

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

Будет серия статей, в которых я объясню эти термины и покажу реализации TFP.

Во-первых, что такое неопределенность?

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

В контексте глубокого обучения существует два основных типа неопределенностей:

  • 1) Алеаторическая неопределенность: это неопределенность из-за случайности данных.
  • 2) Эпистемическая неопределенность. Это неопределенность из-за отсутствия знаний об истинных параметрах модели.

Когда мы обучаем наши модели глубокого обучения, мы используем оценку максимального правдоподобия (MLE).

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

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

Базовая линейная регрессия

Сначала мы создаем линейные данные с некоторым случайным шумом.

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

На самом деле нам не нужно было relu активаций, поскольку набор данных является линейным. Я экспериментировал с некоторыми моделями, и их окончательная форма была relu, поэтому я не стал их удалять в конце.

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

Когда мы запустим скрипт выше, мы получим:

Model1: Prediction for 15: [[31.22317]]
Model2: Prediction for 15: [[30.969236]]
Model3: Prediction for 15: [[31.227913]]

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

Оценочные параметры зависят в основном от двух вещей:

  • Размер набора данных
  • Начальная точка градиентного спуска

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

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

Базовая классификация изображений и Softmax

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

После загрузки и обработки данных простую модель можно записать следующим образом:

Резюме модели выглядит так и ничего особенного в ней нет:

Layer (type)                Output Shape              Param #   
=================================================================
 conv2d (Conv2D)             (None, 28, 28, 16)        160       
                                                                 
 max_pooling2d (MaxPooling2D  (None, 14, 14, 16)       0         
 )                                                               
                                                                 
 conv2d_1 (Conv2D)           (None, 14, 14, 32)        4640      
                                                                 
 max_pooling2d_1 (MaxPooling  (None, 7, 7, 32)         0         
 2D)                                                             
                                                                 
 conv2d_2 (Conv2D)           (None, 7, 7, 64)          18496     
                                                                 
 max_pooling2d_2 (MaxPooling  (None, 3, 3, 64)         0         
 2D)                                                             
                                                                 
 conv2d_3 (Conv2D)           (None, 3, 3, 128)         73856     
                                                                 
 global_max_pooling2d (Globa  (None, 128)              0         
 lMaxPooling2D)                                                  
                                                                 
 dense_6 (Dense)             (None, 128)               16512     
                                                                 
 dense_7 (Dense)             (None, 10)                1290      
                                                                 
=================================================================
Total params: 114,954
Trainable params: 114,954
Non-trainable params: 0
# Last Epoch
Epoch 16/16
469/469 [==============================] - 6s 12ms/step - loss: 0.1206 - acc: 0.9551 - val_loss: 0.3503 - val_acc: 0.9014

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

Берем первую партию и прогнозируем.

Для первого графика правильная метка была 1. И модель выдала такое высокое значение softmax для этого образца. Хотя значения softmax высоки, это не говорит о том, насколько надежна модель.

Чтобы проверить это, модели будет задан случайный вектор шума. И мы обсудим softmax выходы.

(параметр ensemble для второй модели я объясню позже)

{0: 6.912527, 1: 0.0038282804, 2: 0.9346371, 3: 0.7660487, 
 4: 4.7964582, 5: 3.58412e-05, 6: 80.114265, 7: 0.0002095818, 
 8: 6.4642153, 9: 0.007769133}

Согласно выходным данным softmax существует 80% вероятность того, что данный вектор принадлежит к классу 6.

Заблуждение относительно softmax заключается в том, что чем выше значение, тем надежнее модель [1]. Это не всегда так. Значение Softmax может быть очень высоким, а прогноз неверным. Например:

  • Враждебные атаки
  • Данные вне распределения (пример: вектор случайного шума)

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

Теперь возникает вопрос, а что, если мы учтем другие возможные модели и сопоставим их, чтобы получить прогноз? Скажем, что, если мы объединим 100 различных моделей для этих данных?

Сборка 100 моделей

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

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

Перед этим создадим такую ​​же модель и добавим дропауты.

Слой отсева не активен при получении прогноза от модели. Что, если мы воспользуемся эффектом выпадающего слоя одновременно с прогнозированием ввода?

Если мы используем __call__ метод модели, мы все равно можем оставить их активными:

for _ in range(4):
    predict_noise = model2(tf.expand_dims(random_vector,axis = 0),
                        training = True).numpy().squeeze()
    print('Softmax output for class 0:', predict_noise[0] * 100)

С training = True мы сохраняем активными Dropout слои, как будто сеть обучается, но мы применяем только прямой проход. Приведенный выше код напечатает следующие результаты:

Softmax output for class 0: 3.7370428442955017
Softmax output for class 0: 4.5094069093465805
Softmax output for class 0: 0.9782549925148487
Softmax output for class 0: 1.7607659101486206

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

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

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

Теперь мы передали model2 в качестве параметра модели и 100 в качестве размера ансамбля. Итак, теперь мы получаем прогнозы от модели 100 раз, сохраняя активными выпадающие слои. И для окончательного прогноза мы просто возьмем среднее прогнозов.

{0: 4.0112467, 1: 0.4843149, 2: 11.618713, 3: 8.531735, 
 4: 8.837839, 5: 0.04070336, 6: 59.83536, 7: 0.96540254, 
 8: 4.8854494, 9: 0.7892267}

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

Давайте спрогнозируем первую партию с новой моделью и проверим результаты.

predictions = []
for _ in range(1000):
    predicted_ensemble = model2(samples,
                        training = True).numpy().squeeze()
    predictions.append(predicted_ensemble)
predictions = np.array(predictions)
print('Predictions shape:', predictions.shape) # (1000, 128, 10)
predictions_median = np.median(predictions, axis = 0)

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

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

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

Отсев для получения доверительных интервалов

Используя цикл for, мы можем получить прогнозы для образцов:

Я добавлю несколько примеров графиков, чтобы прокомментировать их:

Этот график показывает нам, что даже мы собрали 1000 прогнозов для определенного входа, диапазон 95% интервала был таким же, как медиана и нормальный прогноз. Таким образом, мы можем сказать, что эта выборка действительно принадлежит class 1. и неопределенность низкая.

Давайте рассмотрим другой пример:

Что сейчас произошло? Нормальная модель имела вывод softmax, который был почти 1,00. Когда мы проверяем интервал 95%, мы видим, что зеленые столбцы выше, чем раньше. Это потому, что с помощью модели отсева мы смогли уловить некоторую неопределенность в прогнозах.

Вывод таков: чем выше эти зеленые столбцы, тем менее точен прогноз.

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

Заключение

Мы обсудили это:

  • Существует набор весов в зависимости от начальной точки градиентного спуска, при условии, что набор данных одинаков.
  • Ансамбль ванильного дропаута — не лучший способ, потому что он несколько случайный.

Следующие шаги

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

Вы можете проверить использованный Jupyter-Notebook здесь.

Рекомендации

[1]: Тим Пирс, Александра Бринтруп Джун Чжу, Понимание уверенности и неопределенности Softmax, 2021.