"New Neural" ist ein Open-Source-Projekt für neuronale Netzwerke für die MetaTrader 5-Plattform. - Seite 39

 

Sollen wir radiale Grundlagennetze aufbauen?

sie haben einen starken Fehler, sie lernen zwar schnell, aber sie sagen unbekannte Daten schlecht voraus.

 
Urain:

u - Aktivator-Eingang

y - zusätzlicher Leistungsfaktor.

Wo immer es einen Exponenten gibt, sollten Sie die Berechnung von Exponenten positiver Zahlen vermeiden, um zu vermeiden, dass Sie große Zahlen erhalten, die 32 Bit überschreiten. Zur Berechnung von Sigma ist es zum Beispiel besser, wie folgt vorzugehen

double x = -y*u;

double e=exp(-|x|);

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

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

Diese Formeln sind recht einfach abgeleitet. Ist das Argument des Exponenten negativ, bleibt die Formel unverändert. Wenn sie positiv ist, werden Zähler und Nenner mit dem Exponenten des gleichen Arguments multipliziert, allerdings mit negativem Vorzeichen.

 
Vinin:

Sie sind derjenige mit dem djvu-Viewer . Ich habe alle meine Bücher lesbar.
 
gpwr:

Wo immer es einen Exponenten gibt, sollten Sie die Berechnung von Exponenten positiver Zahlen vermeiden, um zu vermeiden, dass Sie große Zahlen erhalten, die 32 Bit überschreiten. Zum Beispiel ist die Berechnung von Sigma auf diese Weise besser

double x = -y*u;

double e=exp(-|x|);

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

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

Diese Formeln sind recht einfach abgeleitet. Ist das Argument des Exponenten negativ, bleibt die Formel unverändert. Ist er positiv, multipliziert man Zähler und Nenner mit dem Exponenten desselben Arguments, aber mit negativem Vorzeichen.

Seltsamerweise funktioniert das Sigmoid selbst bei großen negativen Eingaben korrekt, aber die Hypertangens-Funktion versagt, also habe ich zusätzlich zu den klassischen Algorithmen eine Sigmoid-Verschiebung hinzugefügt. Die Funktion arbeitet im gleichen Grenzwert wie der Hypertangens, ist aber schneller und hat keine #IND-Probleme.

Ebenso erreicht der Hypertangens bei der Anpassung des Anstellwinkels (für kleine Werte des Koeffizienten y) nicht -1;1, das verschobene Sigmoid hat solche Probleme nicht.

Im Allgemeinen, die Hypertangens abschließen will, aber ich denke, die Funktion ist nicht vielversprechend, nicht nur, dass ich das Ergebnis zu speichern, weil der Exponent zweimal verwendet wird, so müssen noch Kontrollen, plus Probleme mit dem Scheitern, die Grenzen zu erreichen, wenn die Anpassung der Angriff.

Ich bin zu dem Schluss gekommen, dass der Hypertangens ein No-Go ist und das verschobene Sigmoid die Regel ist.

 
Urain:

Ich bin zu dem Schluss gekommen, dass der Hypertangens ein No-Go ist und das verschobene Sigmoid die Regel ist.

sekundiert.
 
joo:
sekundiert.

Es ist möglich, eine einfachere Implementierung von Sigmoid in der [-1;1]-Grenze vorzunehmen

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

aber diese Implementierung hat auch ein Problem mit #IND, daher ist es besser, ein paar einfache Operationen hinzuzufügen, als zahlreiche Prüfungen zu schreiben

hier addieren wir + - / , also 3 zusätzliche Operationen gegenüber einer Menge von Prüfungen

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.);
  }

Dies ist die beste Option, sowohl in Bezug auf den Arbeitsbereich [-1;1] als auch auf die Arbeitsgeschwindigkeit. Der Definitionsbereich ist die gesamte numerische Zeile.

Dies ist genau die Aktivierungsfunktion, die ich in letzter Zeit verwendet habe, nachdem ich viele Alternativen ausprobiert und ihre Ausführungsgeschwindigkeit getestet habe.

 

Und das hier ist mein Favorit im Echo-Raster:

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 
        }
};
 

Im Übrigen.

Es wird eine sigmoidale Funktion benötigt.

Die Anforderungen sind eine Normalform der Funktion selbst und ihrer Ableitung (nicht allzu schwer zu berechnen) und eine Normalform der Umkehrfunktion und ihrer Ableitung.