¿Qué pasaría si Charles Darwin construyera una red neuronal? – Hacia la IA

Estás leyendo la publicación: ¿Qué pasaría si Charles Darwin construyera una red neuronal? – Hacia la IA

Publicado originalmente en Hacia la IA.

Una forma alternativa de “entrenar” una red neuronal con evolución

En este momento, retropropagación es casi la única forma de entrenamiento de redes neuronales. Calcula el gradiente de la función de pérdida con respecto a los pesos de la red y, en consecuencia, actualiza los pesos retropropagando el error a través de las capas de la red utilizando la regla de la cadena.

Recientemente, la comunidad ha estado tratando de ir más allá de la retropropagación, ya que el propio maestro Geoffrey Hinton, quien popularizó el algoritmo en los años 80, ahora sospecha profundamente sobre él. Su punto de vista ahora es tirarlo todo y empezar de nuevo. Hay muchas razones detrás de su sospecha. La principal es que nuestro cerebro no propaga cosas hacia atrás, ya que no hay datos etiquetados. Preferimos etiquetar las cosas por nosotros mismos, lo cual es una historia completamente diferente. Muchos trabajos brillantes han sido publicados en NeurIPS con diversos algoritmos, algunos de los cuales son bastante sofisticados. Sin embargo, no estamos aquí por un algoritmo extremo que parece un hechizo antiguo para invocar al diablo, sino por algo más simple. Mucho más simple. En lugar de entrenar nuestro modelo, vamos a evolucionarlo, tal como lo hizo la madre naturaleza.

Ahora es el momento de que Charles Darwin entre en escena. Darwin definió la evolución como “descendencia con modificación”. Suena casi como “descenso de gradiente”, ¿verdad? ? La selección natural, que es un punto clave de la evolución, significa que las especies evolucionan con el tiempo, dan lugar a nuevas especies y comparten un ancestro común. En palabras simples, la fracción de la población y produce la descendencia ligeramente alterada (es decir, ). Luego, este proceso se repite una y otra vez durante mucho tiempo… ¿Cuánto tiempo? Por ejemplo, en el caso del planeta Tierra, tardó 4.543 millones de años. Este concepto está bien adaptado a las ciencias de la computación y se denomina genética o algoritmo evolutivo.

Dada una población grande, comenzando al azar, la evolución puede surgir con resultados sorprendentemente buenos. Asimismo, “El teorema del mono infinito”, afirma que un mono, dada una cantidad infinita de tiempo, seguramente escribirá algún texto significativo, digamos, Hamlet de William Shakespeare.

🔥 Recomendado:  Tendencias en IA — Junio ​​de 2022 – Hacia la IA

“Supongamos que un millón de monos han sido entrenados para escribir al azar, y que estos monos mecanógrafos trabajan duro durante diez horas al día con un millón de máquinas de escribir de varios tipos. Después de un año, los resultados de su trabajo contendrían copias exactas de los libros de todos los tipos e idiomas que se encuentran en las bibliotecas más ricas del mundo”

Émile Borel, 1913, Journal de Physique

¿Cómo extrapolamos esta idea al entrenamiento de redes neuronales? Solo imagine que comenzamos con un montón de redes aleatorias. Pueden variar en términos de arquitectura, peso o cualquier otro parámetro. Luego, tenemos que verificar cómo hacen el trabajo, elegir una pequeña porción que funcione mejor y hacer algunas modificaciones pequeñas (que se llama “mutación”) a sus parámetros. Dado que estamos hablando de alternativas de retropropagación, aquí el objetivo será encontrar los mejores pesos y sesgos para la red neuronal sin una forma “tradicional” de entrenarla.

Sin retropropagación, sin descenso de gradiente, ¡sin problemas!

Primero, hagamos nuestras vidas más fáciles creando una red neuronal utilizando el PyTorch biblioteca. Para simplificar, tomaremos una red neuronal de avance con una sola capa oculta y la usaremos para una tarea simple: el reconocimiento de dígitos escritos a mano, que todos conocemos como el MNIST conjunto de datos:

Ahora, para hacer que el modelo funcione, tenemos que inicializar pesos y sesgos, por lo tanto, creemos una función que tome un modelo y parámetros entrenables y los junte:

Entonces, necesitamos los llamados función de fitnessque según la vieja Wikipedia, es:

un tipo particular de función objetiva que se utiliza para resumir, como un solo figura de méritoqué tan cerca está una solución de diseño determinada de lograr los objetivos establecidos.

Al principio, usemos el estándar. PyTorch función de prueba sin mini lotes, ya que ya no los necesitamos:

Por lo tanto, es la llamada función de aptitud la que tenemos que maximizar. Como devuelve la precisión, ¡maximizar la función de fitness suena como un plan!

