Answer to Question 1-1
Aktivierungsfunktionen in tiefen neuronalen Netzen müssen nichtlinear sein, weil lineare Aktivierungsfunktionen die Schichten des neuronalen Netzes zusammenfassen und somit keine zusätzliche Komplexität oder Flexibilität hinzufügen würden. Durch die Verwendung nichtlinearer Aktivierungsfunktionen können komplexe Beziehungen und Muster in den Daten besser modelliert werden, was zu einer höheren Leistungsfähigkeit des neuronalen Netzes führt. 

Um dies genauer zu erklären, können wir uns die mathematische Repräsentation eines neuronalen Netzes vorstellen, das nur aus linearen Transformationen besteht. Bei mehreren aufeinanderfolgenden linearen Transformationen würde jede Schicht einfach eine lineare Kombination der Eingaben der vorherigen Schicht berechnen. Dadurch könnten auch mehrere Schichten hintereinander zu einer einzigen linearen Transformation zusammengefasst werden, was die Kapazität des neuronalen Netzes begrenzen würde. 

Durch die Verwendung von nichtlinearen Aktivierungsfunktionen wie der ReLU-Funktion (Rectified Linear Unit) oder der Sigmoid-Funktion werden die Schichten des neuronalen Netzes dazu gezwungen, nichtlineare Transformationen der Eingaben durchzuführen, was es dem Netzwerk ermöglicht, komplexere Muster zu erlernen und eine Vielzahl von Funktionen zu approximieren. 

Insgesamt tragen nichtlineare Aktivierungsfunktionen also dazu bei, die expressive Kraft und Flexibilität von tiefen neuronalen Netzen zu erhöhen.







****************************************************************************************
****************************************************************************************




Answer to Question 1-2
Um die Unterschiede zwischen LayerNorm, BatchNorm und InstanceNorm zu erklären, müssen wir zunächst verstehen, was Normalisierungsschichten sind. Diese Art von Schichten wird in neuronalen Netzwerken verwendet, um die Inputs jedes Layers zu normalisieren, was dazu beiträgt, das Training zu stabilisieren und die Konvergenz zu beschleunigen. 

1. **BatchNorm (Batch Normalization)**:
   - Bei BatchNorm werden die Aktivierungen jedes Layers normalisiert, indem der Durchschnitt und die Standardabweichung der Aktivierungen über alle Beispiele in einem Mini-Batch berechnet werden. Diese normalisierten Werte werden dann skaliert und verschoben.
   - BatchNorm trägt zur Stabilisierung des Trainings bei, indem es das Problem des "Internal Covariate Shift" reduziert, da die Aktivierungen nicht zu stark variieren.

2. **LayerNorm (Layer Normalization)**:
   - Im Gegensatz zu BatchNorm wird bei LayerNorm der Durchschnitt und die Standardabweichung der Aktivierungen pro Beispiel berechnet. Dies bedeutet, dass die Normalisierung für jedes Beispiel individuell erfolgt.
   - LayerNorm eignet sich gut für RNNs und CNNs, da es invariant gegenüber der Batchgröße ist und keine Korrelation zwischen den Beispielen erfordert.

3. **InstanceNorm (Instance Normalization)**:
   - Bei InstanceNorm wird jede einzelne Aktivierung normalisiert, unabhängig von den anderen Beispielen im Batch oder Layer. Dies ähnelt LayerNorm, allerdings bezieht sich InstanceNorm auf eine spezifische Aktivierung innerhalb eines Filters.
   - InstanceNorm wird häufig in der Bildverarbeitung verwendet, um Style Transfer und -Transformationen zu unterstützen.

Die Verwendung von Normalisierungsschichten wie BatchNorm, LayerNorm und InstanceNorm hilft bei der Stabilisierung des Trainings, weil sie dazu beitragen, dass die Aktivierungen in den neuronalen Netzwerken nicht zu stark variieren und somit das Training beschleunigen. Indem man die Verteilung der Aktivierungen stabilisiert, wird das Training effizienter und das Risiko von Gradientenexplosionen oder -verschwinden verringert.





****************************************************************************************
****************************************************************************************




