Writing

Micrograd Nedir?

1483 words8 min read

Yapay sinir ağları günümüzde yapay zeka alanının en temel bileşenlerinden biri haline geldi. Bu karmaşık görünen yapıları anlamak için bazen temel kavramlara dönmek gerekir. İşte tam bu noktada Andrej Karpathy'nin geliştirdiği "Micrograd" devreye giriyor. Bu blog yazısında, yapay sinir ağlarının çalışma prensiplerini anlamak için oluşturulmuş bu minimal kütüphaneyi inceleyecek ve otomatik diferansiyel hesaplamanın temellerini öğreneceğiz.

Micrograd Nedir?

Micrograd, yapay sinir ağlarının temelinde yatan otomatik diferansiyel (autograd) hesaplama sistemini anlamak için Andrej Karpathy tarafından geliştirilen kompakt bir Python kütüphanesidir. Toplam kod uzunluğu 150 satırdan az olan bu kütüphane, yapay sinir ağlarının nasıl çalıştığını ve öğrendiğini göstermek amacıyla tasarlanmıştır[1][2].

Micrograd'ın en etkileyici yanı, sadece iki Python dosyasından oluşmasıdır:

  • engine.py: Otomatik diferansiyel motorunu içeren ve Value sınıfını tanımlayan, 100 satırdan az kod
  • nn.py: Sinir ağının temel bileşenlerini (Neuron, Layer, MLP) tanımlayan, yaklaşık 60 satır kod[7]

Bu minimal yapısına rağmen Micrograd, temel bir sinir ağının eğitilmesi için gereken tüm bileşenleri içerir. PyTorch veya TensorFlow gibi endüstri standardı kütüphanelerin aksine, Micrograd'ın amacı performans değil, öğretici olmaktır.

micrograd_overview.png

Otomatik Diferansiyel (Autograd) Nedir?

Yapay sinir ağlarının öğrenme sürecinde en temel kavram, geri yayılım (backpropagation) algoritmasıdır. Bu algoritmanın kalbinde ise türev hesaplama, yani diferansiyel hesaplama yatar.

Otomatik diferansiyel, bir hesaplama grafiği üzerinde türevlerin otomatik olarak hesaplanmasını sağlayan bir yöntemdir. Basitçe açıklamak gerekirse:

  1. İleri yönde hesaplamalar yapılırken bir hesaplama grafiği oluşturulur.
  2. Bu grafik üzerinde, çıktıdan girdiye doğru, zincir kuralı uygulanarak türevler hesaplanır.
  3. Bu türevler kullanılarak model parametreleri güncellenir.

Micrograd, bu süreci anlamak için idealdir çünkü her adımı açık ve anlaşılır şekilde gösterir. computation_graph.png

Micrograd'ın Temel Bileşeni: Value Sınıfı

Micrograd'ın çekirdeğinde, otomatik diferansiyel motorunu sağlayan Value sınıfı bulunur. Bu sınıf, bir sayısal değeri ve bu değerin türevini (gradyanını) saklar. Ayrıca, hesaplama grafiğinde bu değerin hangi işlemlerden türetildiğini de kaydeder[1][4].

Her bir Value nesnesi şunları içerir:

  • Sayısal bir değer (data)
  • Gradyan değeri (grad)
  • Bu değerin elde edilmesinde kullanılan önceki değerler (_prev)
  • Geri yayılım sırasında çağrılacak fonksiyon (_backward)

Bu yapı sayesinde, ileri yönlü hesaplamalar yapılırken aynı zamanda geri yayılım için gerekli bilgiler de saklanır.

Temel Matematiksel İşlemler ve Türevleri

Micrograd, yapay sinir ağlarında kullanılan temel matematiksel işlemleri ve bunların türevlerini tanımlar:

Toplama İşlemi

İki değerin toplamı alındığında, toplanan her değerin gradyanı, sonucun gradyanına eşittir:

def __add__(self, other):
    other = other if isinstance(other, Value) else Value(other)
    out = Value(self.data + other.data, (self, other), '+')

    def _backward():
        # Zincir kuralı: dL/dself = dL/dout * dout/dself = out.grad * 1.0
        # Zincir kuralı: dL/dother = dL/dout * dout/dother = out.grad * 1.0
        self.grad += out.grad
        other.grad += out.grad
    out._backward = _backward

    return out

Çarpma İşlemi

Çarpma işleminin türevi, diğer değerle çarpma olduğundan (zincir kuralı ile):

def __mul__(self, other):
    other = other if isinstance(other, Value) else Value(other)
    out = Value(self.data * other.data, (self, other), '*')

    def _backward():
        # Zincir kuralı: dL/dself = dL/dout * dout/dself = out.grad * other.data
        # Zincir kuralı: dL/dother = dL/dout * dout/dother = out.grad * self.data
        self.grad += other.data * out.grad
        other.grad += self.data * out.grad
    out._backward = _backward

    return out

