Freigeben über



Februar 2019

Band 34, Nummer 2

Dieser Artikel wurde maschinell übersetzt.

[Künstlich Intelligent]

Ein genauerer Blick auf neuronale Netze

Durch Frank La La | Februar 2019

Frank La VigneNeuronale Netzwerke sind ein wesentliches Element von Lösungen für viele erweiterte künstliche Intelligenz (KI). Allerdings die Benutzer nur wenige un-Derstand der Core mathematischen oder strukturelle Grundlagen dieses Konzept. Während der anfänglichen Forschung in neuronalen Datumsangaben zurück also Jahrzehnte Netzwerke, war es nicht bis vor kurzem, dass die volle Power des batchcomputing und die Größe eines trainingsdatasets sie praktische zur allgemeinen Verwendung vorgenommen habe.

Neuronale Netzwerke oder genauer gesagt, künstliche neuronale Netzwerke sind lose von biologische neuronale Netze in die Gehirne von Tieren abhängig. Bei der nicht auf einen Algorithmus ist eine Art von Framework für die Algorithmen, um die Eingabe verarbeitet und eine Ausgabe aus "gelernten", ein neuronales Netzwerks. Neuronale Netzwerke haben sich als selbst nützlich, um das Ausführen von Aufgaben, die auf herkömmlichen Programmiermethoden haben schwerwiegende Probleme zu lösen. Es gibt, zwar mehrere verschiedene Varianten von neuronalen Netzwerken verwenden alle die gleiche grundlegende Struktur und Konzepte. Frameworks wie Keras, macht diese einfacher zu implementieren und zu viele Implementierungsdetails auszublenden vorhanden sind. Allerdings halten ich nie ganz die Leistungsfähigkeit und die Vorteile von neuronalen Netzwerken bis musste ich eine manuell zu programmieren. Die das Ziel dieses Artikels werden: um ein einfaches neuronales Netzwerk mit Python neu zu erstellen.

Neuronen und neuronale Netzwerke

Vor dem Erstellen eines neuronalen Netzwerks von Grund auf neu erstellen, ist es wichtig zu verstehen, die Core-Komponenten. Jede neuronalen Netzwerks besteht aus einer Reihe von verbundenen Knoten, die Neuronen aufgerufen. Wiederum ist jedem Neuron Teil des Netzwerks an Neuronen, die in Ebenen angeordnet. Jedes Neuron in jeder Schicht ist jedem Neuron in der nächsten Ebene verbunden. Jedes Neuron künstliche eine Reihe von Eingaben annimmt und einen Wert für die gewichtete Summe berechnet. Das Aktivieren oder nicht basierend auf der Ausgabe der Aktivierungsfunktion, der in der Eingabewerten und Gewichtungen und Bias verwendet und eine Zahl berechnet. Diese Zahl ist ein Wert zwischen-1 und 1 oder 0 und 1, je nach Art der Aktivierungsfunktion. Dieser Wert wird mit den anderen verbundenen Neuronen klicken Sie dann in der nächsten Ebene in einem Vorgang namens forward Weitergabe übergeben, auf verwendet wird.

Für die Ebenen, es gibt drei grundlegende Arten: Ebenen, ausgeblendete Ebenen und-Ausgabe Ebenen. Eingabeschichten stehen die Eingabedaten an, während die Ausgabeebene die Ausgabe enthält. Die verdeckten Schichten bestimmen die Tiefe des neuronalen Netzwerks – Dies ist der, in denen der Begriff "deep Learning" stammen. In der Praxis können neuronale Netze nur obere Grenze verfügbaren rechenleistung geschaffen werden Hunderte von ausgeblendeten Ebenen enthält.

Forward-Verteilung

Forward-Verteilung ist der Prozess, durch die Daten durchlaufen eines neuronalen Netzwerks aus der Eingabeebene an die Ausgabeebene. Sie umfasst eine gewichtete Summe der alle Eingaben zu berechnen und ein Bias berücksichtigen. Nachdem die gewichtete Summe berechnet wird, wird er über keine Aktivierungsfunktion ausgeführt. Mithilfe des Neurons in Abbildung1 beispielsweise des Neurons verfügt über zwei Eingaben, X1 und X2, zusammen mit zwei Gewichtungen w1 "und" w2. Die gewichtete Summe durch z dargestellt wird, und des Werts einer stellt der Wert berechnet, indem die Aktivierungsfunktion Wenn sie den Wert der gewichteten Summe verstrichen ist. Denken Sie daran, dass das Ziel der Aktivierungsfunktion um die Ausgabe des Neurons berechnet wird in einen Wert innerhalb eines Bereichs zu komprimieren. Verschiebung wird hinzugefügt, Optimieren Sie die Empfindlichkeit des Neurons berechnet wird.

