Files
DSAI/06_NN/code/nn_2_mlp_activation_fct.ipynb
2026-01-16 16:53:19 +01:00

1582 lines
188 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"id": "3892507e",
"metadata": {},
"source": [
"<div style=\"\n",
" border: 2px solid #4CAF50; \n",
" padding: 15px; \n",
" background-color: #f4f4f4; \n",
" border-radius: 10px; \n",
" align-items: center;\">\n",
"\n",
"<h1 style=\"margin: 0; color: #4CAF50;\">Neural Networks: Feed Forward Neural Networks (MLP)</h1>\n",
"<h2 style=\"margin: 5px 0; color: #555;\">DSAI</h2>\n",
"<h3 style=\"margin: 5px 0; color: #555;\">Jakob Eggl</h3>\n",
"\n",
"<div style=\"flex-shrink: 0;\">\n",
" <img src=\"https://www.htl-grieskirchen.at/wp/wp-content/uploads/2022/11/logo_bildschirm-1024x503.png\" alt=\"Logo\" style=\"width: 250px; height: auto;\"/>\n",
"</div>\n",
"<p1> © 2025/26 Jakob Eggl. Nutzung oder Verbreitung nur mit ausdrücklicher Genehmigung des Autors.</p1>\n",
"</div>\n",
"<div style=\"flex: 1;\">\n",
"</div> "
]
},
{
"cell_type": "markdown",
"id": "e88622c2",
"metadata": {},
"source": [
"## Wiederholung Lineare Regression"
]
},
{
"cell_type": "markdown",
"id": "58948c41",
"metadata": {},
"source": [
"Wir haben am Ende vom letzten Notebook selber eine lineare Regression programmiert. Wir wiederholen kurz die wichtigsten Punkte:\n",
"\n",
"Im eindimensionalen Fall haben wir als Input unsere $Z$ Datenpaare $\\{(x_i,y_i)\\}_{i=1}^{Z}$, wobei jedes $x_i\\in\\mathbb R$ das (einzige) Input Feature ist und $y_i\\in\\mathbb R$ der dazugehörige Output (Label). Ziel ist es $k,d\\in\\mathbb R$ zu finden, sodass ein vorgegebener Fehler (zum Beispiel Mean Squared Error) für unser gefundenes Modell\n",
"$$\\hat f(x) = k\\cdot x + d$$\n",
"klein ist.\n",
"\n",
"Im mehrdimensionalen ist die Idee gleich, wir sprechen auch hier noch von einer **Linearen Regression**. Das Modell ist in diesem Fall dann\n",
"$$\\hat f(X) = WX+b$$\n",
"und wir suchen diesmal eine Matrix $W$ (in diesem Fall ein Vektor, weil der Output eine Zahl ist) und einen Vektor $b$ (auch hier kein Vektor sondern eine Zahl, weil Output ein Vektor ist). Hier entspricht $W$ quasi unserem $k$ von vorher und $b$ unserem $d$.\n",
"\n",
"**Hinweis:** In diesem Fall sind unsere Daten eine Matrix (quasi wie das Dataframe, bestehend aus $Z$ Zeilen und $d$ Spalten). Jede Zeile repräsentiert ein $x_i$ und ist dann ein Vektor bestehend aus den $d$ (Dimension) reellen Zahlen (**=Features**) $x_{i1}, x_{i2}, \\ldots, x_{id}$."
]
},
{
"cell_type": "markdown",
"id": "4753462a",
"metadata": {},
"source": [
"**WICHTIG:** Lineare Regression ist offensichtlich ein *Supervised Machine Learning* Problem. Wir werden uns im folgenden (für Neuronale Netzwerke) hauptsächlich mit Supervised Machine Learning beschäftigen. Sprich wir haben immer das Label $y$ gegeben. Dies kann eine (oder mehrere) Klasse(n) sein, oder auch in der Form von Zahlenwerten gegeben sein."
]
},
{
"cell_type": "markdown",
"id": "923fc2f0",
"metadata": {},
"source": [
"## Das Perzeptron"
]
},
{
"cell_type": "markdown",
"id": "4bd3ee69",
"metadata": {},
"source": [
"Die mehrdimensionale, lineare Regression ist auch die Grundidee des sogenannten **Perzeptrons**, erfunden von *Frank Rosenblatt* im Jahr 1957.\n",
"\n",
"Das folgende Bild zeigt den (leicht modifizierten) Aufbau eines einzigen Perzeptrons. Wir sehen, der Output $z$ ist nichts anderes als wie bei uns $\\hat f (x)$ bzw. $\\hat f (X)$."
]
},
{
"cell_type": "markdown",
"id": "7b90c5d2",
"metadata": {},
"source": [
"![Perzeptron_Zugeschnitten](../resources/Perzeptron_zugeschnitten.png)\n",
"\n",
"(von https://www.mql5.com/de/articles/8908)"
]
},
{
"cell_type": "markdown",
"id": "268cdb1e",
"metadata": {},
"source": [
"Es gilt also:\n",
"\n",
"\\begin{align*}\n",
" z &= w_1 \\cdot x_1 + w_2 \\cdot x_2 + \\ldots + w_N \\cdot x_N + b\\\\\n",
" &= \\underbrace{\\begin{pmatrix}\n",
" w_1 & w_2 & \\ldots & w_N\n",
" \\end{pmatrix}}_{=W}\\cdot \n",
" \\underbrace{\\begin{pmatrix}\n",
" x_1 \\\\ x_2 \\\\ \\vdots \\\\ x_N\n",
" \\end{pmatrix}}_{=X} + b\n",
"\\end{align*}"
]
},
{
"cell_type": "markdown",
"id": "e2f9463e",
"metadata": {},
"source": [
"**Wichtig:** Wie bereits vorher erwähnt, wird im obigen Bild und jetzt generell immer nur ein Datenpunkt betrachtet, also zum Beispiel beim Iris Dataset eine bestimmte Blume mit den Eigenschaften $x_1, x_2, x_3, x_4$ (die 4 Längen). Ansonsten bräuchten wir eine Doppel-Indizierung ($x_{ij}$). "
]
},
{
"cell_type": "markdown",
"id": "efba0b54",
"metadata": {},
"source": [
"Den Bias können wir auch in der Weight-Matrix $W$ verstecken:\n",
"\n",
"$$z = w_1 \\cdot x_1 + w_2 \\cdot x_2 + \\ldots + w_N \\cdot x_N + b = \\begin{pmatrix}\n",
" w_1 & w_2 & \\ldots & w_N\n",
" \\end{pmatrix}\\cdot \n",
" \\begin{pmatrix}\n",
" x_1 \\\\ x_2 \\\\ \\vdots \\\\ x_N\n",
" \\end{pmatrix} + b = \\begin{pmatrix}\n",
" w_1 & w_2 & \\ldots & w_N & b\n",
" \\end{pmatrix}\\cdot \n",
" \\begin{pmatrix}\n",
" x_1 \\\\ x_2 \\\\ \\vdots \\\\ x_N \\\\ 1\n",
" \\end{pmatrix}.$$"
]
},
{
"cell_type": "markdown",
"id": "839c3d56",
"metadata": {},
"source": [
"### Notation:"
]
},
{
"cell_type": "markdown",
"id": "cb6aea6b",
"metadata": {},
"source": [
"* Wir nennen ab jetzt die Parametermatrix $W$ **Weights**\n",
"* Die Matrix $X$ ist unser **Input**\n",
"* $b$ ist der **Bias**"
]
},
{
"cell_type": "markdown",
"id": "d95b54c3",
"metadata": {},
"source": [
"## Vom Perzeptron zum Linearen Layer"
]
},
{
"cell_type": "markdown",
"id": "028728cb",
"metadata": {},
"source": [
"*Aber wie hängt das jetzt mit Künstlicher Intelligenz bzw. mit Neuronalen Netzwerken zusammen?*"
]
},
{
"cell_type": "markdown",
"id": "10c2e160",
"metadata": {},
"source": [
"Wir werden jetzt unser Perzeptron immer weiter verallgemeinern und schlussendlich beim **Multi-Layer Perzeptron** (*MLP*) landen. Dieses ist bei einem normalen Feed-Forward Neural Network der Standard und bildet quasi schon ein vollständiges *neuronales Netzwerk*!"
]
},
{
"cell_type": "markdown",
"id": "5abc25b1",
"metadata": {},
"source": [
"Der erste Schritt dazu ist, dass wir nun mehrerere Perzeptrons nebeneinander verwenden können, falls wir mehrere Werte am Ausgang haben wollen.\n",
"\n",
"Was wäre ein möglicher Anwendungsfall? (Wir werden später sehen, warum das Sinn macht)"
]
},
{
"cell_type": "markdown",
"id": "16be11d4",
"metadata": {},
"source": [
"In so einem Fall sieht dann unser Aufbau folgendermaßen aus."
]
},
{
"cell_type": "markdown",
"id": "122c0b2c",
"metadata": {},
"source": [
"![Single_Layer_Perceptron](../resources/single_layer_perceptron.jpg)\n",
"\n",
"(von https://www.upgrad.com/blog/perceptron-learning-algorithm-how-it-works/)"
]
},
{
"cell_type": "markdown",
"id": "ae6ba41c",
"metadata": {},
"source": [
"Sprich wir haben hier einfach 3 (rote) Perzeptrons nebeneinander, welche jeweils 5 Input-Features (blau) verarbeiten. Dabei hat jedes Perzeptron seine eigenen Gewichte und Bias. Die Outputs in rot lassen sich dann so berechnen:"
]
},
{
"cell_type": "markdown",
"id": "e75fe14b",
"metadata": {},
"source": [
"\\begin{align*}\n",
" z_1 &= W_1X+b_1 \\\\\n",
" z_2 &= W_2X+b_2 \\\\\n",
" z_3 &= W_3X+b_3\n",
"\\end{align*}"
]
},
{
"cell_type": "markdown",
"id": "a89a45aa",
"metadata": {},
"source": [
"Dies können wir aber auch in Vektorschreibweise schreiben mit $\\mathbf z = (z_1, z_2, z_3)$ und $\\mathbf W = (W_1, W_2, W_3)$ und $\\mathbf b = (b_1, b_2, b_3)$. Wir erhalten dann\n",
"\n",
"$$\\mathbf z = \\mathbf W \\mathbf x + \\mathbf b.$$"
]
},
{
"cell_type": "markdown",
"id": "8b30c234",
"metadata": {},
"source": [
"Hier ist nochmal dargestellt, wie das ganze in Matrix schreibweise aussieht für ein ähnliches Problem.\n",
"\n",
"![MLP_Matrix_Multiplication](../resources/mlp_matrix_mul.png)\n",
"\n",
"(von https://community.deeplearning.ai/t/matrix-multiplication-in-neural-network/685083)"
]
},
{
"cell_type": "markdown",
"id": "ba403835",
"metadata": {},
"source": [
"**Hinweis:** Auch hier könnten wir den Bias wieder verstecken in der Weight-Matrix, ist aber erneut wieder nur eine rein optische Änderung."
]
},
{
"cell_type": "markdown",
"id": "64580d7c",
"metadata": {},
"source": [
"Wir sehen im obigen Bild auch, dass die Perzeptrons hier **Neuronen** genannt werden. Um zu verstehen, warum das Sinn macht, sehen wir uns folgende Grafik an."
]
},
{
"cell_type": "markdown",
"id": "7f2ba829",
"metadata": {},
"source": [
"![Biological_vs_Artificial_Neuron](../resources/Biological_Neuron_vs_Artificial_Neuron.png)\n",
"\n",
"(von https://towardsdatascience.com/the-concept-of-artificial-neurons-perceptrons-in-neural-networks-fab22249cbfc/)"
]
},
{
"cell_type": "markdown",
"id": "57662646",
"metadata": {},
"source": [
"Unser *Perzeptron* ist also ein Konstrukt, dass dem biologischen Neuron ähneln soll.\n",
"\n",
"Wir sehen, dass rechts auch noch eine sogenannte **Activation Function** $f$ ist. Diese ignorieren wir noch zwischenzeitlich und kümmern uns vorher noch um den nächsten Punkt."
]
},
{
"cell_type": "markdown",
"id": "e84d64c8",
"metadata": {},
"source": [
"## Vom Linearen Layer zum MLP"
]
},
{
"cell_type": "markdown",
"id": "0dba6c51",
"metadata": {},
"source": [
"Um nun ein neuronales Netz zu erhalten, schalten wir mehrere Schichten von den vorigen Perzeptronen hintereinander. Eine Schicht wird dabei **Single-Layer Perzeptron** genannt. Mehrere Schichten nennen wir dann **Multi-Layer Perzeptron**."
]
},
{
"cell_type": "markdown",
"id": "8b22d4fd",
"metadata": {},
"source": [
"![MLP](../resources/mlp.png)\n",
"\n",
"(von https://machinelearninggeek.com/multi-layer-perceptron-neural-network-using-python/)"
]
},
{
"cell_type": "markdown",
"id": "090fba0c",
"metadata": {},
"source": [
"Obiges Beispiel zeigt also ein Multi-Layer Perceptron (also eine mögliche Form eines neuronalen Netzes) mit $3$ **Inputs** (das Dataset hat also 3 Features) und einem **Output** Neuron (Rot). Dazwischen (grün) sind die sogenannten **Hidden Layers**."
]
},
{
"cell_type": "markdown",
"id": "e31ae53e",
"metadata": {},
"source": [
"Die Anzahl der Hidden Layers beschreibt die **Tiefe des Neuronalen Netzwerkes**. Von hier kommt auch der Begriff **Deep Learning**, welcher im Vergleich zu **Machine Learning** für (sehr) tiefe neuronale Netze verwendet wird."
]
},
{
"cell_type": "markdown",
"id": "4efc5fcb",
"metadata": {},
"source": [
"**Hinweis:** Alle modernen großen KI-Modelle sind \"Deep-Learning\"-Modelle."
]
},
{
"cell_type": "markdown",
"id": "1fef54a0",
"metadata": {},
"source": [
"Beim Aufbau so eines Netzwerkes haben wir relativ viele Freiheitsgrade (Hyperparameter), da wir die Anzahl der Hidden Layers und die dazugehörigen Anzahl an Neuronen pro Hidden Layer frei wählen können. Fix vorgegeben sind nur die Anzahl der Input Neuronen (=Anzahl der Features im Dataset) und je nach Task (Regression/Klassifikation) ist die Anzahl der Output-Neuronen festgelegt."
]
},
{
"cell_type": "markdown",
"id": "935d5b51",
"metadata": {},
"source": [
"Wir sehen in der Grafik auch, dass der Output von den Neuronen in Schicht $n$ der Input für die Neuronen aus Schicht $n+1$ darstellt. Somit ist also jedes Neuron aus Schicht $n$ verbunden mit alle Neuronen aus Schicht $n+1$."
]
},
{
"cell_type": "markdown",
"id": "2a2fd40a",
"metadata": {},
"source": [
"Wie können wir den Output nun berechnen anhand von diesem schematischen Beispiel?\n",
"\n",
"Wir bezeichnen die einzelnen Elemente nun folgendermaßen:\n",
"* Input-Layer: $\\mathbf X = (x_1, x_2, x_3)$\n",
"* Hidden-Layer 1: $\\mathbf h_1 = (h_{11}, h_{12}, h_{13}, h_{14})$\n",
"* Hidden-Layer 2: $\\mathbf h_2 = (h_{21}, h_{22}, h_{23}, h_{24})$\n",
"* Hidden-Layer 3: $\\mathbf h_3 = (h_{31}, h_{32}, h_{33}, h_{34})$\n",
"* Output: $\\mathbf z$\n",
"\n",
"\n",
"Es gilt\n",
"\\begin{align*}\n",
" \\mathbf h_{1} &= \\mathbf W_{1}\\mathbf X \\\\\n",
" \\mathbf h_{2} &= \\mathbf W_{2}\\mathbf h_1 \\\\\n",
" \\mathbf h_{3} &= \\mathbf W_{3}\\mathbf h_2 \\\\\n",
" \\mathbf z &= \\mathbf W_4 \\mathbf h_3\n",
"\\end{align*}"
]
},
{
"cell_type": "markdown",
"id": "f75aff2e",
"metadata": {},
"source": [
"> **Übung:** Welche Dimensionen haben hier die Elemente?"
]
},
{
"cell_type": "markdown",
"id": "a062a2e6",
"metadata": {},
"source": [
"> **Übung:** Wie viele Parameter hat das Netzwerk, welche wir später lernen wollen?"
]
},
{
"cell_type": "markdown",
"id": "882bdd8c",
"metadata": {},
"source": [
"## Lineare Layer in PyTorch"
]
},
{
"cell_type": "markdown",
"id": "43b57480",
"metadata": {},
"source": [
"Um nun diese Funktionalität in PyTorch zu erreichen, könnte man meinen, man initialisiert einfach die verschiedenen Weight-Matrizen und die Bias-Vektoren als Tensoren mit Gradient und berechnet die Output \"händisch\". Das ist prinzipiell nicht falsch, aber tatsächlich ist es viel einfacher, wie wir im folgenden sehen."
]
},
{
"cell_type": "markdown",
"id": "bcaabe7d",
"metadata": {},
"source": [
"**Hinweis:** Der Grund warum wir Gradienten brauchen, wird spätestens klar, wenn wir über die Optimierung (=das Lernen von Neuronale Netzwerke) lernen."
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "9016d86c",
"metadata": {},
"outputs": [],
"source": [
"import torch\n",
"import torch.nn as nn"
]
},
{
"cell_type": "markdown",
"id": "e4b6fa16",
"metadata": {},
"source": [
"Um nun ein Neuronales Netzwerk zu designed, müssen wir zuerst eine **Klasse erstellen**, welche von `nn.Module` erbt. Danach müssen wir nur noch die `init` und `forward` **Methoden implementieren** und unser Netzwerk ist schon fertig.\n",
"\n",
"Wir bauen jetzt das Netzwerk von gerade eben nach (3 Input Features, 3 Hidden Layers mit jeweils 4 Features, Output Layer mit einem Neuron)."
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "310aecd6",
"metadata": {},
"outputs": [],
"source": [
"class MyFirstNeuralNetwork(nn.Module):\n",
" \"\"\"A simple feedforward neural network, that expects 3 input features and produces 1 Output by using 3 Hidden Layers with 4 Features each.\"\"\"\n",
" def __init__(self):\n",
" super().__init__()\n",
" self.hidden_layer_1 = nn.Linear(3, 4) # transforms the 3 features into 4 features\n",
" self.hidden_layer_2 = nn.Linear(4, 4) # transforms the 4 features into 4 features\n",
" self.hidden_layer_3 = nn.Linear(4, 4) # transforms the 4 features into 4 features\n",
" self.output_layer = nn.Linear(4, 1) # transforms the 4 features into 1 feature\n",
"\n",
" def forward(self, x):\n",
" \"\"\"\n",
" :param x: Input tensor with shape (batch_size, 3)\n",
" :return: Output tensor with shape (batch_size, 1)\n",
" \"\"\"\n",
" x = self.hidden_layer_1(x)\n",
" x = self.hidden_layer_2(x)\n",
" x = self.hidden_layer_3(x)\n",
" x = self.output_layer(x)\n",
" return x"
]
},
{
"cell_type": "markdown",
"id": "1c066dc9",
"metadata": {},
"source": [
"Damit ist unser Neuronales Netzwerk schon fertig. Natürlich ist das soeben erstellte Neuronale Netzwerk sehr einfach. Man könnte es noch weiter vergrößern. Es ist auch möglich, in der Forward Methode zu Normalisieren, bzw. die Daten zu bearbeiten. Wir können unser Netzwerk auch variabel machen, indem wir im Konstruktor (`init`) noch Parameter übergeben."
]
},
{
"cell_type": "markdown",
"id": "6df741f0",
"metadata": {},
"source": [
"> **Übung:** Warum speichern wir hier 2x das gleiche Lineare Layer (`nn.Linear(4,4)`) als 2 verschiedene Variablen (`self.hidden_layer_2` und `self.hidden_layer_3`)?"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Ändern wir unser Netzwerk nun so, dass wir keinen Bias haben und die Anzahl der Input Features angepasst werden kann."
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "0eaef635",
"metadata": {},
"outputs": [],
"source": [
"class MyVariableFirstNeuralNetwork(nn.Module):\n",
" \"\"\"A simple feedforward neural network, that expects n_input_features input features and produces 1 Output by using 3 Hidden Layers with 4 Features each.\"\"\"\n",
" def __init__(self, n_input_features: int):\n",
" super().__init__()\n",
" self.hidden_layer_1 = nn.Linear(n_input_features, 4, bias=False) # transforms the n_input_features features into 4 features\n",
" self.hidden_layer_2 = nn.Linear(4, 4, bias=False) # transforms the 4 features into 4 features\n",
" self.hidden_layer_3 = nn.Linear(4, 4, bias=False) # transforms the 4 features into 4 features\n",
" self.output_layer = nn.Linear(4, 1, bias=False) # transforms the 4 features into 1 feature\n",
"\n",
" def forward(self, x):\n",
" \"\"\"\n",
" :param x: Input tensor with shape (batch_size, n_input_features)\n",
" :return: Output tensor with shape (batch_size, 1)\n",
" \"\"\"\n",
" x = self.hidden_layer_1(x)\n",
" x = self.hidden_layer_2(x)\n",
" x = self.hidden_layer_3(x)\n",
" x = self.output_layer(x)\n",
" return x"
]
},
{
"cell_type": "markdown",
"id": "b8d51eac",
"metadata": {},
"source": [
"Unser Netzwerk können wir nun folgendermaßen erstellen (die Gewichte werden am Anfang zufällig gewählt)."
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "d3926ee8",
"metadata": {},
"outputs": [],
"source": [
"model = MyVariableFirstNeuralNetwork(n_input_features=3)"
]
},
{
"cell_type": "markdown",
"id": "7d5ce043",
"metadata": {},
"source": [
"Um nun den Output zu berechnen, können wir das Model wie eine Funktion aufrufen. Dabei wird dann die `forward` Methode ausgeführt."
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "4c076bb9",
"metadata": {},
"outputs": [],
"source": [
"aux_input = torch.tensor([[1.0, 2.0, 3.0]])\n",
"output = model(aux_input)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "727b57b6",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"tensor([[0.1016]], grad_fn=<MmBackward0>)"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"output"
]
},
{
"cell_type": "markdown",
"id": "b9a5a49b",
"metadata": {},
"source": [
"Wie oben in der `forward` Methode als Kommentar geschrieben, ist die *Shape*, die sich das Modell bei der `forward` Methode erwartet, `(batch_size, n_input_features)`. Dabei steht die `batch_size` für die Anzahl der Datenpunkte gleichzeitig. Sprich, wenn wir nun als Input 2 Vektoren der Länge 3 haben, dann werden beide Elemente durch das Netzwerk geschickt."
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "5a4003e3",
"metadata": {},
"outputs": [],
"source": [
"aux_input = torch.tensor([[1.0, 2.0, 3.0], [-1.0, 4, 0.1111]])\n",
"output = model(aux_input)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "4189433a",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"tensor([[ 0.1016],\n",
" [-0.2725]], grad_fn=<MmBackward0>)"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"output"
]
},
{
"cell_type": "markdown",
"id": "6587ec67",
"metadata": {},
"source": [
"Wir sehen, der Output besteht nun auch aus 2 Einträgen (jeweils das eine Output Neuron für beide Datenpunkte).\n",
"\n",
"Wir können also stand jetzt--unser Modell ist sehr klein--in vielen Fällen auch das ganze Dataset durch das Modell schicken. Später, zum Beispiel bei Bildern, wird uns das nicht mehr möglich sein, da werden wir dann sogenannte Teile des Datasets verwenden (Batches). Dies werden wir uns genauer anschauen, wenn wir über Datasets und Dataloader lernen. "
]
},
{
"cell_type": "markdown",
"id": "e1640e5e",
"metadata": {},
"source": [
"**Hinweis:** Für die Inferenz (= spätere Verwendung vom Modell) ist uns die Möglichkeit, mehrere Datenpunkte gleichzeitig verwenden zu können relativ \"egal\", da wir meistens immer nur an einer Vorhersage interessiert sind. Für das Training jedoch ist es sehr praktisch, da wir dann die Parameter für mehrere Samples gleichzeitig bearbeiten können."
]
},
{
"cell_type": "markdown",
"id": "cad6300f",
"metadata": {},
"source": [
"Betrachten wir nun nochmal die Formel von vorher und schreiben alles in eine Zeile. Was fällt uns auf?"
]
},
{
"cell_type": "markdown",
"id": "861e365e",
"metadata": {},
"source": [
"$$\\mathbf z = \\mathbf W_4 \\mathbf W_3 \\mathbf W_2 \\mathbf W_1 \\mathbf X$$"
]
},
{
"cell_type": "markdown",
"id": "21ea6670",
"metadata": {},
"source": [
"Hat es wirklich einen Vorteil, wenn wir mehrere lineare Layer einfach hintereinander schalten?"
]
},
{
"cell_type": "markdown",
"id": "7dbe1680",
"metadata": {},
"source": [
"Natürlich **NICHT**, genauso wie im 1d Fall $\\hat f(x) = kx+d$ wär die Hintereinanderausführung umsonst, da wieder eine lineare Funktion entsteht. Also unsere Netzwerk (also unsere Funktion) ist nach wie vor einfach eine lineare (im mehrdimenionalen eine Ebene). Dies reicht nicht aus, um komplizierte Zusammenhänge zu lernen. Deswegen werden wir nun die sogenannten **Activation Functions** (*Aktivierungsfunktionen*) dazwischen schalten. Sie sind **nicht-linear** und erlauben so dem Modell, kompliziertere Zusammenhänge zu lernen."
]
},
{
"cell_type": "markdown",
"id": "018a5d71",
"metadata": {},
"source": [
"> **Übung:** Zeige, dass für zwei lineare Funktionen, sagen wir $f(x)=a\\cdot x + b$ und $g(x) = c\\cdot x + d$ die Hintereinanderausführung $h(x):=f(g(x))$ auch wieder von der Form $h(x)=u\\cdot x + v$ ist. Welchen Wert haben $u$ und $v$?"
]
},
{
"cell_type": "markdown",
"id": "a48da39d",
"metadata": {},
"source": [
"## Die Aktivierungsfunktion"
]
},
{
"cell_type": "markdown",
"id": "e817fd78",
"metadata": {},
"source": [
"Nachdem wir nun gesehen haben, dass wir zwischen den einzelnen Layern eine Aktivierungsfunktion brauchen, sehen wir uns nochmal den vollständigen Aufbau eines Perzeptrons an."
]
},
{
"cell_type": "markdown",
"id": "740dfbb1",
"metadata": {},
"source": [
"![Perzeptron](../resources/Perzeptron.png)\n",
"\n",
"(von https://www.mql5.com/de/articles/8908)"
]
},
{
"cell_type": "markdown",
"id": "ed2c116a",
"metadata": {},
"source": [
"Es ist also $z$ nur ein sogenanntes **Logit** und $y=\\sigma(z)$ der \"echte\" Output.\n",
"\n",
"**Wichtig:** In diesem Bild ist für die Aktivierungsfunktion eine *Sigmoidfunktion* $\\sigma(x)$ eingezeichnet, prinzipiell kann es aber jede beliebige Aktivierungsfunktion sein $f$. (Dies ist bei dem Bild mit dem biologischen Neuron besser eingezeichnet). "
]
},
{
"cell_type": "markdown",
"id": "0be5c763",
"metadata": {},
"source": [
"**Wichtig:** Für ein MLP ist *pro Schicht* immer die selbe Aktivierungsfunktion vorgesehen. Also nach jedem Layer können wir auswählen, welche Aktivierungsfunktion verwendet werden soll für diesen Layer."
]
},
{
"cell_type": "markdown",
"id": "add96255",
"metadata": {},
"source": [
"### Anforderungen an eine Aktivierungsfunktion"
]
},
{
"cell_type": "markdown",
"id": "f82193c9",
"metadata": {},
"source": [
"Prinzipiell können wir jede Funktion als Aktivierungsfunktion verwenden, jedoch wollen wir ein paar (nicht zwingend erschöpfend) Eigenschaften sammeln:\n",
"\n",
"* Nicht-Linearität: Ansonsten würde sich unsere Ausgangssituation nicht ändern\n",
"* Differenzierbarkeit: Für jeden Wert $x\\in\\mathbb R$ muss die Ableitung bekannt (berechenbar) sein\n",
"* Beschränkt oder \"nicht-explodierend\": Der Output muss in einem gewissen Bereich liegen oder nicht explodieren\n",
"\n",
"\n",
"Ein paar weitere nette Eigenschaften:\n",
"* Der Gradient von der Ableitung sollte idealerweise überall im Bereich $1$ sein\n",
"* Die Ableitung sollte ohne viel Rechenaufwand berechenbar sein"
]
},
{
"cell_type": "markdown",
"id": "a8e4078c",
"metadata": {},
"source": [
"## Übersicht der gängigsten Aktivierungsfunktionen"
]
},
{
"cell_type": "markdown",
"id": "5a19bbd4",
"metadata": {},
"source": [
"Wir werden uns nun die gängigsten Aktivierungsfunktionen, deren Ableitungen, die Eigenschaften und die Vor- und Nachteile ansehen. Im Anschluss werden wir diese dann auch plotten. "
]
},
{
"cell_type": "markdown",
"id": "0dc8a290",
"metadata": {},
"source": [
"Dazu bereiten wir uns kurz eine Plotting Methode vor."
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "c6464ff0",
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "a705b3d3",
"metadata": {},
"outputs": [],
"source": [
"def plot_function_and_derivative(func, deriv, f_name, x_range):\n",
" x = np.linspace(x_range[0], x_range[1], 1000)\n",
" y = func(x)\n",
" dy = deriv(x)\n",
"\n",
" fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5), sharey=True)\n",
"\n",
" ax1.plot(x, y, label=f\"{f_name}(x)\")\n",
" ax1.set_title(f\"{f_name}(x)\")\n",
" ax1.set_xlabel(\"x\")\n",
" ax1.set_ylabel(\"y\")\n",
" ax1.grid()\n",
" ax1.legend()\n",
"\n",
" ax2.plot(x, dy, label=f\"{f_name}'(x)\", color=\"orange\")\n",
" ax2.set_title(f\"{f_name}'(x)\")\n",
" ax2.set_xlabel(\"x\")\n",
" ax2.grid()\n",
" ax2.legend()\n",
"\n",
" plt.show()"
]
},
{
"cell_type": "markdown",
"id": "92f653c9",
"metadata": {},
"source": [
"### Sigmoid Funktion"
]
},
{
"cell_type": "markdown",
"id": "37f2fcb2",
"metadata": {},
"source": [
"\\begin{align*}\n",
" f(x) &= (1+e^{-x})^{-1}\\\\\n",
" f'(x) &= \\sigma(x) \\cdot (1-\\sigma(x))\n",
"\\end{align*}"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "5237d9d1",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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5XqBgYEqKCg45e8BAKgp9O8VHeujT9XnR0VF6aqrrlJhYaEuv/zyU57Kfmx7+ny4O0I64KKio6OVlJSk1NRU7dy5U1OmTNGXX35Z6byikqMDKykp0cGDB8stP1Wnfz6ioqKUkZFRYfmxb8Kjo6NPu21lNVW2LDo6usL+HJOXl6fbbrtNLVq0UFBQ0GmngTl48OBpawIAoKbQv1d07HFP1ecnJydr2rRp6tatm7766it98cUXla53bHv6fLg7QjrgBho1aqT77rtP/fv318qVKytdp0+fPpIc39Cf6JNPPqnyevr166f169dXqGXmzJmyWCzq27fvKbft27evfvnlF+3du7dsWWlpaYW6JalVq1batm1bpY8zZswYpaWl6csvv9T06dM1Z84cvfrqq5Wuu3379nKDzwEA4Aq8tX8/WevWrSWp0j4/IyNDt956q/r06aOUlBRdddVVGjVqlHbs2FFh3e3bt0sSfT7cHqO7Ay4oOztbffv21S233KJWrVopLCxMy5Yt048//lg2AuvJLr/8cvXq1Uv//Oc/lZOTo8TERC1evFgzZ86UJPn4VN13cuPHj9fMmTM1ZMgQTZ48WfHx8fr+++81depU3XPPPWrRosUpt/33v/+tOXPm6NJLL9WkSZMUHBysN954Q3l5eRXWveSSSzR58mTl5+crODi4bPk777yjDz/8UO+9954uuOACXXDBBbrvvvv06KOPqlevXuWupTtw4IC2bNlyzvOuAgBQVejfK9ewYUM1adJES5YsKXf5Wmlpadn857NmzZLVatWMGTPUsWNHDR06VIsWLZK/v3/Z+kuWLJHVatXFF198fg0BmIwj6YALCgwMVPfu3fXBBx9o2LBhGjRokN555x09+uij+r//+79Kt/Hx8dG3336rm266Sf/5z3909dVXa+HChfrwww8lSREREVVWX506dZSSkqJLL71UEydO1BVXXKGffvpJL7zwgl577bXTbtu2bVv9/PPPCg8P14gRI3TXXXepffv2euKJJyqse8stt6i0tFTff/992bI1a9bogQce0IgRI8qdGvjSSy+pffv2Gjp0qA4fPly2/JtvvpGfn1+FAXcAAKhp9O+nNmzYMP34448qKioqW/bkk09q4cKFmjVrVtm17bVr19Ynn3yiVatW6ZFHHin3GF9//bUGDx5cpW0CmMFiGIZhdhEAqs+sWbM0bNgw/fHHH+rZs6fZ5TjtyiuvVElJiX744Ydz2r53795q1KiRPvrooyquDAAA87h7/36y9PR0JSQkaObMmWc1IvzJtm3bpubNm+unn3465WwvgLsgpAMe5OOPP9aePXvUrl07+fj4aMmSJXrxxRfVqVOnsilc3M3atWvVqVMnpaSkqGvXrk5tu2DBAg0YMEDr169XkyZNqqlCAACqlyf275V59NFH9cMPP2j16tVOn8Z/++23a/fu3UpOTq6m6oCawzXpgAcJCwvTJ598omeffVZ5eXmKjY3VyJEj9eyzz5pd2jlr27at3nvvvXMaxfbAgQOaOXMmAR0A4NY8sX+vzL///W8FBwdrz549iouLO+vtSkpK1LRpU02cOLEaqwNqDkfSAQAAAABwEQwcBwAAAACAiyCkAwAAAADgIgjpAAAAAAC4CK8bOM5utys9PV1hYWGyWCxmlwMAgAzDUG5ururXr+/0iMaoHP09AMCVONPXe11IT09Pd2q0SAAAasquXbvUsGFDs8vwCPT3AABXdDZ9vdeF9LCwMEmOxgkPDze5mupjs9k0b948DRgwQH5+fmaX4xZoM+fRZs6jzZzjLe2Vk5OjuLi4sj4K588b+ntveX9UJdrMebSZ82gz53lDmznT13tdSD92ylt4eLjHdtqS44UeHBys8PBwj32hVzXazHm0mfNoM+d4W3txWnbV8Yb+3tveH1WBNnMebeY82sx53tRmZ9PXc+EbAAAAAAAugpAOAAAAAICLIKQDAAAAAOAivO6a9LNhGIZKSkpUWlpqdinnzGazydfXV4WFhW69H9XFarXK19eX6z8BAABQLQzDkM1m47P4WfCU7OLn5yer1Xrej0NIP0lxcbEyMjKUn59vdinnxTAM1atXT7t27SKInkJwcLBiY2Pl7+9vdikAAADwID4+PtqzZ48KCwvNLsUteEp2sVgsatiwoUJDQ8/rcQjpJ7Db7dqxY4esVqvq168vf39/t32R2O12HTlyRKGhofLx4aqGExmGoeLiYu3fv187duxQ8+bNaSMAAABUCbvdrjp16qikpMTtM0VN8YTsYhiG9u/fr927d6t58+bndUSdkH6C4uJi2e12xcXFKTg42OxyzovdbldxcbECAwPd9oVenYKCguTn56edO3eWtRMAAABwvmw2m/z8/BQbG3veR1S9hadklzp16ig1NVU2m+28Qrr7tkA1cucXBs4e/88AAACoaoZhSOKzpjeqqjMmTH3lLFiwQFdeeaXq168vi8Wir7/++ozbzJ8/X4mJiQoMDFSTJk305ptvVn+hAAAAAADUAFNDel5enjp06KDXX3/9rNbfsWOHBg8erN69e2vVqlX617/+pQceeEBffPFFNVcKAAAAAED1MzWkDxo0SM8++6yuu+66s1r/zTffVKNGjZSUlKTWrVtr9OjRuuOOO/TSSy9Vc6Xu6/bbb9c111xjdhmSpMaNGyspKem061R2RsX06dM1YMCAs36e7777Tp06dZLdbj+HKgEAAACcaOTIkW6fKU72xBNP6K677jrr53399dd11VVXnfX658OtBo5bvHhxhbA2cOBATZ8+vWyAhpMVFRWpqKio7H5OTo4kx4AONput3Lo2m02GYchut7t9wDt2Lcyrr74qSS6xP0uXLlVISMgZazmx/YuKijRp0iTNmjXrrPdh8ODBmjRpkj788EPdeuutp32eY/NXWq3WstfDya8LnBpt5jzazDne0l6evn81wZn+3lN4y/ujKtFmzqPNnFdSUiJJZbnCE7z66qvVuj/HssvZPMe5ZAqr1apt27apcePGkqS9e/fq//2//6fVq1ef9T6NGjVKzz33nBYsWKCLLrrolM95Yr44kTPvIbcK6ZmZmYqJiSm3LCYmRiUlJcrKylJsbGyFbaZMmaKnn366wvJ58+ZVGMHd19dX9erV05EjR1RcXFy1xZvk2IAVxz6smCkgIEAlJSVnrKWgoKBsnc8++0zBwcHq0KGDU/tw00036X//+99pv+0qLi5WQUGBFixYUPbHVJKSk5PP+nngQJs5jzZzjqe3V35+vtkluD1n+ntP4+nvj+pAmzmPNjt7xzJFXl6ex3y5YbFYZLFYqj1T5ObmnnGdc8kUknTkyJGy+1OnTlXXrl0VGRnp1D5df/31SkpKUvv27Sv9/anyheRcX+9WIV2qOGLesW9dTjWS3sSJEzVhwoSy+zk5OYqLi9OAAQMUHh5ebt3CwkLt2rVLoaGhZVNyGYahAltpVe7CWQvys571CIGff/65nnnmGW3dulXBwcHq2LGjZs6cqX/96186fPiwvvrqK0mOF/4999yjb775RuHh4Xr44Yc1Z84cdejQoeyoe5MmTTRq1Cht3rxZX331laKiopSUlKSePXvqzjvv1K+//qqEhARNnz5dXbp0Kavhiy++0FNPPaWtW7cqNjZW9913X7m2b9KkiR588EE9+OCDkqQtW7bozjvv1J9//qkmTZqUPX9QUFDZ/82cOXN09dVXl90vLCxU165d1bNnT7311luSHGMVdO7cWS+88ILuvPNOSdINN9ygRx99VFlZWWrSpEmlbVZYWKigoCBdfPHFCgwMlM1mU3Jysvr371/pWRmoiDZzHm3mnJpuL7vd0KECmw4eKdahgmLlFJTocIFN2QU2ZefbdLjAVm6Zj0X6YsyF5/28rvBFqrtzpr/3FPw9cR5t5jzazHlHjhzR9u3bFRISoqCgIMkwpFKTvoy1BktOjDh+cqbo1KmTvvrqK913333VmikSExOVm5ursLAwffnll1WeKSQpNDS07P4333yju+66q+z+/v371aFDB91///2aOHGiJMcR+z59+mjOnDllZ3Nff/31uvzyy+Xn5+f4vz3JyfniRM709W4V0uvVq6fMzMxyy/bt2ydfX19FRUVVuk1AQIACAgIqLPfz86vwh6a0tFQWi0U+Pj5lR6Dzi0vU9ilzvjlcP3mggv3PPL9eRkaGhg0bphdeeEHXXnutcnNztWDBgnJfYBzbn4ceekgpKSmaM2eOYmJiNGnSJK1cuVIdO3YsN01EUlKSnn/+eU2aNEmvvvqqRowYoV69epWNAfDoo49q5MiRWrdunSwWi1asWKGbbrpJTz31lIYOHaqUlBSNHTtW0dHRGjlyZNnjHqvFbrfrH//4h6Kjo7VkyRLl5ORo3LhxklSu/RctWqRbb7217H5wcLA++ugjde/eXUOGDNGVV16pESNGqG/fvrr77rvLnichIUF169bVH3/8oWbNmlXabj4+PrJYLBVeC5W9NnB6tJnzaDPnnG975RTalJldqPTDBdqXW6QDR4qVdaRIB44UKevov7OOFOtgXpHshhN1WS3y9fU97ylXeC2cP2f6e0/jDftY1Wgz59FmZ8/X1xGxyj6Dl+RJn5v0ZeGNRyRryFmtWlmmWLhwYdlR9OrMFGvWrJEkrVy5sloyxYn3Dx06pLVr16pr165lv4+JidG7776ra665RgMHDlSrVq00fPhwjR07VpdffnnZY3Tr1k02m03Lly9Xnz59KrThqfKF5Fxf71YhvUePHvr222/LLZs3b566dOni1X80MjIyVFJSouuuu07x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IKQDKPPpsl3KLSpRk+gQ9W1Z1+xyAAAAAK9DSAcgSSq1G3r36LRrd1yUIB8fi8kVAQAAAN6HkA5AkjRvXaZ2HypQRLCfru/c0OxyAAAAAK9ESAcgSXrn6LRrt3aPV5C/1eRqAAAAAO9ESAegVWmHtGLnIflZLRreI97scgAAAACvRUgHoOlHj6Jf1aGB6oYHmlwNAAAA4L0I6YCX230oXz+szZTEtGsAAACA2UwP6VOnTlVCQoICAwOVmJiohQsXntV2f/zxh3x9fdWxY8fqLRDwcO+npKrUbqhXsyi1qR9udjkAAACAVzM1pM+ePVvjxo3T448/rlWrVql3794aNGiQ0tLSTrtddna2hg8frn79+tVQpYBnyi206ZM/d0mSRl/UxORqAAAAAJga0l955RWNGjVKo0ePVuvWrZWUlKS4uDhNmzbttNvdfffduuWWW9SjR48aqhTwTJ8u363cohI1rROiPi3qmF0OAAAA4PV8zXri4uJirVixQo899li55QMGDFBKSsopt3vvvfe0bds2ffjhh3r22WfP+DxFRUUqKioqu5+TkyNJstlsstls51i96zu2b568j1XN29qs1G7ovUXbJUkje8SrtLREpaXOPYa3tVlVoM2c4y3t5en7VxO8sb/3lvdHVaLNnEebOY82c543tJkz+2ZaSM/KylJpaaliYmLKLY+JiVFmZmal22zZskWPPfaYFi5cKF/fsyt9ypQpevrppyssnzdvnoKDg50v3M0kJyebXYLb8ZY2W3XAot2HrQrxNRSY+bfmzv37nB/LW9qsKtFmzvH09srPzze7BLfnzf29p78/qgNt5jzazHm0mfM8uc2c6etNC+nHWCyWcvcNw6iwTJJKS0t1yy236Omnn1aLFi3O+vEnTpyoCRMmlN3PyclRXFycBgwYoPBwzx0ky2azKTk5Wf3795efn5/Z5bgFb2ozwzD0f28ulZSjO3o31TWXNjunx/GmNqsqtJlzvKW9jh31xbnzxv7eW94fVYk2cx5t5jzazHne0GbO9PWmhfTo6GhZrdYKR8337dtX4ei6JOXm5mr58uVatWqV7rvvPkmS3W6XYRjy9fXVvHnzdOmll1bYLiAgQAEBARWW+/n5eewL4ETesp9VyRvaLGVbltam5yjQz0cjezU57/31hjararSZczy9vTx532qKN/f33rCPVY02cx5t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s2dr3Lhxevzxx7Vq1Sr17t1bgwYNUlpamtmluaT58+fr3nvv1ZIlS5ScnKySkhINGDBAeXl5ZpfmFpYtW6a3335b7du3N7sUwC3Q358Zff2Z0dc7h77+/NDXn8SAV5g7d67RqlUrY926dYYkY9WqVWaX5FZeeOEFIyEhwewyXEa3bt2MMWPGlFvWqlUr47HHHjOpIveyb98+Q5Ixf/58s0txebm5uUbz5s2N5ORko0+fPsaDDz5odkmAS6O/P3f09eXR158f+vqzR19fEUfSvcDevXt155136oMPPlBwcLDZ5bil7OxsRUZGml2GSyguLtaKFSs0YMCAcssHDBiglJQUk6pyL9nZ2ZLEa+os3HvvvRoyZIguu+wys0sBXB79/fmhrz+Ovv780defPfr6inzNLgDVyzAMjRw5UmPGjFGXLl2UmppqdkluZ9u2bXrttdf08ssvm12KS8jKylJpaaliYmLKLY+JiVFmZqZJVbkPwzA0YcIEXXTRRWrbtq3Z5bi0Tz75RCtXrtSyZcvMLgVwefT354e+vjz6+vNDX3/26Osrx5F0N/XUU0/JYrGc9rZ8+XK99tprysnJ0cSJE80u2XRn22YnSk9P1+WXX64bbrhBo0ePNqly12SxWMrdNwyjwjJUdN999+nvv//Wxx9/bHYpLm3Xrl168MEH9eGHHyowMNDscgDT0N87h76+atHXnxv6+rNDX39qFsMwDLOLgPOysrKUlZV12nUaN26sm266Sd9++225P6ilpaWyWq0aNmyY3n///eou1WWcbZsd+yORnp6uvn37qnv37poxY4Z8fPhOS3KcAhccHKzPPvtM1157bdnyBx98UKtXr9b8+fNNrM613X///fr666+1YMECJSQkmF2OS/v666917bXXymq1li0rLS2VxWKRj4+PioqKyv0O8FT0986hr68a9PXnjr7+7NHXnxoh3cOlpaUpJyen7H56eroGDhyozz//XN27d1fDhg1NrM517dmzR3379lViYqI+/PBDr/0DcSrdu3dXYmKipk6dWrasTZs2uvrqqzVlyhQTK3NNhmHo/vvv11dffaXff/9dzZs3N7skl5ebm6udO3eWW3b77berVatWevTRRzl9EDgJ/b3z6OtPj77eOfT1zqOvPzWuSfdwjRo1Knc/NDRUktS0aVM67FNIT0/XJZdcokaNGumll17S/v37y35Xr149EytzHRMmTNBtt92mLl26qEePHnr77beVlpamMWPGmF2aS7r33ns1a9YsffPNNwoLCyu7nq9WrVoKCgoyuTrXFBYWVqFzDgkJUVRUlFd32sCp0N87h77+zOjrnUNf7zz6+lMjpAMnmTdvnrZu3aqtW7dW+GDDiScOQ4cO1YEDBzR58mRlZGSobdu2mjt3ruLj480uzSVNmzZNknTJJZeUW/7ee+9p5MiRNV8QAHg5+vozo693Dn09qhKnuwMAAAAA4CIYHQMAAAAAABdBSAcAAAAAwEUQ0gEAAAAAcBGEdAAAAAAAXAQhHQAAAAAAF0FIBwAAAADARRDSAQAAAABwEYR0AAAAAABcBCEdAAAAAAAXQUgHAAAAAMBFENIBAAAAAHARhHQATtm/f7/q1aun559/vmzZ0qVL5e/vr3nz5plYGQAAqAr09YC5LIZhGGYXAcC9zJ07V9dcc41SUlLUqlUrderUSUOGDFFSUpLZpQEAgCpAXw+Yh5AO4Jzce++9+vnnn9W1a1f99ddfWrZsmQIDA80uCwAAVBH6esAchHQA56SgoEBt27bVrl27tHz5crVv397skgAAQBWirwfMwTXpAM7J9u3blZ6eLrvdrp07d5pdDgAAqGL09YA5OJIOwGnFxcXq1q2bOnbsqFatWumVV17RmjVrFBMTY3ZpAACgCtDXA+YhpANw2sMPP6zPP/9cf/31l0JDQ9W3b1+FhYXpu+++M7s0AABQBejrAfNwujsAp/z+++9KSkrSBx98oPDwcPn4+OiDDz7QokWLNG3aNLPLAwAA54m+HjAXR9IBAAAAAHARHEkHAAAAAMBFENIBAAAAAHARhHQAAAAAAFwEIR0AAAAAABdBSAcAAAAAwEUQ0gEAAAAAcBGEdAAAAAAAXAQhHQAAAAAAF0FIBwAAAADARRDSAQAAAABwEYR0AAAAAABcxP8HFy0TcmeJDHIAAAAASUVORK5CYII=",
"text/plain": [
"<Figure size 1200x500 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"def sigmoid(x):\n",
" return 1 / (1 + np.exp(-x))\n",
"\n",
"def sigmoid_derivative(x):\n",
" x = sigmoid(x)\n",
" return x * (1 - x)\n",
"\n",
"plot_function_and_derivative(sigmoid, sigmoid_derivative, \"sigmoid\", (-5, 5))"
]
},
{
"cell_type": "markdown",
"id": "3c1a0491",
"metadata": {},
"source": [
"**Eigenschaften:**\n",
"\n",
"* Mappt auf den Bereich $(0,1)$\n",
"* Sieht wie ein $S$ aus, darum der Name *Sigmoid*"
]
},
{
"cell_type": "markdown",
"id": "39012064",
"metadata": {},
"source": [
"**Vorteile:**\n",
"* Gut geeignet für binäre Klassifikationsprobleme (wenn wir nur ein Output Neuron verwenden wollen, siehe Logistic Regression).\n",
"* Einfache Ableitung (welche aus dem Funktionswert berechnet werden kann)\n",
"\n",
"*Hinweis:* Wir werden später sehen, dass bei Klassifikation es mehr Sinn macht, wenn wir statt nur einem Output Neuron für jede Klasse ein eigenen Neuron verwenden."
]
},
{
"cell_type": "markdown",
"id": "365c9f87",
"metadata": {},
"source": [
"**Nachteile:**:\n",
"* Ableitung ist klein, genauer gesagt liegt sie im Bereich $(0,0.25]$\n",
"* Nicht verwendbar bei mehr als 2 Klassen, weil es auf jedes Neuron individuell angewendet wird (siehe Softmax)\n",
"* Für Werte, weit weg von der $0$ ist die Sigmoid Funktion sehr flach und somit die Ableitung quasi $0$ (Normalisieren!)"
]
},
{
"cell_type": "markdown",
"id": "09ff8376",
"metadata": {},
"source": [
"> **Übung:** Zeigen Sie, dass für die Ableitung der Sigmoid Funktion $\\sigma(x)=(1+e^{-x})^{-1}$, $\\sigma'(x)=\\sigma(x)\\cdot (1-\\sigma(x))$ gilt."
]
},
{
"cell_type": "markdown",
"id": "7db42c37",
"metadata": {},
"source": [
"### tanh"
]
},
{
"cell_type": "markdown",
"id": "018d0ca2",
"metadata": {},
"source": [
"\\begin{align*}\n",
" f(x) &= \\tanh(x) = \\frac{\\sinh(x)}{\\cosh(x)}\\\\\n",
" f'(x) &= 1-\\tanh^2(x)\n",
"\\end{align*}"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "5b51dcc2",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA/0AAAHUCAYAAABoA0i3AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAB880lEQVR4nO3dd3hUZfr/8c/MZNIISYCQAgQIiBTpIFUUFwmI3VWwsRbEZbEh6+6K5SvYWDv2sos/FCzouooFleAKghTp0kR6gCRAgCSEtMnM+f0xJBISIAMzOVPer+sa5syZZ87cz80kT+45zznHYhiGIQAAAAAAEHSsZgcAAAAAAAB8g6IfAAAAAIAgRdEPAAAAAECQougHAAAAACBIUfQDAAAAABCkKPoBAAAAAAhSFP0AAAAAAAQpin4AAAAAAIIURT8AAAAAAEGKoh/ACS1atEgTJ05UXl6eT99nx44dslgseu6552r9mttuu01Dhw71+L2+//57xcTEaM+ePR6/FgCAYOGPY/zEiRPVsmXLauvz8vKUkJCgjz76yOP3HzlypK688kqPXwcEE4p+ACe0aNEiTZo0yed/EHhq1apVevfdd/XEE094/NpBgwapV69eevDBB30QGQAAgcFfx/iaTJo0SU2aNNGIESM8fu3EiRP19ddf63//+58PIgMCA0U/gIDzz3/+U7169VLPnj1P6/V33nmn3n//fe3atcvLkQEAAG86ePCg3nrrLd15552yWCwev75169YaOnSo/vnPf/ogOiAwUPQDqNHEiRP1t7/9TZKUlpYmi8Uii8WiefPmaebMmUpPT1dKSoqioqLUvn17PfDAAzpy5EiVbdxyyy2KiYnRli1bNGzYMMXExCg1NVV//etfVVpaWuP7vvDCC0pLS1NMTIz69u2rJUuWVHl+7969+uyzzzRy5Mgq68eMGaPIyEitWLGicp3L5dKgQYOUlJSk7OzsyvWXXXaZYmJi9K9//euMcgQAQCDy1zG+JtOmTVN5eXmVvfy5ublKTU1Vv3795HA4Ktdv2LBB9erVq/Y3wsiRIzV37lxt3bq11jkCgglFP4Aa3X777br77rslSf/973+1ePFiLV68WN27d9fmzZs1bNgwTZ06Vd9++63GjRunjz/+WJdddlm17TgcDl1++eUaNGiQZs2apdtuu00vvviinn766WptX3vtNWVkZGjKlCl6//33deTIEQ0bNkz5+fmVbebMmSOHw6ELL7ywymunTJmi9u3ba/jw4ZVTFSdNmqR58+ZpxowZSklJqWwbHh6ufv366euvv/ZGqgAACCj+OsZPnDhRO3bsqPK6r7/+Wt26dVN8fHzluorj+5ctW6Z//OMfkqSioiJde+21at68ud58880q2xg4cKAMw9Ds2bNPN2VAYDMA4ASeffZZQ5Kxffv2E7ZxuVyGw+Ew5s+fb0gy1qxZU/nczTffbEgyPv744yqvGTZsmNG2bdvKx9u3bzckGZ06dTLKy8sr1//888+GJOPDDz+sXPeXv/zFiIqKMlwuV7VYNm/ebMTGxhpXXnmlMXfuXMNqtRoPP/xwjXE/9NBDhtVqNQoLC0+ZBwAAgo0/jvE1iY6ONsaMGVPjc08//bQhyfjss8+Mm2++2YiKijJ++eWXGts2bdrUGDFixEnfCwhW7OkH4LFt27bphhtuUHJysmw2m+x2uy644AJJ0saNG6u0tVgs1fYOdO7cWTt37qy23UsuuUQ2m61KO0lV2mZlZalx48Y1Htd31lln6V//+pc+//xzXXrppRowYIAmTpxYYx8SExPlcrmUk5NTu04DABACzBzjj5eXl6eioiIlJibW+Pzf/vY3XXLJJbr++uv17rvv6pVXXlGnTp1qbJuYmMiVexCywswOAEBgKSws1IABAxQZGaknnnhCZ599tqKjo7Vr1y5dffXVKi4urtI+OjpakZGRVdZFRESopKSk2rYbNWpUrZ2kKtssLi6utr1jXXLJJUpKStLevXs1fvz4Kn9gHKtiG8fHCwBAqDJ7jD9exXMnGvctFotuueUWff3110pOTq52LP+xIiMjGfMRsij6AXjkf//7n7KysjRv3rzKb/4l1dklfxISErRy5coTPj9mzBgdPnxY55xzju655x4NGDBADRo0qNbu4MGDldsDAADmj/HHq/iioGLMPl52drbuvPNOde3aVevXr9f999+vl19+uca2Bw8eVMuWLX0VKuDXmN4P4IRq+ha+Ylp9xXMV3nrrrTqJqV27djpw4ECVE/9U+Pe//60ZM2bo1Vdf1RdffKG8vDzdeuutNW5n27ZtatSokZKSknwdMgAAfscfx/jjhYeHq1WrVjWedd/pdOr666+XxWLRN998o8mTJ+uVV17Rf//732pty8vLtWvXLnXo0KEuwgb8DkU/gBOqOC7upZde0uLFi7V8+XJ17txZDRo00JgxY/TZZ5/pq6++0vXXX681a9bUSUwVZ+BdunRplfVr167VPffco5tvvlm33nqrWrVqpalTp2rWrFmaMmVKte0sWbJEF1xwwWld8xcAgEDnj2N8TQYOHFjjpf0effRRLViwQO+//76Sk5P117/+VZdddplGjRql7du3V2n7yy+/qKioqNqVf4BQQdEP4IQGDhyoCRMm6Msvv9R5552nc889V9u3b9fXX3+t6Oho3XTTTbrtttsUExOjmTNn1klM/fv3V8uWLTVr1qzKdUeOHNHw4cOVlpam119/vXL9H//4R9155536+9//rp9//rly/datW7V27VrdeOONdRIzAAD+xh/H+JrceOONys7O1rJlyyrXZWRkaPLkyXrkkUc0aNCgyvXTpk1TbGysRowYobKyssr1n3/+uRISEpSenl6nsQP+wmIYhmF2EADgieeff15PPvmk9uzZo6ioKI9f/8gjj+i9997T1q1bFRbGqU0AAPBnnTt3Vv/+/fXGG294/Fqn06mzzjpLN9xwg5588kkfRAf4P/b0Awg4d955p+Li4vTaa695/Nq8vDy99tpreuqppyj4AQAIAM8884ymTZum3bt3e/zaGTNmqLCwUH/72998EBkQGCj6AQScyMhITZ8+vdqJhmpj+/btmjBhgm644QYfRAYAALxt6NChevbZZ6sdq18bLpdL77//vuLj470fGBAgmN4PAAAAAECQYk8/AAAAAABBiqIfAAAAAIAgRdEPAAAAAECQ4tTVXuByuZSVlaX69evLYrGYHQ4AADIMQ4cPH1aTJk1ktfId/5lirAcA+JvajvUU/V6QlZWl1NRUs8MAAKCaXbt2qVmzZmaHEfAY6wEA/upUYz1FvxfUr19fkjvZsbGxJkfjOw6HQ3PmzFF6errsdrvZ4fg98uU5cuY5cua5UMlZQUGBUlNTK8conBnGepwIOfMcOfMM+fJcqOSstmM9Rb8XVEzzi42NDfo/BKKjoxUbGxvUPzzeQr48R848R848F2o5Yyq6dzDW40TImefImWfIl+dCLWenGus5yA8AAAAAgCBF0Q8AAAAAQJCi6AcAAAAAIEhxTH8dMQxD5eXlcjqdZody2hwOh8LCwlRSUhKw/bDZbAoLC+MYVwAAAOCoYKhVjhUMdYvkvdqF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VOHh7oFhyZIlioiIUN++fb0eE+Bv8osc+m5dlt7fZNWDK37QkeOm6bdKqKdeaQ3VuVm8OjWN09nJMYoIM+84PQBAiNjyprR/gRRWX+r/4akLeItV6jtdmt1Ryt8gbXxW6vhQ3cSKgHWyWqVFixaaOnWqz2qVY1mtVl100UVauHChrrzyysr1Dz30kPLz8/Xyyy8rJiZG33zzjUaNGqWvvvqqss2CBQvUqlUrtW7d2qcxBlTRP3DgwGqXTzrWtGnTqq274IILtHLlypNu95prrtE111xzpuEFnfvvv18333yzOnTooOLiYm3YsEHLli3T9ddfL4vFouuvv15jx47VN9984/X3Hj16tLp37678/HzFxcXp119/1d/+9jdNnTpVqampktxfAnTp0kWPPPKInn76aUnuS/3deOONIXFmZYQmh9Ol+Zv267+rdmvuhn0qc7okWSU5lRQboQvbJqpv60bq06qRkmJ9d6JKAABqVLJfWvOwe7nrZKl+LYuZyMZStxekxTdJ65+QWlxX+9ciJB1fq/z6669avXq1RowYIYvFoquvvlp/+ctf9O233/o8ljvuuEOjRo3SM888I6vVqnnz5mnKlCn64YcfKk/QN336dHXu3FlvvPGG/vKXv0hy1y4Vlx73JYtxsioatVJQUKC4uDjl5+fXePb+7du3Ky0tzadniq8LFdNkYmNjT3iiCW8aPny4unXrVnkZjlPZv3+/2rVrp+XLl5/0G726+j9xOByaPXu2hg0bxol9aomcndi+wyWasSRTHyzdqdzCssr1bRLrqZX9sP58WV91a9HIL06U5+9C5XN2srEJnguVfIbKz4c3kbPj/PwX957+Bl2lIcsla/UZZifMmWFIP6RLOXOl5sOl82bWXdx+zJefsWCqVY5V13WLYRjq06ePxo0bd8LLhh9v3bp1GjRokH777TfFxcWdsN3J/o9qOzZxECf81rPPPquYmJhat9++fbtef/11n0/hAerSrzkFGj9ztfr/8396+fvNyi0sU0JMhG4/L02z7xmg2Xf317DmLnVqGkfBDwAwV+F2aeu/3cs9Xq6x4D8pi0Xq9rwki5T5sXRwlddDBHzBYrHo7bffVnl57S9znJWVpffee++kBb+3BNT0foSWFi1aVF4vszZ69eqlXr16+TAioO5s2VeoKXN/09drsytPyNejRQPd1j9NQ85JUtjRE+85HDWfkR8AgDq37gn32fpThkiJA05vGw06u6f27/xQ+uURaeBXp34N4Ae6dOmiLl261Lr98Scs9yWKfgDwI7mFpXr22036ZMUuuY4W+5d0StEd57dSl9R4U2MDAOCECrdJ2991L3eaeGbb6jTJvac/62vp0Gr3oQIAThtFPwD4gXKnSzOW7NTzGb/pcIl7alh6hyTdN/hstU8J3uOHAQBB4teXJMMpJadLCX3ObFuxbaTm10o7P5I2Pi/1m+6dGIEQRdFfRzhfov/g/wL+5re9hzX+49Vat6dAktSxaawmXX6OerRoaHJkAADUgqNA2vb/3Mvt/+qdbbb7q7vo3/mR1OUpqV6qd7aLGvH3sf/yxv8NJ/LzsYozbBYVFZkcCSpU/F9whl2Yzeky9PaPW3XpKwu1bk+B4qLseuLKjpp153kU/ACAwLH1/0nlh6XY9lLyYO9ss1FPKXGg+xwBv73qnW2iGmoV/+eN2oU9/T5ms9kUHx+vffv2SZKio6MD9gzbLpdLZWVlKikpqZNLX3ibYRgqKirSvn37FB8fL5vNwzPKAl508EiZ7v1olRZszpUkXdi2sZ7+Y2clxgbP5XIAACHA5ZR+e9m93PZe9xn4vaXtvdK+ee5ZBJ0fl2zh3ts2JAVXrXKsQK9bJO/WLhT9dSA5OVmSKn+YApVhGCouLlZUVFRA/zKIj4+v/D8BzLBmV57Gvr9Se/KKFWW36dHLOmjEuakB/XMFAAhROXPcJ/ELbyCl3eTdbTe9VIpqIhVnSbs/k1qM8O72ISl4apVjBUvdInmndqHorwMWi0UpKSlKTEwM6MtrORwO/fjjjzr//PMDdmq83W5nDz9M9cWaLN3/8RqVOV1KS6inN2/qobbJ9c0OCwCA07P1Hfd9y5FSWD3vbtsaJrUeJa17XNryNkW/jwRLrXKsYKhbJO/VLhT9dchmswV0wWmz2VReXq7IyMiA/uEBzGAYhv61YJuemv2rJGlwhyQ9P7yLYiP5WQIABKjSA9KeL9zLrW/1zXu0vl1a/6S0939SwWb3mf3hE4FeqxyLuqWqwDzAAQACiGEYeuyrDZUF/639W+qtm3pQ8AMAAtuODyRXmdSgq/vmC/WaSykXu5e3veOb9wCCHEU/APiQYRj6v1nr9f9+2iFJeviS9nr0snNktQb28WUAAFRepq+Vj/byV2h1i/t+xweS4fLtewFBiKIfAHykouCfvmSnLBbp2Ws66/YBrcwOCwCAM3dotXRolWS1Sy1u8O17Nb1UssdKRZnS/oW+fS8gCFH0A4CPPPH1xmMK/i66tmeq2SEBAOAd295z3ze9XIpM8O172SKl1Gvcyzve9+17AUGIoh8AfODfC7Zp6sLtktwF/zU9mpkcEQAAXmK4pMyP3cstvXyZvhOpuBzgzo8lZ2ndvCcQJCj6AcDLvlyTpSe+3ihJemhYewp+AEBwyV0sFe9xT7lvMrRu3jPxAim6meTIk7Jm1817AkGCoh8AvGjFzoP668drJEm39Gup2wekmRwRAABetnOm+77pFe6p93XBYpVaXO9eZoo/4BGKfgDwkn2HS/SXGStV5nRpyDlJeuTSDrJYOEs/ACCIuJzSrv+4l1sMr9v3bnn0hIFZs6XyI3X73kAAo+gHAC9wOF266/1V2ne4VGclxuiF4V1l47J8AIBgs3+hVJwt2eOk5PS6fe/4LlJMK8lZLGV9U7fvDQQwin4A8IJ/fvOrft5xUDERYXprZA/ViwgzOyQAALyv4gR+qVdJtvC6fW+LRUr9o3t516d1+95AAKPoB4Az9MOv+yrP1P/ctV3UunGMyREBAOADx07tbz7CnBgqiv49X0nOEnNiAAIMRT8AnIEDhaX6239+kSTd2r+lhnZMNjkiAAB8ZP9CqWSfFN5ASh5kTgyNznWfxb+8UMrOMCcGIMBQ9APAaTIMQxP+u1a5haVqkxijfwxtZ3ZIAAD4TtZX7vsml0pWuzkxWKxSs6vdy0zxB2qFoh8ATtN/VuzWnA17ZbdZ9OKIroq028wOCQAA39nztfu+6SXmxtG8Yor/F5LLYW4sQACg6AeA07D/cKke/2qDJGncRWerY9M4kyMCAMCHCrdLBRsli01KGWJuLAn9pchEqeyQtPcHc2MBAgBFPwCchie/3qCCknKd0yRWfz6/ldnhAADgWxV7+Rv3l8LjTQ1FVpvU7Cr38u7PTQ0FCAQU/QDgoQWb9+vz1VmyWqTJV3dSmI1fpQCAIJd1tOhvYvLU/gpNL3Pf7/lKMgxzYwH8HH+pAoAHShxOPfL5OknSn/q2VOdm8eYGBACAr5Uf+X0avb8U/Ul/kGxRUtEuKW+N2dEAfo2iHwA88K8ft2nHgSIlxUbor+lnmx0OAAC+l/M/yVUq1WshxXUwOxq3sCgpebB7ec9X5sYC+DmKfgCopX2HS/TG/K2SpAeHtVf9SJMuVwQAQF06dmq/xWJuLMeqnOL/pblxAH6Ooh8AaunFjM0qKnOqS2q8Lu/SxOxwAADwPcP4vehveqm5sRyv4tKBB36WinPMjQXwYxT9AFALm3IOa+ayTEnSw5e0l8Wf9nQAAOAreb9IRbvdx88nDjQ7mqqiUqSGPd3LFV9MAKgm4Ir+119/XWlpaYqMjFSPHj20YMGCE7a95ZZbZLFYqt3OOeecyjbTpk2rsU1JSUlddAdAgJj8zUa5DGnoOck6t2VDs8MBAKBuVBTTSYPcx9H7G6b4A6cUUEX/zJkzNW7cOD300ENatWqVBgwYoIsvvliZmZk1tn/ppZeUnZ1dedu1a5caNmyoa6+9tkq72NjYKu2ys7MVGRlZF10CEACWbjugeZv2K8xq0QMXtzM7HAAA6s6eiqn9fnLW/uNVFP3ZGZKTnXZATQKq6H/hhRc0atQo3X777Wrfvr2mTJmi1NRUvfHGGzW2j4uLU3JycuVt+fLlOnTokG699dYq7SwWS5V2ycnJddEdAAHipe83S5JGnJuqlgn1TI4GAIA6UnpAOrDEvdxkmLmxnEiDrlJ0M8lZ5L7KAIBqwswOoLbKysq0YsUKPfDAA1XWp6ena9GiRbXaxtSpU3XRRRepRYsWVdYXFhaqRYsWcjqd6tq1qx5//HF169bthNspLS1VaWlp5eOCggJJksPhkMPhqG2XAk5F34K5j95Evjznjzn7ecdBLdp6QHabRXec18KvYpP8M2f+LlRyFuz98zXG+uDto7cFc84su75SmOGSEddR5eEpkpf66O2cWZOHybbtbTl3fyFX4mCvbNOfBPNnzFdCJWe17Z/FMAzDx7F4RVZWlpo2baqffvpJ/fr1q1z/1FNP6d1339WmTZtO+vrs7Gylpqbqgw8+0PDhwyvXL1myRFu2bFGnTp1UUFCgl156SbNnz9aaNWvUpk2bGrc1ceJETZo0qdr6Dz74QNHR0afZQwD+6NX1Vm0usKp/kkvDW7nMDgeotaKiIt1www3Kz89XbGys2eEEHMZ6QOpR8ryaORfoN/sftTF8pNnhnFBi+XL1LX1CxZZGmhP1b/+6rCDgQ7Ud6wOu6F+0aJH69u1buf7JJ5/U9OnT9euvv5709ZMnT9bzzz+vrKwshYeHn7Cdy+VS9+7ddf755+vll1+usU1N3/6npqYqNzc3qP+wcjgcysjI0ODBg2W3c33yUyFfnvO3nP2846BunLpcdptFc8edpybx/ncCI3/LWSAIlZwVFBQoISGBov80MdYH98+HNwVtzlzlCvuiqSyOQyq/8AcZCf29tmmv58xZrLBZybI4i+UYvFyK73zm2/QjQfsZ86FQyVltx/qAmd6fkJAgm82mnJyq1+Dct2+fkpKSTvpawzD0zjvvaOTIkSct+CXJarXq3HPP1ebNm0/YJiIiQhEREdXW2+32oP5QVQiVfnoL+fKcv+Ts9fnbJUnDe6aqRWP//iPfX3IWSII9Z8Hct7rAWB8a/fSmoMvZvqWS45AU3kBhSedJVu+XDV7Lmd3uvrpA1ley75sjNe5x5tv0Q0H3GasDwZ6z2vYtYE7kFx4erh49eigjI6PK+oyMjCrT/Wsyf/58bdmyRaNGjTrl+xiGodWrVyslJeWM4gUQ2NbtyddPWw7IZrXoLwNbmx0OAAB1q+JSfSlDfVLwe13F1QUq4gZQKQB+gn83fvx4jRw5Uj179lTfvn319ttvKzMzU2PGjJEkTZgwQXv27NF7771X5XVTp05V79691bFjx2rbnDRpkvr06aM2bdqooKBAL7/8slavXq3XXnutTvoEwD/9e8E2SdIlnVLUrAHH7wIAQkxF8dzETy/Vd7yKqwvkLnZfdSCikbnxAH4koIr+ESNG6MCBA3rssceUnZ2tjh07avbs2ZVn48/OzlZmZmaV1+Tn5+vTTz/VSy+9VOM28/LydMcddygnJ0dxcXHq1q2bfvzxR/Xq1cvn/QHgn7LyivXVL9mSpNEDWpkcDQAAdexIppS3VrJYpSZDzY6mduo1l+I7uePO/k5qeYPZEQF+I6CKfkkaO3asxo4dW+Nz06ZNq7YuLi5ORUVFJ9zeiy++qBdffNFb4QEIAtMW7VC5y1CfVg3VqVmc2eEAAFC3sma77xP6BtYe8yaXuIv+PV9T9APHCJhj+gGgLhwucejDpe4ZQ3ecz15+AEAI2hNgU/srVMSb/Y3kKjc3FsCPUPQDwDE+Xr5bh0vL1bpxPQ08O9HscAAAqFvlxdLe793LgVb0J/SRwhtIZYek3CVmRwP4DYp+ADjKMAy9v2SnJOnW/mmyWi0mRwQAQB3b+4PkLJaim7mPkQ8k1jD31QYkzuIPHIOiHwCOWrT1gLblHlFMRJiu6tbU7HAAAKh7x5613xKAX3434dJ9wPEo+gHgqBlH9/Jf1a2p6kUE3HlOAQA4M4YReJfqO16Toe6rDuStdV+FAABFPwBI0t6CEs3ZsFeSdGOf5iZHAwCACfI3SEd2StYIKfkPZkdzeiIaSY36uJcrrkIAhDiKfgCQ9NHPu+R0GerZooHaJceaHQ4AAHWvYi9/0oVSWD1zYzkTTY/OUtjDFH9AougHAJU7XfrwZ/cUwJv6tDA5GgAATBLoU/srVMS/93v31QiAEEfRDyDk/bh5v3IKStQg2q6LOyWbHQ4AAHWv7JC0/yf3ctMAL/rjO7uvPuAslvbNMzsawHQU/QBC3n9W7JYkXdmtqSLCbCZHAwCACbLnSIZTim0vxaSZHc2ZsVikJsPcy0zxByj6AYS2vKIyzd2wT5J0TY9mJkcDAIBJKorjppeaG4e3HHvpPsMwNxbAZBT9AELal2uyVOZ0qX1KrM5pEmd2OAAA1D2XU8r+xr0c6MfzV0ge5L4KwZEdUsFGs6MBTEXRDyCk/WflHknSH7s3NTkSAABMcnCZVJor2eOkxv3MjsY7wuq5r0IgMcUfIY+iH0DI2rLvsNbsylOY1aIru1H0AwBCVEVRnDJEstrNjcWbjp3iD4Qwin4AIes/K9x7+Qe2bayEmAiTowEAwCTBcqm+41VchWD/Qqksz9RQADNR9AMISS6Xoc9XVUzt5wR+AIAQVZQlHVolySI1udjsaLwrJs19NQLD6b46ARCiKPoBhKTlOw8pp6BE9SPD9If2iWaHAwCAObJmu+8b9ZIiG5sbiy80ZYo/QNEPICR9uSZLkjTknGRFhNlMjgYAAJME69T+CpXH9X8jGS5zYwFMQtEPIOSUO12avTZbknRZlyYmRwMAgEmcpVJOhnu5aZAW/Y37u69KULpfOrDM7GgAU1D0Awg5S7Yd1IEjZWoQbVe/1o3MDgcAAHPsmy+VH5GiUqQG3cyOxjesdikl3b3MFH+EKIp+ACGnYmr/xZ1SZLfxaxAAEKIqLtXXZJhksZgbiy9VTPHfQ9GP0MRfuwBCSlm5S9+sc0/tv7RzisnRAABgEsM45nj+S82NxdeaXCzJIh1aKRVnmx0NUOco+gGElIVb9qugpFyN60eodxpT+wEAIapgk1S4VbKGS8mDzI7GtyITpUbnupcrrlYAhBCKfgAh5etfciRJl3RKkc0axFMZAQA4mayv3PdJF0r2+ubGUheY4o8QRtEPIGSUO136/te9kqShHZNNjgYAABPt+dJ9H+xT+ytUXJ0gJ8N91QIghFD0AwgZP+84qLwihxrWC1fPFg3MDgcAAHOUHpT2/+RebhoiRX+DblJkslReKO1fYHY0QJ2i6AcQMuasd+/lH9QuUWGctR8AEKqyv5MMpxTXUYppaXY0dcNidV+lQGKKP0IOf/UCCAmGYWjOevfx/OnnMLUfABDCKqb2h8pe/goVU/yzKPoRWij6AYSE9VkFysovUZTdpgFtEswOBwAAc7jKpaxv3MtNLzM3lrqWPFiy2qXDm6WC38yOBqgzFP0AQsJ3R/fyX3B2Y0XabSZHAwCASfb/JDnypIgEqVFvs6OpW/b6UuPz3cvs7UcIoegHEBIqjucf0jHJ5EgAADBRxaX6mgyTrCH4JXhTLt2H0EPRDyDo7cg9ok17D8tmtegPbSn6AQAhbM/Roj/Ujuev0ORo0b//R8lx2NxYgDpC0Q8g6M3Z4J7a36dVQ8VF202OBgAAkxzeIhX8KlnCpOR0s6MxR+zZUsxZkssh5WSYHQ1QJwKu6H/99deVlpamyMhI9ejRQwsWnPg6m/PmzZPFYql2+/XXX6u0+/TTT9WhQwdFRESoQ4cO+uyzz3zdDQB1aO7GfZKk9A6ctR8AEMIq9vInXiCFx5kbi5mY4o8QE1BF/8yZMzVu3Dg99NBDWrVqlQYMGKCLL75YmZmZJ33dpk2blJ2dXXlr06ZN5XOLFy/WiBEjNHLkSK1Zs0YjR47U8OHDtXTpUl93B0AdyC92aMXOQ5KkP7RLNDkaAABMFKqX6jtexRT/rNmS4TI3FqAOBFTR/8ILL2jUqFG6/fbb1b59e02ZMkWpqal64403Tvq6xMREJScnV95stt9PWjJlyhQNHjxYEyZMULt27TRhwgQNGjRIU6ZM8XFvANSFhZtz5XQZat24nlIbRpsdDgAA5ig9IO2b715udrm5sZgt8XwprJ5UkiMdWmV2NIDPhZkdQG2VlZVpxYoVeuCBB6qsT09P16JFi0762m7duqmkpEQdOnTQww8/rAsvvLDyucWLF+u+++6r0n7IkCEnLfpLS0tVWlpa+bigoECS5HA45HA4atulgFPRt2DuozeRL8/5Imffbzx6qb42CUH5f8HnzHOhkrNg75+vMdYHbx+9LVByZsn8XGGGU0ZcZ5VHpEomxmt+zqyyJQ6SNesLOXd9IVf9zibFUTvm5yvwhErOatu/gCn6c3Nz5XQ6lZRU9czbSUlJysnJqfE1KSkpevvtt9WjRw+VlpZq+vTpGjRokObNm6fzz3dfozMnJ8ejbUrS5MmTNWnSpGrr58yZo+jo4N+TmJHBSU88Qb48562cuQwpY51NkkWReds0e/ZWr2zXH/E581yw56yoqMjsEAIaY31w/3z4gr/nrFfJ20qRtKmogzbNnm12OJLMzVlzR6q6SSrY+KF+3NHdtDg84e+fMX8U7Dmr7VgfMEV/BYvFUuWxYRjV1lVo27at2rZtW/m4b9++2rVrl5577rnKot/TbUrShAkTNH78+MrHBQUFSk1NVXp6umJjYz3qTyBxOBzKyMjQ4MGDZbdzBvRTIV+e83bO1u0p0OElS1Qv3Kax116kiLCAOqKpVviceS5UclaxZxqnh7E+uH8+vCkgclZeqLBZ10mSWg+8X63jzd2z7Rc5K+4qffWa4l1bNOwPPaVI/z3vj1/kK8CESs5qO9YHTNGfkJAgm81WbQ/8vn37qu2pP5k+ffpoxowZlY+Tk5M93mZERIQiIiKqrbfb7UH9oaoQKv30FvLlOW/lbOHWg5Kk/mclKCaq+s9sMOFz5rlgz1kw960uMNaHRj+9ya9zlv295CqRYlrJntBdOsnOrbpkas7sLaQG3WU5tFL2fXOk1reaE4cH/Poz5qeCPWe17VvA7PYKDw9Xjx49qk3RyMjIUL9+/Wq9nVWrViklJaXycd++fattc86cOR5tE4B/+mGT+1J9F3LWfgBAKNt19HLUqVf7TcHvF5pd4b7f9V9z4wB8LGD29EvS+PHjNXLkSPXs2VN9+/bV22+/rczMTI0ZM0aSeyrenj179N5770lyn5m/ZcuWOuecc1RWVqYZM2bo008/1aefflq5zXvvvVfnn3++nn76aV1xxRWaNWuW5s6dq4ULF5rSRwDecfBImVbtypMkDWzb2NxgAAAwi7NMyvrKvdzsKnNj8TfNr5HWPirlzJHK8qXwOLMjAnwioIr+ESNG6MCBA3rssceUnZ2tjh07avbs2WrRooUkKTs7W5mZmZXty8rKdP/992vPnj2KiorSOeeco6+//lrDhg2rbNOvXz999NFHevjhh/XII4+odevWmjlzpnr37l3n/QPgPQs275dhSO2S6yslLsrscAAAMMfe/0mOAikyWUroY3Y0/iWugxTbXirYKO35Skq70eyIAJ8IqKJfksaOHauxY8fW+Ny0adOqPP773/+uv//976fc5jXXXKNrrrnGG+EB8BM//MrUfgAAtPvo1P5mV0iWgDmyt+40v0Za97i06z8U/Qha/OQDCDoul6GFW3IlSReczdR+AECIcjml3bPcy6lXmxuLv0o9uuMv6xvJcdjcWAAfoegHEHQ27T2s3MIyRdlt6t68gdnhAABgjtxFUsleyR4nJQ40Oxr/FN9Jqt9GcpVKWbPNjgbwCYp+AEFn4Wb3Xv7erRoqPIxfcwCAELVzpvu+2RWSLdzcWPyVxfL73v7M/5gbC+Aj/DUMIOhUTO0/76wEkyMBAMAkrnJp1yfu5RbXmRuLv2teMcV/tlR+xNxYAB+g6AcQVErLnVq6/YAk6bw2FP0AgBC1b75Usk8KbyglX2R2NP6tQTepXprkLJKyvjU7GsDrKPoBBJWVO/NU4nApISZCbZPqmx0OAADm2PmR+z71j5LVbm4s/s5i+X1vf+Yn5sYC+ABFP4CgsnDLfknSeWc1ksViMTkaAABM4CyTdv3XvczU/tqpOK5/z5eSo9DcWAAvo+gHEFQWbnFP7e/P8fwAgFCVM1cqOyhFJkmJF5gdTWBodK4U09o9xb/iModAkKDoBxA08oscWrs7TxLH8wMAQljm0bP2N79WstrMjSVQWCxSyxvdyzveNzcWwMso+gEEjcXbcuUypNaN6yklLsrscAAAqHvOEmnXZ+7l5iPMjSXQVBT9OXPcJ0EEggRFP4CgsWAzl+oDAIS4rNlS+WEpupnUuJ/Z0QSW2LOlhj0lwynt/NjsaACvoegHEDR+2nK06G/T2ORIAAAwyfb33Pctrpcs/KnvMab4IwjxmwBAUNh9qEg7DhTJZrWod6uGZocDAEDdK9kv7fnavZx2s7mxBKoW17m/LDmwRDq81exoAK+g6AcQFBZvdZ+1v3OzOMVGcj1iAEAI2vmhZJRLDXtI8eeYHU1gikqWkga5l9nbjyBB0Q8gKCzZdlCS1KdVI5MjAQDAJBVT+9nLf2Za3uS+3/G+ZBjmxgJ4AUU/gKCwZJt7Tz9FPwAgJOWtlw6ukCxh7inqOH2pV0m2aOnwb1LuIrOjAc4YRT+AgLfrYJH25BXLZrWoZ4sGZocDAEDd2/6u+77pJVIkJ7Q9I/b6UoujlzvcOtXcWAAvoOgHEPCWbndP7e/cLE71IsJMjgYAgDrmKpd2zHAvM7XfO1qPct9nfiw5DpsbC3CGKPoBBDym9gMAQlrWbKk4W4pIkJoMMzua4JDQT4ptK5UfkXbONDsa4IxQ9AMIeBT9AICQtuUt932rWyRbhKmhBA2LRWp1dG8/U/wR4Cj6AQS0XQeLtPsQx/MDAELUkUwp6xv3cuvR5sYSbNL+5D4x4oElUv4Gs6MBThtFP4CAxvH8AICQtvXfkgwp6UIp9myzowkuUUlS00vdy1v+ZW4swBmg6AcQ0JYytR8AEKpc5b9PPT/rz+bGEqzOusN9v22a+/h+IABR9AMIaEu2U/QDAEJU1tdScZb7BH7NrjQ7muCUMkSKaS058qQdH5gdDXBaKPoBBKzdh4q06yDH8wMAQtTmN9z3rW7lBH6+YrFKbca6l397VTIMc+MBTgNFP4CAtXQbx/MDAEJU/kYp+ztJFqb2+1rrWyVblJT3i7T/J7OjATxG0Q8gYHGpPgBAyNr0kvu+2RVS/dbmxhLswhtILW9yL//2qrmxAKeBoh9AwFq+85AkqVfLhiZHAgBAHSo9IG1/z73cdpypoYSMs+903+/6VCrKMjcWwEMU/QAC0v7Dpdqee0QWi9Sd4/kBAKFky78kZ7HUoKuUeL7Z0YSGBl2kxgMko1z67RWzowE8QtEPICAt3+E+nr9tUn3FRdlNjgYAgDricvw+xbztOMliMTWckNL+fvf95jckR4G5sQAeoOgHEJCW7XBP7T+Xqf0AgFCy82OpeI8UmSS1uM7saEJL00ul2HaSI1/a8rbZ0QC1RtEPICAt3+ne09+zJVP7AQAhwnBJGya7l8++i8v01TWLVWr/N/fyry9KzjJz4wFqiaIfQMA5Ulqu9VnuaXXs6QcAhIzds6T89ZI91l30o+61vFGKaiIVZ0k7PzA7GqBWAq7of/3115WWlqbIyEj16NFDCxYsOGHb//73vxo8eLAaN26s2NhY9e3bV999912VNtOmTZPFYql2Kykp8XVXAJym1bvy5HQZahofpSbxUWaHAwCA7xmGtP5J9/LZd0nh8aaGE7JsEb9fMWHDM+7ZF4CfC6iif+bMmRo3bpweeughrVq1SgMGDNDFF1+szMzMGtv/+OOPGjx4sGbPnq0VK1bowgsv1GWXXaZVq1ZVaRcbG6vs7Owqt8jIyLroEoDTsOzoSfzOZWo/ACBUZM+RDq6QbNFcps9sbf4s2eOlgo3ucywAfi7M7AA88cILL2jUqFG6/fbbJUlTpkzRd999pzfeeEOTJ0+u1n7KlClVHj/11FOaNWuWvvzyS3Xr1q1yvcViUXJycq3jKC0tVWlpaeXjggL3NGOHwyGHw+FJlwJKRd+CuY/eRL48V9uc/bz9gCSpW2pcyOeXz5nnQiVnwd4/X2OsD94+eltd5cy27glZJTlbjZbLFi8F8P9R4H/OomQ9e5xs6yfKWPuoylOukKy+K6sCP191L1RyVtv+BUzRX1ZWphUrVuiBBx6osj49PV2LFi2q1TZcLpcOHz6shg2rHgNcWFioFi1ayOl0qmvXrnr88cerfClwvMmTJ2vSpEnV1s+ZM0fR0dG1iiWQZWRkmB1CQCFfnjtZzpyGtHy7TZJFRZlrNTt3bd0F5sf4nHku2HNWVFRkdggBjbE+uH8+fMGXOWvsXK1+JQvlVJjm7u6skqzZPnuvuhTIn7Mw42wNVn2FH/5Nv3w5QbvtF/r8PQM5X2YJ9pzVdqy3GIZh+DgWr8jKylLTpk31008/qV+/fpXrn3rqKb377rvatGnTKbfx7LPP6p///Kc2btyoxMRESdKSJUu0ZcsWderUSQUFBXrppZc0e/ZsrVmzRm3atKlxOzV9+5+amqrc3FzFxsaeYU/9l8PhUEZGhgYPHiy7neuinwr58lxtcrZ2T76ufnOpYiPDtGzChbJaQ/v6xHzOPBcqOSsoKFBCQoLy8/ODemzyFcb64P758Caf58xwyfZ9P1kPrZSzzd1ydX3e++9Rx4Llc2b99VnZ1j4ko15rlQ/9RbL6pi/Bkq+6FCo5q+1YHzB7+itYLFX/wDcMo9q6mnz44YeaOHGiZs2aVVnwS1KfPn3Up0+fysf9+/dX9+7d9corr+jll1+ucVsRERGKiKh+iRS73R7UH6oKodJPbyFfnjtZzlbtPixJ6tmyoSIiwusyLL/G58xzwZ6zYO5bXWCsD41+epPPcrbzY+nQSiksRrZOj8gWRP8vAf85a3eP9NsUWY5slX33h1LrUT59u4DPlwmCPWe17VvAnMgvISFBNptNOTk5Vdbv27dPSUlJJ33tzJkzNWrUKH388ce66KKLTtrWarXq3HPP1ebNm884ZgDet/zoSfx6chI/AECwczmkXx52L7e/X4psbG48qMoeI3U4eujxL49K5UfMjQc4gYAp+sPDw9WjR49qx2VkZGRUme5/vA8//FC33HKLPvjgA11yySWnfB/DMLR69WqlpKScccwAvMswDC3bcUiSdG7LhqdoDQBAgNv6jnR4sxTRWGo33uxoUJOzx0r1WkrFe6SNz5kdDVCjgCn6JWn8+PH697//rXfeeUcbN27Ufffdp8zMTI0ZM0aSNGHCBP3pT3+qbP/hhx/qT3/6k55//nn16dNHOTk5ysnJUX5+fmWbSZMm6bvvvtO2bdu0evVqjRo1SqtXr67cJgD/sfNAkXILSxVus6pT0zizwwEAwHfK8qW1/+de7viwZK9vbjyomS1S6vq0e3nDM1LRHnPjAWoQUEX/iBEjNGXKFD322GPq2rWrfvzxR82ePVstWrSQJGVnZyszM7Oy/VtvvaXy8nLdeeedSklJqbzde++9lW3y8vJ0xx13qH379kpPT9eePXv0448/qlevXnXePwAn9/PRqf1dUuMUabeZHA0AAD60dqJUsk+KbSudxc4ov9b8Wqlxf8lZJK150OxogGoC7kR+Y8eO1dixY2t8btq0aVUez5s375Tbe/HFF/Xiiy96ITIAvvb78fxM7QcABLG8ddJvr7iXe7ws2ThxrV+zWKTuL0rf9ZK2vyedfZfU6FyzowIqBdSefgChbXnl8fycxA8AEKQMQ1p+t2Q4pdSrpZR0syNCbTQ6V2o50r38858lV7m58QDHoOgHEBAOHSnTtlz3WXG7N6foBwAEqZ0fSfvmuY8V7/a82dHAE92elcIbSIdWSZteMjsaoBJFP4CAsGqXey9/q8b1FB/NNEcAQBAq2SetuMe93OFBKaalqeHAQ1FJ7sJfkn75P6lwh6nhABUo+gEEhJU78ySxlx8AEMSW3yWV5krxnaUO/zA7GpyOVrdJiRe4T+q3bKz7cA3AZBT9AALCykz3nn6KfgBAUMr8VMr8RLLYpD7TOHlfoLJYpF5vSdZwKfsbaetUsyMCKPoB+D+ny9CaXXmSpO4t4k2NBQAAryvZJy0/enWqDhOkht3MjQdnJrat1OVJ9/KKe6WCzebGg5BH0Q/A723KOawjZU7FRISpTWJ9s8MBAMB7DJe0aKS78I/rKHV82OyI4A3txktJF7qn+S+6UXI5zI4IIYyiH4Dfq5ja3yU1TjarxeRoAADwog3PSDlzJFuUdN5MyRZhdkTwBotV6vOuZI+XDi6T1k40OyKEMIp+AH6P4/kBAEFp/0/SL0f37Pd8TYrrYG488K56qe7j+yVp/VPS7i/MjQchi6IfgN9blZkniaIfABBEirKkhcMlwym1vElqdYvZEcEXWgyXzr7Lvbx4pFSwydx4EJIo+gH4tUNHyrQ994gkqVvzeHODAQDAG8qLpB+vkIqz3Hv3z33dfdZ3BKfuL0iNz5McBdKPV0mOw2ZHhBBD0Q/Ar63a5Z7a36pxPcVHc/kiAECAMwxpya3SweVSRCPpgi8lOyepDWpWu3TeJ1JUE6lgo7TwWk7shzpF0Q/Ar63cmSeJqf0AgCCx5kEp82N3ITjgv1JMK7MjQl2ISpYGfCbZoqXs76Slo91fAAF1gKIfgF/jJH4AgKCx4Wlpwz/dy+e+JSWeb248qFsJvaTzPpYsNmn7u7+fxBHwMYp+AH7L6TK0ZleeJKl7i3hTYwEA4Iz89rq0+gH3ctdnpNa3mhsPzNH0EqnX2+7l9U9J654wNx6EBIp+AH5rU85hHSlzKiYiTG0SOd4RABCgNr8hLT96BvdzHpI6/M3ceGCu1rdJXY/O+PjlEWntJHPjQdCj6Afgtyqm9ndJjZPNylmNAQABaP0/pWVjJRlS23ulzo+bHRH8QYd//F74r50orXmIY/zhMxT9APwWx/MDAAKW4ZJW/V1aM8H9+JyHpe4vcmk+/K7DP9yHekjuqf5LbpWcZebGhKBE0Q/Ab63KzJNE0Q8ACDCOQmnB1dLGZ92Puz0rdXmcgh/Vdfib1Out30/uN2+YVJZvdlQIMhT9APzSoSNl2p57RJLUrXm8ucEAAFBbhTukjP7S7lmSNVzq+57U/n6zo4I/O+sO6fwvpLB60t7vpW97Sod+MTsqBBGKfgB+adUu99T+Vo3rKT463ORoAACohcxPpG+6Snm/SJFJ0kXzpbSRZkeFQNB0mHTRj1J0c6lwizSnj7TtXbOjQpCg6Afgl1buzJPE1H4AgP8LM4plW/4XaeFwyZEvNeojDVkmJfQxOzQEkobdpYtXSilDJWextOQW92eqdL/ZkSHAUfQD8EucxA8AEAgsWV/rwuK7Zd0+VZJFOudBafCPUr1Us0NDIIpoJA382n2VB0uYlPmJwr7rqpTyRWZHhgBG0Q/A7zhdhtbsypMkdW8Rb2osAADU6MguaeEIhf10laKNXBn10qQ/zJW6PClZ7WZHh0BmsUodH5aGLJXiOspSul+9Sp+RbcHlUv6vZkeHAETRD8Dv/La3UEfKnIqJCFObxPpmhwMAwO/K8qXVE6SvzpYyP5Yhqzbbr1R5+kop+Q9mR4dg0rC7NHS5nO3+IZfCZM35VprdSVoxXirJNTs6BBCKfgB+Z9XRvfxdUuNks3J5IwCAHyjLc19L/cvW0oZ/Ss4SqfEAlV+0WBvCb3GfeR3wNluEXJ0e1/+iXpIrZZhklEubXpS+SJNWP0jxj1qh6Afgd1ZXTO3neH4AgNmO7JJW/UP6vLm05iGp9IAU2959ibWL5ksNupkdIULAEWtTOc/7XBr4jdSgq1ReKG2Y7C7+l98tFWwyO0T4sTCzAwCA463alS+Joh8AYBJXuZT1jbTlLSn7G8lwudfHdZQ6PCC1GCFZ+TMaJmgyVEoZIu35Ulo7UTq0SvrtVfctebDU5i9Sk2GSLcLsSOFH+G0FwK8UOqQdB4okSd2ax5sbDAAgdLicUu5PUuYnUuZ/pJKc359LulBqe5/U9BL3SdYAM1ksUrPLpaaXSXu/lza94v4SICfDfbPHSy2GSy1ukBqfJ1ltZkcMk1H0A/ArOwvdx/C3alxP8dHhJkcDAAhqZYeknP+5C6U9X0jF2b8/F9FISrtFOusOKfZs00IETshikZIvct8Kt0ub35R2zJCKs6Qtb7tvEY2klGFS00ullHQpPN7sqGECin4AfmXHYXfRz9R+AIDXleyXDiyVche7i/2DP/8+dV+S7HFSsyul5sPdhZSNL58RIGLSpG5PS12ekvbNdxf/uz5zn4Nix3T3zWJ1n4Oi8flS4vnuWQCRCWZHjjpA0Q/Ar2w/7L6n6AcAnDbDkIp2S/nrpPz10qHVUu4SqXBr9bax7aTkdPdx0smDOBYagc1qc186MvkPUq+3pdxF0p6v3NP/C36VDq5w3za96G5fL819acAG3dz38Z2lqCbuWQQIGgFX9L/++ut69tlnlZ2drXPOOUdTpkzRgAEDTth+/vz5Gj9+vNavX68mTZro73//u8aMGVOlzaeffqpHHnlEW7duVevWrfXkk0/qqquu8nVXABzH6TKUeXR6f/cW8eYGAwDwby6nexrzke1S4Q7pyA73cv6vUsEGyVFQ8+ti20sJfaTG/d3Ffr3UuowaqDvWMPce/cTzpW7PuL8I27dA2vejtP9HKX+D+2fmyHZp16e/vy4sRqp/tvuwlvptpfptpHotpOhmUnRTyWo3r084LQFV9M+cOVPjxo3T66+/rv79++utt97SxRdfrA0bNqh58+bV2m/fvl3Dhg3T6NGjNWPGDP30008aO3asGjdurD/+8Y+SpMWLF2vEiBF6/PHHddVVV+mzzz7T8OHDtXDhQvXu3buuuwiEtN/2FqrUZVG9CJvaJNY3OxwAQF1yOaXyw5IjXyrLlxx5UsleqXiv+/74W9Fu9zXLT8QS5i5a4jq6bwm9pUa9OKYZoSu6mdTyevdNcp/T4tBq6eBK9+3QSunwZvflAA8dfVyNRYpKlqJT3duLTJIiEo7eGv++HNnYfULBsHrMGvADHhf9t9xyi2677Tadf/75vojnpF544QWNGjVKt99+uyRpypQp+u677/TGG29o8uTJ1dq/+eabat68uaZMmSJJat++vZYvX67nnnuusuifMmWKBg8erAkTJkiSJkyYoPnz52vKlCn68MMP66ZjACRJq3blSZK6NI2TzcoAAQA+YxiSjKP3Lslwui9TV1ascCPffUK7Mou7qHY5jt6XS4bj6H0Nj52lkrO46q28uPo6Z7FUXuTeE+/I/73ILz/seT8sYVK95u4pyjEtpXotpZizpPiO7j2VHJMPnFh4A/eVKZIu/H2ds0wq3CYd3iQV/Oa+P7xFKtrl/qLNVeb+/VCcLR34+dTvYbG6Zw6E1ZfssZK9ftVlW7RkizzuFuW+tx633hru/pm3hlW9r2md01CYUej+AsMa5V4nizueEPwSwuOi//Dhw0pPT1dqaqpuvfVW3XzzzWratKkvYquirKxMK1as0AMPPFBlfXp6uhYtWlTjaxYvXqz09PQq64YMGaKpU6fK4XDIbrdr8eLFuu+++6q1qfiioCalpaUqLS2tfFxQ4J4+5nA45HA4POlWQKnoWzD30ZvIl+dW7jwkSerctD55qyU+Z54LlZwFe/98zZdjvXX132TNnq3fi+7jC/Bj17mqtqt4fML2p96GRcYJY7NLuliSvjqjLp4RwxrhPqGePU5GZKIU0VhGZJIUkShFJh1dlyQjutnRY49PcDkyl9xfWPhYqPxO8SZy5pm6zZdFim7tviUNq/qU4ZJK90vFe2Qp2iVL8R7349IDslTcl+VKpe6bxSh3v8ZR4L4V76mD+N3ski6RpM9qft6QRZVfAnjzXjrmSwVLDeuOvn9CfznP/dcZ97O2nwmPi/5PP/1UBw4c0IwZMzRt2jQ9+uijuuiiizRq1ChdccUVstt9c4xHbm6unE6nkpKSqqxPSkpSTk5Oja/JycmpsX15eblyc3OVkpJywjYn2qYkTZ48WZMmTaq2fs6cOYqOjq5tlwJWRkaG2SEEFPJVe4t+s0myyLV/m2bPruFkSzghPmeeC/acFRUVmR1CQPPlWN+jZKWaOTef0TZ8zZBVLlllyCZDNrlkk2E5ZrnG9WFyKlxOS7hcR++dipBT4XJZwiufcypcLkXIYYmSw1JP5aonhyVaDku0ylVPLou9Igip+OitmkNHb2vrKiWnFOy/U3yBnHnGv/Jll9Ty6O04NklRhmwqVZhRrDAVHb0vlv3ofZjhXmdTmaxyyGYcvVeZrIajcr3VKJNNDtlUKovhlFVOWeSURS5Z5JTVqHjsvrl/c53ksJ+jLFW+FHUv1qX9RfW0eP/sM95Obcf60zqmv1GjRrr33nt17733atWqVXrnnXc0cuRIxcTE6KabbtLYsWPVpk2b09n0KVmO/5bEMKqtO1X749d7us0JEyZo/PjxlY8LCgqUmpqq9PR0xcbGnroTAcrhcCgjI0ODBw/22Zc7wYR8eebgkTLtXzxPknTLZReocWzwf4HmDXzOPBcqOavYM43T49OxvqCVyktzj9lDdNweJ1lkVK6zVK6rqZ1n66w1bO/oOotNstjlcBrKmPuDBqcPqfLzYT2zHge1UPmd4k3kzDPkq3YMSc6jN0dZqeZmfKuL/jBQ9jDL0Vk/x89+OtP7o7OnDNcxl/40qt4bRo3rG9jjNCyu4xn3ubZj/RmdyC87O1tz5szRnDlzZLPZNGzYMK1fv14dOnTQM888U23a/JlISEiQzWartgd+37591fbUV0hOTq6xfVhYmBo1anTSNifapiRFREQoIqL65VzsdntI/CCGSj+9hXzVzvqcg5KkxEhDjWOjyZmH+Jx5LthzFsx9qws+HesbdTqz1/uSwyFZrEH/8+EL5Mxz5Mwz5MszhsUue1RcUOestn3z+Itbh8OhTz/9VJdeeqlatGihTz75RPfdd5+ys7P17rvvas6cOZo+fboee+wxj4M+mfDwcPXo0aPatJaMjAz169evxtf07du3Wvs5c+aoZ8+elQk6UZsTbROAb6zcmSdJalm/judXAQAAAEHM4z39KSkpcrlcuv766/Xzzz+ra9eu1doMGTJE8fHxXgivqvHjx2vkyJHq2bOn+vbtq7fffluZmZkaM2aMJPdUvD179ui9996TJI0ZM0avvvqqxo8fr9GjR2vx4sWaOnVqlbPy33vvvTr//PP19NNP64orrtCsWbM0d+5cLVy40OvxAzixlZnuk/ilUfQDAAAAXuNx0f/iiy/q2muvVWRk5AnbNGjQQNu3bz+jwGoyYsQIHThwQI899piys7PVsWNHzZ49Wy1atJDkPtwgMzOzsn1aWppmz56t++67T6+99pqaNGmil19+ufJyfZLUr18/ffTRR3r44Yf1yCOPqHXr1po5c6Z69+7t9fgB1MzpMrTm6OX6WsZQ9AMAAADe4nHRP3LkSF/EUWtjx47V2LFja3xu2rRp1dZdcMEFWrly5Um3ec011+iaa67xRngATsOmnMM6UuZUvXCbkqNPfcZVAAAAALXDyVgBmK5ian+XZnGynvjCGQAAAAA8RNEPwHQVRX/X1HhzAwEAAACCDEU/ANOtysyTJHVrHmduIAAAAECQoegHYKqDR8q0PfeIJKlrs3hzgwEAAACCDEU/AFOtOjq1v1XjeoqPtpscDQAAABBcKPoBmKrieP7uzRuYHAkAAAAQfCj6AZhq5c48SRT9AAAAgC9Q9AMwTbnTpTW78yRJ3VvEmxoLAAAAEIwo+gGYZtPewyoqcyomIkxtEuubHQ4AAAAQdCj6AZhmZeWl+uJls1rMDQYAAAAIQhT9AEyzaqf7JH7dOJ4fAAAA8AmKfgCm+f3M/fHmBgIAAAAEKYp+AKY4UFiqHQeKJEndUtnTDwAAAPgCRT8AU6w6ejz/WYkxiou2mxsMAAAAEKQo+gGYgqn9AAAAgO9R9AMwxe9FP1P7AQAAAF+h6AdQ58qdLq3ZlS9J6t6Coh8AAADwFYp+AHXu15zDKnY4VT8yTGc1jjE7HAAAACBoUfQDqHOrjk7t75oaL6vVYnI0AAAAQPCi6AdQ51YePXM/x/MDAAAAvkXRD6DOVZ7Ej+P5AQAAAJ+i6AdQp3ILS7XzQJEk9/R+AAAAAL5D0Q+gTq06OrW/TWKM4qLs5gYDAAAABDmKfgB1qnJqP8fzAwAAAD5H0Q+gTq3cWXE8f7y5gQAAAAAhgKIfQJ1xOF1asztPEnv6AQAAgLpA0Q+gzqzPKlCJw6X4aLtaN44xOxwAAAAg6FH0A6gzy3cclCT1aN5AVqvF5GgAAACA4EfRD6DOLN/hPp6/Z8uGJkcCAAAAhAaKfgB1wjAMLd9ZUfRzPD8AAABQFyj6AdSJnQeKlFtYqnCbVZ2axpkdDgAAABASKPoB1ImKvfydm8Up0m4zORoAAAAgNFD0A6gTlSfxY2o/AAAAUGcCpug/dOiQRo4cqbi4OMXFxWnkyJHKy8s7YXuHw6F//OMf6tSpk+rVq6cmTZroT3/6k7Kysqq0GzhwoCwWS5Xbdddd5+PeAKGnYk//uS04iR8AAABQVwKm6L/hhhu0evVqffvtt/r222+1evVqjRw58oTti4qKtHLlSj3yyCNauXKl/vvf/+q3337T5ZdfXq3t6NGjlZ2dXXl76623fNkVIOQcOlKmLfsKJUk9WrCnHwAAAKgrYWYHUBsbN27Ut99+qyVLlqh3796SpH/961/q27evNm3apLZt21Z7TVxcnDIyMqqse+WVV9SrVy9lZmaqefPmleujo6OVnJzs204AIWzF0b38ZyXGqEG9cJOjAQAAAEJHQBT9ixcvVlxcXGXBL0l9+vRRXFycFi1aVGPRX5P8/HxZLBbFx8dXWf/+++9rxowZSkpK0sUXX6xHH31U9evXP+F2SktLVVpaWvm4oKBAkvuQAofD4UHPAktF34K5j95Evn63dFuuJKl7atxJ80HOPEfOPBcqOQv2/vkaY33w9tHbyJnnyJlnyJfnQiVnte1fQBT9OTk5SkxMrLY+MTFROTk5tdpGSUmJHnjgAd1www2KjY2tXH/jjTcqLS1NycnJWrdunSZMmKA1a9ZUmyVwrMmTJ2vSpEnV1s+ZM0fR0dG1iieQnSw3qI58SXPX2SRZZM/L1OzZO0/Znpx5jpx5LthzVlRUZHYIAY2xPrh/PnyBnHmOnHmGfHku2HNW27HeYhiG4eNYTmjixIk1DqjHWrZsmebMmaN3331XmzZtqvJcmzZtNGrUKD3wwAMn3YbD4dC1116rzMxMzZs3r0rRf7wVK1aoZ8+eWrFihbp3715jm5q+/U9NTVVubu5Jtx3oHA6HMjIyNHjwYNntdrPD8Xvky63U4VS3J/8nh9PQ3PvOU4uGJ/5jmZx5jpx5LlRyVlBQoISEBOXn5wf12OQrjPXB/fPhTeTMc+TMM+TLc6GSs9qO9abu6b/rrrtOeab8li1b6pdfftHevXurPbd//34lJSWd9PUOh0PDhw/X9u3b9b///e+UA3X37t1lt9u1efPmExb9ERERioiIqLbebrcH9YeqQqj001tCPV+r9xyWw2koISZCrRNjZbFYTvmaUM/Z6SBnngv2nAVz3+oCY31o9NObyJnnyJlnyJfngj1nte2bqUV/QkKCEhISTtmub9++ys/P188//6xevXpJkpYuXar8/Hz169fvhK+rKPg3b96sH374QY0aNTrle61fv14Oh0MpKSm17wiAE1q+4+il+lo2qFXBDwAAAMB7AuKSfe3bt9fQoUM1evRoLVmyREuWLNHo0aN16aWXVjmJX7t27fTZZ59JksrLy3XNNddo+fLlev/99+V0OpWTk6OcnByVlZVJkrZu3arHHntMy5cv144dOzR79mxde+216tatm/r3729KX4Fgs3zHQUlcqg8AAAAwQ0AU/ZL7DPudOnVSenq60tPT1blzZ02fPr1Km02bNik/P1+StHv3bn3xxRfavXu3unbtqpSUlMrbokWLJEnh4eH6/vvvNWTIELVt21b33HOP0tPTNXfuXNlstjrvIxBsXC5DKzIr9vQ3NDkaAAAAIPQExNn7Jalhw4aaMWPGSdsce07Cli1b6lTnKExNTdX8+fO9Eh+A6rbsL1RekUNRdps6NAneE18BAAAA/ipg9vQDCDxLtx2QJHVvES+7jV83AAAAQF3jr3AAPrNku/t4/t5ppz6JJgAAAADvo+gH4BOGYWjptoqin+P5AQAAADNQ9APwiW25R5RbWKrwMKu6pMabHQ4AAAAQkij6AfhExV7+bqnxirRzNQwAAADADBT9AHxi6Xb3Sfx6t+J4fgAAAMAsFP0AvO7Y4/n7cDw/AAAAYBqKfgBel3mwSDkFJbLbLOrWvIHZ4QAAAAAhi6IfgNdV7OXvmhqvqHCO5wcAAADMQtEPwOuWbDt6PH8ax/MDAAAAZqLoB+B1S7e79/T3bsXx/AAAAICZKPoBeNWug0Xak1esMKtFPVpwPD8AAABgJop+AF5VsZe/U7M4RYeHmRwNAAAAENoo+gF4FcfzAwAAAP6Doh+A1xiGoUVbciVJfVtT9AMAAABmo+gH4DU7DhQpK79E4Tarzm3J8fwAAACA2Sj6AXjNT0f38ndrHs/x/AAAAIAfoOgH4DWLtrqL/v5nJZgcCQAAAACJoh+Al7hchhZvdZ/Er/9ZHM8PAAAA+AOKfgBesTGnQIeKHKoXblPnZvFmhwMAAABAFP0AvGTRlqOX6mvVSHYbv1oAAAAAf8Bf5gC84qejx/P341J9AAAAgN+g6AdwxsrKXfp5+0FJnMQPAAAA8CcU/QDO2JrdeSoqc6pRvXC1TapvdjgAAAAAjqLoB3DGftrintrft3UjWa0Wk6MBAAAAUIGiH8AZW7jZXfQztR8AAADwLxT9AM5IfpFDKzMPSZLOP7uxydEAAAAAOBZFP4Az8tPWXLkMqU1ijJrGR5kdDgAAAIBjUPQDOCPzN+2XJF3AXn4AAADA71D0AzhthmFo/m/uop+p/QAAAID/oegHcNp+21uonIISRdqt6pXW0OxwAAAAAByHoh/AaZv/2z5JUp9WjRRpt5kcDQAAAIDjUfQDOG0VU/s5nh8AAADwTwFT9B86dEgjR45UXFyc4uLiNHLkSOXl5Z30NbfccossFkuVW58+faq0KS0t1d13362EhATVq1dPl19+uXbv3u3DngDB4UhpuZZtd1+qj6IfAAAA8E8BU/TfcMMNWr16tb799lt9++23Wr16tUaOHHnK1w0dOlTZ2dmVt9mzZ1d5fty4cfrss8/00UcfaeHChSosLNSll14qp9Ppq64AQWHJtgMqc7qU2jBKaQn1zA4HAAAAQA3CzA6gNjZu3Khvv/1WS5YsUe/evSVJ//rXv9S3b19t2rRJbdu2PeFrIyIilJycXONz+fn5mjp1qqZPn66LLrpIkjRjxgylpqZq7ty5GjJkiPc7AwSJyrP2t2ksi8VicjQAAAAAahIQRf/ixYsVFxdXWfBLUp8+fRQXF6dFixadtOifN2+eEhMTFR8frwsuuEBPPvmkEhMTJUkrVqyQw+FQenp6ZfsmTZqoY8eOWrRo0QmL/tLSUpWWllY+LigokCQ5HA45HI4z6qs/q+hbMPfRm4I5X4Zh6H8b90qSzmvd0Gt9DOac+Qo581yo5CzY++drjPXB20dvI2eeI2eeIV+eC5Wc1bZ/AVH05+TkVBbqx0pMTFROTs4JX3fxxRfr2muvVYsWLbR9+3Y98sgj+sMf/qAVK1YoIiJCOTk5Cg8PV4MGDaq8Likp6aTbnTx5siZNmlRt/Zw5cxQdHe1BzwJTRkaG2SEElGDMV1aRtDsvTGEWQ4e3LNfs7d7dfjDmzNfImeeCPWdFRUVmhxDQGOuD++fDF8iZ58iZZ8iX54I9Z7Ud600t+idOnFjjgHqsZcuWSVKN04cNwzjptOIRI0ZULnfs2FE9e/ZUixYt9PXXX+vqq68+4etOtd0JEyZo/PjxlY8LCgqUmpqq9PR0xcbGnrQ/gczhcCgjI0ODBw+W3W43Oxy/F8z5emP+NklbdF6bxrrqsu5e224w58xXyJnnQiVnFXumcXoY64P758ObyJnnyJlnyJfnQiVntR3rTS3677rrLl133XUnbdOyZUv98ssv2rt3b7Xn9u/fr6SkpFq/X0pKilq0aKHNmzdLkpKTk1VWVqZDhw5V2du/b98+9evX74TbiYiIUERERLX1drs9qD9UFUKln94SjPn64bdcSdLgc5J90rdgzJmvkTPPBXvOgrlvdYGxPjT66U3kzHPkzDPky3PBnrPa9s3Uoj8hIUEJCQmnbNe3b1/l5+fr559/Vq9evSRJS5cuVX5+/kmL8+MdOHBAu3btUkpKiiSpR48estvtysjI0PDhwyVJ2dnZWrdunZ555pnT6BEQ/PYfLtXqXXmSpEHtav+lGwAAAIC6FxCX7Gvfvr2GDh2q0aNHa8mSJVqyZIlGjx6tSy+9tMpJ/Nq1a6fPPvtMklRYWKj7779fixcv1o4dOzRv3jxddtllSkhI0FVXXSVJiouL06hRo/TXv/5V33//vVatWqWbbrpJnTp1qjybP4Cqfvh1nwxD6tQ0TslxkWaHAwAAAOAkAuJEfpL0/vvv65577qk80/7ll1+uV199tUqbTZs2KT8/X5Jks9m0du1avffee8rLy1NKSoouvPBCzZw5U/Xr1698zYsvvqiwsDANHz5cxcXFGjRokKZNmyabzVZ3nQMCyNyjZ+0f1L76yTUBAAAA+JeAKfobNmyoGTNmnLSNYRiVy1FRUfruu+9Oud3IyEi98soreuWVV844RiDYlTicWrDZfTz/Re2Z2g8AAAD4u4CY3g/APyzeekDFDqdS4iJ1TpPgPXs1AAAAECwo+gHU2rfrciS5p/af7LKWAAAAAPwDRT+AWil3ujRng7vov7hjisnRAAAAAKgNin4AtbJ0+0EdKnKoQbRdvdMamh0OAAAAgFqg6AdQK9+sy5YkpXdIVpiNXx0AAABAIOAvdwCn5HQZ+nad+1J9F3dKNjkaAAAAALVF0Q/glFbsPKTcwlLVjwxTv9YJZocDAAAAoJYo+gGc0uy17qn9gzskKTyMXxsAAABAoOCvdwAn5XIZ+m49Z+0HAAAAAhFFP4CTWpl5SNn5JaoXbtOANkztBwAAAAIJRT+Ak/p89R5J0pCOyYq020yOBgAAAIAnKPoBnJDD6dLXv7iP57+ya1OTowEAAADgKYp+ACf042/7dajIoYSYCPVr3cjscAAAAAB4iKIfwAnNWp0lSbqsS4rCbPy6AAAAAAINf8UDqNGR0nJlbNgrSbqCqf0AAABAQKLoB1CjORtyVOxwqmWjaHVpFmd2OAAAAABOA0U/gBp9vso9tf+Krk1lsVhMjgYAAADA6aDoB1BNdn6xFmzeL0m6shtT+wEAAIBARdEPoJr/LN8tlyH1TmuotIR6ZocDAAAA4DRR9AOowuUyNHP5LknSiHNTTY4GAAAAwJmg6AdQxeJtB7T7ULHqR4Tp4o4pZocDAAAA4AxQ9AOoYuYy917+y7s2UVS4zeRoAAAAAJwJin4AlfKKyvTt+hxJ0nXnNjc5GgAAAABniqIfQKXPVu1RWblL7VNi1bFprNnhAAAAADhDFP0AJLlP4Dd98U5J0vW9UmWxWEyOCAAAAMCZougHIElasCVX23KPKCYiTFd3b2Z2OAAAAAC8gKIfgCTp3UU7JEnX9GimmIgwc4MBAAAA4BUU/QC0I/eIfti0T5J0c7+W5gYDAAAAwGso+gHovcU7ZRjSwLaNlZZQz+xwAAAAAHgJRT8Q4o6UluuT5bsksZcfAAAACDYU/UCI+/DnTB0uLVdaQj1d0Kax2eEAAAAA8CKKfiCElZY79e8F2yVJd5zfSlYrl+kDAAAAgglFPxDCPl+1RzkFJUqKjdDV3ZuaHQ4AAAAALwuYov/QoUMaOXKk4uLiFBcXp5EjRyovL++kr7FYLDXenn322co2AwcOrPb8dddd5+PeAOZzugy9NX+bJOn281opIsxmckQAAAAAvC1gLsZ9ww03aPfu3fr2228lSXfccYdGjhypL7/88oSvyc7OrvL4m2++0ahRo/THP/6xyvrRo0frscceq3wcFRXlxcgB//Td+hxtyz2iuCi7ru/d3OxwAAAAAPhAQBT9Gzdu1LfffqslS5aod+/ekqR//etf6tu3rzZt2qS2bdvW+Lrk5OQqj2fNmqULL7xQrVq1qrI+Ojq6WtuTKS0tVWlpaeXjgoICSZLD4ZDD4aj1dgJNRd+CuY/e5M/5MgxDr/2wWZJ0U+9URVgNv4jTn3Pmr8iZ50IlZ8HeP19jrA/ePnobOfMcOfMM+fJcqOSstv2zGIZh+DiWM/bOO+9o/Pjx1abzx8fH68UXX9Stt956ym3s3btXzZo107vvvqsbbrihcv3AgQO1fv16GYahpKQkXXzxxXr00UdVv379E25r4sSJmjRpUrX1H3zwgaKjo2vfMcAkaw5Y9M5vNkVYDf1fd6di7GZHBMDbioqKdMMNNyg/P1+xsbFmhxNwGOsBAP6utmN9QOzpz8nJUWJiYrX1iYmJysnJqdU23n33XdWvX19XX311lfU33nij0tLSlJycrHXr1mnChAlas2aNMjIyTritCRMmaPz48ZWPCwoKlJqaqvT09KD+w8rhcCgjI0ODBw+W3U6VeCr+mi+ny9Arry6SdESjBrTW8IvOMjukSv6aM39GzjwXKjmr2DON08NYH9w/H95EzjxHzjxDvjwXKjmr7VhvatF/om/Rj7Vs2TJJ7pPyHc8wjBrX1+Sdd97RjTfeqMjIyCrrR48eXbncsWNHtWnTRj179tTKlSvVvXv3GrcVERGhiIiIauvtdntQf6gqhEo/vcXf8vXVqt3asv+IYiPD9OeBZ/lVbBX8LWeBgJx5LthzFsx9qwuM9aHRT28iZ54jZ54hX54L9pzVtm+mFv133XXXKc+U37JlS/3yyy/au3dvtef279+vpKSkU77PggULtGnTJs2cOfOUbbt37y673a7NmzefsOgHApXD6dKUue5j+f98QWvFRQXvL0EAAAAAJhf9CQkJSkhIOGW7vn37Kj8/Xz///LN69eolSVq6dKny8/PVr1+/U75+6tSp6tGjh7p06XLKtuvXr5fD4VBKSsqpOwAEmBlLdmrngSIlxITr1v4tzQ4HAAAAgI9ZzQ6gNtq3b6+hQ4dq9OjRWrJkiZYsWaLRo0fr0ksvrXLm/nbt2umzzz6r8tqCggJ98sknuv3226ttd+vWrXrssce0fPly7dixQ7Nnz9a1116rbt26qX///j7vF1CXDh0pq9zLP35wW0WHB8QpPQAAAACcgYAo+iXp/fffV6dOnZSenq709HR17txZ06dPr9Jm06ZNys/Pr7Luo48+kmEYuv7666ttMzw8XN9//72GDBmitm3b6p577lF6errmzp0rm83m0/4Ade2l7zcrv9ihdsn1NeLcVLPDAQAAAFAHAmZXX8OGDTVjxoyTtqnp6oN33HGH7rjjjhrbp6amav78+V6JD/BnW/Yd1vQlOyVJ/3dpB9mstTsBJgAAAIDAFjB7+gGcHsMw9Mjn6+V0GbqofZL6nXXq82gAAAAACA4U/UCQ+3TlHi3edkCRdqsevayD2eEAAAAAqEMU/UAQO3ikTE9+vUGSdO+gs5XaMNrkiAAAAADUJYp+IIg98fUGHSpyn7zv9gFpZocDAAAAoI5R9ANB6rv1Ofrvyj2yWKSnru4ku40fdwAAACDUUAUAQWj/4VJN+O9aSdKfz2+t7s0bmBwRAAAAADNQ9ANBxjAMTfjvLzp4pEztkuvrvsFtzA4JAAAAgEko+oEgM3Xhds3duE/hNqumXNdVEWE2s0MCAAAAYBKKfiCILNtxUP/85ldJ0kOXtFe75FiTIwIAAABgJop+IEjsP1yqO99fqXKXocu6NNGf+rYwOyQAAAAAJqPoB4JAablTd36wUvsOl+qsxBj98+pOslgsZocFAAAAwGQU/UCAMwxDf//PL/p5+0HFRITpzZu6q15EmNlhAQAAAPADFP1AgHt+zm+atTpLNqtFr9/YXWcl1jc7JAAAAAB+gqIfCGDTl+zUqz9skSRNvqqTzj+7sckRAQAAAPAnFP1AgPrw50w98vk6SdLdfzhLw89NNTkiAAAAAP6Goh8IQB8v36UHP1srSbqtf5rGDz7b5IgAAAAA+COKfiDAvLtoh/7x6S8yDOnmvi30yKXtOVM/AAAAgBpxim8gQBiGoefmbNJrP2yV5C74J15+DgU/AAAAgBOi6AcCQInDqQc/W6v/rtwjSbo//WzdeeFZFPwAAAAAToqiH/Bze/KKNWb6Cq3dky+b1aKnruqoEec2NzssAAAAAAGAoh/wY/M27dP4j9fo4JEyNYi269Ubuqv/WQlmhwUAAAAgQFD0A36ouMypyd9s1HuLd0qSOjaN1Zs39VCzBtEmRwYAAAAgkFD0A35m8dYDeujztdq2/4gk6ZZ+LfXAxe0UabeZHBkAAACAQEPRD/iJfYdL9NTXG/X56ixJUlJshJ69povOP7uxyZEBAAAACFQU/YDJCkvL9f8WbtfbP27T4dJyWSzSjb2b62/p7RQXbTc7PAAAAAABjKIfMElRWbk+WJqpN+Zt1YEjZZKkzs3i9MSVHdW5Wby5wQEAAAAIChT9QB3bW1Cidxft0PtLM5Vf7JAktWwUrfsGn63LOjeR1WoxOUIAAAAAwYKiH6gDTpehhVty9Z8Vu/Xtumw5nIYkqXnDaP1lYGtd06OZ7DaryVECAAAACDYU/YCPGIahnYXSs3N+0xdrcpRTUFL5XK+WDXXbeWka3CFJNvbsAwAAAPARin7Ai4rKyrVsxyHN3bBXczbkaG9BmKQdkqT4aLuu6NJE1/ZMVcemcabGCQAAACA0UPQDZ+BwiUNrd+dr8bYDWrz1gNbszqucui9JEVZDF7ZP1uVdm2pQ+0RFhNlMjBYAAABAqKHoB2rBMAwdOFKmLfsKtSGrQGv35OuX3XnalntEhlG1bdP4KJ1/doL+0DZB+b8t0xWXdpHdzqX3AAAAANS9gCn6n3zySX399ddavXq1wsPDlZeXd8rXGIahSZMm6e2339ahQ4fUu3dvvfbaazrnnHMq25SWlur+++/Xhx9+qOLiYg0aNEivv/66mjVr5sPewB+5XIb2F5ZqT16xsvKKtftQsbbtL9TW/Ue0ZV9h5Zn2j9c0Pkrntmygvq0bqW+rBKU2jJLFYpHD4dDsLXXcCQAAAAA4RsAU/WVlZbr22mvVt29fTZ06tVaveeaZZ/TCCy9o2rRpOvvss/XEE09o8ODB2rRpk+rXry9JGjdunL788kt99NFHatSokf7617/q0ksv1YoVK2SzMRU7kBmGoRKHS4dLHSooduhAYZkOHHHfDhaW6cCRUh04Uqbcw6XKyi9WTn5Jlan5x7NYpGYNotQ2qb46N4tXp2Zx6tQ0TgkxEXXYKwAAAACovYAp+idNmiRJmjZtWq3aG4ahKVOm6KGHHtLVV18tSXr33XeVlJSkDz74QH/+85+Vn5+vqVOnavr06broooskSTNmzFBqaqrmzp2rIUOG+KQvwczlMuQ0DDldhspd7nv3sksul1TuclWuq97GfV9W7lJpuVOlFfcOV7XlEsfvzx8pc+pIabkKS8pVWFquw0fvC0vL5XSduIivic1qUXJspJrER6pJfJTSEuqpdeMYnZUYo7SEeoq080UQAAAAgMARMEW/p7Zv366cnBylp6dXrouIiNAFF1ygRYsW6c9//rNWrFghh8NRpU2TJk3UsWNHLVq06IRFf2lpqUpLSysfFxQUSJIcDoccjpqngNfW9f/+WQXF5TJkyDCkipLVfdz47+sqjiOv0s4wqrR3tzu6rrL97+vcbYxjtv/7OqNK+9/XlZfb9MDy71XxymPfp9xlVDu+3R9YLFL9iDA1qheuhlVudjWqF65G9cKVEucu8hvHhCvMZj3BllxyOFy1ft+Kz8KZfiZCCTnzHDnzXKjkLNj752u+HOv9Waj8fHgTOfMcOfMM+fJcqOSstv0L2qI/JydHkpSUlFRlfVJSknbu3FnZJjw8XA0aNKjWpuL1NZk8eXLlzINjzZkzR9HR0WcU94Y9NhWV+/N12y2Sy3karzJktch9k35fPnqzWSSL3PdhVslulcIskt1q/P7YKtmPfd4qhVkMRdikyCo3Q5Fhvz+2WyWrpVxSSdWgyo7eDkl7d0t7zzw5NcrIyPDRloMXOfMcOfNcsOesqKjI7BACmi/H+kAQ7D8fvkDOPEfOPEO+PBfsOavtWG9q0T9x4sQaB9RjLVu2TD179jzt97BYqhbQhmFUW3e8U7WZMGGCxo8fX/m4oKBAqampSk9PV2xs7GnHKkmN2h+U02XIYpEssujYMI5dZ9HvfbMc/adinaWG9hWP3U2P3Yb7sWrYxrGvs8ii8vJy/fTTQg047zyF2cOqbMdqtSjMapHV4r63HXuzWGS1+vMXGb7hcDiUkZGhwYMHc/b+WiJnniNnnguVnFXsmcbp8eVY789C5efDm8iZ58iZZ8iX50IlZ7Ud600t+u+66y5dd911J23TsmXL09p2cnKyJPfe/JSUlMr1+/btq9z7n5ycrLKyMh06dKjK3v59+/apX79+J9x2RESEIiKqn7zNbref8YfqvLOTTt3IJA6HQ5sipbTE2KD+4fE2b3wuQg058xw581yw5yyY+1YXfDnWB4JQ6ac3kTPPkTPPkC/PBXvOats3U4v+hIQEJSQk+GTbaWlpSk5OVkZGhrp16ybJfQWA+fPn6+mnn5Yk9ejRQ3a7XRkZGRo+fLgkKTs7W+vWrdMzzzzjk7gAAAAAAKgrAXNMf2Zmpg4ePKjMzEw5nU6tXr1aknTWWWcpJiZGktSuXTtNnjxZV111lSwWi8aNG6ennnpKbdq0UZs2bfTUU08pOjpaN9xwgyQpLi5Oo0aN0l//+lc1atRIDRs21P33369OnTpVns0fAAAAAIBAFTBF///93//p3XffrXxcsff+hx9+0MCBAyVJmzZtUn5+fmWbv//97youLtbYsWN16NAh9e7dW3PmzFH9+vUr27z44osKCwvT8OHDVVxcrEGDBmnatGmy2bg0GwAAAAAgsAVM0T9t2jRNmzbtpG2M464XZ7FYNHHiRE2cOPGEr4mMjNQrr7yiV155xQtRAgAAAADgP050QXIAAAAAABDgKPoBAAAAAAhSFP0AAAAAAAQpin4AAAAAAIIURT8AAAAAAEGKoh8AAAAAgCBF0Q8AAAAAQJCi6AcAAAAAIEhR9AMAAAAAEKQo+gEAAAAACFJhZgcQDAzDkCQVFBSYHIlvORwOFRUVqaCgQHa73exw/B758hw58xw581yo5KxiTKoYo3BmGOtxIuTMc+TMM+TLc6GSs9qO9RT9XnD48GFJUmpqqsmRAABQ1eHDhxUXF2d2GAGPsR4A4K9ONdZbDHYBnDGXy6WsrCzVr19fFovF7HB8pqCgQKmpqdq1a5diY2PNDsfvkS/PkTPPkTPPhUrODMPQ4cOH1aRJE1mtHM13phjrcSLkzHPkzDPky3OhkrPajvXs6fcCq9WqZs2amR1GnYmNjQ3qHx5vI1+eI2eeI2eeC4WcsYffexjrcSrkzHPkzDPky3OhkLPajPV89Q8AAAAAQJCi6AcAAAAAIEhR9KPWIiIi9OijjyoiIsLsUAIC+fIcOfMcOfMcOQNOjJ8Pz5Ezz5Ezz5Avz5GzqjiRHwAAAAAAQYo9/QAAAAAABCmKfgAAAAAAghRFPwAAAAAAQYqiHwAAAACAIEXRjzNSWlqqrl27ymKxaPXq1WaH47d27NihUaNGKS0tTVFRUWrdurUeffRRlZWVmR2aX3n99deVlpamyMhI9ejRQwsWLDA7JL81efJknXvuuapfv74SExN15ZVXatOmTWaHFTAmT54si8WicePGmR0K4PcY62uHsb52GOtrj7H+zDHeu1H044z8/e9/V5MmTcwOw+/9+uuvcrlceuutt7R+/Xq9+OKLevPNN/Xggw+aHZrfmDlzpsaNG6eHHnpIq1at0oABA3TxxRcrMzPT7ND80vz583XnnXdqyZIlysjIUHl5udLT03XkyBGzQ/N7y5Yt09tvv63OnTubHQoQEBjra4ex/tQY6z3DWH9mGO+PYQCnafbs2Ua7du2M9evXG5KMVatWmR1SQHnmmWeMtLQ0s8PwG7169TLGjBlTZV27du2MBx54wKSIAsu+ffsMScb8+fPNDsWvHT582GjTpo2RkZFhXHDBBca9995rdkiAX2OsPzOM9VUx1p8ZxvraY7yvij39OC179+7V6NGjNX36dEVHR5sdTkDKz89Xw4YNzQ7DL5SVlWnFihVKT0+vsj49PV2LFi0yKarAkp+fL0l8pk7hzjvv1CWXXKKLLrrI7FAAv8dYf+YY63/HWH/mGOtrj/G+qjCzA0DgMQxDt9xyi8aMGaOePXtqx44dZocUcLZu3apXXnlFzz//vNmh+IXc3Fw5nU4lJSVVWZ+UlKScnByTogochmFo/PjxOu+889SxY0ezw/FbH330kVauXKlly5aZHQrg9xjrzxxjfVWM9WeGsb72GO+rY08/Kk2cOFEWi+Wkt+XLl+uVV15RQUGBJkyYYHbIpqttzo6VlZWloUOH6tprr9Xtt99uUuT+yWKxVHlsGEa1dajurrvu0i+//KIPP/zQ7FD81q5du3TvvfdqxowZioyMNDscwDSM9Z5jrPcuxvrTw1hfO4z3NbMYhmGYHQT8Q25urnJzc0/apmXLlrruuuv05ZdfVvkF7XQ6ZbPZdOONN+rdd9/1dah+o7Y5q/ilk5WVpQsvvFC9e/fWtGnTZLXyvZvknvIXHR2tTz75RFdddVXl+nvvvVerV6/W/PnzTYzOv9199936/PPP9eOPPyotLc3scPzW559/rquuuko2m61yndPplMVikdVqVWlpaZXngGDFWO85xnrvYKw/fYz1tcd4XzOKfngsMzNTBQUFlY+zsrI0ZMgQ/ec//1Hv3r3VrFkzE6PzX3v27NGFF16oHj16aMaMGSH5C+dkevfurR49euj111+vXNehQwddccUVmjx5somR+SfDMHT33Xfrs88+07x589SmTRuzQ/Jrhw8f1s6dO6usu/XWW9WuXTv94x//YKokcBzG+tPDWH9yjPWeYaz3HON9zTimHx5r3rx5lccxMTGSpNatW/NHwAlkZWVp4MCBat68uZ577jnt37+/8rnk5GQTI/Mf48eP18iRI9WzZ0/17dtXb7/9tjIzMzVmzBizQ/NLd955pz744APNmjVL9evXrzweMi4uTlFRUSZH53/q169fbaCvV6+eGjVqFLJ/AAAnw1jvOcb6U2Os9wxjvecY72tG0Q/UgTlz5mjLli3asmVLtT+WmGzjNmLECB04cECPPfaYsrOz1bFjR82ePVstWrQwOzS/9MYbb0iSBg4cWGX9//t//0+33HJL3QcEACGOsf7UGOs9w1gPb2F6PwAAAAAAQYoziwAAAAAAEKQo+gEAAAAACFIU/QAAAAAABCmKfgAAAAAAghRFPwAAAAAAQYqiHwAAAACAIEXRDwAAAABAkKLoBwAAAAAgSFH0AwAAAAAQpCj6AQAAAAAIUhT9AAAAAAAEKYp+AKbbv3+/kpOT9dRTT1WuW7p0qcLDwzVnzhwTIwMAAN7AWA+Yx2IYhmF2EAAwe/ZsXXnllVq0aJHatWunbt266ZJLLtGUKVPMDg0AAHgBYz1gDop+AH7jzjvv1Ny5c3XuuedqzZo1WrZsmSIjI80OCwAAeAljPVD3KPoB+I3i4mJ17NhRu3bt0vLly9W5c2ezQwIAAF7EWA/UPY7pB+A3tm3bpqysLLlcLu3cudPscAAAgJcx1gN1jz39APxCWVmZevXqpa5du6pdu3Z64YUXtHbtWiUlJZkdGgAA8ALGesAcFP0A/MLf/vY3/ec//9GaNWsUExOjCy+8UPXr19dXX31ldmgAAMALGOsBczC9H4Dp5s2bpylTpmj69OmKjY2V1WrV9OnTtXDhQr3xxhtmhwcAAM4QYz1gHvb0AwAAAAAQpNjTDwAAAABAkKLoBwAAAAAgSFH0AwAAAAAQpCj6AQAAAAAIUhT9AAAAAAAEKYp+AAAAAACCFEU/AAAAAABBiqIfAAAAAIAgRdEPAAAAAECQougHAAAAACBIUfQDAAAAABCk/j+/Xmgqyt+aegAAAABJRU5ErkJggg==",
"text/plain": [
"<Figure size 1200x500 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"def tanh(x):\n",
" return np.tanh(x) \n",
"\n",
"def tanh_derivative(x):\n",
" return 1-tanh(x)**2\n",
"\n",
"plot_function_and_derivative(tanh, tanh_derivative, \"tanh\", (-5, 5))"
]
},
{
"cell_type": "markdown",
"id": "9357658a",
"metadata": {},
"source": [
"**Eigenschaften:**\n",
"\n",
"* Mappt auf den Bereich $(-1,1)$\n",
"* Ist eine skalierte Version der Sigmoid Funktion $\\sigma(x)$. Es gilt $\\tanh(x)=2\\sigma(2x)-1$"
]
},
{
"cell_type": "markdown",
"id": "42f3fd83",
"metadata": {},
"source": [
"**Vorteile:**\n",
"\n",
"* Einfache Ableitung (welche aus dem Funktionswert berechnet werden kann)\n",
"* Ableitung ist nicht mehr beschränkt durch $0.25$ sondern liegt jetzt im Bereich $(0,1]$"
]
},
{
"cell_type": "markdown",
"id": "65ca5812",
"metadata": {},
"source": [
"**Nachteile:**\n",
"\n",
"* Nach wie vor die meisten Werte der Ableitung kleiner 1, somit zu klein\n",
"* Auch hier ist die Ableitung relativ schnell $0$ für Werte, die nicht im Bereich von $0$ liegen (Normalisieren!)"
]
},
{
"cell_type": "markdown",
"id": "1bdd02bc",
"metadata": {},
"source": [
"> **Übung:** Zeigen Sie, dass für die Ableitung der *tanh* Funktion $f(x)=\\tanh(x)$, $f'(x)=1-\\tanh^2(x)$ gilt."
]
},
{
"cell_type": "markdown",
"id": "cbb673a3",
"metadata": {},
"source": [
"### ReLU"
]
},
{
"cell_type": "markdown",
"id": "7aa1ebd7",
"metadata": {},
"source": [
"\\begin{align*}\n",
" f(x) &= \\max(0, x) = \\begin{cases}x & x>0, \\\\ 0 & \\text{sonst}.\\end{cases}\\\\\n",
" f'(x) &= \\begin{cases} 1 & x > 0, \\\\ 0 & \\text{sonst}. \\end{cases}\n",
"\\end{align*}"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "fb27ee69",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA9wAAAHUCAYAAADInCBZAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABRAElEQVR4nO3deXxU9b3/8fdkMknIxh7WEBACQYGCoIgIBpQgeG313loVpWLdqIggKiD8rmKroKjgdsWtFatFqWhd2cKuKMiiqDQEAsGwGsKShKyTmfP7g5IaEiBDZvKd5fV8PPBhTk4m7/PJ8p13zswZm2VZlgAAAAAAgFeFmQ4AAAAAAEAwonADAAAAAOADFG4AAAAAAHyAwg0AAAAAgA9QuAEAAAAA8AEKNwAAAAAAPkDhBgAAAADAByjcAAAAAAD4AIUbAAAAAAAfoHADfmbu3Lmy2WyV/8LDw9WqVSvdeOON2rFjh8e3t2rVKtlsNi1YsOC0+9hsNt177701vm/BggWy2WxatWpVtfddccUVGj16tMeZ/vKXv6hNmzYqKiry+GMBAAhUgbDGjxo1SqmpqdX23blzpyIjI/X11197nHPgwIEaP368xx8HBAMKN+Cn3nzzTX399ddatmyZ7r33Xn3yySe67LLLdPToUdPRJEkff/yx1q5dq//93//1+GNvvfVWxcTEaObMmT5IBgCAf/P3Nb4mDz74oIYMGaJ+/fp5/LF//vOf9fLLLyszM9MHyQD/RuEG/FS3bt10ySWXKDU1VVOnTtXkyZOVm5urjz76yHQ0SdL06dN13XXXqU2bNh5/bHh4uO6++249//zzKi4u9kE6AAD8l7+v8afKyMjQRx99pLFjx57Tx19++eXq0qWLnn32WS8nA/wfhRsIEH369JEk/fzzz5XbNm7cqF//+tdq0qSJoqKi1KtXL/3jH//weZZvv/1W33zzjUaOHFm5zbIsDR8+XE2bNlVOTk7l9uLiYl1wwQXq2rVrlYeQ33zzzSooKNB7773n87wAAPgzf1rjazJnzhy1bNlSQ4YMqdy2Y8cOxcfH6/rrr6+y74oVK2S326s9Am7kyJGaN2+eCgsL6yUz4C8o3ECAyM7OliR17txZkrRy5Ur1799fx44d0yuvvKKPP/5YPXv21A033KC5c+f6NMtnn30mu92ugQMHVm6z2Wx6++23FR0drd/97ndyOp2SpHvuuUfZ2dn6xz/+oZiYmMr9W7ZsqZSUFH3++ec+zQoAgL/zpzV+7ty51a7b8vnnn2vgwIEKC/tPdUhOTtbrr7+uBQsW6IUXXpAkHTx4UCNGjNCAAQM0bdq0KreRmpqqoqKiGq8JAwSzcNMBANTM5XKpoqJCpaWlWrt2rR5//HENHDhQv/71ryWdKLIXXHCBVqxYofDwEz/KQ4cOVV5enqZMmaLf//73VRZGb/r666+VnJys2NjYKtubNm2q9957T6mpqZo4caJ69Oiht956S2+88Ya6d+9e7XYuvPBCLVu2zCcZAQDwV/68xp8qNzdXu3bt0l133VXtfTfccINWr16thx56SBdffLGmTp0qy7L07rvvym63V9m3V69estlsWrt2ra655pp6yQ74Awo34KcuueSSKm937dpVH3/8scLDw5WVlaVt27bpmWeekSRVVFRU7jd8+HB99tlnyszMVNeuXX2Sbf/+/UpISKjxff3799cTTzyhSZMmKTIyUrfccotuv/32GvdNSEhQbm6uKioqKu9QAAAQ7Px5jT/V/v37Jem06/7s2bO1bt06DRo0SOXl5Vq8eLFatWpVbT+Hw6FGjRpp3759Ps0L+BseUg74qb/97W/asGGDVqxYobvvvlsZGRm66aabJP3nOV4PPvigHA5HlX/33HOPJCkvL6/Wn8tut8vlctX4vpMLvcPhqNxWUlKiqKio097ezTffrIiICJWVlemhhx467X5RUVGyLEulpaW1zgoAQKDz5zX+VCUlJZJ02nU/MjJSI0aMUGlpqXr27Fnled6nioqKqrw9IFRwSgnwU127dq28iMqgQYPkcrn0xhtvaMGCBZUPz3744Yf13//93zV+fJcuXWr9uVq0aHHavzif3N6iRYvKbc2aNdORI0dq3N/lcunmm29W48aNFRkZqdtvv11r165VREREtX2PHDmiyMjIag9NBwAgmPnzGn+qZs2aSdJp1/0ff/xRjzzyiC666CJt2LBBs2bN0oQJE2rc9+jRo5W3B4QKCjcQIGbOnKkPPvhAjzzyiH788UclJydry5Ytmj59ep1v+8orr9SHH36oQ4cOqXnz5pXbLcvS+++/r/bt26tTp06V21NSUk770iWPPvqovvjiCy1dulQxMTEaOHCgHnroIT3//PPV9t21a5fOP//8OucHACCQ+dMaf6qk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",
"text/plain": [
"<Figure size 1200x500 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"def relu(x):\n",
" return np.maximum(0, x)\n",
"\n",
"def relu_derivative(x):\n",
" return np.where(x > 0, 1, 0)\n",
"\n",
"plot_function_and_derivative(relu, relu_derivative, \"ReLU\", (-5, 5))"
]
},
{
"cell_type": "markdown",
"id": "63fbea04",
"metadata": {},
"source": [
"**Eigenschaften:**\n",
"\n",
"* **Re**ctified **L**inear **U**nit\n",
"* Gibt es noch in weiteren Versionen"
]
},
{
"cell_type": "markdown",
"id": "65dcb9af",
"metadata": {},
"source": [
"**Vorteile:**\n",
"\n",
"* Einfache Ableitung (nur eine If-Abfrage)\n",
"* Ableitung für die Hälfte der Werte $1$"
]
},
{
"cell_type": "markdown",
"id": "653c2926",
"metadata": {},
"source": [
"**Nachteile:**\n",
"\n",
"* \"Dying ReLU Problem\": Neuronen können inaktiv werden, weil sie aufgrund der ReLU Funktion einerseits keinen Output liefern können und auch die Ableitung ist $0$ in diesem Punkt, somit kann sich deren Zustand auch nicht mehr ändern"
]
},
{
"cell_type": "markdown",
"id": "e717a3ff",
"metadata": {},
"source": [
"**Weitere ReLU Versionen:**"
]
},
{
"cell_type": "markdown",
"id": "e0379942",
"metadata": {},
"source": [
"#### Leaky ReLU:\n",
"\n",
"\\begin{equation*}\n",
" f(x) = \\begin{cases} x & x>0, \\\\ \\alpha x & x\\leq 0 \\end{cases}\n",
"\\end{equation*}\n",
"\n",
"mit $\\alpha\\in\\mathbb R$ meistens im Bereich $\\alpha = 0.01$."
]
},
{
"cell_type": "markdown",
"id": "49b87e8f",
"metadata": {},
"source": [
"#### Exponential Linear Unit (ELU):\n",
"\n",
"\\begin{equation*}\n",
" f(x) = \\begin{cases} x & x>0, \\\\ \\alpha (e^x-1) & x\\leq 0 \\end{cases}\n",
"\\end{equation*}\n",
"\n",
"mit $\\alpha>0$."
]
},
{
"cell_type": "markdown",
"id": "5e9ac32e",
"metadata": {},
"source": [
"> **Übung:** Berechnen Sie die Ableitungen der einzelnen Funktionen und zeichnen Sie die Funktionen! "
]
},
{
"cell_type": "markdown",
"id": "877ef6e7",
"metadata": {},
"source": [
"### Swish"
]
},
{
"cell_type": "markdown",
"id": "a15524d6",
"metadata": {},
"source": [
"\\begin{align*}\n",
" f(x) &= x \\cdot \\sigma(x)\\\\\n",
" f'(x) &= \\sigma(x) + x\\cdot \\sigma'(x) = \\sigma(x) + x\\cdot \\sigma(x)\\cdot (1-\\sigma(x))\n",
"\\end{align*}"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "467503e3",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA9wAAAHUCAYAAADInCBZAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABkFklEQVR4nO3dd3hUZeL28XtmMpn0AiHU0EvoVRBQijSBtbcVdcV13XVFBbFg2VX0p+JrAytrW3VlWetiWRUJKsUCIoKC0gktAUKA9DblvH8MiYQEzJAMZ8r3c11zTebkZHKfJ4En95wyFsMwDAEAAAAAgAZlNTsAAAAAAAChiMINAAAAAIAfULgBAAAAAPADCjcAAAAAAH5A4QYAAAAAwA8o3AAAAAAA+AGFGwAAAAAAP6BwAwAAAADgBxRuAAAAAAD8gMINBICVK1fqggsuUOvWreVwONS0aVMNHjxYt956a72ed8eOHbJYLHrttdd8+roRI0aoR48edV5/+fLlcjgc2rlzp0/fx+l0qkOHDpozZ45PXwcAQLAI1jm+8vmXLFlS43N//OMfdfbZZ/v0fSXp888/V1xcnLKysnz+WiBYUbgBk3388ccaMmSICgoK9Oijj2rRokV66qmnNHToUL311lv1eu7mzZvr22+/1cSJExsobU2GYWjatGm67rrr1KZNG5++1m63695779UDDzyggwcP+ikhAADmCPY5vjZr1qzR66+/rgcffNDnrx01apQGDhyou+++2w/JgMBkMQzDMDsEEM6GDx+urKwsbdy4UREREdU+5/F4ZLWe+tfFRowYodzcXK1fv/431/300081YcIEbdy4UV26dPH5e1VUVKh58+a69dZbmYABACElmOf4HTt2qF27dvryyy81YsSIquWXXXaZdu3apW+//fakvv97772nyy67TJmZmUpLSzup5wCCCXu4AZMdPHhQKSkpNSZiSVUT8e23367ExES53e6qz910002yWCx67LHHqj2X1WrVM888I6n2w80OHDigP//5z0pLS5PD4VCTJk00dOhQLV68uMb3X7Vqlc4880zFxMSoffv2euSRR+TxeKqtM3fuXJ122mnVyvZXX30lu92u2267rdq6r732miwWi1555ZWqZZGRkbrsssv04osvitf/AAChJNjn+GPt379fCxYs0FVXXVVt+fXXX6+oqCitXr26apnH49GoUaPUtGlT7d27t2r5Oeeco7i4OL300ksn/F5AqKBwAyYbPHiwVq5cqZtvvlkrV66U0+mssc7o0aNVUFCg7777rmrZ4sWLFR0drYyMjKpln3/+uQzD0OjRo4/7/a666iq9//77uvfee7Vo0SK9/PLLGj16dI1Duvft26crrrhCV155pT788EONHz9ed911l+bNm1e1TkVFhRYvXqyRI0dW+9ozzjhDDz74oJ544gl9+OGHkqSff/5ZU6ZM0ZVXXqlrr7222vojRozQzp0767RHHQCAYBHMc3zbtm1lGEa1vduLFi2S0+msMe/PmTNHXbt21aWXXqq8vDxJ0v33368lS5Zo3rx5at68edW6kZGRGjJkiD7++OMTDx4QKgwApsrNzTXOOOMMQ5IhybDb7caQIUOMWbNmGYWFhYZhGEZxcbERGRlpPPDAA4ZhGMaePXsMScaMGTOM6Ohoo6yszDAMw7juuuuMFi1aVD13ZmamIcl49dVXq5bFxcUZ06ZNO2Gm4cOHG5KMlStXVlverVs3Y9y4cVWPV65caUgy3nzzzRrP4fF4jAkTJhhJSUnG+vXrjW7duhnp6elGUVFRjXW3bNliSDLmzp37G6MFAEDwCOY5vjZ//etfjejoaMPj8dT43JYtW4yEhATj/PPPNxYvXmxYrVbjb3/7W63Pc8899xhWq7XWvwmAUMMebsBkjRs31vLly7Vq1So98sgjOu+887R582bddddd6tmzp3JzcxUTE6PBgwdXHRKWkZGhpKQk3X777aqoqNBXX30lyfuK+Ile+ZakgQMH6rXXXtODDz6oFStW1PpquyQ1a9ZMAwcOrLasV69e1a5Enp2dLUlKTU2t8fUWi0X/+te/FB8frwEDBigzM1Nvv/22YmNja6xb+fVctRQAEEqCeY6vTXZ2tpo0aSKLxVLjcx07dtRLL72k999/X7/73e905plnaubMmbU+T2pqqjwej/bt23fC7weEAgo3ECAGDBigGTNm6J133lF2drZuueUW7dixQ48++qgk7yFnK1asUHFxsRYvXqyzzjpLjRs3Vv/+/bV48WJlZmYqMzPzNyfjt956S1dffbVefvllDR48WI0aNdIf/vCHGpNe48aNa3ytw+FQaWlp1ePKj6Oiomr9Xo0bN9a5556rsrIynX322erZs2et61V+/dHPDQBAqAjGOb42paWlx53zJWnixIlq2rSpysrKNH36dNlstlrXY95HOKFwAwHIbrfrvvvuk6Sq85pHjRqliooKLVu2TJ9//rnGjBlTtTwjI6PqPK9Ro0ad8LlTUlI0Z84c7dixQzt37tSsWbP03//+V5MnT/Y5Z0pKiiTp0KFDtX4+IyNDc+fO1cCBA7VgwQK99957ta5X+fWVzwcAQKgKljn+eM9/vDlf8l48rbCwUN27d9fNN9+sw4cP17oe8z7CCYUbMNnRV+482oYNGyRJLVq0kOQ9TCwhIUFz5szRvn37qibj0aNHa82aNXr77bfVrVu3qvXronXr1rrxxhs1ZswY/fDDDz5n79q1qyRp27ZtNT63d+9eXXnllRo+fLi++eYbnXvuubr22muVmZlZY93t27dLkrp16+ZzBgAAAlUwz/G1SU9P18GDB5Wfn1/jcy+//LLmzZunZ599Vh9++KHy8vJ0zTXX1Po827dvV+PGjdW0adMGyQUEsprvUQDglBo3bpxatWqlc845R+np6fJ4PFq7dq2eeOIJxcXFaerUqZIkm82m4cOH66OPPlK7du3UoUMHSdLQoUPlcDj0+eef6+abbz7h98rPz9fIkSM1adIkpaenKz4+XqtWrdLChQt14YUX+py9VatWat++vVasWFHte7vdbl1++eWyWCyaP3++bDabXnvtNfXp00eXXXaZvvrqK0VGRlatv2LFCtlsNg0bNsznDAAABKpgnuNrM2LECBmGoZUrV2rs2LFVy9etW6ebb75ZV199dVXJfuWVV3TxxRdrzpw5mjZtWrXnWbFihYYPH17rueBAqGEPN2Cyv/3tb0pOTtbs2bN17rnnavz48Xr66ac1evRofffdd9XOe648d+voc7gcDofOOOOMGstrExUVpUGDBumNN97QFVdcofHjx+vll1/WjBkzTvr9MK+44gotXLhQ5eXlVcvuu+8+LV++XPPnz1ezZs0kScnJyXrzzTe1Zs0a3XHHHdWe4/3339eECROUlJR0UhkAAAhEwT7HH2vo0KFq27atPvjgg6plxcXFuvTSS9WuXTs9//zzVcsvuugiTZkyRXfccUe1tzzbtm2b1q1bpyuuuKJBMgGBzmIYhmF2CADBKzs7W+3atdO//vUvXXbZZT5//bZt29SpUyd99tlnVYfQAQCAwPTEE0/ooYceUlZWlqKjo33++r///e/617/+pW3btikigoNtEfoo3ADqbcaMGfr000+1du1aWa2+HThzzTXXaM+ePVUXhAEAAIGrrKxMXbt21ZQpU3Tbbbf59LV5eXlq3769nnnmGfZwI2xwSDmAevvb3/6miy66yOf30Xa5XOrQoYOee+45PyUDAAANKSoqSm+88YYcDofPX5uZmam77rpLkyZN8kMyIDCxhxsAAAAAAD9gDzcAAAAAAH5A4QYAAAAAwA8o3AAAAAAA+EFQX4vf4/EoOztb8fHxslgsZscBAECGYaiwsFAtWrTw+ar9qIm5HgAQaHyZ64O6cGdnZystLc3sGAAA1LB79261atXK7BhBj7keABCo6jLXB3Xhjo+Pl+Td0ISEBJPT+I/T6dSiRYs0duxY2e12s+MEBcbMd4yZbxgv34XLmBUUFCgtLa1qjkL9MNfjeBgz3zFmvmPMfBcOY+bLXB/Uhbvy0LKEhISQn4RjYmKUkJAQsr+0DY0x8x1j5hvGy3fhNmYc/twwmOtxPIyZ7xgz3zFmvgunMavLXM/JZQAAAAAA+AGFGwAAAAAAP6BwAwAAAADgB0F9DnddGIYhl8slt9ttdpST5nQ6FRERobKysqDejhOx2WyKiIjgnEcAAACEjFDoIr4Khe7SkN0kpAt3RUWF9u7dq5KSErOj1IthGGrWrJl2794d0oU0JiZGzZs3V2RkpNlRAAAAgHoJlS7iq1DpLg3VTUK2cHs8HmVmZspms6lFixaKjIwM2h+4x+NRUVGR4uLifvON1YORYRiqqKjQgQMHlJmZqU6dOoXkdgIAACA8hFIX8VWwd5eG7iYhW7grKirk8XiUlpammJgYs+PUi8fjUUVFhaKiooLyl7YuoqOjZbfbtXPnzqptBQAAAIJRKHURX4VCd2nIbhKcI+CDYP0hhyN+VgAAAAgl/H0bvBrqZ2fqb8DMmTNlsViq3Zo1a2ZmJAAAAAAAGoTph5R3795dixcvrnpss9lMTAMAAAAAQMMw/RiHiIgINWvWrOrWpEkTsyOFlMmTJ+v8889v0HU3bdqkZs2aqbCwsE7Pm5OToyZNmigrK6tO6wMAAAAIDf7oI8f64osvlJ6eLo/HU6f1161bp1atWqm4uNjn7+Ur0/dwb9myRS1atJDD4dCgQYP08MMPq3379rWuW15ervLy8qrHBQUFkrzv9eZ0Oqut63Q6ZRiGPB5PnQc+UOTk5Ojee+/VwoULtX//fiUnJ6t79+66//77NWTIEJ+ea/bs2VXj8FsMw6jTunfffbduuOEGxcbG1ul5U1JSdOWVV+ree+/VSy+9dNz1PB6PDMOQ0+ms95EOlb8Px/5e4PgYM98wXr4LlzEL9e3zN1/m+lASLv8+GhJj5jvGzHcnO2bB3EWk2vtIr169dN9992nw4MEn/FrDMKruPR5Pg/eRs846S3/4wx80efLkqmV33HGH7rrrLkmq0/fp3r27TjvtND355JO65557al3nRN3El98HUwv3oEGD9K9//UudO3fW/v379eCDD2rIkCH6+eef1bhx4xrrz5o1S/fff3+N5YsWLapx9b/KPedFRUWqqKjw2zb4wwUXXCCXy6XnnntObdq00YEDB7R06VJlZWVV/eFRV5Xnxtfl65xOp1wu1wnXzcrK0kcffaQHHnjApywXX3yxRo8erb///e9KSkqqdZ2KigqVlpZq2bJlcrlcdX7uE8nIyGiQ5wknjJlvGC/fBeKYlbslRwOd0RRu77fa0HyZ60NRIP77CHSMme8YM9/5OmbB3EWk4/eRPXv21LkDVB4N29B9xOVyqaysrGqdlStXavPmzRo3bpxP/eTSSy/VrbfeqhtuuKHWnX0n6ia+zPUWo/IliABQXFysDh066I477tD06dNrfL62V73T0tKUm5urhISEauuWlZVp9+7datu2bdVl3A3DUKnT7d+NqEW03Vbn993Ly8tT48aN9cUXX2j48OGSvLkLCwsVHx+v22+/XZs3b9aHH34oSXrqqac0ffp0ffjhh5o4caIkqWvXrpo2bZr+8pe/6JprrlFeXp4WLFggSXr33Xf1f//3f9q6datiYmLUt29fLViwQLGxsVXrnnHGGXryySdVUVGhyy67TLNnz5bdbpfk3WP+5ptvauXKlVWZr732Wq1evVorV66Uw+GQ0+nUkCFD1KVLF82bN69qvQ4dOuiee+7RH//4x1q3vaysTDt27FBaWlq93xbM6XQqIyNDY8aMqcqOE2PMfMN4+S5Qxywzt1gX/mOlJg9urZtGdpDVWr/3SS0oKFBKSory8/NrzE34bb7M9aEkUP99BDLGzHeMme9Odsxq6yIyDMlt0ouythipHn3kaLfddtsJ+4hhGEpPT9f06dP90keO3cM9depU7d27V2+//bYkb3caN26cbDabPvnkE1ksFuXl5alPnz668sor9eCDD0ryFuqkpCT973//01lnnVVjO0/UTXyZ600/pPxosbGx6tmzp7Zs2VLr5x0OhxwOR43ldru9xj8At9sti8Uiq9VadUn3kgqXesw89a/o/fLAOMVE1m3XSUJCguLi4vThhx9qyJAhcjgcVYdFWCwWjRw5Uv/85z8leS9Vv2zZMqWkpGj58uU655xztG/fPm3evFkjR46U1WqtekXJarVq7969uuKKK/Too4/qggsuUGFhoZYvX171eYvFoiVLlqhFixb68ssvtXXrVl122WXq27evrrvuOknS8uXLNWDAgGqXyX/mmWfUu3dv3X333Zo9e7buu+8+5ebm6osvvqi23sCBA/X111/rT3/6U63bXpmhtp/nyWrI5woXjJlvGC/fBdqYPZaxVUXlLv2yr0gOR2S9ny+Qti0Y+TLXh6Jw2c6GxJj5jjHzna9jVlsXkatYetekFw4vLZJssXVatbY+crTf6iPZ2dnaunWrhg8f7pc+Uvl9K8d1+fLluvzyy6v1jtdff109e/bUs88+q6lTp+qGG25Q06ZNdf/991etFxUVpd69e+vrr7/W6NGja4zDibqJL78LAVW4y8vLtWHDBp155plmRzFNRESEXnvtNV133XX6xz/+oX79+mnYsGGaOHGihgwZomHDhqmwsFBr1qxRv379tHz5ct12223673//K0n68ssv1bRpU6Wnp9d47r1798rlcunCCy9UmzZtJEk9e/astk5ycrKeffZZ2Ww2paena+LEifr888+rfsF37Nih/v37V/uauLg4zZs3T8OHD1d8fLyeeOIJff7550pMTKy2XsuWLbVmzZoGGysAqK9vtx1Uxi/7ZbNadPeEmv9vAgAQbmrrI8OHD9fvf/979erVq059JDU11W99ZMmSJdXW37Fjh1q0aFFtWcuWLfXCCy/oqquu0v79+/XRRx9pzZo1NYpyy5YttWPHjvoM128ytXDfdtttOuecc9S6dWvl5OTowQcfVEFBga6++mq/fL9ou02/PDDOL8/9W9/XFxdddJEmTpyo5cuX69tvv9XChQv12GOP6cUXX9Qf//hH9enTR0uWLJHdbpfVatVf/vIX3XfffSosLNSSJUtqPfRDknr37q1Ro0apZ8+eGjdunMaOHauLL75YycnJVet079692jkMzZs317p166oel5aW1nq49+DBg3Xbbbfp//7v/zRjxgwNGzas5jhER3NuI4CA4fEYeuiTXyRJkwa2VsfUeJMTAQBCmi3Gu6fZrO/tg9r6yKOPPqqXX35ZkydPPmEfWbp0qYYOHVrr8zZEHznW8frJJZdcogULFmjWrFmaO3euOnfuXGOdU9FPTH1bsD179ujyyy9Xly5ddOGFFyoyMlIrVqyoerWjoVksFsVERpzyW13P3z5aVFSUxowZo3vvvVdfffWVJk2aVHURmREjRmjJkiVaunSphg8fXnUV86+//lpLlizRiBEjan1Om82mjIwMffrpp+rWrZueeeYZdenSRZmZmVXrHPuqj8ViqXalv5SUFB0+fLjGc3s8Hn399dey2WzHPSXg0KFDvO0bgICxYE2W1mcVKN4RoWmjO5kdBwAQ6iwWKSLWnFs9+8g333yjyZMn67777pN04j5yosLdEH3kWMfrJyUlJVq9erXp/cTUwv3mm28qOztbFRUVysrK0nvvvadu3bqZGSlgdenSpep94kaMGKHly5friy++qCrXw4cP15tvvqnNmzcfdw+35P2FHTp0qO6//36tWbNGkZGRVRcwqIu+ffvql19+qbH8scce04YNG7R06VJ99tlnevXVV2uss379evXt27fO3wsA/KW0wq3HPtskSbphZEc1jqt5zjAAAPhVt27d6txHjle4pfr3kWMdr5/ceuutslqt+vTTT/X000/riy++qLHOqegnphZu1HTw4EGdddZZmjdvnn766SdlZmbqnXfe0dNPP61zzz1XkqrOm/joo4+qfsFHjBihefPmqUmTJsd90WLlypV6+OGH9f3332vXrl3673//qwMHDqhr1651zjdu3Dh9++23crt/vdr72rVrde+99+qVV17R0KFD9dRTT2nq1Knavn171TqVrzCNHTv2JEYFABrWS8u3a19BmVomReuaoW3NjgMAQMA4Xh959NFHdd5550n67T5S2/nbUsP0kWONGzdOX331VbVlH3/8sf75z3/q3//+t8aMGaM777xTV199dbU94Tt27FBWVlatF0xrSAF10TR4L0A2aNAgzZ49W9u2bZPT6VRaWpr+8Ic/aObMmZKkxMRE9e3bV7t27aoq12eeeaY8Hs8J924nJCRo2bJlmjNnjgoKCtSmTRs98cQTGj9+fJ3zTZgwQXa7XYsXL9a4ceNUVlamK664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",
"text/plain": [
"<Figure size 1200x500 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"def swish(x):\n",
" return x * sigmoid(x)\n",
"\n",
"def swish_derivative(x):\n",
" s = sigmoid(x)\n",
" return s + x * s * (1 - s)\n",
"\n",
"plot_function_and_derivative(swish, swish_derivative, \"Swish\", (-5, 5))"
]
},
{
"cell_type": "markdown",
"id": "31fabc45",
"metadata": {},
"source": [
"**Eigenschaften:**\n",
"\n",
"* Nicht monoton\n",
"* Wird auch SiLU (**Si**gmoid **L**inear **U**nit) genannt.\n",
"* Mehr oder weniger Kombination von ReLU und Sigmoid"
]
},
{
"cell_type": "markdown",
"id": "9b7e013b",
"metadata": {},
"source": [
"**Vorteile:**\n",
"\n",
"* Ableitungswerte in einem guten Bereich (nicht zu klein)\n",
"* In manchen Machine-Learning Tasks besser als ReLU. "
]
},
{
"cell_type": "markdown",
"id": "99a5e699",
"metadata": {},
"source": [
"**Nachteile:**\n",
"\n",
"* Aufwendiger zum Berechnen\n",
"* Nicht-Monotonität macht es schwerer zu Optimieren."
]
},
{
"cell_type": "markdown",
"id": "b543bddd",
"metadata": {},
"source": [
"> **Übung:** Zeigen Sie, dass $\\sigma(x) + x\\cdot \\sigma(x)\\cdot (1-\\sigma(x))$ tatsächlich die Ableitung von $\\sigma(x)\\cdot x$ ist."
]
},
{
"cell_type": "markdown",
"id": "9a6c705a",
"metadata": {},
"source": [
"---"
]
},
{
"cell_type": "markdown",
"id": "4ab34c48",
"metadata": {},
"source": [
"Wir kommen nun zu einer speziellen *Aktivierungsfunktion*, der sogenannten Softmax-Funktion. Sie wird auf ein ganzes Layer angewendet (es werden also auch die Werte des ganzen Layers zur Berechnung herangezogen). Außerdem wird diese Funktion normalerweise nur im letzten Layer (beim Output) verwendet. Grund dafür ist, dass wir mit dieser Funktion die Outputs der einzelnen Neuronen in eine Wahrscheinlichkeitsverteilung umwandeln können. Sprich wir bekommen dann am Ende einen Vektor, der in Summe $1.0$ (=100%) ergibt. Diese Einträge spiegeln dann die Vorhersage des Models wieder. Ist der Output also $[0.1, 0.1, 0.8, 0]$, dann glaubt das Modell, dass wir zu 80% in Klasse 3 sind und zu je 10% in Klasse 1 oder 2."
]
},
{
"cell_type": "markdown",
"id": "4008bf04",
"metadata": {},
"source": [
"## Softmax"
]
},
{
"cell_type": "markdown",
"id": "8d12d8e4",
"metadata": {},
"source": [
"\\begin{equation*}\n",
" \\text{softmax}(x)_i = \\frac{e^{z_i}}{\\sum_{j=1}^{n}e^{z_j}}.\\\\\n",
"\\end{equation*}"
]
},
{
"cell_type": "markdown",
"id": "3b652b0c",
"metadata": {},
"source": [
"**Eigenschaften:**\n",
"\n",
"* Erzeugt eine Verteilung mit Summe $1.0$\n",
"* Gewichtet die Einträge exponentiell, also kleine Unterschiede können sich groß auswirken\n",
"* Alle Einträge sind im Anschluss positiv"
]
},
{
"cell_type": "markdown",
"id": "e71dd8c8",
"metadata": {},
"source": [
"**Hinweis:** Prinzipiell wäre es für die reine Klassifizierung ausreichend, die Logits zu verwenden. Sprich wir verwenden einfach den Eintrag mit dem maximalen Wert. Die exponentielle Gewichtung zu einer Wahrscheinlichkeitsverteilung ist aber zur Loss-Berechnung vorteilhaft bzw. notwendig."
]
},
{
"cell_type": "markdown",
"id": "5036865f",
"metadata": {},
"source": [
"**Wichtig:** Wir verwenden also im Fall einer Klassifikation in Zukunft nicht mehr die Sigmoid Funktion und erhalten dann eine Wahrschenlichkeit für Klasse 1, sondern wir verwenden einfach so viele Output-Neuronen, wie es Klassen gibt. Im Anschluss verwenden wir die Softmax Funktion und erhalten die Wahrscheinlichkeiten."
]
},
{
"cell_type": "markdown",
"id": "19249d9a",
"metadata": {},
"source": [
"Die folgenden beiden Beispiele zeigen das exemplarische Verhalten der Softmax Funktion."
]
},
{
"cell_type": "markdown",
"id": "71ed521d",
"metadata": {},
"source": [
"![Softmax_Example_1](../resources/softmax_example1.png)\n",
"\n",
"(von https://mriquestions.com/softmax.html)"
]
},
{
"cell_type": "markdown",
"id": "d0db8789",
"metadata": {},
"source": [
"![Softmax_Example_2](../resources/softmax_example2.png)\n",
"\n",
"(von https://ogunlao.github.io/2020/04/26/you_dont_really_know_softmax.html)"
]
},
{
"cell_type": "markdown",
"id": "2f876838",
"metadata": {},
"source": [
"Haben wir nun ein Dataset mit den Labels *Katze, Hund, Pferd* (egal ob jetzt Bilder davon oder ob wir einfach ein paar Eigenschaften in Tabellen gesammelt haben wie zbsp Gewicht, Farbe, etc.), so müssen wir jetzt einen **OneHot-Encoder** verwenden.\n",
"\n",
"Im obigen Beispiel wären dann die Labels (in diesem Fall dann eine Verteilung (ein Vektor mit Summe 1)): **Katze=[1,0,0], Hund=[0,1,0], Pferd=[0,0,1]** und unser Modell würde versuchen, diese zu lernen."
]
},
{
"cell_type": "markdown",
"id": "d9d9b429",
"metadata": {},
"source": [
"Jetzt wissen wir auch, warum genau ein *OneHot-Encoder* so wichtig ist. Er erzeugt uns die Ziel-Verteilung (in diesem Fall halt eben eine One-Hot Verteilung)\n",
"\n",
"Für andere Anwendungen kann es sein, dass es vielleicht mehrere Labels gibt, in so einem Fall würde man:\n",
"\n",
"1. Als Ziel-Verteilung keine One-Hot Verteilung verwenden sondern zum Beispiel $[1,1,0,1,0]$ (bzw. modifizierte/normalisierte Versionen davon),\n",
"2. und außerdem dementsprechend die Softmax-Verteilung anpassen."
]
},
{
"cell_type": "markdown",
"id": "3cd6f4a5",
"metadata": {},
"source": [
"**Wichtig:** Für die Regression verwenden wir nach wie vor nur ein Output Neuron. In so einem Fall würde man keine Aktivierungsfunktion (auch kein Softmax) auf den Output setzen. (Warum?)"
]
},
{
"cell_type": "markdown",
"id": "5d4f384b",
"metadata": {},
"source": [
"## Aktivierungsfunktionen in PyTorch"
]
},
{
"cell_type": "markdown",
"id": "a144be2a",
"metadata": {},
"source": [
"Betrachten wir wieder das Beispiel von vorher. Wir adaptieren dieses Beispiel und ergänzen nun Aktivierungsfunktionen. Dafür verwenden wir das `torch.nn.functional` Paket."
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "1c2c9b3e",
"metadata": {},
"outputs": [],
"source": [
"import torch.nn.functional as F"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "bc527880",
"metadata": {},
"outputs": [],
"source": [
"class MyActivatedFirstNeuralNetwork(nn.Module):\n",
" \"\"\"A simple feedforward neural network, that expects n_input_features input features and produces 1 Output by using 3 Hidden Layers with 4 Features each.\"\"\"\n",
" def __init__(self, n_input_features: int):\n",
" super().__init__()\n",
" self.hidden_layer_1 = nn.Linear(n_input_features, 4) \n",
" self.hidden_layer_2 = nn.Linear(4, 4, bias=False) \n",
" self.hidden_layer_3 = nn.Linear(4, 4, bias=False) \n",
" self.output_layer = nn.Linear(4, 1, bias=False) \n",
"\n",
" def forward(self, x):\n",
" \"\"\"\n",
" :param x: Input tensor with shape (batch_size, n_input_features)\n",
" :return: Output tensor with shape (batch_size, 1)\n",
" \"\"\"\n",
" x = self.hidden_layer_1(x)\n",
" x = F.silu(x)\n",
" x = self.hidden_layer_2(x)\n",
" x = F.relu(x)\n",
" x = self.hidden_layer_3(x)\n",
" x = F.sigmoid(x)\n",
" x = self.output_layer(x)\n",
" return x"
]
},
{
"cell_type": "markdown",
"id": "1808d2b3",
"metadata": {},
"source": [
"Wir könnten diese auch in der Klasse speichern, es macht aber keinen Unterschied in diesem Fall."
]
},
{
"cell_type": "markdown",
"id": "41c71530",
"metadata": {},
"source": [
"Der Rest funktioniert wieder gleich, i.e.:"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "cebfe78a",
"metadata": {},
"outputs": [],
"source": [
"model = MyActivatedFirstNeuralNetwork(3)"
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "02bf1618",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"MyActivatedFirstNeuralNetwork(\n",
" (hidden_layer_1): Linear(in_features=3, out_features=4, bias=True)\n",
" (hidden_layer_2): Linear(in_features=4, out_features=4, bias=False)\n",
" (hidden_layer_3): Linear(in_features=4, out_features=4, bias=False)\n",
" (output_layer): Linear(in_features=4, out_features=1, bias=False)\n",
")\n"
]
}
],
"source": [
"print(model)"
]
},
{
"cell_type": "code",
"execution_count": 19,
"id": "749bc616",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"MyActivatedFirstNeuralNetwork(\n",
" (hidden_layer_1): Linear(in_features=3, out_features=4, bias=True)\n",
" (hidden_layer_2): Linear(in_features=4, out_features=4, bias=False)\n",
" (hidden_layer_3): Linear(in_features=4, out_features=4, bias=False)\n",
" (output_layer): Linear(in_features=4, out_features=1, bias=False)\n",
")"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"model"
]
},
{
"cell_type": "code",
"execution_count": 20,
"id": "53c84955",
"metadata": {},
"outputs": [],
"source": [
"input_data = torch.randn(5, 3) # was macht dieser Code?"
]
},
{
"cell_type": "code",
"execution_count": 21,
"id": "844222eb",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"tensor([[ 0.7376, -0.6442, 1.3565],\n",
" [ 1.3303, 0.1905, 0.7533],\n",
" [ 1.3503, -0.5184, -1.8554],\n",
" [ 0.8644, 0.0134, 0.7739],\n",
" [ 0.8419, -1.3249, -1.0933]])\n"
]
}
],
"source": [
"print(input_data)"
]
},
{
"cell_type": "code",
"execution_count": 22,
"id": "da98940e",
"metadata": {},
"outputs": [],
"source": [
"output = model(input_data)"
]
},
{
"cell_type": "code",
"execution_count": 23,
"id": "e20f08b6",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"tensor([[-0.4523],\n",
" [-0.4492],\n",
" [-0.4411],\n",
" [-0.4495],\n",
" [-0.4422]], grad_fn=<MmBackward0>)\n"
]
}
],
"source": [
"print(output)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Abschließend halten wir noch die bisherigen (wir werden in den anderen Notebooks noch weitere Hyperparameter kennenlernen) Hyperparameter von einem Neuronalen Netz fest."
]
},
{
"cell_type": "markdown",
"id": "f262177b",
"metadata": {},
"source": [
"## Hyperparameter eines Neural Networks\n",
"\n",
"* Anzahl und Aufbau der Layers\n",
"* Aktivierungsfunktionen zwischen den Layers"
]
},
{
"cell_type": "markdown",
"id": "33f75162",
"metadata": {},
"source": [
"### Aufgabe\n",
"\n",
"Entwerfen Sie ein neuronales Netzwerk, welches das Titanic-Dataset (``titanic.csv``) verwendet um dann zu vorhersagen, ob eine Person überlebt hat oder nicht.\n",
"\n",
"Dabei:\n",
"* Dürfen Sie den Aufbau selber wählen\n",
"* Muss natürlich nur der Forward-Pass implementiert werden\n",
"* Die Daten müssen vorverarbeitet werden\n",
"* Die GPU soll verwendet werden (falls vorhanden)"
]
},
{
"cell_type": "markdown",
"id": "2ba8cd2b",
"metadata": {},
"source": [
"### Lösung"
]
},
{
"cell_type": "markdown",
"id": "4f83156d",
"metadata": {},
"source": [
"**WICHTIG:** Das obige Neuronale Netz ist noch **nicht trainiert**. Es ist der Output also derzeit noch ein zufälliges Ergebnis!"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "dsai",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.23"
}
},
"nbformat": 4,
"nbformat_minor": 5
}