A neurális hálózatok a mesterséges intelligencia egyik legjelentősebb területét alkotják. A Pythonban elérhető TensorFlow és Keras könyvtárak lehetővé teszik, hogy viszonylag kevés kóddal komplex mélytanulási modelleket hozzunk létre és tanítsunk be. Ez a cikk a neurális hálózatok felépítésének alapelveit és a Python-megvalósítás főbb lépéseit ismerteti.
Egy egyszerű neurális hálózat réteges felépítése (forrás: Wikimedia Commons, CC BY-SA 3.0)
A neurális hálózat fogalma
A mesterséges neurális hálózat egymáshoz kapcsolódó számítási egységek (neuronok) rétegzett rendszere. Az emberi agy felépítéséből elvont matematikai modell, amelynek célja, hogy adatokban mintázatokat ismerjen fel és általánosítson ismeretlen bemenetekre.
Egy egyszerű előrecsatolt (feedforward) hálózat három rétegből áll:
- Bemeneti réteg: A nyers adatokat fogadja (pl. pixelértékek, numerikus jellemzők).
- Rejtett réteg(ek): Nem lineáris transzformációkat végeznek, amelyekből a hálózat tanulja a mintákat.
- Kimeneti réteg: Az eredményt adja vissza (pl. osztályvalószínűségek vagy regressziós érték).
TensorFlow és Keras
A TensorFlow a Google által fejlesztett, nyílt forráskódú numerikus számítási keretrendszer, amelyet kifejezetten gépi tanulási modellekhez terveztek. A Keras a TensorFlow magas szintű API-ja, amely leegyszerűsíti a modellek definícióját és betanítását.
A TensorFlow 2.x óta a Keras szorosan integrált a keretrendszerbe, és az ajánlott fejlesztési felület a legtöbb feladathoz.
import tensorflow as tf
# Egyszerű szekvenciális modell
modell = tf.keras.Sequential([
tf.keras.layers.Dense(128, activation='relu', input_shape=(784,)),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(64, activation='relu'),
tf.keras.layers.Dense(10, activation='softmax')
])
modell.summary()
Aktivációs függvények
Az aktivációs függvény határozza meg, hogy egy neuron mennyit „aktiválódik" az adott bemenet alapján. Nem lineáris aktiváció nélkül a hálózat csupán lineáris transzformációt valósítana meg, ami lényegesen korlátoznák képességeit.
- ReLU (Rectified Linear Unit): A negatív értékeket nullára vágja, a pozitívokat meghagyja. A rejtett rétegekben a leggyakrabban alkalmazott.
- Sigmoid: Az értéket 0 és 1 közé szorítja — bináris osztályozás kimeneti rétegében jellemző.
- Softmax: Több osztályos feladatokban a kimeneti valószínűségeloszlást normalizálja.
- Tanh: -1 és 1 közé normalizál; rekurrens hálózatokban (RNN, LSTM) fordul elő.
Veszteségfüggvény és optimalizáló
A betanítás során a modell a veszteségfüggvény (loss function) értékét minimalizálja. A veszteségfüggvény méri, mennyire tér el a modell predikciója a tényleges értéktől. Az optimalizáló határozza meg, hogyan módosulnak a súlyok a visszaterjedés (backpropagation) alapján.
modell.compile(
optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),
loss='sparse_categorical_crossentropy',
metrics=['accuracy']
)
# Betanítás MNIST adathalmazon (példa)
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
x_train = x_train.reshape(-1, 784) / 255.0
x_test = x_test.reshape(-1, 784) / 255.0
tortenet = modell.fit(
x_train, y_train,
epochs=10,
batch_size=64,
validation_split=0.1
)
Túlillesztés és regularizáció
A túlillesztés (overfitting) akkor lép fel, amikor a modell a tanítóadatot „megtanulja", de ismeretlen adatra gyengén teljesít. A leggyakoribb ellenintézkedések:
- Dropout: A betanítás során véletlenszerűen „kikapcsol" bizonyos neuronokat, kényszerítve a hálózatot redundáns reprezentációk kialakítására.
- L2-regularizáció: A nagy súlyokat bünteti, ezzel simábbá teszi a modell döntési felszínét.
- Early stopping: A betanítást leállítja, ha a validációs hiba növekedni kezd.
- Adataugmentáció: A tanítóadatot mesterségesen bővíti (pl. képforgatás, tükrözés) a változatosság növelése érdekében.
Konvolúciós hálózatok képfelismeréshez
A konvolúciós neurális hálózatok (CNN) a képfeldolgozás területén váltak meghatározóvá. A konvolúciós rétegek szűrők segítségével lokális mintázatokat (éleket, textúrákat, formákat) ismernek fel.
cnn_modell = tf.keras.Sequential([
tf.keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)),
tf.keras.layers.MaxPooling2D((2, 2)),
tf.keras.layers.Conv2D(64, (3, 3), activation='relu'),
tf.keras.layers.MaxPooling2D((2, 2)),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(64, activation='relu'),
tf.keras.layers.Dense(10, activation='softmax')
])
cnn_modell.compile(
optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy']
)
Modell mentése és betöltése
A betanított modell elmenthető, majd visszatölthető predikciókhoz anélkül, hogy újra kellene tanítani:
modell.save('modell.keras')
betoltott = tf.keras.models.load_model('modell.keras')
elorejelzes = betoltott.predict(x_test[:5])