Answer to Question 1-3
Um die Werte des Ausgabeneurons im letzten Zeitschritt des gegebenen rekurrenten Netzes zu bestimmen, müssen wir die Eingabewerte entlang der Zeitachse durch das Netzwerk propagieren und dabei die Sigmoid-Aktivierungsfunktion berücksichtigen.

Um den genauen Werteberechnungen durchzuführen, benötigen wir jedoch die konkreten Gewichte der Verbindungen im Netzwerk und die Eingabewerte entlang der Zeitachse. Da diese Informationen in der gegebenen Fragestellung jedoch nicht enthalten sind, können wir die Antwort nicht berechnen.

Um die Werte des Ausgabeneurons im letzten Zeitschritt zu erhalten, müssten wir die Eingabewerte entlang der Zeitachse propagieren, dabei die Gewichte der Verbindungen berücksichtigen und die Sigmoid-Aktivierungsfunktion auf die Ausgabeschicht anwenden.

Leider fehlen uns die notwendigen Informationen, um die genauen Berechnungen durchzuführen.





****************************************************************************************
****************************************************************************************




Answer to Question 1-4
a) Zur Trainingszeit sind die Netzwerkeingaben das Eingabewort (oder die Eingabesequenz) des aktuellen Zeitschritts, welche direkt aus dem Trainingsdatensatz stammen, sowie das richtige Ausgabewort (oder die richtige Ausgabesequenz) des vorherigen Zeitschritts, die als Lehrersignale verwendet werden.

b) Zur Inferenzzeit sind die Netzwerkeingaben das Ausgabewort (oder die Ausgabesequenz) des vorherigen Zeitschritts, welche vom Modell selbst generiert wurden.





****************************************************************************************
****************************************************************************************




Answer to Question 1-5
Um die Dimensionen der Ausgabe, die Dimensionen des receptive fields und die Anzahl der Parameter in jeder Schicht des gegebenen CNN zu beschreiben, betrachten wir jeden Layer nacheinander:

1. CONV3-8:
   - Ausgabe Dimensionen: $(32, 32, 8)$
   - Anzahl Parameter: 216 (8 Filter * (3*3 Gewichte + 1 Bias))
   - Dimensionen des Receptive Fields: $(3, 3)$

2. Leaky Relu: Keine Veränderung der Dimensionen

3. Pool-2:
   - Ausgabe Dimensionen: $(16, 16, 8)$
   - Keine zusätzlichen Parameter
   - Dimensionen des Receptive Fields bleiben $(3, 3)$

4. Batch Normalization (BATCHNORM): Keine Veränderung der Dimensionen, keine neuen Parameter

5. CONV3-16:
   - Ausgabe Dimensionen: $(16, 16, 16)$
   - Anzahl Parameter: 1168 (16 Filter * (3*3 Gewichte + 1 Bias))
   - Dimensionen des Receptive Fields: $(5, 5)$

6. Leaky ReLU: Keine Veränderung der Dimensionen

7. Pool-2:
   - Ausgabe Dimensionen: $(8, 8, 16)$
   - Keine zusätzlichen Parameter
   - Dimensionen des Receptive Fields bleiben $(5, 5)$

8. FLATTEN:
   - Die Ausgabe wird zu einem Vektor mit Länge $8*8*16 = 1024$

9. FC-10:
   - Ausgabe Dimensionen: $(10)$
   - Anzahl Parameter: 10250 (1024 Eingänge * 10 Neuronen + 10 Bias)
   - Dimensionen des Receptive Fields: Nicht zutreffend (fully-connected Layer)

Bitte beachten Sie, dass die Aktivierungen (z.B. Leaky ReLU) keine Auswirkungen auf die Dimensionen haben.





****************************************************************************************
****************************************************************************************




Answer to Question 2-1
1. Falsch
2. Falsch
3. Falsch
4. Wahr





****************************************************************************************
****************************************************************************************




Answer to Question 2-2
Um die Größe des rezeptiven Feldes in einem Convolutional Neural Network zu vergrößern, kann die Größe der Convolutional Kernel oder die Anzahl der Kanäle in den Convolutional Kernels erhöht werden. Daher sind die folgenden Optionen wahr:

