[PYTHON] [Deep Learning von Grund auf neu] Anfangswert des Gewichts des neuronalen Netzwerks unter Verwendung der Sigmoid-Funktion

Einführung

Dieser Artikel ist eine leicht verständliche Ausgabe von ** Deep Learning von Grund auf neu. Kapitel 7 Lerntechniken **. Ich konnte es selbst verstehen, also hoffe ich, dass Sie es bequem lesen können. Ich würde mich auch sehr freuen, wenn Sie sich beim Studium dieses Buches darauf beziehen könnten.

Über den Anfangswert des Gewichts des neuronalen Netzes

Bisher verwendete der Anfangswert des Gewichts des neuronalen Netzwerks die Zufallsmethode, um eine Zufallszahl zu erzeugen, aber dies würde den Erfolg des Lernens erweitern.

Der Anfangswert des Gewichts und das Training des neuronalen Netzwerks sind sehr eng miteinander verbunden, und wenn der Anfangswert angemessen ist, ist das Lernergebnis gut, und wenn der Anfangswert unangemessen ist, ist das Lernergebnis schlecht.

Daher möchte ich dieses Mal eine Methode zum Einstellen eines geeigneten Anfangsgewichtswerts in einem neuronalen Netzwerk unter Verwendung der Sigmoid-Funktion implementieren.

Anfangswert von Xavier

Der Anfangswert des Gewichts, das für das neuronale Netzwerk unter Verwendung der Sigmoidfunktion am besten geeignet ist, ist der Anfangswert von Xavier.

scale = np.sqrt(1.0 / all_size_list[idx - 1]) 
scale * np.random.randn(all_size_list[idx-1], all_size_list[idx])

Der Anfangswert von Xavier kann erstellt werden, indem 1 ÷ die Anzahl der Knoten in der vorherigen Ebene mit einer Wurzel berechnet und mit einer zufälligen Zufallszahl multipliziert wird.

Unten sehen Sie ein Beispiel eines neuronalen Netzwerks, das die Anfangswerte von He und Xavier verwendet.

