Ana içeriğe geç

İleri Beslemeli Sinir Ağları Açıklaması: Eksiksiz Bir Eğitim

İleri Beslemeli Sinir Ağları (FFNN’ler), görüntü tanıma, Transformer’lar ve öneri sistemlerinde kullanılan derin öğrenmenin temelidir. Bu eksiksiz FFNN eğitimi; mimarilerini, MLP’lerden farklarını, aktivasyonları, geri yayılımı, gerçek dünya örneklerini ve PyTorch uygulamasını açıklar.
· 11 dk. oku

Yapay Zeka ile Keşfedin

Şuna bakarken: Makine Öğrenimi Algoritmaları, İleri Beslemeli Sinir Ağı (FFNN) kadar temel olan çok az kavram vardır. İlk sinir ağınızı kurduysanız, büyük olasılıkla ileri beslemeli bir ağdı. Onları neredeyse her yerde görebilirsiniz – basit sınıflandırma problemlerinden derin mimarilerdeki katmanları çalıştırmaya kadar. 

Önce size İleri Beslemeli Sinir Ağlarının büyük resimde nereye oturduğunu göstermek istiyorum:

Diyagram, İleri Beslemeli Sinir Ağlarının Yapay Zeka şemsiyesi altında nerede olduğunu gösteriyor. Görsel: Yazar

Bu eğitimde, İleri Beslemeli Sinir Ağının gerçekte ne olduğunu, nasıl evrildiğini, neden bugün hâlâ geçerli olduğunu açıklayacak ve gerçek dünya örneklerini inceleyeceğim.

İleri Beslemeli Sinir Ağı nedir?

Sezgisel olarak bu ağ mimarisini tanımlamanın en iyi yolu “Veri yalnızca ileri akar, döngü yoktur.”

Özünde, bir FFNN verileri girişten çıkışa doğru tek bir yönde akacak şekilde işler. Geriye döngü, özyineleme ve çevrim yoktur (kısa süre sonra ele alacağımız geri yayılım hariç). 

Bunu ilk öğrendiğimde, bana en çok yardımcı olan zihinsel görüntü bir fabrika konveyör bandıydı. 

Neden? 

Çünkü süreçteki her adım (veya ağdaki her katman), girdiyi bir sonrakine iletmeden önce ona basit bir şey yapar.

İşleyişi şöyle:

  1. Girdiler ilk katmana (giriş katmanı) gelir.
  2. Ağırlıklar ve önyargılarla (bias) dönüştürülür ve bir aktivasyon fonksiyonundan geçirilir.
  3. Bu, bir veya daha fazla gizli katman boyunca devam eder.
  4. Son olarak, çıkış katmanı bir tahmin üretir.

Böyle bir ağ mimarisinin nasıl göründüğünü göstermeden önce, yaygın bir yanılgıyı gidermek istiyorum:

“İleri Beslemeli Sinir Ağları MLP’lerle aynıdır.”

Bu yanılgıyı gidermek için Derin Öğrenmenin erken tarihini incelememiz gerekir. 

Derin öğrenmenin erken tarihi

Algılayıcı (Perceptron): 1950’lerde Frank Rosenblatt tarafından icat edilen Perceptron ile başlarız. Tek katmanlı bir ikili sınıflandırıcıydı ve her şeyi çözemese de (ör. XOR problemleri), sinir ağlarının temelini attı.

Basitçe, bir perceptron şöyle çalışırdı:

  1. Girdiler: Her girdi (x_1, x_2 vb.) bir ağırlıkla (w_1, w_2 vb.) ilişkilidir.
  2. Ağırlıklı toplam: Girdiler kendi ağırlıklarıyla çarpılır ve bir önyargı terimiyle birlikte toplanır: z = w1*x1 + w2*x2+ ... + b.
  3. Aktivasyon: Sonuç bir basamak (step) fonksiyonundan (bir aktivasyon) geçirilir. Değer eşik üzerinde ise perceptron 1, aksi halde 0 çıktılar.

Şekil, tek bir Perceptron’un iç işleyişini gösterir. Görsel: Yazar.

Özünde perceptron doğrusal bir sınıflandırıcıdır; yani yalnızca düz çizgi (veya hiper düzlem) karar sınırları çizebilir. Bir yandan, biyolojiden esinlendiği için çok basit ve zarif olması ve hesaplama açısından ucuz olması gibi erdemleri vardı. Öte yandan, XOR gibi doğrusal olarak ayrıştırılamayan problemleri çözemezdi. 

