Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

In deze sectie concentreren we ons eerst op de SSESSE functie in het (triviale) geval dat we een linear regressiemodel hebben met enkel een intercept (b=[b1]T\pmb{b} = [b_1]^T). We krijgen dan een U-vormige curve te zien zoals hieronder afgebeeld. Pas in tweede instantie kijken we naar modellen met één of meerdere predictoren b=[b1,b2,]T\pmb{b} = [b_1, b_2, \ldots]^T.

Source
from ml_courses.sim.derivative_viz import DerivativeVisualization
Source
dv = DerivativeVisualization()
dv.plot()
<Figure size 1500x500 with 3 Axes>

Bij de Monte Carlo sampling leveren we ons over aan het willekeurig aftasten van de SSESSE functie. We zochten steeds naar een richting in de ruimte waarin we een stapje naar beneden konden zetten. Het is echter wiskundig perfect mogelijk om op ieder punt te bepalen in welke richting de daling het grootst zal zijn. Dit brengt ons bij het concept van een raak- of tangentlijn op een bepaald punt van een functie waarvan de richtingscoëfficient (of slope) de “afgeleide” van die functie in dat punt wordt genoemd. De raak-/tangentlijn van een functie ff in het punt xx moet gezien worden als de lokale lineaire benadering van die functie in dat punt. Het bepalen van die lokale benadering (en dus de afgeleide) heet het differentiëren van functies.

Afgeleide van een kwadratische functie

De illustratie hierboven toont het principe van een afgeleide in het geval van een enkelvoudige kwadratische functie:

f(x)=x2f(x) = x^2

We beginnen met een rechte die de kwadratische functie op twee punten snijdt: (x1,y1)(x_1, y_1) en (x2,y2)(x_2, y_2). Om de richtingscoëfficient te bepalen, rekenen we gewoon de verhouding uit tussen de afstand op de yy-as (Δy=y2y1\Delta y = y_2 - y_1) en de afstand op de xx-as (Δx=x2x1\Delta x = x_2 - x_1).

ΔyΔx=y2y1Δx=f(x1+Δx)f(x1)Δx=(x1+Δx)2x12Δx=x12+2x1Δx+Δx2x12Δx=2x1Δx+Δx2Δx=2x1+Δx\begin{aligned} \frac{\Delta y}{\Delta x} &= \frac{y_2 - y_1}{\Delta x} \cr &= \frac{f(x_1 + \Delta x) - f(x_1)}{\Delta x} \cr &= \frac{(x_1 + \Delta x)^2 - x_1^2}{\Delta x} \cr &= \frac{x_1^2 + 2x_1\Delta x + \Delta x^2 - x_1^2}{\Delta x} \cr &= \frac{2x_1\Delta x + \Delta x^2}{\Delta x} \cr &= 2x_1 + \Delta x \end{aligned}

Dit geeft al een eerste idee van de richting waarin de kwadratische functie daalt. We kunnen een preciezere richting krijgen door het interval kleiner en kleiner te maken. In het theoretisch kleinste interval (limΔx0\lim_{\Delta x\to 0}) spreken we niet meer van een snijlijn, maar een raak- of tangentlijn in een bepaald punt en niet meer van de richtingscoëfficient van die lijn, maar van de “afgeleide” van de functie in dat punt. Als we in het bovenstaande geval Δx\Delta x op 0 zetten, krijgen we:

limΔx0ΔyΔx=yx=2x\begin{aligned} \lim_{\Delta x\to 0} \frac{\Delta y}{\Delta x} &= \frac{\partial y}{\partial x} \cr &= 2x \end{aligned}

Afgeleide van de SSESSE met b=[b1]T\pmb{b} = [b_1]^T

Bij de SSESSE functie hebben we te maken met de som van MM kwadratische functies. Iedere individuele functie heeft de vorm:

f(yiyi^)=(yiyi^)2f(y_i - \hat{y_i}) = (y_i - \hat{y_i})^2