#Anfangswertanwendung von Gewicht ・ Neuronales Netzwerk, das den Gewichtsabfall implementiert
class MutiLayerNet:
    def __init__(self,input_size,hiden_size_list,output_size,
                activation='relu',weight_init_std='relu',weight_decay_lambda=0):#weight_decay_Je größer das Lambda, desto stärker
        self.input_size = input_size#Anzahl der Neuronen in der Eingabeschicht
        self.output_size = output_size#Anzahl der Neuronen in der Ausgabeschicht
        self.hiden_size_list = hiden_size_list#Anzahl der Neuronen in jeder Schicht der mittleren Schicht
        self.hiden_layer_num = len(hiden_size_list)#Anzahl der Schichten in der mittleren Schicht
        self.weight_decay_lambda = weight_decay_lambda#Gewichtsabnahme Festigkeitseinstellung
        self.params = {}#Parameter eingeben
        
        #Gewichtsinitialisierung
        self.__init_weight(weight_init_std)
        
        #Ebenenerstellung
        activation_layer = {'sigmoid': Sigmoid,'relu': Relu}
        self.layers = OrderedDict()#Bestelltes Wörterbuch zum Speichern von Ebenen
        for idx in range(1, self.hiden_layer_num+1):#Wiederholen Sie dies für die Anzahl der Zwischenschichten
            self.layers['Affine' + str(idx)] = Affine(self.params['W' + str(idx)],
                                                      self.params['b' + str(idx)])
            self.layers['Activation_function' + str(idx)] = activation_layer[activation]()#Wählen Sie die Funktionsebene Relu

        idx = self.hiden_layer_num + 1#Erstellen Sie eine affine Ebene vor der Ausgabeebene
        self.layers['Affine' + str(idx)] = Affine(self.params['W' + str(idx)],
            self.params['b' + str(idx)])

        self.last_layer = SoftmaxWithLoss()#Schicht von der Ausgangsschicht zur Verlustfunktion
        
    def __init_weight(self, weight_init_std):#Methode zum Initialisieren von Gewicht / Bias
        all_size_list = [self.input_size] + self.hiden_size_list + [self.output_size]#Enthält die Anzahl der Neuronen in allen Schichten
        for idx in range(1, len(all_size_list)):
            scale = weight_init_std#Enthält die Zahl, die mit dem Zufallsgewicht multipliziert werden soll
            if str(weight_init_std).lower() in ('relu', 'he'):#Erstellen Sie den Anfangswert von he, wenn Sie die Relu-Funktion verwenden
                scale = np.sqrt(2.0 / all_size_list[idx - 1])  #Empfohlener Anfangswert bei Verwendung von ReLU
            elif str(weight_init_std).lower() in ('sigmoid', 'xavier'):#Bei Verwendung der Sigmoid-Funktion Erstellen Sie den Anfangswert von xavier
                scale = np.sqrt(1.0 / all_size_list[idx - 1])  #Empfohlener Anfangswert bei Verwendung von Sigmoid

            self.params['W' + str(idx)] = scale * np.random.randn(all_size_list[idx-1], all_size_list[idx])#Gewichtsinitialisierung
            self.params['b' + str(idx)] = np.zeros(all_size_list[idx])#Bias-Initialisierung
            
    def predict(self, x):#Vorwärtsausbreitungsverarbeitung des neuronalen Netzwerks
        for layer in self.layers.values():
            x = layer.forward(x)

        return x
    
    def loss(self, x, t):#Vorwärtsausbreitungsverarbeitung vom neuronalen Netzwerk zur Verlustfunktion + Gewichtsabnahmeverarbeitung
        y = self.predict(x)

        weight_decay = 0
        for idx in range(1, self.hiden_layer_num + 2):#Beim Gewichtsabnahmeprozess werden die Quadrate der Gewichte jeder Schicht summiert, und der folgende Prozess wird ausgeführt, um zu summieren.
            W = self.params['W' + str(idx)]
            weight_decay += 0.5 * self.weight_decay_lambda * np.sum(W ** 2)

        return self.last_layer.forward(y, t) + weight_decay

    def accuracy(self, x, t):#Berechnen Sie die richtige Antwortrate
        y = self.predict(x)
        y = np.argmax(y, axis=1)
        if t.ndim != 1 : t = np.argmax(t, axis=1)

        accuracy = np.sum(y == t) / float(x.shape[0])
        return accuracy

    def numerical_gradient(self, x, t):#Numerische Differenzierung
        loss_W = lambda W: self.loss(x, t)

        grads = {}
        for idx in range(1, self.hidden_layer_num+2):
            grads['W' + str(idx)] = slopeing_grad(loss_W, self.params['W' + str(idx)])
            grads['b' + str(idx)] = slopeing_grad(loss_W, self.params['b' + str(idx)])

        return grads

    def gradient(self, x, t):#Methode zur Fehlerrückübertragung
        # forward
        self.loss(x, t)

        # backward
        dout = 1
        dout = self.last_layer.backward(dout)

        layers = list(self.layers.values())
        layers.reverse()
        for layer in layers:
            dout = layer.backward(dout)

        #Gradientenwiederherstellung
        grads = {}
        for idx in range(1, self.hiden_layer_num+2):#Behandelt auch Gewichtsabnahme
            grads['W' + str(idx)] = self.layers['Affine' + str(idx)].dW + self.weight_decay_lambda * self.layers['Affine' + str(idx)].W
            grads['b' + str(idx)] = self.layers['Affine' + str(idx)].db

        return grads

Recommended Posts