Çok Katmanlı Algılayıcılar (MLP’ler): Birkaç on yıl ileri sararsak, 1980’lerde araştırmacılar, birden fazla perceptron’u üst üste koyup doğrusal olmayan aktivasyon fonksiyonları eklerseniz daha karmaşık problemleri çözebileceğinizi fark ettiler. Bu yapı Çok Katmanlı Algılayıcı (MLP) olarak bilinir hale geldi.

İşleyişi şöyleydi: 

  1. Giriş Katmanı: Veri setinden ham özellikleri alır.
  2. Gizli Katmanlar: Dönüşümler uygulayan bir veya daha fazla perceptron katmanı. Her nöron z = w*x + b işlemini yapar ve bunu sigmoid, tanh vb. gibi doğrusal olmayan bir aktivasyon fonksiyonundan geçirir. 
  3. Çıkış Katmanı: Son katman nihai tahmini üretir (ör. sınıf olasılıkları, regresyon değerleri).

Bu doğrusal olmayan aktivasyonların eklenmesi çok kritikti. Onlar olmadan, katmanları üst üste koymak tek bir doğrusal dönüşüme indirgenirdi. Onlarla birlikte, MLP’ler son derece karmaşık, doğrusal olmayan fonksiyonları temsil edebilir.

Bu da sinir ağı kuramındaki en ünlü sonuçlardan birine yol açtı: Evrensel Yaklaştırma Teoremi. 

Doğrusal vs Doğrusal Olmayan Sınır. Görsel: Yazar.

Bu teorem, tek bir gizli katmana sahip bir sinir ağının bile — doğrusal olmayan bir aktivasyon fonksiyonu ve yeterli sayıda nöron olduğu sürece — sınırlı bir bölgede herhangi bir sürekli fonksiyonu yaklaştırabileceğini söyler. 

Derin Öğrenme Çağı: 2010’lara geldiğimizde derin öğrenme çağına gireriz. GPU’lar ve büyük veriyle birlikte, FFNN’ler daha derin ve güçlü mimarilere evrildi; CNN’ler, RNN’ler ve Transformer’ların temelini oluşturarak bugün geldiğimiz noktaya taşıdı.

Şimdi baştaki yanılgıya geri dönersek, artık şunları biliyoruz:

  • İleri Beslemeli Sinir Ağı (FFNN): Verinin tek yönde aktığı (girdi → gizli → çıktı), döngü olmayan her tür sinir ağının genel kategorisi.
  • Çok Katmanlı Algılayıcı (MLP): Özellikle en az bir gizli katmana sahip perceptronlardan (ağırlık, bias ve aktivasyonu olan nöronlar) oluşan bir FFN türü.

Başka bir deyişle, tüm MLP’ler FFNN’dir, ancak tüm FFNN’ler MLP değildir. Bu hatırlanması gereken çok önemli bir noktadır. Bir diğer yaygın yanılgı da tek katmanlı perceptron (yani yalnızca girişten çıkışa) hakkındadır.

Tek katmanlı perceptron bir FFNN’dir ama MLP değildir! Yalnızca gizli katmanlar eklediğimizde MLP olur.

Bu ayrım önemlidir; çünkü MLP’ler evrensel fonksiyon yaklaştırması yapabilirken (yeterli gizli birim ve doğrusal olmayan aktivasyon fonksiyonlarıyla), basit tek katmanlı perceptronların temsil gücü sınırlıdır.

İleri Beslemeli Sinir Ağının Mimarisi

Önceki bölümde FFNN hakkında çok şey öğrendik, ancak basitçe ifade etmek gerekirse bunlar basit dönüşümlerin bir yığını olarak düşünülebilir. Bir FFNN’i oluşturan pek çok bileşen vardır; özellikle MLP yapısını daha detaylı inceleyelim. 

Bir MLP’de üç tür katman vardır: Giriş, Gizli ve Çıkış Katmanı; bunlara kısaca değinmiştik. 

Tam Bağlantılı İleri Beslemeli Sinir Ağı (MLP) Mimarisi. Görsel: Yazar.

Bu katmanları daha ayrıntılı incelerken yukarıdaki diyagrama göz atın. 

Giriş katmanı

Burası ağın giriş noktasıdır.  Buradaki her nöron veri setindeki bir özelliği temsil eder. Önemli olan, giriş katmanının herhangi bir hesaplama yapmaması — yalnızca ham sayıları ileri iletir. Örneğimizde Giriş Katmanında yalnızca iki nöron olduğuna göre, bu veri setimizin iki özellik içerdiği (veya veri setimizden yalnızca iki özelliği ele aldığımız) anlamına gelir. 

Gizli katmanlar

