¿Cuál es un ejemplo de un programa que puede mejorar recursivamente? (Pregunta AI)

Hay varias formas de hacer algo como esto, a través del aprendizaje automático.
Este tipo de preguntas vienen en el dominio de Algoritmos Genéticos, donde, dada una solución particular y un cierto conjunto de restricciones, el algoritmo puede mejorar la solución actual seleccionando la “mejor” descendencia posible para la próxima generación de soluciones. Esto se repite hasta que se alcanza un cierto límite. Funciona según el principio de “supervivencia del más apto”.

Entonces, en este caso, digamos que tenemos un compilador, solo la versión básica que puede devolver errores en el código y los números de línea. Entonces, dada la restricción de muestra que desea que el programa imprima “hola”, deja que se ejecute de forma salvaje.
El algoritmo genético comienza a escribir líneas de código aleatorias en el idioma de elección y analiza los errores arrojados por el depurador. Teniendo esto en cuenta, elige la mejor versión posible de código para la próxima iteración y así sucesivamente.

Este ejemplo de uso de la inteligencia artificial para escribir programas de auto-modificación / mejora muestra un ejemplo brillante de cómo funciona esto.
En general, dado el tiempo suficiente y el procesamiento paralelo suficiente, es bastante posible un sistema eficiente para escribir código por sí mismo.

Esa es la idea entre la programación genética. Ejecute una primera población de programas, tome los que mejor se adapten, elimine los malos, realice algunas mutaciones (cambie algunas instrucciones), luego enjuague y repita.

