Uge 1: Øvelser#

Opgaverne er håndregningsopgaver med mindre andet er angivet (fx at du bliver bedt om at plotte en graf eller udregne en eksponentialfunktion).

Opgaver – Store Dag#

1: Funktion eller ej?#

Betragt følger korrespondance mellem \(a\) og \(b\) værdier:

\(a\)

\(b\)

1

0

2

1

0

3

1

2

Vi betragter funktioner hvis definitionsmængde (domain) er en delmængde af \(\{0,1,2,3\}\) og hvis dispositionsmængde (co-domain) er \(\{0,1,2,3\}\). Vi skal bestemme om \(f\) og \(g\) definerer funktioner, hvis vi lader \(f\) følge reglen at første søjle (\(a\)-værdierne) er input og anden søjle (\(b\)-værdierne) skal være output af funktionen \(f\) og definitionsmængden er \(\{0,1,2\}\); og vi lader \(g\) følge reglen om at anden søjle er input og første søjle skal være output af funktionen \(g\) med definitionsmængde \(\{0,1,2,3\}\).

Definerer \(f\) en funktion? Gør \(g\)? I bekræftende fald: bestem værdimængden/billedmængden (engelsk: range/image) for funktionen, og afgør om funktionen er injektiv og surjektiv.

2: Ens funktionsforskrifter?#

Vi betragter funktioner \(f_i : \mathbb{R} \to \mathbb{R}\) givet ved:

\[\begin{gather*} f_1(x) = |x| \\ f_2(x) = \begin{cases} x & x > 0 \\ -x & x \le 0 \end{cases} \\ f_3(x) = \max(x,0) \\ f_4(x) = \operatorname{ReLU}(x) + \operatorname{ReLU}(-x) \end{gather*}\]

hvor \(x \in \mathbb{R}\).

Nogle af funktionerne er samme funktion. Find dem alle!

3: Funktion med ukendt forskrift#

Betragt en funktion \(f: \mathbb{R} \to \mathbb{R}\) hvorom der gælder \(\lim_{x \to 2} f(x) = 5\) og \(f(2) = 3\). Hvad kan vi sige om \(f\) i punktet \(x=2\)? Vælg det korrekte svar:

  1. Funktionen er kontinuert i punktet \(x=2\).

  2. Funktionen er differentiabel i punktet \(x=2\).

  3. Funktionen er diskontinuert i punktet \(x=2\).

  4. Funktionen er ikke veldefineret i punktet \(x=2\).

  5. Man kan ikke afgøre ovenstående, da funktionsforskriften ikke er angivet!

4: Ikke-linearitet af ReLU#

Betragt ReLU-funktionen, \(\operatorname{ReLU}: \mathbb{R}^n \to \mathbb{R}^n\). Forklar hvorfor funktionen ikke er lineær.

5: Mulige visualiseringer#

Diskuter om man kan visualisere nedenstående funktioner – i givet fald plot dem med SymPy/dtumathtools:

  1. En skalarfunktion af to variable \(f: \mathbb{R}^2 \to \mathbb{R}, \, f(x_1,x_2) = \sqrt{\vert x_1 x_2 \vert}\)

  2. En skalarfunktion af fire variable \(f: \mathbb{R}^4 \to \mathbb{R}, \, f(x_1,x_2,x_3,x_4) = \sqrt{\vert x_1 x_2 x_3 x_4 \vert}\)

  3. En kompleks skalarfunktion af to variable \(f: \mathbb{R}^2 \to \mathbb{C}, \, f(x_1,x_2) = \sqrt{\vert x_1 x_2 \vert} + i \cos(x_1 + x_2)\)

  4. Et vektorfelt i 2D \(\pmb{f}: \mathbb{R}^2 \to \mathbb{R}^2, \, \pmb{f}(x_1,x_2) = (-x_2/3, x_1/3)\)

  5. Et vektorfelt i 3D \(\pmb{f}: \mathbb{R}^3 \to \mathbb{R}^3, \, \pmb{f}(x,y,z)= (x^3+yz^2, y^3-xz^2, z^3)\)

  6. En funktion af formen \(\pmb{r}: [0,10] \to \mathbb{R}^3, \, \pmb{r}(t) = (\cos(t),\sin(t),t)\)

Note

Følgende Python kommandoer kan være nyttige: dtuplot.plot3d, dtuplot.plot_vector, dtuplot.plot3d_parametric_line.

6: Evaluering af et Neuralt Netværk#

Betragt et simpelt “shallow” neuralt netværk \(\pmb{\Phi}: \mathbb{R}^2 \to \mathbb{R}\) med ét skjult lag (\(L=2\)). Netværket er defineret ved parametrene:

\[\begin{split} A_1 = \begin{bmatrix} 2 & 0 \\ -1 & 1 \end{bmatrix}, \quad \pmb{b}_1 = \begin{bmatrix} -1 \\ 0 \end{bmatrix}, \quad A_2 = \begin{bmatrix} -1 & 2 \end{bmatrix}, \quad b_2 = 0, \end{split}\]

hvor aktiveringsfunktionen i det skjulte lag er ReLU-funktionen, \(\pmb{\sigma}(\pmb{z}) = \operatorname{ReLU}(\pmb{z})\), mens aktiveringsfunktionen i det sidste lag er identitetsafbildningen \(\pmb{\sigma}(\pmb{z}) = \pmb{z}\). Netværksfunktionen er altså givet ved:

\[ \pmb{\Phi}(\pmb{x}) = A_2 \, \operatorname{ReLU}(A_1 \pmb{x} + \pmb{b}_1) + b_2 \]

Spørgsmål a#

Beregn værdien af netværket i punktet \(\pmb{x} = \begin{bmatrix} 0.5 \\ 1 \end{bmatrix}\).

Spørgsmål b#

Find et punkt \(\pmb{x}\), hvor netværkets output \(\pmb{\Phi}(\pmb{x})\) er negativt. Begrund dit svar.

Spørgsmål c#

Hvor mange justerbare parametre (vægte og bias-værdier) har dette netværk totalt?

Spørgsmål d#

Vi erstatter nu aktiveringsfunktionen (ReLU) med en “hard limiter” funktion (en variant af signum-funktionen), som vi kalder \(\sigma_{\text{step}}\).

Som skalar-funktion \(\sigma_{\text{step}}: \mathbb{R} \to \mathbb{R}\) er den defineret ved:

\[\begin{split} \sigma_{\text{step}}(x) = \begin{cases} 1 & \text{hvis } x \ge 0 \\ -1 & \text{hvis } x < 0 \end{cases} \end{split}\]

Som vektorfunktion \(\pmb{\sigma}_{\text{step}}: \mathbb{R}^n \to \mathbb{R}^n\) defineres den ved at anvende skalarfunktionen på hver koordinat:

\[\begin{split} \pmb{\sigma}_{\text{step}}(\pmb{z}) = \begin{bmatrix} \sigma_{\text{step}}(z_1) \\ \vdots \\ \sigma_{\text{step}}(z_n) \end{bmatrix} \end{split}\]

Betragt nu netværket med denne nye aktiveringsfunktion: \(\pmb{\Phi}(\pmb{x}) = A_2 \pmb{\sigma}_{\text{step}}(A_1 \pmb{x} + \pmb{b}_1) + b_2\).

Angiv den delmængde af definitionsmængden, hvor netværksfunktionen \(\pmb{\Phi}(\pmb{x})\) er diskontinuert.

7: Visualisering af Netværket#

I denne opgave skal du bruge Python til at visualisere funktionen \(\pmb{\Phi}(\pmb{x})\) fra forrige opgave 6: Evaluering af et Neuralt Netværk (med ReLU som aktiveringsfunktion).

Du skal plotte grafen for netværket over området \(x_1, x_2 \in [-2, 2]\). Vi benytter her en numerisk tilgang (med Matplotlib) frem for SymPy for at opnå en bedre 3D-visualisering. Kør koden nedenfor – det er ikke nødvendigt at sætte sig ind i de Python-tekniske detaljer.

import numpy as np
import matplotlib.pyplot as plt

# Parametre
A1 = np.array([[2, 0], 
               [-1, 1]])
b1 = np.array([[-1], 
               [0]])
A2 = np.array([[-1, 2]]) 
b2 = 0

def ReLU(x):
    return np.maximum(x, 0)

def shallow_nn(x1, x2):
    # inputtet samles i en vektor x
    vals = np.zeros(x1.shape)
    
    for i in range(x1.shape[0]):
        for j in range(x1.shape[1]):
            x_vec = np.array([[x1[i,j]], [x2[i,j]]])
            
            # Lag 1: Affin transformation + ReLU
            z1 = A1 @ x_vec + b1
            a1 = ReLU(z1)
            
            # Lag 2: Affin transformation
            output = A2 @ a1 + b2
            
            vals[i,j] = output[0,0]
            
    return vals

x_range = np.linspace(-2, 2, 80)
y_range = np.linspace(-2, 2, 80)
X, Y = np.meshgrid(x_range, y_range)
Z = shallow_nn(X, Y)

# Plot
fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(111, projection='3d')

surf = ax.plot_surface(X, Y, Z, cmap='viridis', 
                       edgecolor='k', linewidth=0.3, alpha=0.5,
                       rcount=20, ccount=20, antialiased=True)