Asıl hesaplamanın yapıldığı yerler buralarıdır. İkisi de dört nöron içeren iki Gizli katmanımız var. Bir gizli katmandaki her nöron üç şeyi yapar:

  1. Ağırlıklı toplam: Her girdi bir ağırlıkla çarpılır ve hepsi toplanır. 
  2. Bias: Fonksiyonu kaydırmada esneklik sağlamak için sabit bir önyargı eklenir.
  3. Aktivasyon fonksiyonu: ReLU, tanh veya sigmoid gibi doğrusal olmayan bir daraltma fonksiyonu uygulanır. Bu adım, ağın karmaşık, doğrusal olmayan kalıpları öğrenmesini sağlar.

Çıkış katmanı

Çıkış katmanı nihai tahmini üretir ve tasarımı çözmeye çalıştığımız probleme bağlıdır:

  • Regresyon problemleri, örneğin konut fiyatlarını tahmin etmek. Bu durumda, çıkış katmanı aktivasyonsuz (doğrusal) tek bir nöron içerir. Neden doğrusal? Çünkü değerleri daraltmak istemiyoruz; konut fiyatları herhangi bir gerçek sayı olabilir.
  • İkili sınıflandırma problemleri (evet/hayır kararları), örneğin bir e-postanın spam olup olmadığını tahmin etmek. Burada, çıkış katmanı sigmoid aktivasyonlu tek bir nöron olur. Neden sigmoid? Olasılıkları tahmin ettiğimiz için ağın 0 ile 1 arasında değerler üretmesini isteriz. 
  • Çok sınıflı sınıflandırma problemleri (3 veya daha fazla sınıf) — örneğin bir görüntüyü farklı hayvanlar olarak sınıflandırmak. Çıkış katmanı her sınıf için bir nöron içerir ve softmax aktivasyon kullanır. Neden softmax? Çünkü ham skorları toplamı 1 olan olasılıklara çevirir (ör. %70 kedi, %20 köpek, %10 at).

Referans için, FFNN ve genel olarak Derin Öğrenmede kullanılan dokuz yaygın aktivasyon fonksiyonunun şeklini gösteren bir diyagram burada.

Yaygın Aktivasyon Fonksiyonlarının Görselleştirilmesi. Görsel: Yazar.

Devam etmeden önce, bir katmandaki her nöronun sonraki katmandaki her nörona bağlandığını (bu yüzden tam bağlantılı olarak anılır) belirtmek de önemlidir. 

Örneğimize geri dönersek, şunlara sahibiz:

Parametreler = (2⋅4+4)+(4⋅4+4)+(4⋅1+1)=12+20+5=37

Her parantez ardışık katmanlar arasındaki parametre sayısını gösterir; burada önceki ve mevcut katmanın nöron sayıları birbiriyle çarpılır ve ardından bias sayısı (yani mevcut katmandaki nöron sayısı) eklenir. Alıştırma için bu hesaplamaları diğer sinir ağı örneklerinde de yapmayı deneyin!

İleri beslemeli bir sinir ağını eğitmek

Derin Öğrenmede eğitim iki adıma ayrılır: ileri geçiş/ileriye yayılım ve geri yayılım. Basitçe, İleri yayılım bize tahminleri verirken, Geri yayılım hatalardan öğrenme yolumuzdur. 

İleri yayılım 

Şimdiye kadar ele aldığımız her şey ileri yayılım kapsamına girer. Özetle, veriler bir MLP boyunca ilerlerken her katman aynı iki adımı uygular; bu da matematiksel olarak şu denklemlerle yazılabilir:

Burada z, önceki katmanın çıktısının mevcut katmanın ağırlıklarıyla çarpılıp bias ile toplanması sonrası elde edilen çıktıdır; buna Doğrusal Adım denir. 

Doğal olarak, önceki katman giriş katmanıysa bu, x olur; al-1 değil. Sonraki adım Aktivasyon Adımıdır. Bunu daha matematiksel olarak kesin kılmak için Ağırlık ve Bias’ı şöyle yazabiliriz:

Geri yayılım

