Diskussion zum Artikel "Tiefe neuronale Netzwerke (Teil IV). Erstellen, trainieren und testen eines Modells des neuronalen Netzes" - Seite 2

 
SplitData() - Aufteilung der Ausgangsmenge dt[] in Teilmengen pretrain, train, val, test im Verhältnis 2000/1000/500/500/500

Etwas subtiles Lernen mit dem Lehrer auf einer sehr kleinen Menge passiert - nur 1000 Beispiele (25% der Gesamtmenge)

Haben Sie nicht die Qualität des Lernens auf diesen 1000 und auf 3000 (pretrain + train) verglichen? Ist der Unterschied wirklich so gering?

 
Ich verstehe, dass überall dort, wo Geld im Spiel ist (und insbesondere leicht verdientes Geld), Krieg und Ausbeutung zu erwarten sind.
 
elibrarius:

Es findet ein subtiles Lernen mit dem Lehrer an einer sehr kleinen Menge statt - nur 1000 Beispiele (25% der Gesamtmenge).

Haben Sie nicht die Qualität des Unterrichts an diesen 1000 Beispielen und an 3000 Beispielen (Pretrain + Train) verglichen? Ist der Unterschied wirklich so gering?

Ich habe es genau dann gesendet, als der Server neu gestartet wurde, nehme ich an.

Ein Vorteil der Verwendung von Pretrain ist, dass man für ein feinkörniges Training viel weniger Beispiele, Trainingsepochen und Trainingsstufen benötigt. Für das Pre-Training hingegen sind mehr Beispiele wünschenswert. Meiner Erfahrung nach sind 1500-2000 Beispiele für das Pre-Training völlig ausreichend. Beim Pre-Training werden die DNN-Gewichte in den Bereich der optimalen Lösungen gebracht. Sie müssen nur noch feinjustiert werden. Eine Erhöhung dieser Gewichte führt zu einer Verschlechterung der Qualität.

Sie können dies jedoch experimentell überprüfen.

 

Guten Tag, meine Herren Trader + Programmierer + Mathematiker...

An den Autor - danke für den Artikel, er ist gut erklärt, sogar verständlich.... )

Vladimir, ich habe eine Frage aus persönlichen Vorurteilen, bitte antworten Sie, wenn möglich:


GRENZEN DER PROBLEMLÖSUNG:

1. training: Suche und Auswahl in DB2* der gefundenen Wiederholungen der Vorlage* in DB1*. Die Anzahl der Wiederholungen und die zulässige Abweichung werden das Vertrauen in die Hypothese* vollständig charakterisieren. Die erstellte DB2 mit Wiederholungen wird viel kleiner sein als die DB1 für die interessierenden FIs* und daher weniger Energie verbrauchen. Durch die Umwandlung der Anführungszeichen verschiedener FI* in eine einzige Typgröße können wir die gefundenen Wiederholungen aus verschiedenen FI* in einem (vereinheitlichenden) DB1 speichern - was es uns ermöglicht, eine größere Anzahl von Wiederholungsvorlagen* zu erhalten.

2 Analyse: Wenn ein neuer Punkt in den Daten* auftaucht, und dementsprechend ein neues Muster* -

2.1. sofort eine neue Suche in DB2 durchführen - was eine schnelle Suche ermöglicht, die gefundenen Daten in DB3* speichern und DB2* entsprechend aktualisieren

2.2. während der Ausfallzeit eine neue Suche in DB1 durchführen - dies ermöglicht eine genaue, aber langsame Suche, speichert die gefundenen Daten in DB3* und aktualisiert DB2* entsprechend

2.3. auf der Grundlage der Änderungen in DB3* zu überprüfen (entsprechend der Handelsstrategie) und gegebenenfalls die Handelsposition zu ändern


Entschlüsselung von Abkürzungen:

DB1 - Datenbank / Historie der Kurse aller FIs* :

