Encog AI Framework: обратное распространение с инжекцией гауссовского шума

Я работаю со стандартными многоуровневыми персептронами и алгоритмом обратного распространения в Encog уже две недели, как через рабочую среду, так и через код Java. Моя следующая работа потребует вставки шума в шаблоны ввода, как в этой статье: http://ieeexplore.ieee.org/xpl/articleDetails.jsp?arnumber=6033567(PCA и гауссов шум в обучении нейронной сети MLP улучшают обобщение в проблемах с небольшие и несбалансированные наборы данных)

По сути, мне нужно (это проблема двоичной классификации): 1 - Преобразовать входные шаблоны с использованием анализа основных компонентов (PCA) 2 - Использовать обратное распространение для обучения MLP с помощью хитрости: вставлять разные белые шумы в каждый тренировочный образец на каждая эпоха.

Какой более простой способ сделать это внедрение шума, используя версию Encog для Java? Использует ли какой-либо из доступных алгоритмов обучения внедрение искусственного шума?

PS: полный алгоритм для статьи, которую я привел,

    1. Применить PCA для декорреляции переменных
2. Инициализируйте архитектуру системы
3. Установите k, максимальное количество эпох и минимальную ошибку
4. Начните тренировку - пока счетчик эпох а. Случайно нарисовать шаблон ввода (вектор х) без замены для представления
б. Внедрить шум в шаблон ввода
1. Для каждой переменной из шаблона ввода
а. Нарисуйте g из гауссовского распределения. г ~ N(0,1)
б. Рассчитайте n = k * g
с. Добавить шаблон ввода девятки х
с. Представить шаблон ввода
д. Настройте параметры системы
е. Если критерий остановки обучения был достигнут, то
1. Прекратить тренировку
е. Иначе
1. Приращение счетчика эпох
2. Перейти к 4.a

2 ответа

Решение

Я думаю, что лучший способ сделать это будет создать класс, который реализует интерфейс MLDataSet. Затем вы должны предоставить обычный BasicMLDataSet (или другой набор данных) для вашей новой версии MLDataSet. Для метода size() вы должны вернуть количество обучающих шаблонов, которые вы хотите обучить за одну итерацию. Затем для каждого вызова вашего нового MLDataSet для возврата MLDataPair вы случайным образом выбираете пару из предоставленного набора данных, затем вы клонируете этот элемент, добавляете шум, как описано, и возвращаете его.

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

Я изучал класс Backprop и придумал другой способ, который казался более общим и прямым. Я создал интерфейс ErrorStructure, класс NoisyBackpropagation и NoisyGradientWorker.

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

Второй класс - это просто Backprop со свойством ErrorStructure. Третий класс - это GradientWorker, который получает NoiseStructure в качестве параметра и вносит шум в тренировочный процесс.

Хитрые биты:

  • Некоторые реализации ErrorStructure (в частности, те, которые я надеюсь опубликовать) потребуют сложных параметров инициализации, полученных из обучающего набора. Я не мог использовать более общий вид MLDataSet. Это не является строго необходимым, но я бы хотел использовать его когда-нибудь в будущем.
  • Мне пришлось добавить SSJ: Стохастическое моделирование в пакет Java как зависимость, или вычисления NoiseStructure займут слишком много времени. Я не знаю, сколько скорости Энког будет мешать SSJ.

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

Другие вопросы по тегам