English Русский 中文 Español 日本語 Português 한국어 Français Italiano Türkçe
preview
Matrizen und Vektoren in MQL5: Die Aktivierungsfunktionen

Matrizen und Vektoren in MQL5: Die Aktivierungsfunktionen

MetaTrader 5Beispiele | 10 Juli 2023, 10:01
184 0
MetaQuotes
MetaQuotes

Einführung

Zum Thema Training neuronaler Netze ist bereits eine Vielzahl von Büchern und Artikeln veröffentlicht worden. Die Mitglieder von MQL5.com haben auch eine Menge Material veröffentlicht, darunter mehrere Artikelserien.

Hier wird nur einer der Aspekte des maschinellen Lernens beschrieben — die Aktivierungsfunktionen. Wir werden uns mit den inneren Abläufen des Prozesses befassen.


Kurzer Überblick

In künstlichen neuronalen Netzen berechnet eine Neuronenaktivierungsfunktion einen Ausgangssignalwert auf der Grundlage der Werte eines Eingangssignals oder eines Satzes von Eingangssignalen. Die Aktivierungsfunktion muss auf der gesamten Menge der Werte differenzierbar sein. Diese Bedingung bietet die Möglichkeit der Backpropagation von Fehlern beim Training neuronaler Netze. Um den Fehler rückwärts zu propagieren, muss der Gradient der Aktivierungsfunktion berechnet werden — der Vektor der partiellen Ableitungen der Aktivierungsfunktion für jeden Wert des Eingangssignalvektors. Es wird davon ausgegangen, dass sich nichtlineare Aktivierungsfunktionen besser für das Training eignen. Obwohl sich die vollständig lineare ReLU-Funktion in vielen Modellen bewährt hat.


Illustrationen

Die Graphen der Aktivierungsfunktion und ihrer Ableitungen wurden zur Veranschaulichung in einer monoton ansteigenden Folge von -5 bis 5 erstellt. Das Skript, das den Funktionsgraphen auf dem Preisdiagramm anzeigt, wurde ebenfalls entwickelt. Das Dialogfeld zum Öffnen der Datei wird angezeigt, in dem Sie den Namen des gespeicherten Bildes angeben können, indem Sie die Bild-herunter-Taste drücken.

Speichern der png-Datei


Mit der ESC-Taste wird das Skript beendet. Das Skript selbst ist unten beigefügt. Ein ähnliches Skript wurde vom Autor des Artikels Backpropagation von Neuronalen Netze mit MQL5-Matrizen geschrieben. Wir haben seine Idee aufgegriffen, um den Graphen der Werte der entsprechenden Ableitungen der Aktivierungsfunktion zusammen mit dem Graphen der Aktivierungsfunktion selbst anzuzeigen.

Demo-Skript mit allen Aktivierungsfunktionen

Die Aktivierungsfunktion ist blau dargestellt, während die Ableitungen der Funktion rot angezeigt werden.



Exponential Linear Unit (ELU) Aktivierungsfunktion

Berechnung der Funktion

   if(x >= 0)
      f = x;
   else
      f = alpha*(exp(x) - 1);

Berechnung der Ableitung

   if(x >= 0)
      d = 1;
   else
      d = alpha*exp(x);

Diese Funktion hat einen zusätzlichen 'alpha'-Parameter. Wird er nicht angegeben, ist sein (Standard-) Wert 1.

   vector_a.Activation(vector_c,AF_ELU);      // call with the default parameter

ELU-Aktivierungsfunktion

   vector_a.Activation(vector_c,AF_ELU,3.0);  // call with alpha=3.0

ELU-Aktivierungsfunktion mit dem Parameter alpha=3.0


Exponentiale Aktivierungsfunktion

Berechnung der Funktion

   f = exp(x);

Die gleiche exp-Funktion dient als Ableitung der exp-Funktion.

Wie wir in der Berechnungsgleichung sehen können, hat die Exponentialaktivierungsfunktion keine zusätzlichen Parameter

