GANs mit PyTorch selbst programmieren. Tariq Rashid
Abbildung 1-22: Die Änderungsrate von z bezüglich a über die beiden Pfade durch x und y
Der erste Pfad durch x liefert uns 2 * 2, und der zweite Pfad durch y ergibt 3 * 10a. Somit beträgt die Rate, bei der sich z mit a ändert, 4 + 30a.
Wenn a gleich 2 ist, wird dz/da zu 4 + 30*2 = 64.
Überprüfen wir, ob dies auch so von PyTorch berechnet wird. Zuerst richten wir die Beziehungen so ein, dass PyTorch seinen Berechnungsgraphen erstellen kann.
# Einen einfachen Graphen mit x, y und z einrichten
a = torch.tensor(2.0, requires_grad=True)
b = torch.tensor(1.0, requires_grad=True)
x = 2*a + 3*b
y = 5*a*a + 3*b*b*b
z = 2*x + 3*y
Dann lösen wir die Gradientenberechnungen aus und fragen den Wert im Tensor a ab:
# Gradienten berechnen
z.backward()
# Wert des Gradienten bei a = 2.0
a.grad
Kontrollieren wir, ob PyTorch die Antwort genau so berechnet, wie wir es getan haben (siehe Abbildung 1-23).
Abbildung 1-23: Gradienten berechnen lassen und Wert bei a = 2.0 abrufen
Das tut es!
Praktische neuronale Netze sind im Allgemeinen größer als dieses kleine Netz, doch PyTorch erstellt einen Berechnungsgraphen in genau der gleichen Weise und verwendet die gleiche Methode, den Pfaden rückwärts zu folgen, um die Gradienten zu berechnen.
Vielleicht ist es nicht ganz klar, wie sich das eben Gezeigte zu dem Fehler eines neuronalen Netzes und der Aktualisierung interner Gewichte verhält. Dazu kommen wir jetzt.
Wenn z die Ausgabe eines Netzes ist, wie in unserem einfachen Beispiel oben, und die korrekte Ausgabe t sein sollte, ergibt sich der Fehler E zu (z-t) oder üblicherweise (z-t)2. Dieser Fehler E ist lediglich ein anderer Knoten am Ende des Netzes mit (z-t)2 als Berechnung von z zu E. Er und nicht z ist jetzt effektiv der Ausgabeknoten. PyTorch kann dann den Gradienten der neuen Ausgabe E in Bezug auf die Eingänge zum Netz berechnen.
Wie Neuronale Netze selbst programmieren erläutert hat, verwenden wir dE/dw, wobei w ein Gewicht im Netz ist, um ein neuronales Netz zu trainieren. Wir haben mit dz/da gearbeitet, wobei a ein Eingang und kein Gewicht ist. Stellt das ein Problem dar? Nein, weil wir Gewichte genauso gut als Knoten auffassen können.
Abbildung 1-24 zeigt, wie z sowohl vom Signal aus y als auch vom Gewicht w2 abhängt. Diese Beziehung könnte z = w2 * y sein, was Ihnen von neuronalen Netzen her vertraut sein dürfte.
Abbildung 1-24: Der Ausgang z hängt sowohl vom Signal aus y als auch vom Gewicht w2 ab.
Abbildung 1-24 zeigt, wie dz/dw2 in der gleichen Weise wie dz/dy berechnet werden kann. Und genau wie zuvor können wir dem Pfad von z zurück nach w1 folgen, um zum Beispiel dz/dw1 zu ermitteln.
Was wir hier gesehen haben, ist eine leicht vereinfachte Version dessen, was tatsächlich innerhalb von PyTorch passiert, doch die Kerngedanken sind die gleichen. Wenn wir die Modelle verstehen, die eben besprochen wurden, werden wir in der Lage sein, anspruchsvollere PyTorch-Netze zu erstellen und dabei häufiger erfolgreich zu sein.
Der Code, den wir gerade geschrieben haben, um die Berechnungsgraphen zu erkunden, steht online zur Verfügung:
https://github.com/makeyourownneuralnetwork/gan/blob/master/01_pytorch_computation_graph.ipynb
Doch genug der Theorie, wir wollen nun mit PyTorch ein nützliches neuronales Netz erzeugen.
Lernziele
Google ermöglicht uns mit Colab, Python-Code auf seinen Computern auszuführen. Colab verwendet Python-Notebooks, sodass wir nur einen Webbrowser brauchen.
PyTorch ist ein führendes Python-Framework für maschinelles Lernen. Ähnlich wie NumPy erlaubt es uns, mit Arrays von Zahlen zu arbeiten. Zudem bietet es eine umfangreiche Bibliothek komfortabler Tools und Funktionen, die maschinelles Lernen erleichtern.
Die Grundeinheiten der Daten in PyTorch heißen Tensoren. Das können mehrdimensionale Arrays, einfache zweidimensionale Tabellen, eindimensionale Listen oder sogar einzelne Werte sein.
Das wichtigste Merkmal von PyTorch ist die Fähigkeit, automatisch die Gradienten für die von uns definierten Funktionen zu ermitteln. Die Berechnung der Gradienten ist für das Training neuronaler Netze unerlässlich. Hierfür erstellt PyTorch einen Berechnungsgraphen von Tensoren und ihren Beziehungen zu anderen Tensoren. Das geschieht transparent, wenn wir in unserem Code definieren, wie ein Tensor aus einem anderen berechnet wird.
Конец ознакомительного фрагмента.
Текст предоставлен ООО «ЛитРес».
Прочитайте эту книгу целиком, купив полную легальную версию на ЛитРес.
Безопасно оплатить книгу можно банковской картой Visa, MasterCard, Maestro, со счета мобильного телефона, с платежного терминала, в салоне МТС или Связной, через PayPal, WebMoney, Яндекс.Деньги, QIWI Кошелек, бонусными картами или другим удобным Вам способом.