2009-12-02 16 views
7

Para mi proyecto universitario, estoy creando una red neuronal que puede clasificar la probabilidad de que una transacción con tarjeta de crédito sea fraudulenta o no. Estoy entrenando con backpropagation. Estoy escribiendo esto en Java. Me gustaría aplicar multiprocesamiento, porque mi computadora es un quad-core i7. Me molesta pasar horas entrenando y ver la mayoría de mis núcleos inactivos.¿Cómo puedo aplicar el subprocesamiento múltiple a la capacitación de la red neuronal de retropropagación?

Pero, ¿cómo podría aplicar el subprocesamiento múltiple a la retropropagación? Backprop funciona ajustando los errores hacia atrás a través de la red. Se debe hacer una capa antes de que la otra pueda continuar. ¿Hay alguna manera de que pueda modificar mi programa para hacer un fondo multinúcleo?

Respuesta

10

En primer lugar, no use backpropagation. Hay muchas otras opciones por ahí. Sugeriría probar RPROP (propagación elástica). No será tan grande modificación de su algoritmo de backpropagation. No es necesario que especifique la velocidad de aprendizaje o el impulso. Es casi como si tuvieras una tasa de aprendizaje individual, variable para cada conexión en la red neuronal.

En cuanto a la aplicación de subprocesos múltiples a la retropropagación. Acabo de escribir un artículo sobre este tema.

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

Básicamente crear un número de hilos y dividir los datos de entrenamiento para que cada hilo tiene una cantidad igual próximo. Estoy calculando los gradientes en cada hilo y se suman en un paso de reducción. La forma en que los degradados se aplican a los pesos depende del algoritmo de entrenamiento de propagación utilizado, pero la actualización de peso se realiza en una sección crítica.

Cuando tiene muchas más muestras de entrenamiento que pesos, el código pasa mucho más tiempo en el cálculo de gradiente de subprocesos múltiples que la actualización de peso de sección crítica.

Proporciono algunos de los resultados de rendimiento en el enlace de arriba. ¡Realmente acelera las cosas!

+1

¿cómo fusiona los pesos? ¿Qué significa "fusionar" aquí, agregarlos todos? – PeeS

+0

Los pesos no se combinan. Estoy calculando los gradientes en cada hilo y se suman en un paso de reducción. La forma en que los degradados se aplican a los pesos depende del algoritmo de entrenamiento de propagación utilizado, pero la actualización de peso se realiza en una sección crítica. Cuando tiene considerablemente más muestras de entrenamiento que pesos, el código pasa mucho más tiempo en el cálculo del gradiente de subprocesos múltiples que la actualización de peso de la sección crítica. – JeffHeaton

+1

Su enlace sirve como "Página no encontrada". –

0

Para poder utilizar más núcleos de CPU con Java sólo se puede probar más opciones de JVM sin cambiar el código:

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

y otras opciones en http://java.sun.com/javase/technologies/hotspot/vmoptions.jsp

+3

Esas opciones pueden acelerar la ejecución, pero no harán que su algoritmo sea paralelo ... Si quiere usar varios núcleos para ejecutar un algoritmo, tendrá que modificarlo. – paradigmatic

+0

Sí. Obviamente. Estas opciones son mínimas cuando se intenta algo paralelo en Java. –

Cuestiones relacionadas