Прежде всего не используйте обратное распространение. Есть много других вариантов там. Я бы предложил попробовать RPROP (устойчивое распространение). Это не будет большой модификацией вашего алгоритма обратного распространения. Вам не нужно указывать скорость обучения или импульс. Это действительно так, как будто у вас есть индивидуальная переменная скорость обучения для каждого соединения в нейронной сети.
Что касается применения многопоточности к обратному распространению. Я только что написал статью на эту тему.
http://www.heatonresearch.com/encog/mprop/compare.html
По сути, я создаю несколько потоков и делю тренировочные данные так, чтобы у каждого потока было почти равное количество. Я вычисляю градиенты в каждом потоке, и они суммируются с шагом уменьшения. То, как градиенты применяются к весам, зависит от используемого алгоритма обучения распространению, но обновление веса производится в критическом разделе.
Когда у вас значительно больше обучающих выборок, чем весов, код тратит гораздо больше времени на вычисление многопоточного градиента, чем обновление веса критического сечения.
Я предоставляю некоторые результаты производительности по вышеуказанной ссылке. Это действительно ускоряет процесс!