Diskussion zum Artikel "Neuronale Netze leicht gemacht" - Seite 3

 
Maxim Dmitrievsky:


Was sind die "5 Gründe" und was haben 4 Ebenen damit zu tun? Ich habe nachgeschaut, ein einfacher Entscheidungsbaum wird diese Frage beantworten. Der universelle Approximator ist der NS von 2 Schichten, der eine beliebige Anzahl von "Warum" beantworten kann :) Die anderen Schichten werden hauptsächlich für die Datenvorverarbeitung in komplexen Designs verwendet. Zum Beispiel, um ein Bild aus einer großen Anzahl von Pixeln zu komprimieren und es dann zu erkennen.


"The 5 whys" ist eine Technik zur Bestimmung der Kausalität Wikipedia. In dem Artikel wird beispielsweise beschrieben, wie ein neuronales Netz im Wesentlichen darauf ausgelegt ist, eine kausale Beziehung zwischen vergangenen Kursbewegungen und der zukünftigen Richtung der Kursbewegung zu finden.

 
Andrey Azatskiy:
nur das Eingangssignal muss auch in diesem Intervall liegen. Mit Eingangssignal meine ich genau das Eingangssignal für das Neuron, nicht für die zu diskutierende Funktion.

Theoretisch kann das Eingangssignal für das Neuron beliebig sein. Sein Einfluss wird durch einen Gewichtungskoeffizienten korrigiert. Wenn das Eingangssignal zu klein ist, aber einen bedeutenden Einfluss auf die Gesamtlösung hat, wird sein Gewichtskoeffizient im Lernprozess erhöht. Ist das Signal von großer Bedeutung, aber sein Einfluss auf das Ergebnis ist vernachlässigbar, wird sein Gewichtungskoeffizient bis auf "0" reduziert (Kommunikationsausfall zwischen Neuronen).

 
Dmitriy Gizlyk:

"The 5 whys" ist eine Technik zur Bestimmung der Kausalität Wikipedia. Der Artikel wird zum Beispiel als im Wesentlichen ein neuronales Netzwerk entwickelt, um eine kausale Beziehung zwischen vergangenen Preisbewegungen und die künftige Richtung der Preisbewegung zu finden gegeben.

Ich habe nur die Korrelation zwischen der Anzahl der Fragen und der Schichten nicht verstanden. Die Eingabe besteht aus einer Reihe von Attributen, von denen jedes (grob gesagt) beantwortet werden muss. Die Ausgabe ist ein zusammengefasstes Ergebnis. Eine versteckte Schicht kann ausreichen, nicht unbedingt 4. Es wird angenommen, dass ein NS mit 2 versteckten Schichten jede Funktion annähern kann. Dies nur zur Information.

 

Und um das Thema zu vertiefen, eine Frage zur Architektur des NS. Wovon hängt sie ab?

 
Maxim Dmitrievsky:

Ich habe nur den Zusammenhang zwischen der Anzahl der Fragen und den Ebenen nicht verstanden. Die Eingabe besteht aus einer Reihe von Attributen, von denen jedes (grob gesagt) beantwortet werden muss. Die Ausgabe ist ein zusammenfassendes Ergebnis. Eine versteckte Schicht kann ausreichen, nicht unbedingt 4. Es wird angenommen, dass ein NS mit 2 versteckten Schichten jede Funktion annähern kann. Dies nur zur Information.

Die "5 Why"-Technik basiert auf sequentiellen Fragen, wobei jede Frage den Grund für die vorhergehende Frage beantwortet. Wir sehen uns zum Beispiel einen Chart und einen Chart mit steigenden Kursen an und konstruieren Fragen (die Fragen werden abstrakt beantwortet, um die Technik zu erklären):
1. Wo soll gehandelt werden - Kaufen
2. Warum kaufen? - Weil es sich um einen Aufwärtstrend handelt
3. Warum ein steigender Trend? - Der MA50 steigt
4. Warum steigt der MA50? - Der durchschnittliche Schlusskurs von 50 Kerzen mit einer Verschiebung von 1 ist niedriger als der durchschnittliche Schlusskurs der letzten 50 Kerzen.

