Derin Öğrenme ( Deep Learning): Sıfırdan Uzmanlığa

1. Giriş ve Temel Kavramlar > 1.1 Yapay Zekâ, ML ve DL Farkı

1.1 Yapay Zekâ (AI), Makine Öğrenimi (ML) ve Derin Öğrenme (DL) Farkı

Yapay Zekâ (Artificial Intelligence), Makine Öğrenimi (Machine Learning) ve Derin Öğrenme (Deep Learning) terimleri genellikle birbirinin yerine kullanılsa da, bunlar iç içe geçmiş hiyerarşik kavramlardır. Yapay Zekâ, en geniş şemsiye kavram olup, bir makinenin insan zekası gerektiren görevleri taklit etme yeteneği olarak tanımlanır.

Yapay Zekâ (AI): Geniş Resim

AI'ın amacı, mantık yürütme, problem çözme, bilgi temsili, planlama, öğrenme ve doğal dili anlama gibi insana özgü zihinsel yetenekleri makinelere kazandırmaktır. AI uygulamaları kural tabanlı sistemlerden (Expert Systems) en karmaşık otonom sistemlere kadar uzanır. Geleneksel AI (symbolic AI) ise sadece kodlanmış kurallara dayanır ve öğrenme yeteneği yoktur.

Makine Öğrenimi (ML): Öğrenen Sistemler

Makine Öğrenimi, AI'ın bir alt kümesidir. Temel prensibi, makinelerin açıkça programlanmadan verilerden öğrenmesini sağlamaktır. ML algoritmaları, büyük veri kümelerindeki desenleri ve ilişkileri analiz ederek, gelecekteki veriler hakkında tahminler veya kararlar üretir. ML'in en büyük avantajı, programcının "eğer bu olursa şunu yap" gibi katı kurallar yazmak zorunda kalmaması, sistemin kendi kurallarını oluşturmasıdır.

Geleneksel ML'de Temel Adımlar:

  1. Veri Toplama: Eğitilecek ilgili verinin toplanması.
  2. Özellik Mühendisliği (Feature Engineering): Girdiden anlamlı özelliklerin elle çıkarılması (Örn: Bir evin alanı, oda sayısı). Bu adım modelin başarısı için kritik ve zaman alıcıdır.
  3. Model Eğitimi: Algoritmanın (Örn: Destek Vektör Makineleri, Karar Ağaçları) bu özellikler üzerinde eğitilmesi.
  4. Tahmin (Prediction): Eğitilen modelin yeni verileri sınıflandırması veya tahmin etmesi.

Derin Öğrenme (DL): Özellik Çıkarımı Otomatikleşiyor

Derin Öğrenme, ML'nin bir alt kümesi olup, çok katmanlı yapay sinir ağlarını (Çok Katmanlı Perceptronlar, Evrişimli Ağlar vb.) kullanır. "Derin" terimi, ağın birden fazla gizli katmana sahip olmasından gelir. DL'i ML'den ayıran en kritik fark, özellik mühendisliğine olan ihtiyacı ortadan kaldırmasıdır.

Derin Öğrenmede Temel Fark:

DL modelleri, ham veriyi (örneğin bir görüntünün piksel değerlerini) doğrudan alır ve ilgili özellikleri (kenarlar, şekiller, dokular) katmanlar boyunca ilerledikçe hiyerarşik olarak **otomatik** olarak öğrenir. Bu, karmaşık verilerde (görüntü, ses, metin) DL'i geleneksel ML'den çok daha üstün kılar.

Özet Tablo: Kapsam, Yöntem ve Uygulama

Kavram Kapsam Temel Yöntem Kullanım Alanı
**Yapay Zekâ (AI)** En geniş amaç, insan zekasını taklit etme. Kural tabanlı sistemler, matematiksel optimizasyon, öğrenme algoritmaları. Robotik, Planlama, Uzman Sistemler.
Makine Öğrenimi (ML) AI'ın bir alt alanı, verilerden öğrenmeyi sağlar. Elle çıkarılan özellikler + İstatistiksel algoritmalar (SVM, Random Forest). Fiyat tahmini, Müşteri segmentasyonu.
Derin Öğrenme (DL) ML'nin bir alt alanı, çok katmanlı sinir ağları kullanır. Otomatik özellik çıkarma + Çok derin ağlar (CNN, RNN, Transformer). Görüntü tanıma, Otonom sürüş, Doğal dil üretimi (GPT).

Sonuç olarak, AI, insan zekasına ulaşma hedefidir; ML, bu hedefe ulaşmak için kullanılan temel bir öğrenme mekanizmasıdır; DL ise ML'nin, büyük ve karmaşık verilerle çalışmak için tasarlanmış, en güçlü ve modern alt dalıdır.

1.2 Tarihçe ve Uygulama Alanları

Derin öğrenmenin kökleri modern bir teknoloji gibi görünse de, teorik temelleri on yıllar öncesine dayanır. DL'in tarihini anlamak, bugünkü başarısını sağlayan dönüm noktalarını kavramak için önemlidir.

Derin Öğrenmenin Tarihsel Dönüm Noktaları

  1. 1943 - İlk Yapay Nöron: McCulloch ve Pitts, biyolojik nöronlardan esinlenerek ilk matematiksel nöron modelini (threshold logic unit) sundu.
  2. 1957 - Perceptron: Frank Rosenblatt, bu modeli öğrenme yeteneğiyle donattı. Perceptron, bir sinir ağının ilk somut örneğiydi.
  3. 1969 - AI Kışı (1. Dönem): Minsky ve Papert'in Perceptron'un XOR gibi doğrusal olmayan problemleri çözemediğini göstermesiyle araştırma fonları azaldı.
  4. 1986 - Geri Yayılım (Backpropagation): Rumelhart, Hinton ve Williams, çok katmanlı ağları eğitmek için Backpropagation algoritmasını yeniden popülerleştirdi. Bu, modern sinir ağlarının temel taşı oldu.
  5. 1998 - LeNet-5: Yann LeCun, ilk pratik Evrişimli Sinir Ağını (CNN) geliştirerek bankacılıkta el yazısı tanıma (çek okuma) uygulamasını başlattı.
  6. 2006 - Derin Öğrenme Yeniden Doğuşu: Geoffrey Hinton ve ekibi, ön eğitim (pre-training) teknikleriyle derin ağların etkin bir şekilde eğitilebileceğini kanıtladı ve "Deep Learning" terimini yaygınlaştırdı.
  7. 2012 - AlexNet: Alex Krizhevsky, ImageNet yarışmasında o güne kadar imkansız görülen bir performansla (hata oranını %26'dan %15'e düşürerek) yarışmayı kazandı. Bu olay, DL'in görüntü işleme alanındaki devrimini başlattı. GPU kullanımı burada kilit rol oynadı.
  8. 2017 - Transformer: Google araştırmacıları "Attention Is All You Need" makalesiyle RNN'leri geride bırakan ve günümüz LLM'lerinin (GPT, BERT) temelini oluşturan Transformer mimarisini tanıttı.

Derin Öğrenmenin Kritik Başarı Faktörleri (Üç Ana Etmen)

DL'in son on yıldaki muazzam başarısı üç temel faktörün eş simultaneous olgunlaşmasına bağlıdır:

  • Büyük Veri (Big Data): İnternet, mobil cihazlar ve sensörler sayesinde etiketli veri setlerinin (ImageNet, Common Crawl gibi) patlaması.
  • Donanım Gücü (GPU): Grafik İşlemci Birimlerinin (GPU), paralel matris operasyonlarını CPU'dan kat kat hızlı gerçekleştirmesi.
  • Gelişmiş Algoritmalar: ReLU aktivasyon fonksiyonu, Dropout ve Adam Optimizer gibi teknikler sayesinde derin ağların eğitimindeki zorlukların (Vanishing Gradient) aşılması.

DL'in Güncel Uygulama Alanları

Derin öğrenme, günümüzde neredeyse her endüstriyi dönüştürmektedir. En yaygın ve etkili kullanım alanları şunlardır:

1. Bilgisayarlı Görü (Computer Vision - CV):

  • Görüntü Sınıflandırma: Bir resmin ne olduğunu bulma (Kedi, Köpek, Araba).
  • Nesne Tespiti (Object Detection): Görüntüdeki birden fazla nesneyi konumlandırma ve etiketleme (Otonom araçlar).
  • Anlamsal Bölütleme (Semantic Segmentation): Her pikseli bir sınıfa atama (Tıbbi görüntü analizleri).

2. Doğal Dil İşleme (Natural Language Processing - NLP):

  • Makine Çevirisi: Google Çeviri'nin kalitesindeki sıçrama.
  • Duygu Analizi: Metinlerin (yorum, tweet) duygusal tonunu belirleme.
  • Metin Üretimi: Chatbotlar, kod tamamlama, makale yazımı (ChatGPT).

3. Otonom Sistemler ve Robotik:

  • Çevre algısı, karar verme ve hareket planlama.
  • Pekiştirmeli Öğrenme ile robotların karmaşık görevleri öğrenmesi.

4. Tıbbi Tanı ve Sağlık:

  • Röntgen ve MR görüntülerinde kanser hücrelerini veya hastalık belirtilerini tespit etme.
  • İlaç keşfi ve moleküler modelleme.

5. Finans ve Ticaret:

  • Algoritmik hisse senedi alım satım kararları.
  • Kredi dolandırıcılığı tespiti (Anomaly Detection).

Bu alanlardaki DL uygulamalarının sürekli gelişimi, yapay zekânın gelecekteki merkezi rolünü pekiştirmektedir.

1.3 Veri, Özellik (Feature) ve Etiket (Label) Kavramları

Derin öğrenme, yakıtı veri olan bir motordur. Bir DL modelinin başarısı, doğrudan kullandığı verinin kalitesine, miktarına ve yapısına bağlıdır. Bu nedenle, bir veri setini oluşturan temel bileşenleri doğru anlamak gerekir.

Veri Seti (Dataset) ve Örnek (Sample/Instance)

Bir veri seti, modelin öğrenme sürecinde kullandığı tüm gözlemlerin koleksiyonudur. Her bir satır veya öğe bir **örnek (sample)** veya **gözlem** olarak adlandırılır. Örneğin, bir müşteri veri setinde her bir satır bir müşteriyi (örnek), bir görüntü setinde her bir JPEG dosyası bir görüntüyü (örnek) temsil eder.

Özellik (Feature): Girdinin Tanımı

Özellikler, modelin tahmin yapmasını sağlayan, bir örneğe ait niteliklerdir. Geleneksel Makine Öğreniminde, bu özellikler (Örn: yaş, cinsiyet, gelir) programcı tarafından dikkatlice seçilir ve normalize edilir. Derin Öğrenmede ise, ham veriden (piksel değerleri, kelime dizileri) bu özellikler otomatik olarak öğrenilir.

Özellik Türleri:

  • Nümerik (Sayısal): Sürekli (sıcaklık, fiyat) veya ayrık (oda sayısı).
  • Kategorik: Sınıflı değerler (cinsiyet, şehir). Bunlar genellikle One-Hot Encoding ile sayısallaştırılır.
  • Ham Veri (DL Girdisi): Piksel değerleri (Görüntü), Ham ses sinyali (Ses), Kelime indeksleri (Metin).

Özellik Vektörü: Matematiksel olarak, bir örneğin tüm özellikleri bir vektör olarak temsil edilir. Bu, modelin (matris çarpımları) matematiksel işlemler için hazırdır.

Etiket (Label): Çıktı Hedefi

Etiket, modelin tahmin etmesi veya öğrenmesi beklenen doğru cevaptır. Etiketler genellikle gözetimli öğrenme senaryolarında bulunur ve modelin performansını ölçmek için kullanılır.

