Как я могу применить многопоточность к обучению нейронной сети обратного распространения? - PullRequest
9 голосов
/ 02 декабря 2009

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

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

Ответы [ 2 ]

10 голосов
/ 02 декабря 2009

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

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

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

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

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

Я предоставляю некоторые результаты производительности по вышеуказанной ссылке. Это действительно ускоряет процесс!

0 голосов
/ 02 декабря 2009

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

  • -server
  • -d64
  • -XX: -UseParallelGC

и другие опции на http://java.sun.com/javase/technologies/hotspot/vmoptions.jsp

...