B: Model af en svingning

Sinus-fase, kvadratisk loss, gradient og PyTorch gradient-nedstigning.

Et elektrisk kredsløb, som varierer ved en sinus-svingning, kan beskrives med

$$\hat{y}(t)=\sin(2\pi t+\theta)$$

hvor $\hat{y}$ er modellen af det målte signal, $t$ er tiden, og $\theta$ er en ukendt parameter (fasen). Måledata:

$t$01
$y$0.80.9

Kvadratisk fejl som loss:

$$L(\theta)=\sum_{i=1}^{2}\big(y_i-\hat{y}(t_i)\big)^2$$
Spørgsmål B.1

Falder denne model inden for det vi kalder “lineær regression”? Beskriv hvorfor / hvorfor ikke.

Vis svar Skjul svar
Svar B.1

Her er tale om en regressionsmodel, men det er ikke lineær regression, da funktionen ikke er lineær i parameteren $\theta$.

Nej — ikke lineær regression (ikke lineær i θ).

Spørgsmål B.2

Beregn loss-funktionens værdi for $\theta=0$.

Vis svar Skjul svar
Svar B.2
$$L(0)=(0.8-\sin(0))^2+(0.9-\sin(2\pi))^2=0.8^2+0.9^2=0.64+0.81=1.45$$

1.45

Spørgsmål B.3

Beregn gradienten af loss-funktionen for $\theta=0$.

Vis svar Skjul svar
Svar B.3
$$\frac{dL}{d\theta}=-2\sum_{i=1}^{2}(y_i-\hat{y}_i)\cdot\cos(2\pi t_i+\theta)$$
$$\left.\frac{dL}{d\theta}\right|_{\theta=0}=-2\cdot(0.8+0.9)=-3.4$$

−3.4

Spørgsmål B.4

Hvad skal der stå på spørgsmålstegnets plads i PyTorch-koden?

t, y = torch.tensor([0., 1.]), torch.tensor([0.8, 0.9])
theta = torch.tensor([0.], requires_grad=True)
lr = 0.1
for step in range(100):
    loss = torch.sum((y - torch.sin(2*torch.pi*t + theta))**2)
    loss.backward()
    with torch.no_grad():
        theta -= ?   # Gradient descent update
        theta.grad.zero_()
Vis svar Skjul svar
Svar B.4

Gradient-opdateringen mangler: gradienten ganges med learning rate.

lr * theta.grad