¿Cómo implementar un espacio de acción restringido en el aprendizaje por refuerzo?

12

Estoy codificando un modelo de aprendizaje de refuerzo con un agente PPO gracias a la muy buena biblioteca Tensorforce , construida sobre Tensorflow.

La primera versión fue muy simple y ahora me estoy sumergiendo en un entorno más complejo donde todas las acciones no están disponibles en cada paso.

Digamos que hay 5 acciones y su disponibilidad depende de un estado interno (que se define por la acción anterior y / o el nuevo estado / espacio de observación):

  • 2 acciones (0 y 1) siempre están disponibles
  • 2 acciones (2 y 3) solo están disponibles cuando internal_state == 0
  • 1 acción (4) solo está disponible cuando internal_state == 1

Por lo tanto, hay 4 acciones disponibles cuando internal_state == 0 y 3 acciones disponibles cuando internal_state == 1.

Estoy pensando en algunas posibilidades para implementar eso:

  1. Cambie el espacio de acción en cada paso, dependiendo de internal_state. Supongo que esto no tiene sentido.
  2. No haga nada: deje que el modelo comprenda que elegir una acción no disponible no tiene ningún impacto.
  3. No haga casi nada: impacte ligeramente la recompensa cuando el modelo elija una acción no disponible.
  4. Ayuda al modelo: incorporando un número entero en el espacio de estado / observación que informa al modelo cuál es el valor de estado interno + punto de viñeta 2 o 3

¿Hay otras formas de implementar esto? Según su experiencia, ¿cuál sería el mejor?

Max
fuente

Respuestas:

5

La solución más directa es simplemente hacer que cada acción sea "legal", pero implementando un mapeo consistente y determinista de acciones potencialmente ilegales a diferentes acciones legales. Cada vez que la implementación PPO que está utilizando selecciona una acción ilegal, simplemente la reemplaza con la acción legal a la que se asigna. Su algoritmo PPO aún puede actualizarse como si la acción ilegal fuera seleccionada (la acción ilegal simplemente se convierte en ... un "apodo" para la acción legal).

Por ejemplo, en la situación que describe:

  • 2 acciones (0 y 1) siempre están disponibles
  • 2 acciones (2 y 3) solo están disponibles cuando internal_state == 0
  • 1 acción (4) solo está disponible cuando internal_state == 1

En los casos en que internal_state == 0, si 4se seleccionó una acción (una acción ilegal), siempre puede cambiarla por una de las otras acciones y jugarla en su lugar. Realmente no importa (teóricamente) cuál elijas, siempre y cuando seas coherente al respecto. El algoritmo no tiene que saber que eligió una acción ilegal, cada vez que elige esa misma acción ilegal en el futuro nuevamente en estados similares, se asignará de manera consistente a la misma acción legal, por lo que solo debe reforzar de acuerdo con ese comportamiento.


0 01


Para la primera "solución", escribí anteriormente que no importa "teóricamente" cómo eliges tu mapeo. Sin embargo, espero que sus elecciones aquí tengan un impacto en la velocidad de aprendizaje en la práctica. Esto se debe a que, en las etapas iniciales de su proceso de aprendizaje, es probable que tenga una selección de acción casi aleatoria. Si algunas acciones "aparecen varias veces" en las salidas, tendrán una mayor probabilidad de ser seleccionadas con la selección inicial de la acción de cierre automático. Por lo tanto, habrá un impacto en su comportamiento inicial, que tiene un impacto en la experiencia que recopila, que a su vez también tiene un impacto en lo que aprende.

Ciertamente espero que sea beneficioso para el rendimiento si puede incluir características de entrada para la internal_statevariable.

Si se pueden identificar algunas acciones legales que de alguna manera están "semánticamente cercanas" a ciertas acciones ilegales, también podría ser beneficioso para el desempeño conectar específicamente esas acciones "similares" en el "mapeo" de acciones ilegales a legales si elige ir con Esa solución. Por ejemplo, si tiene una acción de "salto hacia adelante" que se vuelve ilegal en estados donde el techo es muy bajo (porque se golpearía la cabeza), puede ser mejor asignar esa acción a una acción de "avanzar". sigue siendo un poco similar, ambos van hacia adelante), de lo que sería mapearlo a una acción de "mover hacia atrás". Sin embargo, esta idea de acciones "similares" solo será aplicable a ciertos dominios, en algunos dominios puede que no haya tales similitudes entre las acciones.

Dennis Soemers
fuente
1

El objetivo es diseñar un componente de optimización de políticas próximo que tenga restricciones específicas en el espacio de acción que dependen de las reglas impulsadas por el estado, utilizando un marco como Tensorforce.

Opciones de diseño enumeradas en la pregunta