1) in Form einer Kette von Punkten*, die durch eine lange Historie begrenzt ist, von der aber Gruppen von 20 Punkten analysiert werden, nach der Analyse dieser Gruppe machen wir eine Verschiebung um einen Punkt und wiederholen die Analyse.

2) als Liste von Schablonen*

DB2 - Datenbank mit sich wiederholenden Templates*, die entweder vollständig oder teilweise identisch sind (eine beliebige Anzahl von Variablen eines Templates* wird verworfen).

DB3 - Datenbank mit Schablonen*, die ganz oder teilweise (mit Abweichungen auf das angegebene Niveau in den Koordinaten der Schablonen*-Punkte*) mit der letzten Schablone identisch sind, d.h. jetzt aktuell sind.

FI* - Finanzinstrumente (EURUSD, GBPUSD, _SPX500, ...), jedes Finanzinstrument wird in einer eigenen Datei gespeichert

Point* - besteht aus Preis, Datum, Volumen, die wiederum entsprechen können: Bar Close / Fractal / etc.

Vorlage* - eine Gruppe von 20 Punkten*

Hypothese* - das Ergebnis des FI*-Analysesystems (als Variante - neuronales Netz).


FRAGE ZUR AUFGABE:

Kann die vorliegende Aufgabe mit Hilfe eines neuronalen Netzes gelöst werden, und wenn ja, welche Methode ist dann für das Training des neuronalen Netzes am besten geeignet und warum?

Lassen Sie mich die Frage präzisieren: Ist es möglich, ein neuronales Netz zu trainieren, indem man eine große Anzahl von Vorlagen* einspeist (ein Teil der Vorlage enthält Orientierungspunkte für die Identitätsbestimmung und der zweite Teil enthält eine Hypothese*). Falls die Antwort "ja" lautet, welche Art von neuronalem Netz kann dafür verwendet werden, und haben Sie bereits fertige Implementierungen dieser Art gefunden?


Soweit ich weiß, sind die von Ihnen vorgeschlagenen Varianten dafür nicht geeignet.


Ich habe die Aufgabe etwas verkürzt geschrieben - ich wollte nicht auf Feinheiten eingehen, sondern eine Antwort auf die Frage bekommen.

Für mich selbst kann ich das Offensichtliche sagen - neuronale Netze reizen mich, aber ich habe es noch nicht geschafft, in sie einzutauchen.


Mit freundlichen Grüßen,

Wladimir

 
Владимир:

Guten Tag, meine Herren Trader + Programmierer + Mathematiker...

An den Autor - danke für den Artikel, er ist gut erklärt, sogar verständlich.... )

Vladimir, ich habe eine Frage aus persönlichen Vorurteilen, bitte antworten Sie, wenn möglich:


GRENZEN DER PROBLEMLÖSUNG:

1. training: Suche und Auswahl in DB2* der gefundenen Wiederholungen der Vorlage* in DB1*. Die Anzahl der Wiederholungen und die zulässige Abweichung werden das Vertrauen in die Hypothese* vollständig charakterisieren. Die erstellte DB2 mit Wiederholungen wird viel kleiner sein als die DB1 für die interessierenden FIs* und daher weniger Energie verbrauchen. Durch die Umwandlung der Anführungszeichen verschiedener FI* in eine einzige Typgröße können wir die gefundenen Wiederholungen aus verschiedenen FI* in einem (vereinheitlichenden) DB1 speichern - was es uns ermöglicht, eine größere Anzahl von Wiederholungsvorlagen* zu erhalten.

2 Analyse: Wenn ein neuer Punkt in den Daten* auftaucht, und dementsprechend ein neues Muster* -

2.1. sofort eine neue Suche in DB2 durchführen - was eine schnelle Suche ermöglicht, die gefundenen Daten in DB3* speichern und DB2* entsprechend aktualisieren

2.2. während der Ausfallzeit eine neue Suche in DB1 durchführen - dies ermöglicht eine genaue, aber langsame Suche, speichert die gefundenen Daten in DB3* und aktualisiert DB2* entsprechend