# "Knæk-linjerne" (hvor ReLU går fra 0 til positiv)
y_vals = np.linspace(-2, 2, 100)
x_vals_1 = np.full_like(y_vals, 0.5)
z_vals_1 = shallow_nn(np.array([x_vals_1]), np.array([y_vals]))[0]
x_vals_2 = np.linspace(-2, 2, 100)
y_vals_2 = x_vals_2
z_vals_2 = shallow_nn(np.array([x_vals_2]), np.array([y_vals_2]))[0]

ax.plot(x_vals_1, y_vals, z_vals_1, color='red', linewidth=3, label='$2x_1 - 1 = 0$ (Knæk 1)')
ax.plot(x_vals_2, y_vals_2, z_vals_2, color='orange', linewidth=3, label='$-x_1 + x_2 = 0$ (Knæk 2)')

ax.set_xlabel('$x_1$')
ax.set_ylabel('$x_2$')
ax.set_zlabel('$\Phi(x)$')
ax.legend()
ax.view_init(elev=15, azim=-100) 

plt.tight_layout()
plt.show()
Hide code cell output
../_images/4b795aa9851de1b98ba9d930597daaf19bc319411ef2919b533a9a3cef3d636a.png

Note

Læg mærke til, at grafen består af plane flader, der er “knækket” og sat sammen. Dette skyldes ReLU-funktionen, som er stykkevis lineær. I store netværk der anvendes i praksis sættes millioner af sådanne lineære underrum sammen.

Kan du plotte grafen af det samme neurale netværk hvor \(\pmb{\sigma}_{\text{step}}\) bruges i stedet for ReLU? Planerne i den nye graf bør ikke “hænge sammen” (hvorfor?).

8: Lineær vektorfunktion#

Lad \(A \in \mathsf{M}_{3 \times 5}(\mathbb{R})\) være givet ved

\[\begin{equation*} A = \begin{bmatrix} 1 & 0 & 2 & 3 & 4 \\ 0 & -1 & 5 & 6 & 7 \\ 0 & 0 & -3 & 8 & 9 \end{bmatrix} \end{equation*}\]

Betragt vektorfunktionen \(\pmb{f}: \mathbb{R}^5 \to \mathbb{R}^3\) givet ved \(\pmb{f} = \pmb{x} \mapsto A\pmb{x}\), hvor \(\pmb{x}\) er en søjlevektor i \(\mathbb{R}^5\).

Spørgsmål a#

Angiv de 3 koordinatfunktioner for \(\pmb{f}\).

Spørgsmål b#

Angiv billedmængden \(\operatorname{im}(\pmb{f})\) for \(\pmb{f}\).

Spørgsmål c#

Er vektorfunktionen \(\pmb{f}\) surjektiv og/eller injektiv?

9: Næste primtal-funktion (frivillig)#

Dette er en valgfri ekstraopgave.

Lad \(f: \mathbb{N} \to \mathbb{N}\) være en funktion, der returnerer det næste primtal (strengt) større end et givet naturligt tal \(n\). I denne opgave skal du først vurdere værdien af funktionen for to specifikke input og derefter vise, at funktionen er veldefineret, før du implementerer den i Python.

Spørgsmål a#

Find ved simple overvejelser \(f(10)\) og \(f(13)\).

Spørgsmål b#

Argumenter for, at funktionen \(f(n)\) er veldefineret.

Spørgsmål c#

Kan man finde et funktionsudtryk for \(f(n)\)? Argumenter for, hvorfor det er eller ikke er muligt.

Spørgsmål d#

Implementer funktionen \(f(n)\) i Python, som tager et heltal \(n\) som input og returnerer det næste primtal større end \(n\). Definer en hjælpefunktion er_primtal(x) til at afgøre, om et tal er primtal.

from math import sqrt  

def er_primtal(x: int) -> bool:  
    """Returnerer True hvis x er et primtal, ellers False."""  
    if x < 2:  
        return False  
    # Three lines of code missing 
    return True  

def f(n: int) -> int:  
    """Returnerer det næste primtal større end n."""  
    kandidat = n + 1  
    # Two lines of code missing
    return kandidat  

Spørgsmål e#

Kan du opdatere din Python-funktion fra forrige opgave, så \(f\)’s definitionsmængde udvides fra \(\mathbb{N}\) til \(\mathbb{R}\)?


Opgaver – Lille Dag#

1: Størrelse af vektorer#

Betragt følgende tre vektorer i \(\mathbb{R}^3\):

\[\begin{equation*} \pmb{v}_1 = \left[\begin{matrix}-10\\ -10\\ -10\end{matrix}\right], \, \pmb{v}_2 = \left[\begin{matrix}-10\\ -4\\ 14\end{matrix}\right], \, \pmb{v}_3 = \left[\begin{matrix}-10\\ -8\\-12\end{matrix}\right] \end{equation*}\]

Hvilken vektor er længst? Hvilke vektorer er ortogonale på hinanden? Hvilke to vektorer er tættest på hinanden?

Note

