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 de vorige notebook leerden we tensors aanmaken en inspecteren. Nu kijken we naar:

  1. Operaties op tensors — grotendeels identiek aan NumPy

  2. Device management — tensors verplaatsen naar GPU

  3. Autograd — automatisch differentiëren, de kern van deep learning

2.12.0+cu130

Element-gewijs operaties

Alle basis wiskundige operaties werken element-gewijs, net als in NumPy.

tensor([ 6.,  8., 10., 12.])
tensor([ 5., 12., 21., 32.])
tensor([ 1.,  4.,  9., 16.])
tensor([1.0000, 1.4142, 1.7321, 2.0000])
sum:    21.0
mean:   3.5
max:    6.0

sum per column (dim=0): tensor([5., 7., 9.])
sum per row    (dim=1): tensor([ 6., 15.])

Matrixoperaties

Voor matrix-vermenigvuldiging gebruik je @ of torch.matmul — identiek aan NumPy.

tensor([[19., 22.],
        [43., 50.]])

tensor([[ 5., 12.],
        [21., 32.]])
tensor(32.)

Broadcasting

PyTorch volgt dezelfde broadcasting-regels als NumPy: shapes worden van rechts uitgelijnd en dimensies van grootte 1 worden automatisch uitgebreid.

tensor([[5., 5., 5., 5.],
        [5., 5., 5., 5.],
        [5., 5., 5., 5.]])
tensor([[1., 2., 3.],
        [1., 2., 3.],
        [1., 2., 3.],
        [1., 2., 3.]])

In-place operaties

PyTorch-functies met een underscore-suffix (_) voeren de operatie in-place uit — ze wijzigen de tensor direct, zonder een nieuwe te alloceren.

tensor([11., 12., 13.])
tensor([22., 24., 26.])

In-place operaties zijn geheugenefficiënt maar kunnen problemen geven met autograd (zie verder). Gebruik ze voorzichtig.

Device management

PyTorch tensors leven op een device: cpu (standaard) of cuda (GPU). Bereken je iets op GPU, dan moeten alle tensors op hetzelfde device staan.

Selected device: cpu
cpu
cpu
<class 'numpy.ndarray'>

Autograd — automatisch differentiëren

Het verschil dat PyTorch uniek maakt ten opzichte van NumPy: autograd. PyTorch houdt bij hoe tensors berekend zijn (de computational graph) en kan automatisch de afgeleiden (gradiënten) berekenen.

Dit is de basis van backpropagation: het algoritme waarmee neurale netwerken leren.

Wat is een afgeleide?

De afgeleide van een functie f(x)f(x) meet hoe snel de functie-output verandert als je de input een klein beetje aanpast. Geometrisch is het de helling van de raaklijn aan de curve op dat punt.

f′(x)=dfdx=lim⁡Δx→0f(x+Δx)−f(x)Δxf'(x) = \frac{df}{dx} = \lim_{\Delta x \to 0} \frac{f(x + \Delta x) - f(x)}{\Delta x}

Voorbeeld: voor f(x)=x2f(x) = x^2 geldt f′(x)=2xf'(x) = 2x.

  • Bij x=3x = 3: de afgeleide is 2⋅3=62 \cdot 3 = 6 — een toename van xx met 1 geeft een toename van ff met ongeveer 6.

  • Bij x=0x = 0: de afgeleide is 0 — de curve is plat op dat punt.

In ML gebruik je afgeleiden om te bepalen in welke richting je de parameters van een model moet aanpassen om de fout te verkleinen.

De volledige wiskundige behandeling — limieten, afgeleidregels, partiële afgeleiden en gradiënten — komt aan bod in de cursus Mathematical Foundations.

requires_grad=True

Je vertelt PyTorch om gradiënten bij te houden door requires_grad=True in te stellen.

y = tensor(9., grad_fn=<PowBackward0>)
dy/dx at x=3: tensor(6.)
dz/dx at x=2: 14.0

torch.no_grad()

Soms wil je berekeningen doen zonder de computational graph op te bouwen — bv. bij inferentie (voorspellingen maken) of evaluatie. Gebruik dan de torch.no_grad()-contextmanager. Dit bespaart geheugen en is sneller.

y: tensor(9.)
y.requires_grad: False

.detach()

.detach() geeft een nieuwe tensor terug die los staat van de computational graph. Handig als je een tussenresultaat wil omzetten naar NumPy.

9.0

Samenvatting autograd

ConceptWat het doet
requires_grad=TrueVertelt PyTorch: houd de computational graph bij voor deze tensor
.backward()Berekent de gradiënten terug door de graph (backpropagation)
.gradBevat de berekende gradiënt na .backward()
torch.no_grad()Context waar geen graph wordt bijgehouden (sneller, minder geheugen)
.detach()Geeft tensor terug losgemaakt van de graph

In de volgende cursussen (matematische grondslagen en ML principes) zul je autograd in context zien — bij het trainen van neurale netwerken is dit het mechanisme achter het leerproces.


Oefeningen

Oefening 1 — Maak twee tensors a = torch.tensor([[1., 2.], [3., 4.]]) en b = torch.tensor([[5., 6.], [7., 8.]]). Bereken:

  • Element-gewijs product

  • Matrixproduct (@)

  • Som van alle elementen in het matrixproduct

Oefening 2 — Demonstreer broadcasting: maak een matrix van vorm (5, 3) gevuld met nullen. Trek er een rij-vector bias = torch.tensor([0.1, 0.2, 0.3]) bij op. Druk het resultaat af en verifieer dat elke rij [0.1, 0.2, 0.3] is.

Oefening 3 — Verplaats een tensor naar het beschikbare device (cuda of cpu) en doe een matrixvermenigvuldiging op dat device. Zorg dat beide tensors op hetzelfde device staan.

Oefening 4 — Bereken de afgeleide van f(x)=x3−2x2+xf(x) = x^3 - 2x^2 + x bij x=1x = 1. Controleer analytisch: f′(x)=3x2−4x+1f'(x) = 3x^2 - 4x + 1, dus f′(1)=0f'(1) = 0. Klopt PyTorch’s uitkomst?

Oefening 5 — Maak een tensor x = torch.tensor([1.0, 2.0, 3.0], requires_grad=True) en bereken y = (x * 2).sum(). Roep .backward() aan. Wat zijn de gradiënten in x.grad? Leg uit waarom. Probeer daarna x.numpy() rechtstreeks aan te roepen en vang de fout op — gebruik vervolgens .detach().numpy().