2.3. auf der Grundlage der Änderungen in DB3* zu überprüfen (entsprechend der Handelsstrategie) und gegebenenfalls die Handelsposition zu ändern


Entschlüsselung von Abkürzungen:

DB1 - Datenbank / Historie der Kurse aller FIs* :

1) in Form einer Kette von Punkten*, die durch eine lange Historie begrenzt ist, von der aber Gruppen von 20 Punkten analysiert werden, nach der Analyse dieser Gruppe machen wir eine Verschiebung um einen Punkt und wiederholen die Analyse.

2) als Liste von Schablonen*

DB2 - Datenbank mit sich wiederholenden Templates*, die entweder vollständig oder teilweise identisch sind (eine beliebige Anzahl von Variablen eines Templates* wird verworfen).

DB3 - Datenbank mit Schablonen*, die ganz oder teilweise (mit Abweichungen auf das angegebene Niveau in den Koordinaten der Schablonen*-Punkte*) mit der letzten Schablone identisch sind, d.h. jetzt aktuell sind.

FI* - Finanzinstrumente (EURUSD, GBPUSD, _SPX500, ...), jedes Finanzinstrument wird in einer eigenen Datei gespeichert

Point* - besteht aus Preis, Datum, Volumen, die wiederum entsprechen können: Bar Close / Fractal / etc.

Vorlage* - eine Gruppe von 20 Punkten*

Hypothese* - das Ergebnis des FI*-Analysesystems (als Variante - neuronales Netz).


FRAGE ZUR AUFGABE:

Kann die vorliegende Aufgabe mit Hilfe eines neuronalen Netzes gelöst werden, und wenn ja, welche Methode ist dann für das Training des neuronalen Netzes am besten geeignet und warum?

Lassen Sie mich die Frage präzisieren: Ist es möglich, ein neuronales Netz zu trainieren, indem man eine große Anzahl von Vorlagen* einspeist (ein Teil der Vorlage enthält Orientierungspunkte für die Identitätsbestimmung und der zweite Teil enthält eine Hypothese*). Falls die Antwort "ja" lautet, welche Art von neuronalem Netz kann dafür verwendet werden, und haben Sie bereits fertige Implementierungen dieser Art gefunden?


Soweit ich weiß, sind die von Ihnen vorgeschlagenen Varianten dafür nicht geeignet.


Ich habe die Aufgabe etwas verkürzt geschrieben - ich wollte nicht auf Feinheiten eingehen, sondern eine Antwort auf die Frage bekommen.

Für mich selbst kann ich das Offensichtliche sagen - neuronale Netze reizen mich, aber ich habe es noch nicht geschafft, in sie einzutauchen.


Mit freundlichen Grüßen,

Vladimir

Guten Tag!

Für Aufgaben des Trainings und der Klassifizierung von Sequenzen unterschiedlicher Länge sollten Sie auf jeden Fall LSTM verwenden. Es gibt viele Varianten solcher neuronaler Netze. Alles hängt von der Art der Eingabedaten und den Klassifizierungszielen ab.

Jetzt ist es möglich, in R/MT4 alle Arten von neuronalen Netzen anzuwenden, die in TensorFlow/Keras/CNTK verfügbar sind.

Viel Erfolg

 
Vladimir Perervenko:

Nachmittags.

Für Aufgaben des Trainings und der Klassifizierung von Sequenzen unterschiedlicher Länge sollten Sie unbedingt LSTM verwenden. Es gibt viele Varianten solcher neuronaler Netze. Es hängt alles von der Art der Eingabedaten und den Klassifizierungszielen ab.

Jetzt ist es möglich, in R/MT4 alle Arten von neuronalen Netzen anzuwenden, die in TensorFlow/Keras/CNTK verfügbar sind.

Viel Glück


Viel Glück!

Die Antwort ist klar, danke.

Ich werde mich in diese Richtung bewegen.

Vladimir, was hältst du davon, deine Kräfte zu bündeln? Ich denke, gemeinsam können wir es schaffen...

Bei allem Respekt,

Vladimir

 
Владимир:

