<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://program.sonsuz.us/feed.xml" rel="self" type="application/atom+xml" /><link href="https://program.sonsuz.us/" rel="alternate" type="text/html" /><updated>2026-09-26T18:05:45+00:00</updated><id>https://program.sonsuz.us/feed.xml</id><title type="html">SonsuzUs</title><subtitle>Programlama ve Yazılım</subtitle><author><name>Sonsuz Us</name></author><entry><title type="html">Active Learning: Modelin Etiket Seçme Sanatı</title><link href="https://program.sonsuz.us/posts/active-learning-modelin-etiket-secme-sanati/" rel="alternate" type="text/html" title="Active Learning: Modelin Etiket Seçme Sanatı" /><published>2026-09-26T00:00:00+00:00</published><updated>2026-09-26T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/active-learning-modelin-etiket-secme-sanati</id><content type="html" xml:base="https://program.sonsuz.us/posts/active-learning-modelin-etiket-secme-sanati/"><![CDATA[<p><img src="/img/active-learning-modelin-37.svg" alt="active-learning-modelin-37" /></p>

<p>Elinizde milyonlarca kedi, köpek ve muhtemelen ne olduğu yalnızca biyologların anlayabileceği canlı fotoğrafı olduğunu düşünün. Bunların hepsini insanlara etiketletmek pahalı ve yavaştır. Active Learning, yani aktif öğrenme, modelin kalabalığın içinden öğrenmeye en çok katkı sağlayacak örnekleri seçip uzmana “Şuna bir bakar mısın?” demesidir.
``</p>

<h2 id="active-learning-nedir">Active Learning nedir?</h2>

<p>Klasik denetimli öğrenmede etiketli bir veri kümesi hazırlanır ve model bu kümenin tamamıyla eğitilir. Aktif öğrenmede ise başlangıçta yalnızca küçük bir etiketli küme bulunur. Model eğitildikten sonra etiketsiz veri havuzunu inceler, en faydalı gördüğü örnekleri seçer ve bunları bir insan uzmana gönderir.</p>

<p>Döngü genel olarak şöyledir:</p>

<ol>
  <li>Küçük bir başlangıç kümesini etiketle.</li>
  <li>Modeli bu verilerle eğit.</li>
  <li>Etiketsiz örnekler üzerinde tahmin yap.</li>
  <li>En belirsiz veya bilgilendirici örnekleri seç.</li>
  <li>İnsan uzmanından etiket iste.</li>
  <li>Yeni etiketleri eğitim kümesine ekleyip modeli yeniden eğit.</li>
</ol>

<p>Bu süreç, etiket bütçesi bitene veya model hedeflenen başarıya ulaşana kadar devam eder. Amaç daha fazla veri kullanmak değil, <strong>doğru veriyi etiketlemektir</strong>.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Etiketlenecek veriyi kim seçer?</th>
      <th style="text-align: right">Maliyet</th>
      <th style="text-align: right">Veri verimliliği</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Rastgele örnekleme</td>
      <td>Rastgele seçim</td>
      <td style="text-align: right">Orta</td>
      <td style="text-align: right">Düşük</td>
    </tr>
    <tr>
      <td>Tam etiketleme</td>
      <td>İnsan veya veri sağlayıcı</td>
      <td style="text-align: right">Çok yüksek</td>
      <td style="text-align: right">Değişken</td>
    </tr>
    <tr>
      <td>Active Learning</td>
      <td>Model ve uzman birlikte</td>
      <td style="text-align: right">Daha düşük</td>
      <td style="text-align: right">Yüksek</td>
    </tr>
  </tbody>
</table>

<h2 id="model-hangi-örnekleri-sorar">Model hangi örnekleri sorar?</h2>

<p>En yaygın yöntem <strong>belirsizlik örneklemesi</strong>dir. İkili sınıflandırmada model bir örnek için $P(y=1\mid x)=0.51$ üretiyorsa oldukça kararsızdır. Buna karşılık $0.99$ olasılıklı bir tahmin model açısından kolaydır. Etiket bütçesini kolay örneğe harcamak yerine kararsız örneği uzmana göndermek daha mantıklıdır.</p>

<p>Çok sınıflı problemlerde entropi kullanılabilir:</p>

\[H(x)=-\sum_{i=1}^{K}p_i(x)\log p_i(x)\]

<p>Burada $K$ sınıf sayısını, $p_i(x)$ ise örneğin $i$ sınıfına ait olma olasılığını gösterir. Entropi büyüdükçe tahmin dağılımı daha kararsız hâle gelir.</p>

<table>
  <thead>
    <tr>
      <th>Strateji</th>
      <th>Temel fikir</th>
      <th>Güçlü yönü</th>
      <th>Riski</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>En düşük güven</td>
      <td>En düşük maksimum olasılığı seçer</td>
      <td>Basit ve hızlı</td>
      <td>Dağılımı tam değerlendirmez</td>
    </tr>
    <tr>
      <td>Marjin örnekleme</td>
      <td>En yüksek iki olasılığın farkına bakar</td>
      <td>Sınıf sınırlarını bulur</td>
      <td>Gürültüden etkilenebilir</td>
    </tr>
    <tr>
      <td>Entropi</td>
      <td>Tüm sınıf olasılıklarını kullanır</td>
      <td>Çok sınıflı işlerde etkilidir</td>
      <td>Kalibre edilmemiş olasılıklar yanıltabilir</td>
    </tr>
    <tr>
      <td>Komiteyle sorgulama</td>
      <td>Birden fazla modelin anlaşamadığı örnekleri seçer</td>
      <td>Model çeşitliliğinden yararlanır</td>
      <td>Hesaplama maliyeti yüksektir</td>
    </tr>
  </tbody>
</table>

<h2 id="python-ile-basit-seçim">Python ile basit seçim</h2>

<p>Aşağıdaki kod, sınıf olasılıklarının entropisini hesaplar ve en belirsiz üç örneği seçer:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">numpy</span> <span class="k">as</span> <span class="n">np</span>

<span class="c1"># Her satır bir örneğin sınıf olasılıklarını temsil eder.
</span><span class="n">probabilities</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">array</span><span class="p">([</span>
    <span class="p">[</span><span class="mf">0.90</span><span class="p">,</span> <span class="mf">0.08</span><span class="p">,</span> <span class="mf">0.02</span><span class="p">],</span>
    <span class="p">[</span><span class="mf">0.34</span><span class="p">,</span> <span class="mf">0.33</span><span class="p">,</span> <span class="mf">0.33</span><span class="p">],</span>
    <span class="p">[</span><span class="mf">0.55</span><span class="p">,</span> <span class="mf">0.40</span><span class="p">,</span> <span class="mf">0.05</span><span class="p">],</span>
    <span class="p">[</span><span class="mf">0.45</span><span class="p">,</span> <span class="mf">0.10</span><span class="p">,</span> <span class="mf">0.45</span><span class="p">],</span>
    <span class="p">[</span><span class="mf">0.80</span><span class="p">,</span> <span class="mf">0.10</span><span class="p">,</span> <span class="mf">0.10</span><span class="p">]</span>
<span class="p">])</span>

<span class="k">def</span> <span class="nf">entropy</span><span class="p">(</span><span class="n">probs</span><span class="p">):</span>
    <span class="n">safe_probs</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">clip</span><span class="p">(</span><span class="n">probs</span><span class="p">,</span> <span class="mf">1e-12</span><span class="p">,</span> <span class="mf">1.0</span><span class="p">)</span>
    <span class="k">return</span> <span class="o">-</span><span class="n">np</span><span class="p">.</span><span class="nf">sum</span><span class="p">(</span><span class="n">safe_probs</span> <span class="o">*</span> <span class="n">np</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="n">safe_probs</span><span class="p">),</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>

<span class="n">scores</span> <span class="o">=</span> <span class="nf">entropy</span><span class="p">(</span><span class="n">probabilities</span><span class="p">)</span>
<span class="n">query_indices</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">argsort</span><span class="p">(</span><span class="n">scores</span><span class="p">)[</span><span class="o">-</span><span class="mi">3</span><span class="p">:][::</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>

<span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">Uzmanlara gönderilecek örnekler:</span><span class="sh">"</span><span class="p">,</span> <span class="n">query_indices</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">Belirsizlik puanları:</span><span class="sh">"</span><span class="p">,</span> <span class="n">scores</span><span class="p">[</span><span class="n">query_indices</span><span class="p">])</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">np.clip</code>, sıfır olasılığın logaritmasını alma sorununu önler. En yüksek entropiye sahip indeksler, insan uzmanına gönderilecek adaylardır. Gerçek projede bu indekslere karşılık gelen metinler, görüntüler veya kayıtlar bir etiketleme arayüzünde gösterilir.</p>

<h2 id="her-belirsiz-örnek-faydalı-mı">Her belirsiz örnek faydalı mı?</h2>

<p>Hayır. Model bazen bozuk görüntülere, anlamsız metinlere veya dağılım dışı verilere de aşırı belirsizlik gösterebilir. Bu nedenle çeşitlilik örneklemesi, kümeleme ve kalite filtreleri kullanılmalıdır. Aynı türden yüz kararsız örneği seçmek yerine farklı bölgeleri temsil eden örnekler tercih edilmelidir.</p>