1. [x] Die Größe der Convolution Kernels
2. [x] Die Anzahl von Kanälen in den Convolution Kernels

Die anderen beiden Optionen, die Aktivierungsfunktion in jedem Layer und die Größe des Pooling Layers, können nicht direkt die Größe des rezeptiven Feldes beeinflussen.





****************************************************************************************
****************************************************************************************




Answer to Question 2-3
Wahr





****************************************************************************************
****************************************************************************************




Answer to Question 2-4
Um die Fragen zu beantworten, müssen wir prüfen, welche der vorgeschlagenen Funktionen als praxistaugliche Aktivierungsfunktionen im Training von neuronalen Netzen verwendet werden können.

1. Die Funktion \( f(x) = \min(2,x) \) kann als Aktivierungsfunktion verwendet werden. (Richtig)

2. Die Funktion \( f(x) = 3x + 1 \) kann nicht als Aktivierungsfunktion verwendet werden. (Falsch)

3. Die Funktion \( f(x) = \min(x, 0.5x) \) if x < 0; \( f(x) = \min(x, 0.5x) \) if x >= 0 kann als Aktivierungsfunktion verwendet werden. (Richtig)

4. Die Funktion \( f(x) = \min(x, 0.1x) \) if x < 0; \( f(x) = \max(x, 0.1x) \) if x >= 0 kann als Aktivierungsfunktion verwendet werden. (Richtig)





****************************************************************************************
****************************************************************************************




Answer to Question 2-5
Um Overfitting zu reduzieren, können die folgenden Ansätze verwendet werden:
- (wahr) Data augmentation
- (wahr) Dropout
- (falsch) Batch normalization
- (falsch) Benutzung von Adam anstelle von SGD





****************************************************************************************
****************************************************************************************




Answer to Question 2-6
Um diese Frage zu beantworten, müssen wir uns die Ableitung der Sigmoid-Funktion ansehen, die wie folgt definiert ist: y = f(x) = 1 / (1 + exp(-x)). Die Ableitung davon ist f'(x) = y * (1 - y).

Angenommen, der Gradient, der rückwärts durch den Sigmoid fließt, ist δ. Wir können dann das Verhalten des Gradienten analysieren, indem wir die Ableitung der Sigmoid-Funktion verwenden.

- Wenn der Gradient δ durch einen Sigmoid mit Ausgangswert y fließt, wird er sich immer (im Betrag) **verringern**, die Polarität jedoch **invertieren**.

Daher ist die richtige Option: im Betrag verringern, die Polarität invertieren.





****************************************************************************************
****************************************************************************************




Answer to Question 3-1
a) Um sicherzustellen, dass der attention layer $l$ head $h$ im Dekodierungsschritt $n+1$ am meisten zur Position $n$ attendet, muss folgende Bedingung erfüllt sein: Der Wert $x^l_{n+1}$ in der Eingabe $X^l$ in der $l$-ten Schicht muss so transformiert werden, dass er in der Query-Repräsentation $q^{l, h}_n$ in der $l$-ten self-attention Schicht in dem attention head $h$ die höchste Aufmerksamkeit erhält.

b) Um diese Aufgabe für beliebige Eingabesequenzen zu erfüllen, wird die Positional Encoding-Komponente der Transformer-Architektur benötigt. Sie stellt sicher, dass die Transformer-Modelle die Positionsinformation der Tokens in den Sequenzen berücksichtigen können.





****************************************************************************************
****************************************************************************************




Answer to Question 3-2
**Antwort:**

**a)**
Die Bedingung, die im Dekodierungsschritt $n+1$ erfüllt sein muss, damit beim greedy decoding $t_{k+1}$ als nächstes Token prädiziert wird, ist, dass $t_{k+1}$ das Token ist, das als nächstes in der Ground-Truth-Sequenz auftaucht.

**b)**
Die Bedingung, die im Dekodierungsschritt $n+1$ erfüllt sein muss, damit der attention layer $l$ head $h$ am meisten zu der Position $k+1$ attended, ist, dass die relevanteste Information für die Prädiktion des Tokens $t_{k+1}$ in der $l$-ten Schicht im $h$-ten attention head vorliegt.