Sehr gut!

Die Antwort ist klar, danke.

Ich werde in diese Richtung gehen.

Vladimir, was hältst du davon, dich zu verbünden? Ich denke, wir können zusammen kämpfen...

Bei allem Respekt,

Vladimir

Das ist gut.

Wir können über eine gemeinsame Arbeit sprechen. Aber ich werde nach dem Ende dieser Artikelserie damit beginnen können, ich hoffe, dass ich es bis Ende des Monats schaffen werde.

Aber wir können schon jetzt mit den Vorbereitungen und Erläuterungen beginnen. Für eine effektive Arbeit ist es für mich wichtig, die Grundidee zu verstehen. Jetzt verstehe ich Ihre Idee nicht ganz. Können Sie sie in irgendeiner Weise visualisieren?

Viel Glück!

 

Hallo,

könnten Sie bitte erklären, warum für die verschiedenen NS-Ebenen unterschiedliche Parameter gewählt werden?

darch.unitFunction = c(" tanhUnit"," maxoutUnit", " softmaxUnit"),
darch.dropout = c(0.1,0.2,0.1),
darch.weightUpdateFunction = c("weightDecayWeightUpdate", "maxoutWeightUpdate","weightDecayWeightUpdate"),

1) nur um zu zeigen, dass es eine große Vielfalt in dem Paket gibt?

2) oder haben die angegebenen Kombinationen von Parametern einen Vorteil? (Aus Ihrer Erfahrung).

3) oder ist die Vielfalt prinzipiell sinnvoll? Und man sollte versuchen, verschiedene Parameter für verschiedene Schichten zu verwenden (nicht unbedingt genau die, die im Code angegeben sind).

 
elibrarius:

Hallo,

könnten Sie bitte erklären, warum für die verschiedenen NS-Ebenen unterschiedliche Parameter gewählt werden?

1) nur um zu zeigen, dass es eine große Vielfalt in dem Paket gibt?

2) oder haben die angegebenen Kombinationen von Parametern einen Vorteil? (Aus Ihrer Erfahrung).

3) oder ist die Vielfalt im Prinzip nützlich? Und wir sollten versuchen, verschiedene Parameter für verschiedene Schichten zu verwenden (nicht unbedingt genau die, die im Code angegeben sind).

Denn sie haben unterschiedliche Aktivierungsfunktionen.

Die Aktivierungsfunktion der ersten versteckten Schicht wird durch die Art der Eingabedaten bestimmt. Da wir Eingaben im Bereich +1/-1 haben, ist tanh am besten geeignet, aber es kann auch sigm oder maxout sein. Die zweite versteckte Schicht ist maxout. Die Ausgabe ist natürlich softmax.

Dropout aus Erfahrung. Verschiedene Schichten können und sollten im Prinzip verschiedene Parameter haben. Nicht alle Pakete bieten eine so breite Möglichkeit, Parameter zu variieren.

Die Wahl einer Kombination dieser Hyperparameter, um den niedrigsten Klassifikationsfehler zu erhalten, ist ein Optimierungsproblem (ein Beispiel wird im fünften Teil des Artikels behandelt).

Sie können also mit beliebigen Parametern experimentieren (natürlich nur, wenn sie für unsere Daten relevant sind).

Experimentieren Sie.

Viel Erfolg!

 

Hallo,
eine weitere Frage.
Warum ist das Training in 2 Stufen aufgeteilt:
1 Pretrain und dann nur die oberste DNN-Schicht
und
2 Feinlernen des gesamten Netzes?

Würden wir nicht das gleiche Ergebnis ohne die 2. Stufe erhalten, wenn wir die 1. Stufe auf
pretrain + fine learning des gesamten Netzwerks zur gleichen Zeit
erweitern (d.h. rbm.lastLayer = 0, bp.learnRate = 1, darch.trainLayers = T setzen)

Aktualisieren. Ich habe ein Experiment eingerichtet:(rot zeigt Änderungen im Code)