Sin embargo, para probar el modelo, necesitamos alguna entrada que sería una población de parámetros de red neuronal aleatorios. Por lo tanto, primero, necesitamos crear la población simplemente generando muchos tensores normalmente distribuidos pseudoaleatorios de cierta forma, con un pequeño ajuste de normalización destinado a evitar parámetros muy grandes, que es simplemente multiplicar los pesos y sesgos por 0.1.

🔥 Recomendado:  Los investigadores de inteligencia artificial (IA) de Standford proponen S4ND, una nueva capa profunda basada en S4 que amplía la capacidad de los SSM para simular señales continuas a...

Hagámoslo como una lista de tuplas de Python:

Aquí, cada tupla contiene lo siguiente:

  • pesos de la capa oculta
  • pesos de la capa de salida
  • sesgos de la capa oculta
  • sesgos de la capa de salida

Ahora, una vez que tengamos 100 soluciones diferentes, podemos enviarlas al modelo, evaluarlas y elegir un grupo (digamos 10) de las mejores. Luego buscamos un poco las soluciones, que se mencionó anteriormente como mutación, y creamos una nueva generación, que son simplemente nuevas soluciones elegidas al azar de la parte superior de la generación anterior y ligeramente

Sin embargo, aquí usamos un pequeño cambio a la implementación original del algoritmo. Primero, como comenzamos con una pequeña población de 100, permitamos que la población crezca con cada generación en algún número. Esto es solo un truco para una convergencia más rápida y mejores resultados con el tiempo.

El segundo truco es que, de vez en cuando (digamos el 20% de todos los casos), permitimos la inicialización aleatoria desde cero. Por lo tanto, a pesar de que elegimos las 10 mejores soluciones para crear una nueva generación, ¡todavía hay una posibilidad de que nazca Albert Einstein! En consecuencia, si están allí, esos Einsteins pueden ser elegidos y mutados para crear una generación nueva y mejor. El ciclo de código general tiene el siguiente aspecto:

En resumen, nuestro algoritmo evolutivo ligeramente mejorado hace lo siguiente:

  • genera aleatoriamente 100 conjuntos de parámetros para una arquitectura de red neuronal dada
  • elige los 10 mejores de ellos
  • muta aleatoriamente los 10 principales y crea una población nueva, un poco más grande que la anterior, con un 20% de probabilidad de inicialización completamente aleatoria
  • se repite hasta que se apodera del mundo!

¡Y voilá! ¡Nuestra DarwinNet está lista! Cuando se ejecuta durante 200 generaciones, brinda más del 25 % de precisión para el conjunto de datos MNIST en el conjunto de prueba. No es el mejor rendimiento, sin embargo, una suposición aleatoria daría un 10% de precisión, por lo que claramente está haciendo algo, como puede ver en la figura a continuación. El código completo se puede encontrar aquí. Como se mencionó anteriormente, agregar un 20% de probabilidad de inicialización aleatoria ayuda a mejorar drásticamente el rendimiento, lo que corresponde a los “pasos” característicos en la trama.

🔥 Recomendado:  Amazon ordenó cerrar su programa "Vendido por Amazon" después de una investigación de fijación de precios

Esta publicación demuestra cómo se puede usar un algoritmo genético para “entrenar” el modelo en uno de los conjuntos de datos de referencia. Tenga en cuenta que el código se escribió entre peleas de espadas en la oficina y café; aquí no hay grandes ambiciones. Sin embargo, hay docenas de formas de lograr un mayor rendimiento mediante la inicialización de diferentes pesos, el cambio de la tasa de mutación, el número de padres para cada generación, el número de generaciones, etc. Además, podemos utilizar nuestra comprensión previa de las redes neuronales e inyectar conocimiento experto, es decir, elija los pesos iniciales del modelo usando Inicialización de Kaiming. Esto probablemente no ayudará, pero tienes el punto, ¿verdad? ?

Por supuesto, la idea de entrenar redes neuronales utilizando un algoritmo evolutivo no es nueva. Hay al menos dos artículos de DJ montana y l davis y SJ Marshall y RF Harrison del siglo pasado compartiendo esta idea, donde muestran la superioridad del algoritmo genético sobre el telón de fondo. Sin embargo, pase lo que pase, pasó. Hoy en día, los atributos relacionados con la retropropagación están ajustados para dar lo mejor de sí mismos, por lo que su rendimiento es dominante sobre los algoritmos genéticos y otros métodos rivales que no son retropropagación, por ejemplo. aprendizaje hebbiano o aprendizaje de perturbaciones.

Otro problema con la implementación actual: lleva tiempo… Bueno, tal vez si funcionara durante más de 4 mil millones de años, el resultado sería mejor. ?


¿Qué pasaría si Charles Darwin construyera una red neuronal? se publicó originalmente en Hacia la IA en Medium, donde las personas continúan la conversación destacando y respondiendo a esta historia.

Publicado a través de Hacia la IA