vector_a.Activation(vector_c,AF_EXP);

Exponentiale Aktivierungsfunktion


Die Aktivierungsfunktion Gaussian Error Linear Unit (GELU)

Berechnung der Funktion

   f = 0.5*x*(1 + tanh(sqrt(M_2_PI)*(x+0.044715*pow(x,3)));

Berechnung der Ableitung

   double x_3 = pow(x,3);
   double tmp = cosh(0.0356074*x + 0.797885*x);
   d = 0.5*tanh(0.0356774*x_3 + 0.398942*x)+(0.535161*x_3 + 0.398942*x)/(tmp*tmp) + 0.5;

Keine zusätzlichen Parameter.

vector_a.Activation(vector_c,AF_GELU);

GELU-Aktivierungsfunktion


Harte Sigmoid-Aktivierungsfunktion

Berechnung der Funktion

   if(x < -2.5)
      f = 0;
   else
     {
      if(x > 2.5)
         f = 1;
      else
         f = 0.2*x + 0.5;
     }

Berechnung der Ableitung

   if(x < -2.5)
      d = 0;
   else
     {
      if(x > 2.5)
         d = 0;
      else
         d = 0.2;
     }

Keine zusätzlichen Parameter.

vector_a.Activation(vector_c,AF_HARD_SIGMOID);

Harte Sigmoid-Aktivierungsfunktion


Lineare Aktivierungsfunktion

Berechnung der Funktion

   f = alpha*x + beta

Berechnung der Ableitung

   d = alpha

Zusätzliche Parameter alpha = 1,0 und beta = 0,0

vector_a.Activation(vector_c,AF_LINEAR);         // call with default parameters

Lineare Aktivierungsfunktion

vector_a.Activation(vector_c,AF_LINEAR,2.0,5.0);  // call with alpha=2.0 and beta=5.0

Lineare Aktivierungsfunktion, alpha=2, beta=5


Die Aktivierungsfunktion Leaky Rectified Linear Unit (LReLU)

Berechnung der Funktion

   if(x >= 0)
      f = x;
   else
      f = alpha * x;

Berechnung der Ableitung

   if(x >= 0)
      d = 1;
   else
      d = alpha;

Diese Funktion hat einen zusätzlichen 'alpha'-Parameter. Wird er nicht angegeben, so ist der Standardwert 0. 3

   vector_a.Activation(vector_c,AF_LRELU);      // call with the default parameter

LReLU-Aktivierungsfunktion

vector_a.Activation(vector_c,AF_LRELU,0.1);  // call with alpha=0.1

LReLU-Aktivierungsfunktion mit alpha=0,1


Rectified Linear Unit (ReLU) Aktivierungsfunktion

Berechnung der Funktion

   if(alpha==0)
     {
      if(x > 0)
         f = x;
      else
         f = 0;
     }
   else
     {
      if(x >= max_value)
         f = x;
      else
         f = alpha * (x - treshold);
     }

Berechnung der Ableitung

   if(alpha==0)
     {
      if(x > 0)
         d = 1;
      else
         d = 0;
     }
   else
     {
      if(x >= max_value)
         d = 1;
      else
         d = alpha;
     }

Zusätzliche Parameter alpha=0, max_value=0 und treshold=0.

vector_a.Activation(vector_c,AF_RELU);         // call with default parameters

ReLU-Aktivierungsfunktion

vector_a.Activation(vector_c,AF_RELU,2.0,0.5);      // call with alpha=2.0 and max_value=0.5

ReLU-Aktivierungsfunktion, alpha=2, max_value=0.5

vector_a.Activation(vector_c,AF_RELU,2.0,0.5,1.0);  // call with alpha=2.0, max_value=0.5 and treshold=1.0

ReLU-Aktivierungsfunktion, alpha=2, max_value=0.5, treshold=1


Skalierte Exponential-Linear-Einheit (SELU) Aktivierungsfunktion

Berechnung der Funktion

   if(x >= 0)
      f = scale * x;
   else
      f = scale * alpha * (exp(x) - 1);

where scale = 1.05070098, alpha = 1.67326324

Berechnung der Ableitung

   if(x >= 0)
      d = scale;
   else
      d = scale * alpha * exp(x);

Keine zusätzlichen Parameter.

vector_a.Activation(vector_c,AF_SELU);

SELU-Aktivierungsfunktion


Die Aktivierungsfunktion Sigmoid

Berechnung der Funktion

   f = 1 / (1 + exp(-x));

Berechnung der Ableitung

   d = exp(x) / pow(exp(x) + 1, 2);

Keine zusätzlichen Parameter.

vector_a.Activation(vector_c,AF_SIGMOID);

Sigmoid-Aktivierungsfunktion



Die Aktivierungsfunktion Softplus

Berechnung der Funktion

   f = log(exp(x) + 1);

Berechnung der Ableitung

   d = exp(x) / (exp(x) + 1);

Keine zusätzlichen Parameter.

vector_a.Activation(vector_c,AF_SOFTPLUS);

Softplus-Aktivierungsfunktion


Die Aktivierungsfunktion Softsign

Berechnung der Funktion

   f = x / (|x| + 1)

Berechnung der Ableitung

   d = 1 / (|x| + 1)^2

Keine zusätzlichen Parameter.

vector_a.Activation(vector_c,AF_SOFTSIGN);

Softsign Aktivierungsfunktion


Die Aktivierungsfunktion Swish

Berechnung der Funktion

   f = x / (1 + exp(-x*beta));

Berechnung der Ableitung

   double tmp = exp(beta*x);
   d = tmp*(beta*x + tmp + 1) / pow(tmp+1, 2);

Zusätzlicher Parameter beta = 1

vector_a.Activation(vector_c,AF_SWISH);         // call with the default parameter

Swish-Aktivierungsfunktion

vector_a.Activation(vector_c,AF_SWISH,2.0);     // call with beta = 2.0

Swish-Aktivierungsfunktion, beta=2

vector_a.Activation(vector_c,AF_SWISH,0.5);   // call with beta=0.5

Swish-Aktivierungsfunktion, beta=0,5


Die Aktivierungsfunktion Tangens Hyperbolicus(TanH)

Berechnung der Funktion

   f = tanh(x);

Berechnung der Ableitung

   d = 1 / pow(cosh(x),2);

Keine zusätzlichen Parameter.

vector_a.Activation(vector_c,AF_TANH);

TanH-Aktivierungsfunktion


Die Aktivierungsfunktion Thresholded Rectifiedl Linear Unit (TReLU)

Berechnung der Funktion

   if(x > theta)
      f = x;
   else
      f = 0;

Berechnung der Ableitung

   if(x > theta)
      d = 1;
   else
      d = 0;

Zusätzlicher Parameter theta = 1

vector_a.Activation(vector_c,AF_TRELU);         // call with default parameter

TReLU-Aktivierungsfunktion

vector_a.Activation(vector_c,AF_TRELU,0.0);     // call with theta = 0.0

TReLU-Aktivierungsfunktion, theta=0

vector_a.Activation(vector_c,AF_TRELU,2.0);      // call with theta = 2.0

TReLU-Aktivierungsfunktion, theta=2


Die Aktivierungsfunktion Parametric Rectified Linear Unit (PReLU)

Berechnung der Funktion

   if(x[i] >= 0)
      f[i] = x[i];
   else
      f[i] = alpha[i]*x[i];

Berechnung der Ableitung

   if(x[i] >= 0)
      d[i] = 1;
   else
      d[i] = alpha[i];

Zusätzlicher Parameter — Koeffizientenvektor „alpha“.

vector alpha=vector::Full(vector_a.Size(),0.1);
vector_a.Activation(vector_c,AF_PRELU,alpha);

PReLU-Aktivierungsfunktion


Die spezielle Softmax-Funktion

Das Ergebnis der Berechnung der Softmax-Aktivierungsfunktion hängt nicht nur von einem bestimmten Wert ab, sondern auch von allen Vektorwerten.

   sum_exp = Sum(exp(vector_a))
   f = exp(x) / sum_exp

Berechnung der Ableitung

   d = f*(1 - f)

Die Summe aller aktivierten Vektorwerte ist also 1. Daher wird die Softmax-Aktivierungsfunktion sehr häufig für die letzte Schicht von Klassifikationsmodellen verwendet.

Graph der Vektoraktivierungsfunktion mit Werten von -5 bis 5

Softmax-Aktivierungsfunktion

Graph der Vektoraktivierungsfunktion mit Werten von -1 bis 1

Softmax-Aktivierungsfunktion


Wenn es keine Aktivierungsfunktion gibt (AF_NONE)

Wenn es keine Aktivierungsfunktion gibt, werden die Werte aus dem Eingangsvektor ohne jegliche Transformation in den Ausgangsvektor übertragen. Es handelt sich um die lineare Aktivierungsfunktion mit Alpha = 1 und Beta = 0.


Schlussfolgerung

Machen Sie sich mit den Quellcodes der Aktivierungsfunktionen und Ableitungen in der unten angehängten Datei ActivationFunction.mqh vertraut.


Übersetzt aus dem Russischen von MetaQuotes Ltd.
Originalartikel: https://www.mql5.com/ru/articles/12627

Integration von ML-Modellen mit dem Strategy Tester (Teil 3): Verwaltung von CSV-Dateien (II) Integration von ML-Modellen mit dem Strategy Tester (Teil 3): Verwaltung von CSV-Dateien (II)
Dieses Material bietet eine vollständige Anleitung zur Erstellung einer Klasse in MQL5 für die effiziente Verwaltung von CSV-Dateien. Wir werden die Implementierung von Methoden zum Öffnen, Schreiben, Lesen und Umwandeln von Daten sehen. Wir werden auch überlegen, wie wir sie zum Speichern und Abrufen von Informationen nutzen können. Darüber hinaus werden wir die Grenzen und die wichtigsten Aspekte bei der Verwendung einer solchen Klasse erörtern. Dieser Artikel kann eine wertvolle Ressource für diejenigen sein, die lernen wollen, wie man CSV-Dateien in MQL5 verarbeitet.
MQL5 Wizard-Techniken, die Sie kennen sollten (Teil 06): Fourier-Transformation MQL5 Wizard-Techniken, die Sie kennen sollten (Teil 06): Fourier-Transformation
Die von Joseph Fourier eingeführte Fourier-Transformation ist ein Mittel zur Zerlegung komplexer Wellen aus Datenpunkten in einfache Teilwellen. Diese Funktion könnte für Händler sehr nützlich sein, und dieser Artikel wirft einen Blick darauf.
Automatisierter Raster-Handel mit Stop-Pending-Aufträge an der Moscow Exchange (MOEX) Automatisierter Raster-Handel mit Stop-Pending-Aufträge an der Moscow Exchange (MOEX)
Der Artikel befasst sich mit dem Ansatz des Raster-Handels (Grid-Trading), der auf Stop-Pending-Aufträge basiert und in einem MQL5 Expert Advisor an der Moscow Exchange (MOEX) implementiert wurde. Eine der einfachsten Strategien beim Handel am Markt ist eine Reihe von Aufträgen, die darauf abzielen, den Marktpreis zu „fangen“.
Erstellen eines EA, der automatisch funktioniert (Teil 15): Automatisierung (VII) Erstellen eines EA, der automatisch funktioniert (Teil 15): Automatisierung (VII)
Zum Abschluss dieser Artikelserie über Automatisierung werden wir das Thema des vorangegangenen Artikels weiter erörtern. Wir werden sehen, wie alles zusammenpassen wird, damit der EA wie ein Uhrwerk läuft.