Nov C: En neuron med LeakyReLU aktivering

LeakyReLU-neuron: forward pass, gradient, reverse-mode autodiff og tilfældig initialisering i PyTorch.

LeakyReLU er en ofte brugt aktiveringsfunktion i neurale netværk:

$$\mathrm{LeakyReLU}(z)=\begin{cases} z & z\geq 0 \\ \alpha\cdot z & z<0 \end{cases}$$

hvor $\alpha$ er et lille positivt tal. (Se PDF for grafen ved $\alpha=0.1$.)

En neuron med tre input og LeakyReLU-aktivering:

$$f(x_1,x_2,x_3)=\mathrm{LeakyReLU}(w_0+w_1 x_1+w_2 x_2+w_3 x_3)$$

I de følgende to spørgsmål antager vi $\alpha=0.1$, input $x_1=1$, $x_2=2$, $x_3=3$, og vægte $w_0=-10$, $w_1=w_2=w_3=1$.

Spørgsmål C.1

Beregn neuronens output $f$.

Vis svar Skjul svar
Svar C.1
$$f=\mathrm{LeakyReLU}(-10+1\cdot 1+1\cdot 2+1\cdot 3)=\mathrm{LeakyReLU}(-4)=0.1\cdot(-4)=-0.4$$

$-0.4$

Spørgsmål C.2

Beregn gradienten af funktionen $f$ med hensyn til modellens parametre.

Vis svar Skjul svar
Svar C.2
$$\nabla f=\left[\frac{\partial f}{\partial w_0},\,\frac{\partial f}{\partial w_1},\,\frac{\partial f}{\partial w_2},\,\frac{\partial f}{\partial w_3}\right]^\top$$

Med $z=\sum_{i=0}^{3} w_i x_i$ (hvor $x_0=1$) og $z<0$ er $\partial\mathrm{LeakyReLU}(z)/\partial z=0.1$, så

$$\frac{\partial f}{\partial w_i}=0.1\cdot x_i$$
$$\nabla f=[0.1\cdot 1,\,0.1\cdot 1,\,0.1\cdot 2,\,0.1\cdot 3]^\top=[0.1,\,0.1,\,0.2,\,0.3]^\top$$

$[0.1,\,0.1,\,0.2,\,0.3]^\top$

I PyTorch kan gradienten findes således:

linear = torch.nn.Linear(3, 1)
activation = torch.nn.LeakyReLU(0.1)
net = torch.nn.Sequential(linear, activation)
x = torch.tensor([1., 2., 3.])
f = net(x)
f.backward()

net indeholder et lineært lag og LeakyReLU. Det lineære lags bias og weight svarer til $[w_0]$ og $[w_1,w_2,w_3]$.

Spørgsmål C.3

Beskriv hvad der foregår, når funktionen f.backward() kaldes i koden ovenfor. Hvad beregnes og hvordan?

Vis svar Skjul svar
Svar C.3

Når f.backward() kaldes, udføres reverse mode automatic differentiation på den beregningsgraf der underligger variabelen $f$. Herved beregnes gradienten af $f$ med hensyn til alle modelparametre.

Reverse-mode AD → gradient mht. alle parametre

Spørgsmål C.4

Hvis vi kører ovenstående kode og undersøger linear.bias.grad og linear.weight.grad, så vil de ikke nødvendigvis svare overens med gradienten fra C.2. Hvorfor ikke, og hvilke resultater er mulige?

Vis svar Skjul svar
Svar C.4

Når koden køres, initialiseres parametrene $w_0,\ldots,w_3$ med tilfældige værdier (PyTorch-default), så det er ukendt om $z$ er positiv eller negativ.

  • Hvis $z<0$: $\nabla f=[0.1,\,0.1,\,0.2,\,0.3]^\top$ (som i C.2).
  • Hvis $z\geq 0$: $\partial\mathrm{LeakyReLU}/\partial z=1$, så $\nabla f=[1,\,1,\,2,\,3]^\top$.

Disse er de to eneste muligheder.

$[0.1,0.1,0.2,0.3]^\top$ eller $[1,1,2,3]^\top$