evalq({
  require(darch)
  require(dplyr)
  require(magrittr)
  Ln <- c(0, 16, 8, 0)
  nEp_0 <- 25
  #------------------
  par_0 <- list(
    layers = Ln,
    seed = 54321,
    logLevel = 5,
    # params RBM========================
    rbm.consecutive = F, # each RBM is trained one epoch at a time
    rbm.numEpochs = nEp_0,
    rbm.batchSize = 50,
    rbm.allData = TRUE,
    rbm.lastLayer = 0,
    rbm.learnRate = 0.3,
    rbm.unitFunction = "tanhUnitRbm",
    # params NN ========================
    darch.batchSize = 50,
    darch.numEpochs = nEp_0,
    darch.trainLayers = T,
    darch.unitFunction = c("tanhUnit","maxoutUnit", "softmaxUnit"),
    bp.learnRate = 1,
    bp.learnRateScale = 1,
    darch.weightDecay = 0.0002,
    darch.dither = F,
    darch.dropout = c(0.1,0.2,0.1),
    darch.fineTuneFunction = backpropagation, #rpropagation
    normalizeWeights = T,
    normalizeWeightsBound = 1,
    darch.weightUpdateFunction = c("weightDecayWeightUpdate",
                                   "maxoutWeightUpdate",
                                   "weightDecayWeightUpdate"),
    darch.dropout.oneMaskPerEpoch = T,
    darch.maxout.poolSize = 2,
    darch.maxout.unitFunction = "linearUnit")
  #---------------------------
 
  DNN_default <- darch(darch = NULL,
                       paramsList = par_0,
                       x = DTcut$pretrain$woe %>% as.data.frame(),
                       y = DTcut$pretrain$raw$Class %>% as.data.frame(),
                        xValid = DTcut$val$woe %>% as.data.frame(),
                        yValid = DTcut$val$raw$Class %>% as.data.frame()
  )
}, env)

erhalten:


INFO [2017-11-15 17:53:24] Classification error on Train set (best model): 29.1% (582/2000)
INFO [2017-11-15 17:53:24] Train set (best model) Cross Entropy error: 1.146
INFO [2017-11-15 17:53:25] Classification error on Validation set (best model): 30.54% (153/501)
INFO [2017-11-15 17:53:25] Validation set (best model) Cross Entropy error: 1.192
INFO [2017-11-15 17:53:25] Best model was found after epoch 8
INFO [2017-11-15 17:53:25] Final 0.632 validation Cross Entropy error: 1.175
INFO [2017-11-15 17:53:25] Final 0.632 validation classification error: 30.01%
INFO [2017-11-15 17:53:25] Fine-tuning finished after 4.4 secs

Sie haben nach dem zweiten Schritt.

INFO [2017-11-15 17:49:45] Classification error on Train set (best model): 32.57% (326/1001)
INFO [2017-11-15 17:49:45] Train set (best model) Cross Entropy error: 1.244
INFO [2017-11-15 17:49:45] Classification error on Validation set (best model): 30.74% (154/501)

D.h. der Fehler auf dem Validation Set ist der gleiche, nämlich 30%.

Vorher habe ich versucht mit

xValid = DTcut$train$woe %>% as.data.frame(),

yValid = DTcut$train$raw$Class %>% as.data.frame()

wie im Code von Schritt 1, und erhielt:

INFO [2017-11-15 17:48:58] Classification error on Train set (best model): 28.85% (577/2000)
INFO [2017-11-15 17:48:58] Train set (best model) Cross Entropy error: 1.153
INFO [2017-11-15 17:48:59] Classification error on Validation set (best model): 35.66% (357/1001)

Dachte, es sei unmöglich, einen Fehler von 30% mit einem Schritt zu erreichen, aber nach der Validierung mit dem Set aus Schritt 2 wurde es so gut wie Ihres.
Es ist möglich, dass nur das DTcut$val Set besser ist als das DTcut$train Set, deshalb hat es auch in meinem einen Schritt so gut abgeschnitten wie in Ihren 2 Schritten.