6

Una vez escribí un Tetris AI que jugaba Tetris bastante bien. El algoritmo que utilicé (described in this paper) es un proceso de dos pasos.Determinando qué entradas pesar en un algoritmo evolutivo

En el primer paso, el programador decide hacer un seguimiento de las entradas que son "interesantes" para el problema. En Tetris, podríamos estar interesados ​​en registrar cuántas lagunas hay en una fila, ya que minimizar las brechas podría ayudar a ubicar las piezas futuras más fácilmente. Otra podría ser la altura promedio de la columna porque puede ser una mala idea correr riesgos si está a punto de perder.

El segundo paso es determinar los pesos asociados con cada entrada. Esta es la parte donde utilicé un algoritmo genético. Cualquier algoritmo de aprendizaje funcionará aquí, siempre que los pesos se ajusten a lo largo del tiempo en función de los resultados. La idea es dejar que la computadora decida cómo se relaciona la entrada con la solución.

Usando estas entradas y sus pesos podemos determinar el valor de tomar cualquier acción. Por ejemplo, si coloca la forma de línea recta en la columna de la derecha eliminará las brechas de 4 filas diferentes, entonces esta acción podría obtener una puntuación muy alta si su peso es alto. Del mismo modo, colocarlo en la parte superior en realidad podría causar lagunas y que la acción obtenga un puntaje bajo.

Siempre me he preguntado si hay una forma de aplicar un algoritmo de aprendizaje al primer paso, donde encontramos entradas potenciales "interesantes". Parece posible escribir un algoritmo donde la computadora primero aprende qué entradas pueden ser útiles, luego aplica el aprendizaje para ponderar esas entradas. ¿Se ha hecho algo así antes? ¿Ya se está utilizando en alguna aplicación de IA?

+1

+1 Estoy tratando de comenzar en este campo. Tengo un par de programas de demostración de mascotas pero nada grande todavía. Interesado en ver qué tipo de respuestas obtienes al respecto. –

Respuesta

1

En las redes neuronales, puede seleccionar las entradas potenciales "interesantes" al encontrar las que tienen la mayor correlación, positiva o negativa, con las clasificaciones para las que está entrenando. Me imagino que puedes hacer lo mismo en otros contextos.

+0

¿Qué quiere decir con "correlación con clasificaciones" en este contexto? – Kai

+0

Supongamos que está entrenando una red neuronal para clasificar patrones como "la letra A" o "no la letra A". Tienes un montón de casos de capacitación donde tienes algunos datos y sabes si es o no A. Puedes dividir y dividir esos datos de varias maneras, cada una de las cuales es una entrada potencial. Las mejores entradas potenciales son las que muestran una fuerte correlación numérica con el estado A o no. Si una entrada potencial no varía, es inútil. Si varía al azar, es inútil. Si varía en coordinación con A-o-no-Aness del patrón, es oro. – chaos

+0

¡Ah, ya veo! No había pensado utilizar datos de muestras preexistentes (es difícil de imaginar en Tetris). De hecho, creo que recaptcha (http://recaptcha.net/learnmore.html) hace esto. No se me ocurrió hasta que leí tu ejemplo. – Kai

0

Creo que podría abordar el problema que está describiendo al alimentar datos más primitivos a un algoritmo de aprendizaje. Por ejemplo, un estado de juego de tetris puede describirse por la lista de celdas ocupadas. Una cadena de bits que describa esta información sería una entrada adecuada para esa etapa del algoritmo de aprendizaje. entrenar en eso todavía es desafiante; ¿Cómo sabes si esos son resultados útiles? Supongo que podría pasar todo el algoritmo en una sola burbuja, donde el algoritmo se alimenta con los sucesivos estados de juego y la salida sería simplemente las ubicaciones de bloque, con algoritmos de puntuación más altos seleccionados para las generaciones futuras.

Otra opción podría ser utilizar un gran corpus de obras de otras fuentes; como las jugadas grabadas de jugadores humanos o un ai hecho a mano, y selecciona los algoritmos cuyas salidas tienen una fuerte correlación con algún hecho interesante del juego futuro, como el puntaje obtenido en los próximos 10 movimientos.

+0

Creo que su primera sugerencia es cambiar el modelo con el que se representa el problema. Podría ser más fácil codificar, pero me pregunto si realmente ayudará con el aprendizaje. Aunque me gusta la idea de usar otras fuentes. – Kai

+0

Tampoco estoy totalmente satisfecho con mi propia respuesta. Si tuviera que adivinar, supongo que esto probablemente aumente el tiempo de aprendizaje en aproximadamente 2 órdenes de magnitud. – SingleNegationElimination

0

Sí, hay una manera.

Si elige M características seleccionadas hay 2^subconjuntos M, por lo que hay mucho que ver. lo haría a lo siguiente:

For each subset S 
    run your code to optimize the weights W 
    save S and the corresponding W 

A continuación, para cada par S-W, se podrá ejecutar juegos G para cada par y guardar la puntuación L para cada uno. Ahora usted tiene una tabla como la siguiente:

feature1 feature2 feature3 featureM subset_code game_number scoreL 
1   0   1   1   S1   1    10500 
1   0   1   1   S1   2    6230 
... 
0   1   1   0   S2   G + 1   30120 
0   1   1   0   S2   G + 2   25900 

Ahora se puede ejecutar algún algoritmo de selección de componentes (PCA, por ejemplo) y decidir qué características son la pena explicar scorel.

Consejo: Cuando ejecute el código para optimizar W, inicialice el generador de números aleatorios, de modo que cada "cerebro evolutivo" diferente se pruebe con la misma secuencia de piezas.

Espero que ayude en algo!

Cuestiones relacionadas