Estas opciones se enumeran aquí para una referencia rápida al leer el análisis inicial a continuación.

  • Cambie el espacio de acción en cada paso, dependiendo de internal_state. Supongo que esto no tiene sentido.
  • No haga nada: deje que el modelo comprenda que elegir una acción no disponible no tiene ningún impacto.
  • No haga casi nada: impacte ligeramente la recompensa cuando el modelo elija una acción no disponible.
  • Ayuda al modelo: incorporando un número entero en el espacio de estado / observación que informa al modelo cuál es el valor de estado interno + punto de viñeta 2 o 3

Analisis inicial

De hecho, es sensato cambiar el espacio de acción para cada movimiento. De hecho, esa es una representación adecuada del problema como se indicó y la forma normal en que los humanos juegan y la forma en que las computadoras vencen a los humanos en Chess and Go.

La aparente falta de sentido de esta idea es simplemente un artefacto del progreso a lo largo de la hoja de ruta del proyecto Tensorforce y el progreso a lo largo de la teoría del refuerzo, ambos jóvenes en el panorama general. Al leer la documentación y las preguntas frecuentes de Tensorforce, no parece que el marco esté diseñado para conectar un motor de reglas para determinar el espacio de acción. Esto no es una deficiencia del código abierto. No parece haber ningún documento que proporcione teoría o proponga algoritmos para la decisión de la cadena de Markov condicionada por reglas.

La opción de no hacer nada es la que se ajusta a las estrategias disponibles actuales representadas en la literatura. Probablemente, hacer casi nada es el enfoque que producirá un comportamiento deseable más confiable y quizás más inmediato.

El problema con el concepto de ayudar al modelo es que no es una idea tan fuerte como extender el modelo. En código abierto, esto se haría ampliando las clases que representan el modelo, lo que requeriría un trabajo teórico antes de la codificación para

    a. Represent rule-conditioned learning in nomenclature
    b. Represent convergence mathematically using the new nomenclature
    c. Determining a method of convergence
    d. Proving convergence
    e. Rechecking
    f. Defining a smooth and efficient algorithm
    g. Providing PAC learning information for planning
    f. Peer review
    g. Extending the classes of the library
    h. Proof of concept with the current problem above
    i. Additional cases and metrics comparing the approach with the others
    j. Extending the library flexibility to support more such dev

La extensión de los sistemas de aprendizaje para cubrir el caso con restricciones de reglas es una gran idea para una tesis doctoral y podría volar en los laboratorios de investigación como una propuesta de proyecto con muchas aplicaciones posibles. No dejes que todos los pasos disuadan al investigador. Son esencialmente una lista de pasos para cualquier tesis doctoral o proyecto de laboratorio de IA financiado.

Para una solución a corto plazo, ayudar al modelo podría funcionar, pero no es una estrategia sólida para promover las ideas de IA a lo largo del camino de aprendizaje de refuerzo. Como solución a corto plazo para un problema en particular, puede funcionar bien. La idea de hacer casi nada puede ser más sólida, ya que se ajusta a las pruebas de convergencia que condujeron a la implementación particular que probablemente utilizará Tensorforce.

Cambiarle el nombre de hacer casi nada para ayudar a la convergencia puede ayudar a desarrollar la perspectiva correcta antes de intentarlo. Es posible que tenga que atenuar la asistencia a medida que se acerca a la convergencia para evitar el sobreimpulso al igual que con una tasa de aprendizaje.

Douglas Daseeco
fuente
3
Lo que suele suceder, por ejemplo, en AlphaGo, es que la representación de bajo nivel en la red neuronal representa un espacio de acción muy grande, la mayoría de los cuales es imposible en el estado actual (lo hace debido a limitaciones de NN simples que generan vectores de tamaño fijo ) Luego, otra parte del código aplica un filtro para seleccionar y normalizar las probabilidades de solo movimientos permitidos. El NN combinado y el filtro son parte del agente. Por lo tanto, es justo decir que el agente en su conjunto "cambiará el espacio de acción para cada movimiento". Sin embargo, no sé cómo se podría lograr eso dentro de la biblioteca de Tensorforce.
Neil Slater
1

Normalmente, el conjunto de acciones que el agente puede ejecutar no cambia con el tiempo, pero algunas acciones pueden volverse imposibles en diferentes estados (por ejemplo, no todos los movimientos son posibles en cualquier posición del juego TicTacToe).

Eche un vistazo como ejemplo en la parte del código https://github.com/haje01/gym-tictactoe/blob/master/examples/base_agent.py :

ava_actions = env.available_actions()
action = agent.act(state, ava_actions)
state, reward, done, info = env.step(action)
madpower2000
fuente