Una implementación de Pytorch de "Seqgan: secuencia de redes adversas generativas con gradiente de política". (Yu, Lantao, et al.). El código está altamente simplificado, comentado y (con suerte) sencillo de entender. Los gradientes de políticas implementados también son mucho más simples que en el trabajo original (https://github.com/lantaoyu/seqgan/) y no involucran despliegue, se usa una sola recompensa para toda la oración (inspirada en los ejemplos en http://karpathy.github.io/2016/05/31/rl/).
Las arquitecturas utilizadas son diferentes a las del trabajo Orignal. Específicamente, se utiliza una red Gru bidireccional recurrente como discriminador.
El código realiza el experimento de datos sintéticos como se describe en el documento.
Se le recomienda que plantee dudas sobre el funcionamiento del código como problemas.
Para ejecutar el código:
python main.pyMain.py debe ser su punto de entrada en el código.
Los siguientes hacks (prestados de https://github.com/soumith/ganhacks) parecen haber funcionado en este caso:
Discriminador de entrenamiento mucho más que el generador (el generador está entrenado solo para un lote de ejemplos, y aumentar el tamaño del lote duele la estabilidad)
Uso de Adam para generador y adagrad para discriminador
Ajuste de la tasa de aprendizaje para el generador en la fase GaN
Usar abandono tanto en la fase de entrenamiento como de prueba
La estabilización es extremadamente sensible a casi todos los parámetros:/
La fase GaN no siempre conduce a caídas masivas en NLL (a veces muy mínima). Sospecho que esto se debe a la naturaleza muy cruda de los gradientes de políticas implementados (sin despliegue).
Curva de aprendizaje obtenida después de la capacitación de MLE para 100 épocas seguidas de entrenamiento adversario. (¡Sus resultados pueden variar!)