Etiket Türleri:

  • Sınıflandırma (Classification): Ayrık değerler (0 veya 1, Kedi, Köpek, Kuş).
  • Regresyon (Regression): Sürekli sayısal değerler (Ev fiyatı, sıcaklık tahmini).
  • Gözetimsiz Öğrenmede Etiket: Bu tür öğrenmede etiket yoktur, model verinin içindeki gizli yapıyı (cluster) veya dağılımı bulur.

Veri Yapılarının Temsili: Tensorlar (DL'in Temeli)

Derin öğrenmede, tüm veriler Tensor adı verilen çok boyutlu diziler (matrislerin genelleştirilmiş hali) olarak temsil edilir. Tensorlar, DL kütüphanelerinde (TensorFlow, PyTorch) temel veri yapısıdır.

Temel Tensor Boyutları:

Boyut (Rank) Örnek Görüntü Temsili
0D (Skaler) Tek bir sayı Kayıp değeri (Loss)
1D (Vektör) Bir özellik listesi Tek bir müşterinin özellikleri [Yaş, Gelir, Cinsiyet]
2D (Matris) Tablolu veri Tüm veri seti [Örnek Sayısı, Özellik Sayısı]
3D Tek bir renkli görüntü [Yükseklik, Genişlik, Kanal (3)]
4D (En Yaygın) Eğitim verisi [Batch Size, Yükseklik, Genişlik, Kanal]

DL Kodu Örneği (NumPy ile 4D Tensor Oluşturma):

import numpy as np
# 16 görüntüden oluşan bir batch (Görüntü, 28x28 piksel, Tek kanal)
batch_size = 16
height = 28
width = 28
channels = 1

X_train = np.random.rand(batch_size, height, width, channels)
print(f"Tensor Boyutu: {X_train.shape}")
# Çıktı: Tensor Boyutu: (16, 28, 28, 1)

# Etiketler (10 sınıflandırma)
y_labels = np.random.randint(0, 10, size=batch_size)
print(f"Etiket Boyutu: {y_labels.shape}")
# Çıktı: Etiket Boyutu: (16,)

1.4 Gözetimli, Gözetimsiz ve Pekiştirmeli Öğrenme

Makine öğrenimi ve derin öğrenme algoritmaları, temel olarak üç ana öğrenme paradigması altında sınıflandırılır. DL modelleri bu üç kategorinin her birinde devrim yaratmıştır.

Gözetimli Öğrenme (Supervised Learning)

Gözetimli öğrenme, bir öğretmenin rehberliğinde öğrenmeye benzer. Model, **etiketlenmiş veri** üzerinde eğitilir; yani her girdi verisine karşılık gelen doğru bir çıktı etiketi bulunur. Model, girdi ve çıktı arasındaki haritalama fonksiyonunu öğrenmeye çalışır. En sık kullanılan DL yöntemi budur.

Ana Görevler:

  • Sınıflandırma (Classification): Girdiyi ayrık kategorilerden birine atama (Örn: E-posta Spam mı? Değil mi?). Son katmanda genellikle **Softmax** aktivasyonu kullanılır.
  • Regresyon (Regression): Girdiden sürekli sayısal bir değer tahmin etme (Örn: Yarınki hava sıcaklığı). Son katmanda genellikle **Doğrusal (Linear)** aktivasyon kullanılır.

Çalışma Prensibi: Model bir tahmin yapar $\hat{y}$. Bu tahmin ile gerçek etiket $y$ arasındaki fark (Hata/Loss) hesaplanır ve model, hatayı azaltmak için ağırlıklarını ayarlar (Geri yayılım). Amaç: $f(X) \approx Y$

Gözetimsiz Öğrenme (Unsupervised Learning)

Gözetimsiz öğrenme, etiketsiz verilerle çalışır. Modelin görevi, verinin içindeki gizli yapıları, örüntüleri ve dağılımları kendiliğinden keşfetmektir. DL'de Otomatik Kodlayıcılar (Autoencoders) ve Üretken Çekişmeli Ağlar (GAN's) bu alanda öne çıkar.

Ana Görevler:

  • Kümeleme (Clustering): Verileri benzerliklerine göre gruplara ayırma (Örn: Pazar segmentasyonu).
  • Boyut İndirgeme (Dimensionality Reduction): Veriyi daha az kayıpla daha küçük bir temsil haline getirme (Örn: Veri görselleştirme).
  • Üretken Modelleme (Generative Modeling): Eğitim verisine benzeyen yeni ve gerçekçi örnekler üretme (Örn: Metinden görüntü oluşturma).

Çalışma Prensibi: Model, girdiyi alır ve çıktısı da aynı girdi verisinin sıkıştırılmış veya yeniden oluşturulmuş hali olabilir. Etiket dışarıdan verilmez. Amaç: Veri dağılımını anlamak.

Pekiştirmeli Öğrenme (Reinforcement Learning - RL)

Pekiştirmeli öğrenme, bir ajanın (agent) bir ortam (environment) içinde deneme-yanılma yoluyla öğrenmesini sağlar. Ajan, yaptığı eylemlerin sonucuna göre bir ödül (reward) veya ceza alır. Amacı, zaman içindeki toplam ödülü maksimize etmektir. DL, bu alanda büyük ilerleme sağlamış ve Deep RL terimini ortaya çıkarmıştır (Örn: AlphaGo).

Ana Bileşenler:

  • Ajan: Öğrenen ve karar veren varlık (DL ağı).
  • Ortam: Ajanın etkileşimde bulunduğu dünya (Oyun, simülasyon).
  • Durum (State): Ortamın anlık durumu.
  • Eylem (Action): Ajanın yapabileceği kararlar.
  • Ödül: Ajanın eylemine karşı ortamdan aldığı geri bildirim.

Çalışma Prensibi: Ajan bir eylem seçer $\rightarrow$ Ortam yeni bir duruma geçer ve bir ödül verir $\rightarrow$ Ajan bu ödülü kullanarak sonraki adımlarda politikasını günceller. Amaç: Maksimum kümülatif ödül.

Özet Karşılaştırma Tablosu

Öğrenme Türü Veri Gereksinimi Temel DL Modelleri Örnek Uygulama
Gözetimli Etiketli (X ve Y) CNN, RNN, ANN Hastalık tanısı, Spam filtreleme
Gözetimsiz Etiketsiz (Sadece X) Autoencoders, GANs, VAE Müşteri segmentasyonu, Veri sıkıştırma
Pekiştirmeli Ödül sinyali (Etkileşim) DQN, Policy Gradient Ağları Otonom sürüş, Robot kontrolü

1.5 Python + NumPy + Pandas + Matplotlib Temeli

Python, basit söz dizimi, geniş kütüphane ekosistemi ve bilimsel hesaplama yetenekleri nedeniyle derin öğrenmenin tartışmasız lider dilidir. TensorFlow ve PyTorch gibi ana DL kütüphaneleri Python ile geliştirilmiştir.

Python'da Temel DL Kütüphaneleri

1. NumPy: Bilimsel Hesaplama ve Çok Boyutlu Diziler (Tensorların Babası)