Esto funciona en muchos problemas, pero tampoco contenga la respiración. Primero, para hacerlo, necesita alguna métrica que proporcione la calidad de su programa, lo que significa que el programa evoluciona hacia un objetivo bien definido (por ejemplo, haga que un robot camine hacia su destino, o encuentre una aproximación de pi, …) segundo a no tener un espacio intratable para explorar las mutaciones también se limita a un conjunto de instrucciones bien definido y acotado (es decir, no se hace eso con toda la expresividad de C o Java, o Python, sino más en un nivel más restringido: por ejemplo, simplemente modifique parámetros de una función bien definida (matemática o software) y, finalmente, sigue siendo una elección difícil entre amplitud y capacidad de trazabilidad: la amplitud requiere que tengas una población muy grande para cada generación, pero te da una mejor oportunidad de alcanzar el óptimo absoluto, la trazabilidad requiere para encontrar la solución eventualmente, lo que significa que no debe volverse loco con la población de cada generación y, por lo tanto, solo puede hacer una búsqueda local con gran riesgo para terminar en un mínimo local (es decir, mejor que nada cerca de la bahía, pero no muy bueno en el gran esquema de las cosas).

Finalmente, un programa que se modifica a sí mismo plantea un gran problema. Una computadora no puede determinar en general si un programa puede terminar o no (por terminar quiero decir completar su tarea antes del infinito). Esto se conoce como el problema de bloqueo y se demostró desde los primeros tiempos de la noción de computación. Si un programa se modifica a sí mismo, siempre se corre el riesgo de terminar siendo uno de estos programas que nunca terminará ni progresará. es solo un “mientras (verdadero) no hacer nada” lejos de firmar su propia frase “limbo”. Esta es la razón por la cual la programación genética, aunque es muy poderosa, se limita a mutaciones simples y objetivos bien definidos,

La programación genética (GP) intenta hacer exactamente esto, aunque la mayoría de los ejemplos de GP que he visto se centran en la optimización iterativa de una función matemática (como en la investigación de operaciones) y no en la mejora de una función mal definida como la cognición, que sería mucho más difícil de evaluar para mejor / peor y, por lo tanto, difícil de mejorar a través de la búsqueda iterativa.

En cuanto a su pregunta extendida, no, será imposible obtener más información de la que está presente en sus datos de prueba. Un único artículo breve contiene solo un poco de información (sobre sintaxis, semántica o hechos del mundo real). Hay un límite superior muy limitado sobre cuánto se puede aprender de un ejemplo de este tipo. Inevitablemente, aprender de un pequeño ejemplo único causará un sobreajuste sustancial, limitando severamente su valor.

El SkyNet, por supuesto. Pero si no es broma, primero fue el sistema soviético Primeter, o Dead Hand, es tan superinteligente que por 30 años tuvo la capacidad de destruir a la humanidad de una vez, analizando solo los datos en bruto, aprendiendo a leerlo, ese sistema no falla, excluyendo un incidente en 1983 donde se requirió intervención humana para tomar una decisión sobre el destino de la humanidad. Por supuesto, dicho sistema es mucho más inteligente que un humano, pero no es fácil organizar las actualizaciones automáticas de dichos sistemas, por lo que se recomienda la intervención humana para el servicio hasta que se conecten servidores robóticos especiales a dicho sistema. Esto solo existe en este momento en hardware, otras soluciones de software, consulte la lista de algoritmos de auto programación

Realmente me gusta esta pregunta.

Lo que realmente está preguntando aquí es “¿cómo hacemos un programa que evolucione?”. Por supuesto, como posterchildren for evolution, las personas siempre han estado interesadas en el proceso. Tal vez si pensamos por un segundo en cómo evoluciona la gente, eso nos ayudará …

Aunque existen muchos mecanismos diferentes para la evolución, el que probablemente nos interesa más es la selección natural. Modelar la selección natural es la idea básica detrás de cómo funcionan los algoritmos genéticos. Sin embargo, la selección es solo el acto de decidir entre las cosas; una pregunta más profunda es ¿cómo conseguimos cosas nuevas para decidir? En la evolución, las diferencias surgen a través de mutaciones genéticas aleatorias (quizás no realmente aleatorias, sino aleatorias).

Entonces tenemos dos pasos:
1. ajustar al azar el programa
2. introducir un proceso de selección

¿Pero cómo seleccionamos? Tenemos que tener algún criterio de selección. En la vida, la selección se trata de la capacidad de producir descendencia. Consideramos una especie “seleccionada” si su descendencia vive para producir más descendencia.

Quizás deberíamos diseñar nuestro programa en la misma línea. Queremos diseñar un programa que creará nuevos programas que crearán nuevos programas … etc.

Para hacer esto, debemos introducir la aleatoriedad, ya que ese es el método de mejora que podemos encontrar en la naturaleza. Al final del día, la aleatoriedad es el “motor del progreso” detrás de la evolución.

Por supuesto, eventualmente obtendremos un mal programa (dependiendo de la intensidad del ajuste, incluso el segundo programa puede ser inutilizable). La solución de Natures es intentarlo de nuevo. Implementar esto solo requiere un cambio en el programa inicial. En lugar de que nuestro programa cree una nueva versión de sí mismo y se detenga, debemos escribir nuestro primer programa para ajustarlo y luego volver a ejecutarlo. Esto evitará que nuestro programa finalice antes de tiempo.

Esto significa que nuestro segundo programa constará de dos partes: una que ejecuta el hilo original y otra que ejecuta el hilo o hilos modificados. Después de otra iteración, tendríamos un árbol de nuevos hilos con ambos hilos existentes produciendo nuevos hilos.

Esto parece prometedor, pero tenemos algunos problemas nuevos. ¿Qué pasa si uno de nuestros nuevos hilos nunca termina y bloquea todo el proceso? Creo que está bastante claro que tenemos que confiar en algún tipo de gestión de recursos. En la evolución natural, esto se conoce como “muerte” y es el resultado del agotamiento de los recursos (alimentos, ciertos procesos corporales); Este concepto existe en la concurrencia a nivel de hilo. Además, existen otras restricciones sin nuestra ayuda:

1. ciertas operaciones colapsarán el hilo
2. ciertas operaciones colgarán el hilo

Estas mutaciones darían lugar a errores y terminarían prematuramente un hilo antes de que expirara.

La expiración natural parece ser un área con la que debemos ayudar a nuestro programa, pero el “tiempo de espera” no es un tema inusual en concurrencia.

¿Pero por cuánto tiempo dejamos correr nuestros hilos? ¿Cuál es la cantidad de tiempo adecuada para un programa que, con suerte, tendrá capacidades ilimitadas? Es difícil imaginar que podríamos elegir un buen número, pero resulta que tendremos que hacerlo.
Si construimos un mecanismo de retroalimentación en el sistema de sincronización que permitirá tiempo adicional bajo ciertas circunstancias (número de descendientes producidos, fallas), estamos:

1. creando la posibilidad de colgar
2. todavía estableciendo un límite difícil al tener rendimientos decrecientes

No parece un problema terrible; la vida útil no ha cambiado drásticamente en millones de años de evolución en la tierra (el mismo orden de magnitud entre una persona y un T-Rex), por lo que tal vez la naturaleza tampoco tenga un buen mecanismo de retroalimentación.

Entonces, tal vez hemos creado la capacidad de un programa para crear algo más que sí mismo. Una cosa que parece clara es que no hay garantías. Así como la vida casi con seguridad falló en innumerables planetas, no se dice que no tengamos que reiniciar este programa. Sin embargo, podríamos tener una oportunidad decente, con algo de poder de cómputo serio, para que las cosas funcionen.

Una cosa a tener en cuenta es que nuestro objetivo no era producir un programa “inteligente”, sino más bien uno que sea capaz de producir mejores programas. En la naturaleza, la inteligencia es solo una solución para la selección natural (las bacterias funcionan bien sin ella). Lo mejor que podríamos esperar, con un mecanismo de retroalimentación decente, es la biodiversidad entre nuestros hilos. Algunos serán parásitos simples y otros habrán desarrollado formas complejas y sofisticadas de “engañar” al sistema de retroalimentación.

De todos modos, así es como lo haría.

Google- Aprendizaje profundo y juegos de atari. Los programas están aprendiendo a jugar juegos desde cero (sin saber siquiera cómo funcionan los controles) y sigue intentando y cometiendo errores y en 24 horas es mejor de lo que los humanos podrían ser.