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

Автоэнкодер

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

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

Генерация нейронной сети

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

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

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

Стратегии оптимизации.

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

Поиск турниров

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

Эволюционный подход

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

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

Результаты оптимизации

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

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

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