**c)**
Ein Transformer-Modell mit nur einem attention layer kann diese Bedingung für beliebige Sequenzen, für beliebiges $k < n$ mit $t_k = t_n$ nicht erfüllen. Dies liegt daran, dass ein einziger attention layer nicht genügend Kapazität hat, um die benötigten Informationen aus der Historie effektiv zu extrahieren und zu nutzen.

**d)**
Im Transformer ist der Kommunikationskanal, um Information von einem attention head zu einem anderen attention head
- im gleichen layer weiterzugeben: Die Kommunikation erfolgt über die sogenannte "multi-head attention" Schicht.
- in einem aufeinanderfolgenden layer weiterzugeben: Die Information wird von Schicht zu Schicht weitergegeben, sowohl durch die Attentionmechanismen als auch durch die Residualverbindungen. Der Teil der self-attention, der entscheidet, was geschrieben und gelesen wird, ist die Gewichtungsmatrix, die durch die Multi-Head-Attention generiert wird.

**e)**
In einem zwei-layer Transformer-Modell mit nur attention layern kann eine Sequenz von self-attention Operationen wie folgt gestaltet werden, damit der attention head $h$ in Layer $l > 1$ für beliebige Sequenzen zur Position $k+1$ attended:
- In der ersten Schicht erfolgt die normale Attention-Berechnung, wobei die Information über die Attention-Weights von der vorherigen Schicht übernommen wird.
- In der zweiten Schicht findet eine erneute Berechnung der Attention statt, wobei die Position $k+1$ besonders hervorgehoben wird, um sicherzustellen, dass der Attention Head $h$ auf diese Position fokussiert.
- Durch geschickte Rotationen und Verschiebungen in den Position-Embeddings kann die Aufmerksamkeit des Heads auf die gewünschte Position gelenkt werden.





****************************************************************************************
****************************************************************************************




Answer to Question 4-1
Um die Matrix-Vektor-Multiplikation zu beschreiben, betrachten wir die Eingabe für das $i$-te Vokabularwort $s_k$. Diese Eingabe ist ein One-Hot-Vektor, bei dem alle Einträge Null sind, außer dem Eintrag an der Position $i$, der den Wert Eins hat. 

Um diesen Vektor mit der Embedding-Matrix $W_E$ zu multiplizieren, wird er mit der $i$-ten Spalte der Matrix multipliziert. Die $i$-te Spalte von $W_E$ entspricht genau der vektoriellen Repräsentation des $i$-ten Vokabularwortes. 

Daher wird die Multiplikation des One-Hot-Vektors für das Wort $s_k$ mit der Embedding-Matrix $W_E$ dazu führen, dass der resultierende Vektor genau der vektoriellen Repräsentation des Wortes $s_k$ entspricht.





****************************************************************************************
****************************************************************************************




Answer to Question 4-2
a) Die Abbildung $g$ muss differenzierbar sein, damit wir mithilfe von Gradientenabstieg das Netz trainieren können.

b) Der Gradient $\\nabla l$ bezüglich $W_E$ ist gegeben durch:
$$\\nabla l = \\frac{\\partial l}{\\partial g} \\cdot \\frac{\\partial g}{\\partial E(w)}$$
um sicherzustellen, dass $\\frac{\\partial g}{\\partial E(w)}$ der einzige übriggebliebene partielle Gradiententerm bleibt.

c) Der Gradient $\\frac{\\partial l}{\\partial w_{ij}}$ für $i \neq k$ ist $0$, da der Verlust nur vom Ausgabewort $w_k$ abhängt und nicht von anderen Vokabularwörtern.

d) Die Erkenntnis aus Aufgabenteil c) bedeutet:
- Für den Vorwärtspass hat die Erkenntnis keine Auswirkung auf die Speicher- und Berechnungskomplexität.
- Für den Rückwärtspass bedeutet die Erkenntnis, dass die Gradienten nur für das Ausgabewort $w_k$ berücksichtigt werden müssen, was die Berechnungseffizienz erhöht.





****************************************************************************************
****************************************************************************************




