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

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

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

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

PS.: Полный алгоритм статьи, которую я цитировал, таков:

    1. Apply PCA to decorrelate the variables
2. Initialize the system architecture
3. Set k, max number of epochs and min error
4. Begin training - While epoch counter a. Randomly draw an input pattern (vector x) without replacement for presentation
b. Inject noise into input pattern
1. For every variable from the input pattern
a. Draw g from a Gaussian distribution. g ~ N(0,1)
b. Calculate n = k * g
c. Add ninto input pattern x
c. Present the input pattern
d. Adjust the system parameters
e. If training stopping criterion has been reached then
1. Stop training
f. Otherwise
1. Increment epoch counter
2. Go to 4.a

person Lucas Soares    schedule 24.05.2013    source источник


Ответы (2)


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

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

person JeffHeaton    schedule 24.05.2013
comment
Мой комментарий стал слишком большим, поэтому я изменил его на ответ ниже. - person Lucas Soares; 24.05.2013

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

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

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

Хитрые биты:

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

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

person Lucas Soares    schedule 24.05.2013