NumPy (Numerical Python), büyük, çok boyutlu diziler (array'ler) ve matrisler üzerinde hızlı matematiksel işlemler yapmak için temel kütüphanedir. Derin öğrenme matris çarpımları gibi yoğun hesaplamalara dayandığı için, NumPy'ın performansı hayati öneme sahiptir. NumPy array'leri, DL kütüphanelerinin (TensorFlow, PyTorch) kullandığı Tensor veri yapısının öncülüdür.

Kritik NumPy İşlevleri:

  • Array Oluşturma: `np.array()`, `np.zeros()`, `np.ones()`, `np.arange()`.
  • Şekil İşlemleri: `reshape()`, `transpose()`, `squeeze()`.
  • Matematiksel İşlemler: Vektörizasyon (döngüsüz işlemler), nokta çarpımı (`np.dot()`).

NumPy Kod Örneği: Matris Çarpımı (DL'in Kalbi)

import numpy as np
# 3 girişli (X) bir nöronun 4 ağırlığı (W) olsun (Bias yok)
X = np.array([1.0, 2.0, 3.0]) # Girdi vektörü (1D)
W = np.array([[-0.5], [0.8], [0.1]]) # Ağırlık matrisi (3x1)

# İleri Besleme: Toplam = X * W
Z = np.dot(X, W)
print(f"Toplam Z: {Z}") # Çıktı: [1.2] (Hesaplama: 1*-0.5 + 2*0.8 + 3*0.1 = 1.4)

# İki matris çarpımı
M1 = np.arange(4).reshape(2, 2)
M2 = np.identity(2)
M3 = M1 @ M2 # Python'da matris çarpım operatörü
print(f"Matris Çarpımı:\n{M3}")

2. Pandas: Veri İşleme ve Ön Hazırlık

Pandas, etiketli, tablosal verilerle (CSV, Excel) çalışmak için geliştirilmiştir. Veri Bilimi projelerinin %80'i veri temizleme, birleştirme ve dönüştürme (pre-processing) adımlarından oluşur. Pandas'ın `DataFrame` yapısı bu işlemleri son derece kolaylaştırır.

Kritik Pandas İşlevleri:

  • Veri yükleme/kaydetme: `pd.read_csv()`.
  • Eksik veri yönetimi: `fillna()`, `dropna()`.
  • Veri filtreleme ve seçme: `.loc`, `.iloc`.
  • Kategorik veriyi sayısal dönüştürme: `pd.get_dummies()` (One-Hot Encoding).

3. Matplotlib/Seaborn: Görselleştirme

Matplotlib ve onun üzerine kurulu daha gelişmiş Seaborn kütüphanesi, modelin eğitim sürecini, sonuçlarını ve verinin dağılımını görselleştirmek için kullanılır. Eğitim sırasında Kayıp (Loss) ve Doğruluk (Accuracy) grafiklerini çizmek, aşırı öğrenmeyi (overfitting) tespit etmek için hayati öneme sahiptir.

Kritik Matplotlib İşlevleri:

  • Eğitim Grafikleri: `plt.plot()` ile loss/accuracy eğrileri çizmek.
  • Dağılım Grafikleri: `plt.scatter()` veya `plt.hist()` ile veri dağılımını görmek.
  • Görüntüleme: `plt.imshow()` ile DL çıktısı olan görüntüleri görselleştirmek.

Matplotlib Kod Örneği: Kayıp Grafiği Çizimi

import matplotlib.pyplot as plt
# Örnek eğitim ve doğrulama kayıp değerleri
history = {'loss': [0.9, 0.6, 0.4, 0.2], 'val_loss': [0.8, 0.5, 0.4, 0.6]}

plt.figure(figsize=(10, 6))
plt.plot(history['loss'], label='Eğitim Kaybı (Train Loss)')
plt.plot(history['val_loss'], label='Doğrulama Kaybı (Validation Loss)')
plt.title('Model Kayıp Eğrisi')
plt.xlabel('Epoch')
plt.ylabel('Kayıp (Loss)')
plt.legend()
plt.grid(True)
# plt.show()

1.6 GPU, CUDA ve Tensor İşlemleri (Donanım Altyapısı)

Derin öğrenme, CPU (Merkezi İşlem Birimi) ile eğitimi pratik olmayan, son derece yoğun matris çarpımı ve toplama işlemlerine dayanır. Bu nedenle, DL'in başarısının ardındaki temel donanım gücü **GPU'lardır**.

GPU (Graphics Processing Unit): Paralel Hesaplamanın Gücü

CPU, az sayıda güçlü çekirdekle karmaşık, sıralı görevlerde (bir işletim sistemini çalıştırma, metin işleme) üstündür. GPU ise binlerce küçük çekirdek içerir ve bu çekirdekler basit ama aynı anda birçok işlemi yapabilir (paralelizm).

DL ve GPU İlişkisi:

  • Derin sinir ağlarında, her bir katmanın hesaplanması, bir girdi matrisi ile bir ağırlık matrisinin çarpımını içerir.
  • Bu matris çarpımları, binlerce bağımsız çarpma ve toplama işlemine ayrılabilir.
  • GPU, bu binlerce işlemi aynı anda işleyerek eğitimi, bir CPU'ya göre onlarca hatta yüzlerce kat hızlandırır.
  • Günümüzdeki büyük LLM'lerin (GPT-4) eğitimi, GPU'suz haftalar değil, yıllar alacaktır.

CUDA: GPU'ya Erişim Arayüzü

CUDA (Compute Unified Device Architecture), NVIDIA tarafından geliştirilen bir paralel hesaplama platformu ve programlama modelidir. DL kütüphanelerinin (TensorFlow, PyTorch) GPU'nun paralel işlem gücünü kullanmasını sağlayan yazılım arayüzüdür.

CUDA'nın Rolü:

  • Python kodunda tanımladığınız bir tensörün (veri veya ağırlık), CPU belleği yerine GPU belleğine atanmasını sağlar.
  • DL kütüphanesi, CUDA API'lerini kullanarak bu tensörler üzerindeki işlemleri (matris çarpımı) GPU'ya delege eder.
  • AMD'nin benzer bir platformu ROCm'dir, ancak CUDA sektör standardı haline gelmiştir.

Temel Donanım Kurulum Adımları:

  1. NVIDIA Sürücüleri Kurulumu.
  2. CUDA Toolkit Kurulumu (Gerekli sürümün DL kütüphanesi ile uyumlu olması gerekir).
  3. cuDNN (CUDA Deep Neural Network) Kurulumu (Matris işlemleri için GPU'yu daha da optimize eder).

Tensor İşlemleri ve GPU Belleği Yönetimi

Daha önce bahsedildiği gibi, tüm DL verisi ve model ağırlıkları tensör olarak saklanır. GPU'da eğitim yaparken, verilerin CPU-GPU arasında sürekli aktarılması performans kaybına yol açar.

PyTorch'ta GPU Kullanımı Örneği:

import torch

# CUDA'nın mevcut olup olmadığını kontrol et
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print(f"Kullanılan Cihaz: {device}")

# Tensörü CPU'da oluştur
tensor_cpu = torch.randn(5, 5)
print(f"Tensor CPU'da: {tensor_cpu.device}")

# Tensörü GPU'ya taşı (GPU belleğine yükle)
tensor_gpu = tensor_cpu.to(device)
print(f"Tensor GPU'da: {tensor_gpu.device}")

# GPU üzerindeki işlemler çok hızlıdır
result_gpu = tensor_gpu * 2 + 1
# ... model.to(device) ile tüm modeli GPU'ya taşımak en yaygın pratik

Bellek (RAM vs VRAM):

  • RAM: Bilgisayarın ana belleği (CPU tarafından kullanılır).
  • VRAM (Video RAM): GPU'nun kendi üzerindeki yüksek hızlı bellek. Model ağırlıkları ve verinin büyük bir kısmı burada tutulur.
  • DL eğitiminde "Out of Memory" hatası, VRAM'in yetersiz kalmasından kaynaklanır ve genellikle **Batch Size** küçültülerek çözülür.

2.1 Nöron Modeli (Perceptron) ve Aktivasyon Fonksiyonları

Yapay Sinir Ağları (ANN) veya Derin Öğrenme modellerinin temel yapı taşı yapay nörondur. Biyolojik nöronlardan ilham alınarak modellenen bu birim, ağın hesaplama gücünün merkezindedir.

Yapay Nöronun (Perceptron) Anatomisi

Bir yapay nöron, üç temel adımdan oluşur:

  1. Girdi Alımı: Nöron, önceki katmandan (veya doğrudan girdiden) bir dizi girdi $x_1, x_2, \ldots, x_n$ alır.
  2. Ağırlıklı Toplama (Linear Combination): Her girdi, bir ağırlık $w_i$ ile çarpılır ve bu çarpımlar toplanır. Buna bir de **Bias** ($b$) değeri eklenir. Toplam (Z) = $(\sum x_i w_i) + b$
  3. Aktivasyon (Activation): Elde edilen toplam ($Z$), bir aktivasyon fonksiyonundan $g(Z)$ geçirilir. Bu, nöronun nihai çıktısı $a$ olur. Çıktı $a = g(Z)$

Ağırlıklar ($W$) ve Bias ($b$):

  • **Ağırlıklar:** Öğrenilecek olan parametrelerdir. Bir girdi ile çıktı arasındaki ilişkinin gücünü belirler. Eğitim süreci, bu ağırlıkların optimum değerlerini bulmaktır.
  • **Bias:** Girdiden bağımsız olarak nöronun çıktısını ayarlayan sabit bir değerdir. Nöronun, girdisi sıfır olsa bile aktif olmasını sağlar (Doğrusal fonksiyonun $y$ eksenini kestiği nokta).

Aktivasyon Fonksiyonlarının Önemi: Doğrusallığı Kırma

Eğer bir ağda aktivasyon fonksiyonları kullanılmazsa, kaç katman eklenirse eklensin, tüm ağ sadece doğrusal bir dönüşüm gerçekleştirmiş olur (yani $y = mx+b$ gibi bir fonksiyon). Aktivasyon fonksiyonları, sinir ağlarına karmaşık, **doğrusal olmayan** desenleri modelleme yeteneği kazandırır. Bu olmadan, DL sadece lojistik regresyon zincirinden ibaret olurdu.

Yaygın Aktivasyon Fonksiyonları:

  1. Sigmoid (Lojistik Fonksiyon):
    • Formül: $g(z) = \frac{1}{1 + e^{-z}}$
    • Değer Aralığı: (0, 1)
    • Kullanım Alanı: Çıktı katmanında ikili sınıflandırma (binary classification) için kullanılır (olasılık değeri verir).
    • Sorun: Gradyan kaybolması (Vanishing Gradient) sorununa yol açar, bu nedenle gizli katmanlarda artık kullanılmaz.
  2. Tanh (Hiperbolik Tanjant):
    • Formül: $g(z) = \frac{e^z - e^{-z}}{e^z + e^{-z}}$
    • Değer Aralığı: (-1, 1)
    • Kullanım Alanı: Sigmoid'e göre daha iyi bir ortalama merkezlemesi sağlar, bazı eski ağlarda ve RNN'lerde hala tercih edilir.
  3. ReLU (Rectified Linear Unit):
    • Formül: $g(z) = \max(0, z)$
    • Değer Aralığı: [0, $\infty$)
    • Kullanım Alanı: Gizli katmanlarda en yaygın kullanılan aktivasyondur. Gradyan hesaplamasını çok hızlandırır.
    • Avantaj: Pozitif bölgelerde türevi sabittir (1), bu da gradyan kaybolmasını önler.
    • Sorun: "Dying ReLU" (nöronun hep pasif kalması) sorunu olabilir, bu nedenle Leaky ReLU veya ELU türevleri geliştirilmiştir.
  4. Softmax:
    • Formül: $\sigma(\vec{z})_i = \frac{e^{z_i}}{\sum_{j=1}^{K} e^{z_j}}$
    • Değer Aralığı: [0, 1] ve çıktıların toplamı 1'e eşittir.
    • Kullanım Alanı: Çıktı katmanında çok sınıflı (multi-class) sınıflandırma için kullanılır (Her sınıfın olasılığını verir).

Aktivasyon Fonksiyonu Seçimi Özeti:

Gizli Katmanlar için: ReLU (Çoğu durumda).
İkili Sınıflandırma Çıktısı için: Sigmoid.
Çoklu Sınıflandırma Çıktısı için: Softmax.

2.2 Katmanlı Yapılar ve İleri Besleme Ağı (Feedforward Networks - FFN)

Derin öğrenme modelleri, yapay nöronların katmanlar halinde organize edilmesiyle inşa edilir. Bir ağın derinliği, içerdiği gizli katman sayısıyla belirlenir.

Temel Katman Türleri

Bir Yapay Sinir Ağı (ANN), en az üç tür katmandan oluşur:

  1. Giriş Katmanı (Input Layer):
    • Ham verinin (özelliklerin) ağa girdiği ilk katmandır.
    • Bu katmanda hesaplama yapılmaz, sadece veri dağıtımı yapılır.
    • Nöron sayısı genellikle girdi vektörünün boyutuna eşittir.
  2. Gizli Katmanlar (Hidden Layers):
    • Girdi katmanı ile çıktı katmanı arasında yer alan tüm katmanlardır.
    • Derin öğrenmede birden fazla gizli katman kullanılır.
    • Her katman, girdinin giderek daha karmaşık ve soyut özelliklerini öğrenir (Hiyerarşik Özellik Öğrenimi).
  3. Çıktı Katmanı (Output Layer):
    • Ağın nihai sonucunun üretildiği son katmandır.
    • Nöron sayısı, çözülen göreve bağlıdır (Regresyon için 1, 10 sınıflı sınıflandırma için 10).
    • Aktivasyon fonksiyonu göreve göre seçilir (Sigmoid, Softmax, Lineer).

İleri Besleme Sinir Ağı (Feedforward Network - FFN)

İleri besleme ağları, verinin yalnızca tek yönde (girişten çıkışa) hareket ettiği en basit DL yapısıdır. Geri dönüş döngüleri (Recurrence) veya atlamalı bağlantılar (Skip Connections) içermez. Genellikle Çok Katmanlı Perceptron (Multilayer Perceptron - MLP) olarak da adlandırılır.

İleri Besleme Süreci (Forward Propagation):

İleri besleme, bir tahmin üretmek için ağdaki tüm katmanlarda hesaplamanın yapılmasıdır. Matematiksel olarak, her katman bir öncekinin çıktısını alır ve bir matris çarpımı ile aktivasyon işlemi uygular.

Matematiksel Gösterim (Tek Katman İçin):

Katman $l$'in çıktısı $A^{[l]}$ olsun. Bir sonraki katmanın girdisi $A^{[l]}$ olur:

1. Ağırlıklı Toplam: $Z^{[l+1]} = W^{[l+1]} A^{[l]} + b^{[l+1]}$

2. Aktivasyon: $A^{[l+1]} = g^{[l+1]}(Z^{[l+1]})$

Burada $W$ ağırlık matrisidir, $A$ aktivasyon/çıktı matrisidir, $b$ bias vektörüdür ve $g$ aktivasyon fonksiyonudur.

Örnek: 2 Gizli Katmanlı bir Ağın Mimarisi

Bir giriş verisi $X$ (4 özellik), 2 gizli katman (5 ve 3 nöron) ve 2 sınıflı bir çıktı katmanı ($Y$) için katman boyutları:

  1. Giriş Katmanı: Boyut 4. Girdi $X$.
  2. Gizli Katman 1 (H1): 5 nöron. $W^{[1]}$ boyutu $(5, 4)$. $A^{[1]}$ boyutu $(5, 1)$.
  3. Gizli Katman 2 (H2): 3 nöron. $W^{[2]}$ boyutu $(3, 5)$. $A^{[2]}$ boyutu $(3, 1)$.
  4. Çıktı Katmanı (O): 2 nöron. $W^{[3]}$ boyutu $(2, 3)$. $\hat{Y}$ boyutu $(2, 1)$.

Bu matris boyutları, tensörlerin tutarlı bir şekilde çarpılabilmesi için (matris çarpım kuralı: $(A, B) \times (B, C) = (A, C)$) kesinlikle doğru olmalıdır.

Keras'ta MLP Tanımlama Örneği:

from tensorflow import keras
from keras import layers

model = keras.Sequential([
    # Gizli Katman 1: 5 nöron, ReLU aktivasyonu
    layers.Dense(5, activation="relu", input_shape=(4,)),
    # Gizli Katman 2: 3 nöron, ReLU aktivasyonu
    layers.Dense(3, activation="relu"),
    # Çıktı Katmanı: 2 sınıf (Softmax ile olasılık)
    layers.Dense(2, activation="softmax")
])
model.summary()

2.3 Hata Hesaplama ve Geri Yayılım (Backpropagation)

Bir derin öğrenme modelini eğitmek, modelin tahminlerindeki hatayı (yanlışlığı) sürekli olarak azaltma sürecidir. Bu süreç, Kayıp Fonksiyonu (Loss Function), Gradyan İnişi (Gradient Descent) ve Geri Yayılım (Backpropagation) mekanizmalarını içerir.

Kayıp Fonksiyonu (Loss Function / Cost Function)

Kayıp fonksiyonu, modelin tek bir veri örneği için ne kadar kötü performans gösterdiğini ölçer. Maliyet fonksiyonu ise genellikle tüm eğitim veri seti üzerindeki ortalama kaybı ifade eder.

Yaygın Kayıp Fonksiyonları:

  • Regresyon için: Ortalama Kare Hata (Mean Squared Error - MSE): $\text{MSE} = \frac{1}{N} \sum (\hat{y}_i - y_i)^2$.
  • İkili Sınıflandırma için: İkili Çapraz Entropi (Binary Cross-Entropy): $-\frac{1}{N} \sum [y_i \log(\hat{y}_i) + (1-y_i) \log(1-\hat{y}_i)]$.
  • Çoklu Sınıflandırma için: Kategorik Çapraz Entropi (Categorical Cross-Entropy).

Amaç: Eğitim sürecinde kayıp fonksiyonunun değerini minimuma indirmek.

Gradyan İnişi (Gradient Descent)

Gradyan inişi, kayıp fonksiyonunun minimum değerini bulmak için kullanılan bir optimizasyon algoritmasıdır. Bir kayıp yüzeyinde, model ağırlıklarının hangi yönde ve ne kadar değiştirilmesi gerektiğini belirler.

  • Gradyan: Kayıp fonksiyonunun ağırlıklara göre türevidir. Bize, ağırlıkların küçük bir değişikliğinin kayıpta ne kadar değişikliğe yol açacağını söyler. Gradyan, kaybın en hızlı arttığı yönü gösterir.
  • İniş: Kaybı azaltmak için, ağırlıklar gradyanın tersi yönde (yani kaybın en hızlı azaldığı yönde) güncellenir.

Ağırlık Güncelleme Kuralı:

$W_{yeni} = W_{eski} - (\text{Öğrenme Oranı} \times \frac{\partial \text{Loss}}{\partial W_{eski}})$

Buradaki $\frac{\partial \text{Loss}}{\partial W_{eski}}$ gradyandır. Öğrenme Oranı (Learning Rate) ise bu inişin büyüklüğünü kontrol eden bir hiperparametredir (Bkz. 3.4).

Geri Yayılım (Backpropagation): Zincir Kuralının Uygulanması

Geri yayılım, gradyan inişi için gerekli olan kayıp fonksiyonunun tüm ağırlıklara göre türevlerini ($\frac{\partial \text{Loss}}{\partial W}$) verimli bir şekilde hesaplamak için kullanılan algoritmadır.

Süreç:

  1. İleri Besleme: Girdi, ağdan geçirilir ve çıktı $\hat{Y}$ elde edilir.
  2. Hata Hesaplama: $\text{Loss} = L(\hat{Y}, Y)$ hesaplanır.
  3. Geri Yayılım (The Chain Rule): Hata, çıktı katmanından başlanarak geriye doğru (aktivasyon fonksiyonları ve doğrusal katmanlar üzerinden) yayılır. Bu, Kalkülüs'ün **Zincir Kuralı (Chain Rule)** kullanılarak yapılır.

    Örn: Bir $W$ ağırlığı için gradyan, zincir kuralı ile şöyle hesaplanır:

    $\frac{\partial L}{\partial W} = \frac{\partial L}{\partial a} \times \frac{\partial a}{\partial z} \times \frac{\partial z}{\partial W}$

    Burada, $\frac{\partial L}{\partial a}$ önceki adımdan gelen hata bilgisidir. Bu adım, DL'in derinliğini ve etkinliğini sağlayan matematiksel temeldir.

  4. **Ağırlık Güncelleme:** Elde edilen gradyanlar kullanılarak ağırlıklar, Gradyan İnişi kuralına göre güncellenir.

DL'deki her bir optimizasyon adımı (iteration), bu ileri besleme, hata hesaplama ve geri yayılım döngüsünü içerir.

2.4 Aşırı Öğrenme (Overfitting) ve Düzenlileştirme (Regularization)

Derin öğrenme modelleri, milyonlarca parametreye sahip olabildikleri için, eğitim verilerini ezberlemeye (memorize etmeye) çok eğilimlidirler. Bu durum, modelin test verilerinde ve gerçek dünyada başarısız olmasına neden olur.

Aşırı Öğrenme (Overfitting) Nedir?

Aşırı öğrenme, bir modelin eğitim veri seti üzerinde çok iyi, ancak daha önce görmediği yeni veri seti (doğrulama veya test) üzerinde kötü performans göstermesidir.

Göstergeleri:

  • Eğitim Kaybı (Train Loss) düşmeye devam ederken, Doğrulama Kaybı (Validation Loss) belirli bir noktadan sonra artmaya başlar.
  • Eğitim Doğruluğu (Train Accuracy) çok yüksektir (%99-100), ancak Test Doğruluğu önemli ölçüde düşüktür (%80-85).

Düzenlileştirme (Regularization): Aşırı Öğrenmeyi Engelleme Yöntemleri

Düzenlileştirme, modelin eğitim verisine aşırı uyum sağlamasını önlemek ve genelleme yeteneğini (yeni verilere adaptasyonu) artırmak için tasarlanmış teknikler topluluğudur.

1. Dropout (En Popüler Düzenlileştirme):

  • Prensip: Eğitim sırasında, her bir iterasyonda gizli katmandaki nöronların rastgele bir yüzdesi (genellikle %20 ile %50 arası) geçici olarak devre dışı bırakılır (yani çıktısı sıfırlanır).
  • Etkisi: Bu, ağın belirli bir nöronun çıktısına aşırı güvenmesini engeller. Nöronlar, görevlerini yerine getirmek için diğer nöronlarla işbirliği yapmaya zorlanır. Bu, modelin farklı alt ağları (ensembles) eğitmesine benzer bir etki yaratır ve genellemeyi artırır.
  • Uygulama: Sadece eğitim aşamasında kullanılır. Tahmin (inference) aşamasında tüm nöronlar kullanılır, ancak ağırlıkları Dropout oranı kadar ölçeklenir (veya bu işlem öncesinde yapılır).

2. L1 ve L2 Düzenlileştirme (Ağırlık Bozunumu - Weight Decay):

Bu teknikler, kayıp fonksiyonuna bir ceza terimi ekleyerek ağın ağırlıklarının çok büyük değerler almasını engeller (Ağırlıkların büyümesi, modelin aşırı karmaşık olmasına yol açar).

  • L2 (Ridge Regression): Kayıp fonksiyonuna ağırlıkların karesinin toplamını ($ \sum W^2 $) ekler. Ağırlıkları sıfıra yaklaştırır ama sıfır yapmaz. Daha yumuşak bir genelleme sağlar.
  • L1 (Lasso Regression): Kayıp fonksiyonuna ağırlıkların mutlak değerinin toplamını ($ \sum |W| $) ekler. Daha az önemli ağırlıkları tam olarak sıfır yapma eğilimindedir (**Özellik Seçimi** özelliği vardır).

3. Erken Durdurma (Early Stopping):

Bu, en basit ve en etkili düzenlileştirme yöntemidir. Modelin eğitime ne zaman son vermesi gerektiğini belirler.

  • Prensip: Modeli eğitim ve doğrulama (validation) veri setleri üzerinde paralel olarak eğitiriz. Doğrulama kaybı belirli bir sayıda epoch (sabır/patience) boyunca iyileşmezse (artmaya başlarsa) eğitimi durdururuz.
  • Avantaj: Aşırı öğrenmenin başlamasından hemen önce eğitimi durdurarak en iyi genelleme noktasına ulaşmış oluruz.

4. Veri Artırma (Data Augmentation):

Özellikle görüntü işleme (CNN) alanında, mevcut eğitim verisini basit dönüşümlerle (çevirme, döndürme, kırpma, parlaklık değiştirme) sentetik olarak çoğaltarak modelin gerçek dünyadaki farklı varyasyonlara karşı daha sağlam olmasını sağlar. Bu, dolaylı bir düzenlileştirme yöntemidir.

3.1 Veri Normalizasyonu ve Ölçekleme

Derin öğrenme modellerinde, girdi verilerinin doğru şekilde ön işlenmesi (pre-processing) modelin eğitimi ve yakınsama hızı için kritik öneme sahiptir. Normalizasyon ve ölçekleme, bu ön işleme adımlarının temelini oluşturur.

Normalizasyonun ve Ölçeklemenin Amacı

DL modelleri, ağırlıklarını Gradyan İnişi ile günceller. Eğer girdi özellikleri çok farklı büyüklüklere sahipse (Örn: Yaş [0-100] ve Gelir [10000-1000000]), büyük değerlere sahip özellikler gradyan hesaplamasında domine edecektir.

  • Yakınsama Hızı: Ölçeklendirme, maliyet fonksiyonu yüzeyini daha simetrik hale getirir, bu da Gradyan İnişinin minimuma daha hızlı ve kararlı bir şekilde inmesini sağlar.
  • Stabilite: Aktivasyon fonksiyonlarının (Örn: Sigmoid) aşırı doygunluk (saturation) bölgelerine girmesini engeller.

Temel Ölçekleme Yöntemleri

1. Min-Max Normalizasyonu (Scaling to Range):

Veriyi belirli bir aralığa (genellikle 0 ile 1 arasına) dönüştürür. Bu, özellikle görüntülerde (piksel değerleri 0-255 arasındadır) sıkça kullanılır.

Formül: $X_{normalized} = \frac{X - X_{\text{min}}}{X_{\text{max}} - X_{\text{min}}}$

DL'de Uygulama (Görüntüler):

  • 255'e bölmek, piksel değerlerini 0 ile 1 aralığına normalize eder.
import numpy as np
# Görüntü piksel değerleri (0-255)
image_data = np.array([20, 150, 250], dtype=np.float32)

# 0-1 Normalizasyonu
normalized_data = image_data / 255.0
print(f"Normalize Edilmiş: {normalized_data}")
# Çıktı: [0.07843137 0.5882353 0.98039216]

2. Standardizasyon (Z-Skoru Normalizasyonu):

Veriyi, ortalaması 0 ve standart sapması 1 olacak şekilde dönüştürür. DL'de, özellikle gizli katmanların çıktılarını ölçeklemek için (Batch Normalization gibi) veya tablosal verilerde sıklıkla tercih edilir.

Formül: $X_{standardized} = \frac{X - \mu}{\sigma}$

Burada $\mu$ ortalama, $\sigma$ standart sapmadır.

DL'de Uygulama (Tablosal Veri):

  • İlk olarak eğitim setinin ortalaması ($\mu_{train}$) ve standart sapması ($\sigma_{train}$) hesaplanır.
  • Hem eğitim hem de test verisi, aynı $\mu_{train}$ ve $\sigma_{train}$ değerleri kullanılarak standartlaştırılır.

Dikkat Edilmesi Gerekenler:

  • Eğitim-Test Tutarlılığı: Test verisi, asla kendi ortalaması ve standart sapması ile normalleştirilmemelidir. Test verisi, yalnızca eğitim setinin istatistikleri kullanılarak dönüştürülmelidir.
  • Kategorik Veri: One-Hot Encoding veya Embedding'ler gibi yöntemlerle sayısal temsile dönüştürülen kategorik veriler ölçeklenmemelidir.
  • Batch Normalization: DL mimarilerinde katmanlar arasına yerleştirilen bu özel katman, her mini-batch'in istatistiklerini kullanarak veriyi dinamik olarak standartlaştırır ve modelin çok daha hızlı yakınsamasını sağlar. (Bkz. İleri konular).

3.2 Batch, Epoch, İteration Kavramları

Derin öğrenme modelinin eğitim süreci, büyük veri setlerinin yönetimi ve ağırlıkların güncellenmesi için üç temel kavrama dayanır. Bu hiperparametreler, eğitim süresini ve modelin yakınsama kalitesini doğrudan etkiler.

Epoch (Dönem)

Bir Epoch, tüm eğitim veri setinin (training set) yapay sinir ağına bir kez ileri (forward) ve bir kez geri (backward/backpropagation) geçmesi anlamına gelir.

  • Anlamı: Modelin tüm veriyi bir tur görmesi.
  • Tanım: Eğer veri seti 1000 örnekten oluşuyorsa, 1 Epoch, modelin 1000 örneği de gördüğü anlamına gelir.
  • Ayarlama: Eğitim genellikle birden fazla Epoch boyunca yapılır (Örn: 10, 50, 100 Epoch). Çok fazla Epoch, aşırı öğrenmeye (overfitting) yol açabilir.

Batch Size (Mini-Batch Boyutu)

Mini-Batch Boyutu, ağırlıkların güncellenmesinden önce ağa beslenen örnek sayısıdır. Tüm veri setini bir kerede kullanmak yerine, ağırlıklar küçük gruplar (mini-batch) halinde güncellenir.

  • Amaç: Bilgisayar belleği (özellikle GPU VRAM) sınırlı olduğu için tüm veri setini bir kerede işlemek pratik değildir. Mini-batch'ler bellek kullanımını optimize eder.
  • Etkisi: Mini-batch'ler, Stochastic Gradient Descent (SGD) yönteminde bir denge noktasıdır:
    • Batch Size = 1: Bu, Saf Stokastik Gradyan İnişidir (SGD). Çok gürültülü (noisy) gradyanlar verir, yakınsama yavaştır ancak bazen daha iyi minimum bulur.
    • Batch Size = N (Tüm Veri Seti): Bu, Batch Gradyan İnişidir. Her adımda en doğru gradyanı verir, ancak bellek gereksinimi yüksektir ve yavaştır.
    • Batch Size = 32, 64, 128: Mini-Batch Gradyan İnişidir (En yaygın pratik). Hız ve stabilite arasında en iyi dengeyi sunar.
  • Seçim: Genellikle 32, 64, 128 gibi 2'nin kuvvetleri şeklinde seçilir, çünkü bu, GPU donanımı için en verimli çalışma şeklidir.

Iteration (İterasyon)

Bir İterasyon, bir Mini-Batch'in ağdan geçerek ağırlıkların bir kez güncellenmesi anlamına gelir.

$$\text{İterasyon Sayısı} = \frac{\text{Toplam Örnek Sayısı}}{\text{Batch Size}}$$

Örnek Hesaplama:

Eğitim Veri Seti Boyutu: 1000 örnek
Batch Size: 50
Epoch Sayısı: 10

$$\text{1 Epoch'taki İterasyon Sayısı} = \frac{1000}{50} = 20$$

$$\text{Toplam İterasyon Sayısı} = 10 \text{ Epoch} \times 20 \text{ İterasyon/Epoch} = 200 \text{ İterasyon}$$

Özet Akış Şeması

  1. Epoch 1 Başlar.
  2. İterasyon 1: Batch 1 (50 örnek) işlenir, ağırlıklar güncellenir.
  3. İterasyon 2: Batch 2 (50 örnek) işlenir, ağırlıklar güncellenir.
  4. ...
  5. İterasyon 20: Batch 20 (50 örnek) işlenir, ağırlıklar güncellenir.
  6. Epoch 1 Sona Erer. (Tüm 1000 örnek görülmüştür).
  7. Epoch 2 Başlar, tüm süreç yeniden başlar.

3.3 SGD ve Gelişmiş Optimizasyon Algoritmaları (Adam, RMSprop)

Optimizasyon algoritmaları, sinir ağlarının ağırlıklarını, kayıp fonksiyonunu en aza indirecek şekilde otomatik olarak ayarlayan motorlardır. Gradyan İnişi bu sürecin temelini oluştursa da, tek başına yeterince verimli değildir.

1. Stokastik Gradyan İnişi (SGD)

SGD, DL'in temelidir. Adını, her bir ağırlık güncellemesinde gradyanın tüm veri seti yerine rastgele seçilen bir örneğe (Stokastik) veya küçük bir partiye (Mini-Batch) göre hesaplanmasından alır.

  • Avantaj: Mini-batch kullanıldığı için çok hızlıdır.
  • Dezavantaj: Gradyanlar gürültülü olabilir, bu da maliyet yüzeyinde zig-zag yaparak yavaş yakınsamaya neden olabilir.
  • Momentum: SGD'yi geliştirmek için, önceki adımın yönünü de hesaba katan bir momentum terimi eklenir. Bu, gürültülü gradyanlardan daha hızlı kurtulmayı ve düz vadilerde daha hızlı ilerlemeyi sağlar.

2. Adaptive Learning Rate (Uyarlanabilir Öğrenme Oranı) Optimizasyonları

En büyük yenilik, her bir ağırlık parametresi için farklı ve dinamik olarak değişen bir öğrenme oranı kullanmaktır. Bu, modelin farklı katmanları ve nöronları için en uygun hızda öğrenmeyi sağlar.

RMSprop (Root Mean Square Propagation):

  • Prensip: Gradyanların karesinin hareketli ortalamasını tutar. Bu hareketli ortalama (RMS), gradyanları normalize etmek için kullanılır.
  • Etkisi: Sık güncellenen (gürültülü) parametreler için öğrenme hızını azaltır, az güncellenen (önemli) parametreler için artırır. Bu, maliyet yüzeyindeki eğimi (slope) yumuşatır ve daha hızlı iniş sağlar.

Adam (Adaptive Moment Estimation):

Adam, günümüzde en yaygın ve çoğu senaryoda varsayılan olarak kullanılan optimizatördür. RMSprop'u Momentum ile birleştirir. Hızlı yakınsama, düşük bellek kullanımı ve kolay kurulumu ile öne çıkar.

Adam'ın Bileşenleri:

  • Birinci Moment (Momentum): Gradyanların hareketli ortalamasını tutar (Hız).
  • İkinci Moment (RMSprop): Gradyanların karesinin hareketli ortalamasını tutar (Hızın karesi).

Ağırlık güncellemesi bu iki momentin kombinasyonu ile yapılır, bu da her bir parametreye adapte edilmiş ve hızlandırılmış bir öğrenme oranı sağlar.

Optimizatör Karşılaştırması ve Seçimi

Optimizatör Özellikler Ne Zaman Kullanılmalı?
SGD (w/ Momentum) En temel, en az gürültülü, eğitim sonunda iyi genelleme sağlar. Basit ağlar, iyi performans gerektiğinde (Fine-tuning), Araştırma.
RMSprop Uyarlanabilir öğrenme oranı, Gürültülü problemler için iyi. RNN ve Sıralı veriler.
Adam Hem Momentum hem de Uyarlanabilir öğrenme oranı, Hızlı yakınsama. Çoğu DL görevi için varsayılan olarak başlanmalıdır (CNN, MLP, NLP).

Hiperparametreler: Adam optimizatörü dört ana hiperparametreye sahiptir, ancak genellikle sadece ilk ikisi ayarlanır:

  • `learning_rate`: Genellikle 0.001 olarak başlanır.
  • `beta_1`: Momentum için (Varsayılan 0.9).
  • `beta_2`: RMSprop için (Varsayılan 0.999).
  • `epsilon`: Bölme hatasını önlemek için küçük bir sayı.

3.4 Öğrenme Oranı (Learning Rate) ve Model Değerlendirme Metrikleri

Eğitim sürecinde, modelin ağırlıklarını nasıl güncellediği ve bu güncellemelerin ne kadar başarılı olduğu iki kritik unsur tarafından belirlenir: Öğrenme Oranı ve Metrikler.

Öğrenme Oranı (Learning Rate - $\alpha$): Ağın Öğrenme Hızı

Öğrenme oranı, Gradyan İnişi sırasında ağırlıkların, hesaplanan gradyan yönünde ne kadar büyük bir adım atacağını belirleyen en önemli hiperparametredir.

$$W_{yeni} = W_{eski} - (\text{Learning Rate} \times \text{Gradyan})$$

Öğrenme Oranı Seçimi ve Etkileri:

  • Çok Yüksek $\alpha$: Model, minimum noktayı sürekli atlar ve kayıp fonksiyonu artar veya kararsız bir şekilde sıçrar (divergence). Eğitim başarısız olur.
  • Çok Düşük $\alpha$: Model, minimuma çok yavaş yaklaşır. Eğitim saatlerce veya günlerce sürebilir (eğitim durgunlaşır).
  • En İyi Uygulama: Optimum $\alpha$, en hızlı ve en kararlı yakınsamayı sağlar. Genellikle 0.01, 0.001 veya 0.0001 gibi değerlerle başlanır.

Öğrenme Oranı Zamanlayıcıları (Learning Rate Schedulers):

Sabit bir öğrenme oranı kullanmak yerine, eğitimi ilerledikçe oranı dinamik olarak azaltmak (decay) modelin performansını artırır ve daha iyi bir minimuma ulaşmasını sağlar.

  • Step Decay: Belirli sayıda epoch'tan sonra oranı sabit bir faktörle (Örn: 0.5) çarparak düşürür.
  • Cosine Annealing: Oranı, bir kosinüs eğrisi şeklinde yavaşça düşürür ve periyodik olarak sıfırdan en yükseğe çıkarabilir.
  • ReduceLROnPlateau: Doğrulama kaybı (Validation Loss) belirli bir sabır süresi (patience) boyunca iyileşmezse oranı düşürür (en popüler uyarlanabilir yöntemlerden biridir).

Model Değerlendirme Metrikleri

Kayıp fonksiyonu ağırlıkların güncellenmesi için matematiksel bir sinyal sunarken, Metrikler, modelin insan dilinde anlamlı olan performansını ölçer.

Sınıflandırma Metrikleri (Confusion Matrix Temelli):

Çıktıları: TP (True Positive), TN (True Negative), FP (False Positive), FN (False Negative)

  1. Doğruluk (Accuracy): Tüm doğru tahminlerin oranı. $(\text{TP} + \text{TN}) / (\text{TP} + \text{TN} + \text{FP} + \text{FN})$. Dengeli veri setlerinde iyidir.
  2. Hassasiyet (Precision): Modelin pozitif tahminlerinden kaç tanesinin gerçekten pozitif olduğu (Örn: Spam tespiti - yanlışlıkla spam olmayan bir e-postayı silmemek için önemlidir). $\text{TP} / (\text{TP} + \text{FP})$.
  3. Duyarlılık (Recall / Sensitivity): Gerçek pozitif örneklerin ne kadarının model tarafından doğru yakalandığı (Örn: Tıbbi tanı - hastalığı kaçırmamak için önemlidir). $\text{TP} / (\text{TP} + \text{FN})$.
  4. F1 Skoru: Hassasiyet ve Duyarlılığın harmonik ortalamasıdır. Dengesiz veri setlerinde Accuracy'den daha iyi bir ölçüm sunar. $2 \times \frac{\text{Precision} \times \text{Recall}}{\text{Precision} + \text{Recall}}$.
  5. AUC-ROC (Area Under the ROC Curve): Sınıflandırma eşiğinden bağımsız olarak modelin iki sınıfı ne kadar iyi ayırdığını gösterir. 1'e yakın değerler en iyi performansı gösterir.

Regresyon Metrikleri:

  • Ortalama Kare Hata (MSE): Hatanın karesinin ortalamasıdır. Büyük hataları daha çok cezalandırır.
  • Ortalama Mutlak Hata (MAE): Mutlak hataların ortalamasıdır. Çıktı birimiyle aynı birimde yorumlanabilir.
  • R-Kare ($R^2$): Modelin bağımlı değişkendeki varyansı ne kadar iyi açıkladığını gösterir. 1'e yakın değerler daha iyidir.

4.1 TensorFlow / Keras Temelleri

TensorFlow, Google tarafından geliştirilen açık kaynaklı bir derin öğrenme kütüphanesidir. Keras ise, kullanıcı dostu ve üst düzey bir API sağlayarak model oluşturma ve denemeyi hızlandıran bir arayüzdür. Güncel TensorFlow sürümlerinde Keras, ana arayüz (tf.keras) olarak entegre edilmiştir.

TensorFlow'un Yapısı ve Keras'ın Rolü

  • TensorFlow Çekirdeği: Düşük seviyeli işlemler (matris çarpımları, gradyan hesaplama) ve dağıtık hesaplama altyapısını sağlar.
  • Keras API (tf.keras): Modelin katmanlarını tanımlama, kayıp fonksiyonlarını ve optimizatörleri ayarlama gibi karmaşık DL işlemlerini basitleştirir.
  • Tasarım Felsefesi: Hızlı prototipleme, modülerlik ve kolay anlaşılırlık. Keras, en yaygın DL katmanları ve yapılarını hazır modüller halinde sunar (Sequential API, Functional API).

Temel Keras Kavramları

  1. Sequential API (Sıralı Model): Katmanların art arda yığıldığı basit modeller için kullanılır.
  2. Katmanlar (Layers): DL mimarisinin temel yapı taşlarıdır (Dense, Conv2D, LSTM).
  3. Derleme (Compile): Modelin eğitim için hazır hale getirilmesi. Bu adımda Loss Function, Optimizer ve Metrikler belirlenir.
  4. Eğitme (Fit): Veri setini kullanarak modelin ağırlıklarını güncelleme süreci (Forward/Backward Propagation).

Keras ile Temel Bir MLP Modeli Oluşturma Örneği

Bu örnekte, Keras'ın Sequential model yapısıyla basit bir MLP (Çok Katmanlı Perceptron) nasıl tanımlandığı gösterilmiştir:

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense

# 1. Modeli Tanımlama (Sequential API)
model = Sequential([
    # Giriş katmanı (4 özellik) ve ilk gizli katman (8 nöron, ReLU)
    Dense(8, activation='relu', input_shape=(4,)),
    # İkinci gizli katman (4 nöron, ReLU)
    Dense(4, activation='relu'),
    # Çıktı katmanı (3 sınıf, Softmax olasılık için)
    Dense(3, activation='softmax')
])

# 2. Modeli Derleme (Loss, Optimizer, Metrics belirleme)
model.compile(
    optimizer='adam',
    loss='categorical_crossentropy',
    metrics=['accuracy']
)

model.summary()
# Output: Modelin katmanları, çıktı şekli ve toplam parametre sayısı

TensorFlow'un Grafik Tabanlı Hesaplaması

TensorFlow, verimlilik ve dağıtık hesaplama için dinamik hesaplama grafikleri oluşturur. Veri akışı (dataflow) mantığıyla, tüm işlemler bir grafik düğümü olarak tanımlanır ve bu grafik GPU'da optimize edilerek çalıştırılır. Bu, DL modellerinin büyük ölçekte ve farklı donanımlarda (CPU, GPU, TPU) kolayca dağıtılabilmesini sağlar.

4.2 PyTorch Temelleri

PyTorch, Facebook'un AI araştırma laboratuvarı (Meta AI) tarafından geliştirilen ve özellikle akademik çevreler ile araştırma-yoğun uygulamalarda popüler olan bir derin öğrenme kütüphanesidir. PyTorch, dinamik hesaplama grafikleri (define-by-run) yaklaşımıyla bilinir ve Pythonic (Python diline daha yakın) yapısı ile kolay hata ayıklama olanağı sunar.

PyTorch'un Temel Bileşenleri

  1. Torch Tensor: NumPy array'lerine benzer, ancak GPU üzerinde çalışabilme ve gradyan hesaplamasını destekleme yeteneğine sahip temel veri yapısıdır.
  2. Autograd: PyTorch'un otomatik farklılaştırma (gradyan hesaplama) motorudur. Geri yayılım (Backpropagation) için gereken tüm türevleri dinamik olarak hesaplar.
  3. `torch.nn` Modülü: DL katmanları, kayıp fonksiyonları ve diğer mimari bileşenler için yüksek seviyeli bir arayüz sağlar.
  4. `torch.optim` Modülü: SGD, Adam gibi tüm optimizasyon algoritmalarını içerir.

Autograd ve Dinamik Hesaplama Grafiği (Define-by-Run)

PyTorch'un en ayırt edici özelliği, dinamik hesaplama grafiğidir. Her ileri besleme geçişinde yeni bir grafik oluşturulur. Bu, değişken girdi boyutlarına, koşullu dallanmalara ve döngülere sahip karmaşık ağlarda (Örn: RNN'ler) TensorFlow'un eski statik grafiklerine göre daha esnek olmayı sağlar.

`requires_grad` ve `.backward()`:

  • PyTorch'ta, gradyan hesaplanması gereken tensörler `requires_grad=True` olarak işaretlenir (genellikle modelin ağırlıkları).
  • Kayıp hesaplandıktan sonra, sadece `.backward()` fonksiyonunu çağırmak, Autograd'ın zincir kuralını uygulamasını ve tüm parametrelerin gradyanlarını hesaplamasını sağlar.

PyTorch ile Basit Bir Model Oluşturma ve Gradyan Hesaplama Örneği

Bu örnek, PyTorch'ta temel bir tensörün nasıl tanımlandığını ve gradyanın nasıl hesaplandığını gösterir:

import torch
import torch.nn as nn

# 1. Model Mimarisi: Basit bir doğrusal katman (y = wx + b)
model = nn.Linear(in_features=1, out_features=1)

# 2. Veri Hazırlama (Ağırlıklar için gradyan gerekiyor, girdi için gerekmiyor)
x = torch.tensor([[1.0]], requires_grad=False)
y_true = torch.tensor([[2.0]])

# 3. İleri Besleme (Forward Pass)
y_pred = model(x)

# 4. Kayıp Hesaplama
loss_fn = nn.MSELoss() # Ortalama Kare Hata
loss = loss_fn(y_pred, y_true)

# 5. Geri Yayılım (Backward Pass)
loss.backward()

# 6. Gradyanları Görüntüleme
# model.weight.grad artık hesaplanan gradyanı içerir
print(f"Kayıp: {loss.item():.4f}")
print(f"Ağırlık Gradyanı: {model.weight.grad.item():.4f}")

4.3 Model Oluşturma, Eğitme ve Kaydetme

Derin öğrenme projelerinde döngü, modelin oluşturulması, veri üzerinde eğitilmesi, performansının değerlendirilmesi ve son olarak üretimde kullanılmak üzere kaydedilmesinden oluşur. Bu adımlar, kütüphaneden bağımsız olarak evrenseldir.

1. Model Oluşturma (Mimarinin Tanımlanması)

Bu adımda, ağın katmanları, nöron sayısı ve aktivasyon fonksiyonları belirlenir. Bu, modelin mimarisini oluşturur (Bkz. 2.2).

Önemli Kararlar:

  • Katman Sayısı: Modelin derinliği. Karmaşık görevler daha fazla katman gerektirir.
  • Nöron Sayısı: Her katmanın genişliği. Genellikle giriş katmanından çıkış katmanına doğru daralır.
  • Aktivasyonlar: Gizli katmanlarda ReLU, çıkışta görev odaklı (Sigmoid/Softmax/Linear) seçimi.

2. Model Eğitme (The `fit` Metodu veya Eğitim Döngüsü)

Model, eğitim verisi üzerinde Loss Function'ı minimize etmek üzere eğitilir. Bu, iterasyonlar ve epoch'lar boyunca sürekli bir ileri ve geri yayılım döngüsüdür (Bkz. 3.2).

Keras Eğitim Örneği (`fit`):

Keras, eğitimi tek bir fonksiyon çağrısıyla gerçekleştirir:

# X_train, y_train: Numpy/TensorFlow tensörleri
# X_val, y_val: Doğrulama verileri

history = model.fit(
    X_train, y_train,
    epochs=50,
    batch_size=32,
    validation_data=(X_val, y_val),
    callbacks=[EarlyStopping(patience=5)]
)

PyTorch Eğitim Döngüsü (Manual):

PyTorch'ta eğitim döngüsü, daha düşük seviyeli olduğu için adım adım yazılır:

  1. `optimizer.zero_grad()`: Önceki iterasyonların gradyanlarını sıfırla.
  2. `output = model(input)`: İleri Besleme.
  3. `loss = criterion(output, target)`: Kayıp hesaplama.
  4. `loss.backward()`: Geri Yayılım ve gradyan hesaplama.
  5. `optimizer.step()`: Ağırlıkları güncelleme.

3. Model Kaydetme (Deployment için Hazırlık)

Modelin eğitilmiş ağırlıkları ve mimarisi, daha sonra yüklenip tahmin yapmak üzere kaydedilmelidir. Bu, eğitimi tekrar yapmaya gerek kalmadan modelin üretim ortamında kullanılmasına olanak tanır.

TensorFlow/Keras Kaydetme:

Tüm modeli (mimari, ağırlıklar, optimizatör durumu) tek bir dosyada kaydeder:

# Keras modelini kaydetme (.h5 veya SavedModel formatında)
model.save('modelim.h5')

# Model yükleme
loaded_model = tf.keras.models.load_model('modelim.h5')

PyTorch Kaydetme:

PyTorch genellikle sadece modelin durum sözlüğünü (ağırlıklar) kaydeder:

# Sadece ağırlıkları kaydetme (Tavsiye edilen)
torch.save(model.state_dict(), 'model_agirliklari.pth')

# Yükleme (Önce mimarinin yeniden oluşturulması gerekir)
new_model = MyModelClass(...)
new_model.load_state_dict(torch.load('model_agirliklari.pth'))
new_model.eval() # Çıkarım moduna al

5.1 Görüntü Verisinin Yapısı (Piksel, Kanal, Boyutlar)

Evrişimli Sinir Ağları (CNN), görüntü verisinin benzersiz yapısından tam olarak faydalanmak için tasarlanmıştır. Bir görüntünün nasıl temsil edildiğini anlamak, CNN katmanlarının işleyişini kavramak için temeldir.

Piksel Değerleri ve Boyutlar

Dijital bir görüntü, temel olarak üç boyutta temsil edilen sayısal bir matristir:

  1. Yükseklik (Height): Görüntünün dikey piksel sayısı.
  2. Genişlik (Width): Görüntünün yatay piksel sayısı.
  3. Kanal (Channel): Renk bilgisini taşıyan katman sayısı.

Bir DL sisteminde görüntü tensörünün tipik formatı şöyledir:

$$\text{Tensor Boyutu} = (\text{Batch Size}, \text{Yükseklik}, \text{Genişlik}, \text{Kanal})$$

*(Not: PyTorch, Kanal'ı genellikle Yükseklik/Genişlik'ten önce kullanır: $(B, C, H, W)$)*

Kanal Kavramı

Kanal, bir pikselin renk bilgisini temsil eder. Görüntü türüne göre kanal sayısı değişir:

  • Gri Tonlamalı (Grayscale) Görüntü: Tek bir kanal (Channel = 1) kullanır. Piksel değeri 0 (siyah) ile 255 (beyaz) arasında bir yoğunluğu temsil eder.
  • RGB (Renkli) Görüntü: Üç kanal (Channel = 3) kullanır: Kırmızı (Red), Yeşil (Green) ve Mavi (Blue). Her pikselin her kanalda 0-255 arasında bir yoğunluk değeri vardır.
  • Derinlik Görüntüleri: Ek derinlik kanalları (Örn: RGBA, Termal, Lidar verileri) içerebilir.

Örnek: 64x64 Renkli Görüntü Tensörü

Bir mini-batch'te 16 adet 64x64 piksel boyutunda renkli görüntü varsa, bu veri TensorFlow'da şöyle temsil edilir:

$$\text{Boyut} = (16, 64, 64, 3)$$

Görüntü Verisinin Ölçeklenmesi (Scaling)

Görüntüler CNN'e verilmeden önce mutlaka ölçeklenmelidir (Bkz. 3.1):

  • 0-1 Normalizasyonu: En yaygın yöntemdir. Piksel değerleri 255'e bölünerek 0 ile 1 arasına taşınır. Bu, gradyanların stabil kalmasını sağlar.
  • Merkezleme (Zero-Centering): Piksel değerlerinden veri setinin ortalaması çıkarılır.

Piksel Uzamsal İlişkileri:

CNN'in gücü, piksel değerlerinin komşuluk ilişkilerini (uzamsal korelasyon) korumasından gelir. FFN'ler görüntüyü düzleştirirken (flatten), CNN'ler 3D yapıyı koruyarak yerel desenleri (kenarlar, köşeler) öğrenir. Evrişim katmanları, bu yerel örüntüleri yakalamak için tasarlanmıştır.

5.2 Convolution (Evrişim), Pooling (Havuzlama) ve Padding Kavramları

Evrişimli Sinir Ağlarının (CNN) temelini oluşturan bu üç kavram, ağın görüntüden otomatik olarak anlamlı ve hiyerarşik özellikler çıkarmasını sağlar.

1. Evrişim İşlemi (Convolution)

Evrişim, bir girdiden özellik haritaları (feature maps) çıkarmak için kullanılan temel işlemdir. Geleneksel sinir ağlarındaki ağırlıklı toplam işlemine benzer, ancak yalnızca yerel bir bölge üzerinde çalışır.

  • Filtre/Çekirdek (Filter/Kernel): Evrişim katmanında öğrenilen ağırlık matrisleridir (Örn: 3x3x3 boyutunda). Her filtre, girdide belirli bir deseni (yatay kenar, dikey kenar, renk bloğu) tespit etmek için eğitilir.
  • İşlem: Filtre, girdi görüntüsü üzerinde kaydırılır (slide). Her konumda, filtrenin değerleri altındaki girdi değerleriyle çarpılır ve sonuçlar toplanır. Bu, çıktıdaki tek bir piksel değerini (bir özellik) oluşturur.
  • Hiyerarşi: İlk katmanlardaki filtreler basit kenarları öğrenirken, daha derin katmanlardaki filtreler bu kenarları birleştirerek göz, kulak gibi karmaşık desenleri veya nesne parçalarını öğrenir.

$$\text{Evrişim Çıktısı} = \sum (\text{Girdi}_{\text{yerel}} \times \text{Filtre}) + \text{Bias}$$

2. Padding (Doldurma)

Evrişim işlemi, görüntünün kenarındaki piksellerin merkezdekilere göre daha az filtrelenmesine neden olur ve çıktının boyutunu küçültür. Padding, girdinin etrafına sıfırlar (veya başka değerler) ekleyerek bu sorunları çözer.

  • Valid Padding (Geçerli): Padding kullanılmaz. Çıktı boyutu küçülür.
  • Same Padding (Aynı): Yeterli sıfır eklenerek, çıktı boyutunun girdi boyutuna eşit olması sağlanır. En çok tercih edilen yöntemdir.

3. Stride (Adım)

Filtrenin girdi üzerinde kaçar piksel atlayarak kayacağını belirler. Stride değeri 1'den büyükse, çıktı haritasının boyutu küçülür.

4. Pooling İşlemi (Havuzlama)

Havuzlama katmanı, evrişim katmanının çıktısından (özellik haritasından) uzamsal boyutu (yükseklik ve genişlik) küçültmek için kullanılır. Bu, modelin işlem yükünü azaltır ve küçük varyasyonlara (görüntünün kayması gibi) karşı daha dayanıklı (robust) olmasını sağlar.

  • Max Pooling: Belirlenen pencere içindeki (Örn: 2x2) en büyük değeri seçer. En yaygın kullanılan havuzlama türüdür. Büyük değer, bir özelliğin o bölgede tespit edildiği anlamına gelir.
  • Average Pooling: Pencere içindeki değerlerin ortalamasını alır.

Örnek CNN Katmanları Dizilimi:

Tipik bir CNN bloğu şu sırayı takip eder:

$$\text{Giriş Tensörü} \rightarrow \text{CONV2D} \rightarrow \text{ReLU Aktivasyonu} \rightarrow \text{POOLING} \rightarrow \text{...}$$

Son Katman: Düzleştirme (Flatten)

CNN'de özellik çıkarma bittiğinde, çıkan 3D özellik haritası, nihai sınıflandırma için bir Vektöre (1D) düzleştirilir ve ardından standart Yoğun (Dense) katmanlara beslenir.

6.1 Zaman Serileri ve Sıralı Veri Analizi

Tekrarlayan Sinir Ağları (RNN), görüntü veya tablo verisi gibi bağımsız örnekler yerine, dizisel (sequential) verileri işlemek için tasarlanmıştır. Bu tür verilerde, bir önceki adımdaki bilgi, sonraki adımı anlamak için kritik öneme sahiptir.

Sıralı Veri (Sequence Data) Nedir?

Sıralı veri, öğeleri birbirine zaman, uzay veya mantıksal bir sıra ile bağlı olan veri türüdür. Örnekler:

  • Zaman Serileri: Hisse senedi fiyatları, hava durumu tahminleri, sensör verileri.
  • Doğal Dil: Cümleler, paragraflar (bir kelimenin anlamı önceki kelimelere bağlıdır).
  • Ses: Ses dalgalarının zaman içindeki sıralı örneklemleri.
  • DNA Dizileri: Genetik kodun harf dizisi.

Tekrarlayan Sinir Ağları (Recurrent Neural Networks - RNN)

FFN ve CNN'lerin aksine, RNN'ler bir "bellek" veya **Gizli Durum (Hidden State)** taşır. Bu gizli durum ($h_t$), ağın o ana kadar gördüğü tüm geçmiş bilginin bir özetidir. Her zaman adımında ($t$), ağ mevcut girdi $x_t$ ile önceki gizli durum $h_{t-1}$'i birleştirir ve yeni bir gizli durum $h_t$ üretir.

$$\text{Yeni Durum } h_t = f(W_{hh} h_{t-1} + W_{xh} x_t + b_h)$$

Burada $W_{hh}$ ve $W_{xh}$ aynı ağırlık matrisleridir. RNN, zaman boyunca **aynı ağırlıkları** tekrar tekrar kullandığı için "tekrarlayan" olarak adlandırılır. Bu ağırlık paylaşımı, modelin her pozisyonda aynı desenleri (dilbilgisi kuralları gibi) öğrenmesini sağlar.

RNN'lerin Zorlukları: Vanishing/Exploding Gradient

Klasik RNN'ler, uzun dizileri işlerken iki büyük problemle karşılaşır:

  • Kaybolan Gradyan (Vanishing Gradient): Geri yayılım sırasında gradyan (hata sinyali), zaman adımlarında geriye doğru yayıldıkça katlanarak küçülür. Bu, modelin ilk zaman adımlarındaki (uzak geçmişteki) bilgileri unutmasına neden olur.
  • Patlayan Gradyan (Exploding Gradient): Gradyan aşırı büyür ve ağırlık güncellemelerinin kontrolden çıkmasına (NaN değerleri) neden olur. (Bu, **Gradyan Kırpma/Clipping** ile kolayca çözülebilir, ancak Kaybolan Gradyan daha ciddi bir sorundur).

Bu sorunlar, klasik RNN'lerin uzun vadeli bağımlılıkları (uzun bir metindeki ilk cümlenin son cümleyi etkilemesi) öğrenmesini imkansız hale getirir. Bu, LSTM ve GRU gibi gelişmiş mimarilerin geliştirilmesine yol açmıştır (Bkz. 6.3).

Zaman Serisi Verisi Tensör Yapısı

Sıralı veri, üç boyutlu bir tensör olarak temsil edilir:

$$\text{Tensor Boyutu} = (\text{Batch Size}, \text{Zaman Adımı Sayısı}, \text{Özellik Sayısı})$$

Örn: 100 günlük 5 farklı hisse senedi fiyatını tahmin etmek için Batch Size 32 ise:

$$\text{Boyut} = (32, 100, 5)$$

6.3 LSTM (Long Short-Term Memory) ve GRU

LSTM (Uzun Kısa Süreli Bellek) ve GRU (Gated Recurrent Unit), klasik RNN'lerin kaybolan gradyan sorununu çözmek ve uzun vadeli bağımlılıkları etkin bir şekilde modellemek için tasarlanmış "Kapılı RNN" (Gated RNN) mimarileridir.

LSTM Mimarisi: Hücre Durumu ve Kapılar

LSTM, standart RNN'deki tek gizli durum vektörü yerine, iki ana durum vektörü kullanır:

  1. Gizli Durum ($h_t$): Anlık çıktı ve kısa süreli bilgiyi taşır (klasik RNN'deki gibi).
  2. Hücre Durumu ($C_t$): Uzun vadeli, kritik bilgiyi taşır. Bir taşıma bandı gibi, zaman adımları boyunca nispeten değişmeden akar.

LSTM, Hücre Durumu üzerinde bilgi akışını düzenlemek için üç ana **Kapı (Gate)** kullanır. Kapılar, Sigmoid aktivasyon fonksiyonu kullanılarak 0 ile 1 arasında değerler üreten küçük FFN'lerdir. Bu değerler, hangi bilginin geçmesine izin verileceğini (1) veya engelleneceğini (0) belirler.

  • Unutma Kapısı (Forget Gate - $f_t$): Önceki Hücre Durumundaki ($C_{t-1}$) hangi bilginin unutulması gerektiğini belirler.
  • Girdi Kapısı (Input Gate - $i_t$): Mevcut girdi ($x_t$) ve gizli durumun ($h_{t-1}$) hangi yeni bilginin Hücre Durumuna ekleneceğini belirler.
  • Çıktı Kapısı (Output Gate - $o_t$): Yeni Hücre Durumunun ($C_t$) ne kadarının mevcut Gizli Durumu ($h_t$) etkileyeceğini belirler.

Bu kapı mekanizması, gradyanın zaman boyunca daha stabil bir şekilde akmasını sağlar ve kaybolmasını önler. LSTM, uzun vadeli bağlamı (context) mükemmel bir şekilde korur.

GRU (Gated Recurrent Unit): Basitleştirilmiş Tasarım

GRU, 2014 yılında Cho ve arkadaşları tarafından sunulmuş, LSTM'nin daha basitleştirilmiş bir çeşididir. Amacı aynıdır: uzun vadeli bağımlılıkları çözmek.

Temel Farklar:

  • GRU, Hücre Durumu ve Gizli Durumu birleştirir, sadece tek bir Gizli Durum ($h_t$) kullanır.
  • Üç kapı yerine iki kapı kullanır:
    • Güncelleme Kapısı (Update Gate - $z_t$): Unutma ve Girdi kapılarının işlevlerini birleştirir. Geçmişin ne kadarının korunacağını ve mevcut bilginin ne kadarının dahil edileceğini kontrol eder.
    • Sıfırlama Kapısı (Reset Gate - $r_t$): Kısa vadeli geçmişin ne kadarının mevcut hesaplamayla birleştirileceğini kontrol eder.

GRU, daha az parametreye sahip olduğu için daha hızlı eğitilebilir ve daha az veri ile daha iyi performans gösterebilir. Performans açısından LSTM ile benzer sonuçlar verir, bu yüzden sıkça tercih edilir.

LSTM ve GRU Uygulama Alanları

Uygulama Alanı Neden LSTM/GRU?
Makine Çevirisi Uzun cümlelerdeki dilbilgisi ve anlam bağlarını korumak.
Hisse Senedi Tahmini Aylardır veya yıllardır süren eğilimleri hatırlamak.
Konuşma Tanıma Cümlenin başlangıcındaki sesleri cümlenin sonuyla ilişkilendirmek.

7.3 Transformer Mimarisi ve Dikkat (Attention) Mekanizması

2017 yılında Google tarafından sunulan Transformer mimarisi, RNN ve Kapılı RNN (LSTM/GRU) yapılarını geride bırakarak Doğal Dil İşleme (NLP) ve son zamanlarda Bilgisayarlı Görü (Vision Transformer - ViT) alanında devrim yarattı. Günümüzdeki büyük dil modellerinin (GPT, BERT) temelini oluşturur.

Transformer'ın Evrimi: RNN'leri Bırakma

Transformer, RNN'lerin iki temel sorununu çözer:

  1. **Kaybolan Gradyan Sorunu:** Kapalı RNN'ler sorunu hafifletse de tamamen çözemez. Transformer, Dikkat mekanizması sayesinde bu soruna tamamen farklı bir yaklaşımla yaklaşır.
  2. **Paralel Hesaplama Eksikliği:** RNN'ler sıralı (adım adım) hesaplama gerektirdiği için GPU'larda tam olarak paralel çalışamaz. Transformer, yine Dikkat mekanizması ve FFN katmanları sayesinde tamamen paralelleştirilebilir.

Dikkat (Attention) Mekanizması: Yeni Hafıza

Dikkat mekanizması, bir kelimeyi (veya görüntü parçasını) işlerken modelin, girdi dizisindeki hangi diğer kelimelere (veya parçalara) ne kadar odaklanması gerektiğini belirlemesini sağlar. Bu, kelimeler arasındaki **uzun vadeli bağımlılıkların** doğrudan ve paralel bir şekilde yakalanmasına olanak tanır.

Dikkat Mekanizmasının Bileşenleri (Q, K, V):

Dikkat fonksiyonu, bir sorgu (Query - $Q$), anahtarlar (Keys - $K$) ve değerler (Values - $V$) kullanılarak hesaplanır. Her bir kelimenin, diğer tüm kelimelerle olan ilişkisinin puanını hesaplar.

  • **Query (Sorgu):** İşlenen mevcut kelimenin temsilini (Örn: "O" zamiri).
  • **Keys (Anahtarlar):** Dizideki tüm diğer kelimelerin temsilini (Örn: "elma", "ağaç", "kesti").
  • **Values (Değerler):** Anahtarlarla eşleşen kelimelerin anlam içeriklerini.

$$\text{Attention}(Q, K, V) = \text{Softmax}(\frac{Q K^T}{\sqrt{d_k}}) V$$

Bu formül, her Query'nin tüm Key'ler ile benzerliğini hesaplar, bir skor üretir (Scaled Dot-Product Attention) ve bu skoru Softmax ile normalize ederek ağırlıklandırılmış bir Value toplamı (çıktı) oluşturur.

Transformer Mimarisi

Transformer, iki ana bloktan oluşur:

  1. **Encoder (Kodlayıcı):** Girdi dizisini (Örn: Cümle) alır ve her kelime için bağlamsal bir temsil (vektör) üretir. Birden fazla katmandan oluşur, her katman bir **Çoklu Başlı Dikkat (Multi-Head Attention)** ve bir FFN içerir.
  2. **Decoder (Kod Çözücü):** Encoder'ın çıktılarını ve önceki tahminleri alarak çıktı dizisini (Örn: Çevrilmiş Cümle) üretir. **Maskelenmiş Çoklu Başlı Dikkat** katmanı içerir (çözücünün gelecekteki kelimeleri görmesini engeller).

Bu mimari, uzun süreli bağımlılıkları öğrenirken paralelleşme yeteneği sayesinde DL'de hız ve performans açısından en önemli atılımdır.

8.2 Q-Learning ve Deep Q-Network (DQN)

Pekiştirmeli Öğrenme (RL), bir ajanın bir ortam içinde yaptığı eylemlerin sonucunda aldığı ödüllere göre optimal bir davranış politikası (policy) öğrenmesiyle ilgilenir. Q-Learning ve DQN, değer tabanlı RL algoritmalarının temelini oluşturur.

Q-Learning: Temel Değer İterasyonu

Q-Learning, **Q-fonksiyonu** adı verilen bir tablo (Q-Table) tutar. Bu fonksiyon, her olası durum ($s$) ve eylem ($a$) çifti için, ajanın o eylemi yapması durumunda gelecekte kazanabileceği beklenen maksimum toplam ödülü ($Q(s, a)$) depolar.

Bellman Denklemi ve Q-Güncelleme Kuralı:

Q-Learning, her adımda (durum $s \rightarrow$ eylem $a \rightarrow$ ödül $r \rightarrow$ yeni durum $s'$), Bellman denklemini kullanarak Q-tablosunu günceller:

$$\text{Yeni Q}(s, a) = (1 - \alpha) Q(s, a) + \alpha [r + \gamma \max_{a'} Q(s', a')]$$

Burada $\alpha$ öğrenme oranı, $\gamma$ ise İndirim Faktörüdür (gelecekteki ödüllerin ne kadar önemli olduğunu belirler).

Q-Learning, ajanın keşif (Exploration - rastgele eylemler) ve sömürü (Exploitation - en yüksek Q-değerli eylemi seçme) arasında bir denge kurmasını gerektirir (Genellikle $\epsilon$-greedy politikası kullanılır).

Deep Q-Network (DQN): DL ile Q-Learning

Q-Learning'in en büyük sorunu, durum ve eylem sayısı çok büyüdüğünde (Örn: Atari oyunları veya otonom sürüş) Q-tablosunun belleğe sığmaması ve kullanışsız hale gelmesidir.

DQN, DeepMind tarafından 2013 yılında sunulmuştur ve Q-tablosunu, bir yapay sinir ağı (Convolutional Neural Network - CNN) ile değiştirerek bu sorunu çözer. CNN, girdi olarak durum bilgisini (Oyun ekranının pikselleri) alır ve çıktı olarak her olası eylem için Q-değerlerini tahmin eder.

$$\text{Q-Network: } Q(s, a; \theta) \approx Q^*(s, a)$$

Burada $\theta$, sinir ağının ağırlıklarını temsil eder.

DQN'in İki Yenilikçi Mekanizması:

  1. Deneyim Tekrarı (Experience Replay): Ajanın her adımda yaşadığı durum-eylem-ödül-yeni durum dörtlüsü, bir bellek tamponuna (Replay Buffer) kaydedilir. Model, bu tampondan rastgele mini-batch'ler çekilerek eğitilir. Bu, veriler arasındaki korelasyonu azaltır ve eğitimin kararlılığını artırır.
  2. Hedef Ağ (Target Network): Q-değerlerini hesaplamak için iki farklı ağ kullanılır: Biri eğitilen ana ağ (Q-Network), diğeri ise güncellenmesi daha yavaş olan sabit Hedef Ağ ($\hat{Q}$-Network). Bu, eğitim hedefini sabitleyerek (temporarily fix the target) kararsızlığı azaltır ve yakınsamayı iyileştirir.

DQN, DL'in gücünü kullanarak karmaşık, yüksek boyutlu durum uzaylarında (pixel input) dahi başarılı bir şekilde öğrenen ilk algoritmalar arasındadır ve modern Deep RL'in önünü açmıştır.

9.2 Üretken Modeller: GAN’lar (Generative Adversarial Networks) ve Diffusion Modelleri

Üretken Derin Öğrenme (Generative Deep Learning), mevcut veri setine benzeyen, ancak daha önce görülmemiş yeni ve gerçekçi veriler (görüntü, metin, ses) üretmekle ilgilenir. Bu alandaki en etkili ve popüler mimariler GAN'lar ve Diffusion modelleridir.

1. Üretken Çekişmeli Ağlar (GAN’s)

Ian Goodfellow tarafından 2014 yılında tanıtılan GAN'lar, iki sinir ağının birbirine karşı oynadığı bir oyun (çekişmeli süreç) üzerine kuruludur. Bu, iki oyuncunun sıfır toplamlı bir oyunu olarak modellenebilir.

GAN'ın İki Bileşeni:

  1. Üretici (Generator - $G$): Rastgele gürültüyü (noise) girdi olarak alır ve bunu gerçekçi veri (görüntü) üretmeye çalışır. Amacı, **Ayırt Ediciyi kandırmaktır.**
  2. Ayırt Edici (Discriminator - $D$): Hem gerçek eğitim verisini hem de Üretici'nin ürettiği sahte veriyi alır. Amacı, **gerçek ile sahteyi ayırt etmektir.**

Eğitim Süreci (Minimax Oyunu):

  • $D$ eğitilir: $D$ gerçek veriyi gerçek (1), sahte veriyi sahte (0) olarak sınıflandırmayı öğrenir (Kaybı minimize eder).
  • $G$ eğitilir: $G$, ürettiği sahte verinin $D$ tarafından gerçek (1) olarak sınıflandırılmasını sağlamaya çalışır (Dolaylı olarak $D$'nin kaybını maksimize eder).

Bu sürekli çekişme, her iki ağı da geliştirir, ta ki $G$ mükemmel sahte veriler üretip $D$ artık gerçekle sahteyi ayırt edemez hale gelene kadar ($D$'nin tahmini %50 olur).

Avantajlar: Yüksek çözünürlüklü ve keskin görüntüler üretebilir.

Dezavantajlar: Eğitim süreci kararsızdır (Mode Collapse sorunu - üreticinin sadece tek bir tür çıktı üretmesi). Kurulumu zordur.

2. Diffusion Modelleri (Yayılma Modelleri)

Diffusion modelleri (Örn: Stable Diffusion, DALL-E 2'nin temel teknolojisi), günümüzde en yüksek kaliteli görüntü ve video üretimini sağlayan üretken model ailesidir. Temelleri 2015'e dayansa da, büyük ölçekli uygulamaları son birkaç yılda popülerleşmiştir.

Temel Prensip: İki Aşamalı Süreç

  1. İleri Yayılma (Forward Diffusion - Gürültü Ekleme): Gerçek bir görüntü ($x_0$), adım adım rastgele Gauss gürültüsü (noise) eklenerek tamamen saf gürültüye ($x_T$) dönüştürülür. Bu süreç basittir ve bilinen formüllerle yapılır.
  2. Ters Yayılma (Reverse Diffusion - Gürültüden Arındırma): Bu aşamada bir Derin Öğrenme modeli (genellikle U-Net tabanlı bir CNN), gürültüye batırılmış bir görüntüden ($x_t$), ona eklenen gürültüyü tahmin etmeyi öğrenir. Model, adım adım gürültüyü çıkararak saf gürültüden gerçek bir görüntüye ($x_T \rightarrow x_0$) geri döner.

Avantajlar:

  • Yüksek Kalite: Üretilen görüntüler olağanüstü detaylı ve fotogerçekçidir.
  • Kararlılık: Eğitim süreci GAN'lara göre çok daha kararlıdır.
  • Koşullu Üretim: Metin girdisi, Diffusion sürecinin bir parçası olarak entegre edilerek (Text-to-Image), üretimin kontrol edilmesi kolaylaşır.

Diffusion modelleri, karmaşık üretim görevlerinde geleceğin DL standardı olarak görülmektedir.