[PYTHON] Ich habe versucht, die Lernfunktion im neuronalen Netzwerk sorgfältig zu verstehen, ohne die Bibliothek für maschinelles Lernen zu verwenden (erste Hälfte).

Einführung

Lernen ist eine Funktion im neuronalen Netzwerk (Deep Learning). Ich habe versucht, die Berechnungen im Modell, die durchgeführt werden, um den Vorhersagewert des Vorhersagemodells zu erhöhen, von Grund auf zu verstehen.

Auch diesmal bezog ich mich auf O'Reillys Lehrbuch für tiefes Lernen. Es ist sehr leicht zu verstehen. https://www.oreilly.co.jp/books/9784873117584/

Der Umriss ist wie folgt.

Was ist Lernen in einem neuronalen Netzwerk?

Das Lernen in einem Modell besteht darin, den vorhergesagten Wert näher an die richtige Antwort zu bringen oder die richtige Antwortrate zu erhöhen. Nehmen Sie als Beispiel die Bilderkennung. MNIST, ein bekanntes Nummernerkennungssystem, unterscheidet handschriftliche Nummern. image.png

In diesem Bild kann jeder Mensch 5 sehen (das Gehirn lernt und erkennt). Als nächstes überlegen wir, was notwendig ist, um einen Algorithmus zu erstellen, mit dem der Computer diese erkennen kann 5. Um 5 aus dem "Bild" von 5 zu erkennen, ist es notwendig, eine "Merkmalsmenge" zu finden, die aus dem Bild als 5 identifiziert werden kann. Die Feature-Menge wird in englischer Sprache als Feature-Auswahl geschrieben. Wörtlich übersetzt bedeutet es "ein Merkmal wählen". Wenn Sie es durch das Bild 5 ersetzen, verfügt es über Funktionen wie "erster horizontaler Balken", "vertikale Linie" und "Bogen bei etwa 270 Grad bei geöffneter linker Seite". Der Fluss des Extrahierens dieser Merkmalsgrößen und des Lernens der extrahierten Merkmale ist der Algorithmus, der 5 vom Computer erkennen lässt.   Die Funktion zum Finden (= Extrahieren) von Merkmalen wird als Konverter bezeichnet. Zu diesen bekannten Konvertern gehören SIFT, SURF und HOG. Weitere Informationen finden Sie unter der folgenden URL. Diese URL ist das Material für 2011 und scheint eine Technologie zu sein, die seit den 2000er Jahren entwickelt wurde.

https://www.slideshare.net/lawmn/siftsurf

Als nächstes kann die Merkmalsgröße verwendet werden, um die Bilddaten in einen Vektor umzuwandeln, und der Vektor kann durch eine Funktion trainiert werden, die als Diskriminator bezeichnet wird und beim maschinellen Lernen verwendet wird. Bekannte Diskriminatoren sind die Support Vector Machine (SVM) und die K Proximity Method (KNN).

Hier ist es notwendig, den Konverter entsprechend den Merkmalen entsprechend nach "Personen" zu beurteilen und auszuwählen. Andererseits umfasst der vom neuronalen Netz abgedeckte Bereich auch diesen Konverter. Mit anderen Worten, der Konverter selbst, der nach Merkmalen sucht, ist auch ein Algorithmus, der trainiert werden kann.

image.png

Das Konzept ist oben dargestellt. Durch Vergrößern des Bereichs, den der Computer beurteilt, interpretiert das neuronale Netzwerk die gegebenen Daten so wie sie sind und versucht, das Muster des Problems zu finden. Es kann verstanden werden, dass es sich um einen Algorithmus mit einem größeren Sinn für künstliche Intelligenz handelt.

Was ist eine Verlustfunktion?

Als nächstes werde ich die Idee der Unterscheidung zwischen konkret vorhergesagten Daten und korrekten Daten zusammenfassen. Wir führen eine Funktion namens Verlustfunktion ein, um anzuzeigen, ob sie der richtigen Antwort nahe kommt.

