"New Neural" es un proyecto de motor de red neuronal de código abierto para la plataforma MetaTrader 5. - página 39

 

¿Construimos redes de base radial?

tienen un fuerte error, mientras que aprenden rápidamente, predicen mal en datos desconocidos.

 
Urain:

u - entrada del activador

y - factor de potencia adicional.

Siempre que haya un exponente, se debe evitar calcular exponentes de números positivos para evitar obtener números grandes que superen los 32 bits. Por ejemplo, para calcular sigma es mejor hacer lo siguiente

doble x = -y*u;

doble e=exp(-|x|);

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

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

Estas fórmulas se derivan de manera muy sencilla. Si el argumento del exponente es negativo, dejamos la fórmula sin modificar. Si es positivo, multiplicamos el numerador y el denominador por el exponente del mismo argumento, pero con signo negativo.

 
Vinin:

Tú eres el que tiene el visor de djvu . Tengo todos mis libros legibles.
 
gpwr:

Siempre que haya un exponente, se debe evitar calcular exponentes de números positivos para evitar obtener números grandes que superen los 32 bits. Por ejemplo, el cálculo de sigma es mejor de esta manera

doble x = -y*u;

doble e=exp(-|x|);

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

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

Estas fórmulas se derivan de manera muy sencilla. Si el argumento del exponente es negativo, dejamos la fórmula sin modificar. Si es positivo, multiplicamos el numerador y el denominador por el exponente del mismo argumento, pero con signo negativo.

Curiosamente el sigmoide en sí mismo funciona correctamente incluso con grandes entradas negativas, pero la función hipertangente falla, así que he añadido un desplazamiento sigmoide además de los algoritmos clásicos. La función funciona en el mismo límite que la hipertangente, pero es más rápida y no tiene problemas de #IND.

Del mismo modo, con el ajuste del ángulo de ataque (para valores pequeños del coeficiente y) la hipertangente no llega a -1;1, la sigmoide desplazada no tiene esos problemas.

En general, que quiere finalizar hipertangente, pero creo que la función es poco prometedor, no sólo que tengo que guardar el resultado debido a que el exponente se utiliza dos veces, por lo que todavía necesita controles, además de los problemas con el fracaso para llegar a los límites cuando se ajusta el ataque.

Mi conclusión es que la hipertangente no sirve, la sigmoide desplazada manda.

 
Urain:

Mi conclusión es que la hipertangente no sirve, la sigmoide desplazada manda.

...secundado.
 
joo:
...secundado.

Es posible realizar una implementación más sencilla de la sigmoidea en el límite [-1;1]

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

pero esta implementación también tiene un problema con #IND, así que es mejor añadir un par de operaciones sencillas que escribir numerosas comprobaciones

aquí añadimos + - / , así que 3 operaciones extra frente a un montón de comprobaciones

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 es la mejor opción, tanto por la facilidad del rango de trabajo [-1;1] como por la rapidez de la operación. El área de definición es toda la línea numérica.

Esta es exactamente la función de activación que he estado utilizando últimamente, después de haber probado muchas alternativas y comprobar su velocidad de ejecución.

 

Y tengo este como mi favorito en la parrilla 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 
        }
};
 

Por cierto.

Se necesita una función sigmoidea.

Los requisitos son una forma normal de la propia función y su derivada (no muy difícil de calcular) y una forma normal de la función inversa y su derivada.