Bir çıktı elde ettiğimizde, ağımıza bunun doğru olup olmadığını nasıl söyleriz? Ya da daha iyisi, ağı verilen görevde nasıl daha iyi hale getiririz? İşte Geri yayılımın devreye girdiği yer burasıdır. Bunu ağ için bir geri bildirim sistemi olarak düşünebiliriz; modele ne kadar yanıldığını ve kendini nasıl ayarlaması gerektiğini söyler. Şöyle parçalayabiliriz:

  1. Tahminleri karşılaştır: Modelin ne tahmin ettiğine (ŷ) ve gerçek cevabın ne olduğuna (y) bakın.
  2. Hata hesapla: Tahminin ne kadar yanlış olduğunu ölçmek için MSE gibi bir kayıp fonksiyonu kullanırız.
  3. Geriye yay (zincir kuralı ile): Tüm bias ve ağırlıklara göre gradyanlar hesaplanır. ∂L/∂w,∂L/∂b .
  4. Gradyan Azaltımı (Gradient Descent) güncellemesi: İlgili parametreler aşağıdaki kurala göre kaybı azaltacak şekilde güncellenir:

Burada η öğrenme hızıdır; her güncellemede parametrelerin ne kadar değişeceğini belirleyen ayarlanabilir bir parametre.

Gradyan Azaltımı Görselleştirmesi - kayıp fonksiyonunun her epoch’tan sonra nasıl azaldığını gösterir. Görsel: Yazar.

Bu sürecin birçok turu boyunca ağ kademeli olarak öğrenir ve görevde daha iyi hale gelir.

Daha net hale getirmek için, birlikte çok küçük bir örnek üzerinden gidelim. Diyelim ki elimizde şunlar var:

  • Girdi: x = 2
  • Hedef çıktı: y=4
  • Tahmin: ŷ = 3

Şimdi adımlardan geçelim. 

  1. Tahmini karşılaştır: ŷ =3, y = 4
  2. Hata: Bu örnekte MSE kullanacağız: L=(y−y^​)2=(4−3)2=1
  3. Geriye yay: Ağ, türevleri kullanarak bu hataya her bir ağırlık ve bias’ın ne kadar sebep olduğunu bulur ve ardından her bir parametreyi gradyan azaltımı güncelleme adımıyla güncelleriz. 

PyTorch ile İleri Beslemeli Bir Sinir Ağı Kodlama

Bir FFNN (özellikle bir MLP) oluşturmak için gerekli matematiği ele aldık. Daha ileri gitmek için bunu PyTorch ile kodlayacağız. 

Çok katmanlı algılayıcı

# Imports we will be needing
import torch
import torch.nn as nn
import torch.optim as optim

X,y = dataset # Here will be our dataset 

# We have created a MLP here using nn.Sequential()
model = nn.Sequential(
    nn.Linear(2, 4),  # input layer → hidden layer (2 → 4)
    nn.ReLU(),        # relu activation function
    nn.Linear(4, 4), # hidden layer 1 → hidden layer 2 (4 → 4)
    nn.ReLU(), 
    nn.Linear(4, 1)   # hidden layer 2 → output (4 → 1)
)


criterion = nn.MSELoss()         # regression loss, i.e our loss function
optimizer = optim.SGD(model.parameters(), lr=0.1) # Optimizer using the Stochastic Gradient Descent

# Training Loop
EPOCHS = 200 # Number of epochs we will be training for
for epoch in range(EPOCHS):
    # Forward pass
    outputs = model(X)
    loss = criterion(outputs, y)

    # Backward pass
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

Bu noktada, PyTorch kodunu daha önce incelediğimiz matematiksel adımlarla eşleştirebilmelisiniz. Ancak Epoch’larla ilgili bir sorunuz olabilir.

Bir epoch, tüm eğitim veri setinin sinir ağı üzerinden tam bir geçişidir. Örneğin, 1.000 eğitim veri noktamız ve yığın boyutu (batch size) = 100 olsun; ağ tüm 1.000 görüntüyü gördüğünde (yani 10 yığın), bu 1 epoch’tur. Eğitim genellikle çok sayıda epoch gerektirir; böylece model ağırlıklarını iyileştirmeye devam edebilir.

Evrişimsel sinir ağı

Diğer FFNN’lerden de kısaca bahsetmek istiyorum; bunlardan çok ünlü olanı Evrişimsel Sinir Ağı (CNN)’dir. 

Bir Evrişimsel Sinir Ağını gösteren diyagram. Görsel kaynağı: Mathworks - https://www.mathworks.com/discovery/convolutional-neural-network.html

Bir CNN’in sonunda bir MLP bulunsa da, başında Evrişim Katmanları ve Havuzlama (Pooling) Katmanları denen özel katmanlar vardır. Önce Evrişim Katmanlarından bahsedersek, bunlar bir filtre (veya çekirdek) kullanarak girişin yalnızca küçük yerel bölgelerine bir seferde baktıkları için esastır.