Summe der Fehlerquadrate

Die bekannteste Verlustfunktion ist der mittlere quadratische Fehler. Es wird durch die unten gezeigte Formel ausgedrückt.

image.png

yk gibt die Ausgabe des neuronalen Netzwerks an, tk gibt die Lehrerdaten an (korrekte Antwortdaten) und k gibt die Anzahl der Dimensionen (Anzahl) der Daten an. Aus der Formel können wir ersehen, dass dieser Wert umso kleiner ist, je korrekter die Antworten sind. Ich würde es gerne einfach in ein Programm schreiben.

nn.ipynb


import numpy as np

def mean_squared_error(y,t):
    return 0.5*np.sum((y-t)**2)

t = [0,0,1,0,0,0,0,0,0,0]
y = [0.1,0.1,0.6,0.1,0.1,0,0,0,0,0]
y1 = [0.1,0.1,0.1,0.1,0.6,0,0,0,0,0]
print(mean_squared_error(np.array(y),np.array(t)))
print(mean_squared_error(np.array(y1),np.array(t)))
0.10000000000000003
0.6000000000000001

Die Elemente dieses Arrays entsprechen den Zahlen "0", "1" und "2" in der Reihenfolge vom ersten Index. Wobei y die Ausgabe des neuronalen Netzwerks ist. Der von der Softmax-Funktion konvertierte Wert repräsentiert die Wahrscheinlichkeit. Es wird gesagt, dass die Wahrscheinlichkeit, festzustellen, dass es sich um die Zahl 2 handelt, 0,6 beträgt. Außerdem sind t die Lehrerdaten. Mit anderen Worten, die richtige Antwort ist die Nummer 2. Als die Summe der Quadratfehler für jedes von y und y1 berechnet wurde, war y näher. Es ist ersichtlich, dass der von y ausgegebene Wert richtig ausdrücken kann, dass das Element mit der Zahl 2 die höchste Wahrscheinlichkeit hat.

Kreuzentropiefehler

Eine weitere Fehlerfunktion ist der Kreuzentropiefehler. image.png

log basiert auf natürlichem Logarithmus. Da tk das richtige Antwortetikett ist, wird 1 nur ausgegeben, wenn die Antwort korrekt ist. Daher wird diese Funktion berechnet, um den natürlichen Logarithmus auszugeben, der dem korrekten Antwortetikett von 1 entspricht. Hier ist das Ergebnis der tatsächlichen Implementierung.

nn.ipynb



def cross_entropy_error(y,t):
    delta = 1e-7
    return -np.sum(t*np.log(y+delta))

print(cross_entropy_error(np.array(y),np.array(t)))
print(cross_entropy_error(np.array(y1),np.array(t)))
0.510825457099338
2.302584092994546

Hier wird ein Minutenwert (0,0000001) zur Berechnung im Protokoll hinzugefügt. Dies wird hinzugefügt, um zu verhindern, dass die Berechnung hängen bleibt, da sie bei log (0) gegen minus unendlich abweicht. Wenn Sie das Ergebnis betrachten, ist die y-Ausgabe des richtigen Etiketts klein und beträgt 2,3. Wenn die y-Ausgabe jedoch hoch ist, beträgt sie 0,5.

Zweck der Einstellung der Fehlerfunktion

Die Verlustfunktion kann durch Minimieren des erhaltenen Wertes in ein Modell mit hoher Vorhersagegenauigkeit umgewandelt werden. Daher ist es notwendig, einen Parameter zu finden, der die Verlustfunktion reduziert. Zu diesem Zeitpunkt wird der Parameter unter Verwendung des differenzierten Werts dieses Parameters als Hinweis aktualisiert. Durch Differenzierung können Sie den Gradienten der Funktion kennen. Die grundlegenden Inhalte der Differenzierung werden hier weggelassen.

image.png

