Как я могу применить многопоточность к обучению нейронной сети обратного распространения ошибки?

StackOverflow https://stackoverflow.com/questions/1830350

Вопрос

Для своего университетского проекта я создаю нейронную сеть, которая может классифицировать вероятность того, что транзакция по кредитной карте является мошеннической или нет.Я тренируюсь с обратным распространением ошибки.Я пишу это на Java.Я хотел бы применить многопоточность, потому что у меня четырехъядерный компьютер i7.Меня беспокоит то, что я часами тренируюсь и вижу, что большая часть моих ядер простаивает.

Но как мне применить многопоточность к обратному распространению ошибки?Обратное распространение работает путем корректировки ошибок в обратном направлении по сети.Один слой должен быть выполнен, прежде чем можно будет продолжить работу над другим.Есть ли способ изменить свою программу для создания многоядерного фона?

Это было полезно?

Решение

Прежде всего, не используйте обратное распространение ошибки.Есть много других вариантов.Я бы предложил попробовать RPROP (устойчивое распространение).Это не будет таким уж большим изменением вашего алгоритма обратного распространения ошибки.Вам не нужно указывать скорость обучения или импульс.На самом деле это почти как если бы у вас была индивидуальная, переменная скорость обучения для каждого соединения в нейронной сети.

Что касается применения многопоточности к обратному распространению ошибки.Я только что написал статью на эту тему.

http://www.heatonresearch.com/encog/mprop/compare.html

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

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

Некоторые результаты производительности я привожу по ссылке выше.Это действительно ускоряет работу!

Другие советы

Чтобы использовать больше ядер ЦП с Java, вы можете просто попробовать дополнительные параметры JVM, не меняя код:

  • -сервер
  • -d64
  • -XX:-UseParallelGC

и другие варианты на http://java.sun.com/javase/technologies/hotspot/vmoptions.jsp

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top