Eu implementei o Q-Learning conforme descrito em,
http://web.cs.swarthmore.edu/~meeden/cs81/s12/papers/MarkStevePaper.pdf
Para aprox. Q (S, A) Eu uso uma estrutura de rede neural como a seguir,
- Ativação sigmóide
- Entradas, número de entradas + 1 para neurônios de Ação (Todas as Entradas Escaladas 0-1)
- Saídas, saída única. Valor Q
- N número de M camadas ocultas.
- Método de exploração aleatório 0 <rand () <propExplore
Em cada iteração de aprendizado usando a seguinte fórmula,
Calculo um valor Q-Target e calculo um erro usando,
error = QTarget - LastQValueReturnedFromNN
e voltar a propagar o erro através da rede neural.
Q1, estou no caminho certo? Eu vi alguns trabalhos que implementam um NN com um neurônio de saída para cada ação.
Q2, Minha função de recompensa retorna um número entre -1 e 1. Tudo bem retornar um número entre -1 e 1 quando a função de ativação é sigmóide (0 1)
P3: Pela minha compreensão desse método, dadas as instâncias de treinamento suficientes, deve-se colocar em quarentena para encontrar uma política ideal. Às vezes, durante o treinamento para XOR, ele é aprendido após 2k iterações; às vezes, não é aprendido mesmo após 40k 50k iterações.
fonte
Respostas:
Q1 Você está definitivamente no caminho certo, mas algumas mudanças podem ajudar imensamente. Algumas pessoas usam uma unidade de saída por ação, de modo que elas só precisam executar sua rede uma vez para a seleção de ações (você deve executar sua rede uma vez para cada ação possível). Mas isso não deve fazer diferença no que diz respeito ao aprendizado e só vale a pena implementá-lo se você estiver planejando aumentar significativamente seu modelo.
Q2 Geralmente, as pessoas usam uma função de ativação linear para a última camada de sua rede neural, especialmente para o aprendizado por reforço. Há várias razões para isso, mas o mais pertinente é que uma função de ativação linear permite representar todo o intervalo de números reais como sua saída. Assim, mesmo que você não saiba os limites das recompensas para sua tarefa, você ainda poderá representar esse intervalo.
Q3 Infelizmente, as garantias teóricas para combinar redes neurais (e aproximação de funções não lineares em geral) com aprendizado por reforço são praticamente inexistentes. Existem algumas versões mais sofisticadas do aprendizado por reforço (principalmente fora do laboratório de Sutton) que podem fazer os tipos de reivindicações de convergência que você mencionou, mas eu nunca vi esses algoritmos realmente aplicados 'na natureza'. A razão para isso é que, embora não seja possível prometer um ótimo desempenho, ele normalmente é obtido na prática, com a devida atenção aos hiperparâmetros e condições iniciais.
Um último ponto que vale a pena mencionar para redes neurais em geral: não use funções de ativação sigmóide para redes com muitas camadas ocultas! Eles são amaldiçoados com o problema de 'desaparecer gradientes'; o sinal de erro dificilmente alcança as camadas anteriores (observar a derivada da função deve deixar claro por que esse é o caso). Em vez disso, tente usar unidades lineares retificadas (RELU) ou unidades 'soft plus', pois geralmente exibem um desempenho muito melhor em redes profundas.
Veja este artigo para uma ótima implementação de redes neurais treinadas com aprendizado por reforço:
Mnih, Volodymyr, et al. "Jogando Atari com aprendizado profundo por reforço." pré-impressão do arXiv arXiv: 1312.5602 (2013).
fonte
Para a função de ativação, o maxout também funciona bem. O uso de um instrutor adequado é crucial para redes profundas. Tentei vários treinadores, mas decidi seguir o RMSprop e está ótimo!
fonte