Lerninhalte finden
Features
Entdecke
© StudySmarter 2024, all rights reserved.
Backpropagation und Gradient AbstiegBackpropagation: Fehlerrückführung in mehrschichtigen Neuronalen Netzen zur Anpassung der Gewichte. Gradient Abstieg: Optimierungsverfahren zur Minimierung der Kostenfunktion.
(a) Gegeben sei ein einfaches neuronales Netzwerk mit einer Eingabeschicht, einer versteckten Schicht und einer Ausgabeschicht. Die Aktivierungsfunktion sei die Sigmoidfunktion: \( \sigma(z) = \frac{1}{1 + e^{-z}} \). Leite die Gleichungen für die Vorwärtsphase her, wobei die Eingabe \( x \), die Gewichte \( w^{(1)} \) und \( w^{(2)} \), sowie die Zwischen- und Ausgabewerte berücksichtigt werden.
Lösung:
Gegeben sei ein neuronales Netzwerk mit folgenden Schichten und Gewichten:
Die Aktivierungsfunktion ist die Sigmoidfunktion:
\[ \sigma(z) = \frac{1}{1 + e^{-z}} \]
Wir leiten nun die Gleichungen für die Vorwärtsphase her:
Fassen wir diese Schritte zusammen:
\[ z^{(1)} = w^{(1)} \times x \]
\[ a^{(1)} = \sigma(z^{(1)}) \]
\[ z^{(2)} = w^{(2)} \times a^{(1)} \]
\[ y_{\text{netz}} = \sigma(z^{(2)}) \]
(b) Beschreibe die Rückwärtsphase des obigen Netzwerks, indem Du die Gradienten der Fehlerfunktion bezüglich der Gewichte \( w^{(1)} \) und \( w^{(2)} \) herleitest. Nutze dabei die Kettenregel und die Definition der Ableitungen der Sigmoidfunktion: \( \sigma'(z) = \sigma(z)(1 - \sigma(z)) \).
Lösung:
In der Rückwärtsphase berechnen wir die Gradienten der Fehlerfunktion bezüglich der Gewichte \(w^{(1)}\) und \(w^{(2)}\). Wir nutzen dabei die Kettenregel und die Definition der Ableitungen der Sigmoidfunktion:
\[ \sigma'(z) = \sigma(z)(1 - \sigma(z)) \]
Sei \(J\) die Kostenfunktion des neuronalen Netzes und \(y\_true\) der wahre Wert der Zielgröße. Zuerst berechnen wir den Fehler in der Ausgabeschicht.
Der Gradient der Kostenfunktion bezüglich der Aktivierung der Ausgabeschicht \(a^{(2)} = y_{\text{netz}}\) ist:
\[ \delta^{(2)} = \frac{\partial J}{\partial a^{(2)}} = y_{\text{netz}} - y\_true \]
Wir nutzen die Kettenregel:
\[ \frac{\partial J}{\partial w^{(2)}} = \delta^{(2)} \cdot \frac{\partial a^{(2)}}{\partial w^{(2)}} = \delta^{(2)} \cdot a^{(1)} \]
Der Fehler in der versteckten Schicht beruht auf dem Fehler der Ausgabeschicht, multipliziert mit den Gewichten \(w^{(2)}\):
\[ \delta^{(1)} = \left( w^{(2)} \cdot \delta^{(2)} \right) \cdot \sigma'(z^{(1)}) \]
Da \( \sigma'(z^{(1)}) = \sigma(z^{(1)})(1 - \sigma(z^{(1)}))\) und \(a^{(1)} = \sigma(z^{(1)})\), ist:
\[ \delta^{(1)} = \left( w^{(2)} \cdot \delta^{(2)} \right) \cdot a^{(1)}(1 - a^{(1)}) \]
Wir nutzen wieder die Kettenregel:
\[ \frac{\partial J}{\partial w^{(1)}} = \delta^{(1)} \cdot \frac{\partial a^{(1)}}{\partial w^{(1)}} = \delta^{(1)} \times x \]
Zusammenfassend ergibt sich:
\[ \frac{\partial J}{\partial w^{(2)}} = \delta^{(2)} \cdot a^{(1)} = (y_{\text{netz}} - y\_true) \cdot a^{(1)} \]
\[ \frac{\partial J}{\partial w^{(1)}} = \delta^{(1)} \cdot x = \left( w^{(2)} \cdot (y_{\text{netz}} - y\_true) \cdot a^{(1)}(1 - a^{(1)}) \right) \cdot x \]
(c) Implementiere die Rückwärtsphase des neuronalen Netzwerks in Python. Beachte dabei die Berechnung der Gradienten und die anschließende Aktualisierung der Gewichte durch Gradient Abstieg. Gehe davon aus, dass die Lernrate \( \eta \) gegeben ist.
Lösung:
Im Folgenden implementieren wir die Rückwärtsphase für ein einfaches neuronales Netzwerk mit einer Eingabeschicht, einer versteckten Schicht und einer Ausgabeschicht in Python. Wir berechnen die Gradienten und aktualisieren die Gewichte durch Gradient Abstieg.
import numpy as npdef sigmoid(z): return 1 / (1 + np.exp(-z))def sigmoid_derivative(z): return sigmoid(z) * (1 - sigmoid(z))# Vorwärtsphase des Netzwerksdef forward_pass(x, w1, w2): z1 = np.dot(w1, x) a1 = sigmoid(z1) z2 = np.dot(w2, a1) y_hat = sigmoid(z2) return z1, a1, z2, y_hat# Rückwärtsphase des Netzwerksdef backward_pass(x, y, w1, w2, z1, a1, z2, y_hat, eta): # Fehler in der Ausgabeschicht delta2 = y_hat - y d_w2 = np.dot(delta2, a1.T) # Fehler in der versteckten Schicht delta1 = np.dot(w2.T, delta2) * sigmoid_derivative(z1) d_w1 = np.dot(delta1, x.T) # Gewichte aktualisieren w2 -= eta * d_w2 w1 -= eta * d_w1 return w1, w2# Beispiel: Eingabe, Gewichte, Lernratex = np.array([[0.5], [0.1]])w1 = np.random.rand(2, 2)w2 = np.random.rand(1, 2)y = np.array([[1]])eta = 0.01# Vorwärtsphasez1, a1, z2, y_hat = forward_pass(x, w1, w2)print('Vorhersage:', y_hat)# Rückwärtsphase und Gewichtsaktualisierungw1, w2 = backward_pass(x, y, w1, w2, z1, a1, z2, y_hat, eta)print('Aktualisierte Gewichte w1:', w1)print('Aktualisierte Gewichte w2:', w2)
In diesem Python-Code implementieren wir wie gefordert die Rückwärtsphase. Zuerst wird die Vorhersage des Netzwerks durch die Vorwärtsphase berechnet. Dann werden die Gradienten anhand der Fehler in der Ausgabeschicht und versteckten Schicht berechnet und die Gewichte werden entsprechend durch Gradient Abstieg aktualisiert.
(d) Diskutiere die Auswirkungen der Wahl der Lernrate \( \eta \) auf den Trainingsprozess. Was passiert, wenn \( \eta \) zu groß oder zu klein ist? Welche Maßnahmen kann man ergreifen, um die Wahl der Lernrate zu optimieren?
Lösung:
Aktivierungsfunktionen und ihre EigenschaftenAktivierungsfunktionen wie ReLU, Sigmoid und Tanh werden in künstlichen neuronalen Netzen verwendet, um Nichtlinearitäten einzuführen, die helfen, komplexe Muster zu modellieren. Drei Haupttypen von Aktivierungsfunktionen sind:
(a) Graphische Darstellung:Zeichne die Graphen der Aktivierungsfunktionen ReLU, Sigmoid und Tanh. Beschrifte die Achsen korrekt, und markiere besondere Punkte, zum Beispiel Schnittpunkte mit den Achsen und Asymptoten. Begründe kurz, wie diese Graphen die jeweiligen Eigenschaften der Funktionen reflektieren.
Lösung:
(a) Graphische Darstellung:Um die Graphen der Aktivierungsfunktionen ReLU, Sigmoid und Tanh zu zeichnen und ihre Eigenschaften zu analysieren, kannst Du das folgende Python-Skript verwenden. Es nutzt die Bibliothek `matplotlib` zur Darstellung der Funktionen.Benötigte Bibliothek zur Installation:
'pip install matplotlib'Hier ist der Python-Code zum Zeichnen der Grafiken:
import numpy as npimport matplotlib.pyplot as pltx = np.linspace(-10, 10, 400)relu = np.maximum(0, x)sigmoid = 1 / (1 + np.exp(-x))tanh = np.tanh(x)plt.figure(figsize=(12, 8))# ReLU Aktivierungsfunktionplt.subplot(3, 1, 1)plt.plot(x, relu, label='ReLU')plt.title('ReLU Aktivierungsfunktion')plt.axhline(0, color='black', linewidth=0.5)plt.axvline(0, color='black', linewidth=0.5)plt.grid(True)plt.legend()# Sigmoid Aktivierungsfunktionplt.subplot(3, 1, 2)plt.plot(x, sigmoid, label='Sigmoid', color='orange')plt.title('Sigmoid Aktivierungsfunktion')plt.axhline(0, color='black', linewidth=0.5)plt.axvline(0, color='black', linewidth=0.5)plt.grid(True)plt.legend()# Tanh Aktivierungsfunktionplt.subplot(3, 1, 3)plt.plot(x, tanh, label='Tanh', color='green')plt.title('Tanh Aktivierungsfunktion')plt.axhline(0, color='black', linewidth=0.5)plt.axvline(0, color='black', linewidth=0.5)plt.grid(True)plt.legend()plt.tight_layout()plt.show()
Erklärung:Du hast einen Datensatz von einem klinischen Forschungsprojekt erhalten, das sich auf die Diagnose bestimmter Herzkrankheiten konzentriert. Der Datensatz enthält zahlreiche Attribute, darunter Alter, Geschlecht, Cholesterinwerte, Blutdruck, und Diagnoseberichte. Es sind jedoch einige Daten unvollständig oder fehlerhaft. Um die Daten in ein nutzbares Format für maschinelles Lernen vorzubereiten, musst Du verschiedene Techniken zur Datenvorverarbeitung anwenden.
Fehlende Werte: Im Datensatz fehlen die Cholesterinwerte für einige Patienten. Beschreibe die verschiedenen Strategien, die Du anwenden kannst, um mit den fehlenden Werten umzugehen und diskutiere deren Vor- und Nachteile.
Lösung:
Umgang mit fehlenden Cholesterinwerten:Es gibt verschiedene Strategien, um mit fehlenden Cholesterinwerten in einem Datensatz umzugehen. Hier sind einige der gängigsten Methoden, zusammen mit ihren Vor- und Nachteilen:
Outlier-Entfernung: Einige der Blutdruckwerte scheinen außergewöhnlich hoch oder niedrig zu sein. Wende die IQR-Methode an, um die Outlier zu identifizieren und zu entfernen. Zeige die relevanten Berechnungen und bespreche die Ergebnisse.
Lösung:
Outlier-Entfernung mittels der IQR-Methode:Die Interquartilsabstand-Methode (IQR-Methode) ist eine effektive Technik zur Identifizierung und Entfernung von Ausreißern aus einem Datensatz. Hier sind die Schritte zur Anwendung der IQR-Methode auf die Blutdruckwerte, um Ausreißer zu identifizieren und zu entfernen:
Q1 = 25. Perzentil der BlutdruckwerteQ3 = 75. Perzentil der BlutdruckwerteIQR = Q3 - Q1
Untere Grenze = Q1 - 1,5 * IQRObere Grenze = Q3 + 1,5 * IQR
[80, 85, 90, 92, 93, 95, 96, 100, 102, 104, 105, 110, 115, 120, 125, 130]
Feature Engineering: Entwickle mindestens zwei neue Merkmale basierend auf den vorhandenen Attributen im Datensatz, die potenziell die Diagnosemodelle verbessern könnten. Beschreibe die neuen Merkmale und erkläre ihre Relevanz für die Diagnose der Herzkrankheiten.
Lösung:
Feature Engineering:Feature Engineering ist ein entscheidender Schritt in der Datenvorverarbeitung, der beinhaltet, neue Merkmale aus vorhandenen Attributen zu erstellen, um die Leistung von maschinellen Lernmodellen zu verbessern. Hier sind zwei neue Merkmale, die aus den vorhandenen Attributen im Datensatz erstellt werden könnten, um die Diagnosemodelle für Herzkrankheiten zu verbessern:
datensatz['Cholesterin_Alter_Verh'] = datensatz['Cholesterin'] / datensatz['Alter']
def blutdruck_kategorie(systolisch, diastolisch): if systolisch <= 120 and diastolisch <= 80: return 'Normal' elif 120 < systolisch < 130 and diastolisch < 80: return 'Erhöht' elif systolisch >= 130 or diastolisch >= 80: return 'Hoch' else: return 'Indeterminiert'datensatz['Blutdruckkategorie'] = datensatz.apply(lambda row: blutdruck_kategorie(row['Systolisch'], row['Diastolisch']), axis=1)
Du arbeitest bei einem Datenanalyse-Unternehmen, das Daten von verschiedenen Kunden untersucht. Deine Aufgabe ist es, eine Stichprobe von 50 Datenpunkten einer Kundendatei sowohl deskriptiv als auch inferenziell zu analysieren. Die Daten enthalten Messungen eines Attributs, welches als kontinuierliche Variable behandelt werden kann.
Berechne die deskriptiven Kennzahlen der Stichprobe. Dazu gehören der Mittelwert (\(\bar{x}\)), der Median, die Varianz (\(\text{Var}(X)\)) und die Standardabweichung (\(\text{std}(X)\)).
Lösung:
Um die deskriptiven Kennzahlen für eine Stichprobe von 50 Datenpunkten zu berechnen, folgen wir diesen Schritten:
\[\bar{x} = \frac{1}{n} \sum_{i=1}^{n} x_i\]
\[\text{Var}(X) = \frac{1}{n-1} \sum_{i=1}^{n} (x_i - \bar{x})^2\]
\[\text{std}(X) = \sqrt{\text{Var}(X)}\]
Angenommen, wir haben die folgende Stichprobe von 50 Datenpunkten:
sample_data = [value1, value2, value3, ..., value50]
Wir berechnen die Kennzahlen Schritt für Schritt:
mean = sum(sample_data) / len(sample_data)
sorted_data = sorted(sample_data) if len(sorted_data) % 2 == 0: median = (sorted_data[len(sorted_data) // 2 - 1] + sorted_data[len(sorted_data) // 2]) / 2 else: median = sorted_data[len(sorted_data) // 2]
var = sum((x - mean) ** 2 for x in sample_data) / (len(sample_data) - 1)
std_dev = var ** 0.5
Damit haben wir die deskriptiven Kennzahlen für die Stichprobe berechnet.
Erstelle jeweils ein Histogramm und einen Boxplot, um die Verteilung der Stichprobe grafisch darzustellen. Interpretier die Ergebnisse und beschreibe, welche Informationen du aus diesen Diagrammen entnehmen kannst.
Lösung:
Um die Verteilung einer Stichprobe von 50 Datenpunkten grafisch darzustellen, erstellen wir ein Histogramm und einen Boxplot. Beide Diagrammtypen bieten wertvolle Einblicke in die Datenverteilung.
Beispielhafte Schritte zur Erstellung eines Histogramms in Python:
import matplotlib.pyplot as plt sample_data = [value1, value2, value3, ..., value50] plt.hist(sample_data, bins=10, edgecolor='black') plt.title('Histogramm der Stichprobe') plt.xlabel('Werte') plt.ylabel('Häufigkeit') plt.show()
Beispielhafte Schritte zur Erstellung eines Boxplots in Python:
import matplotlib.pyplot as plt sample_data = [value1, value2, value3, ..., value50] plt.boxplot(sample_data, vert=False) plt.title('Boxplot der Stichprobe') plt.xlabel('Werte') plt.show()
Interpretation der Ergebnisse:
Zusammengefasst bieten Histogramme und Boxplots eine visuelle Methode zur Untersuchung der Verteilung und Variabilität der Daten. Sie ergänzen die deskriptiven Kennzahlen und helfen, ein tieferes Verständnis für die Stichprobe zu entwickeln.
Bestimme das 95%-Konfidenzintervall für den Mittelwert der Grundgesamtheit basierend auf deiner Stichprobe. Erkläre die Bedeutung des Konfidenzintervalls im Kontext deiner Analyse.
Lösung:
Um das 95%-Konfidenzintervall für den Mittelwert der Grundgesamtheit basierend auf Deiner Stichprobe zu berechnen, folge diesen Schritten:
SE = \frac{s}{\sqrt{n}}
\bar{x} \pm t^* \times SE
Beispiel: Angenommen, wir haben eine Stichprobe von 50 Datenpunkten:
import numpy as np from scipy import stats # Annahme, unsere Stichprobe sample_data = [value1, value2, ..., value50] # Berechne deskriptive Kennzahlen mean = np.mean(sample_data) std_dev = np.std(sample_data, ddof=1) n = len(sample_data) # Standardfehler SE = std_dev / np.sqrt(n) # Kritischer t-Wert für 95% Konfidenzintervall und Freiheitsgrade t_critical = stats.t.ppf(0.975, df=n-1) # Berechne die Konfidenzintervallgrenzen margin_of_error = t_critical * SE confidence_interval = (mean - margin_of_error, mean + margin_of_error) print(f'95%-Konfidenzintervall: {confidence_interval}')
Erklärung des Konfidenzintervalls:
Mit unserer kostenlosen Lernplattform erhältst du Zugang zu Millionen von Dokumenten, Karteikarten und Unterlagen.
Kostenloses Konto erstellenDu hast bereits ein Konto? Anmelden