ReLU Aktivasyon Fonksiyonu

Yapay sinir ağlarında sıkça kullanılan ReLU fonksiyonu (Rectified Linear Unit):

def relu(self):
    # out = max(0, self.data)
    out = Value(max(0, self.data), (self,), 'ReLU')

    def _backward():
        # dReLU/dself = 1 if self.data > 0 else 0
        # Zincir kuralı: dL/dself = dL/dout * dReLU/dself
        self.grad += (out.data > 0) * out.grad
    out._backward = _backward

    return out

Bu temel işlemler, tüm karmaşık hesaplamaları yapmak için yeterlidir[1][4][7].

Micrograd ile Basit Bir Sinir Ağı İnşa Etmek

Micrograd'ın nn.py modülü, sinir ağlarının temel yapı taşlarını tanımlar:

Nöron (Neuron)

Bir nöron, girdileri alan, her birini bir ağırlıkla çarpan, bir bias değeri ekleyen ve sonucu bir aktivasyon fonksiyonundan (genellikle ReLU) geçiren bir birimdir:

class Neuron:
    def __init__(self, nin): # nin: number of inputs
        # Ağırlıklar ve bias rastgele başlatılır
        self.w = [Value(random.uniform(-1,1)) for _ in range(nin)]
        self.b = Value(random.uniform(-1,1))

    def __call__(self, x):
        # w * x + b (lineer kombinasyon)
        act = sum((wi * xi for wi, xi in zip(self.w, x)), self.b)
        # Aktivasyon fonksiyonu (ReLU)
        out = act.relu()
        return out

neuron_diagram.png

Katman (Layer)

Bir katman, paralel çalışan birden fazla nörondan oluşur:

class Layer:
    def __init__(self, nin, nout): # nin: input size, nout: output size (neuron count)
        self.neurons = [Neuron(nin) for _ in range(nout)]

    def __call__(self, x):
        # Katmandaki her nörondan gelen çıktılar bir liste olarak döndürülür
        outs = [n(x) for n in self.neurons]
        # Eğer çıktı tek bir nörondan oluşuyorsa, doğrudan değeri döndür
        return outs[0] if len(outs) == 1 else outs

Çok Katmanlı Algılayıcı (MLP)

MLP (Multi-Layer Perceptron), birden fazla katmanın ardışık bağlanmasıyla oluşur:

class MLP:
    def __init__(self, nin, nouts): # nin: input size, nouts: list of output sizes per layer
        # Girdi boyutu ve katman çıktı boyutlarını birleştir
        sz = [nin] + nouts
        # Katmanları oluştur (her katmanın girdi boyutu bir önceki katmanın çıktı boyutudur)
        self.layers = [Layer(sz[i], sz[i+1]) for i in range(len(nouts))]

    def __call__(self, x):
        # Girdiyi sırayla tüm katmanlardan geçir
        for layer in self.layers:
            x = layer(x)
        # Son katmanın çıktısını döndür
        return x

mlp_architecture.png Bu basit yapı taşları, karmaşık sinir ağlarının temelini oluşturur.

Geri Yayılım ve Öğrenme Süreci

Micrograd'ın güzelliği, geri yayılım algoritmasının çalışmasını açıkça göstermesinde yatar. Temel olarak şu adımlar izlenir:

  1. İleri Yayılım (Forward Pass): Girdiler ağ üzerinden geçirilerek bir çıktı (Value nesnesi) elde edilir.
  2. Kayıp Hesaplama: Çıktının hedeflenen değerlerden ne kadar farklı olduğu hesaplanır (genellikle başka bir Value nesnesi olarak).
  3. Geri Yayılım (Backward Pass): Kayıp Value nesnesinden başlayarak .backward() metodu çağrılır. Bu, hesaplama grafiğindeki tüm parametrelere (Value nesneleri) göre kaybın türevlerini (gradyanları) hesaplar.
  4. Parametre Güncelleme: Parametrelerin (w ve b Value nesneleri) data değerleri, hesaplanan gradyanlar (grad değerleri) kullanılarak güncellenir (genellikle param.data -= learning_rate * param.grad formülü ile).

Geri yayılım sırasında, hesaplama grafiğindeki her düğüm için tanımlanan _backward fonksiyonları, topolojik sıra ile sondan başa doğru çağrılır. Bu, zincir kuralının otomatik olarak uygulanarak türevlerin verimli bir şekilde hesaplanmasını sağlar[1][7].

Micrograd'ın Farklı Dillerdeki Uygulamaları

