¿Es posible escribir código que pueda codificarse y mejorarse a sí mismo? En caso afirmativo, proporcione un ejemplo.

¿Es posible? Sí lo es.

Quines

Hay ciertos tipos de programas que se llaman ‘quines’. Un quine es un programa que genera su propio código fuente (no el código fuente vacío, por supuesto). Aquí hay un ejemplo simple.

echo on

Esto solo funciona en el símbolo del sistema de Microsoft Windows. Escríbelo en el bloc de notas y guárdalo como quine.bat, luego ve al símbolo del sistema, navega hasta donde está el archivo y escribe:

quine.bat

(eso supone que guardó el archivo como quine.bat. Debería ver el contenido del archivo en la pantalla. Esencialmente, eso es lo que es una quine. Hay muchas más citas no triviales en otros idiomas. Puede visitar esta página y este para más ejemplos en varios idiomas.

A donde voy con todo esto es que no es difícil imaginar un programa que genere su propio código fuente en un archivo, en lugar de simplemente imprimirlo, y ejecutarlo en su lugar.

Virus

Un virus es un programa autorreplicante. Adjunta una copia de sí mismo a los programas ejecutables (con esto quiero decir cualquier cosa que contenga instrucciones para que la computadora las siga). Aquí hay un código muy simple que puede copiarse de una parte de la memoria a otra. Está escrito en Asamblea (NASM)

Dirección de carga:
mov axe, LoadAddress; copia la ubicación del código a ax
mov cx, EndOfCode; obtener la dirección del final del código
sub cx, hacha; esto obtiene la longitud de este código
mov si, LoadAddress; por donde empezar copia
mov di, DestinationAddr; donde escribir
repnz stosb; copia el código
EndOfCode:

Básicamente, lo que hace el código anterior es calcular su propia longitud y luego copiarse en una ubicación diferente en la memoria. Por supuesto, tendrá que hacer algunos cálculos para averiguar cuál es la dirección de destino. (Tenga en cuenta que es posible que desee averiguar cómo esa pieza puede calcular en qué lugar de la memoria se carga).

Virus polimórficos

Un virus polimórfico viene con un motor de transformación . La función del motor de transformación es recrear una versión diferente del virus que hace exactamente lo mismo (que el virus hace). La idea es esta; la mayoría de las veces, uno puede escribir código que haga exactamente lo mismo de muchas maneras diferentes. Hay muchas técnicas diferentes para hacer esto; registre la reasignación, insertando instrucciones sin operaciones y muchas otras. Insertar una instrucción 'nop' realidad no hace nada e incluso en procesadores Intel más antiguos se representaba como mov al, al. Podría volver a escribir el ejemplo anterior como:

Dirección de carga:
nop; esta instrucción en realidad no hace nada
mov axe, LoadAddress; copia la ubicación del código a ax
mov cx, EndOfCode; obtener la dirección del final del código
o cx, cx; esta instrucción no tiene efecto
sub cx, hacha; esto obtiene la longitud de este código
nop; otra instrucción que no hace nada
hacha de empuje; empujar el hacha en la pila
pop si; regresarlo a si
mov di, DestinationAddr; donde escribir
repnz stosb; copia el código
EndOfCode:

El código anterior hace exactamente lo que hace el anterior, excepto con un conjunto diferente de instrucciones. Esta es la función del motor de transformación en un virus polimórfico.

Virus metamórficos

Los virus metamórficos hacen lo mismo que los virus polimórficos con una diferencia: en un virus polimórfico, el motor de transformación cambia solo el virus pero no el motor de transformación en sí. Por lo tanto, el virus aún se puede rastrear a través del motor de transformación que permanece constante a través de las iteraciones. En un virus metamórfico, el motor transforma el virus y su propio ser, por lo que es difícil reconocer el virus a través de las iteraciones.

¿Puedes imaginar?

Ahora puede imaginar que carga un virus metamórfico o polimórfico en una caja de arena (que es algo que hacen los antivirus) y lo supervisa a través de iteraciones, por ejemplo, la velocidad, el tamaño de la huella de la memoria e incluso cuánto cambia el virus. Use cualquier técnica de IA como Algoritmos genéticos, redes neuronales e incluso Hill Climbing para obtener la mejor versión de ese código. Esto puede ser cualquier código, por supuesto. No tiene que ser un virus.

Recientemente, Microsoft y Cambridge crearon un algoritmo capaz de escribir código para problemas matemáticos simples por sí mismo. Aquí hay un fragmento del artículo que encontré, que describe la forma en que funciona este algoritmo.

El algoritmo de escritura de código no funciona simplemente, pero aquí se explica cómo pensarlo en términos simples.

Un problema matemático tiene entradas y salidas, o los números que tiene y el número que necesita calcular. Los investigadores tomaron problemas simples que se habían resuelto con bits de código muy básicos, y mostraron al algoritmo las entradas, salidas y el código utilizado para resolverlos.

Piense en ello como una torre de bloques. Los investigadores mostraron al algoritmo los bloques de construcción, y luego la imagen final de cómo debería verse la torre. Pero el algoritmo necesita saber cómo alinear los bordes de cada bloque y hacer que se coloquen uno encima del otro. Si bien eso podría ser fácil de entender para los humanos, es un problema difícil para las máquinas, que no tienen idea de la gravedad y por qué los bloques grandes deberían soportar los más pequeños.

Pero si a las máquinas se les muestra cómo los bloques se apilan y se unen para parecerse a la torre completa, al ver cientos o miles de torres construidas, entonces podrán construir torres con bloques de forma similar. En términos de DeepCoder, los bloques son pequeños bits de código.

Cuando se le pide que resuelva un nuevo problema, en lugar de usar un código que funcionó antes, el algoritmo predice qué código se habría usado para resolver problemas similares que ha visto antes y en qué orden.

Los lenguajes de programación completos serían demasiado complejos para estos algoritmos, por lo que el equipo de Microsoft y Cambridge creó un lenguaje más pequeño, llamado lenguaje específico de dominio, como el conjunto de bloques de un niño pequeño. El sistema fue capaz de resolver desafíos de programación simples en línea, que van desde aproximadamente 3-6 líneas de código. Los problemas fueron descripciones de escenarios matemáticos, más entradas.

Sin embargo, aún no es posible escribir código en lenguajes de programación completos, uno puede entrenar una máquina a partir de los datos disponibles en repositorios en línea y páginas de documentación para predecir el código que se escribirá, pero una máquina que puede escribir una gran cantidad de código por sí misma y seguir mejorando aún no es posible.

El artículo publicado por Microsoft y Cambridge: https://openreview.net/pdf?id=By

Fuente: La IA de Microsoft está aprendiendo a escribir código por sí mismo, no a robarlo

Desde Microsoft Cortana hasta Apple Siri y desde Google DeepMind hasta IBM Watson, todos están haciendo grandes esfuerzos para desarrollar el sistema exhibido Intelligence.

La IA (Inteligencia Artificial) es actualmente una de las áreas tecnológicas más de moda en el campo de la informática y también tendrá demanda en el futuro.

Es posible desarrollar un sistema de IA de este tipo que pueda codificarse y muchas compañías tecnológicas gigantes están invirtiendo en las áreas de investigación y desarrollo de IA.

Amazon, Facebook, Google, Microsoft, IBM y OpenAI están haciendo una valiosa contribución para dar al mundo una innovación destacada en la resolución de problemas del mundo real y están colaborando juntos en el campo de la IA para crear tales máquinas que exhiben inteligencia.

DeepMind , una compañía británica de inteligencia artificial adquirida por Google en 2014 junto con Google Brain, un proyecto de Google está desarrollando una computadora que puede codificarse a sí misma.

El objetivo de DeepMind Technologies es “resolver la inteligencia que intentan lograr mediante la combinación de las mejores técnicas de aprendizaje automático y neurociencia del sistema para construir algoritmos de aprendizaje de gran alcance de gran alcance. Están tratando de formalizar la inteligencia para no solo implementarla en las máquinas , pero también entiendo el cerebro humano “.

Google Brain , un proyecto en Google comenzó en 2011 para descifrar el código detrás de la Inteligencia Artificial utilizando técnicas de aprendizaje profundo .

“En junio de 2012, el New York Times informó que un grupo de 16,000 computadoras dedicadas a imitar algunos aspectos de la actividad del cerebro humano se había entrenado con éxito para reconocer a un gato basado en 10 millones de imágenes digitales tomadas de videos de YouTube. La historia también fue cubierta por Radio pública nacional y planeta inteligente “.

La Máquina Neural Turing de Google es un paso revolucionario en el campo de la IA y es un gran homenaje al fundador Alan Turing, quien desarrolló la Prueba de Turing.

Fuente:-

La computadora con aprendizaje humano se programará sola

Pronto no programaremos computadoras. Los entrenaremos como perros

Google desarrolla una computadora tan inteligente que puede programarse POR SÍ MISMO

Nuestras computadoras están aprendiendo a codificarse

Las computadoras pronto podrían escribir su propio código | El SOLICITANTE

La nueva computadora de Google con capacidades de aprendizaje similares a las humanas se programará sola

SUBIDA DE LAS MÁQUINAS: las computadoras con inteligencia artificial aprenden a codificarse a sí mismas en un desarrollo importante

La nueva computadora de Google con capacidades de aprendizaje similares a las humanas se programará sola

Uso de la inteligencia artificial para escribir programas de auto-modificación / mejora

Cómo se dará a luz la superinteligencia artificial

Incluso los programadores de computadoras podrían quedar sin trabajo por robots

Notas de pie: –

DeepMind – Wikipedia

Mente profunda

Investigar en Google

Google Brain – Wikipedia

Máquinas neuronales de Turing

Máquina neural de Turing – Wikipedia

Máquinas Neural Turing | Mente profunda

Quantum AI – Investigación en Google

Codorniz

Inicio (sistemas de ondas D)

Fuente de imagen:-

Diapositivas

Google

Eso ya se ha hecho.

Te voy a dar un ejemplo. Imagine que está tratando de definir una ecuación que modela un conjunto de datos que tiene

(3.5, 400, 56.35, 0.23) -> 34.50
(5.6, 3, 143, 0.35, 643) -> 53.06

f (a, b, c, d) -> R (número real)

Y definimos un lenguaje matemático con

+ – * / ()
sin (x) cos (x) pow (x, y) rand ()

Y creamos un conjunto de ecuaciones aleatorias usando esos operadores y funciones.

a + b + sin (c) + pow (d, rand ())
(a / b) + (c / d)
a B C D

Luego calculamos qué tan bien se ajustan a nuestro conjunto de datos comparando el resultado de evaluar nuestros datos con el resultado esperado.

Hemos creado código automático (ecuaciones matemáticas) sin realmente codificar, y tenemos una medida de qué tan bien es este código automático.

Ahora dirás que eso no es algo que se mejore a sí mismo. Y usted tiene razón. Pero ahora imagine que toma esas ecuaciones autogeneradas y define las siguientes operaciones sobre ellas

Cruz (eq1, eq2)
Mutar (eq)
Selección (eq)

Dónde

  • Cruz: combina 2 ecuaciones para proporcionar otra que tenga algunas partes de sus padres.
  • Mutar: cambia algunas partes de una ecuación de manera aleatoria.
  • Selección: elimina o elimina las ecuaciones de menor ajuste del conjunto o conjunto de ecuaciones.

Ahora aplica estos operadores sobre su grupo, cruza un buen grupo de ecuaciones, muta una pequeña porción y aplica la selección a todos para eliminar lo peor. Y repita esto un buen número de veces.

El resultado es que su grupo de ecuaciones está evolucionando y mejorando cada vez más en la interpolación de su conjunto de datos.

Un pensamiento final. Si tu problema es la prueba de Turing, eres lo suficientemente inteligente como para definir las reglas básicas para una IA inteligente, y dejar que evolucione hasta que algunos puedan pasar la prueba de Turing, tienes una IA que mejora por ti mismo.

Pero eso, mi amigo, es un gran problema.

Post scriptum: para cualquier persona interesada, he descrito un algoritmo genético.

Algoritmo genético – Wikipedia

Editar: me han preguntado qué pasa si no tiene un conjunto de datos inicial. Bueno, no es necesario tener uno, aunque en la mayoría de los casos prácticos lo tendrás. La clave aquí es cómo define el proceso de selección. Por lo general, se realiza mediante una función de condición física que le brinda una medida de cuán bueno o malo es un espécimen en su grupo de soluciones. El ejemplo de prueba de Turing no utiliza un conjunto de datos inicial, sino un tipo de “función” que idealmente le dirá qué tan lejos está para pasar la prueba (por ejemplo, (-1, 1) rango donde -1 no puede engañar a nadie y 1 es una IA llena de emociones).

NOTA : esta IA en evolución propuesta es solo un ejemplo teórico y no será una forma práctica o incluso posible de crear una IA, sino que sirve como un ejemplo atractivo para introducir un código de evolución automática.

Gracias: más de 20k vistas. Mi respuesta más popular hasta el día. Gracias a los votantes y comentaristas y espero que esto sea interesante y útil para la mayoría de los espectadores.

🙂

La respuesta corta es: todavía no.

Estás pidiendo demasiado. Aún no se ha alcanzado la inteligencia general o la inteligencia fuerte o la “verdadera IA”. Hicimos algunos progresos en algunas áreas de aprendizaje, pero generalmente no es aplicable para dominios con problemas arbitrarios. Escribir código de computadora no es uno de estos.

Pero no es por eso que dije que pedías demasiado. La razón por la que dije esto es que le estás pidiendo a la máquina que haga algo que la mayoría de los seres humanos no pueden hacer. Es difícil escribir código que resuelva un problema dado. Y es mucho más difícil mejorar ese código. Primero, el código ya puede ser óptimo: para la mayoría de las tareas simples, el código que escribimos generalmente ya está en la mejor forma. En segundo lugar, la idea de mejora es extremadamente contextual y muchas veces subjetiva. Mejorar la legibilidad podría hacer que sea menos eficiente solo por dar un ejemplo. No hay una forma monolítica de medir la mejora. Lo que se considera una mejora hoy en día a menudo se ve como un paso equivocado en el futuro cuando la necesidad cambia o surge un nuevo patrón de diseño. Pero el punto es que la innovación es, por definición, impredecible. Por lo tanto, es extremadamente difícil (cuando sea posible) hacer una mejora determinista en el código escrito por un programador decente. Entonces, lo que realmente deberíamos preguntarnos es si podemos desarrollar IA que pueda escribir código razonable, no si puede seguir mejorando. Esa sería la fase 2.

El primer desafío para lograr la fase 1 sería abordar el problema de la comprensión del lenguaje natural, que es un problema completo de IA (y no resuelto). La tarea involucrada en la escritura de código es convertir una descripción del problema en lenguaje natural en un problema semántico y entendible por máquina. Y esto solo se puede hacer si el programa comprende el lenguaje natural. Si tuvo que ingresar ya en una máquina como el lenguaje, realmente no hará lo que pidió aquí.

(Tenga en cuenta: ha habido un programa que genera código desde la etapa inicial de programación. Pero eso es solo generar código basado en plantillas y no de naturaleza creativa. Por lo tanto, esa no es la intención de esta pregunta que entendí).

Esta pregunta termina en la pregunta de lo que llamamos inteligencia.
Muchos sistemas de IA funcionan mediante algún tipo de proceso de regresión o recocido para encontrar el mejor ajuste (posible) para algún rango o parámetros y / o componentes para maximizar alguna función objetivo.

Es (por supuesto) posible construir un sistema que compila esas soluciones en bibliotecas que integra en sí mismo.

Entonces esa sería una IA que escribe su propio código. Pero no creo que sea lo que pregunta. No hay inteligencia en esa forma de IA. Todavía es solo un proceso mecánico y no hay invención, no se contempla el problema ni se desarrolla una idea. Todavía se trata simplemente de arrojar soluciones en la pared para ver cuáles se adhieren.

Todavía no tenemos un sistema informático que resuelva problemas como los humanos resuelven problemas, pero tan pronto como lo hagamos, será fácil crear programas que examinen su propio código y busquen mejoras. Esta es la noción de “The Singularity” de que las computadoras se mejoran exponencialmente. Tiene defectos de varias maneras y supone que la inteligencia siempre tendrá un poder suficiente para superar el problema de ingresar al siguiente y asume que el proceso comienza justo después del nivel de inteligencia humana.

Una quine es un programa que genera su propio código fuente cuando se ejecuta.

Si. Por ejemplo, usaré un lenguaje de programación ficticio que llamaré Q. El único comando en ese lenguaje es q , el operador quine, que hace que el programa genere la totalidad de su código fuente. Un programa Q válido contiene al menos una q , y solo contiene caracteres ASCII imprimibles.

Así que echemos un vistazo al programa Q más corto posible: ” q “. Cuando lo ejecuta, su salida es ” q “, que es un programa Q válido. De hecho, es el mismo programa. No hay mejora allí, pero es una quine perfecta, que es todo un logro.

Algo más interesante sucede cuando tienes un programa Q que contiene más de un q . El programa más corto es ” qq “, pero ese programa no es interesante, por lo que intentaremos agregarle un gato, así: ” qkittyq “. Cuando ejecute este mejor programa, verá la salida ” qkittyqqkittyq “, que es un programa Q válido que contiene el doble de gatos que el programa fuente, una mejora definitiva. Como es indiscutiblemente mejor que el programa anterior, querrás ejecutarlo. Entonces su salida será ” qkittyqqkittyqqkittyqqkittyqqkittyqqkittyqqkittyqqkittyq “, que también es un programa Q válido y contiene cuatro veces más gatos que el programa que lo generó. Así que querrás ejecutar este también. En este punto, es posible que haya notado que si repite este procedimiento, el número de gatos en cada programa sucesivo crecerá sin límites, mejorando así los programas infinitamente. Siempre son los programas los que escriben el código para el siguiente y mejor programa; simplemente los haces correr y capturar su salida. Podrías automatizar eso también.

Ahí tienes: un programa que escribe mejores programas que escriben programas aún mejores, y así sucesivamente. Por supuesto, eso solo sucede si existe un compilador o un intérprete para el lenguaje de programación Q.

Depende de usted hacer que “codifique el código” correctamente (es decir, escriba la función Modificar que cambia la cadena de código), y es posible que desee agregar un condicional al bucle while, pero aquí hay un patrón (bastante contundente) para lograr lo que preguntaste:

================================================== =
String ProgramCode = “este es el código que ejecuta el programa”;
—————————————————————————————-
Modificación de cadena (código de cadena, resultados de objeto)
{
// Edite la cadena en función de los resultados aquí
código de retorno;
}
—————————————————————————————
vacío principal()
{
mientras (cierto)
{
var Resultados = InterpretOrLiveCompile (ProgramCode);
Código de programa = Modificar (Código de programa, Resultados);
}
}

Si. Desde el comienzo de la programación de computadoras, hubo LISP, que admite la metaprogramación. Es posible escribir código, definir un nuevo lenguaje incluso en tiempo de ejecución (protocolo metaobjeto). o definir macro en cualquier momento

Eso depende de lo que consideres como un ejemplo válido. Los compiladores se compilan regularmente.

En ese caso, tiene un ejemplo de un programa con información sobre lo que se supone que debe hacer (aunque se especifique de manera bastante rígida), utilizando diversas heurísticas para generar una nueva versión más rápida de sí mismo dentro de un límite de tiempo determinado que se asigna lo.

Si desea un ejemplo de un programa que se modifique sobre la marcha, puede tomar el código en cualquier idioma con un tiempo de ejecución de compilación JIT como ejemplo.

El problema principal es que al escribir un programa que hace algo útil, tiene una idea bastante fija de lo que quiere que haga el programa. Probar que la salida de un programa no cambia por un cambio en su fuente es un problema muy difícil, de hecho, solo probar que no se detendrá es inevitablemente indecidible. Así que eso limita fuertemente el alcance útil de los programas auto modificables.

Sí, incluso hay idiomas diseñados para hacerlo fácilmente.

Dos buenos ejemplos son cualquier lenguaje tipo LISP y PROLOG.

¡Si! He tenido esta idea una vez. No sería genial, pero podría hacerse. Haría que una IA tome decisiones basadas en diferentes cosas. Podría intentar todo tipo de cosas de código diferentes para intentar acelerar el proceso. Haría una nueva IA escribiendo en un archivo y modificando ese archivo. Si el nuevo archivo era más rápido, podría eliminar la IA anterior. ¿Sería eficiente? No.

Por supuesto. El código que escribe en cualquier IDE no es asunto de la computadora, no comprende nada. Escribe el código que puede entender, es decir, lenguaje de máquina, usted no escribe ese lenguaje de máquina, la computadora sí.

Junto con todas las buenas respuestas, me gustaría agregar el concepto de Reflexión (programación de computadoras) – Wikipedia.

Tldr: La capacidad de un programa para analizar e introspectarse en tiempo de ejecución y cambiar su comportamiento en consecuencia. Sin embargo, no es, estrictamente hablando, una forma de hacer que un programa escriba código.