Uma implementação de Pytorch de "Seqgan: sequência generativa redes adversárias com gradiente de políticas". (Yu, Lantao, et al.). O código é altamente simplificado, comentado e (espero) direto de entender. Os gradientes de políticas implementados também são muito mais simples do que no trabalho original (https://github.com/lantayu/seqgan/) e não envolvem lançamentos- uma única recompensa é usada para toda a frase (inspirada nos exemplos em http://karpath.github.io/2016/05/31/31/rl/rl/rl/rl.
As arquiteturas utilizadas são diferentes das do trabalho orignal. Especificamente, uma rede GRU bidirecional recorrente é usada como discriminador.
O código executa o experimento sobre dados sintéticos, conforme descrito no artigo.
Você é incentivado a levantar dúvidas sobre o funcionamento do código como problemas.
Para executar o código:
python main.pyMain.py deve ser seu ponto de entrada no código.
Os seguintes hacks (emprestados de https://github.com/soumith/ganhacks) parecem ter funcionado neste caso:
Discriminador de treinamento muito mais do que o gerador (o gerador é treinado apenas para um lote de exemplos, e aumentar o tamanho do lote dói a estabilidade)
Usando Adam para gerador e Adagrad para discriminador
Taxa de aprendizado de ajuste para o gerador na fase GaN
Usando o abandono na fase de treinamento e teste
A estabilidade é extremamente sensível a quase todos os parâmetros:/
A fase GAN nem sempre pode levar a quedas maciças na NLL (às vezes muito mínima) - suspeito que isso se deva à natureza muito grosseira dos gradientes de política implementados (sem lançamentos).
A curva de aprendizado obtida após o treinamento da MLE para 100 épocas seguidas de treinamento adversário. (Seus resultados podem variar!)