2011-02-19 22 views
8

Actualmente estoy trabajando en un proyecto que usaría algoritmos genéticos para optimizar las redes neuronales. Me doy cuenta de que probablemente esta no sea la mejor forma de optimizarlos, pero soy nuevo en ambos, así que solo quería probarlos.Uso de algoritmos genéticos para redes neuronales

Mis planes son los siguientes (sujeto a cambios, mucho). Mis neuronas de entrada estarían usando un conjunto de datos que podría tener casi cualquier número positivo (incluyendo decimales hasta dos lugares, así que realmente serían números flotantes), pero muy probablemente entre 0 y 20000. Porque la importancia está en cómo el los números se comparan entre sí en cuanto a su valor en lugar de lo grandes que son, primero se dividirían por el número más alto de todos los valores que se ingresarían. Lo harían multiplicar por pesos (cualquier flotación positiva o negativa) antes de ir a su capa oculta. Cada neurona en la capa oculta estaría sumando todas sus entradas hasta que se terminaron de calcular. Luego se ejecutarían a través de una función de logística y se generarían.

Mi entorno es Visual Studio C++ 2010 Express y estoy usando el clr.

Mi problema radica en el algoritmo genético y en cómo funcionaría. Sería ajustar los pesos. Mi problema es que cuando cambia aleatoriamente un poco en uno de los pesos (tasa de mutación), puede hacer que los pesos sean extraordinariamente altos o bajos, causando desbordamiento u otro error cuando se multiplica por la entrada y se agrega con los demás. No tengo idea de cómo organizaría mis cromosomas tampoco. Entonces, ¿sería mejor realizar la aleatorización por pesos de selección en lugar de bits al azar y cambiarlos a un número aleatorio dentro de un rango definido? Básicamente, estoy buscando sugerencias sobre cómo organizar esto sin causar errores al hacer que los valores sean demasiado grandes o demasiado pequeños mientras se mantiene el rendimiento.

Gracias, (y lo siento si esto debe estar en la informática teórica, pero pensé que no iba a encajar allí)

+0

no recuerdo los detalles, pero en este libro: http://www.amazon.com/Techniques-Programming-Premier-Press-Development/dp/193184108X, el autor hace más o menos lo que describes, es decir, usa valores de peso genéticamente mutados para optimizar una red neuronal. –

+0

Sería interesante ver una comparación del rendimiento entre la solución que se presenta y un proceso más convencional (tal vez incluso uno no neural). – Predictor

Respuesta

6

(artificial) Redes Neuronales (RNAs) son notoriamente difíciles de optimizar y algoritmos genéticos (GA) son un enfoque razonablemente bueno para hacerlo (principalmente porque todo lo demás tiende a ser muy limitado en lo bien que puede funcionar). Por supuesto, hay alternativas que también funcionan bien, pero son más complicadas y sutiles de programar y sintonizar correctamente (propagación hacia atrás con recocido simulado e impulso de aprendizaje). Y entiendo que estás haciendo este proyecto principalmente para jugar con esas cosas.

Es posible que desee ver los Neurocontroladores evolutivos (ENC), este es un campo donde se emplean algoritmos genéticos (o evolutivos) para entrenar RNA para tareas de navegación complejas (por ejemplo, misiones espaciales interplanetarias es una de las aplicaciones de eso personalmente he investigado).

Para la parte ANN, sugeriría que no se limita a funciones logísticas (sé que el sigmoide se inspira de las neuronas biológicas, pero eso no quiere decir que son los mejores todo el tiempo). También existen muchas otras funciones, las funciones de logística se utilizan en parte porque hacen que la propagación por la espalda sea mucho más rápida y sencilla. Pero, las funciones Radial-Basis también funcionan de maravilla (IMO y, como he visto, las aplicaciones más exitosas de las RNA utilizaron funciones Radial-Basis, es decir, RBF-NN). Por lo general, las personas usan funciones Gaussianas, funciones hiper esféricas y muy a menudo, funciones triangulares (llamadas Redes Fuzzy, otra gran clase de RNA).

En cuanto a las GA, no recomendaría ese tipo de mutación que está describiendo (es decir, voltear bits) por las razones que ha mencionado. La gente no usa este tipo de mutación cuando se trata de genes con valores reales. Un método de mutación muy fácil es simplemente decidir (con alguna probabilidad) mutar a un individuo, luego elegir un elemento de su gen para ser mutado y luego simplemente generar un nuevo elemento gen para reemplazarlo usando un generador de números aleatorios (rand()) .Con esto, puede limitar la escala de los elementos genéticos generados para evitar problemas de convertir a su degenerado individual (es decir, un elemento gen completamente incorrecto puede hacer que todo el individuo sea inútil). ¿Cuáles son los genes? Bueno, para una ANN, generalmente un gran vector que contiene todos los pesos de todas las neuronas en su red. Puede adivinar que las personas rara vez aplican GA si el número de neuronas es demasiado grande. También recomendaría que use la selección de torneo para seleccionar individuos para la reproducción. En cuanto a cross-over (es decir, la mezcla de dos padres para hacer que un niño), sólo mantener el orden de los pesos y recoger para cada elemento del niño un peso de cualquiera de los padres al azar con igual probabilidad.

he hecho personalmente lo he descrito anteriormente y funciona muy bien para ciertos problemas (tamaño reducido y alta complejidad, es decir, hay una solución óptima obvia).

Por último, no esperar que funcione tan fácilmente. Por lo general, requerirá un tamaño de población y una cantidad de generación que es mucho más alta de lo que cabría esperar (¡después de todo, la evolución es un proceso muy lento!). Por lo tanto, no intente una población de 10 individuos y corra durante 50 generaciones, y tristemente diga "OH, supongo que no funciona ...". Pruebe más en el orden de miles de personas en la población y de varios miles a cientos de miles de generaciones, dependiendo de la escala del problema al que lo está aplicando, por supuesto.

+0

que entender mucho de lo que dices, y gracias por la respuesta muy elaborada, pero tengo una pregunta. Con respecto a la generación de números aleatorios, ¿cuál es el mejor generador aleatorio que producirá números aleatorios en coma flotante dentro de un rango que incluya decimales, en lugar de sólo números enteros (.net, biblioteca C estándar, impulso, etc.). – contrapsych

+0

Boost.Random es una solución "sofisticada". Pero, lo más fácil, es usar una fórmula de rand(), como 'double num = (rand()% 10000) * 0.001;'. Esto producirá un número de 0 a 10 con precisión decimal hasta 0.001. Es tan simple como eso. Pero si tiene un poco de experiencia en estadísticas y funciones de distribución de probabilidad, puede encontrar que Boost.Random es un poco más elegante. –

3

Su problema radica en la representación cromosoma. Se le conoce como Hamming acantilado Problema. Se puede utilizar para la representación Gray Code cromosoma que no tiene problema de Hamming acantilado

+0

Uh, ¿podría explicar más? No entendí cómo "Gray Code" se relaciona con ANNs o GA ... –

Cuestiones relacionadas