Arquitectura de red neuronal para implementar el algoritmo RL con la capacidad de establecer acciones simultáneas

Uno de los esquemas clásicos de redes neuronales para implementar el algoritmo RL es el siguiente:


Donde: entradas - entradas a la red neuronal; FC - arquitectura de capa oculta (completamente conectada) o CNN - FC - arquitectura de capa oculta (dependiendo de lo que se alimenta a las entradas); salidas - salidas de red. A menudo, las salidas de red son una capa softmax que proporciona la probabilidad de una de las acciones del conjunto de todas las acciones posibles.

La desventaja de esta arquitectura es que es difícil implementar la elección de varias acciones realizadas simultáneamente.

Para resolver este problema, se propone una arquitectura con una capa de máscara. La arquitectura propuesta es la siguiente:


Esta arquitectura es totalmente coherente con la arquitectura clásica, pero también incluye una capa de máscara de acción. Solo hay una salida de esta arquitectura: este es el valor del valor de la acción (un grupo de acciones realizadas simultáneamente). La capa de máscara de acción se puede implementar de acuerdo con el pseudocódigo siguiente:

import numpy as np class Layer: def __init__(self, items, item_size, extra_size): assert(items > 0) assert(item_size > 0) assert(extra_size >= 0) self.items = items self.item_size = item_size self.extra_size = extra_size def build(self): self._expand_op = np.zeros((self.items, self.items*self.item_size), \ dtype=np.float32) for i in range(self.items): self._expand_op[i,i*self.item_size:(i+1)*self.item_size] = np.float32(1.0) def call(self, inputs, ops): op_mask_part = inputs[:self.items*self.item_size] if self.extra_size > 0: ext_part = inputs[self.items*self.item_size:] else: ext_part = None # if ops in [-0.5, 0.5] or [-0.5 .. 0.5]: ops1 = np.add(ops, np.float(0.5)) # optional extended_op = np.matmul(ops1, self._expand_op) if self.extra_size > 0: return np.concatenate((np.multiply(op_mask_part, extended_op), ext_part)) else: return np.multiply(op_mask_part,extended_op) 

Y el uso de este código demuestra el siguiente fragmento de código:

 items = 5 item_size = 10 extra_size = 20 l = Layer(items=items, item_size=item_size, extra_size=extra_size) l.build() inputs = np.random.rand(items*item_size+extra_size) ops = np.random.randint(0, 2, (items,), dtype="int") ops = ops.astype(dtype=np.float32) - np.float32(0.5) result = l.call(inputs,ops) 

Del código de capa se puede ver que, para cada acción, la red neuronal aprende a formar alguna representación de la acción en forma de una serie de pesos. Y estas representaciones van a la red después de la capa de máscara o no. Dependiendo de la operación, estos pesos pueden llevarse a cabo con la tarea de alguna operación sobre todo el grupo de pesos de acción (no solo la multiplicación por [0,1]). Por lo tanto, la tarea de acciones se forma para calcular el valor del grupo de acciones realizadas por la red. (En el caso clásico, la capa softmax calculó el valor de todas las acciones; en la arquitectura propuesta, la red neuronal calcula el valor de un grupo de acciones seleccionadas).

(Para una definición del valor de una acción, ver, por ejemplo, R.S. Sutton, E.G. Barto Reinforced Learning).

Ejemplos de uso de la arquitectura propuesta


Juego de Tetris


La idea de usar esta arquitectura para jugar tetris es la siguiente. En las entradas presentamos la imagen del vaso del juego tetris (un píxel un cuadrado). Agrupamos acciones individuales en grupos de acción. La evaluación de una acción para una red neuronal es una máscara de la posición final de una figura en un vaso. La figura se establece por sus cuadrados en la máscara de acción en la capa de la máscara de acción en la red neuronal. Para seleccionar un grupo de acciones, seleccionamos la evaluación máxima de la acción (salir) de la lista de todas las posiciones finales de la figura actual.


Dibujo Se muestran el campo (celdas azules) y la forma descendente (celdas gris claro). La posición final de la figura es todas las posiciones posibles desde las cuales la figura no puede moverse de acuerdo con las reglas del juego (no se muestra).

Agente simulando el movimiento de un automóvil


En este caso, cada acción de aceleración (varias aceleraciones de aceleración), frenado (varias aceleraciones posibles durante el frenado), así como varios grados de rotación se modelaron como acciones elementales. Se entiende que al mismo tiempo puede estar involucrada una rotación y una de las aceleraciones, o solo una acción de rotación o una acción de aceleración. En este caso, la arquitectura le permite especificar varias acciones elementales al mismo tiempo para formar una acción compleja.


Dibujo Además del campo para llevar a cabo acciones por el modelo de automóvil (en el que el objetivo de estacionamiento se indica mediante líneas rojas y verdes), también se muestran las entradas de la red neuronal (a continuación) y los valores de la evaluación de acciones para todas las acciones posibles en este estado del modelo.

Otras posibles aplicaciones de arquitectura


Del mismo modo, con el uso de tetris en un juego, la arquitectura se puede usar para otros juegos, donde se pueden establecer una serie de figuras y varias acciones en el campo al mismo tiempo (por ejemplo, moverse por el campo de juego).

En robótica, esta arquitectura puede servir como una meta-red que coordina elementos estructurales individuales en un conjunto común.

Además, esta arquitectura le permite utilizar el aprendizaje de transferencia para entrenar previamente la parte CNN, y viceversa al principio para entrenar la parte RL de la red neuronal, y luego entrenar la parte CNN en la red RL ya entrenada en los datos del modelo. En el ejemplo, al programar el juego Tetris, el aprendizaje de transferencia se aplicó con entrenamiento al comienzo de la parte CNN y la parte FC a la capa de máscara de acción (lo que se transfiere a la red resultante). En el problema del estacionamiento, también planeo aplicar la capacitación CNN después de aprender la parte RL (es decir, la primera cereza).

→ Los ejemplos del código fuente del programa se pueden encontrar aquí

Source: https://habr.com/ru/post/454916/


All Articles