Forward-Weitergabe in der ein neuronales NetzwerkAbbildung 1-Forward-Weitergabe in der ein neuronales Netzwerk

Um dies zu veranschaulichen, kann es am besten, den Code durchlaufen sein. Um Dinge klar zu halten, verwende ich Variablennamen, die mit übereinstimmen, die sich mit den Angaben in Abbildung1. Starten Sie zunächst ein Jupyter-Notebook (mehr dazu, finden Sie hier: msdn.com/magazine/mt829269), dann geben Sie dann Folgendes in eine leere Zelle, und führen Sie:

x1 = .5
w1 = .2
x2 = 4
w2 = .5
b = .03

z = x1 * w1 + x2 * w2 + b

print (z)

Der Wert des Z, die gewichtete Summe ist 2.13. Denken Sie daran, dass der nächste Schritt ist die Ausführung dieser Wert durch eine Aktivierungsfunktion. Geben Sie anschließend den folgenden Code in eine neue Zelle, die eine Aktivierung erstellen
Funktion, und führen Sie es aus:

import numpy as np
def sigmoid_activation(weighted_sum):
  return 1.0 / (1.0 + np.exp(-1 * weighted_sum))
a = sigmoid_activation(z)
print(a)

Die Ausgabe sollte angezeigt werden, die eine 0.8937850083248244 entspricht. In ein mehrschichtiges neuronales Netzwerk, den Wert des einem an die nächste Stufe übergeben. Aus diesem Grund kaskadiert Aktivierungen auf einer Ebene, auf die nächste und schließlich über das gesamte Netzwerk.

Werte zwischen 0 und 1, unabhängig davon, wie groß oder klein, die die Anzahl ist, gibt die Sigmoid_activation zurück. Geben Sie den folgenden Code, um es zu testen:

print(sigmoid_activation(1000000))
print(sigmoid_activation(.000001))

Die Ausgabe sollte 1.0 und ungefähr 0,50 lesen.

Weitere Informationen über die mathematische Konstante e Näheres im Wikipedia-Artikel zum Thema (bit.ly/2s8VL9Q).

Wie funktioniert ein neuronales Netzwerk?

Wenn die relative Einfachheit der Struktur und Mathematik eines neuronalen Netzwerks, ist es natürlich die Frage, wie er auf ein breites Spektrum an AI Probleme angewendet werden kann. Die Leistung ist im Netzwerk nicht unbedingt die Neuronen sich selbst. Jedes Neuron in einem neuronalen Netzwerk stellt eine Kombination der Eingabewerten, Gewichtungen und Bias dar. Durch Schulungen, können die entsprechenden Werte der Gewichte und ermittelt werden.

Jetzt haben Sie zweifellos über das MNIST-Dataset gehört der häufig für neuronale Netzwerke als eine Art "Hello World" verwendet wird. Ich hatte es gesehen Dutzende Male, bevor das Konzept wie neuronale Netze für mich schließlich geklickt funktioniert haben. Wenn Sie nicht mit dem Problem vertraut sind, stehen Ihnen zahlreiche Beispiele online, die sie unterteilen (finden Sie unter varianceexplained.org/r/digit-eda). Die Herausforderung der MNIST-Dataset wird gut veranschaulicht, wie einfach es ist für neuronale Netzwerke zu Aufgaben, die herkömmliche algorithmische Ansätze seit Jahrzehnten Sprühstrahl haben.

Hier ist das Problem zusammengefasst, angegebenen 28 x 28 Pixel Graustufen-Bildes handgeschriebene Ziffern, die ein neuronales Netzwerk lernen muss, als der richtige Wert zu lesen. Dieses Image 28 x 28 Pixel besteht aus 784 einzelne numerische Werte zwischen 0 und 255, die die Struktur der Eingabeebene imagine erleichtert. Die Eingabeebene besteht aus 784 Neuronen mit Werten, die über keine Aktivierungsfunktion, die sicherstellt, dass Werte zwischen 0 und 1 sind übergeben. Aus diesem Grund werden heller Pixel Wert eher in Richtung einer und dunkler Pixel erhalten Wert eher in Richtung 0 (null). Die Ausgabeebene besteht aus 10 Neuronen, eine für die einzelnen Ziffern. Das Neuron mit dem höchsten Wert stellt die Antwort dar. Beispielsweise verfügt das Neuron acht den höchsten Wert der Activation-Funktion, hat dann das neuronale Netzwerk festgestellt, dass acht der Ausgabewert ist.