Wenn der Wert dieses Gradienten positiv ist, bewegen Sie den Parameter (a in der Abbildung) in die negative Richtung, um sich dem Minimalwert anzunähern. Im Gegenteil, wenn der Gradientenwert negativ ist, können Sie sich vorstellen, den Parameter in die positive Richtung zu bewegen, um sich dem Minimalwert anzunähern.

Funktionsdifferenzierung implementieren

Nun möchte ich über die Differenzierung von Funktionen nachdenken. Es gibt zwei Ansätze zur Unterscheidung einer Funktion: (1) analytisches Lösen und (2) diskretes Lösen (Differenz nehmen). Wenn Sie Ihre Hand bewegen und von einem Menschen ausführen, tun Sie dies in (1), aber wenn Sie es programmgesteuert lösen, ist (2) praktisch. Dieses Mal werden wir das in der folgenden Abbildung gezeigte Konzept der zentralen Differenz implementieren.

Dieses Mal möchte ich den diskret differenzierten Wert dieser Funktion finden.

image.png

nn.ipynb


import numpy as np
import matplotlib.pyplot as plt

def numerical_diff(f,x):
    h =1e-4 #0.0001
    return (f(x+h)-f(x-h))/(2*h)

def function_1(x):
    return 0.01*x**2 + 0.1*x
numerical_diff(function_1,5)
0.1999999999990898

image.png

Die angehängte Kurve ist die ursprüngliche Funktion, und die gerade Linie ist der Gradient bei x = 5.

Partielle Differenzierung implementieren

Als nächstes sollten Sie eine teilweise Differenzierung der unten gezeigten Funktion mit zwei Variablen in Betracht ziehen.

image.png

Wenn Sie die ursprüngliche Funktion zeichnen, handelt es sich um ein dreidimensionales Diagramm, wie unten gezeigt.

image.png

nn.ipynb


def function_2(x):
return x[0]**2 + x[1]**2

Teilweise Differenzierung bezieht sich auf die Bestimmung der zu differenzierenden Variablen und die Behandlung anderer numerischer Werte als Konstanten zur Durchführung der Differenzierung. Unterscheide x0 teilweise und finde den Wert, wenn x0 = 3, x1 = 4.

nn.ipynb


def function_tmp1(x0):
    return x0*x0 +4.0**2.0

numerical_diff(function_tmp1,3.0)
6.00000000000378

Wir definieren es als eine Funktion mit nur einer Variablen und unterscheiden diese Funktion. In diesem Fall ist es jedoch erforderlich, eine Verarbeitung durchzuführen, z. B. andere Werte als die Werte zuzuweisen, die nacheinander als Variablen verwendet werden. Bedenken Sie, dass Sie x0 und x1 zusammen unterscheiden möchten. Dies kann wie folgt implementiert werden:

nn.ipynb


def numerical_gradient(f,x):
    h =1e-4
    grad = np.zeros_like(x)
    
    for idx in range(x.size):
        tmp_val =x[idx]
        x[idx] =tmp_val + h
        fxh1 = f(x)
        
        x[idx] = tmp_val -h
        fxh2 = f(x)
        
        grad[idx] = (fxh1-fxh2)/(2*h)
        x[idx] = tmp_val
    
    return grad

numerical_gradient(function_2,np.array([3.0,4.0]))
array([6., 8.])

Ich habe zuvor erklärt, dass dieser differenzierte Wert den Gradienten der ursprünglichen Funktion angibt. Betrachten Sie außerdem das Zeichnen dieses differenzierten Werts als Vektor. Der Einfachheit halber wird es unten mit einem Minus angezeigt.

image.png

Sie können sehen, dass der Pfeil auf (x0, x1) = (0,0) zeigt. Dies führt zu einer Verbesserung der Genauigkeit des Modells, indem der Mindestwert in der Diskussion der Verlustfunktion ermittelt wird. ** Es stellt sich heraus, dass diese Differentialoperation den Minimalwert der Verlustfunktion finden kann, was zur Modelloptimierung führt! ** ** **

