Хинтон и Салахутдинов в статье « Сокращение размерности данных с помощью нейронных сетей», Science 2006, предложили нелинейный PCA за счет использования глубокого автоэнкодера. Я несколько раз пытался построить и обучить автоэнкодер PCA с Tensorflow, но мне никогда не удавалось получить лучший результат, чем линейный PCA.
Как эффективно обучить автоэнкодеру?
(Позднее редактирование @amoeba: оригинальная версия этого вопроса содержала код Python Tensorflow, который работал некорректно. Его можно найти в истории редактирования.)
Ответы:
Вот ключевая фигура из научной статьи 2006 года Хинтона и Салахутдинова:
Он показывает уменьшение размерности набора данных MNIST ( черно-белых изображений из одной цифры) с исходных 784 измерений до двух.28×28
Давайте попробуем воспроизвести это. Я не буду использовать Tensorflow напрямую, потому что гораздо проще использовать Keras (высокоуровневую библиотеку, работающую поверх Tensorflow) для простых задач глубокого обучения, подобных этой. H & S использовал архитектуру от с логистическими единицами, предварительно обученными стеку машин с ограниченным числом Больцмана. Десять лет спустя, это звучит очень старой школы. Я буду использовать более простую архитектуру от с экспоненциальными линейными единицами без предварительной подготовки. Я буду использовать оптимизатор Адама (конкретная реализация адаптивного стохастического градиентного спуска с импульсом).784 → 512 → 128 → 2 → 128 → 512 → 784
Код скопирован из блокнота Jupyter. В Python 3.6 вам нужно установить matplotlib (для pylab), NumPy, seaborn, TensorFlow и Keras. При запуске в оболочке Python вам может потребоваться добавить,
plt.show()
чтобы показать графики.инициализация
PCA
Это выводит:
Обучение автоэнкодеру
Это занимает ~ 35 секунд на моем рабочем столе и выводит:
так что вы уже можете видеть, что мы превзошли потери PCA только после двух тренировочных эпох.
(Кстати,
activation='linear'
полезно изменить все функции активации и наблюдать, как потеря сходится точно с потерей PCA. Это потому, что линейный автоэнкодер эквивалентен PCA.)Построение проекции PCA бок о бок с представлением узкого места
Перестройки
А теперь давайте посмотрим на реконструкции (первый ряд - исходные изображения, второй ряд - PCA, третий ряд - автоэнкодер):
Можно получить гораздо лучшие результаты с более глубокой сетью, некоторой регуляризацией и более длительным обучением. Эксперимент. Глубокое обучение легко!
источник
from __future__ import absolute_import from __future__ import division from __future__ import print_function
Огромные реквизиты @amoeba за этот замечательный пример. Я просто хочу показать, что процедура обучения и реконструкции авто-кодировщика, описанная в этом посте, может быть выполнена также в R с такой же легкостью. Приведенный ниже автокодер настроен таким образом, чтобы он подражал примеру amoeba как можно ближе - тот же оптимизатор и общая архитектура. Точные затраты не воспроизводимы из-за того, что серверная часть TensorFlow не засеяна подобным образом.
Инициализация
PCA
автоассоциатор
Построение проекции PCA бок о бок с представлением узкого места
Перестройки
Мы можем сделать восстановление цифр обычным способом. (В верхнем ряду находятся исходные цифры, в среднем ряду реконструкции PCA, а в нижнем ряду реконструкции автоэнкодера.)
Как уже отмечалось, большее количество эпох и более глубокая и / или более умно обученная сеть дадут гораздо лучшие результаты. Например, ошибка восстановления PCA при = 9 составляет приблизительно , мы можем получить почти такую же ошибку ( ) из автоэнкодера, описанного выше, просто увеличив период обучения с 5 до 25. В этом сценарии использования 2 Компоненты, полученные из автоэнкодера, будут иметь такую же ошибку восстановления, как и 9 основных компонентов. Круто!0,0356 0,0359k 0.0356 0.0359
источник
Вот моя записная книжка Jupyter, где я пытаюсь повторить ваш результат со следующими отличиями:
Вход PCA сохраняется как данные со средним значением = 0 и стандартным значением = 1Может быть, я просто еще раз выполню это позже с данными [0-1] для PCA и AEМой MSE приводит к PCA от уменьшения размерности с 1 до 6 (где вход имеет 6 столбцов) и для AE от dim. красный. от 1 до 6 ниже:
С входом PCA (среднее = 0, стандартное = 1), в то время как вход AE находится в диапазоне [0-1] - 4e-15: PCA6 - .015: PCA5 - .0502: AE5 - .0508: AE6 - .051: AE4 - .053: AE3 - .157: PCA4 - .258: AE2 - .259: PCA3 - .377: AE1 - .483: PCA2 - .682: PCA1Линейный PCA без уменьшения размерности может достигать 9e-15, потому что он может просто вытолкнуть все, что ему не удалось вписать в последний компонент.
источник