Espacio de acciones en el aprendizaje por refuerzo (RL 3)

| | ,

Diferentes entornos permiten diferentes tipos de acciones. El conjunto de todas las acciones válidas en un entorno dado es lo que se suele conocer con el nombre de espacio de acciones en el aprendizaje por refuerzo. Vamos a ver qué tipos de espacios de acciones podemos encontrarnos.

Espacios de acciones discretos y continuos

Algunos entornos, como por ejemplo Atari de OpenAI, tienen un espacio de acciones discreto, es decir, el agente solo puede escoger su acción de entre un número finito de posibles movimientos. Otros entornos, como aquellos en los que el agente controla un robot en un ambiente más complejo, tienen espacios de acciones continuos. En los espacios continuos, las acciones vienen dadas por vectores de valores reales.

Imagínate un robot muy simple que solo puede dar un paso adelante, dar un paso atrás, girar hacia la derecha o girar hacia la izquierda. El agente que lo controla tendría un espacio de acciones discreto, ya que solo hay 4 acciones posibles y estas podrían venir representadas por números enteros. Si este robot fuese más complejo y, por ejemplo, pudiese girar en distintos ángulos y avanzar a distintas velocidades, entonces tendría un espacio de acciones continuo.

Esta distinción es muy relevante para los métodos del aprendizaje por refuerzo, ya que algunas familias de algoritmos están preparadas para funcionar solo en uno de los dos casos y necesitarían un gran trabajo de adaptación para poder ser aplicadas en el otro. Por ejemplo, el algoritmo DQN solo soporta acciones discretas, mientras que el algoritmo SAC está pensando para trabajar solo con acciones continuas. A continuación, puedes ver cuáles son los algoritmos más recomendados en función del espacio de acciones.

Espacios de acciones discretos

Los espacios de acciones discretos se pueden dividir, en general, en espacios de tipo discreto, multidiscreto y multibinario.

Por un lado, un espacio discreto contiene una lista de posibles acciones, de las cuales solo se puede escoger una en cada momento temporal. En este tipo de espacios, las acciones vienen dadas por un rango fijo de números no negativos. Por ejemplo, dos acciones válidas podrían representarse mediante los números “0” y “1”, y podrían significar “girar a la izquierda” y “girar a la derecha”.

Por otro lado, un espacio multidiscreto consiste en una serie de espacios de acción discretos con diferente número de acciones en cada uno. Es útil para simbolizar controladores de juegos o teclados donde cada tecla se puede interpretar como un espacio de acción discreto y se representa mediante una matriz de enteros positivos que especifican el número de acciones para cada espacio de acción discreto. Por ejemplo, el controlador de juegos de Nintendo se puede representar en forma de 3 espacios de acciones discretos:

Teclas de direcciónDiscreto (5 posibles acciones)NOOP[0], UP[1], RIGHT[2], DOWN[3], LEFT[4]params: min: 0, max: 4
Botón ADiscreto (2 posibles acciones)NOOP[0], Pressed[1]params: min: 0, max: 1
Botón BDiscreto (2 posibles acciones)NOOP[0], Pressed[1]params: min: 0, max: 1

En este caso, el primer “subespacio” de acciones representaría las posibles acciones que se pueden llevar a cabo con las teclas de dirección: no hacer nada, ir hacia arriba, ir hacia la derecha, ir hacia abajo o ir hacia la izquierda. Cada una de estas 5 acciones tendría asociado un número entero: 0, 1, 2, 3 y 4 (por eso, en los parámetros se indica un valor mínimo de 0 y un máximo de 4). El segundo subespacio correspondería al del botón A, que solo puede estar presionado o no presionado, y lo mismo sucedería con el tercero.

Por último, un espacio multibinario es un espacio binario de n-dimensiones.

En espacios discretos de un único proceso, la familia de algoritmos DQN con extensiones (doble DQN, prioritized replay, etc.) es la más recomendada. En espacios discretos de multiprocesamiento, se suelen utilizar los algoritmos PPO o A2C.

Espacios de acciones continuos

Estos espacios se suelen asociar con el tipo Box. Un espacio Box representa una “caja” de n-dimensiones, así que una observación válida podría venir dada, por ejemplo, por un vector de 4 números.

Dicho de forma más específica, un espacio de tipo Box viene a ser como una “caja” (posiblemente ilimitada) en el espacio de R^n, que representa el producto cartesiano de n intervalos cerrados. Cada intervalo tiene una de las formas siguientes: [a, b], (-oo, b], [a, oo) o (-oo, oo).

En espacios continuos de un único proceso, los algoritmos de estado del arte actuales (o algoritmos SOTA, siglas de Current State Of the Art) son SAC, TD3 y TQC. En espacios continuos de multiprocesamiento, se suelen utilizar los PPO, TRPO y A2C.

Espacios de acciones en la librería Gym de OpenAI

Si no conoces la librería Gym de OpenAI, seguramente te venga bien echarle un ojo a este artículo antes de seguir leyendo. En esta librería, cada entorno viene con un atributo action_space, que pertenece a la clase Space, y que describe el formato de las acciones válidas. Fíjate en este fragmento de código:

import gym
env = gym.make('CartPole-v0')
print(env.action_space)
#> Discrete(2)

En las dos primeras líneas, hemos importado la librería y hemos generado un entorno de tipo CartPole-v0, en el que las únicas posibles acciones son “aplicar fuerza hacia la izquierda” y “aplicar fuerza hacia la derecha”. En la tercera línea, hemos mostrado el espacio de acciones que tiene asociado este entorno, y podemos ver que la salida es “Discrete(2)”, es decir, hemos corroborado que es discreto y que solo permite escoger entre dos posibles acciones.

Si el espacio de acciones correspondiese al ejemplo del controlador multidiscreto de la Nintendo que vimos más arriba, la salida del código anterior sería la siguiente:

MultiDiscrete([ 5, 2, 2 ])

En Gym, también es posible tomar muestras de un espacio o comprobar que algo le pertenece:

from gym import spaces
space = spaces.Discrete(8) # Set with 8 elements {0, 1, 2, ..., 7}
x = space.sample()
assert space.contains(x)
assert space.n == 8

Fíjate en este muestreo de un espacio de acciones multibinario:

from gym import spaces
action_space = spaces.MultiBinary([3,2])
action_space.sample()
array([[0, 0],
       [0, 1],   
       [1, 1]], dtype=int8)

Como puedes ver, es facilísimo trabajar con entornos y espacios de acciones en esta librería.

En el próximo artículo de esta serie, hablaremos de las políticas en el aprendizaje por refuerzo. Y por si acaso te has perdido los artículos anteriores, te dejo aquí los links: Conceptos clave del aprendizaje por refuerzo (RL 1), Estados y observaciones en el aprendizaje por refuerzo (RL 2).

Keep moving forward!

Anterior

Estados y observaciones en el aprendizaje por refuerzo (RL 2)

¿Qué es una política en el aprendizaje por refuerzo? (RL 4)

Siguiente

Deja un comentario