usw.
Da die Fragen aufeinander aufbauen und eine Ursache-Wirkungs-Beziehung aufweisen, erstellen wir Ebenen, um diese Beziehung zu beobachten. Wenn wir nur 2 Schichten verwenden, geht die Ursache-Wirkungs-Beziehung verloren, das neuronale Netz analysiert eine Reihe von unabhängigen Optionen und wählt die beste aus.

 
Denis Kirichenko:

Und um das Thema zu vertiefen, eine Frage zur Architektur des NS. Wovon hängt sie ab?

Von dem Verständnis des Architekten für den Prozess. Der Artikel stellt die einfachste Version eines neuronalen Netzes dar und geht nicht auf Faltungsstrukturen und andere Architekturen ein.

 
Dmitriy Gizlyk:

Die "5 Why"-Technik basiert auf aufeinander aufbauenden Fragen, wobei jede Frage den Grund für die vorangegangene Frage beantwortet. Wir betrachten zum Beispiel einen Chart und einen Chart mit steigenden Kursen und und konstruieren Fragen (die Fragen werden in der Zusammenfassung beantwortet, um die Technik zu erklären):
1. Wo soll gehandelt werden - Kaufen
2. Warum kaufen? - Weil es sich um einen Aufwärtstrend handelt
3. Warum ein steigender Trend? - Der MA50 steigt
4. Warum steigt der MA50? - Der durchschnittliche Schlusskurs von 50 Kerzen mit einer Verschiebung von 1 ist niedriger als der durchschnittliche Schlusskurs der letzten 50 Kerzen.

usw.
Da die Fragen aufeinander aufbauen und eine Ursache-Wirkungs-Beziehung aufweisen, erstellen wir Ebenen, um diese Beziehung zu beobachten. Wenn wir nur 2 Schichten verwenden, geht die Ursache-Wirkungs-Beziehung verloren, das neuronale Netz analysiert eine Reihe von unabhängigen Optionen und wählt die beste aus.

Es spielt keine Rolle, in welcher Reihenfolge wir diese Fragen stellen, das Ergebnis wird das gleiche sein. Es besteht keine Notwendigkeit, nach Schichten zu trennen.

 
Dmitriy Gizlyk:

Guten Abend, Peter.
Das Neuron im Inneren besteht aus 2 Funktionen:
1. Zunächst berechnen wir die Summe aller eingehenden Signale unter Berücksichtigung ihrer Gewichtungskoeffizienten. Das heißt, wir nehmen den Wert an jedem Eingang des Neurons und multiplizieren ihn mit dem entsprechenden Gewichtungsfaktor. Dann addieren wir die Werte der erhaltenen Produkte.


So erhalten wir einen bestimmten Wert, der in den Eingang der Aktivierungsfunktion eingespeist wird.

2. Die Aktivierungsfunktion wandelt die empfangene Summe in ein normiertes Ausgangssignal um. Dies kann entweder eine einfache Logikfunktion oder verschiedene Sigmoidfunktionen sein. Letztere sind gebräuchlicher, da sie einen sanfteren Übergang der Zustandsänderung aufweisen.

Die Kommunikation zwischen Neuronen wird als direkte Übertragung des Ausgangswertes eines Neurons auf den Eingang eines nachfolgenden Neurons organisiert. In diesem Fall wird der Wert, der am Eingang eines Neurons ankommt, entsprechend seinem Gewichtskoeffizienten berücksichtigt (siehe Punkt 1).

Ich danke Ihnen. Der Artikel und die Verweise haben mir geholfen, das Wesen des Zwecks neuronaler Netze zu verstehen - das Finden und Verarbeiten einer Invariante im Variationsraum eines Datensatzes - und die einfachste Methode der technischen Umsetzung, die ich noch nicht ganz verstanden habe. Aber die Erklärungen sind sehr einleuchtend.
 
Maxim Dmitrievsky:

Die Reihenfolge, in der diese Fragen gestellt werden, macht keinen Unterschied, das Ergebnis wird das gleiche sein. Eine Schichtung ist hier nicht erforderlich.

Die Fragen sind an Bedingungen geknüpft. Die Technik wird eingesetzt, um die Ursachen eines Ereignisses zu finden. Der Zusammenhang zwischen der ersten und der letzten Frage ist nicht immer sofort ersichtlich.
Das Beispiel in diesem Artikel soll jedoch den Zusammenhang zwischen dem Ansatz der Ursachenanalyse und der Netzarchitektur verdeutlichen.
 
