Рисунок 6.3подчеркивает недостатки такого подхода, как метод главных компонент, при сохранении важных отношений в сложных наборах данных. Поскольку большинство наборов данных, которые встретятся нам на практике (изображения, тексты и т. д.), характеризуются нелинейными отношениями, нужно разработать теорию, способную обеспечить нелинейное снижение размерности. Практики глубокого обучения закрыли эту брешь с помощью нейронных моделей, к которым мы и перейдем в следующем разделе.
Мотивация для архитектуры автокодера
Когда мы говорили о сетях с прямым распространением сигнала, то показывали, как каждый слой последовательно обучался более релевантным представлениям входных данных. А в главе 5мы взяли данные из последнего сверточного слоя и использовали их как представление входного изображения с пониженной размерностью. Но эти подходы связаны с фундаментальными проблемами, не говоря о том, что мы хотим создавать эти представления с меньшим числом размерностей без учителя. Хотя выбранный слой действительно содержит информацию о входных данных, сеть обучена так, что обращает внимание на те их аспекты входных данных, которые необходимы для решения текущей задачи. В результате теряется много информации, которая могла бы понадобиться для других задач классификации, а для текущих целей не так важна.
Но и здесь помогает простая интуиция. Мы определяем новую архитектуру сети, которую называем автокодером . Сначала берем входящие данные и сжимаем их в вектор с пониженной размерностью. Эта часть сети называется кодером , поскольку она отвечает за создание плотного векторного представления, или кода . Вторая часть сети вместо того, чтобы соотнести плотное векторное представление с произвольной меткой, как в сети с прямым распространением сигнала, пытается инвертировать вычисления первой части сети и воссоздать исходные входные данные. Она называется декодером . Общая архитектура показана на рис. 6.4.
Рис. 6.4. Архитектура автокодера пытается вместить входные данные высокой размерности в плотное векторное представление, а затем использует это представление для того, чтобы воссоздать входные данные
Чтобы показать удивительную эффективность автокодера, построим и визуализируем на рис. 6.5 его архитектуру. Мы продемонстрируем его лучшие результаты в определении цифр MNIST по сравнению с анализом главных компонент.
Рис. 6.5. Эксперимент по снижению размерности набора данных MNIST, проведенный Хинтоном и Салахутдиновым в 2006 году
Реализация автокодера в TensorFlow
Ключевая работа «Снижение размерности данных при помощи нейронных сетей», в которой описан автокодер, была создана Джефри Хинтоном и Русланом Салахутдиновым в 2006 году [73]. Их гипотеза состояла в том, что нелинейные сложности нейронной модели позволят сохранять структуру, которую нельзя зафиксировать линейными методами вроде метода главных компонент. Для этого они провели эксперимент с MNIST, используя как автокодер, так и PCA для сведения набора данных к двумерным точкам. В этом разделе мы воссоздадим их эксперимент, чтобы проверить эту гипотезу, и продолжим рассмотрение архитектуры и свойств автокодеров с прямым распространением сигнала.
Архитектура, показанная на рис. 6.5, основана на том же принципе, но сейчас двумерное представление считается входными данными, а сеть пытается воссоздать исходное изображение. Поскольку мы проводим обратную операцию, мы строим декодирующую сеть, и автокодер будет иметь форму песочных часов. На выходе в ней получается вектор с 784 измерениями, который можно воссоздать в виде изображения размером 28×28 пикселов:
def decoder(code, n_code, phase_train):
with tf.variable_scope("decoder"):
with tf.variable_scope("hidden_1"):
hidden_1 = layer(code, [n_code, n_decoder_hidden_1], [n_decoder_hidden_1], phase_train)
with tf.variable_scope("hidden_2"):
hidden_2 = layer(hidden_1, [n_decoder_hidden_1, n_decoder_hidden_2], [n_decoder_hidden_2],
phase_train)
with tf.variable_scope("hidden_3"):
hidden_3 = layer(hidden_2, [n_decoder_hidden_2, n_decoder_hidden_3], [n_decoder_hidden_3],
phase_train)
with tf.variable_scope("output"):
output = layer(hidden_3, [n_decoder_hidden_3, 784], [784], phase_train)
return output
Для ускорения обучения мы используем ту же стратегию пакетной нормализации, что и в главе 5. Кроме того, поскольку мы хотим визуализировать результаты, мы избегаем резких переходов в нейронах. В этом примере мы используем сигмоидные нейроны вместо обычных ReLU-нейронов:
Читать дальше
Конец ознакомительного отрывка
Купить книгу