of

f(di)=di2f(d_i) = {d_i}^2

waarbij did_i het verschil is tussen een bepaalde model output yi^\hat{y_i} en de overeenkomstige target waarde yiy_i. We weten intussen dat de afgeleide hier 2di2d_i ofwel 2(yiyi^)2(y_i - \hat{y_i}) is.

Maar we hebben bij de SSESSE dus te maken met de som van alle verschillen tussen model outputs en target values in onze training data:

LSSE(f(x);y)=i=1M(yif(xi))2=i=1M(yiyi^)2=(y1y1^)2+(y2y2^)2++(ymym^)2=d12+d22++dm2\begin{aligned} \mathcal{L}_{SSE}(f(\pmb{x}); \pmb{y}) &= \sum_{i=1}^M(y_i-f(x_i))^2 \cr &= \sum_{i=1}^M(y_i-\hat{y_i})^2 \cr &= (y_1 - \hat{y_1})^2 + (y_2 - \hat{y_2})^2 + \ldots + (y_m - \hat{y_m})^2 \cr &= {d_1}^2 + {d_2}^2 + \ldots + {d_m}^2 \end{aligned}

De som-regel

De som-regel houdt in dat voor iedere functie gg en hh, de afgeleide van hun som g+hg + h gelijk is aan de som van de individuele afgeleides gg' en hh':

als

f=g+hf = g + h

dan

f=g+hf' = g' + h'

We krijgen dus

LSSE(f(x);y)=2d1+2d2++2dm\mathcal{L}_{SSE}(f(\pmb{x}); \pmb{y})' = 2d_1 + 2d_2 + \ldots + 2d_m

In het geval van een model met enkel een intercept (b=[b1]T\pmb{b} = [b_1]^T) krijgen we:

LSSE(f(x);y)=LSSEb1=2i=1M(yib1)\mathcal{L}_{SSE}(f(\pmb{x}); \pmb{y})' = \frac{\partial \mathcal{L}_{SSE}}{\partial b_1} = 2\sum_{i=1}^M(y_i-b_1)

Wanneer we de ideale waarde voor b1b_1 willen vinden, kunnen we deze afgeleide gelijk stellen aan 0 (\to horizontale tangentlijn):

0=2i=1M(yib1^)0=i=1M(yib1^)0=(i=1Myi)Mb1^Mb1^=i=1Myib1^=i=1MyiM\begin{align} 0 &= 2\sum_{i=1}^M(y_i-\hat{b_1}) \cr 0 &= \sum_{i=1}^M(y_i-\hat{b_1}) \cr 0 &= (\sum_{i=1}^My_i) - M\hat{b_1} \cr M\hat{b_1} &= \sum_{i=1}^My_i \cr \hat{b_1} &= \frac{\sum_{i=1}^My_i}{M} \end{align}

De beste estimate is met andere woorden gelijk aan het gemiddelde van alle trainingsdata yiy_i.

Gradiënt van de SSESSE met b=[b1,b2]T\pmb{b} = [b_1, b_2]^T

In het geval van b=[b1,b2]T\pmb{b} = [b_1, b_2]^T neemt de SSESSE de vorm aan van een oppervlakte (zoals reeds geïllustreerd bij de grid search en monte carlo sampling). We drukken de afgeleide dan ook uit in twee dimensies:

LSSE(f(x);y)=LSSE=[LSSEb1LSSEb2]\mathcal{L}_{SSE}(f(\pmb{x}); \pmb{y})' = \nabla{\mathcal{L}_{SSE}} = \begin{bmatrix} \frac{\partial \mathcal{L}_{SSE}}{\partial b_1} \cr \frac{\partial \mathcal{L}_{SSE}}{\partial b_2} \end{bmatrix}