Реter Konow:
Vielen Dank. Der Artikel und die Verweise haben mir geholfen, das Wesentliche des Zwecks neuronaler Netze zu verstehen - die Definition und Verarbeitung der in den Datensatz eingebetteten Invariante und die einfachste Methode der technischen Umsetzung, die ich noch nicht endgültig verstanden habe. Aber die Erklärungen sind sehr klar.

Wenn Sie die MLP-Struktur verstehen wollen, sollten Sie sich IMHO besser diesen Code ansehen:

#danila_zaytcev mlp 2018


import random

import math



class mlp:


    class activefunc:

        def __init__(self, func, derive):

            self.func = func

            self.derive = derive


    def __init__(self, structure,  af,  learnRate,  moment,  epohs):

        self.leanRate = learnRate

        self.af = af

        self.moment = moment

        self.epohs = epohs


        self.layerCount = len(structure) - 1

        self.weightCount = [None] * self.layerCount

        self.neuronsCount = [None] * self.layerCount

        self.Out = [None] * self.layerCount

        self.Err = [None] * self.layerCount

        self.Drv = [None] * self.layerCount

        self.Inputs = [None] * self.layerCount

        self.Weigthts = [None] * self.layerCount


        for l in range(self.layerCount):

            nLen = structure[l + 1]

            wLen = structure[l] + 1

            self.weightCount[l] = wLen

            self.neuronsCount[l] = nLen


            self.Out[l] = [0.0] * nLen

            self.Err[l] = [0.0] * nLen

            self.Drv[l] = [0.0] * nLen

            self.Weigthts[l] = [None] * nLen


            for n in range(nLen):

                self.Weigthts[l][n] = [None] * wLen

                for w in range(wLen):

                    self.Weigthts[l][n][w] = (random.random() * 2 - 1) / wLen



    def forward(self,  input):

        for l in range(self.layerCount):

            self.Inputs[l] = input

            for n in range(self.neuronsCount[l]):

                wcount = self.weightCount[l] - 1

                out = 0.0

                for w in range(wcount):

                    out += self.Weigthts[l][n][w] * input[w]


                out += self.Weigthts[l][n][wcount]

                out = self.af.func(out)

                self.Out[l][n] = out

                self.Drv[l][n] = self.af.derive(out)


            input = self.Out[l];



    def backward(self, output):

        last = self.layerCount - 1

        for n in range( self.neuronsCount[last]):

            self.Err[last][n] *= self.moment

            self.Err[last][n] += (output[n] - self.Out[last][n])*self.Drv[last][n] * (1.0 - self.moment)


        for l in range(last - 1, -1,-1):

            for n in range( self.neuronsCount[l]):

                backProp = 0

                for w in range(self.neuronsCount[l + 1]):

                    backProp += self.Weigthts[l + 1][w][n] * self.Err[l + 1][w]


                self.Err[l][n] = backProp * self.Drv[l][n]



    def update(self):

        for l in range(self.layerCount):

            for n in  range(self.neuronsCount[l]):

                G = self.Err[l][n] * self.leanRate

                for w in  range(self.weightCount[l] - 1):

                    self.Weigthts[l][n][w] += self.Inputs[l][w] * G

                self.Weigthts[l][n][self.weightCount[l] - 1] += G



    def learn(self, inputs, outputs):

        for e in  range(self.epohs):

            for i in range(len(inputs)):

                index = random.randint(0, len(inputs) - 1)

                self.forward(inputs[index])

                self.backward(outputs[index])

                self.update()



    def compute(self, vector):

        self.forward(vector)

        return self.Out[self.layerCount - 1]



def test_mlp():


    inputs = [[1.0,1.0],[-1.0,-1.0],[1.0,-1.0],[-1.0,1.0]]

    outputs = [[1.0],[1.0],[-1.0],[-1.0]]


    af = mlp.activefunc(math.tanh, lambda y: 1.0 - y ** 2)

    ml = mlp([2,2,1],af,0.01,0.1,10000)

    ml.learn(inputs,outputs)


    for i in inputs:

        print(str(i) + " = " + str(ml.compute(i)))

Er ist fünfmal kleiner, tut garantiert, was Sie brauchen, und ist in Python geschrieben, was viel einfacher zu verstehen ist.

Aber der Autor des Artikels ist natürlich gut, es ist cool, MLP selbst zu schreiben :)