Fügen einfach zwei verdeckten Schichten mit 32 Neuronen werden, einen entscheidenden Einfluss haben. Wie das? Denken Sie daran, dass jedes Neuron jedes Neuron in der vorherigen Ebene und der nächsten Ebene verbunden ist. Dies bedeutet, dass es sich bei stehen 784 x 32 Gewichtungen in der ersten Ebene: 32 x 32 Gewichtungen in der zweiten Ebene und 32 x 10 Gewichtungen in der dritten Ebene. Es gibt auch 32 + 32 + 10 Bias, die ebenfalls hinzugefügt werden müssen. Ergibt eine Gesamtsumme der 26,506 anpassbaren Werte, und klicken Sie in diesem relativ einfaches Beispiel für ein neuronales Netzwerk mit drei Ebenen, nur über 26,506 Gewichtungen und Bias. Dies bedeutet, dass es 26,506 Parameter anpassen, um eine ideale Ausgabe zu erzielen. Für eine ausgezeichnete Visualisierung und
Erläuterung dieser Struktur und die Leistungsfähigkeit dahinter sehen Sie sich die "Was * ist * eines neuronalen Netzwerks? | Deep Learning, Kapitel 1" Video auf YouTube an bit.ly/2RziJVW. Interaktives Experimentieren mit neuronalen Netzwerken, sein möchten, lesen Sie playground.tensorflow.org.

Bedenken Sie, dass ein neuronales Netzwerk mit realen Hunderten oder Tausenden von Neuronen über Hunderte von Schichten aufweisen kann. Es ist diese erhebliche Menge von Parametern, die neuronale Netzwerke bietet ihren unheimliche Fähigkeit zur Durchführung von Aufgaben, die normalerweise über den Funktionsumfang von Computerprogrammen wurden. Alle diese "Knöpfe und wählt" Es ist wenig sich Fragen, wie diese relativ einfach
Strukturen können so viele Aufgaben in Angriff nehmen. Dies ist auch, warum das Trainieren eines neuronalen Netzwerks so viel verarbeitungsleistung erfordert und eignen sich hervorragend für diese Art von massiv parallele Berechnung GPUs.

Erstellen eines neuronalen Netzwerks

Mit der Struktur und Mathematik beschrieben wird ist es Zeit, eines neuronalen Netzwerks zu erstellen. Geben Sie den Code in abbildung2 in eine neue Zelle und führen Sie es. Die Initialisierungsfunktion des neuronalen Netzwerks vereinfacht die Erstellung von mehrstufigen neuronalen Netzwerken.

Abbildung 2: Erstellen eines neuronalen Netzwerks

def initialize_neural_network(num_inputs, num_hidden_layers, 
  num_nodes_hidden, num_nodes_output):
    
  num_nodes_previous = num_inputs # number of nodes in the previous layer

  network = {}
    
  # Loop through each layer and randomly initialize 
  # the weights and biases associated with each layer.
  for layer in range(num_hidden_layers + 1):
        
    if layer == num_hidden_layers:
      layer_name = 'output' 
      num_nodes = num_nodes_output
    else:
      layer_name = 'layer_{}'.format(layer + 1) 
      num_nodes = num_nodes_hidden[layer] 
        
    # Initialize weights and bias for each node.
    network[layer_name] = {}
    for node in range(num_nodes):
      node_name = 'node_{}'.format(node+1)
      network[layer_name][node_name] = {
        'weights': np.around(np.random.uniform(size=num_nodes_previous), 
          decimals=2),
        'bias': np.around(np.random.uniform(size=1), decimals=2),
      }
    
    num_nodes_previous = num_nodes

  return network

Um ein neuronales Netzwerk mit 10 Eingaben, fünf verborgenen Schichten mit jeweils 32 Knoten und zwei Ausgaben zu erstellen, geben Sie den folgenden Code in eine leere Zelle, und führen Sie es aus:

network1 = initialize_neural_network(10, 5, [32, 32, 32, 32, 32], 2)

Um ein Netzwerk zu erstellen, die eine Struktur entsprechend den vorherigen neuronalen Netzwerks beschrieben, um das MNIST-Problem zu beheben, passen Sie die Parameter wie folgt:

mnist_network = initialize_neural_network(784, 2, [32, 32], 10)
print(network1)

Dieser Code erstellt ein neuronales Netzwerk mit 784 Eingabeknoten, zwei verborgene Schichten mit jeweils 32 Knoten und eine Ausgabeebene mit 10 Knoten. Beachten Sie, dass die Ausgabe im JSON-Format werden die Netzwerke angezeigt. Beachten Sie außerdem, dass die Gewichtungen und Bias mit zufälligen Werten initialisiert werden.

