Discussão do artigo "Redes neurais de maneira fácil (Parte 50): Soft Actor-Critic (otimização do modelo)" - página 2
Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
etc. Estou entendendo? O que me confunde é o fato de que o teste geralmente dá passes negativos muito grandes com -7000 ou até -9000. E haverá muitos deles na base. A rede não será treinada para negociar no negativo de propósito?
Vamos analisar o processo de aprendizagem sem nos aprofundarmos muito na matemática, por assim dizer, em nossos dedos. No aprendizado por reforço clássico, cada ação é avaliada pelo ambiente quando ele nos dá uma recompensa. Damos essa recompensa ao modelo como um resultado desejado. Assim, treinamos o modelo não para escolher uma ação, mas para prever a recompensa esperada para a ação (função Q) e, a partir das recompensas previstas, escolhemos a recompensa máxima para executar a ação. Deixe-me dizer desde já que a opção de não fazer nada se todas as ações não forem lucrativas não passa, porque avaliamos "não fazer nada" como uma ação separada e ela também tem seu próprio nível de recompensa.
Em um espaço de ação contínuo, não podemos especificar diretamente uma recompensa para uma ação. Afinal, o modelo precisa retornar o nível de impacto (volume de transações, nível de SL, etc.), não a recompensa. Portanto, usamos um Critic para avaliar as ações. Alimentamos o estado e a ação do banco de dados de exemplo com a entrada do Critic, e ele retorna uma recompensa prevista. Comparamos essa recompensa com a recompensa do modelo e treinamos o Critic para avaliar as ações corretamente. Como resultado, o Critic forma uma ideia abstrata sobre a influência do estado e da ação na recompensa esperada. Por exemplo, em uma tendência de alta, um aumento no volume de compras aumentará a receita, enquanto uma diminuição no volume de vendas reduzirá as perdas.
Em seguida, treinamos o Ator. Pegamos um estado separado e o alimentamos com a entrada do Ator. O Ator gera alguma ação. Alimentamos essa ação e o estado inicial do ambiente e ele avalia a ação do Ator. Em seguida, dizemos ao Critic que precisamos melhorar o resultado (especificamos um resultado-alvo maior do que o resultado recebido). Em resposta, o Critic informa ao Actor como ele precisa mudar sua ação (transmite um gradiente de erro).
Portanto, teoricamente, também podemos obter um resultado positivo em passes negativos. Mas o problema é que a função de dependência da renda em relação à ação não é linear. E para uma avaliação mais correta das ações, é melhor usar passes.
Agora, quanto ao trabalho direto e ao treinamento do Ator. No estágio inicial, inicializamos o modelo com parâmetros aleatórios. E as ações do Ator são igualmente aleatórias. No processo de treinamento, por exemplo, o Critic, por exemplo, diz que precisamos abrir uma posição de 1 lote. Mas treinamos o modelo com uma taxa de aprendizado baixa. E na próxima iteração, o Actor abre uma posição de 0,01 lote. Obviamente, precisamos fazer 100 dessas iterações de treinamento para obter o resultado desejado.
Parece que, por que bater a cabeça contra a parede? Vamos aumentar o coeficiente de aprendizado para 1 e memorizar a experiência adquirida de uma só vez. Mas há outro lado da moeda. Nesse caso, o modelo esquecerá imediatamente toda a experiência acumulada e a generalização estará fora de questão.
É por isso que continuamos batendo a cabeça contra a parede até aprendermos uma verdade simples. E todo o processo de treinamento do modelo é uma seleção direcionada de parâmetros pelo método de tentativa e erro.
Vamos dar uma olhada no processo de aprendizagem sem nos aprofundarmos muito na matemática, por assim dizer, em nossos dedos. No aprendizado por reforço clássico, cada ação é avaliada pelo ambiente quando ele nos dá uma recompensa. Damos essa recompensa ao modelo como um resultado desejado. Assim, treinamos o modelo não para escolher uma ação, mas para prever a recompensa esperada para a ação (função Q) e, a partir das recompensas previstas, escolhemos a recompensa máxima para executar a ação. Deixe-me dizer desde já que a opção de não fazer nada se todas as ações não forem lucrativas não funciona, porque avaliamos "não fazer nada" como uma ação separada e ela também tem seu próprio nível de recompensa.
Em um espaço de ação contínuo, não podemos especificar diretamente uma recompensa para uma ação. Afinal, o modelo precisa retornar o nível de impacto (volume de transações, nível de SL, etc.), não a recompensa. Portanto, usamos um Critic para avaliar as ações. Alimentamos o estado e a ação do banco de dados de exemplo com a entrada do Critic, e ele retorna uma recompensa prevista. Comparamos essa recompensa com a recompensa do modelo e treinamos o Critic para avaliar as ações corretamente. Como resultado, o Critic forma uma ideia abstrata sobre a influência do estado e da ação na recompensa esperada. Por exemplo, em uma tendência de alta, um aumento no volume de compra aumentará a recompensa, enquanto uma diminuição no volume de venda diminuirá a perda.
Em seguida, treinamos o Ator. Pegamos um estado separado e o alimentamos com a entrada do Ator. O Ator gera alguma ação. Alimentamos essa ação e o estado inicial do ambiente e ele avalia a ação do Ator. Em seguida, dizemos ao Critic que precisamos melhorar o resultado (especificamos um resultado-alvo maior do que o resultado recebido). Em resposta, o Critic informa ao Actor como alterar sua ação (transmite um gradiente de erro).
Portanto, teoricamente, também podemos obter um resultado positivo em passagens negativas. Mas o problema é que a função de dependência da renda em relação à ação não é linear. E para uma avaliação mais correta das ações, é melhor usar passagens.
Agora, quanto ao trabalho direto e ao treinamento do Ator. No estágio inicial, iniciamos o modelo com parâmetros aleatórios. E as ações do Ator são igualmente aleatórias. No processo de treinamento, por exemplo, o Critic, por exemplo, diz que precisamos abrir uma posição para 1 lote. Mas treinamos o modelo com uma taxa de aprendizado baixa. E na próxima iteração, o Actor abre uma posição de 0,01 lote. Obviamente, para obter o resultado desejado, precisamos fazer 100 dessas iterações de treinamento.
Parece que, por que bater a cabeça contra a parede? Vamos aumentar o coeficiente de aprendizado para 1 e memorizar a experiência adquirida de uma só vez. Mas há outro lado da moeda. Nesse caso, o modelo esquecerá imediatamente toda a experiência acumulada e a generalização estará fora de questão.
É por isso que continuamos batendo a cabeça contra a parede até aprendermos uma verdade simples. E todo o processo de treinamento do modelo é uma seleção direcionada de parâmetros pelo método de tentativa e erro.
Entendo. Muito obrigado por essa explicação tão clara.
Então surge a pergunta: por que treinar o modelo com 100.000 iterações e ter uma base de 200 trajetórias e repetir constantemente o processo de coleta de novos exemplos? Por que um Expert Advisor não pode criar uma base de 1.000 trajetórias, por exemplo, e colocar 10.000.000 de iterações em treinamento e deixá-lo aprender durante a noite, o dia ou a semana? Por que é necessário reabastecer constantemente a base e ensinar um pequeno número de iterações?
Estou vendo. Muito obrigado por uma explicação tão clara.
Então surge a pergunta: por que devemos treinar o modelo por 100.000 iterações e ter uma base de 200 trajetórias e repetir constantemente o processo de coleta de novos exemplos? Por que um Expert Advisor não pode criar uma base de 1.000 trajetórias, por exemplo, e colocar 10.000.000 de iterações em treinamento e deixá-lo aprender durante a noite, o dia ou a semana? Por que é necessário reabastecer constantemente a base e ensinar um pequeno número de iterações?
Teoricamente, é possível, mas tudo se resume a recursos. Por exemplo, estamos falando de um tamanho de TA de 1.000 pontos. No conceito de um espaço de ação contínuo, são 1.000 opções. Mesmo se usarmos incrementos de 10, são 100 variantes. Deixe o mesmo número de SLs ou até a metade deles (50 variantes). Adicione pelo menos 5 variantes do volume de negociação e teremos 100 * 50 * 5 = 25.000 variantes. Multiplique por 2 (compra / venda) - 50.000 variantes para um candle. Multiplique pelo comprimento da trajetória e você terá o número de trajetórias para cobrir totalmente todo o espaço possível.
No aprendizado passo a passo, coletamos amostras de trajetórias na vizinhança imediata das ações do ator atual. Assim, restringimos a área de estudo. E não estudamos todas as variantes possíveis, mas apenas uma pequena área com busca de variantes para aprimorar a estratégia atual. Após um pequeno "ajuste" da estratégia atual, coletamos novos dados na área para onde esses aprimoramentos nos levaram e determinamos o vetor de movimento adicional.
Isso pode ser uma reminiscência de como encontrar uma saída em um labirinto desconhecido. Ou o caminho de um turista que caminha pela rua e pede orientações aos transeuntes.
Teoricamente, isso é possível, mas tudo depende dos recursos. Por exemplo, estamos falando de um tamanho de TP de 1.000 pontos. No conceito de um espaço de ação contínuo, isso representa 1.000 variantes. Mesmo se considerarmos incrementos de 10, são 100 variantes. Deixe o mesmo número de SLs ou até a metade deles (50 variantes). Adicione pelo menos 5 variantes do volume de negociação e teremos 100 * 50 * 5 = 25.000 variantes. Multiplique por 2 (compra / venda) - 50.000 variantes para um candle. Multiplique pelo comprimento da trajetória e você terá o número de trajetórias para cobrir totalmente todo o espaço possível.
No aprendizado passo a passo, coletamos amostras de trajetórias na vizinhança imediata das ações do ator atual. Assim, restringimos a área de estudo. E não estudamos todas as variantes possíveis, mas apenas uma pequena área com busca de variantes para aprimorar a estratégia atual. Após um pequeno "ajuste" da estratégia atual, coletamos novos dados na área para onde esses aprimoramentos nos levaram e determinamos o vetor de movimento adicional.
Isso pode ser uma reminiscência de como encontrar uma saída em um labirinto desconhecido. Ou o caminho de um turista que caminha pela rua e pede orientações aos transeuntes.
Estou vendo. Obrigado.
Notei agora que, quando você faz a coleta Research.mqh, os resultados são formados de alguma forma em grupos com um equilíbrio final muito próximo no grupo. E parece que há algum progresso no Research.mqh (grupos de resultados positivos começaram a aparecer com mais frequência ou algo assim). Mas com o Test.mqh parece não haver progresso algum. Ele apresenta alguma aleatoriedade e, em geral, termina com mais frequência uma aprovação com um sinal de menos. Às vezes ele sobe e depois desce, e às vezes desce direto e depois para. Ele também parece aumentar o volume de entrada no final. Às vezes, ele não negocia no negativo, mas em torno de zero. Também notei que ele muda o número de negociações - por 5 meses, ele abre 150 negociações, e alguém abre 500 (aproximadamente). Isso tudo é normal, o que estou observando?
Estou vendo. Obrigado.
Percebi que, quando faço a coleta do Research.mqh, os resultados são, de alguma forma, formados em grupos com um equilíbrio final muito próximo no grupo. E parece que há algum progresso no Research.mqh (grupos de resultados positivos começaram a aparecer com mais frequência ou algo assim). Mas com o Test.mqh parece não haver progresso algum. Ele apresenta alguma aleatoriedade e, em geral, termina com mais frequência uma aprovação com um sinal de menos. Às vezes ele sobe e depois desce, e às vezes desce direto e depois para. Ele também parece aumentar o volume de entrada no final. Às vezes, ele não negocia no negativo, mas em torno de zero. Também notei que ele muda o número de negociações - por 5 meses, ele abre 150 negociações, e alguém abre 500 (aproximadamente). Isso tudo é normal, o que estou observando?
A aleatoriedade é resultado da estocasticidade do Actor. À medida que você aprender, ela diminuirá. Talvez não desapareça completamente, mas os resultados serão próximos.
O banco de dados de exemplos não será "entupido" por passagens sem acordos. O Research.mq5 tem uma verificação e não salva essas passagens. Mas é bom que esse tipo de passe seja salvo no Test.mq5. Há uma penalidade para a ausência de negócios ao gerar a recompensa. E isso deve ajudar o modelo a sair de tal situação.

Dmitriy, eu fiz mais de 90 ciclos (treinamento-teste-coleta de banco de dados) e ainda tenho o modelo dá aleatório. Posso dizer que, de 10 execuções do Test.mqh, 7 drenam de 2 a 3 para 0 e de 1 a 2 vezes, por cerca de 4 a 5 ciclos, há uma execução positiva. Você indicou no artigo que obteve um resultado positivo em 15 ciclos. Entendo que há muita aleatoriedade no sistema, mas não entendo por que essa diferença? Bem, entendo que se meu modelo desse um resultado positivo após 30 ciclos, digamos 50, bem, já são 90 e você não consegue ver muito progresso.....
Tem certeza de que publicou o mesmo código que você mesmo treinou? Talvez você tenha corrigido algo para os testes e acidentalmente tenha se esquecido e publicado a versão errada.....?
E se, por exemplo, o coeficiente de treinamento for aumentado em um grau, ele não aprenderá mais rápido?
Não estou entendendo algo......