He implementado Q-Learning como se describe en,
http://web.cs.swarthmore.edu/~meeden/cs81/s12/papers/MarkStevePaper.pdf
Para aprox. P (S, A) Uso una estructura de red neuronal como la siguiente,
- Activación sigmoidea
- Entradas, número de entradas + 1 para neuronas de acción (todas las entradas escaladas 0-1)
- Salidas, salida única. Q-Value
- N número de M capas ocultas.
- Método de exploración aleatorio 0 <rand () <propExplore
En cada iteración de aprendizaje usando la siguiente fórmula,
Calculo un valor de Q-Target y luego calculo un error usando,
error = QTarget - LastQValueReturnedFromNN
y volver a propagar el error a través de la red neuronal.
Q1, ¿estoy en el camino correcto? He visto algunos documentos que implementan un NN con una neurona de salida para cada acción.
P2, Mi función de recompensa devuelve un número entre -1 y 1. ¿Está bien devolver un número entre -1 y 1 cuando la función de activación es sigmoidea (0 1)
P3: Según tengo entendido este método, dado que hay suficientes instancias de capacitación, ¿debería ponerse en cuarentena para encontrar una política óptima? Al entrenar para XOR, a veces lo aprende después de 2k iteraciones, a veces no aprende incluso después de 40k 50k iteraciones.
fuente
Respuestas:
Q1. Definitivamente estás en el camino correcto, pero algunos cambios podrían ser de gran ayuda. Algunas personas usan una unidad de salida por acción, de modo que solo tienen que ejecutar su red una vez para la selección de acción (debe ejecutar su red una vez para cada acción posible). Pero esto no debería marcar la diferencia con respecto al aprendizaje , y solo vale la pena implementarlo si está planeando ampliar su modelo de manera significativa.
Q2 En general, las personas usan una función de activación lineal para la última capa de su red neuronal, especialmente para el aprendizaje de refuerzo. Hay una variedad de razones para esto, pero la más pertinente es que una función de activación lineal le permite representar el rango completo de números reales como su salida. Por lo tanto, incluso si no conoce los límites de las recompensas para su tarea, todavía tiene la garantía de poder representar ese rango.
Q3. Desafortunadamente, las garantías teóricas para combinar redes neuronales (y aproximación de función no lineal para generalmente) con aprendizaje de refuerzo son prácticamente inexistentes. Hay algunas versiones más sofisticadas del aprendizaje por refuerzo (principalmente del laboratorio de Sutton) que pueden hacer el tipo de afirmaciones de convergencia que mencionas, pero nunca he visto esos algoritmos aplicados 'en la naturaleza'. La razón de esto es que, si bien no se puede prometer un gran rendimiento, generalmente se obtiene en la práctica, con la debida atención a los hiperparámetros y las condiciones iniciales.
Un último punto que vale la pena mencionar para las redes neuronales en general: ¡no use las funciones de activación sigmoidea para redes con muchas capas ocultas! Están maldecidos con el problema de 'gradientes que desaparecen'; la señal de error apenas alcanza las capas anteriores (mirar la derivada de la función debería dejar claro por qué este es el caso). En su lugar, intente usar unidades lineales rectificadas (RELU) o unidades 'soft plus', ya que generalmente exhiben un rendimiento mucho mejor en redes profundas.
Vea este documento para una gran implementación de redes neuronales capacitadas con aprendizaje de refuerzo:
Mnih, Volodymyr y col. "Jugar a Atari con aprendizaje de refuerzo profundo". preimpresión de arXiv arXiv: 1312.5602 (2013).
fuente
Para la función de activación, maxout también funciona bien. Usar el entrenador adecuado es crucial para las redes profundas, había probado varios entrenadores, pero decidí seguir con RMSprop y se ve muy bien.
fuente