muszaki_informatika:neuralis_halok_alapjai
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| muszaki_informatika:neuralis_halok_alapjai [2024/12/05 10:59] – [A súlyok módosítása a hiba függvényében] knehez | muszaki_informatika:neuralis_halok_alapjai [2025/03/13 22:57] (current) – knehez | ||
|---|---|---|---|
| Line 15: | Line 15: | ||
| A hálózat bemeneti réteggel indul, amely a zöld színű **x₁** és **x₂** elemeket tartalmazza. Ezek a bemeneti változók képviselik azokat az adatokat, amelyeket a modell feldolgoz. A bemeneteket súlyokkal szorozzák, majd átadják a rejtett rétegek neuronjaiba, | A hálózat bemeneti réteggel indul, amely a zöld színű **x₁** és **x₂** elemeket tartalmazza. Ezek a bemeneti változók képviselik azokat az adatokat, amelyeket a modell feldolgoz. A bemeneteket súlyokkal szorozzák, majd átadják a rejtett rétegek neuronjaiba, | ||
| - | A //rejtett réteg(ek)ben// | + | A //rejtett réteg(ek)ben// |
| Az **y_pred** a modell végső előrejelzése, | Az **y_pred** a modell végső előrejelzése, | ||
| Line 28: | Line 28: | ||
| {{: | {{: | ||
| + | |||
| + | ==== Neurális háló, mint osztályozó - Generatív hálók ==== | ||
| + | |||
| + | Az alábbi link a számok felismerését teszi láthatóvá: | ||
| + | |||
| + | Az alábbi linken bemutatjuk, hogyan működik az osztályozás? | ||
| + | |||
| + | http:// | ||
| + | |||
| + | Interaktív neurális háló szimulátor: | ||
| + | |||
| ==== Modell paramétereinek kiszámítása ==== | ==== Modell paramétereinek kiszámítása ==== | ||
| Line 45: | Line 56: | ||
| $$ z_3 = z_1 \cdot w_{31} + z_2 \cdot w_{32} $$ | $$ z_3 = z_1 \cdot w_{31} + z_2 \cdot w_{32} $$ | ||
| - | Egyben ez lesz a háló előrejelzése \(y_{\text{pred}}\). | + | Egyben ez lesz a háló előrejelzése \(y_{\text{pred}}\). Ezt a fenti műveletet //forward pass//-nak nevezzük. |
| ==== Mátrixok alkalmazása háló modellekben ==== | ==== Mátrixok alkalmazása háló modellekben ==== | ||
| - | A fenti képleteket mátrixos és vektoros formában is felírhatjuk: | + | Az egységesítés és a könnyebb kezelhetőség miatt, a fenti képleteket mátrixos és vektoros formában is felírhatjuk: |
| Rejtett réteg súlymátrixa: | Rejtett réteg súlymátrixa: | ||
| Line 111: | Line 122: | ||
| $$ y_{\text{pred}} = W_2 \cdot W_1 \cdot \mathbf{x} $$ | $$ y_{\text{pred}} = W_2 \cdot W_1 \cdot \mathbf{x} $$ | ||
| - | ==== Példa konkrét számértékekkel ==== | + | ==== Példa konkrét számértékekkel |
| Tegyük fel hogy: | Tegyük fel hogy: | ||
| Line 180: | Line 191: | ||
| === Loss Deriváltja a Kimeneti Réteg Súlyaira === | === Loss Deriváltja a Kimeneti Réteg Súlyaira === | ||
| - | A // | + | A // |
| $$ \frac{\partial \text{Loss}}{\partial w_{31}} = \frac{\partial \text{Loss}}{\partial y_{\text{pred}}} \cdot \frac{\partial y_{\text{pred}}}{\partial w_{31}} $$ | $$ \frac{\partial \text{Loss}}{\partial w_{31}} = \frac{\partial \text{Loss}}{\partial y_{\text{pred}}} \cdot \frac{\partial y_{\text{pred}}}{\partial w_{31}} $$ | ||
| + | $$ \frac{\partial \text{Loss}}{\partial w_{32}} = \frac{\partial \text{Loss}}{\partial y_{\text{pred}}} \cdot \frac{\partial y_{\text{pred}}}{\partial w_{32}} $$ | ||
| + | A fenti két derivált kifejezi, hogy a két súly mennyire van hatással a hibára. | ||
| + | |||
| + | ---- | ||
| **1.**) Első tényező: \( \frac{\partial \text{Loss}}{\partial y_{\text{pred}}} \) a Loss függvény deriváltja a \(y_{pred}\)-re: | **1.**) Első tényező: \( \frac{\partial \text{Loss}}{\partial y_{\text{pred}}} \) a Loss függvény deriváltja a \(y_{pred}\)-re: | ||
| Line 190: | Line 205: | ||
| ahol \( e = y - y_{\text{pred}} \) a hiba. | ahol \( e = y - y_{\text{pred}} \) a hiba. | ||
| + | ---- | ||
| **2.**) Második tényező: \( \frac{\partial y_{\text{pred}}}{\partial w_{31}} \) | **2.**) Második tényező: \( \frac{\partial y_{\text{pred}}}{\partial w_{31}} \) | ||
| Line 208: | Line 224: | ||
| hasonlóan: | hasonlóan: | ||
| - | $$ \frac{\partial \text{Loss}}{\partial w_{32}} $$ | + | $$ \frac{\partial \text{Loss}}{\partial w_{32}} |
| + | ---- | ||
| **3.**) Gradiens a kimeneti súlyokra \(W_2\) | **3.**) Gradiens a kimeneti súlyokra \(W_2\) | ||
| Line 224: | Line 241: | ||
| z_2 \cdot e | z_2 \cdot e | ||
| \end{bmatrix}$$ | \end{bmatrix}$$ | ||
| + | |||
| + | A kimeneti réteg hibáját \(e\) visszaterjesztjük a rejtett réteg neuronjaira (\(h_1, h_2\)): | ||
| + | |||
| + | $$ \delta_{\text{hidden}} = | ||
| + | \begin{bmatrix} | ||
| + | e \cdot w_{31} \\ | ||
| + | e \cdot w_{32} | ||
| + | \end{bmatrix}$$ | ||
| + | |||
| + | Ez a rejtett réteg hibája. | ||
| + | |||
| + | A bemeneti réteg és a rejtett réteg közötti súlyok gradiensét a bemenetek \(x\) és a rejtett réteg hibájának (\(\delta_{\text{hidden}}\)) szorzata adja: | ||
| + | |||
| + | $$ \Delta W_1 = | ||
| + | \begin{bmatrix} | ||
| + | x_1 \cdot \delta_{z_1} & x_1 \cdot \delta_{z_2} \\ | ||
| + | x_2 \cdot \delta_{z_1} & x_2 \cdot \delta_{z_2} | ||
| + | \end{bmatrix}$$ | ||
| + | |||
| + | ahol: \( \delta_{z_1} = e \cdot w_{31}, \quad \delta_{z_2} = e \cdot w_{32} \) | ||
| + | |||
| + | ---- | ||
| + | |||
| + | A súlyok frissítését a gradiensek \(\Delta W_1, \Delta W_2\) és a tanulási ráta \(\eta\) segítségével frissítjük: | ||
| + | |||
| + | $$ W_1 = W_1 - \eta \cdot \Delta W_1 $$ | ||
| + | $$ W_2 = W_2 - \eta \cdot \Delta W_2 $$ | ||
| + | |||
| + | A teljes eljárás c implementációja: | ||
| + | |||
| + | <sxh c> | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | |||
| + | // Adatok (bemenetek és várt kimenetek) | ||
| + | #define INPUT_NODES 2 | ||
| + | #define HIDDEN_NODES 2 | ||
| + | #define OUTPUT_NODES 1 | ||
| + | #define SAMPLES 3 | ||
| + | #define EPOCHS 1000 | ||
| + | #define LEARNING_RATE 0.01 | ||
| + | |||
| + | // Adatok és súlyok inicializálása | ||
| + | double inputs[SAMPLES][INPUT_NODES] = { | ||
| + | {0.3, 0.1}, | ||
| + | {0.8, 0.6}, | ||
| + | {0.5, 0.5} | ||
| + | }; | ||
| + | double expected_outputs[SAMPLES][OUTPUT_NODES] = { | ||
| + | {0.2}, | ||
| + | {0.7}, | ||
| + | {0.5} | ||
| + | }; | ||
| + | |||
| + | // Súlyok | ||
| + | double weights_input_to_hidden[INPUT_NODES][HIDDEN_NODES]; | ||
| + | double weights_hidden_to_output[HIDDEN_NODES][OUTPUT_NODES]; | ||
| + | |||
| + | // Véletlen szám generálása 0 és 1 között | ||
| + | double random_double() { | ||
| + | return (double)rand() / RAND_MAX; | ||
| + | } | ||
| + | |||
| + | // Forward pass függvény: Egyetlen minta alapján kiszámítja a kimenetet | ||
| + | void forward_pass(double *input, double *hidden_output, | ||
| + | double *weights_input_to_hidden, | ||
| + | // 1. Bemenet -> Rejtett réteg | ||
| + | for (int i = 0; i < HIDDEN_NODES; | ||
| + | hidden_output[i] = 0.0; | ||
| + | for (int j = 0; j < INPUT_NODES; | ||
| + | hidden_output[i] += input[j] * weights_input_to_hidden[j * HIDDEN_NODES + i]; | ||
| + | } | ||
| + | } | ||
| + | |||
| + | // 2. Rejtett réteg -> Kimeneti réteg | ||
| + | for (int i = 0; i < OUTPUT_NODES; | ||
| + | final_output[i] = 0.0; | ||
| + | for (int j = 0; j < HIDDEN_NODES; | ||
| + | final_output[i] += hidden_output[j] * weights_hidden_to_output[j * OUTPUT_NODES + i]; | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | |||
| + | // Súlyok frissítése | ||
| + | void update_weights(double *weights, double *gradients, int rows, int cols) { | ||
| + | for (int i = 0; i < rows; i++) { | ||
| + | for (int j = 0; j < cols; j++) { | ||
| + | weights[i * cols + j] += LEARNING_RATE * gradients[i * cols + j]; | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | |||
| + | int main() { | ||
| + | // Véletlenszerű súlyok inicializálása | ||
| + | for (int i = 0; i < INPUT_NODES; | ||
| + | for (int j = 0; j < HIDDEN_NODES; | ||
| + | weights_input_to_hidden[i][j] = random_double(); | ||
| + | } | ||
| + | } | ||
| + | for (int i = 0; i < HIDDEN_NODES; | ||
| + | for (int j = 0; j < OUTPUT_NODES; | ||
| + | weights_hidden_to_output[i][j] = random_double(); | ||
| + | } | ||
| + | } | ||
| + | |||
| + | double hidden_layer_output[HIDDEN_NODES]; | ||
| + | double output[OUTPUT_NODES]; | ||
| + | double error[OUTPUT_NODES]; | ||
| + | |||
| + | // Tanítási ciklus | ||
| + | for (int epoch = 0; epoch < EPOCHS; epoch++) { | ||
| + | double total_loss = 0.0; | ||
| + | |||
| + | for (int sample = 0; sample < SAMPLES; sample++) { | ||
| + | // 1. Forward pass egy mintára | ||
| + | forward_pass((double *)inputs[sample], | ||
| + | | ||
| + | |||
| + | // 2. Hibaszámítás | ||
| + | for (int i = 0; i < OUTPUT_NODES; | ||
| + | error[i] = expected_outputs[sample][i] - output[i]; | ||
| + | total_loss += error[i] * error[i]; | ||
| + | } | ||
| + | |||
| + | // 3. Visszaterjesztés (backpropagation) | ||
| + | double gradients_hidden_to_output[HIDDEN_NODES][OUTPUT_NODES] = {0}; | ||
| + | for (int i = 0; i < HIDDEN_NODES; | ||
| + | for (int j = 0; j < OUTPUT_NODES; | ||
| + | gradients_hidden_to_output[i][j] = hidden_layer_output[i] * error[j]; | ||
| + | } | ||
| + | } | ||
| + | |||
| + | double gradients_input_to_hidden[INPUT_NODES][HIDDEN_NODES] = {0}; | ||
| + | for (int i = 0; i < INPUT_NODES; | ||
| + | for (int j = 0; j < HIDDEN_NODES; | ||
| + | double back_error = 0.0; | ||
| + | for (int k = 0; k < OUTPUT_NODES; | ||
| + | back_error += error[k] * weights_hidden_to_output[j * OUTPUT_NODES + k]; | ||
| + | } | ||
| + | gradients_input_to_hidden[i][j] = inputs[sample][i] * back_error; | ||
| + | } | ||
| + | } | ||
| + | |||
| + | // 4. Súlyok frissítése | ||
| + | update_weights((double *)weights_hidden_to_output, | ||
| + | update_weights((double *)weights_input_to_hidden, | ||
| + | } | ||
| + | |||
| + | // Hiba kiírása minden epoch után | ||
| + | if (epoch % 100 == 0) { | ||
| + | printf(" | ||
| + | } | ||
| + | } | ||
| + | |||
| + | // Eredmények kiírása tanító adatokon | ||
| + | printf(" | ||
| + | for (int sample = 0; sample < SAMPLES; sample++) { | ||
| + | forward_pass((double *)inputs[sample], | ||
| + | | ||
| + | |||
| + | printf(" | ||
| + | | ||
| + | } | ||
| + | |||
| + | // Tesztelés új bemenetekkel | ||
| + | double test_inputs[3][INPUT_NODES] = { | ||
| + | {0.4, 0.6}, // Átlag: 0.5 | ||
| + | {0.2, 0.8}, // Átlag: 0.5 | ||
| + | {0.9, 0.1} // Átlag: 0.5 | ||
| + | }; | ||
| + | |||
| + | printf(" | ||
| + | for (int i = 0; i < 3; i++) { | ||
| + | forward_pass((double *)test_inputs[i], | ||
| + | | ||
| + | |||
| + | double expected = (test_inputs[i][0] + test_inputs[i][1]) / 2.0; // A bemenetek átlaga | ||
| + | printf(" | ||
| + | | ||
| + | } | ||
| + | |||
| + | return 0; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ===== Generatív nyelvi modellek ===== | ||
| + | |||
| + | A generatív nyelvi modellek az emberi nyelv megértésére és szöveg generálására irányuló kutatások központi elemei. Ezek a modellek arra képesek, hogy a bemenetként adott szöveg alapján értelmes és összefüggő szöveget állítsanak elő. Az alábbiakban bemutatjuk a generatív nyelvi modellek fejlődését, | ||
| + | |||
| + | === 1.) Hagyományos megközelítések (1950-2000-es évek) === | ||
| + | * **Statikus modellek**: A nyelv feldolgozásához egyszerű szabályalapú rendszereket (pl. grammatikai szabályok) használtak. | ||
| + | * **Markov-láncok**: | ||
| + | Hiányosságok: | ||
| + | |||
| + | === 2.) Neurális hálózatok alkalamazása (2010 körül) === | ||
| + | |||
| + | **Word Embeddingek**: | ||
| + | |||
| + | **Recurrent Neural Networks (RNNs)** Az RNN-ek a szekvenciális adatok feldolgozására készültek. Például egy szó vektora a korábbi szavak kontextusán alapult. | ||
| + | |||
| + | Hiányosságok: | ||
| + | |||
| + | === 3.) Attention Mechanizmus és Transformer (2017) === | ||
| + | |||
| + | **Attention Mechanizmus**: | ||
| + | |||
| + | **Transformer Architektúra (2017)**: Az „Attention is All You Need” című cikkben a Google kutatói bevezették a Transformer modellt. Kulcseleme az önfigyelem (self-attention), | ||
| + | |||
| + | Előnyök: Jobb skálázódás nagyobb adathalmazokon. Hatékony hosszú szövegek feldolgozása. | ||
| + | |||
| + | === 4. Generatív Pre-Trained Modellek (GPT család) === | ||
| + | |||
| + | **GPT-1 (2018)**: Az első modell, amely a Transformer architektúrát alkalmazta nagyméretű nyelvi korpuszokon. | ||
| + | |||
| + | **GPT-2 (2019)**: Nagyobb és erősebb modell, amely képes volt teljes cikkeket generálni emberi beavatkozás nélkül. | ||
| + | |||
| + | **GPT-3 (2022)**: Egy óriási ugrás: 175 milliárd paraméter. | ||
| + | |||
| + | **GPT-4 (2023)**: Még fejlettebb modell, több multimodális képességgel (pl. szöveg és kép feldolgozása). | ||
| + | |||
| + | Számlafeldolgozó minta bemutatása. | ||
| + | |||
| + | === Neurális hálózatok, | ||
| + | |||
| + | - Magyarázható-e a működése? | ||
| + | - Van-e itt intelligencia egyáltalán? | ||
| + | |||
| + | ===== Ellenőrző kérdések ===== | ||
| + | |||
| + | ** Mi a neurális hálózatok alapvető építőeleme? | ||
| + | |||
| + | A) Node | ||
| + | B) Neuron | ||
| + | C) Hurok | ||
| + | D) Adatbázis | ||
| + | | ||
| + | Megoldás: B | ||
| + | |||
| + | ---- | ||
| + | **Milyen műveleteket végez egy neuron alapvetően? | ||
| + | |||
| + | A) Csak adatot tárol | ||
| + | B) Memóriát kezel | ||
| + | C) Súlyozott összegzést és aktivációt végez | ||
| + | D) Csak véletlenszerű értékeket generál | ||
| + | | ||
| + | Megoldás: C | ||
| + | |||
| + | ---- | ||
| + | ** Mi a tipikus célja a neurális hálózatok tanításának? | ||
| + | |||
| + | A) A bemenet másolása a kimenetre változtatás nélkül | ||
| + | B) Az adatokban található mintázatok megtanulása és általánosítása | ||
| + | C) Minél több neuron használata | ||
| + | D) A memóriahasználat csökkentése | ||
| + | | ||
| + | Megoldás: B | ||
| + | |||
| + | ---- | ||
| + | ** Miért alkalmazunk aktivációs függvényeket a neurális hálózatokban? | ||
| + | |||
| + | A) Csak esztétikai okokból | ||
| + | B) Azért, hogy lineáris problémákat oldjunk meg | ||
| + | C) A hálózat nemlinearitásának biztosítására | ||
| + | D) A bemenet normalizálására | ||
| + | | ||
| + | Megoldás: C | ||
| + | |||
| + | ---- | ||
| + | **Mi az alábbiak közül egy közismert aktivációs függvény? | ||
| + | |||
| + | A) XOR | ||
| + | B) NAND | ||
| + | C) Sigmoid | ||
| + | D) AND | ||
| + | |||
| + | Megoldás: C | ||
| + | |||
| + | ---- | ||
| + | **Hogyan nevezzük azt a folyamatot, amikor a hibát visszafelé terjesztjük a hálózaton a tanítás során?** | ||
| + | |||
| + | A) Feedforward | ||
| + | B) Backpropagation | ||
| + | C) Regularizáció | ||
| + | D) Dropout | ||
| + | | ||
| + | Megoldás: B | ||
| + | |||
| + | ---- | ||
| + | ** Mi az " | ||
| + | |||
| + | A) Egyetlen neuron frissítése | ||
| + | B) Egy súlyfrissítés lépése | ||
| + | C) A teljes tanító adathalmaz egyszeri áthaladása | ||
| + | D) A tanítás sebessége | ||
| + | |||
| + | Megoldás: C | ||
| + | |||
| + | ---- | ||
| + | ** Mi a célja a tanulási rátának (learning rate)? ** | ||
| + | |||
| + | A) Meghatározza, | ||
| + | B) Meghatározza, | ||
| + | C) Megadja, hány neuron legyen egy rétegben | ||
| + | D) Meghatározza a tanítás során használt neuronok számát | ||
| + | |||
| + | Megoldás: B | ||
| + | |||
| + | ---- | ||
| + | ** Mi a " | ||
| + | |||
| + | A) A hálózat nem tanul eleget az adatokból | ||
| + | B) A hálózat túl általános megoldást ad | ||
| + | C) A hálózat túl jól illeszkedik a tanuló adathalmazra, | ||
| + | D) A hálózat nem tudja kezelni a bemeneteket | ||
| + | |||
| + | Megoldás: C | ||
| + | |||
| + | ---- | ||
| + | **Mi lehet egy jó módszer a túlillesztés csökkentésére? | ||
| + | |||
| + | A) Több réteg hozzáadása | ||
| + | B) Nagyobb neuronok számának használata | ||
| + | C) Dropout vagy regularizáció alkalmazása | ||
| + | D) Tanítási adatok csökkentése | ||
| + | |||
| + | Megoldás: C | ||
| + | |||
| + | ---- | ||
| + | ** Mi a felügyelt tanulás (supervised learning) jelentése? ** | ||
| + | |||
| + | A) A neurális háló saját maga fedezi fel a mintázatokat | ||
| + | B) Az adatok mellé címkéket (helyes válaszokat) is adunk a tanításhoz | ||
| + | C) A hálózat nem kap visszajelzést a tanulás során | ||
| + | D) Véletlenszerű tanítási módszer használata | ||
| + | |||
| + | Megoldás: B | ||
| + | |||
| + | ---- | ||
| + | ** Mi igaz a „feedforward” folyamatra egy neurális hálóban? ** | ||
| + | |||
| + | A) A bemenetet visszafelé dolgozza fel | ||
| + | B) A bemenetet a kimenet felé haladva dolgozza fel a háló | ||
| + | C) Csak hibaszámításra alkalmas | ||
| + | D) A súlyok módosítására használjuk | ||
| + | |||
| + | Megoldás: B | ||
| + | |||
| + | ---- | ||
| + | **Mi történik egy neurális háló tanításakor, | ||
| + | |||
| + | A) A tanulás gyorsabb és stabilabb lesz | ||
| + | B) A hálózat túl lassan tanul | ||
| + | C) A tanítás instabillá válhat, és nem konvergál optimálisan | ||
| + | D) A neurális háló egyáltalán nem tanul | ||
| + | |||
| + | Megoldás: C | ||
| + | |||
| + | |||
| + | |||
| + | | ||
| + | |||
| + | |||
| + | |||
muszaki_informatika/neuralis_halok_alapjai.1733396356.txt.gz · Last modified: 2024/12/05 10:59 by knehez