Untersuchen das neuronale Netzwerk

Bisher haben die Struktur eines neuronalen Netzwerks, aber nichts damit noch nicht abgeschlossen. Nun erstellen wir eine Eingabe für network1, die über 10 Eingabeknoten verfügt, wie folgt:

from random import seed
np.random.seed(2019)
input_values = np.around(np.random.uniform(size=10), decimals=2)

print('Input values = {}'.format(input_values))

Die Ausgabe wird ein Numpy-Array von 10 zufälligen Werten sein, das als die Eingabewerte für das neuronale Netzwerk fungieren soll. Um die Gewichtungen und Bias für den ersten Knoten der ersten Ebene anzuzeigen, geben Sie anschließend den folgenden Code:

node_weights = network1['layer_1']['node_1']['weights']
node_bias = network1['layer_1']['node_1']['bias']

print(node_weights)
print(node_bias)

Beachten Sie, dass es 10 Werte für die Gewichtungen und einen Wert für die Verschiebung. Geben Sie anschließend den folgenden Code zum Erstellen einer Funktion, die die gewichtete Summe berechnet:

def calculate_weighted_sum(inputs, weights, bias):
  return np.sum(inputs * weights) + bias

Jetzt geben Sie den folgenden Code zum Berechnen und die gewichtete Summe (Z) für diesen Knoten anzuzeigen:

weighted_sum_for_node = calculate_weighted_sum(inputs, node_weights, node_bias)
print('Weighted sum for layer1, node1 = {}'.format(
  np.around(weighted_sum_for_node[0], decimals=2)))

Der zurückgegebene Wert sollte 3.15 sein. Verwenden Sie als Nächstes die Sigmoid_activation-Funktion, um einen Wert für diesen Knoten müssen wie folgt berechnen:

node_output_value  = sigmoid_activation(weighted_sum_for_node)
print('Output value for layer1, node1 = 
  {}'.format(np.around(node_output_value[0], decimals=2)))

Die endgültige Ausgabe-Wert für diesen Knoten ist 0.96. Dies ist der Wert, die für alle Neuronen in der nächsten Ebene übergeben werden.

Gerne experimentieren und durchlaufen jedoch die 5,600 und so die Knoten in diesem Netzwerk. Alternativ können Sie die beschriebenen Schritte wiederholen, für diesen Knoten um einen Eindruck für die schiere Menge von Berechnungen in einem neuronalen Netzwerk zu erhalten. Dies ist eine Aufgabe, die besser programmgesteuert ausgeführt werden. Ich werden dies und wie Sie das Trainieren eines neuronalen Netzwerks in der nächsten Spalte behandelt.

Zusammenfassung

Neuronale Netzwerke führten zu unglaublichen Fortschritte bei der AI und zu schwierig reale Probleme wie z. B. Speech Recognition und Computeranzeige mit großem Erfolg angewendet wurden. Während die Struktur komplex sein können, sind sie relativ einfach Bausteine bestehen. Neuronen sind in Ebenen in einem neuronalen Netzwerk angeordnet, und jedes Neuron Werte übergibt. Eingabewerte daher kaskadiert werden über das gesamte Netzwerk und die Ausgabe zu beeinflussen.

Neuronen selbst sind einfach, und führen Sie grundlegende mathematische Funktionen. Sie sind leistungsstark, wenn diese miteinander verbunden sind. Die reine Anzahl der einstellbare Werte auch in einfache neuronale Netze bietet ein hohes Maß an Kontrolle über die Ausgabe und kann als in Schulungen nützlich erweisen.

Während dieser Artikel konzentriert sich auf die Erstellung einer neuronale Netze in Python, kann nur in einer beliebigen Programmiersprache zum Erstellen eines neuronalen Netzwerks verwendet werden. Beispiele für online Dies wird in JavaScript C#, Java oder eine beliebige Anzahl von modernen Sprachen. Bei Python ideal, jedoch geeignet wird die Verfügbarkeit der weit verbreitete Frameworks, wie z. B. Keras, um die Erstellung von neuronalen Netzwerken zu vereinfachen.


Frank La Vigne arbeitet bei Microsoft als ein KI-Lösungen Technologieexperte, in denen er unterstützt Unternehmen dabei, mehr erreichen, indem Sie ihre Daten mit Analytics und KI optimal. Er ist auch Co-Host des DataDriven-Podcasts. Er bloggt regelmäßig, und Sie können sich ansehen ihm auf seinem YouTube-Kanal "Frank's World TV" (FranksWorld.TV).


Diesen Artikel im MSDN Magazine-Forum diskutieren