Am Ende

Dieses Mal bin ich so weit fortgeschritten, dass ich verstehe, dass diese Differentialoperation zu einer Verbesserung der Genauigkeit des Modells führt. Durch das Betrachten der Lerninhalte, die das Herz des neuronalen Netzwerks bilden, vertiefte ich mein Verständnis. In der nächsten und zweiten Hälfte des Artikels möchte ich das Lernen sorgfältig verstehen, indem ich tatsächlich mit der Implementierung im neuronalen Netzwerk fortfahre.

Die zweite Hälfte ist da. https://qiita.com/Fumio-eisan/items/7507d8687ca651ab301d

Recommended Posts

Ich habe versucht, die Lernfunktion im neuronalen Netzwerk sorgfältig zu verstehen, ohne die Bibliothek für maschinelles Lernen zu verwenden (erste Hälfte).
Ich habe versucht, die Lernfunktion im neuronalen Netzwerk sorgfältig zu verstehen, ohne die Bibliothek für maschinelles Lernen zu verwenden (zweite Hälfte).
Ich habe versucht, die Genauigkeit von Modellen für maschinelles Lernen mit Kaggle als Thema zu vergleichen.
Ich habe versucht, das Bild mithilfe von maschinellem Lernen zu komprimieren
[Python] Deep Learning: Ich habe versucht, Deep Learning (DBN, SDA) ohne Verwendung einer Bibliothek zu implementieren.
(Maschinelles Lernen) Ich habe versucht, den EM-Algorithmus in der gemischten Gaußschen Verteilung sorgfältig mit der Implementierung zu verstehen.
[Maschinelles Lernen] Ich habe versucht, die Theorie von Adaboost zusammenzufassen
Ich habe versucht, den Index der Liste mithilfe der Aufzählungsfunktion abzurufen
Ich habe versucht, Othello AI mit Tensorflow zu machen, ohne die Theorie des maschinellen Lernens zu verstehen ~ Einführung ~
Ich habe versucht, Othello AI mit Tensorflow zu erstellen, ohne die Theorie des maschinellen Lernens zu verstehen ~ Implementierung ~
(Maschinelles Lernen) Ich habe versucht, die Bayes'sche lineare Regression bei der Implementierung sorgfältig zu verstehen
Ich habe versucht, das Modell mit der Low-Code-Bibliothek für maschinelles Lernen "PyCaret" zu visualisieren.
Ich habe die übliche Geschichte ausprobiert, Deep Learning zu verwenden, um den Nikkei-Durchschnitt vorherzusagen
Ich habe versucht, Othello AI mit Tensorflow zu erstellen, ohne die Theorie des maschinellen Lernens zu verstehen ~ Battle Edition ~
Ich habe versucht, das Vorhandensein oder Nichtvorhandensein von Schnee durch maschinelles Lernen vorherzusagen.
Eine grobe Einführung in die neuronale maschinelle Übersetzungsbibliothek
Ich habe versucht, die Sündenfunktion mit Chainer zu approximieren
Ich habe versucht, die Support-Vektor-Maschine sorgfältig zu verstehen (Teil 1: Ich habe den Polynom / RBF-Kernel am Beispiel von MakeMoons ausprobiert).
Ich habe versucht, das Update von "Werde ein Romanautor" mit "IFTTT" und "Werde ein Romanautor API" zu benachrichtigen.
Ich habe eine Funktion erstellt, um das Modell von DCGAN zu überprüfen
[TF] Ich habe versucht, das Lernergebnis mit Tensorboard zu visualisieren
Ich habe ein wenig versucht, das Verhalten der Zip-Funktion
Ich habe versucht, das lokale Minimum der Goldstein-Preis-Funktion zu bekämpfen
Ich habe versucht, die Sündenfunktion mit Chainer zu approximieren (Re-Challenge)
Passende App Ich habe versucht, Statistiken über starke Leute zu erstellen und ein Modell für maschinelles Lernen zu erstellen
Ich habe versucht, die Yin- und Yang-Klassifikation hololiver Mitglieder durch maschinelles Lernen zu überprüfen
Ich habe versucht, die Erstellung einer praktischen Umgebung mithilfe der SoftLayer-API der IBM Cloud zu automatisieren
Eine Geschichte, die mit der Installation der maschinellen Lernbibliothek JAX zusammenhängt
Ich habe versucht, mit Pandas eine Pferderenn-Datenbank zu erstellen
Ich habe versucht, mit Python einen regulären Ausdruck für "Betrag" zu erstellen
Ich habe versucht, mit Python einen regulären Ausdruck von "Zeit" zu erstellen
Ich habe versucht, mit Python einen regulären Ausdruck von "Datum" zu erstellen
Ich habe versucht, mit Boto3 eine Liste der AMI-Namen zu erhalten
Wie nutzt man maschinelles Lernen für die Arbeit? 01_ Den Zweck des maschinellen Lernens verstehen
Ich möchte einen maschinellen Lerndienst ohne Programmierung erstellen! Web-API
Ich habe versucht, das überwachte Lernen des maschinellen Lernens auch für Serveringenieure auf leicht verständliche Weise zu verstehen 1
Ich habe versucht, das überwachte Lernen des maschinellen Lernens auch für Serveringenieure auf leicht verständliche Weise zu verstehen 2
Ich habe versucht, das Gesichtsbild mit sparse_image_warp von TensorFlow Addons zu transformieren
Ich habe versucht, die Trefferergebnisse von Hachinai mithilfe der Bildverarbeitung zu erhalten
Notieren Sie die Schritte zum Verständnis des maschinellen Lernens
Ich habe versucht, die Ähnlichkeit der Frageabsicht mit Doc2Vec von gensim abzuschätzen
Ich möchte es nicht zugeben ... Die dynamische Systemdarstellung von Neural Network
Django super Einführung von Python-Anfängern! Teil 3 Ich habe versucht, die Vererbungsfunktion für Vorlagendateien zu verwenden
Ich habe versucht, die Genauigkeit meines eigenen neuronalen Netzwerks zu verbessern
Ich habe versucht, Gitarrenakkorde in Echtzeit mithilfe von maschinellem Lernen zu klassifizieren
Django super Einführung von Python-Anfängern! Teil 2 Ich habe versucht, die praktischen Funktionen der Vorlage zu nutzen
Ich habe versucht, den entscheidenden Baum (CART) zu verstehen, um ihn sorgfältig zu klassifizieren
Ich habe versucht, eine Clusteranalyse von Kunden anhand von Kaufdaten durchzuführen
Ich habe versucht, den Höhenwert von DTM in einem Diagramm anzuzeigen
Mit COTOHA habe ich versucht, den emotionalen Verlauf des Laufens von Meros zu verfolgen.
Ich habe versucht, das Ergebnis des A / B-Tests mit dem Chi-Quadrat-Test zu überprüfen
Python: Ich möchte die Verarbeitungszeit einer Funktion genau messen
Ich möchte einen maschinellen Lerndienst ohne Programmierung erstellen! Textklassifizierung
Ich habe die gängige Geschichte der Vorhersage des Nikkei-Durchschnitts mithilfe von Deep Learning (Backtest) ausprobiert.
Ich habe eine Funktion erstellt, um die Bewegung eines zweidimensionalen Arrays (Python) zu sehen.
Ich habe versucht, die Verschlechterung des Lithium-Ionen-Akkus mithilfe des Qore SDK vorherzusagen
Ich habe versucht, das Update von "Hameln" mit "Beautiful Soup" und "IFTTT" zu benachrichtigen.
[Python] Ich habe versucht, das Mitgliederbild der Idolgruppe mithilfe von Keras zu beurteilen
Ich habe versucht, die beim maschinellen Lernen verwendeten Bewertungsindizes zu organisieren (Regressionsmodell).