O "New Neural" é um projecto de motor de rede neural Open Source para a plataforma MetaTrader 5. - página 39

 

Vamos construir redes de base radial?

eles têm um bug forte, enquanto aprendem rapidamente, eles predizem mal com dados desconhecidos.

 
Urain:

u - entrada do ativador

y - fator de potência adicional.

Onde quer que haja um expoente, você deve evitar calcular expoentes de números positivos para evitar obter números grandes que excedam 32 bits. Por exemplo, para calcular a sigma, é melhor fazer o seguinte

duplo x = -y*u;

double e=exp(-|x|);

if(x<=0) retorno(1./(1.+e))

if(x>0)return(e/(1.+e));

Estas fórmulas são derivadas de forma bastante simples. Se o argumento do expoente for negativo, deixamos a fórmula inalterada. Se positivo, multiplicamos o numerador e denominador pelo expoente do mesmo argumento, mas com um sinal negativo.

 
Vinin:

Tu é que estás com o visualizador djvu . Eu tenho todos os meus livros legíveis.
 
gpwr:

Onde quer que haja um expoente, você deve evitar calcular expoentes de números positivos para evitar obter números grandes que excedam 32 bits. Por exemplo, o cálculo do sigma é melhor desta forma

duplo x = -y*u;

double e=exp(-|x|);

if(x<=0) retorno(1./(1.+e))

if(x>0)return(e/(1.+e));

Estas fórmulas são derivadas de forma bastante simples. Se o argumento do expoente for negativo, deixamos a fórmula inalterada. Se for positivo, multiplicamos o numerador e denominador pelo expoente do mesmo argumento, mas com um sinal negativo.

Estranhamente, o próprio sigmóide funciona corretamente mesmo com grandes entradas negativas, mas a função hipertangente falha, então eu adicionei um deslocamento sigmóide além dos algoritmos clássicos. A função funciona no mesmo limite que o hipertangente, mas é mais rápida e não tem problemas #IND.

Da mesma forma, com ajuste do ângulo de ataque (para pequenos valores de coeficiente y) o hipertangente não atinge -1;1, o sigmóide deslocado não tem tais problemas.

Em geral quem quer finalizar o hipertangente, mas acho que a função é pouco promissora, não só que tenho que salvar o resultado porque o expoente é usado duas vezes, então ainda preciso de verificações, além de problemas com o não alcance dos limites ao ajustar o ataque.

A minha conclusão é que o hipertangente é um não, as regras do sigmóide deslocado.

 
Urain:

A minha conclusão é que o hipertangente é um não, as regras do sigmóide deslocado.

destacado.
 
Joo:
destacado.

É possível fazer uma implementação mais simples do sigmoid no limite [-1;1].

double sigma(double u,double y=1.)// [-1;1]
  {   
   return(exp(-y*u));
  }

mas esta implementação também tem um problema com o #IND, por isso é melhor adicionar um par de operações simples do que passar inúmeros cheques

aqui adicionamos + - / , então 3 operações extras vs. muitos cheques

double sigmah(double u,double y=1.)// [-1;1] сдвинутый сигмоид
  {
   return((2./(1.+exp(-y*u)))-1.);
  }
 
Urain:
double sigmah(double u,double y=1.)// [-1;1] сдвинутый сигмоид
  {
   return((2./(1.+exp(-y*u)))-1.);
  }

Esta é a melhor opção, tanto em termos de facilidade de trabalho [-1;1] como de velocidade de operação. A área de definição é toda a linha numérica.

Esta é exatamente a função de ativação que tenho usado ultimamente, tendo experimentado muitas alternativas e testado sua velocidade de execução.

 

E eu tenho esta como a minha favorita na grelha de eco:

class RSDNFunction
{
public:
        static const NeuronType Type = ETYPE_RSDN;
public:
        double F(double x)
        {
                // coeffs were added to adjust this function to bisigmoid for values from -5 to 5
                return 5*x/(5*sqrt(abs(5*x) ) + 5);
        }

        double dF(double x)
        {
                double root = sqrt(5*abs(5*x) ) + 1;

                return (root + 1)/(2*root*root); // derived function 
        }
};
 

A propósito.

É necessária uma função sigmóide.

Os requisitos são uma forma normal da própria função e da sua derivada (não muito difícil de calcular) e uma forma normal da função inversa e da sua derivada.