De elementen LSSEb1\frac{\partial \mathcal{L}_{SSE}}{\partial b_1} en LSSEb2\frac{\partial \mathcal{L}_{SSE}}{\partial b_2} worden de partiële afgeleiden van de SSESSE functie genoemd. Samen vormen ze de gradiënt van de SSESSE functie LSSE\nabla{\mathcal{L}_{SSE}}. De gradiënt verbreedt met andere woorden het concept van de afgeleide naar het geval van meerdere onbekenden.

Om een ideale oplossing voor [b1,b2]T[b_1, b_2]^T te vinden, kunnen we dus de SSESSE gradiënt gelijk stellen aan 0\pmb{0}:

LSSE=0=[00]\nabla{\mathcal{L}_{SSE}} = \pmb{0} = \begin{bmatrix} 0 \cr 0 \end{bmatrix}

Daarvoor moeten we eerst de partiële afgeleiden uitwerken.

  1. De partiële afgeleide SSEb1\frac{\partial SSE}{\partial b_1} vertelt ons hoe de SSESSE verandert in functie van b1b_1, terwijl we b2b_2 constant houden.

LSSEb1=b1[i=1M(yiyi^)2]=b1[i=1M(yib1b2xi)2]\begin{aligned} \frac{\partial \mathcal{L}_{SSE}}{\partial b_1} &= \frac{\partial}{\partial b_1}\begin{bmatrix} \sum_{i=1}^M(y_i - \hat{y_i})^2 \end{bmatrix} \cr &= \frac{\partial}{\partial b_1}\begin{bmatrix} \sum_{i=1}^M(y_i - b_1 - b_2x_i)^2 \end{bmatrix} \end{aligned}

Gegeven de som-regel krijgen we

LSSEb1=i=1Mb1(yib1b2xi)2\begin{aligned} \frac{\partial \mathcal{L}_{SSE}}{\partial b_1} &= \sum_{i=1}^M\frac{\partial}{\partial b_1}(y_i - b_1 - b_2x_i)^2 \end{aligned}

De ketting-regel

We krijgen hier te maken met twee geneste functies:

h(b1,b2)=yib1b2xih(b_1, b_2) = y_i - b_1 - b_2x_i

en

g(h(b1,b2))=h(b1,b2)2=(yib1b2xi)2g(h(b_1, b_2)) = h(b_1, b_2)^2 = (y_i - b_1 - b_2x_i)^2

De ketting-regel houdt in dat bij geneste functies g(h(x))g(h(x)), de afgeleide naar xx het product is van de afgeleiden, beginnend bij de buitenste functie.

xg(h(x))=ghhx\frac{\partial}{\partial x}g(h(x)) = \frac{\partial g}{\partial h}\frac{\partial h}{\partial x}

Voor de afgeleide van de buitenste functie krijgen we (zie afgeleide van kwadratische functie):

gh=2(yib1b2xi)\frac{\partial g}{\partial h} = 2(y_i - b_1 - b_2x_i)

Voor de binnenste afgeleide kunnen we de functie yib1b2xiy_i - b_1 - b_2x_i eerst vereenvoudigen naar cb1c - b_1. Dit is mogelijk omdat yiy_i en xix_i gekend zijn en we b2b_2 in deze partiële afgeleide als constant beschouwen. We kunnen de termen yib2xiy_i - b_2x_i voorstellen als een gegeven constante cc. Zo krijgen we

hx=b1(cb1)=1\begin{align} \frac{\partial h}{\partial x} &= \frac{\partial}{\partial b_1}(c - b_1) \cr &= -1 \end{align}

Als we cb1c - b_1 geometrisch voorstellen krijgen we namelijk een rechte met -1 als richtingscoëfficiënt (dus de afgeleide is ook -1):

Source
import matplotlib.pyplot as plt
import numpy as np
Source
b1 = np.arange(0, 10, 0.1)
c = 5
h_b1 = -b1 + c

fig, ax = plt.subplots(figsize=(6, 4))

ax.plot(b1, h_b1, "r--", linewidth=2, label=f"h(b1) = -b1 + {c}")

