Sim, mas os valores de ativação são passados para a função de derivação enquanto ela espera os valores de pré-ativação. É isso que estou dizendo.
Acho que você está errado. A derivação é calculada de acordo com a fórmula que forneci acima: y'(x) = y(x)*(1-y(x)), em que x é o estado do neurônio antes da ativação e y(x) é o resultado da aplicação da função de ativação. Você não usa o valor pré-ativação para calcular a derivação, mas sim o resultado da ativação (y). Aqui está um teste simplificado:
double derivative(double output)
{
return output * (1 - output);
}
voidOnStart()
{
vector x = {{0.68}};
vector y;
x.Activation(y, AF_SIGMOID); // obteve o resultado da ativação/sigmoide como "y(x)" em y[0]vector d;
x.Derivative(d, AF_SIGMOID); // obteve a derivada do sigmoide em xPrint(derivative(x[0]), " ", derivative(y[0]), " ", d); // 0.21760.2231896389723258 [0.2231896389723258]
}
Acho que você está errado. A derivação é calculada de acordo com a fórmula que forneci acima: y'(x) = y(x)*(1-y(x)), em que x é o estado do neurônio antes da ativação e y(x) é o resultado da aplicação da função de ativação. Você não usa o valor pré-ativação para calcular a derivação, mas sim o resultado da ativação (y). Aqui está um teste simplificado:
Sim, é isso que estou dizendo, a derivada correta corresponde à derivada chamada a partir dos valores x.
Na função back prop, você está chamando o equivalente y.Derivative(d,AF_SIGMOID)
A matriz de saídas é y no backprop do artigo. Não acho que você esteja armazenando o equivalente a x em uma matriz para chamar a derivada a partir dela.
(novamente, de acordo com a função mq)
--
Mesmo no seu exemplo, você está chamando a derivada de x, aposto que você digitou y no início e depois "errou".
Diga a eles no fórum russo. Isso poupará muito tempo de muitas pessoas se eles puderem adicionar isso aos documentos.
Acho que você está errado. A derivação é calculada de acordo com a fórmula que forneci acima: y'(x) = y(x)*(1-y(x)), em que x é o estado do neurônio antes da ativação e y(x) é o resultado da aplicação da função de ativação. Você não usa o valor pré-ativação para calcular a derivação, mas sim o resultado da ativação (y). Aqui está um teste simplificado:
Deixe-me simplificar isso.
Este é o seu exemplo
double derivative(double output)
{
return output * (1 - output);
}
voidOnStart()
{
vector x = {{0.68}};
vector y;
x.Activation(y, AF_SIGMOID); // obteve o resultado da ativação/sigmoide como "y(x)" em y[0]vector d;
x.Derivative(d, AF_SIGMOID); // obteve a derivada do sigmoide em xPrint(derivative(x[0]), " ", derivative(y[0]), " ", d); // 0.21760.2231896389723258 [0.2231896389723258]
}
No seu exemplo, você está chamando x.Derivative para preencher o vetor de derivadas d.
Você não está chamando y.Derivative para preencher as derivadas, por quê? Porque ele retorna os valores errados. (e você provavelmente percebeu isso, por isso usou x.Derivative).
O que é y? Os valores de ativação de x.
Então, quando você faz isso:
x.Activation(y, AF_SIGMOID);
Você preenche y com os valores de ativação de x, mas chama a derivada em x e não em y(o que está correto de acordo com a função mql5).
Em seu artigo, no feed forward, a temperatura é x
matrix temp = outputs[i].MatMul(weights[i]);
E y seria os valores de ativação de x. Que matriz é essa?
temp.Activation(outputs[i + 1], i < n - 1 ? af : of)
Osoutputs. No artigo, a matriz y ( da qual você não chama a derivada no exemplo) é a matriz de saídas .
(o que estamos vendo no código acima é o equivalente x.Activation(y,AF) do exemplo que preenche y com os valores de ativação)
No seu código de backprop, você não está chamando x.Derivative porque x(matriz temp = outputs[i].MatMul(weights[i]);)
não está armazenado em nenhum lugar e você não pode chamá-lo. Você está chamando o equivalente a y.Derivative, que retorna os valores errados
À primeira vista, parece bom, sim. O cálculo no local é mais rápido do que o armazenamento, presumo.
Acho que sei o motivo pelo qual ela foi originalmente codificada por meio da saída da função de ativação. Em todas as minhas bibliotecas NN anteriores e em algumas bibliotecas de outras pessoas que usei, as derivadas são calculadas por meio de saídas, porque é mais simples e eficaz (durante a adaptação à API de matriz, não prestei atenção à diferença). Por exemplo:
Dessa forma, não precisamos manter os argumentos de pré-ativação (matrizes) ou recalculá-los novamente durante a fase de retropropagação (como é feito na correção). Não gosto das duas abordagens. O cálculo da "autoderivada", por assim dizer, parece mais elegante. Por isso, prefiro encontrar algumas referências com fórmulas para autoderivadas de todas (ou muitas) funções de ativação suportadas e voltar à minha abordagem original.
É interessante que não é necessário que a fórmula autoderivada seja estritamente derivada da função de ativação - qualquer função com efeito equivalente é suficiente.
Acho que sei o motivo pelo qual ela foi originalmente codificada por meio da saída da função de ativação. Em todas as minhas bibliotecas NN anteriores e em algumas outras bibliotecas de pessoas que usei, as derivadas são calculadas por meio das saídas, porque é mais simples e eficaz (durante a adaptação à API de matriz, não prestei atenção à diferença). Por exemplo:
Dessa forma, não precisamos manter os argumentos de pré-ativação (matrizes) ou recalculá-los novamente durante a fase de retropropagação (como é feito na correção). Não gosto das duas abordagens. O cálculo da "autoderivada", por assim dizer, parece mais elegante. Por isso, prefiro encontrar algumas referências com fórmulas para autoderivadas de todas (ou muitas) funções de ativação suportadas e voltar à minha abordagem original.
Sim, mas a mq decidiu fazer isso dessa forma, então se aplica a todas as funções de ativação.
Em palavras simples, em vez de a função derivada se "adaptar" à função de ativação (como as três que você mencionou poderiam receber as saídas), eles decidiram que as funções receberiam os valores de pré-ativação de qualquer maneira. Tudo bem, o problema é que isso não está na documentação.
A suposição padrão de qualquer pessoa é que ele se adapta ao AF.
Isso é ruim para os novatos (como eu, por exemplo), pois eles "resolvem" o problema antes mesmo de começar.
(A comparação entre redes baseadas em objetos e redes baseadas em matrizes também seria um artigo muito interessante e ajudaria muitos programadores que não têm conhecimento de matemática).
De qualquer forma, eu o coloquei no tópico que um moderador tem para relatar problemas de documentação.
(fora do tópico: você pode usar este TanH, é mais rápido e correto, eu acho)
É interessante que não é necessário que a fórmula autoderivada seja estritamente derivada da função de ativação - qualquer função com efeito equivalente é suficiente.
Você quer dizer como um "substituto"?
Por exemplo, um nó recebe um erro em sua saída, e você conhece a "flutuação" da saída, portanto, se você "mudá-la" para uma ativação mais simples e derivá-la, ela funcionará?
Então, em teoria, seria como "regularizar" a saída, mas sem fazer isso e apenas multiplicar pela derivada da regularização antes da derivada da ativação?
Por exemplo:
tanh output -1 -> +1
sigmoid output 0 -> +1tanh to sigmoid output = (tanh_out+1)/2.0
and you just multiply by the derivative of that which is 0.5 ? (without touching the tanh outputs at all)
Seus esforços para colocar o conceito de rede neural na MQL são muito apreciados. Esse é realmente um excelente trabalho para iniciantes como eu. Parabéns :)
Obrigado por atualizar o arquivo com o bug corrigido. No entanto, eu sugeriria substituir o arquivo na área de download.
Felizmente, eu li a discussão sobre o tópico e descobri que há um erro no arquivo. E agora que estava tentando procurar a correção, encontrei este link de arquivo aqui.
Espero que haja apenas esses lugares para a correção do bug, nas linhas 490-493, 500, 515-527, com a marcação //*. Se estiver em outro lugar, mencione os números das linhas ou marque //*BugFix ...
Para login e uso do site MQL5.com, você deve ativar o uso de cookies.
Ative esta opção no seu navegador, caso contrário você não poderá fazer login.
Você entrou na conta. A autenticação de dois fatores foi desativada. Configure-a novamente e escaneie um novo código QR ou continue com a autenticação de dois fatores desativada.
Sim, mas os valores de ativação são passados para a função de derivação enquanto ela espera os valores de pré-ativação. É isso que estou dizendo.
Acho que você está errado. A derivação é calculada de acordo com a fórmula que forneci acima: y'(x) = y(x)*(1-y(x)), em que x é o estado do neurônio antes da ativação e y(x) é o resultado da aplicação da função de ativação. Você não usa o valor pré-ativação para calcular a derivação, mas sim o resultado da ativação (y). Aqui está um teste simplificado:
Acho que você está errado. A derivação é calculada de acordo com a fórmula que forneci acima: y'(x) = y(x)*(1-y(x)), em que x é o estado do neurônio antes da ativação e y(x) é o resultado da aplicação da função de ativação. Você não usa o valor pré-ativação para calcular a derivação, mas sim o resultado da ativação (y). Aqui está um teste simplificado:
Sim, é isso que estou dizendo, a derivada correta corresponde à derivada chamada a partir dos valores x.
Na função back prop, você está chamando o equivalente y.Derivative(d,AF_SIGMOID)
A matriz de saídas é y no backprop do artigo. Não acho que você esteja armazenando o equivalente a x em uma matriz para chamar a derivada a partir dela.
(novamente, de acordo com a função mq)
--
Mesmo no seu exemplo, você está chamando a derivada de x, aposto que você digitou y no início e depois "errou".
Diga a eles no fórum russo. Isso poupará muito tempo de muitas pessoas se eles puderem adicionar isso aos documentos.
Agradecimentos
Acho que você está errado. A derivação é calculada de acordo com a fórmula que forneci acima: y'(x) = y(x)*(1-y(x)), em que x é o estado do neurônio antes da ativação e y(x) é o resultado da aplicação da função de ativação. Você não usa o valor pré-ativação para calcular a derivação, mas sim o resultado da ativação (y). Aqui está um teste simplificado:
Deixe-me simplificar isso.
Este é o seu exemplo
No seu exemplo, você está chamando x.Derivative para preencher o vetor de derivadas d.
Você não está chamando y.Derivative para preencher as derivadas, por quê? Porque ele retorna os valores errados. (e você provavelmente percebeu isso, por isso usou x.Derivative).
O que é y? Os valores de ativação de x.
Então, quando você faz isso:
x.Activation(y, AF_SIGMOID);Você preenche y com os valores de ativação de x, mas chama a derivada em x e não em y(o que está correto de acordo com a função mql5).
Em seu artigo, no feed forward, a temperatura é x
matrix temp = outputs[i].MatMul(weights[i]);E y seria os valores de ativação de x. Que matriz é essa?
Osoutputs. No artigo, a matriz y ( da qual você não chama a derivada no exemplo) é a matriz de saídas .
(o que estamos vendo no código acima é o equivalente x.Activation(y,AF) do exemplo que preenche y com os valores de ativação)
No seu código de backprop, você não está chamando x.Derivative porque x(matriz temp = outputs[i].MatMul(weights[i]);)
não está armazenado em nenhum lugar e você não pode chamá-lo. Você está chamando o equivalente a y.Derivative, que retorna os valores errados
porque y tem os valores de ativação.
Novamente, de acordo com a função mql5.
Portanto, no seu exemplo, você está usando a chamada correta e, no seu artigo, está usando a chamada errada.
Parabéns a você
Então, você quer isso:
Vou pensar sobre isso.
Então, você quer isso:
Vou pensar sobre isso.
À primeira vista, parece bom, sim. O cálculo no local é mais rápido do que o armazenamento, presumo.
👍
À primeira vista, parece bom, sim. O cálculo no local é mais rápido do que o armazenamento, presumo.
Acho que sei o motivo pelo qual ela foi originalmente codificada por meio da saída da função de ativação. Em todas as minhas bibliotecas NN anteriores e em algumas bibliotecas de outras pessoas que usei, as derivadas são calculadas por meio de saídas, porque é mais simples e eficaz (durante a adaptação à API de matriz, não prestei atenção à diferença). Por exemplo:
Dessa forma, não precisamos manter os argumentos de pré-ativação (matrizes) ou recalculá-los novamente durante a fase de retropropagação (como é feito na correção). Não gosto das duas abordagens. O cálculo da "autoderivada", por assim dizer, parece mais elegante. Por isso, prefiro encontrar algumas referências com fórmulas para autoderivadas de todas (ou muitas) funções de ativação suportadas e voltar à minha abordagem original.
É interessante que não é necessário que a fórmula autoderivada seja estritamente derivada da função de ativação - qualquer função com efeito equivalente é suficiente.Acho que sei o motivo pelo qual ela foi originalmente codificada por meio da saída da função de ativação. Em todas as minhas bibliotecas NN anteriores e em algumas outras bibliotecas de pessoas que usei, as derivadas são calculadas por meio das saídas, porque é mais simples e eficaz (durante a adaptação à API de matriz, não prestei atenção à diferença). Por exemplo:
Dessa forma, não precisamos manter os argumentos de pré-ativação (matrizes) ou recalculá-los novamente durante a fase de retropropagação (como é feito na correção). Não gosto das duas abordagens. O cálculo da "autoderivada", por assim dizer, parece mais elegante. Por isso, prefiro encontrar algumas referências com fórmulas para autoderivadas de todas (ou muitas) funções de ativação suportadas e voltar à minha abordagem original.
Sim, mas a mq decidiu fazer isso dessa forma, então se aplica a todas as funções de ativação.
Em palavras simples, em vez de a função derivada se "adaptar" à função de ativação (como as três que você mencionou poderiam receber as saídas), eles decidiram que as funções receberiam os valores de pré-ativação de qualquer maneira. Tudo bem, o problema é que isso não está na documentação.
A suposição padrão de qualquer pessoa é que ele se adapta ao AF.
Isso é ruim para os novatos (como eu, por exemplo), pois eles "resolvem" o problema antes mesmo de começar.
(A comparação entre redes baseadas em objetos e redes baseadas em matrizes também seria um artigo muito interessante e ajudaria muitos programadores que não têm conhecimento de matemática).
De qualquer forma, eu o coloquei no tópico que um moderador tem para relatar problemas de documentação.
(fora do tópico: você pode usar este TanH, é mais rápido e correto, eu acho)
Você quer dizer como um "substituto"?
Por exemplo, um nó recebe um erro em sua saída, e você conhece a "flutuação" da saída, portanto, se você "mudá-la" para uma ativação mais simples e derivá-la, ela funcionará?
Então, em teoria, seria como "regularizar" a saída, mas sem fazer isso e apenas multiplicar pela derivada da regularização antes da derivada da ativação?
Por exemplo:
Um administrador respondeu ao tópico dos moderadores sobre isso. Talvez seja de seu interesse
Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação
Erros, padrões ou inconsistências na documentação do mql5.
Rashid Umarov, 2023.04.18 11:36
Será aprimorado assim que possível. Por enquanto, você pode usar este arquivo de inclusão como referência.
@Stanislav Korotky
Seus esforços para colocar o conceito de rede neural na MQL são muito apreciados. Esse é realmente um excelente trabalho para iniciantes como eu. Parabéns :)
Obrigado por atualizar o arquivo com o bug corrigido. No entanto, eu sugeriria substituir o arquivo na área de download.
Felizmente, eu li a discussão sobre o tópico e descobri que há um erro no arquivo. E agora que estava tentando procurar a correção, encontrei este link de arquivo aqui.
Espero que haja apenas esses lugares para a correção do bug, nas linhas 490-493, 500, 515-527, com a marcação //*. Se estiver em outro lugar, mencione os números das linhas ou marque //*BugFix ...
Atenciosamente