Micrograd'ın eğitici değeri o kadar yüksektir ki, farklı programlama dillerinde de uygulamaları yapılmıştır:

  • Rust: Hesaplama grafiklerini oluşturmak ve otomatik diferansiyel hesaplamalarını yapmak için Rust dilinde uyarlamalar mevcuttur[8].
  • C: Hafif bir C implementasyonu, otomatik diferansiyel kavramlarını düşük seviyeli bir dilde de göstermeyi amaçlar[3].
  • Julia: Julia programlama dilinin fonksiyonel programlama, çoklu dağıtım ve meta-programlama özelliklerini kullanarak Micrograd benzeri bir kütüphane oluşturulmuştur[9].
  • TypeScript/JavaScript: Web geliştiricileri için benzer prensiplerle implementasyonlar yapılmıştır[14].
  • C++: Performans ve tip güvenliği arayanlar için C++ versiyonları da bulunmaktadır[22].

Bu farklı dil uygulamaları, otomatik diferansiyel kavramının evrenselliğini ve yapay sinir ağlarının temel prensiplerinin programlama dilinden bağımsız olduğunu gösterir.

Mikrograd'ın Eğitim ve Öğrenim Değeri

Mikrograd, adından da anlaşılacağı gibi, mikro ölçekte bir öğrenme aracıdır. Bu açıdan, modern eğitim anlayışında giderek yaygınlaşan mikro öğrenme kavramıyla da paralellik gösterir. Mikro öğrenme, bilginin kısa, öz ve yoğunlaştırılmış parçalar halinde aktarılmasını sağlayan bir yöntemdir[5].

Mikrograd da benzer şekilde, karmaşık yapay zeka kavramlarını küçük, anlaşılabilir parçalara bölerek sunmaktadır. Bu yaklaşım, öğrencilerin dikkat dağınıklığı ve zamansızlık gibi problemlerini aşmalarına yardımcı olur, çünkü konuyu kısa ve etkileyici bölümler halinde kavramalarını sağlar. Kütüphanenin minimal yapısı, temel mekanizmalara odaklanmayı kolaylaştırır.

Sonuç ve İleri Adımlar

Micrograd, yapay sinir ağlarının çalışma prensiplerini anlamak için mükemmel bir başlangıç noktasıdır. Sadece ~150 satır Python kodu ile yapay zeka dünyasının temel yapı taşlarını gözler önüne serer. Bu minimalist yaklaşım, konuya yeni başlayanlar için karmaşık kavramları daha erişilebilir hale getirir.

Eğer yapay sinir ağlarının nasıl çalıştığını ve öğrendiğini anlamak istiyorsanız, Micrograd kodunu incelemek ve adım adım çalıştırmak (örneğin Andrej Karpathy'nin ilgili YouTube videosunu [25] izleyerek) son derece faydalı olacaktır. Daha sonra PyTorch veya TensorFlow gibi daha kapsamlı kütüphanelere geçiş yaptığınızda, altta yatan mekanizmaları çok daha iyi anlayacaksınız.

Kendinizi daha da geliştirmek için:

  1. Micrograd'ı kendi başınıza sıfırdan yazmayı deneyin.
  2. Farklı aktivasyon fonksiyonları (tanh, sigmoid vb.) ekleyin ve bunların türevlerini Value sınıfına uygulayın.
  3. Daha karmaşık ağ mimarileri (örneğin, birden fazla çıkışı olan veya farklı katman yapıları) oluşturun.
  4. Basit bir optimizasyon algoritması (Stokastik Gradyan İnişi - SGD) uygulayın.
  5. Performansı artırmak için olası optimizasyonları (örneğin, işlemleri vektörleştirmek - Micrograd bunun için tasarlanmamış olsa da kavramsal olarak düşünmek faydalıdır) düşünün.

Unutmayın, büyük yapay zeka sistemleri bile temelde bu basit prensiplere dayanır. Temel prensipleri anladığınızda, sınırsız olasılıklar sizi bekliyor olacak.

Kaynakça

  1. PyImageSearch. (2022). Automatic Differentiation Part 2: Implementation Using Micrograd.
  2. Lombard, A. (2022). Building Andrej Karpathy's micrograd from scratch - GitHub.
  3. Shukla, P. (2024). A Simple imitation of micrograd by karpathy - GitHub (C Implementation).
  4. EurekaLabsAI. (2024). EurekaLabsAI/micrograd: The Autograd Engine - GitHub (Fork/Example).
  5. EtgiGrup. (2019). Mikro Öğrenme.
  6. Academia.edu. (2020). Türkçe Eğitiminde Mikro-Öğretim Uygulamalarının Etkililiği. (Mikro-öğretim kavramı ile ilgili genel bilgi)
  7. Dev.to. (2025). Understanding Backpropagation from Scratch with micrograd.
  8. Alpha's Manifesto. (2025). Alpha's Micrograd in Rust.
  9. Julia Packages. (2024). MicroGrad · Julia Packages.
  10. Karpathy, A. Micrograd GitHub Repository (Original).
  11. Karpathy, A. (2022). The spelled-out intro to neural networks and backpropagation: building micrograd. YouTube.
  12. Trekhleb, O. (2023). Rebuilding Micrograd engine in TypeScript.
  13. Fish, K. (2023). Micrograd in C++.