# Add grid for better readability
ax.grid(True, alpha=0.3)

# Set labels and title
ax.set_xlabel("b1", fontsize=12)
ax.set_ylabel("h(b1)", fontsize=12)

# Add legend
ax.legend(fontsize=12)

# Add annotations to highlight key features
ax.annotate(
    f"y-intercept: {c}",
    xy=(0, c),
    xytext=(2, c),
    arrowprops={"arrowstyle": "->", "color": "blue"},
    fontsize=10,
    color="blue",
)

ax.annotate(
    "Slope = -1",
    xy=(5, 0),
    xytext=(6.5, 1.5),
    arrowprops={"arrowstyle": "->", "color": "green"},
    fontsize=10,
    color="green",
)

plt.tight_layout()
plt.show()
<Figure size 600x400 with 1 Axes>

Als we de ketting regel (dus het product van gh\frac{\partial g}{\partial h} en hx\frac{\partial h}{\partial x}) volledig toepassen krijgen we:

LSSEb1=i=1M2(yib1b2xi)(1)=i=1M2(yib1b2xi)=2i=1M(yib1b2xi)\begin{aligned} \frac{\partial \mathcal{L}_{SSE}}{\partial b_1} &= \sum_{i=1}^M2(y_i - b_1 - b_2x_i)(-1) \cr &= \sum_{i=1}^M-2(y_i - b_1 - b_2x_i) \cr &= -2\sum_{i=1}^M(y_i - b_1 - b_2x_i) \end{aligned}
  1. De partiële afgeleide LSSEb2\frac{\partial \mathcal{L}_{SSE}}{\partial b_2} vertelt ons hoe de SSESSE verandert in functie van b2b_2, terwijl we b1b_1 constant houden.

LSSEb2=i=1Mb2(yib1b2xi)2\begin{aligned} \frac{\partial \mathcal{L}_{SSE}}{\partial b_2} &= \sum_{i=1}^M\frac{\partial}{\partial b_2}(y_i - b_1 - b_2x_i)^2 \end{aligned}

Gezien de ketting-regel krijgen we hier:

LSSEb2=i=1M2(yib1b2xi)(xi)=2i=1M(yib1b2xi)xi\begin{aligned} \frac{\partial \mathcal{L}_{SSE}}{\partial b_2} &= \sum_{i=1}^M2(y_i - b_1 - b_2x_i)(-x_i) \cr &= -2\sum_{i=1}^M(y_i - b_1 - b_2x_i)x_i \end{aligned}

De term (xi)(-x_i) komt nu van de afgeleide van yib1b2xiy_i - b_1 - b_2x_i naar b2b_2. Aangezien we bij deze partiële afgeleide b1b_1 als gegeven beschouwen (en yiy_i en xix_i ook gegeven zijn), kunnen we de binnenste functie herschrijven als h(b2)=cxib2h(b_2) = c - x_ib_2. Geometrisch komt dit overeen met een rechte met slope xi-x_i.

Source
b2 = np.arange(0, 10, 0.1)
c = 5
xi = 10
h_b2 = c + -xi * b1

fig, ax = plt.subplots(figsize=(6, 4))

ax.plot(b1, h_b1, "r--", linewidth=2, label=f"h(b2) = {c} - xi*b2")

# Add grid for better readability
ax.grid(True, alpha=0.3)

# Set labels and title
ax.set_xlabel("b2", fontsize=12)
ax.set_ylabel("h(b2)", fontsize=12)

# Add legend
ax.legend(fontsize=12)

# Add annotations to highlight key features
ax.annotate(
    f"y-intercept: {c}",
    xy=(0, c),
    xytext=(2, c),
    arrowprops={"arrowstyle": "->", "color": "blue"},
    fontsize=10,
    color="blue",
)

ax.annotate(
    "Slope = -xi",
    xy=(5, 0),
    xytext=(6.5, 1.5),
    arrowprops={"arrowstyle": "->", "color": "green"},
    fontsize=10,
    color="green",
)

