python - Gradientes de la política en Keras
deep-learning theano (1)
TL; DR
- Aprenda a implementar funciones y gradientes de pérdida personalizados utilizando Keras.backend. Lo necesitarás para algoritmos más avanzados y, de hecho, es mucho más fácil una vez que aprendes a hacerlo.
- Un ejemplo de CartPole de usar keras.backend podría ser https://gist.github.com/kkweon/c8d1caabaf7b43317bc8825c226045d2 (aunque su backend utiliza Tensorflow pero debería ser muy similar si no es el mismo)
Problema
Al jugar,
el agente necesita una política que es básicamente una función que asigna un estado a una política que es una probabilidad para cada acción. Por lo tanto, el agente elegirá una acción de acuerdo con su política.
es decir, política = f (estado)
Cuando se entrena,
La política de gradiente no tiene una función de pérdida. En su lugar, trata de maximizar el retorno esperado de las recompensas. Y, tenemos que calcular los gradientes de log (action_prob) * ventaja
- La ventaja es una función de las recompensas.
- ventaja = f (recompensas)
- action_prob es una función de states y action_taken. Por ejemplo, necesitamos saber qué acción tomamos para poder actualizar los parámetros para aumentar / disminuir la probabilidad de la acción que tomamos.
- action_prob = sum (policy * action_onehot) = f (states, action_taken)
Estoy asumiendo algo como esto
- política = [0.1, 0.9]
- action_onehot = action_taken = [0, 1]
- entonces action_prob = sum (policy * action_onehot) = 0.9
Resumen
Necesitamos dos funciones
- Función de actualización: f (state, action_taken, reward)
- Elija la función de acción: f (estado)
Ya sabes que no es fácil de implementar como los problemas típicos de clasificación en los que puedes simplemente model.compile (...) -> model.fit (X, y)
Sin embargo,
Para utilizar Keras completamente, debe sentirse cómodo definiendo funciones de pérdida y gradientes personalizadas. Este es básicamente el mismo enfoque que tomó el autor del anterior.
Debería leer más documentaciones de la API funcional de Keras y keras.backend
Además, hay muchos tipos de gradientes de políticas.
- El primero se llama DDPG, que en realidad es bastante diferente de los gradientes de políticas regulares
- El último que veo es un gradiente de políticas de REFUERZO tradicional (pg.py) que se basa en el ejemplo del gradiente de políticas de Kapathy. Pero es muy simple, por ejemplo, solo asume una acción. Es por eso que podría haberse implementado de alguna manera utilizando model.fit (...) en su lugar.
Referencias
- Schulman, "Policy Gradient Methods", http://rll.berkeley.edu/deeprlcourse/docs/lec2.pdf
He estado intentando construir un modelo usando ''Deep Q-Learning'' donde tengo una gran cantidad de acciones (2908). Después de cierto éxito limitado con el uso de DQN estándar: ( https://www.cs.toronto.edu/~vmnih/docs/dqn.pdf ), decidí investigar un poco más porque pensé que el espacio de acción era demasiado grande para hacerlo exploración efectiva
Luego descubrí este documento: https://arxiv.org/pdf/1512.07679.pdf donde usan un modelo de actor crítico y gradientes de políticas, lo que me llevó a: https://arxiv.org/pdf/1602.01783.pdf donde utilizan gradientes de políticas para obtener resultados mucho mejores que DQN en general.
He encontrado algunos sitios donde han implementado gradientes de políticas en Keras, https://yanpanlau.github.io/2016/10/11/Torcs-Keras.html y https://oshearesearch.com/index.php/2016/06/14/kerlym-a-deep-reinforcement-learning-toolbox-in-keras/ sin embargo, estoy confundido sobre cómo se implementan. En el primero (y cuando leo los documentos) parece que en lugar de proporcionar un par de entrada y salida para la red de actores, se proporcionan los gradientes para todos los pesos y luego se usa la red para actualizarla, mientras que, en el segundo simplemente calculan un par de entrada-salida.
¿Me acabo de confundir? ¿Se supone que debo entrenar la red proporcionando un par de entrada-salida y usar el ''ajuste'' estándar, o tengo que hacer algo especial? Si es lo último, ¿cómo lo hago con el backend Theano? (Los ejemplos anteriores utilizan TensorFlow).