[Deep Learning von Grund auf neu] Anfangswert des Gewichts des neuronalen Netzwerks unter Verwendung der Sigmoid-Funktion
[Deep Learning von Grund auf neu] Anfangsgewicht des neuronalen Netzwerks bei Verwendung der Relu-Funktion
"Deep Learning from Grund" Memo zum Selbststudium (Nr. 10-2) Anfangswert des Gewichts
Python vs Ruby "Deep Learning von Grund auf neu" Kapitel 3 Implementierung eines dreischichtigen neuronalen Netzwerks
Kapitel 3 Neuronales Netz Schneiden Sie nur die guten Punkte des Deeplearning aus, die von Grund auf neu erstellt wurden
Lua-Version Deep Learning von Grund auf neu Teil 6 [Inferenzverarbeitung für neuronale Netze]
Lernbericht über das Lesen von "Deep Learning von Grund auf neu"
Python vs Ruby "Deep Learning von Grund auf neu" Kapitel 4 Implementierung der Verlustfunktion
Deep Learning / Fehler-Backpropagation der Sigmoid-Funktion
[Lernnotiz] Deep Learning von Grund auf ~ Implementierung von Dropout ~
Anwendung von Deep Learning 2 von Grund auf neu Spam-Filter
[Deep Learning] Führen Sie die neuronale SONY-Netzwerkkonsole über CUI aus
Deep Learning von Grund auf 1-3 Kapitel
Rank Learning über ein neuronales Netzwerk (RankNet-Implementierung von Chainer)
Versuchen Sie, ein Deep Learning / Neuronales Netzwerk mit Scratch aufzubauen
[Deep Learning] Untersuchen Sie, wie jede Funktion des Faltungsnetzes verwendet wird [DW Tag 3]
[Deep Learning von Grund auf neu] Implementieren Sie die Backpropagation-Verarbeitung in einem neuronalen Netzwerk mithilfe der Fehler-Back-Propagation-Methode
Tiefes Lernen von Grund auf neu (Kostenberechnung)
Deep Learning Memo von Grund auf neu gemacht
[Deep Learning von Grund auf neu] Methoden zur Aktualisierung der wichtigsten Parameter für neuronale Netze
Schreiben Sie Ihre Eindrücke von der Deep Learning 3 Framework Edition, die von Grund auf neu erstellt wurde
Selbststudien-Memo "Deep Learning from Grund" (Nr. 13) Verwenden Sie Google Colaboratory
[Deep Learning von Grund auf neu] Informationen zu den Ebenen, die für die Implementierung der Backpropagation-Verarbeitung in einem neuronalen Netzwerk erforderlich sind
Deep Learning von Grund auf neu 4.4.2 Gradient für neuronale Netze Die Frage nach der Funktion numerischer Gradient wurde gelöst.
Tiefes Lernen von Grund auf neu (Vorwärtsausbreitung)
Implementierung eines 3-Schicht-Neuronalen Netzwerks (kein Lernen)
Tiefes Lernen / Tiefes Lernen von Grund auf 2-Versuchen Sie, GRU zu bewegen
Deep Learning / Deep Learning von Grund auf neu Kapitel 6 Memo
[Deep Learning von Grund auf neu] Ich habe versucht, Sigmoid Layer und Relu Layer zu implementieren
[Lernnotiz] Deep Learning von Grund auf neu gemacht [Kapitel 5]
[Lernnotiz] Deep Learning von Grund auf neu gemacht [Kapitel 6]
"Deep Learning von Grund auf neu" mit Haskell (unvollendet)
Deep Learning / Deep Learning von Grund auf neu Kapitel 7 Memo
[Windows 10] Aufbau einer "Deep Learning from Scratch" -Umgebung
[Deep Learning von Grund auf neu] Layer-Implementierung von der Softmax-Funktion zum Überkreuzen von Entropiefehlern
[Deep Learning von Grund auf neu] Über die Optimierung von Hyperparametern
"Deep Learning from Grund" Memo zum Selbststudium (Teil 12) Deep Learning
[Lernnotiz] Deep Learning von Grund auf neu gemacht [~ Kapitel 4]
Deep Learning von Grund auf neu Die Theorie und Implementierung des mit Python erlernten Deep Learning Kapitel 3
[Deep Learning von Grund auf neu] Beschleunigen des neuronalen Netzwerks Ich erklärte die Verarbeitung der Rückausbreitung
Selbststudien-Memo "Deep Learning from Grund" (unlesbares Glossar)
[Python / Maschinelles Lernen] Warum Deep Learning # 1 Perceptron Neural Network
"Deep Learning from Grund" Memo zum Selbststudium (Nr. 9) MultiLayerNet-Klasse
Verstärkungslernen 10 Versuchen Sie es mit einem trainierten neuronalen Netz.
Deep Learning von Grund auf neu ① Kapitel 6 "Lerntechniken"
GitHub des guten Buches "Deep Learning von Grund auf neu"
Deep Learning von Grund auf neu Kapitel 2 Perceptron (Memo lesen)
Python vs Ruby "Deep Learning von Grund auf neu" Zusammenfassung
"Deep Learning from Grund" Memo zum Selbststudium (10) MultiLayerNet-Klasse
"Deep Learning from Grund" Memo zum Selbststudium (Nr. 11) CNN
Gegenmaßnahmen für den Fehler "Oberes Verzeichnis kann nicht abgerufen werden" bei Verwendung von Deep Learning ②, das mit dem Spyder von ANACONDA von Grund auf neu erstellt wurde
Deep Learning von Grund auf neu 4.3.3 Zeichnen Sie einen Gradientenvektor Ihrer eigenen Funktion basierend auf dem Beispielcode der partiellen Differenzierung.
Python vs Ruby "Deep Learning from Grund" Kapitel 1 Diagramm der Sin-Funktion und der Cos-Funktion
[Deep Learning von Grund auf neu] Ich habe die Affine-Ebene implementiert
"Deep Learning from Grund" Memo zum Selbststudium (Nr. 19) Datenerweiterung
Othello ~ Aus der dritten Zeile von "Implementation Deep Learning" (4) [Ende]
Implementierung eines Faltungs-Neuronalen Netzwerks mit nur Numpy
Ich habe versucht, Dropout zu erklären
Sammlung und Automatisierung erotischer Bilder durch Deep Learning
Kapitel 2 Implementierung von Perceptron Schneiden Sie nur die guten Punkte des Deeplearning aus, die von Grund auf neu erstellt wurden