plt.tight_layout()
plt.show()
<Figure size 600x400 with 1 Axes>

Uiteindelijk krijgen we dus:

LSSE=[2i=1M(yib1b2xi)2i=1M(yib1b2xi)xi]\nabla{\mathcal{L}_{SSE}} = \begin{bmatrix} -2\sum_{i=1}^M(y_i - b_1 - b_2x_i) \cr -2\sum_{i=1}^M(y_i - b_1 - b_2x_i)x_i \end{bmatrix}

en zoeken we de oplossing voor de waarden b1b_1 en b2b_2 waarbij de helling in het SSE oppervlak 0\pmb{0} is:

[00]=[2i=1M(yib1^b2^xi)2i=1M(yib1^b2^xi)xi]\begin{bmatrix} 0 \cr 0 \end{bmatrix} = \begin{bmatrix} -2\sum_{i=1}^M(y_i - \hat{b_1} - \hat{b_2}x_i) \cr -2\sum_{i=1}^M(y_i - \hat{b_1} - \hat{b_2}x_i)x_i \end{bmatrix}

Gradiënt van de SSESSE met b=[b1,b2,...]T\pmb{b} = [b_1, b_2, ...]^T

In het algemene geval van een SSESSE met NN lineaire predictoren hebben we te maken met een NN-dimensioneel SSESSE hypersurface. Voor de gradiënt krijgen we:

LSSE=[2i=1M(yij=1Nxijbj)(xi,1)2i=1M(yij=1Nxijbj)(xi,2)2i=1M(yij=1Nxijbj)(xi,n)]\nabla{\mathcal{L}_{SSE}} = \begin{bmatrix} -2\sum_{i=1}^M(y_i - \sum_{j=1}^Nx_{ij}b_j)(x_{i,1}) \cr -2\sum_{i=1}^M(y_i - \sum_{j=1}^Nx_{ij}b_j)(x_{i,2}) \cr \vdots \cr -2\sum_{i=1}^M(y_i - \sum_{j=1}^Nx_{ij}b_j)(x_{i,n}) \end{bmatrix}

en zoeken we een oplossing voor:

[000]=[2i=1M(yij=1Nxijbj^)(xi,1)2i=1M(yij=1Nxijbj^)(xi,2)2i=1M(yij=1Nxijbj^)(xi,n)]\begin{bmatrix} 0 \cr 0 \cr \vdots \cr 0 \end{bmatrix} = \begin{bmatrix} -2\sum_{i=1}^M(y_i - \sum_{j=1}^Nx_{ij}\hat{b_j})(x_{i,1}) \cr -2\sum_{i=1}^M(y_i - \sum_{j=1}^Nx_{ij}\hat{b_j})(x_{i,2}) \cr \vdots \cr -2\sum_{i=1}^M(y_i - \sum_{j=1}^Nx_{ij}\hat{b_j})(x_{i,n}) \end{bmatrix}

Als we dit herordenen krijgen we voor iedere bk^\hat{b_k} in de vector van partiële afgeleiden, de volgende vergelijking:

i=1Mj=1Nxikxijbj^=i=1Mxikyi\sum_{i=1}^M\sum_{j=1}^Nx_{ik}x_{ij}\hat{b_j} = \sum_{i=1}^Mx_{ik}y_i

met

k=1,2,,nk = 1, 2, \ldots, n

Deze vergelijkingen worden de normal equations genoemd en kunnen als volgt in compacte matrixvorm geschreven worden:

(XTX)b^=XTy(\pmb{X}^T\pmb{X})\hat{\pmb{b}} = \pmb{X}^T\pmb{y}

De oplossing voor b^\hat{\pmb{b}} wordt dan:

b^=(XTX)1XTy\hat{\pmb{b}} = (\pmb{X}^T\pmb{X})^{-1}\pmb{X}^T\pmb{y}