⚡ ReLU Lab – Brána relevance

OpenTechLab Jablonec nad Nisou · Science Micro Elementary School

ReLU není „jen funkce“. Je to mechanismus vypínání: část informací dál neprojde a tím vzniká struktura. Táhni bod ve vstupním prostoru a sleduj, jak nelinearita mění geometrii sítě.

🔗 Malá zastávka u funkce ReLU

Nelinearita

Perceptron / sigmoid: „něco vážím a vyhladím“

ReLU: rozhoduji, co vůbec smí existovat dál

To není jen aktivace, to je brána relevance.
„Tento rys je přítomen. Tento ne.“

ReLU

Zavádí nelinearitu. Umožňuje síti "vypínat" nerelevantní části a skládat složité tvary.

Bez ReLU není latentní prostor „ostrý“.

Deep Learning

Skládání mnoha ReLU vrstev za sebe. Vznikají komplexní hierarchie (od hran po tváře).

Vstupní prostor & aktivace
Před aktivací (z)
0.00
Po aktivaci (a)
0.00
Aktivní neurony
Táhni bod (●) v ploše. Barva pozadí je výstup sítě v daném místě. Hranice ukazuje, kde je neuron právě na prahu (a začne „svítit“).
z = w₁x + w₂y + b a = ?
Režim: Jeden neuron • Aktivace: ReLU
vyšší výstup nižší výstup neaktivní (ReLU = 0)

🧠 Proč je ReLU tak důležité?

ReLU (Rectified Linear Unit) je zdánlivě banální funkce: max(0, x). Přesto způsobila revoluci v Deep Learningu. Proč?

⚡ Sparsita (Řídkost)

V mozku nikdy „nesvítí“ všechny neurony naráz. ReLU to napodobuje – vypíná vše pod nulou. Tím vzniká efektivní a robustní reprezentace.

📐 Nelinearita po částech

Každý neuron rozděluje prostor rovnou čárou. Když jich složíme hodně, můžeme vytvořit libovolně složitý tvar (jako origami z papíru).

🚀 Gradient Flow

Na rozdíl od sigmoid/tanh se ReLU „nesytí“ v kladných hodnotách. Gradient může téct skrz hlubokou síť bez mizení (Vanishing Gradient Problem).

📐 Matematika & Intuice pod kapotou

📜 Vzorec

f(x) = max(0, x)

Je to prosté. Pokud je vstup záporný, vrátíme nulu. Pokud je kladný, vrátíme ho beze změny.

Derivace: 0 pro x < 0, 1 pro x> 0. To je klíčové pro rychlý trénink (žádné složité exponenciály).

🧠 Proč to funguje?

  • Řeší Vanishing Gradient: Na rozdíl od Sigmoid, kde se gradient zmenšuje k nule, u ReLU je gradient v aktivní části stále 1. Hluboké sítě se tak učí rychleji.
  • Výpočetně levné: Porovnání `if (x > 0)` je pro procesor mnohem rychlejší než počítat `e^x`.

⚠️ Dying ReLU Problem

Pokud se váhy nastaví tak, že vstup neuronu je vždy záporný při všech datech, neuron "umře".

Gradient je 0 → váhy se neaktualizují → neuron už se nikdy neprobere. Řešení: Leaky ReLU (malý sklon v záporu) nebo opatrná inicializace.

⏱️ Algoritmus nasazení: Kde přesně ReLU leží?

Abychom předešli zmatkům: ReLU je aktivační funkce. Aplikuje se vždy až po sečtení všech vstupů. Představme si to jako výrobní linku jednoho neuronu:

KROK 1
Vstupy
(x₁, x₂, ...)
KROK 2: Linearita
Součet (Σ)
z = w·x + b
KROK 3: ReLU (Zde!)
Aktivace
a = max(0, z)
KROK 4
Výstup
Vstup další vrstvy

Poznámka: Často se říká "neuron spočítá vážený součet". To je pravda, ale to je jen "před-aktivace". Teprve ReLU rozhodne, zda tento součet pustí dál (aktivace), nebo ho zahodí (nula).

🛠️ Praktické Využití

ReLU je dnes výchozí volba pro skryté vrstvy v: Konvolučních sítích (CNN) pro zpracování obrazu, Transformerech (LLM) (často ve variantě GeLU/SwiGLU) pro zpracování textu, i v klasických MLP.

💻 Implementační průvodce (JavaScript / Structure)

Ukázka struktury jednoduché neuronové sítě s ReLU aktivací ve skryté vrstvě.

class NeuralNetwork {
    constructor(inputSize, hiddenSize, outputSize) {
        this.inputSize = inputSize;
        this.hiddenSize = hiddenSize;
        this.outputSize = outputSize;
        
        // Inicializace vah: +1 pro bias v každé vrstvě
        // Pro ReLU je vhodné použít He Initialization (zde zjednodušeno)
        this.weightsIH = this.randomMatrix(inputSize + 1, hiddenSize, 0.5);
        this.weightsHO = this.randomMatrix(hiddenSize + 1, outputSize, 0.5);
    }
    
    randomMatrix(rows, cols, range) {
        return Array.from({ length: rows }, () =>
            Array.from({ length: cols }, () => 
                (Math.random() - 0.5) * 2 * range
            )
        );
    }
    
    // Klíčová část: ReLU
    relu(x) { return Math.max(0, x); }
    
    // Derivace pro trénink (zpětný průchod)
    reluDerivative(x) { return x > 0 ? 1 : 0; }
    
    forward(inputs) {
        // ... matrix multiplication & activation ...
    }
}
Tip: Zatímco pro sigmoid používáme inicializaci Xavier (Glorot), pro ReLU je kritická initializace He, která bere v úvahu, že polovina neuronů bude zpočátku neaktivní (nulová).