Bu, görüntüleri sınıflandırırken gerçekten kullanışlıdır çünkü:

  • Yoğun (dense) katmanlar her pikseli ayrı ele alır ve mekânsal yapıyı yok sayardı.
  • Evrişim katmanları ise küçük yamalarda kenarları, dokuları ve şekilleri algılayabilir — sonra daha derine indikçe bunları daha karmaşık kalıplara birleştirir.

Evrişim katmanlarının yanında, CNN’ler havuzlama (pooling) katmanları da kullanır.

Önemli bir not: Havuzlama katmanları parametre öğrenmez; bunun yerine öznitelik haritalarını aşağı örnekler (downsample) ve daha küçük, yönetilebilir hale getirir.

  • En yaygını Maksimum Havuzlamadır (Max Pooling); her küçük bölgeden (ör. 2×2 pencere) en büyük değeri alır.
  • Havuzlama, ağı daha verimli hale getirir ve ayrıca çeviri değişmezliği sağlar (ağ bir özelliğin tam olarak nerede olduğundan çok var olup olmadığıyla ilgilenir).

PyTorch kullanarak bir CNN’i şöyle kodlayabiliriz:

class SimpleCNN(nn.Module): # Define our model as a class
    def __init__(self):
        super().__init__()
        self.conv = nn.Conv2d(1, 8, 3)     # 1→8 channels, 3x3 kernel
        self.pool = nn.MaxPool2d(2, 2)
        self.fc   = nn.Linear(8*13*13, 10) # flatten → 10 classes

    def forward(self, x): # Forward propagation function 
        x = self.pool(torch.relu(self.conv(x)))
        x = x.view(x.size(0), -1)          # flatten
        return self.fc(x)

Yukarıdaki kodda tek bir evrişim katmanı, tek bir havuzlama katmanı ve tek bir doğrusal katmandan oluşan çok basit bir CNN oluşturduk. 

Diğer ileri beslemeli sinir ağı örnekleri

FFNN’lerin iki çok ünlü ve önemli örneğini ele aldık; ancak kendi alanlarında çığır açmış daha birçok örnek vardır, örneğin:

  1. Transformer’lar: her blokta bir MLP/FFN kısmı bulunur (öz-dikkatten sonra “feed-forward katmanı” boyutları genişletip daraltır).
  2. Görsel Transformer’lar (ViT’ler): görüntü yamalarına transformer blokları (içlerinde FFNN’ler) uygular.
  3. Otoenkoderler (temel olanlar): kodlayıcı + kod çözücü her ikisi de FFNN’lerden inşa edilir.
  4. Öneri sistemleri (MLP tabanlı): ör. sıralama ve tahminler için Wide & Deep modeller.

Transformer Mimarisi. Görsel, orijinal araştırma makalesinden alınmıştır - Attention is all you need.

Son Düşünceler

Umarım FFNN’lerin yapay zeka alanında ne kadar önemli olduğunu fark etmişsinizdir. Bunlar olmadan, derin öğrenmenin modern manzarası olmazdı.

Devam etmek için, geri yayılımı ustalaşarak öğrenmenizi ve aktivasyon fonksiyonlarını daha derinlemesine incelemenizi şiddetle öneririm. Bu konu Derin Öğrenmenin temelini oluşturduğundan, ayrıca PyTorch ile Derin Öğrenme öğrenmenizi de tavsiye ederim.

İleri Beslemeli Sinir Ağı SSS

FFNN’ler ve MLP’ler aynı şey mi?

Hayır, bu oldukça büyük bir yanılgıdır! Bir FFNN yalnızca verinin ileri aktığı anlamına gelir. MLP ise en az bir gizli katmanı olan bir FFNN türüdür.

Aktivasyon fonksiyonlarını neden kullanıyoruz?

Doğrusal olmayanlık katarlar. Onlar olmadan, birden fazla katman tek büyük bir doğrusal katman gibi davranır ve ağ karmaşık kalıpları öğrenemez.

FFNN’ler gerçek hayatta nerede kullanılır?

Her yerde: öneri sistemleri, görüntü sınıflandırıcıları (CNN’ler), Transformer’lar ve otoenkoderler onlara dayanır.

PyTorch’ta bir FFNN’i nasıl kodlarım?

PyTorch’ta nn.Linear katmanlarını istifleyip nn.ReLU gibi aktivasyonlar ekler, bir kayıp fonksiyonu ve bir eniyileyici seçer ve ileri + geri geçişlerle eğitiriz.

Geri yayılım nedir?

Tek cümlede: bir ağın öğrenme yoludur — tahminleri hedeflerle karşılaştırmak, hatayı ölçmek ve ağırlıkları gradyan azaltımıyla güncellemek.

Vaibhav Mehra

Yazar

Vaibhav Mehra

Konular

İlgili