<p>Ayrıca insan uzmanların hata yapabileceği unutulmamalıdır. Birden fazla uzmanın görüşü, uzlaşma ölçümleri ve düzenli kalite kontrolleri sürece eklenebilir. Başarılı bir Active Learning sistemi yalnızca akıllı bir sorgu algoritması değil; model, veri altyapısı ve insan uzman arasında kurulmuş geri bildirim döngüsüdür. Böylece model sessizce veri yutmak yerine, gerçekten merak ettiği soruları sormayı öğrenir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="active learning" /><category term="makine öğrenmesi" /><category term="yapay zeka" /><category term="veri etiketleme" /><category term="python" /><category term="belirsizlik örneklemesi" /><summary type="html"><![CDATA[Elinizde milyonlarca kedi, köpek ve muhtemelen ne olduğu yalnızca biyologların anlayabileceği canlı fotoğrafı olduğunu düşünün. Bunların hepsini insanlara etiketletmek pahalı ve yavaştır. Active Learning, yani aktif öğrenme, modelin kalabalığın içinden öğrenmeye en çok katkı sağlayacak örnekleri seçip uzmana “Şuna bir bakar mısın?” demesidir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/active-learning-modelin-37.png" /><media:content medium="image" url="https://program.sonsuz.us/img/active-learning-modelin-37.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Contrastive Learning ve SimCLR: Etiketsiz Görsellerden Benzerlik Öğrenmek</title><link href="https://program.sonsuz.us/posts/contrastive-learning-ve-simclr-etiketsiz-gorsellerden-benzerlik-ogrenmek/" rel="alternate" type="text/html" title="Contrastive Learning ve SimCLR: Etiketsiz Görsellerden Benzerlik Öğrenmek" /><published>2026-09-26T00:00:00+00:00</published><updated>2026-09-26T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/contrastive-learning-ve-simclr-etiketsiz-gorsellerden-benzerlik-ogrenmek</id><content type="html" xml:base="https://program.sonsuz.us/posts/contrastive-learning-ve-simclr-etiketsiz-gorsellerden-benzerlik-ogrenmek/"><![CDATA[<p><img src="/img/contrastive-learning-ve-41.svg" alt="contrastive-learning-ve-41" /></p>

<p>Bir makineye binlerce kedi fotoğrafı gösterdiğinizi, fakat hiçbirine “kedi” etiketi koymadığınızı düşünün. Makine yine de kulak, tüy ve yüz şekli gibi ortak özellikleri keşfedebilir mi? Contrastive Learning, yani karşılaştırmalı öğrenme, tam olarak bunu hedefler: Benzer örnekleri temsil uzayında birbirine yaklaştırır, farklı örnekleri ise uzaklaştırır. SimCLR da bu fikri şaşırtıcı derecede sade bir eğitim düzenine dönüştüren popüler yöntemlerden biridir.
``</p>

<h2 id="temel-fikir-etiket-yerine-karşılaştırma">Temel fikir: Etiket yerine karşılaştırma</h2>

<p>Geleneksel denetimli öğrenmede model, bir görseli sınıf etiketiyle eşleştirir. Karşılaştırmalı öğrenmede ise “Bu nedir?” sorusundan önce “Bu iki görüntü aynı şeye mi ait?” sorusu sorulur. Böylece veri kendi eğitim sinyalini üretir.</p>

<p>Bir fotoğrafa rastgele kırpma, döndürme, renk değiştirme veya bulanıklaştırma uygulandığında iki farklı görünüm elde edilir. Bunlar <strong>pozitif çift</strong> kabul edilir. Aynı mini-batch içindeki diğer fotoğraflar ise genellikle <strong>negatif örneklerdir</strong>.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Eğitim sinyali</th>
      <th>Amaç</th>
      <th>Etiket ihtiyacı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Denetimli öğrenme</td>
      <td>İnsan tarafından verilen sınıf</td>
      <td>Doğru sınıfı tahmin etmek</td>
      <td>Yüksek</td>
    </tr>
    <tr>
      <td>Contrastive Learning</td>
      <td>Örnekler arasındaki ilişki</td>
      <td>Yararlı temsil öğrenmek</td>
      <td>Yok veya çok düşük</td>
    </tr>
    <tr>
      <td>SimCLR</td>
      <td>Artırılmış görüntü çiftleri</td>
      <td>Aynı görüntünün görünümlerini yaklaştırmak</td>
      <td>Yok</td>
    </tr>
  </tbody>
</table>

<p>Model, her görseli bir vektöre dönüştürür. İki temsil arasındaki benzerlik çoğunlukla kosinüs benzerliğiyle ölçülür:</p>

\[sim(a,b) = \frac{a \cdot b}{\Vert a\Vert \,\Vert b\Vert }\]

<p>Vektörler aynı yönü gösteriyorsa sonuç 1’e yaklaşır; birbirlerinden farklı yönlerdeyse küçülür. Yani sistem, pikselleri ezberlemek yerine anlamlı bir geometrik harita oluşturmaya çalışır.</p>

<h2 id="simclr-nasıl-çalışır">SimCLR nasıl çalışır?</h2>

<p>SimCLR boru hattı dört temel parçadan oluşur:</p>

<ol>
  <li>Batch içindeki her görüntüden iki rastgele görünüm üretilir.</li>
  <li>Görünümler, ResNet gibi bir encoder üzerinden geçirilerek $h$ temsilleri elde edilir.</li>
  <li>Küçük bir projection head, bu temsilleri $z$ uzayına taşır.</li>
  <li>Contrastive loss, pozitif çiftleri yaklaştırırken diğer örnekleri uzaklaştırır.</li>
</ol>

<p>SimCLR’da sık kullanılan NT-Xent kaybının sadeleştirilmiş biçimi şöyledir:</p>

\[L_{i,j} = -\log \frac{e^{sim(z_i,z_j)/t}}{\sum_{k \ne i} e^{sim(z_i,z_k)/t}}\]

<p>Buradaki $t$ sıcaklık parametresidir. Küçük sıcaklık, modelin benzerlik farklarına daha sert tepki vermesini sağlar. Pay kısmında pozitif eşleşme, paydada ise aday eşleşmeler bulunur. Kısacası modelden kalabalık içinde doğru “ikizi” bulması istenir.</p>

<h2 id="pytorch-ile-sade-bir-loss-örneği">PyTorch ile sade bir loss örneği</h2>

<p>Aşağıdaki kod, iki görünümün temsillerini normalize eder ve doğru çiftleri çapraz entropiyle öne çıkarır:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">torch</span>
<span class="kn">import</span> <span class="n">torch.nn.functional</span> <span class="k">as</span> <span class="n">F</span>

<span class="k">def</span> <span class="nf">contrastive_loss</span><span class="p">(</span><span class="n">z1</span><span class="p">,</span> <span class="n">z2</span><span class="p">,</span> <span class="n">temperature</span><span class="o">=</span><span class="mf">0.5</span><span class="p">):</span>
    <span class="n">z1</span> <span class="o">=</span> <span class="n">F</span><span class="p">.</span><span class="nf">normalize</span><span class="p">(</span><span class="n">z1</span><span class="p">,</span> <span class="n">dim</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
    <span class="n">z2</span> <span class="o">=</span> <span class="n">F</span><span class="p">.</span><span class="nf">normalize</span><span class="p">(</span><span class="n">z2</span><span class="p">,</span> <span class="n">dim</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>

    <span class="n">logits</span> <span class="o">=</span> <span class="n">z1</span> <span class="o">@</span> <span class="n">z2</span><span class="p">.</span><span class="n">T</span> <span class="o">/</span> <span class="n">temperature</span>
    <span class="n">labels</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="nf">arange</span><span class="p">(</span><span class="n">z1</span><span class="p">.</span><span class="nf">size</span><span class="p">(</span><span class="mi">0</span><span class="p">),</span> <span class="n">device</span><span class="o">=</span><span class="n">z1</span><span class="p">.</span><span class="n">device</span><span class="p">)</span>

    <span class="n">loss_1</span> <span class="o">=</span> <span class="n">F</span><span class="p">.</span><span class="nf">cross_entropy</span><span class="p">(</span><span class="n">logits</span><span class="p">,</span> <span class="n">labels</span><span class="p">)</span>
    <span class="n">loss_2</span> <span class="o">=</span> <span class="n">F</span><span class="p">.</span><span class="nf">cross_entropy</span><span class="p">(</span><span class="n">logits</span><span class="p">.</span><span class="n">T</span><span class="p">,</span> <span class="n">labels</span><span class="p">)</span>
    <span class="nf">return </span><span class="p">(</span><span class="n">loss_1</span> <span class="o">+</span> <span class="n">loss_2</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span>
</code></pre></div></div>

<p>Matrisin köşegenindeki elemanlar doğru pozitif çiftlerdir. Fonksiyon iki yönü de hesaplayarak birinci görünümden ikinciyi ve ikinci görünümden birinciyi bulmayı öğretir. Gerçek SimCLR uygulamalarında aynı görünümün kendisiyle karşılaştırılması maskelenir ve batch içindeki tüm $2N$ temsil değerlendirilir.</p>

<h2 id="neden-veri-artırma-bu-kadar-önemli">Neden veri artırma bu kadar önemli?</h2>

<p>Model yalnızca kırpılmış iki görüntüyü eşleştirirse konuma, yalnızca renk değişimini görürse renge bağımlı olabilir. Güçlü ve çeşitli dönüşümler, modele “Renk değişse de nesne aynı kalabilir” fikrini öğretir.</p>

<table>
  <thead>
    <tr>
      <th>Dönüşüm</th>
      <th>Öğretilen dayanıklılık</th>
      <th>Olası risk</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Rastgele kırpma</td>
      <td>Konum ve ölçek değişimi</td>
      <td>Ana nesneyi kaybetmek</td>
    </tr>
    <tr>
      <td>Renk bozma</td>
      <td>Işık ve ton değişimi</td>
      <td>Sınıfa ait renk bilgisini silmek</td>
    </tr>
    <tr>
      <td>Bulanıklaştırma</td>
      <td>Doku değişimi</td>
      <td>İnce ayrıntıları yok etmek</td>
    </tr>
  </tbody>
</table>

<p>Eğitim tamamlandığında projection head genellikle atılır; encoder’dan çıkan temsiller sınıflandırma, benzer görsel arama veya kümeleme gibi görevlerde kullanılır. SimCLR’ın sihri aslında sihir değildir: İyi veri artırma, yeterince büyük batch ve doğru kayıp fonksiyonunun uyumlu çalışmasıdır. Etiketsiz bir fotoğraf arşivi böylece sessiz bir veri yığınından, kendi benzerlik dilini öğreten güçlü bir öğretmene dönüşür.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="contrastive learning" /><category term="simclr" /><category term="derin öğrenme" /><category term="bilgisayarlı görü" /><category term="yapay zeka" /><category term="self-supervised learning" /><summary type="html"><![CDATA[Bir makineye binlerce kedi fotoğrafı gösterdiğinizi, fakat hiçbirine “kedi” etiketi koymadığınızı düşünün. Makine yine de kulak, tüy ve yüz şekli gibi ortak özellikleri keşfedebilir mi? Contrastive Learning, yani karşılaştırmalı öğrenme, tam olarak bunu hedefler: Benzer örnekleri temsil uzayında birbirine yaklaştırır, farklı örnekleri ise uzaklaştırır. SimCLR da bu fikri şaşırtıcı derecede sade bir eğitim düzenine dönüştüren popüler yöntemlerden biridir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/contrastive-learning-ve-41.png" /><media:content medium="image" url="https://program.sonsuz.us/img/contrastive-learning-ve-41.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">DDPM: Gürültüden Şahesere Giden Matematiksel Yolculuk</title><link href="https://program.sonsuz.us/posts/ddpm-gurultuden-sahesere-giden-matematiksel-yolculuk/" rel="alternate" type="text/html" title="DDPM: Gürültüden Şahesere Giden Matematiksel Yolculuk" /><published>2026-09-26T00:00:00+00:00</published><updated>2026-09-26T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/ddpm-gurultuden-sahesere-giden-matematiksel-yolculuk</id><content type="html" xml:base="https://program.sonsuz.us/posts/ddpm-gurultuden-sahesere-giden-matematiksel-yolculuk/"><![CDATA[<p>Bir televizyonun çekmediği kanaldaki karıncalanmayı düşünün. Şimdi bu rastgele piksellerin yavaşça bir kediye, uzay gemisine veya Van Gogh esintili bir manzaraya dönüştüğünü hayal edin. Denoising Diffusion Probabilistic Models, yani DDPM, tam olarak bunu yapar: Veriyi kontrollü biçimde gürültüye dönüştürmeyi öğrenir ve ardından zamanı tersine sararak gürültüden yeni görüntüler üretir.
``</p>
<h2 id="termodinamikten-gelen-temel-fikir">Termodinamikten gelen temel fikir</h2>

<p>Difüzyon, fiziksel sistemlerin zamanla daha düzensiz hâle gelmesini anlatır. Bir bardak suya damlatılan mürekkebin kendiliğinden yayılması bunun klasik örneğidir. Başlangıçtaki düzen kaybolurken sistemin entropisi artar. DDPM de gerçek bir görüntüye küçük miktarlarda Gauss gürültüsü ekleyerek benzer bir süreç kurar.</p>

<p>Model iki ayrı süreçten oluşur:</p>

<table>
  <thead>
    <tr>
      <th>Süreç</th>
      <th>Yön</th>
      <th>Amaç</th>
      <th>Öğreniliyor mu?</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>İleri difüzyon</td>
      <td>Görüntüden gürültüye</td>
      <td>Veriyi aşamalı olarak bozmak</td>
      <td>Hayır</td>
    </tr>
    <tr>
      <td>Ters difüzyon</td>
      <td>Gürültüden görüntüye</td>
      <td>Gürültüyü aşamalı olarak temizlemek</td>
      <td>Evet</td>
    </tr>
  </tbody>
</table>

<p><img src="/img/ddpm-gurultuden-sahesere-67.svg" alt="ddpm-gurultuden-sahesere-67" /></p>

<p>İleri süreç mürekkebin suya yayılması kadar kolaydır. Asıl marifet, yayılmış mürekkebi yeniden tek bir damlada toplamak gibi davranan ters süreçtedir.</p>

<h2 id="i̇leri-difüzyon-görüntüyü-kontrollü-bozmak">İleri difüzyon: Görüntüyü kontrollü bozmak</h2>

<p>Temiz görüntüyü $x_0$ ile gösterelim. Her $t$ adımında görüntüye, miktarı bir varyans çizelgesiyle belirlenen gürültü eklenir:</p>

\[q(x_t\mid x_{t-1})=\mathcal{N}(x_t;\sqrt{1-\beta_t}x_{t-1},\beta_tI)\]

<p>Buradaki $\beta_t$, ilgili adımdaki gürültü miktarıdır. Küçük değerler görüntünün yavaşça bozulmasını sağlar. Güzel tarafı, yüzlerce adımı sırayla çalıştırmadan herhangi bir $t$ anına doğrudan sıçrayabilmemizdir:</p>

\[x_t=\sqrt{\bar{\alpha}_t}x_0+\sqrt{1-\bar{\alpha}_t}\epsilon\]

<p>Burada $\alpha_t=1-\beta_t$, $\bar{\alpha}<em>t=\prod</em>{s=1}^{t}\alpha_s$ ve $\epsilon\sim\mathcal{N}(0,I)$ olur. İlk terim korunmuş görüntüyü, ikinci terim eklenen rastgeleliği temsil eder.</p>

<table>
  <thead>
    <tr>
      <th>Zaman</th>
      <th style="text-align: right">Görüntü bilgisi</th>
      <th style="text-align: right">Gürültü</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>$t=0$</td>
      <td style="text-align: right">Çok yüksek</td>
      <td style="text-align: right">Yok</td>
    </tr>
    <tr>
      <td>Orta adımlar</td>
      <td style="text-align: right">Kısmen görünür</td>
      <td style="text-align: right">Orta</td>
    </tr>
    <tr>
      <td>$t=T$</td>
      <td style="text-align: right">Neredeyse yok</td>
      <td style="text-align: right">Çok yüksek</td>
    </tr>
  </tbody>
</table>

<h2 id="ters-süreç-gürültüyü-tahmin-etmek">Ters süreç: Gürültüyü tahmin etmek</h2>

<p>Model, $x_t$ görüntüsünü ve zaman adımı $t$ değerini alarak eklenmiş gürültüyü tahmin eder. Genellikle omurgada, farklı çözünürlüklerde ayrıntı yakalayabilen bir <strong>U-Net</strong> bulunur. Sinir ağı $\epsilon_\theta(x_t,t)$ tahminini üretir; bu tahmin kullanılarak biraz daha temiz olan $x_{t-1}$ hesaplanır.</p>

<p>Eğitim kaybı şaşırtıcı derecede sadedir:</p>

\[L=\mathbb{E}_{x_0,t,\epsilon}\left[\lVert\epsilon-\epsilon_\theta(x_t,t)\rVert^2\right]\]

<p>Başka bir deyişle model, gerçek gürültü ile tahmin ettiği gürültü arasındaki karesel farkı küçültür. Görüntünün kendisini ezberlemek yerine her bozulma seviyesinde hangi parçanın rastgele olduğunu öğrenir.</p>

<p>Aşağıdaki PyTorch benzeri kod, tek bir eğitim adımının özünü gösterir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">torch</span>

<span class="c1"># Her örnek için rastgele bir difüzyon zamanı seçilir.
</span><span class="n">t</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="nf">randint</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">total_steps</span><span class="p">,</span> <span class="p">(</span><span class="n">images</span><span class="p">.</span><span class="nf">size</span><span class="p">(</span><span class="mi">0</span><span class="p">),),</span> <span class="n">device</span><span class="o">=</span><span class="n">images</span><span class="p">.</span><span class="n">device</span><span class="p">)</span>
<span class="n">noise</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="nf">randn_like</span><span class="p">(</span><span class="n">images</span><span class="p">)</span>

<span class="c1"># Kapalı formül sayesinde görüntü doğrudan x_t seviyesine taşınır.
</span><span class="n">noisy</span> <span class="o">=</span> <span class="n">sqrt_alpha_bar</span><span class="p">[</span><span class="n">t</span><span class="p">]</span> <span class="o">*</span> <span class="n">images</span>
<span class="n">noisy</span> <span class="o">+=</span> <span class="n">sqrt_one_minus_alpha_bar</span><span class="p">[</span><span class="n">t</span><span class="p">]</span> <span class="o">*</span> <span class="n">noise</span>

<span class="c1"># U-Net eklenen gürültüyü tahmin eder.
</span><span class="n">predicted_noise</span> <span class="o">=</span> <span class="nf">model</span><span class="p">(</span><span class="n">noisy</span><span class="p">,</span> <span class="n">t</span><span class="p">)</span>
<span class="n">loss</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="nf">mean</span><span class="p">((</span><span class="n">noise</span> <span class="o">-</span> <span class="n">predicted_noise</span><span class="p">)</span> <span class="o">**</span> <span class="mi">2</span><span class="p">)</span>

<span class="n">optimizer</span><span class="p">.</span><span class="nf">zero_grad</span><span class="p">()</span>
<span class="n">loss</span><span class="p">.</span><span class="nf">backward</span><span class="p">()</span>
<span class="n">optimizer</span><span class="p">.</span><span class="nf">step</span><span class="p">()</span>
</code></pre></div></div>

<h2 id="üretim-neden-yavaş-ama-etkileyici">Üretim neden yavaş ama etkileyici?</h2>

<p>Üretim sırasında süreç saf $x_T$ gürültüsüyle başlar. Model, yüzlerce veya binlerce küçük temizleme adımı uygular. GAN modelleri çoğunlukla tek geçişte sonuç üretirken DDPM daha sabırlıdır; adeta bir heykeltıraş gibi her adımda rastgeleliği biraz daha yontar.</p>

<p>Bu aşamalı yaklaşım yüksek çeşitlilik, kararlı eğitim ve güçlü görüntü kalitesi sağlar. Dezavantajı hesaplama maliyetidir. DDIM, latent diffusion ve gelişmiş örnekleyiciler adım sayısını azaltarak bu sorunu hafifletir. Sonuçta görünen sihir, aslında olasılık teorisi, termodinamik sezgi ve dikkatle eğitilmiş bir gürültü tahmincisinin zarif iş birliğidir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="ddpm" /><category term="difüzyon" /><category term="yapay zeka" /><category term="derin öğrenme" /><category term="görüntü üretimi" /><category term="pytorch" /><summary type="html"><![CDATA[Bir televizyonun çekmediği kanaldaki karıncalanmayı düşünün. Şimdi bu rastgele piksellerin yavaşça bir kediye, uzay gemisine veya Van Gogh esintili bir manzaraya dönüştüğünü hayal edin. Denoising Diffusion Probabilistic Models, yani DDPM, tam olarak bunu yapar: Veriyi kontrollü biçimde gürültüye dönüştürmeyi öğrenir ve ardından zamanı tersine sararak gürültüden yeni görüntüler üretir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/ddpm-gurultuden-sahesere-67.png" /><media:content medium="image" url="https://program.sonsuz.us/img/ddpm-gurultuden-sahesere-67.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Federated Learning ve Diferansiyel Gizlilik: Veri Cihazdan Çıkmadan Model Eğitmek</title><link href="https://program.sonsuz.us/posts/federated-learning-ve-diferansiyel-gizlilik-veri-cihazdan-cikmadan-model-egitmek/" rel="alternate" type="text/html" title="Federated Learning ve Diferansiyel Gizlilik: Veri Cihazdan Çıkmadan Model Eğitmek" /><published>2026-09-26T00:00:00+00:00</published><updated>2026-09-26T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/federated-learning-ve-diferansiyel-gizlilik-veri-cihazdan-cikmadan-model-egitmek</id><content type="html" xml:base="https://program.sonsuz.us/posts/federated-learning-ve-diferansiyel-gizlilik-veri-cihazdan-cikmadan-model-egitmek/"><![CDATA[<p><img src="/img/federated-learning-ve-24.svg" alt="federated-learning-ve-24" /></p>

<p>Telefonunuzun yazdığınız kelimeleri tahmin etmeyi öğrendiğini, ancak mesajlarınızın hiçbir zaman merkezi bir sunucuya gönderilmediğini düşünün. Federated Learning, yani federe öğrenme, tam olarak bu fikri hayata geçirir: Veriyi modele taşımak yerine modeli veriye götürür. Diferansiyel gizlilik ise paylaşılan model güncellemelerinden kişisel bilgilerin çıkarılmasını matematiksel olarak zorlaştırır.</p>

<p>``</p>

<h2 id="federe-öğrenme-nasıl-çalışır">Federe öğrenme nasıl çalışır?</h2>

<p>Klasik makine öğrenmesinde kullanıcı verileri merkezi bir veri tabanında toplanır ve model burada eğitilir. Federe öğrenmede sunucu, mevcut global modeli seçilen cihazlara yollar. Her cihaz modeli kendi yerel verisiyle birkaç tur eğitir ve yalnızca hesapladığı ağırlık güncellemesini sunucuya gönderir.</p>

<p>Sunucu, bu güncellemeleri genellikle <strong>Federated Averaging (FedAvg)</strong> algoritmasıyla birleştirir:</p>

\[w_{t+1} = \sum_{k=1}^{K} \frac{n_k}{N} w_{t+1}^{(k)}\]

<p>Burada $w_{t+1}^{(k)}$, $k$ numaralı cihazın güncellediği ağırlıkları; $n_k$, cihazdaki örnek sayısını; $N$ ise katılan cihazlardaki toplam örnek sayısını temsil eder. Daha fazla veriye sahip cihazın katkısı doğal olarak daha yüksek olur.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Veri nerede?</th>
      <th>Sunucuya giden</th>
      <th>Temel risk</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Merkezi eğitim</td>
      <td>Sunucuda</td>
      <td>Ham kullanıcı verisi</td>
      <td>Veri tabanı sızıntısı</td>
    </tr>
    <tr>
      <td>Federe öğrenme</td>
      <td>Kullanıcı cihazında</td>
      <td>Model güncellemesi</td>
      <td>Güncellemeden bilgi çıkarımı</td>
    </tr>
    <tr>
      <td>Federe öğrenme + DP</td>
      <td>Kullanıcı cihazında</td>
      <td>Gürültülü güncelleme</td>
      <td>Kontrollü doğruluk kaybı</td>
    </tr>
  </tbody>
</table>

<h2 id="güncellemeler-gerçekten-güvenli-mi">Güncellemeler gerçekten güvenli mi?</h2>

<p>Ham verinin gönderilmemesi tek başına kusursuz gizlilik sağlamaz. Saldırganlar gradyanlardan eğitim örneklerini yaklaşık olarak yeniden oluşturabilir veya belirli bir kullanıcının eğitime katılıp katılmadığını tahmin edebilir. İşte diferansiyel gizlilik, kısaca <strong>DP</strong>, burada devreye girer.</p>

<p>Bir mekanizma $M$, komşu iki veri kümesi $D$ ve $D’$ için şu koşulu sağlıyorsa $(\varepsilon, \delta)$-diferansiyel gizlidir:</p>

\[P[M(D) \in S] \leq e^{\varepsilon}P[M(D') \in S] + \delta\]

<p>Komşu veri kümeleri yalnızca bir kullanıcının eklenmesi veya çıkarılması bakımından farklıdır. Küçük $\varepsilon$ daha güçlü gizlilik, fakat çoğunlukla daha fazla gürültü ve daha düşük model doğruluğu demektir. $\delta$ ise ideal garantinin çok küçük bir olasılıkla aşılmasına izin verir.</p>

<h2 id="kırpma-ve-gürültü-ekleme">Kırpma ve gürültü ekleme</h2>

<p>Cihaz güncellemeleri önce norm sınırı $C$ ile kırpılır. Böylece tek bir kullanıcının global modele yapabileceği maksimum etki kontrol edilir:</p>

\[\bar{g}_k = g_k \cdot \min\left(1, \frac{C}{\lVert g_k \rVert_2}\right)\]

<p>Ardından toplama Gaussian gürültüsü eklenir. Aşağıdaki basitleştirilmiş Python kodu bu iki adımı gösterir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">numpy</span> <span class="k">as</span> <span class="n">np</span>

<span class="k">def</span> <span class="nf">privatize_update</span><span class="p">(</span><span class="n">update</span><span class="p">,</span> <span class="n">clip_norm</span><span class="o">=</span><span class="mf">1.0</span><span class="p">,</span> <span class="n">noise_scale</span><span class="o">=</span><span class="mf">0.2</span><span class="p">):</span>
    <span class="c1"># Güncellemenin etkisini belirlenen üst sınırda tutar.
</span>    <span class="n">norm</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">linalg</span><span class="p">.</span><span class="nf">norm</span><span class="p">(</span><span class="n">update</span><span class="p">)</span>
    <span class="n">clipped</span> <span class="o">=</span> <span class="n">update</span> <span class="o">*</span> <span class="nf">min</span><span class="p">(</span><span class="mf">1.0</span><span class="p">,</span> <span class="n">clip_norm</span> <span class="o">/</span> <span class="p">(</span><span class="n">norm</span> <span class="o">+</span> <span class="mf">1e-12</span><span class="p">))</span>

    <span class="c1"># Bireysel katkının ayırt edilmesini zorlaştırır.
</span>    <span class="n">noise</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">random</span><span class="p">.</span><span class="nf">normal</span><span class="p">(</span>
        <span class="n">loc</span><span class="o">=</span><span class="mf">0.0</span><span class="p">,</span>
        <span class="n">scale</span><span class="o">=</span><span class="n">noise_scale</span> <span class="o">*</span> <span class="n">clip_norm</span><span class="p">,</span>
        <span class="n">size</span><span class="o">=</span><span class="n">update</span><span class="p">.</span><span class="n">shape</span>
    <span class="p">)</span>
    <span class="k">return</span> <span class="n">clipped</span> <span class="o">+</span> <span class="n">noise</span>
</code></pre></div></div>

<p>Gerçek sistemlerde gürültü her cihazda veya güvenli toplama sonrasında sunucuda uygulanabilir. <strong>Secure Aggregation</strong> kullanıldığında sunucu tek tek güncellemeleri göremez; yalnızca toplam sonucu elde eder. Bu teknik DP’nin alternatifi değil, güçlü bir tamamlayıcısıdır.</p>

<h2 id="milyonlarca-cihaz-neden-zorlu">Milyonlarca cihaz neden zorlu?</h2>

<p>Cihazların işlem gücü, bağlantı kalitesi ve veri dağılımları farklıdır. Bir telefonda gece çekilmiş fotoğraflar, diğerinde gündüz görüntüleri bulunabilir; yani veriler çoğunlukla bağımsız ve özdeş dağılımlı değildir. Ayrıca her turda cihazların yalnızca küçük bir bölümü çevrim içidir.</p>

<table>
  <thead>
    <tr>
      <th>Karar</th>
      <th>Avantaj</th>
      <th>Bedel</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Daha küçük $\varepsilon$</td>
      <td>Güçlü gizlilik</td>
      <td>Daha fazla doğruluk kaybı</td>
    </tr>
    <tr>
      <td>Büyük kırpma sınırı</td>
      <td>Faydalı sinyal korunur</td>
      <td>Kullanıcı etkisi artar</td>
    </tr>
    <tr>
      <td>Fazla eğitim turu</td>
      <td>Model gelişebilir</td>
      <td>Gizlilik bütçesi tüketilir</td>
    </tr>
    <tr>
      <td>Güvenli toplama</td>
      <td>Güncellemeleri saklar</td>
      <td>İletişim maliyeti yaratır</td>
    </tr>
  </tbody>
</table>

<p>Sonuç olarak federe öğrenme veriyi cihazda tutar, diferansiyel gizlilik ise modelin veriyi istemeden ezberlemesini sınırlar. İkisi güvenli toplama, şifreli iletişim ve düzenli gizlilik muhasebesiyle birleştiğinde milyonlarca kullanıcıdan öğrenen; ancak tek bir kullanıcı hakkında mümkün olduğunca az şey söyleyen dev modeller kurulabilir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="federated learning" /><category term="diferansiyel gizlilik" /><category term="makine öğrenmesi" /><category term="yapay zeka" /><category term="veri güvenliği" /><category term="python" /><summary type="html"><![CDATA[Telefonunuzun yazdığınız kelimeleri tahmin etmeyi öğrendiğini, ancak mesajlarınızın hiçbir zaman merkezi bir sunucuya gönderilmediğini düşünün. Federated Learning, yani federe öğrenme, tam olarak bu fikri hayata geçirir: Veriyi modele taşımak yerine modeli veriye götürür. Diferansiyel gizlilik ise paylaşılan model güncellemelerinden kişisel bilgilerin çıkarılmasını matematiksel olarak zorlaştırır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/federated-learning-ve-24.png" /><media:content medium="image" url="https://program.sonsuz.us/img/federated-learning-ve-24.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Isolation Forest ile Anomali Tespiti: Ormanda En Çabuk Yalnız Kalanı Bulmak</title><link href="https://program.sonsuz.us/posts/isolation-forest-ile-anomali-tespiti-ormanda-en-cabuk-yalniz-kalani-bulmak/" rel="alternate" type="text/html" title="Isolation Forest ile Anomali Tespiti: Ormanda En Çabuk Yalnız Kalanı Bulmak" /><published>2026-09-26T00:00:00+00:00</published><updated>2026-09-26T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/isolation-forest-ile-anomali-tespiti-ormanda-en-cabuk-yalniz-kalani-bulmak</id><content type="html" xml:base="https://program.sonsuz.us/posts/isolation-forest-ile-anomali-tespiti-ormanda-en-cabuk-yalniz-kalani-bulmak/"><![CDATA[<p>Bir veri kümesinde aykırı değer ararken çoğu yöntem önce “normal” davranışın nasıl göründüğünü öğrenmeye çalışır. Isolation Forest ise meseleyi tersinden ele alır: Normal değerlerin ayrıntılı profilini çıkarmak yerine, rastgele bölmelerle hangi gözlemlerin daha çabuk yalnız kaldığına bakar. Çünkü kalabalıktan uzak duran bir veri noktasını izole etmek, mahallenin ortasında yaşayan bir noktayı izole etmekten genellikle daha kolaydır.</p>

<p><img src="/img/isolation-forest-ile-14.svg" alt="isolation-forest-ile-14" /></p>

<p>``</p>

<h2 id="temel-fikir-anomali-neden-çabuk-izole-edilir">Temel fikir: Anomali neden çabuk izole edilir?</h2>

<p>Elimizde işlem tutarı ve işlem saati gibi özelliklerden oluşan bir veri kümesi bulunduğunu düşünelim. Noktaların çoğu birbirine yakınken çok yüksek tutarlı, gece yarısı yapılmış tek bir işlem uzak bir bölgede kalabilir. Isolation Forest, rastgele bir özellik seçer ve bu özelliğin minimum ile maksimum değerleri arasında rastgele bir bölme üretir.</p>

<p>Bu işlem ağaç boyunca tekrarlandığında aykırı nokta birkaç bölmeden sonra tek başına kalabilir. Normal bir noktanın ayrılması içinse kalabalık komşuluğun tekrar tekrar parçalanması gerekir. Bir gözlemin kökten yaprağa kadar geçtiği kenar sayısına <strong>yol uzunluğu</strong> denir ve $h(x)$ ile gösterilir.</p>

<table>
  <thead>
    <tr>
      <th>Gözlem türü</th>
      <th style="text-align: right">Ortalama yol uzunluğu</th>
      <th>Beklenen sonuç</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Yoğun bölgede normal nokta</td>
      <td style="text-align: right">Uzun</td>
      <td>Düşük anomali skoru</td>
    </tr>
    <tr>
      <td>Sınırda bulunan nokta</td>
      <td style="text-align: right">Orta</td>
      <td>Şüpheli</td>
    </tr>
    <tr>
      <td>Uzak ve seyrek nokta</td>
      <td style="text-align: right">Kısa</td>
      <td>Yüksek anomali skoru</td>
    </tr>
  </tbody>
</table>

<p>Tek bir rastgele ağaç yanıltıcı olabilir. Bu nedenle algoritma birçok izolasyon ağacı oluşturur ve sonuçların ortalamasını alır. “Forest” kelimesinin hakkını veren kısım da tam olarak budur.</p>

<h2 id="anomali-skoru-nasıl-hesaplanır">Anomali skoru nasıl hesaplanır?</h2>

<p>Bir $x$ gözleminin skorunda, ağaçlar üzerindeki ortalama yol uzunluğu $E[h(x)]$ kullanılır:</p>

\[s(x,n)=2^{-\frac{E[h(x)]}{c(n)}}\]

<p>Buradaki $n$ örnek sayısını, $c(n)$ ise başarısız bir ikili arama ağacındaki ortalama yol uzunluğunu temsil eden normalleştirme katsayısını belirtir:</p>

\[c(n)=2H(n-1)-\frac{2(n-1)}{n}\]

<p>$H(i)$ harmonik sayıdır ve yaklaşık olarak $H(i)\approx \ln(i)+\gamma$ biçiminde hesaplanabilir. Skor 1’e yaklaştıkça gözlem daha anormal, 0,5 civarında kaldıkça daha sıradan kabul edilir. Böylece farklı veri büyüklüklerinden elde edilen yol uzunlukları karşılaştırılabilir hâle gelir.</p>

<h2 id="python-ile-küçük-bir-anomali-avı">Python ile küçük bir anomali avı</h2>

<p>Scikit-learn içindeki <code class="language-plaintext highlighter-rouge">IsolationForest</code> sınıfı, yöntemi birkaç satırda uygulamamızı sağlar:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">pandas</span> <span class="k">as</span> <span class="n">pd</span>
<span class="kn">from</span> <span class="n">sklearn.ensemble</span> <span class="kn">import</span> <span class="n">IsolationForest</span>

<span class="n">veri</span> <span class="o">=</span> <span class="n">pd</span><span class="p">.</span><span class="nc">DataFrame</span><span class="p">({</span>
    <span class="sh">"</span><span class="s">tutar</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span><span class="mi">42</span><span class="p">,</span> <span class="mi">48</span><span class="p">,</span> <span class="mi">51</span><span class="p">,</span> <span class="mi">46</span><span class="p">,</span> <span class="mi">49</span><span class="p">,</span> <span class="mi">1200</span><span class="p">,</span> <span class="mi">44</span><span class="p">,</span> <span class="mi">53</span><span class="p">],</span>
    <span class="sh">"</span><span class="s">saat</span><span class="sh">"</span><span class="p">:</span>  <span class="p">[</span><span class="mi">13</span><span class="p">,</span> <span class="mi">14</span><span class="p">,</span> <span class="mi">12</span><span class="p">,</span> <span class="mi">15</span><span class="p">,</span> <span class="mi">13</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">16</span><span class="p">,</span> <span class="mi">12</span><span class="p">]</span>
<span class="p">})</span>

<span class="n">model</span> <span class="o">=</span> <span class="nc">IsolationForest</span><span class="p">(</span>
    <span class="n">n_estimators</span><span class="o">=</span><span class="mi">200</span><span class="p">,</span>
    <span class="n">contamination</span><span class="o">=</span><span class="mf">0.125</span><span class="p">,</span>
    <span class="n">random_state</span><span class="o">=</span><span class="mi">42</span>
<span class="p">)</span>

<span class="n">model</span><span class="p">.</span><span class="nf">fit</span><span class="p">(</span><span class="n">veri</span><span class="p">)</span>
<span class="n">veri</span><span class="p">[</span><span class="sh">"</span><span class="s">tahmin</span><span class="sh">"</span><span class="p">]</span> <span class="o">=</span> <span class="n">model</span><span class="p">.</span><span class="nf">predict</span><span class="p">(</span><span class="n">veri</span><span class="p">)</span>
<span class="n">veri</span><span class="p">[</span><span class="sh">"</span><span class="s">anomali_skoru</span><span class="sh">"</span><span class="p">]</span> <span class="o">=</span> <span class="o">-</span><span class="n">model</span><span class="p">.</span><span class="nf">score_samples</span><span class="p">(</span><span class="n">veri</span><span class="p">)</span>

<span class="nf">print</span><span class="p">(</span><span class="n">veri</span><span class="p">.</span><span class="nf">sort_values</span><span class="p">(</span><span class="sh">"</span><span class="s">anomali_skoru</span><span class="sh">"</span><span class="p">,</span> <span class="n">ascending</span><span class="o">=</span><span class="bp">False</span><span class="p">))</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">n_estimators</code>, ormandaki ağaç sayısını belirler. Daha fazla ağaç genellikle daha kararlı sonuç üretir ancak hesaplama maliyetini artırır. <code class="language-plaintext highlighter-rouge">contamination</code>, veride beklenen anomali oranıdır. <code class="language-plaintext highlighter-rouge">predict</code> normal gözlemler için <code class="language-plaintext highlighter-rouge">1</code>, anomaliler için <code class="language-plaintext highlighter-rouge">-1</code> döndürür. <code class="language-plaintext highlighter-rouge">score_samples</code> sonucunun işaretini ters çevirerek büyük değerin daha şüpheli olduğu, okunması kolay bir skor elde ediyoruz.</p>

<h2 id="neden-tercih-edilir">Neden tercih edilir?</h2>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Normal dağılım varsayımı</th>
      <th>Büyük veride hız</th>
      <th>Yüksek boyuta uygunluk</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Z-skoru</td>
      <td>Genellikle gerekli</td>
      <td>Yüksek</td>
      <td>Düşük</td>
    </tr>
    <tr>
      <td>Kümeleme tabanlı yöntemler</td>
      <td>Gerekli değil</td>
      <td>Değişken</td>
      <td>Orta</td>
    </tr>
    <tr>
      <td>Isolation Forest</td>
      <td>Gerekli değil</td>
      <td>Yüksek</td>
      <td>İyi</td>
    </tr>
  </tbody>
</table>

<p>Isolation Forest’ın eğitim maliyeti örnekleme sayesinde yaklaşık $O(t\,\psi\log\psi)$ düzeyindedir. Burada $t$ ağaç sayısını, $\psi$ ise her ağaç için kullanılan örnek büyüklüğünü gösterir. Bu yapı, milyonlarca satırın bulunduğu dolandırıcılık, sensör arızası ve sistem günlüğü senaryolarında yöntemi cazip kılar.</p>

<p>Yine de algoritma “neden anomali?” sorusunu tek başına açıklamaz. Kategorik değişkenler uygun biçimde kodlanmalı, özellik ölçekleri ve veri sızıntısı kontrol edilmeli, <code class="language-plaintext highlighter-rouge">contamination</code> iş bilgisiyle seçilmelidir. Kısacası Isolation Forest hızlı bir bekçidir; alarmı iyi çalar, fakat olay yerindeki son kararı yine alan bilgisi verir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="isolation forest" /><category term="anomali tespiti" /><category term="makine öğrenmesi" /><category term="python" /><category term="scikit-learn" /><category term="veri bilimi" /><summary type="html"><![CDATA[Bir veri kümesinde aykırı değer ararken çoğu yöntem önce “normal” davranışın nasıl göründüğünü öğrenmeye çalışır. Isolation Forest ise meseleyi tersinden ele alır: Normal değerlerin ayrıntılı profilini çıkarmak yerine, rastgele bölmelerle hangi gözlemlerin daha çabuk yalnız kaldığına bakar. Çünkü kalabalıktan uzak duran bir veri noktasını izole etmek, mahallenin ortasında yaşayan bir noktayı izole etmekten genellikle daha kolaydır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/isolation-forest-ile-14.png" /><media:content medium="image" url="https://program.sonsuz.us/img/isolation-forest-ile-14.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Karar Ağaçlarında Gini Impurity ve Entropy: Bölünme Kriterlerinin Matematiği</title><link href="https://program.sonsuz.us/posts/karar-agaclarinda-gini-impurity-ve-entropy-bolunme-kriterlerinin-matematigi/" rel="alternate" type="text/html" title="Karar Ağaçlarında Gini Impurity ve Entropy: Bölünme Kriterlerinin Matematiği" /><published>2026-09-26T00:00:00+00:00</published><updated>2026-09-26T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/karar-agaclarinda-gini-impurity-ve-entropy-bolunme-kriterlerinin-matematigi</id><content type="html" xml:base="https://program.sonsuz.us/posts/karar-agaclarinda-gini-impurity-ve-entropy-bolunme-kriterlerinin-matematigi/"><![CDATA[<p>Bir karar ağacı, verileri dallara ayırırken sürekli aynı soruyu sorar: “Hangi bölünme, sınıfları birbirinden en iyi şekilde ayırır?” Bu soruyu yalnızca sezgilerle cevaplamak yerine düğümlerin ne kadar karışık olduğunu ölçeriz. Sınıflandırma ağaçlarında bu amaçla en sık kullanılan iki ölçüt <strong>Gini Impurity</strong> ve <strong>Entropy</strong>’dir. İkisi de aynı hedefe koşar; ancak hedefe giderken kullandıkları matematiksel rota biraz farklıdır.</p>

<p>``</p>

<h2 id="saflık-ve-belirsizlik-ne-anlama-gelir">Saflık ve belirsizlik ne anlama gelir?</h2>

<p>Bir düğümdeki örneklerin tamamı aynı sınıfa aitse düğüm saftır. Örneğin kutuda yalnızca elmalar bulunuyorsa belirsizlik yoktur. Kutuda eşit sayıda elma ve armut varsa hangi meyveyi çekeceğimizi tahmin etmek daha zordur.</p>

<p>İki sınıflı bir problemde pozitif sınıfın oranı $p$, negatif sınıfın oranı $1-p$ olsun. Hem Gini hem de Entropy, $p=0$ veya $p=1$ olduğunda sıfır değerini alır. En yüksek belirsizlik ise sınıflar dengeliyken, yani $p=0.5$ civarında ortaya çıkar.</p>

<h2 id="gini-impurity-matematiği">Gini Impurity matematiği</h2>

<p>Gini Impurity, rastgele seçilen bir örneğin düğümdeki sınıf dağılımına göre rastgele etiketlenmesi durumunda yanlış sınıflandırılma olasılığını temsil eder:</p>

\[Gini = 1 - \sum_{i=1}^{K} p_i^2\]

<p>Burada $K$ sınıf sayısını, $p_i$ ise $i$ sınıfının düğümdeki oranını gösterir. Yüzde 50 kedi ve yüzde 50 köpek bulunan bir düğüm için:</p>

\[Gini = 1-(0.5^2+0.5^2)=0.5\]

<p>Dağılım yüzde 90 kedi ve yüzde 10 köpek olduğunda sonuç $0.18$ olur. Değerin küçülmesi, düğümün daha saf hâle geldiğini gösterir.</p>

<h2 id="entropy-ve-bilgi-teorisi">Entropy ve bilgi teorisi</h2>

<p>Entropy, bilgi teorisinden gelir ve bir dağılımdaki şaşkınlığı ya da belirsizliği ölçer:</p>

\[Entropy = -\sum_{i=1}^{K} p_i\log_2(p_i)\]

<p>Eşit dağılımlı iki sınıfta Entropy değeri $1$’dir. Tek bir sınıftan oluşan düğümde ise $0$ olur. Hesaplama sırasında $0\log_2(0)$ ifadesi limit yaklaşımıyla sıfır kabul edilir.</p>

<p>Entropy ile bölünme değerlendirilirken çoğunlukla <strong>Information Gain</strong> kullanılır:</p>

\[IG = H(parent)-\sum_j \frac{n_j}{n}H(child_j)\]

<p>Yani çocuk düğümlerin ağırlıklı belirsizliği, ebeveynin belirsizliğinden çıkarılır. En yüksek bilgi kazancını sağlayan bölünme seçilir.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Gini Impurity</th>
      <th>Entropy</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Formül yapısı</td>
      <td>Kare alma</td>
      <td>Logaritma</td>
    </tr>
    <tr>
      <td>İkili sınıfta maksimum</td>
      <td>$0.5$</td>
      <td>$1$</td>
    </tr>
    <tr>
      <td>Hesaplama maliyeti</td>
      <td>Genellikle daha düşük</td>
      <td>Biraz daha yüksek</td>
    </tr>
    <tr>
      <td>Hassasiyet</td>
      <td>Baskın sınıfa odaklanabilir</td>
      <td>Nadir sınıflara biraz daha duyarlıdır</td>
    </tr>
    <tr>
      <td>Yaygın kullanım</td>
      <td>CART, scikit-learn varsayılanı</td>
      <td>ID3, C4.5 ve bilgi kazancı</td>
    </tr>
  </tbody>
</table>

<p><img src="/img/karar-agaclarinda-gini-71.svg" alt="karar-agaclarinda-gini-71" /></p>

<h2 id="bölünme-nasıl-puanlanır">Bölünme nasıl puanlanır?</h2>

<p>Bir aday bölünmenin kalitesi, çocuk düğümlerin ağırlıklı impurity değeriyle hesaplanır:</p>

\[I_{split}=\frac{n_L}{n}I_L+\frac{n_R}{n}I_R\]

<p>Amaç bu değeri küçültmek veya ebeveyn düğüme göre impurity azalmasını büyütmektir. Çok saf fakat yalnızca iki örnek içeren bir dalın ağacı yanıltmaması için örnek sayılarıyla ağırlıklandırma kritik öneme sahiptir.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="n">sklearn.tree</span> <span class="kn">import</span> <span class="n">DecisionTreeClassifier</span>

<span class="c1"># Aynı veri üzerinde iki farklı saflık ölçütü kullanan modeller
</span><span class="n">models</span> <span class="o">=</span> <span class="p">{</span>
    <span class="sh">'</span><span class="s">gini</span><span class="sh">'</span><span class="p">:</span> <span class="nc">DecisionTreeClassifier</span><span class="p">(</span><span class="n">criterion</span><span class="o">=</span><span class="sh">'</span><span class="s">gini</span><span class="sh">'</span><span class="p">,</span> <span class="n">random_state</span><span class="o">=</span><span class="mi">42</span><span class="p">),</span>
    <span class="sh">'</span><span class="s">entropy</span><span class="sh">'</span><span class="p">:</span> <span class="nc">DecisionTreeClassifier</span><span class="p">(</span><span class="n">criterion</span><span class="o">=</span><span class="sh">'</span><span class="s">entropy</span><span class="sh">'</span><span class="p">,</span> <span class="n">random_state</span><span class="o">=</span><span class="mi">42</span><span class="p">)</span>
<span class="p">}</span>

<span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">model</span> <span class="ow">in</span> <span class="n">models</span><span class="p">.</span><span class="nf">items</span><span class="p">():</span>
    <span class="n">model</span><span class="p">.</span><span class="nf">fit</span><span class="p">(</span><span class="n">X_train</span><span class="p">,</span> <span class="n">y_train</span><span class="p">)</span>
    <span class="nf">print</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">model</span><span class="p">.</span><span class="nf">score</span><span class="p">(</span><span class="n">X_test</span><span class="p">,</span> <span class="n">y_test</span><span class="p">))</span>
</code></pre></div></div>

<p>Bu kod iki ağacı aynı eğitim verisiyle kurar ve test doğruluklarını karşılaştırır. Sağlıklı bir deneyde yalnızca doğruluğa değil; eğitim süresine, ağaç derinliğine, çapraz doğrulama skorlarına ve dengesiz veri varsa F1 ya da ROC-AUC değerlerine de bakılmalıdır.</p>

<h2 id="hangisini-seçmeliyiz">Hangisini seçmeliyiz?</h2>

<p>Pratikte iki kriter çoğu zaman benzer bölünmeler ve tahmin performansı üretir. Gini, logaritma hesaplamadığı için teorik olarak daha hızlıdır; Entropy ise olasılıklardaki değişimleri bilgi miktarı olarak yorumlamayı sağlar. Küçük hız farkları modern uygulamalarda genellikle belirleyici değildir.</p>

<p>En doğru yaklaşım, kriteri bir hiperparametre gibi değerlendirmektir. Çapraz doğrulamayla ikisini de deneyin; genelleme performansı, model karmaşıklığı ve çalışma süresi açısından daha uygun olanı seçin. Kısacası Gini hızlı bir saflık dedektörü, Entropy ise bilgi teorisi gözlüğü takmış meraklı bir matematikçidir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="makine öğrenmesi" /><category term="karar ağaçları" /><category term="gini impurity" /><category term="entropy" /><category term="python" /><category term="veri bilimi" /><summary type="html"><![CDATA[Bir karar ağacı, verileri dallara ayırırken sürekli aynı soruyu sorar: “Hangi bölünme, sınıfları birbirinden en iyi şekilde ayırır?” Bu soruyu yalnızca sezgilerle cevaplamak yerine düğümlerin ne kadar karışık olduğunu ölçeriz. Sınıflandırma ağaçlarında bu amaçla en sık kullanılan iki ölçüt Gini Impurity ve Entropy’dir. İkisi de aynı hedefe koşar; ancak hedefe giderken kullandıkları matematiksel rota biraz farklıdır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/karar-agaclarinda-gini-71.png" /><media:content medium="image" url="https://program.sonsuz.us/img/karar-agaclarinda-gini-71.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">LightGBM’in Sırrı: Histogram Tabanlı Öğrenme ile XGBoost’u Nasıl Geçti?</title><link href="https://program.sonsuz.us/posts/lightgbmin-sirri-histogram-tabanli-ogrenme-ile-xgboostu-nasil-gecti/" rel="alternate" type="text/html" title="LightGBM’in Sırrı: Histogram Tabanlı Öğrenme ile XGBoost’u Nasıl Geçti?" /><published>2026-09-26T00:00:00+00:00</published><updated>2026-09-26T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/lightgbmin-sirri-histogram-tabanli-ogrenme-ile-xgboostu-nasil-gecti</id><content type="html" xml:base="https://program.sonsuz.us/posts/lightgbmin-sirri-histogram-tabanli-ogrenme-ile-xgboostu-nasil-gecti/"><![CDATA[<p>Gradient boosting dünyasında doğruluk kadar eğitim süresi ve bellek tüketimi de önemlidir. LightGBM, sürekli özelliklerdeki her değeri ayrı ayrı incelemek yerine değerleri küçük aralıklara, yani <strong>bin</strong> adı verilen sepetlere yerleştirerek bu dengeyi değiştirdi. Milyonlarca satırlık veriyle çalışan bir algoritma için bu yaklaşım, tek tek bozuk para saymak yerine onları önceden hazırlanmış kutularda tartmaya benzer.</p>

<p>``</p>

<h2 id="gradient-boosting-neden-pahalıdır">Gradient boosting neden pahalıdır?</h2>

<p>Gradient boosting, önceki ağaçların hatalarını azaltacak yeni karar ağaçlarını ardışık biçimde üretir. Modelin genel tahmini kabaca şöyle yazılabilir:</p>

\[F_t(x) = F_{t-1}(x) + \eta f_t(x)\]

<p>Burada $f_t(x)$ yeni ağacı, $\eta$ ise öğrenme oranını temsil eder. Her düğümde algoritmanın “Bu özelliği hangi değerden bölersem kayıp en fazla azalır?” sorusunu cevaplaması gerekir.</p>

<p>Klasik yaklaşımda sürekli bir özelliğin değerleri sıralanır ve olası eşikler değerlendirilir. $n$ örnek ve $m$ özellik için bu işlem büyük veri kümelerinde ciddi sıralama, tarama ve bellek maliyeti oluşturabilir. Üstelik aynı tür hesaplamalar ağacın birçok düğümünde tekrarlanır.</p>

<h2 id="histogram-numarası">Histogram numarası</h2>

<p>LightGBM, her sürekli özelliği genellikle birkaç yüz bin içine dönüştürür. Örneğin yaş değerleri tek tek tutulmak yerine <code class="language-plaintext highlighter-rouge">18-25</code>, <code class="language-plaintext highlighter-rouge">26-35</code> ve <code class="language-plaintext highlighter-rouge">36-50</code> gibi gruplara eşlenebilir. Gerçekte sınırlar veri dağılımına göre daha sistematik belirlenir.</p>

<p>Her bin için gradyan ve Hessian değerleri toplanır:</p>

\[G_b = \sum_{i \in b} g_i, \qquad H_b = \sum_{i \in b} h_i\]

<p>Bölünme kazancı artık bütün örnekler yerine bu özetler üzerinden hesaplanabilir. Böylece çalışma maliyeti örnek sayısından çok bin sayısına bağlı hâle gelir. Ayrıca ham ondalıklı değerler yerine küçük tamsayı bin kimlikleri saklanabildiği için bellek kullanımı azalır ve işlemci önbelleği daha verimli kullanılır.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th style="text-align: right">Bölünme adayları</th>
      <th style="text-align: right">Bellek ihtiyacı</th>
      <th>Eğitim davranışı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Geleneksel exact yöntem</td>
      <td style="text-align: right">Neredeyse tüm benzersiz değerler</td>
      <td style="text-align: right">Yüksek</td>
      <td>Küçük veride hassas, büyük veride pahalı</td>
    </tr>
    <tr>
      <td>Histogram yöntemi</td>
      <td style="text-align: right">Sınırlı sayıda bin</td>
      <td style="text-align: right">Daha düşük</td>
      <td>Büyük veride hızlı ve ölçeklenebilir</td>
    </tr>
    <tr>
      <td>Çok az bin</td>
      <td style="text-align: right">Çok az eşik</td>
      <td style="text-align: right">Çok düşük</td>
      <td>Hızlı fakat bilgi kaybına açık</td>
    </tr>
  </tbody>
</table>

<p><img src="/img/lightgbmin-sirri-histogram-54.svg" alt="lightgbmin-sirri-histogram-54" /></p>

<p>Histogramlar yalnızca hız sağlamaz. Bir düğümün histogramı ile çocuklarından birinin histogramı biliniyorsa diğer çocuk çıkarma işlemiyle bulunabilir. Bu <strong>histogram subtraction</strong> tekniği, aynı verinin tekrar tekrar taranmasını önler.</p>

<h2 id="lightgbmi-farklılaştıran-diğer-parçalar">LightGBM’i farklılaştıran diğer parçalar</h2>

<p>LightGBM’in avantajını yalnızca histogramlara bağlamak eksik olur. Algoritma çoğunlukla ağacı seviye seviye değil, kaybı en fazla azaltan yaprağı büyüterek oluşturur. <strong>Leaf-wise</strong> büyüme daha düşük kayba hızlı ulaşabilir; ancak küçük verilerde aşırı öğrenme riski taşır. Bu nedenle <code class="language-plaintext highlighter-rouge">num_leaves</code>, <code class="language-plaintext highlighter-rouge">max_depth</code> ve <code class="language-plaintext highlighter-rouge">min_data_in_leaf</code> kritik ayarlardır.</p>

<p>Ayrıca <strong>GOSS</strong>, gradyanı büyük örnekleri koruyup kolay örneklerden örnekleme yapar. <strong>EFB</strong> ise aynı anda sıfır olmayan seyrek özellikleri tek özellikte paketleyerek boyutu azaltır.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>LightGBM yaklaşımı</th>
      <th>Pratik sonuç</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Ağaç büyütme</td>
      <td>Leaf-wise</td>
      <td>Hızlı kayıp azalması, daha yüksek overfitting riski</td>
    </tr>
    <tr>
      <td>Örnek seçimi</td>
      <td>GOSS</td>
      <td>Daha az örnekle önemli hataları koruma</td>
    </tr>
    <tr>
      <td>Seyrek özellikler</td>
      <td>EFB</td>
      <td>Daha az özellik taraması</td>
    </tr>
    <tr>
      <td>Değer işleme</td>
      <td>Histogram binleri</td>
      <td>Daha düşük bellek ve daha hızlı eğitim</td>
    </tr>
  </tbody>
</table>

<h2 id="python-ile-küçük-bir-deney">Python ile küçük bir deney</h2>

<p>Aşağıdaki kod, histogram çözünürlüğünü belirleyen <code class="language-plaintext highlighter-rouge">max_bin</code> seçeneğiyle bir sınıflandırıcı kurar:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="n">lightgbm</span> <span class="kn">import</span> <span class="n">LGBMClassifier</span>
<span class="kn">from</span> <span class="n">sklearn.metrics</span> <span class="kn">import</span> <span class="n">accuracy_score</span>

<span class="n">model</span> <span class="o">=</span> <span class="nc">LGBMClassifier</span><span class="p">(</span>
    <span class="n">n_estimators</span><span class="o">=</span><span class="mi">400</span><span class="p">,</span>
    <span class="n">learning_rate</span><span class="o">=</span><span class="mf">0.05</span><span class="p">,</span>
    <span class="n">num_leaves</span><span class="o">=</span><span class="mi">31</span><span class="p">,</span>
    <span class="n">max_bin</span><span class="o">=</span><span class="mi">255</span><span class="p">,</span>
    <span class="n">min_child_samples</span><span class="o">=</span><span class="mi">30</span><span class="p">,</span>
    <span class="n">random_state</span><span class="o">=</span><span class="mi">42</span>
<span class="p">)</span>

<span class="n">model</span><span class="p">.</span><span class="nf">fit</span><span class="p">(</span><span class="n">X_train</span><span class="p">,</span> <span class="n">y_train</span><span class="p">)</span>
<span class="n">predictions</span> <span class="o">=</span> <span class="n">model</span><span class="p">.</span><span class="nf">predict</span><span class="p">(</span><span class="n">X_test</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="nf">accuracy_score</span><span class="p">(</span><span class="n">y_test</span><span class="p">,</span> <span class="n">predictions</span><span class="p">))</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">max_bin</code> artırılırsa daha hassas eşikler elde edilebilir; fakat eğitim ve bellek maliyeti yükselir. Azaltılırsa model hızlanır, ancak önemli ayrımlar aynı sepete düşebilir.</p>

<p>Sonuç olarak LightGBM, özellikle büyük ve yüksek boyutlu verilerde XGBoost’un tarihsel exact yaklaşımını hız ve bellek bakımından geçebildi. Güncel XGBoost sürümlerinin de histogram tabanlı yöntemler sunduğunu unutmamak gerekir; dolayısıyla mutlak bir şampiyon yoktur. Asıl sır, daha fazla hesaplamak değil, veriyi akıllıca özetleyerek doğru hesapları yapmaktır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="lightgbm" /><category term="xgboost" /><category term="gradient-boosting" /><category term="makine-öğrenmesi" /><category term="histogram" /><category term="python" /><summary type="html"><![CDATA[Gradient boosting dünyasında doğruluk kadar eğitim süresi ve bellek tüketimi de önemlidir. LightGBM, sürekli özelliklerdeki her değeri ayrı ayrı incelemek yerine değerleri küçük aralıklara, yani bin adı verilen sepetlere yerleştirerek bu dengeyi değiştirdi. Milyonlarca satırlık veriyle çalışan bir algoritma için bu yaklaşım, tek tek bozuk para saymak yerine onları önceden hazırlanmış kutularda tartmaya benzer.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/lightgbmin-sirri-histogram-54.png" /><media:content medium="image" url="https://program.sonsuz.us/img/lightgbmin-sirri-histogram-54.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Makine Çevirisinde BLEU Skoru Bizi Kandırıyor mu?</title><link href="https://program.sonsuz.us/posts/makine-cevirisinde-bleu-skoru-bizi-kandiriyor-mu/" rel="alternate" type="text/html" title="Makine Çevirisinde BLEU Skoru Bizi Kandırıyor mu?" /><published>2026-09-26T00:00:00+00:00</published><updated>2026-09-26T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/makine-cevirisinde-bleu-skoru-bizi-kandiriyor-mu</id><content type="html" xml:base="https://program.sonsuz.us/posts/makine-cevirisinde-bleu-skoru-bizi-kandiriyor-mu/"><![CDATA[<p><img src="/img/makine-cevirisinde-bleu-94.svg" alt="makine-cevirisinde-bleu-94" /></p>

<p>Bir çeviri sistemi yüksek BLEU skoru aldığında gerçekten iyi çeviri yapıyor diyebilir miyiz? Kısa cevap: Her zaman değil. BLEU, makine çevirisi dünyasının en meşhur ölçüm araçlarından biri olsa da anlamı, akıcılığı ve bağlamı doğrudan ölçmez. Üstelik bazen kulağa robotik gelen bir çeviriyi ödüllendirirken gayet doğal bir alternatifi cezalandırabilir.</p>

<p>``</p>

<h2 id="bleu-aslında-neyi-ölçüyor">BLEU aslında neyi ölçüyor?</h2>

<p>BLEU, yani <strong>Bilingual Evaluation Understudy</strong>, aday çevirideki kelime dizilerini insan tarafından hazırlanmış referans çevirilerle karşılaştırır. Buradaki temel fikir, iki metnin ortak $n$-gram sayısı arttıkça çevirinin daha başarılı kabul edilmesidir.</p>

<p>Bir $n$-gram, art arda gelen $n$ adet parçadan oluşur:</p>

<ul>
  <li>1-gram: <code class="language-plaintext highlighter-rouge">yapay</code></li>
  <li>2-gram: <code class="language-plaintext highlighter-rouge">yapay zeka</code></li>
  <li>3-gram: <code class="language-plaintext highlighter-rouge">yapay zeka sistemi</code></li>
</ul>

<p>Basitleştirilmiş $n$-gram kesinliği şöyle gösterilebilir:</p>

\[p_n = \frac{\text{Eşleşen aday n-gram sayısı}}{\text{Adaydaki toplam n-gram sayısı}}\]

<p>BLEU, farklı uzunluklardaki $n$-gram kesinliklerinin geometrik ortalamasını alır ve çok kısa çevirileri engellemek için bir uzunluk cezası ekler:</p>

\[BLEU = BP \cdot \exp\left(\sum_{n=1}^{N} w_n \log p_n\right)\]

<p>Buradaki $BP$, <strong>brevity penalty</strong> olarak bilinen kısalık cezasıdır. Sistem yalnızca birkaç doğru kelime üretip yüksek puanı kapamasın diye kullanılır.</p>

<h2 id="aynı-anlam-farklı-kelimeler">Aynı anlam, farklı kelimeler</h2>

<p>Kaynak cümlenin “The meeting was called off” olduğunu düşünelim. Referans çeviri “Toplantı iptal edildi” olsun.</p>

<table>
  <thead>
    <tr>
      <th>Aday çeviri</th>
      <th style="text-align: right">Anlamsal kalite</th>
      <th>BLEU açısından durum</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Toplantı iptal edildi</td>
      <td style="text-align: right">Yüksek</td>
      <td>Tam eşleşme</td>
    </tr>
    <tr>
      <td>Görüşme iptal oldu</td>
      <td style="text-align: right">Yüksek</td>
      <td>Düşük kelime eşleşmesi</td>
    </tr>
    <tr>
      <td>Toplantı edildi iptal</td>
      <td style="text-align: right">Düşük</td>
      <td>Bazı n-gramlar eşleşebilir</td>
    </tr>
    <tr>
      <td>Toplantı ertelendi</td>
      <td style="text-align: right">Yanlış</td>
      <td>“Toplantı” nedeniyle kısmi puan alabilir</td>
    </tr>
  </tbody>
</table>

<p>İkinci çeviri bağlama göre son derece doğal olabilir. Ancak BLEU, “görüşme” ile “toplantı” arasındaki yakınlığı veya “iptal oldu” ifadesinin aynı mesajı taşıdığını bilmez. Çünkü kelimelerin anlamlarını değil, yüzeydeki parçaların örtüşmesini sayar.</p>

<p>Bu durum özellikle eş anlamlıların bol olduğu dillerde, serbest sözcük diziliminde ve Türkçe gibi eklemeli dillerde belirginleşir. “Evlerimizden” tek bir kelimeyken başka bir dilde birkaç ayrı sözcüğe karşılık gelebilir. Tokenizasyon tercihi bile sonucu değiştirebilir.</p>

<h2 id="skoru-hızlıca-hesaplamak">Skoru hızlıca hesaplamak</h2>

<p>Python’da <code class="language-plaintext highlighter-rouge">sacrebleu</code> paketiyle standartlaştırılmış bir BLEU hesabı yapılabilir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">sacrebleu</span>

<span class="n">referanslar</span> <span class="o">=</span> <span class="p">[[</span><span class="sh">'</span><span class="s">Toplantı iptal edildi</span><span class="sh">'</span><span class="p">]]</span>
<span class="n">adaylar</span> <span class="o">=</span> <span class="p">[</span><span class="sh">'</span><span class="s">Görüşme iptal oldu</span><span class="sh">'</span><span class="p">]</span>

<span class="n">sonuc</span> <span class="o">=</span> <span class="n">sacrebleu</span><span class="p">.</span><span class="nf">corpus_bleu</span><span class="p">(</span><span class="n">adaylar</span><span class="p">,</span> <span class="n">referanslar</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">'</span><span class="s">BLEU: </span><span class="si">{</span><span class="n">sonuc</span><span class="p">.</span><span class="n">score</span><span class="si">:</span><span class="p">.</span><span class="mi">2</span><span class="n">f</span><span class="si">}</span><span class="sh">'</span><span class="p">)</span>
</code></pre></div></div>

<p>Bu kod aday çeviriyi referansla karşılaştırır. Sonuç düşük çıkarsa adayın mutlaka kötü olduğunu söyleyemeyiz; yalnızca referansın kelime dizilimine yeterince benzemediğini söyleyebiliriz. Ayrıca farklı kütüphanelerin tokenizasyon ve düzeltme yöntemleri farklı sonuçlar üretebildiğinden deneylerde kullanılan BLEU sürümü açıkça belirtilmelidir.</p>

<h2 id="bleu-ne-zaman-işe-yarar">BLEU ne zaman işe yarar?</h2>

<p>BLEU tamamen kullanışsız değildir. Büyük veri kümelerinde, aynı test seti üzerinde eğitilen sistemlerin genel ilerlemesini hızlı ve ucuz biçimde karşılaştırmak için pratiktir. Ancak tek bir cümlenin kalitesini değerlendirmekte güvenilir değildir. Korpus düzeyinde anlamlı olan istatistikler, cümle düzeyinde oynak hale gelir.</p>

<table>
  <thead>
    <tr>
      <th>Yöntem</th>
      <th>Güçlü yanı</th>
      <th>Temel kusuru</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>BLEU</td>
      <td>Hızlı ve tekrarlanabilir</td>
      <td>Anlamı doğrudan ölçmez</td>
    </tr>
    <tr>
      <td>chrF</td>
      <td>Karakter ve ek benzerliğine duyarlı</td>
      <td>Bağlam bilgisi sınırlıdır</td>
    </tr>
    <tr>
      <td>COMET</td>
      <td>Anlamsal ilişkileri modelleyebilir</td>
      <td>Eğitildiği verilere bağımlıdır</td>
    </tr>
    <tr>
      <td>İnsan değerlendirmesi</td>
      <td>Akıcılık ve doğruluğu birlikte görebilir</td>
      <td>Pahalı ve öznel olabilir</td>
    </tr>
  </tbody>
</table>

<h2 id="tek-sayı-yerine-ölçüm-sepeti">Tek sayı yerine ölçüm sepeti</h2>

<p>Sağlıklı değerlendirme için BLEU; chrF, COMET veya BERTScore gibi metriklerle desteklenmelidir. Kritik uygulamalarda insan değerlendiriciler doğruluk, akıcılık, terminoloji ve kültürel uygunluk başlıklarını ayrı ayrı puanlamalıdır.</p>

<p>Sonuç olarak BLEU bizi bilinçli biçimde kandırmaz; yalnızca kendisine sormadığımız soruları cevaplayamaz. O, “Bu çeviri referansa ne kadar benziyor?” sorusunda iyidir. “Bu çeviri anlamı doğru, doğal ve güvenli biçimde aktarıyor mu?” sorusu içinse tek başına oldukça sessizdir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="bleu" /><category term="makine çevirisi" /><category term="doğal dil işleme" /><category term="yapay zeka" /><category term="değerlendirme metrikleri" /><summary type="html"><![CDATA[Bir çeviri sistemi yüksek BLEU skoru aldığında gerçekten iyi çeviri yapıyor diyebilir miyiz? Kısa cevap: Her zaman değil. BLEU, makine çevirisi dünyasının en meşhur ölçüm araçlarından biri olsa da anlamı, akıcılığı ve bağlamı doğrudan ölçmez. Üstelik bazen kulağa robotik gelen bir çeviriyi ödüllendirirken gayet doğal bir alternatifi cezalandırabilir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/makine-cevirisinde-bleu-94.png" /><media:content medium="image" url="https://program.sonsuz.us/img/makine-cevirisinde-bleu-94.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Multi-Agent Reinforcement Learning: Kendi Aralarında Konuşan Yapay Zekâlar</title><link href="https://program.sonsuz.us/posts/multi-agent-reinforcement-learning-kendi-aralarinda-konusan-yapay-zekalar/" rel="alternate" type="text/html" title="Multi-Agent Reinforcement Learning: Kendi Aralarında Konuşan Yapay Zekâlar" /><published>2026-09-26T00:00:00+00:00</published><updated>2026-09-26T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/multi-agent-reinforcement-learning-kendi-aralarinda-konusan-yapay-zekalar</id><content type="html" xml:base="https://program.sonsuz.us/posts/multi-agent-reinforcement-learning-kendi-aralarinda-konusan-yapay-zekalar/"><![CDATA[<p>Tek bir yapay zekânın oyun oynamayı öğrenmesi etkileyicidir; ancak aynı ortama birden fazla öğrenen ajan koyduğumuzda işler hızla bilim kurgu filmine dönüşür. Ajanlar yardımlaşabilir, kaynaklar için kapışabilir, birbirlerini kandırabilir veya ortak bir dil geliştirebilir. <strong>Multi-Agent Reinforcement Learning (MARL)</strong>, yani çok ajanlı pekiştirmeli öğrenme, tam olarak bu hareketli dünyayı inceler.</p>

<p><img src="/img/multi-agent-reinforcement-78.svg" alt="multi-agent-reinforcement-78" /></p>

<p>``</p>

<h2 id="önce-temel-mantık-ajan-ne-öğreniyor">Önce temel mantık: Ajan ne öğreniyor?</h2>

<p>Klasik pekiştirmeli öğrenmede bir ajan, bulunduğu durum $s_t$ için bir eylem $a_t$ seçer. Ortam bunun karşılığında $r_t$ ödülünü ve yeni durum $s_{t+1}$ değerini üretir. Ajanın amacı, gelecekteki ödüllerin indirgenmiş toplamını büyütmektir:</p>

\[G_t = \sum_{k=0}^{\infty} \gamma^k r_{t+k}\]

<p>Buradaki $\gamma$, ajanın ne kadar ileri görüşlü olduğunu belirleyen indirim katsayısıdır. Değer 0’a yaklaştığında ajan “ödül şimdi gelsin” der; 1’e yaklaştığında ise uzun vadeli stratejilere önem verir.</p>

<p>MARL ortamında tek bir ajan yerine $N$ ajan bulunur. Ortamın sonraki durumu, tüm ajanların ortak eylemine bağlıdır:</p>

\[s_{t+1} \sim P(s_{t+1} \mid s_t, a_t^1, a_t^2, \ldots, a_t^N)\]

<p>Dolayısıyla bir ajanın karşılaştığı dünya sürekli değişir; çünkü diğer ajanlar da öğrenmektedir. Bu durum <strong>durağan olmama</strong> problemi olarak bilinir.</p>

<h2 id="i̇şbirliği-mi-rekabet-mi">İşbirliği mi, rekabet mi?</h2>

<table>
  <thead>
    <tr>
      <th>Ortam türü</th>
      <th>Ödül yapısı</th>
      <th>Tipik davranış</th>
      <th>Örnek</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>İşbirlikçi</td>
      <td>Ortak ödül</td>
      <td>Görev paylaşımı</td>
      <td>Robot filosu</td>
    </tr>
    <tr>
      <td>Rekabetçi</td>
      <td>Zıt ödüller</td>
      <td>Rakibi engelleme</td>
      <td>Satranç, futbol</td>
    </tr>
    <tr>
      <td>Karma</td>
      <td>Kısmen ortak</td>
      <td>Geçici ittifaklar</td>
      <td>Otonom trafik</td>
    </tr>
  </tbody>
</table>

<p>İşbirlikçi senaryoda depo robotları, çarpışmadan paket taşımayı öğrenebilir. Rekabetçi senaryoda bir ajan kazanırken diğeri kaybeder. Karma ortamlarda ise ajanlar bazen yardımlaşır, bazen “o şarj istasyonu benimdi!” diyerek mücadele eder.</p>

<h2 id="ajanlar-gerçekten-konuşabilir-mi">Ajanlar gerçekten konuşabilir mi?</h2>

<p>Evet, fakat konuşma her zaman doğal dil anlamına gelmez. Bir ajan diğerine konum, hedef veya niyet belirten sayısal mesajlar gönderebilir. Daha ilginci, mesajların anlamı önceden tanımlanmayabilir. Eğitim sırasında ajanlar, görevi kolaylaştıran kendi iletişim protokollerini keşfedebilir.</p>

<p>Örneğin <code class="language-plaintext highlighter-rouge">0.73</code> mesajı zamanla “sağ koridor boş” anlamına gelebilir. İnsan açısından anlamsız görünen bu sinyal, ajanlar için oldukça net olabilir. Buna <strong>ortaya çıkan iletişim</strong> denir.</p>

<h2 id="basit-bir-ortak-ödül-örneği">Basit bir ortak ödül örneği</h2>

<p>Aşağıdaki Python fonksiyonu, iki ajanın aynı hedefe yaklaşmasını ödüllendirirken çarpışmalarını cezalandırır:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">ortak_odul</span><span class="p">(</span><span class="n">ajanlar</span><span class="p">,</span> <span class="n">hedef</span><span class="p">):</span>
    <span class="n">odul</span> <span class="o">=</span> <span class="mf">0.0</span>

    <span class="k">for</span> <span class="n">ajan</span> <span class="ow">in</span> <span class="n">ajanlar</span><span class="p">:</span>
        <span class="n">mesafe</span> <span class="o">=</span> <span class="nf">abs</span><span class="p">(</span><span class="n">ajan</span><span class="p">.</span><span class="n">x</span> <span class="o">-</span> <span class="n">hedef</span><span class="p">.</span><span class="n">x</span><span class="p">)</span> <span class="o">+</span> <span class="nf">abs</span><span class="p">(</span><span class="n">ajan</span><span class="p">.</span><span class="n">y</span> <span class="o">-</span> <span class="n">hedef</span><span class="p">.</span><span class="n">y</span><span class="p">)</span>
        <span class="n">odul</span> <span class="o">-=</span> <span class="mf">0.1</span> <span class="o">*</span> <span class="n">mesafe</span>  <span class="c1"># Hedeften uzak kalmayı cezalandırır.
</span>
    <span class="n">ayni_konum</span> <span class="o">=</span> <span class="n">ajanlar</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="n">konum</span> <span class="o">==</span> <span class="n">ajanlar</span><span class="p">[</span><span class="mi">1</span><span class="p">].</span><span class="n">konum</span>
    <span class="k">if</span> <span class="n">ayni_konum</span><span class="p">:</span>
        <span class="n">odul</span> <span class="o">-=</span> <span class="mi">10</span>  <span class="c1"># Çarpışmayı pahalı hâle getirir.
</span>
    <span class="k">if</span> <span class="nf">all</span><span class="p">(</span><span class="n">ajan</span><span class="p">.</span><span class="n">hedefte</span> <span class="k">for</span> <span class="n">ajan</span> <span class="ow">in</span> <span class="n">ajanlar</span><span class="p">):</span>
        <span class="n">odul</span> <span class="o">+=</span> <span class="mi">50</span>  <span class="c1"># Takım başarısını ödüllendirir.
</span>
    <span class="k">return</span> <span class="n">odul</span>
</code></pre></div></div>

<p>Bu tasarım basit görünse de kritik bir soruyu doğurur: Takım başarılı olduğunda hangi ajan ne kadar katkı sağladı? <strong>Kredi atama problemi</strong>, ortak ödülün bireysel davranışlarla ilişkilendirilmesini zorlaştırır.</p>

<h2 id="merkezi-eğitim-dağıtık-uygulama">Merkezi eğitim, dağıtık uygulama</h2>

<p>Yaygın çözümlerden biri <strong>Centralized Training, Decentralized Execution (CTDE)</strong> yaklaşımıdır. Eğitim sırasında merkezi sistem tüm ajanların durumlarını görebilir. Gerçek kullanımda ise her ajan yalnızca kendi gözlemiyle karar verir.</p>

<table>
  <thead>
    <tr>
      <th>Aşama</th>
      <th>Kullanılabilen bilgi</th>
      <th>Avantaj</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Eğitim</td>
      <td>Tüm ajanların gözlemleri</td>
      <td>Daha kararlı öğrenme</td>
    </tr>
    <tr>
      <td>Uygulama</td>
      <td>Yerel gözlem ve mesajlar</td>
      <td>Ölçeklenebilir otonomi</td>
    </tr>
  </tbody>
</table>

<p>MARL; trafik ışıklarının koordinasyonundan drone sürülerine, enerji şebekelerinden strateji oyunlarına kadar geniş bir alanda kullanılır. En büyük zorluk yalnızca iyi karar veren ajanlar üretmek değil, başkalarının değişen davranışlarına uyum sağlayan ekip arkadaşları ve rakipler geliştirmektir. Kısacası geleceğin yapay zekâları sadece düşünecek değil; pazarlık edecek, takım kuracak ve muhtemelen dijital toplantılardan bizim kadar yorulacak.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="yapay zeka" /><category term="pekiştirmeli öğrenme" /><category term="multi-agent" /><category term="makine öğrenmesi" /><category term="python" /><category term="otonom sistemler" /><summary type="html"><![CDATA[Tek bir yapay zekânın oyun oynamayı öğrenmesi etkileyicidir; ancak aynı ortama birden fazla öğrenen ajan koyduğumuzda işler hızla bilim kurgu filmine dönüşür. Ajanlar yardımlaşabilir, kaynaklar için kapışabilir, birbirlerini kandırabilir veya ortak bir dil geliştirebilir. Multi-Agent Reinforcement Learning (MARL), yani çok ajanlı pekiştirmeli öğrenme, tam olarak bu hareketli dünyayı inceler.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/multi-agent-reinforcement-78.png" /><media:content medium="image" url="https://program.sonsuz.us/img/multi-agent-reinforcement-78.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Optuna ile Akıllı Hyperparameter Optimizasyonu: Rastgele Aramadan Bayesçi Aramaya</title><link href="https://program.sonsuz.us/posts/optuna-ile-akilli-hyperparameter-optimizasyonu-rastgele-aramadan-bayesci-aramaya/" rel="alternate" type="text/html" title="Optuna ile Akıllı Hyperparameter Optimizasyonu: Rastgele Aramadan Bayesçi Aramaya" /><published>2026-09-26T00:00:00+00:00</published><updated>2026-09-26T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/optuna-ile-akilli-hyperparameter-optimizasyonu-rastgele-aramadan-bayesci-aramaya</id><content type="html" xml:base="https://program.sonsuz.us/posts/optuna-ile-akilli-hyperparameter-optimizasyonu-rastgele-aramadan-bayesci-aramaya/"><![CDATA[<p>Bir makine öğrenmesi modelinin başarısı yalnızca veriye ve algoritmaya bağlı değildir; öğrenme oranı, ağaç derinliği veya düzenlileştirme katsayısı gibi hyperparameter’lar da sonucu ciddi biçimde değiştirir. Bu ayarları elle denemek, karanlık bir odada doğru anahtarı aramaya benzer. Optuna ise önceki denemelerden öğrenir, umut vermeyen deneyleri erkenden durdurur ve hesaplama bütçesini daha mantıklı adaylara yönlendirir.
``</p>

<h2 id="hyperparameter-optimizasyonu-neyi-çözer">Hyperparameter optimizasyonu neyi çözer?</h2>

<p>Model eğitimi, seçilen hyperparameter vektörü $x$ için bir doğrulama kaybı üretir. Optimizasyonun amacı kabaca şudur:</p>

\[x^* = \operatorname{argmin}_{x \in X} f(x)\]

<p>Burada $X$ arama uzayı, $f(x)$ ise eğitim ve doğrulama sürecinin sonunda ölçülen kayıptır. Sorun şu ki $f$ genellikle türevlenebilir değildir, her değerlendirme pahalıdır ve eğitimdeki rastlantısallık nedeniyle gürültülü sonuçlar verebilir. Dolayısıyla klasik gradyan inişi yerine, olabildiğince az deneyle iyi bölgeleri keşfeden yöntemlere ihtiyaç duyarız.</p>

<h2 id="grid-rastgele-ve-bayesçi-arama">Grid, rastgele ve Bayesçi arama</h2>

<table>
  <thead>
    <tr>
      <th>Yöntem</th>
      <th>Aday seçimi</th>
      <th>Güçlü yanı</th>
      <th>Zayıf yanı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Grid Search</td>
      <td>Sabit bir ızgara</td>
      <td>Basit ve tekrarlanabilir</td>
      <td>Boyut arttıkça maliyet patlar</td>
    </tr>
    <tr>
      <td>Random Search</td>
      <td>Dağılımlardan rastgele</td>
      <td>Önemli parametreleri daha hızlı keşfedebilir</td>
      <td>Geçmiş sonuçları kullanmaz</td>
    </tr>
    <tr>
      <td>Bayesçi Optimizasyon</td>
      <td>Önceki denemelere göre</td>
      <td>Deneme bütçesini akıllıca harcar</td>
      <td>Ek modelleme ve ayar gerektirir</td>
    </tr>
  </tbody>
</table>

<p>Grid Search’te her parametre için $k$ değer ve toplam $d$ parametre varsa yaklaşık $k^d$ kombinasyon oluşur. Beş parametrenin her biri için on seçenek belirlemek, $10^5$ eğitim anlamına gelir. Kahve makinesi bile bu planı görünce istifa edebilir.</p>

<p>Random Search bu maliyeti azaltır; ancak iyi ve kötü denemeler arasında hafıza kurmaz. Bayesçi yaklaşım ise gözlenen $(x, f(x))$ çiftlerinden yararlanarak sıradaki adayın nereden seçileceğine karar verir. Amaç yalnızca mevcut en iyi bölgeyi sömürmek değil, belirsiz alanları keşfetmektir. Bu dengeye <strong>exploration–exploitation</strong> dengesi denir.</p>

<h2 id="optunanın-mimarisi">Optuna’nın mimarisi</h2>

<p>Optuna’da optimizasyon sürecinin merkezi <strong>Study</strong> nesnesidir. Her model eğitimi bir <strong>Trial</strong>, parametreleri öneren bileşen <strong>Sampler</strong>, başarısız olması muhtemel eğitimleri durduran bileşen ise <strong>Pruner</strong> olarak adlandırılır. Sonuçlar bellek, SQLite veya ilişkisel bir veritabanında saklanabilir.</p>

<p>Optuna’nın varsayılan yöntemlerinden TPE, yani Tree-structured Parzen Estimator, başarılı ve başarısız denemeler için iki olasılık yoğunluğu kurar:</p>

\[l(x) = p(x \mid y &lt; y^*), \qquad g(x) = p(x \mid y \geq y^*)\]

<p>Yeni adaylar, kabaca $l(x) / g(x)$ oranının yüksek olduğu bölgelerden seçilir. Başka bir deyişle Optuna, iyi sonuçlarda sık görülen fakat kötü sonuçlarda seyrek kalan parametrelere öncelik verir. Koşullu arama uzaylarını desteklediği için seçilen modele göre farklı parametreler de tanımlanabilir.</p>

<h2 id="uygulamalı-bir-örnek">Uygulamalı bir örnek</h2>

<p>Aşağıdaki kod, Random Forest modelinin temel ayarlarını optimize eder:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">optuna</span>
<span class="kn">from</span> <span class="n">sklearn.datasets</span> <span class="kn">import</span> <span class="n">load_breast_cancer</span>
<span class="kn">from</span> <span class="n">sklearn.ensemble</span> <span class="kn">import</span> <span class="n">RandomForestClassifier</span>
<span class="kn">from</span> <span class="n">sklearn.model_selection</span> <span class="kn">import</span> <span class="n">cross_val_score</span>

<span class="n">X</span><span class="p">,</span> <span class="n">y</span> <span class="o">=</span> <span class="nf">load_breast_cancer</span><span class="p">(</span><span class="n">return_X_y</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>

<span class="k">def</span> <span class="nf">objective</span><span class="p">(</span><span class="n">trial</span><span class="p">):</span>
    <span class="n">params</span> <span class="o">=</span> <span class="p">{</span>
        <span class="sh">"</span><span class="s">n_estimators</span><span class="sh">"</span><span class="p">:</span> <span class="n">trial</span><span class="p">.</span><span class="nf">suggest_int</span><span class="p">(</span><span class="sh">"</span><span class="s">n_estimators</span><span class="sh">"</span><span class="p">,</span> <span class="mi">50</span><span class="p">,</span> <span class="mi">400</span><span class="p">),</span>
        <span class="sh">"</span><span class="s">max_depth</span><span class="sh">"</span><span class="p">:</span> <span class="n">trial</span><span class="p">.</span><span class="nf">suggest_int</span><span class="p">(</span><span class="sh">"</span><span class="s">max_depth</span><span class="sh">"</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">20</span><span class="p">),</span>
        <span class="sh">"</span><span class="s">min_samples_split</span><span class="sh">"</span><span class="p">:</span> <span class="n">trial</span><span class="p">.</span><span class="nf">suggest_int</span><span class="p">(</span><span class="sh">"</span><span class="s">min_samples_split</span><span class="sh">"</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">16</span><span class="p">),</span>
        <span class="sh">"</span><span class="s">max_features</span><span class="sh">"</span><span class="p">:</span> <span class="n">trial</span><span class="p">.</span><span class="nf">suggest_float</span><span class="p">(</span><span class="sh">"</span><span class="s">max_features</span><span class="sh">"</span><span class="p">,</span> <span class="mf">0.2</span><span class="p">,</span> <span class="mf">1.0</span><span class="p">)</span>
    <span class="p">}</span>

    <span class="n">model</span> <span class="o">=</span> <span class="nc">RandomForestClassifier</span><span class="p">(</span><span class="o">**</span><span class="n">params</span><span class="p">,</span> <span class="n">random_state</span><span class="o">=</span><span class="mi">42</span><span class="p">)</span>
    <span class="n">score</span> <span class="o">=</span> <span class="nf">cross_val_score</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">X</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">cv</span><span class="o">=</span><span class="mi">5</span><span class="p">,</span> <span class="n">scoring</span><span class="o">=</span><span class="sh">"</span><span class="s">accuracy</span><span class="sh">"</span><span class="p">).</span><span class="nf">mean</span><span class="p">()</span>
    <span class="k">return</span> <span class="n">score</span>

<span class="n">study</span> <span class="o">=</span> <span class="n">optuna</span><span class="p">.</span><span class="nf">create_study</span><span class="p">(</span><span class="n">direction</span><span class="o">=</span><span class="sh">"</span><span class="s">maximize</span><span class="sh">"</span><span class="p">)</span>
<span class="n">study</span><span class="p">.</span><span class="nf">optimize</span><span class="p">(</span><span class="n">objective</span><span class="p">,</span> <span class="n">n_trials</span><span class="o">=</span><span class="mi">50</span><span class="p">)</span>

<span class="nf">print</span><span class="p">(</span><span class="n">study</span><span class="p">.</span><span class="n">best_value</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="n">study</span><span class="p">.</span><span class="n">best_params</span><span class="p">)</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">objective</code> fonksiyonu bir denemenin nasıl değerlendirileceğini tanımlar. <code class="language-plaintext highlighter-rouge">suggest_int</code> ve <code class="language-plaintext highlighter-rouge">suggest_float</code> çağrıları arama uzayını oluştururken <code class="language-plaintext highlighter-rouge">study.optimize</code>, sampler tarafından seçilen adayları sırayla çalıştırır. Sinir ağları gibi aşamalı eğitimlerde ara skorlar <code class="language-plaintext highlighter-rouge">trial.report()</code> ile bildirilip <code class="language-plaintext highlighter-rouge">trial.should_prune()</code> ile kötü denemeler erkenden kesilebilir.</p>

<p>Sonuç olarak Optuna sihirli biçimde mükemmel modeli garanti etmez; fakat deneme geçmişini, olasılıksal örneklemeyi, budamayı ve kalıcı depolamayı aynı mimaride birleştirir. Böylece hyperparameter araması, elle sayı çevirdiğimiz bir kumar makinesinden ölçülebilir ve tekrarlanabilir bir optimizasyon sürecine dönüşür.</p>

<p><img src="/img/optuna-ile-akilli-49.svg" alt="optuna-ile-akilli-49" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="optuna" /><category term="makine öğrenmesi" /><category term="hyperparameter" /><category term="bayes optimizasyonu" /><category term="python" /><category term="yapay zeka" /><summary type="html"><![CDATA[Bir makine öğrenmesi modelinin başarısı yalnızca veriye ve algoritmaya bağlı değildir; öğrenme oranı, ağaç derinliği veya düzenlileştirme katsayısı gibi hyperparameter’lar da sonucu ciddi biçimde değiştirir. Bu ayarları elle denemek, karanlık bir odada doğru anahtarı aramaya benzer. Optuna ise önceki denemelerden öğrenir, umut vermeyen deneyleri erkenden durdurur ve hesaplama bütçesini daha mantıklı adaylara yönlendirir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/optuna-ile-akilli-49.png" /><media:content medium="image" url="https://program.sonsuz.us/img/optuna-ile-akilli-49.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>