Machine Learning für Softwareentwickler. Paolo Perrotta

Чтение книги онлайн.

Читать онлайн книгу Machine Learning für Softwareentwickler - Paolo Perrotta страница 17

Автор:
Серия:
Издательство:
Machine Learning für Softwareentwickler - Paolo Perrotta

Скачать книгу

98 => Loss: 69.1209628275

      Iteration 99 => Loss: 69.1209628275

      w=1.8436928702

      Wie beabsichtigt wird der Verlust mit jedem Durchlauf geringer. Nach 100 Iterationen kommt das Verfahren dem Minimum so nahe, dass wir schon keinen Unterschied mehr zwischen den beiden letzten Verlustwerten erkennen können. Unser Algorithmus scheint seine Aufgabe wie erwartet zu erfüllen.

      Aber halt – wir haben ja nur den Parameter w verwendet! Was passiert, wenn wir b wieder mit ins Spiel nehmen?

      Sehen wir uns die Verlustfunktion noch einmal in der mathematischen Schreibweise an:

image

      Bis jetzt haben wir bis auf w alle Werte in dieser Formel als Konstanten behandelt. Vor allem haben wir b auf 0 festgelegt. Wenn wir b wieder zu einer Variablen machen, dann ist der Verlust keine zweidimensionale Kurve mehr, sondern eine Oberfläche:

image

      Jetzt lebt unsere Wanderin nicht mehr im Plattland, sondern kann sich in drei Dimensionen bewegen. Die Werte von w und b bilden die beiden horizontalen Achsen und die Werte des Verlusts die vertikale. Anders ausgedrückt steht jeder Punkt auf dieser Oberfläche für den Fehler in einer Geraden unseres Modells. Wir wollen nun die Gerade mit dem geringsten Fehler finden: den mit dem Kreuz markierten Punkt.

      Auch wenn der Verlust jetzt eine Oberfläche ist, können wir das Minimum immer noch mit dem Gradientenverfahren erreichen, wobei wir allerdings den Gradienten einer Funktion mit mehreren Variablen berechnen müssen. Das können wir mit der Technik der partiellen Ableitung erreichen.

      Was ist eine partielle Ableitung, und wie kann sie uns weiterhelfen? Stellen Sie sich vor, dass Sie die Funktion mit einem Samuraischwert aufschlitzen und dann die Ableitung des Schlitzes berechnen. (Es muss kein Samuraischwert sein, aber damit sieht es besonders cool aus.) Beispielsweise haben wir bisher b auf 0 festgelegt und den Verlust damit wie folgt aufgeschlitzt:

image

      Dieser Schlitz ist genau die Verlustkurve, die wir bei der ersten Anwendung des Gradientenverfahrens behandelt haben. Sie sieht hier ein bisschen flachgedrückt aus, da ich andere Intervalle und Maßstäbe für die Achsen verwendet habe, aber es ist genau dieselbe Funktion. Für jeden Wert von b gibt es eine solche Kurve, deren einzige Variable w ist. Ebenso gibt es aber auch für jeden Wert von w eine Kurve mit der Variablen b. Für w = 0 sieht sie wie folgt aus:

image

      Für jeden dieser eindimensionalen »Schlitze« können wir den Gradienten berechnen, wie wir es bei unserer ursprünglichen Kurve getan haben. Das Schöne daran ist, dass wir die Gradienten dieser Schlitze kombinieren können, um die Gradienten der Oberfläche zu erhalten, wie die folgende Abbildung zeigt:

image

      Mithilfe von partiellen Ableitungen können wir unser Problem mit zwei Variablen in zwei Probleme mit einer Variablen aufteilen. Wir brauchen also keinen neuen Algorithmus, um das Gradientenverfahren auf einer Oberfläche anzuwenden, sondern können diese Oberfläche einfach mithilfe partieller Ableitungen aufteilen und auf jedem Teil unser bisheriges Verfahren nutzen.

       Mathematischer Hintergrund: Ableitungen und Analysis

      Der Zweig der Mathematik, der sich mit Gradienten, Ableitungen und partiellen Ableitungen beschäftigt, ist die Analysis. Wenn Sie sich intensiver damit beschäftigen wollen, werfen Sie einen Blick auf die Khan Academy.1 Auch zu diesem Thema finden Sie dort weit mehr Informationen, als Sie zum Verständnis dieses Buchs benötigen.

      Um die partiellen Ableitungen konkret zu berechnen, leiten Sie die Funktion jeweils nach einer der Variablen ab (in unserem Fall also w oder b) und tun dabei so, als ob dies die einzige Variable in der Funktion und jeder andere Wert konstant wäre. Die Hälfte dieser Arbeit haben wir bereits erledigt, als wir b auf 0 gesetzt und L nach w abgeleitet haben:

image

      Jetzt müssen wir das Gleiche noch einmal tun, dabei aber w als Konstante betrachten und L nach b ableiten. Wenn Sie mit Analysis vertraut sind, können Sie sich selbst daran versuchen. Ansonsten finden Sie das Ergebnis hier:

image

      Wie funktioniert das Gradientenverfahren nun auf einer zweidimensionalen Verlustfläche? Unsere Wanderin steht an einem Punkt mit einem gegebenen Wert von w und b und hat die Formeln für die Berechnung der partiellen Ableitung von L nach w und b. Sie gibt die aktuellen Werte von w und b in diese Formeln ein und erhält dadurch einen Gradienten für jede Variable. Anschließend wendet sie das Gradientenverfahren auf beide Gradienten an – und schon kann sie dem Gradienten der Oberfläche folgend absteigen.

      Das reicht erst einmal an Mathematik für dieses Kapitel. Jetzt wollen wir den Algorithmus in Code umsetzen.

      In der Version mit zwei Variablen sieht unser Code für das Gradientenverfahren wie folgt aus, wobei die geänderten Zeilen wiederum durch kleine Pfeile gekennzeichnet sind:

       03_gradient/gradient_descent_final.py

       import numpy as np

      def predict(X, w, b):

      return X * w + b

      def loss(X, Y, w, b):

      return np.average((predict(X, w, b) - Y) ** 2)

      def gradient(X, Y, w, b): <

      w_gradient = 2 * np.average(X * (predict(X, w, b) - Y)) <

      b_gradient = 2 * np.average(predict(X, w, b) - Y) <

      return (w_gradient, b_gradient) <

      def train(X, Y, iterations, lr):

      w = b = 0 <

      for i in range(iterations):

      print("Iteration %4d => Loss: %.10f" % (i, loss(X, Y, w, b))) <

      w_gradient, b_gradient = gradient(X, Y, w, b) <

      w -= w_gradient * lr <

      b -= b_gradient * lr <

      return w, b <

      X, Y = np.loadtxt("pizza.txt", skiprows=1, unpack=True)

      w, b

Скачать книгу