Vi kan forestille os vektorerne som (geometriske) stedvektorer med begyndelsespunkt i \(\pmb{0}=[0,0,0]^T\) og slutpunkt \(\pmb{v}_i\) for hhv \(i=1,2,3\). Under tiden skriver man dette som \(\overrightarrow{\pmb{0}\pmb{v}_i}\).

2: Partielle afledede af simpel skalar-funktion#

Find de partielle afledte \(\frac{\partial f}{\partial x_1}\) og \(\frac{\partial f}{\partial x_2}\) for \(f(x_1, x_2) = x_1^3 + 3x_1 x_2 + x_2^3\). Bestem værdien af de partielle afledte i punktet \((x_1,x_2)=(1,2)\).

3: Forskellige(?) kvadratiske former#

Lad \(\pmb{x} = [x_1,x_2]^T\) være en søjlevektor i \(\mathbb{R}^2\). Definer:

\[\begin{equation*} A_1 =\left[\begin{matrix}11 & -12 \\ -12 & 4\end{matrix}\right], \, A_2 =\left[\begin{matrix}11 & 0 \\ -24 & 4\end{matrix}\right], \, A_3 =\left[\begin{matrix} 73/5 & -36/5 \\ -36/5 & 52/5 \end{matrix}\right], \, \end{equation*}\]

og

\[\begin{equation*} \pmb{b}_1 = \left[\begin{matrix}-20\\ 40\end{matrix}\right], \, \pmb{b}_2 = \pmb{b}_1, \, \pmb{b}_3 = \left[\begin{matrix}-44\\ 8\end{matrix}\right], \, c = -60 \end{equation*}\]

Lad \(q_i: \mathbb{R}^2 \to \mathbb{R}\) være givet ved:

\[\begin{equation*} q_i(\pmb{x}) = \pmb{x}^T A_i \pmb{x} + \pmb{b}_i^T \pmb{x} + c \end{equation*}\]

for \(i=1,2,3\). Sådanne funktioner kaldes kvadratiske former, se denne definition.

Spørgsmål a#

Gang udtrykket for \(q_1(x_1,x_2)\) ud. Først i hånden, så ved hjælp af Python. Gang også udtrykkene for \(q_2(x_1,x_2)\) og \(q_3(x_1,x_2)\) (i hånden eller Python) ud.

Spørgsmål b#

Er den kvadratiske matrix \(A\) i en kvadratisk form (som fx \(\pmb{x}^T A \pmb{x}\)) entydig givet?

Spørgsmål c#

Plot grafen af funktionen \(q_1\). Plot så nogle niveaukurver. Hvilken geometrisk form har niveaukurverne? Gør det samme for \(q_3\).

Spørgsmål d#

En af funktionerne har et minimum. Hvilken? Hvor ligger det cirka? Hvad kaldes det samme punkt for de funktioner der ikke har et minimum?

4: Softmax-funktionen#

I denne opgave ser vi på softmax-funktionen.

Spørgsmål a#

Beregn softmax af følgende tre vektorer i \(\mathbb{R}^3\). Du kan gøre det ved håndkraft (brug lommeregner til eksponentialfunktionen) eller ved hjælp af Python. Angiv svarene med ca. 3 decimaler.

  1. \(\pmb{x}_1=[1,2,-5]^T\)

  2. \(\pmb{x}_2=[10,2,-5]^T\)

  3. \(\pmb{x}_3=[100,2,-5]^T\)

Spørgsmål b#

Hvad observerer du, når forskellen mellem den største værdi i inputtet og de andre værdier øges (som i skiftet fra \(\pmb{x}_1\) til \(\pmb{x}_2\) og \(\pmb{x}_3\))? Hvorfor kaldes funktionen mon “soft”-max?

Spørgsmål c#

Er softmax-funktionen kontinuert?

Spørgsmål d#

Betragt softmax som en afbildning fra \(\mathbb{R}^n\) til \(\mathbb{R}^n\). Er funktionen injektiv (en-til-en)?

Er funktionen surjektiv (på) i forhold til dispositionsmængde \(\mathbb{R}^n\)?

5: Kvadratiske former med symmetriske matricer#

Lad \(A\) være en vilkårlig \(n \times n\) matrix, og lad \(\pmb{x}\) være en søjlevektor i \(\mathbb{R}^n\). Definer \(B\) ved \(B = (A + A^T)/2\).

Spørgsmål a#

Vis at matricen \(B\) er symmetrisk.

Spørgsmål b#

Vis at \(\pmb{x}^T A \pmb{x} = \pmb{x}^T B \pmb{x}\).

Spørgsmål c#

Konkludér at man altid kan antage at kvadratiske former af formen \(q(\pmb{x}) = \pmb{x}^T A \pmb{x} + \pmb{b}^T \pmb{x} + c\) er givet ved en symmetrisk matrix \(A\).