<?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-26T06:05:39+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">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">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">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">Transfer Öğrenme ile Küçük Veriden Büyük Sonuçlar Çıkarmak</title><link href="https://program.sonsuz.us/posts/transfer-ogrenme-ile-kucuk-veriden-buyuk-sonuclar-cikarmak/" rel="alternate" type="text/html" title="Transfer Öğrenme ile Küçük Veriden Büyük Sonuçlar Çıkarmak" /><published>2026-09-26T00:00:00+00:00</published><updated>2026-09-26T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/transfer-ogrenme-ile-kucuk-veriden-buyuk-sonuclar-cikarmak</id><content type="html" xml:base="https://program.sonsuz.us/posts/transfer-ogrenme-ile-kucuk-veriden-buyuk-sonuclar-cikarmak/"><![CDATA[<p>Bir görüntü sınıflandırma modeli geliştirmek istiyorsunuz ancak elinizde yalnızca birkaç yüz örnek var. Sıfırdan eğitilen dev bir sinir ağı bu veriyi ezberleyip gerçek dünyada tökezleyebilir. Neyse ki teknoloji devlerinin milyonlarca örnekle eğittiği modellerin öğrendiği zihinsel haritaları ödünç alabiliriz. <strong>Transfer öğrenme</strong>, küçük veri setlerinin süper gücü tam olarak budur.
``</p>

<h2 id="transfer-öğrenme-nedir">Transfer öğrenme nedir?</h2>

<p>Derin sinir ağlarının ilk katmanları kenar, renk ve doku gibi genel örüntüleri; ilerleyen katmanları ise nesne parçaları ve sınıfa özgü yapıları öğrenir. Bir kediyi tanımak için öğrenilen kenar dedektörleri, otomobil veya yaprak sınıflandırırken de işe yarar. Böylece modelin bütün bilgisini çöpe atmak yerine yalnızca probleminize özgü bölümünü değiştirirsiniz.</p>

<p>Kaynak görevde öğrenilen parametreleri $w_s$, hedef görev için aradığımız parametreleri $w_t$ ile gösterelim. Transfer öğrenmenin temel fikri şudur:</p>

\[w_t^{(0)} = w_s\]

<p>Yani hedef model rastgele başlamaz; eğitim maratonuna başlangıç çizgisinden değil, parkurun büyük bölümünü tamamlamış halde girer. Ardından hedef veri üzerindeki kayıp fonksiyonu küçültülür:</p>

\[w_t^* = \arg\min_w \frac{1}{N}\sum_{i=1}^{N} L(f(x_i;w), y_i)\]

<p>$N$ küçük olduğunda iyi bir başlangıç noktası, aşırı öğrenme riskini ciddi biçimde azaltabilir.</p>

<h2 id="i̇ki-temel-strateji">İki temel strateji</h2>

<table>
  <thead>
    <tr>
      <th>Strateji</th>
      <th>Katmanların durumu</th>
      <th style="text-align: right">Veri ihtiyacı</th>
      <th>Ne zaman kullanılmalı?</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Özellik çıkarımı</td>
      <td>Omurga dondurulur</td>
      <td style="text-align: right">Çok düşük</td>
      <td>Veri az ve kaynak görev benzerse</td>
    </tr>
    <tr>
      <td>İnce ayar</td>
      <td>Bazı katmanlar açılır</td>
      <td style="text-align: right">Orta</td>
      <td>Veri daha fazla veya alan farklıysa</td>
    </tr>
    <tr>
      <td>Sıfırdan eğitim</td>
      <td>Tüm ağırlıklar rastgele</td>
      <td style="text-align: right">Çok yüksek</td>
      <td>Büyük ve özgün bir veri seti varsa</td>
    </tr>
  </tbody>
</table>

<p><strong>Özellik çıkarımında</strong> önceden eğitilmiş ağ sabit bir dönüştürücü gibi davranır. Sadece son sınıflandırma katmanı eğitilir. <strong>İnce ayarda</strong> ise üst katmanlardan bazıları düşük öğrenme oranıyla güncellenir. Bu, modele “Bildiklerini unutma ama bizim lehçemizi de öğren” demektir.</p>

<h2 id="pytorch-ile-uygulama">PyTorch ile uygulama</h2>

<p>Aşağıdaki örnek, ImageNet üzerinde eğitilmiş ResNet18 modelini üç sınıflı bir problem için hazırlar:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">torch.nn</span> <span class="k">as</span> <span class="n">nn</span>
<span class="kn">from</span> <span class="n">torchvision.models</span> <span class="kn">import</span> <span class="n">resnet18</span><span class="p">,</span> <span class="n">ResNet18_Weights</span>

<span class="n">model</span> <span class="o">=</span> <span class="nf">resnet18</span><span class="p">(</span><span class="n">weights</span><span class="o">=</span><span class="n">ResNet18_Weights</span><span class="p">.</span><span class="n">DEFAULT</span><span class="p">)</span>

<span class="c1"># Önceden öğrenilmiş özellikleri koru.
</span><span class="k">for</span> <span class="n">parameter</span> <span class="ow">in</span> <span class="n">model</span><span class="p">.</span><span class="nf">parameters</span><span class="p">():</span>
    <span class="n">parameter</span><span class="p">.</span><span class="n">requires_grad</span> <span class="o">=</span> <span class="bp">False</span>

<span class="c1"># Eski 1000 sınıflı çıkışı kendi problemimize uyarla.
</span><span class="n">input_features</span> <span class="o">=</span> <span class="n">model</span><span class="p">.</span><span class="n">fc</span><span class="p">.</span><span class="n">in_features</span>
<span class="n">model</span><span class="p">.</span><span class="n">fc</span> <span class="o">=</span> <span class="n">nn</span><span class="p">.</span><span class="nc">Linear</span><span class="p">(</span><span class="n">input_features</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>
</code></pre></div></div>

<p>Burada omurganın parametreleri dondurulur, ancak yeni <code class="language-plaintext highlighter-rouge">model.fc</code> katmanı varsayılan olarak eğitilebilir durumdadır. Optimize ediciye yalnızca güncellenecek parametreleri vermek gereksiz hesaplamayı önler:</p>

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

<span class="n">optimizer</span> <span class="o">=</span> <span class="n">optim</span><span class="p">.</span><span class="nc">Adam</span><span class="p">(</span>
    <span class="nf">filter</span><span class="p">(</span><span class="k">lambda</span> <span class="n">p</span><span class="p">:</span> <span class="n">p</span><span class="p">.</span><span class="n">requires_grad</span><span class="p">,</span> <span class="n">model</span><span class="p">.</span><span class="nf">parameters</span><span class="p">()),</span>
    <span class="n">lr</span><span class="o">=</span><span class="mf">1e-3</span>
<span class="p">)</span>
<span class="n">criterion</span> <span class="o">=</span> <span class="n">nn</span><span class="p">.</span><span class="nc">CrossEntropyLoss</span><span class="p">()</span>
</code></pre></div></div>

<p>İlk eğitimden sonra doğrulama başarımı tıkanırsa son katman grubunu açarak ince ayar yapabiliriz:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">for</span> <span class="n">parameter</span> <span class="ow">in</span> <span class="n">model</span><span class="p">.</span><span class="n">layer4</span><span class="p">.</span><span class="nf">parameters</span><span class="p">():</span>
    <span class="n">parameter</span><span class="p">.</span><span class="n">requires_grad</span> <span class="o">=</span> <span class="bp">True</span>

<span class="n">optimizer</span> <span class="o">=</span> <span class="n">optim</span><span class="p">.</span><span class="nc">Adam</span><span class="p">(</span>
    <span class="nf">filter</span><span class="p">(</span><span class="k">lambda</span> <span class="n">p</span><span class="p">:</span> <span class="n">p</span><span class="p">.</span><span class="n">requires_grad</span><span class="p">,</span> <span class="n">model</span><span class="p">.</span><span class="nf">parameters</span><span class="p">()),</span>
    <span class="n">lr</span><span class="o">=</span><span class="mf">1e-5</span>
<span class="p">)</span>
</code></pre></div></div>

<p>Düşük öğrenme oranı önemlidir; büyük adımlar, önceden öğrenilmiş yararlı temsilleri bozarak <strong>felaket unutmaya</strong> yol açabilir.</p>

<h2 id="küçük-veriyi-daha-da-verimli-kullanmak">Küçük veriyi daha da verimli kullanmak</h2>

<p>Veri artırma sırasında döndürme, kırpma, renk değişimi ve yatay çevirme gibi işlemler uygulanabilir. Ancak tıbbi görüntüler veya yönün anlam taşıdığı veriler için her dönüşüm mantıklı değildir. Dikey çevrilmiş bir trafik levhası modele yaratıcılık değil, kafa karışıklığı kazandırabilir.</p>

<p>Eğitim ve doğrulama kümelerini dikkatle ayırmak, sınıf dengesini izlemek ve erken durdurma kullanmak da önemlidir. Başarıyı yalnızca doğrulukla ölçmeyin; dengesiz veri setlerinde precision, recall ve F1 skoru daha açıklayıcıdır.</p>

<p>Transfer öğrenme sihirli değnek değildir: Kaynak ve hedef alanlar çok farklıysa <strong>negatif transfer</strong> oluşabilir. Yine de doğru model, kontrollü ince ayar ve gerçekçi doğrulama ile birkaç yüz örnekten şaşırtıcı derecede güçlü sistemler üretmek mümkündür. Kısacası devlerin omzuna çıkın; fakat direksiyonu kendi probleminize göre çevirmeyi unutmayın.</p>

<p><img src="/img/transfer-ogrenme-ile-22.svg" alt="transfer-ogrenme-ile-22" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="transfer öğrenme" /><category term="makine öğrenmesi" /><category term="derin öğrenme" /><category term="yapay zeka" /><category term="python" /><category term="pytorch" /><summary type="html"><![CDATA[Bir görüntü sınıflandırma modeli geliştirmek istiyorsunuz ancak elinizde yalnızca birkaç yüz örnek var. Sıfırdan eğitilen dev bir sinir ağı bu veriyi ezberleyip gerçek dünyada tökezleyebilir. Neyse ki teknoloji devlerinin milyonlarca örnekle eğittiği modellerin öğrendiği zihinsel haritaları ödünç alabiliriz. Transfer öğrenme, küçük veri setlerinin süper gücü tam olarak budur.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/transfer-ogrenme-ile-22.png" /><media:content medium="image" url="https://program.sonsuz.us/img/transfer-ogrenme-ile-22.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Yönlendirilmiş Dikkat: Sinir Ağlarının Görsel Odak Noktası</title><link href="https://program.sonsuz.us/posts/yonlendirilmis-dikkat-sinir-aglarinin-gorsel-odak-noktasi/" rel="alternate" type="text/html" title="Yönlendirilmiş Dikkat: Sinir Ağlarının Görsel Odak Noktası" /><published>2026-09-26T00:00:00+00:00</published><updated>2026-09-26T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/yonlendirilmis-dikkat-sinir-aglarinin-gorsel-odak-noktasi</id><content type="html" xml:base="https://program.sonsuz.us/posts/yonlendirilmis-dikkat-sinir-aglarinin-gorsel-odak-noktasi/"><![CDATA[<p>Bir fotoğrafta kedi ararken duvardaki çatlakları, masanın desenini veya perde kıvrımlarını uzun uzun incelemeyiz; gözümüz hızla kulak, göz ve pati gibi ayırt edici bölgelere yönelir. Yönlendirilmiş dikkat (targeted attention), sinir ağlarına benzer bir seçicilik kazandırır. Model bütün pikselleri eşit derecede önemli kabul etmek yerine, yaptığı görev açısından anlamlı bölgelere daha yüksek ağırlık verir. Böylece hem tahminler iyileşebilir hem de ağın kararını nereden çıkardığı daha anlaşılır hâle gelebilir.</p>

<p>``</p>

<h2 id="dikkat-mekanizmasının-temel-fikri">Dikkat mekanizmasının temel fikri</h2>

<p>Bir evrişimli sinir ağı, görüntüyü doğrudan “kedi” veya “otomobil” olarak görmez. Ara katmanlarda $H \times W \times C$ boyutlu özellik haritaları üretir. Burada $H$ ve $W$ uzamsal boyutları, $C$ ise kanal sayısını temsil eder. Dikkat modülü bu özellikler için genellikle $0$ ile $1$ arasında ağırlıklar hesaplar.</p>

<p>Bir konumdaki özellik vektörü $x_i$, dikkat puanı ise $a_i$ olsun. Dikkatli temsil şu şekilde yazılabilir:</p>

\[z = \sum_{i=1}^{N} \alpha_i x_i, \qquad
\alpha_i = \frac{e^{a_i}}{\sum_{j=1}^{N} e^{a_j}}\]

<p>Softmax sayesinde $\sum_i \alpha_i=1$ olur. Yani model, elindeki sınırlı “ilgi bütçesini” görüntünün farklı bölgelerine dağıtır. Yüksek $\alpha_i$ alan pikseller veya yamalar kararda daha etkili olur.</p>

<h2 id="hangi-dikkat-türü-neye-odaklanır">Hangi dikkat türü neye odaklanır?</h2>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Odaklandığı şey</th>
      <th>Güçlü yanı</th>
      <th>Sınırlaması</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Uzamsal dikkat</td>
      <td>Görüntüdeki konumlar</td>
      <td>Nesnenin bulunduğu alanı vurgular</td>
      <td>Arka plan ipuçlarına aldanabilir</td>
    </tr>
    <tr>
      <td>Kanal dikkati</td>
      <td>Özellik kanalları</td>
      <td>Renk, kenar veya doku filtrelerini seçer</td>
      <td>Konumu doğrudan açıklamaz</td>
    </tr>
    <tr>
      <td>Self-attention</td>
      <td>Bölgeler arası ilişkiler</td>
      <td>Uzak pikselleri ilişkilendirir</td>
      <td>Hesaplama maliyeti büyüyebilir</td>
    </tr>
    <tr>
      <td>Sert dikkat</td>
      <td>Seçilen birkaç bölge</td>
      <td>Verimli ve keskin odak sağlar</td>
      <td>Ayrık seçim nedeniyle eğitimi zordur</td>
    </tr>
    <tr>
      <td>Yumuşak dikkat</td>
      <td>Tüm bölgelere ağırlık verir</td>
      <td>Türevlenebilir ve kolay eğitilir</td>
      <td>Gereksiz bölgelere küçük de olsa pay ayırır</td>
    </tr>
  </tbody>
</table>

<p>“Yönlendirilmiş” ifadesi, dikkatin yalnızca görüntü içinden kendiliğinden doğması gerekmediğini de anlatır. Bir sınıf etiketi, metin sorgusu, nesne koordinatı veya önceki video karesi hedef sinyali olabilir. Örneğin “kırmızı çantayı bul” sorgusu verildiğinde model hem kırmızılığa hem de çantaya benzeyen şekillere odaklanır.</p>

<h2 id="basit-bir-uzamsal-dikkat-modülü">Basit bir uzamsal dikkat modülü</h2>

<p>Aşağıdaki PyTorch modülü, kanal boyunca ortalama ve maksimum özet çıkarır. Ardından bir evrişim ve sigmoid kullanarak tek kanallı dikkat haritası üretir. Son çarpma işlemi önemli bölgeleri güçlendirir:</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</span> <span class="k">as</span> <span class="n">nn</span>

<span class="k">class</span> <span class="nc">SpatialAttention</span><span class="p">(</span><span class="n">nn</span><span class="p">.</span><span class="n">Module</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">kernel_size</span><span class="o">=</span><span class="mi">7</span><span class="p">):</span>
        <span class="nf">super</span><span class="p">().</span><span class="nf">__init__</span><span class="p">()</span>
        <span class="n">padding</span> <span class="o">=</span> <span class="n">kernel_size</span> <span class="o">//</span> <span class="mi">2</span>
        <span class="n">self</span><span class="p">.</span><span class="n">score</span> <span class="o">=</span> <span class="n">nn</span><span class="p">.</span><span class="nc">Conv2d</span><span class="p">(</span>
            <span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">kernel_size</span><span class="p">,</span> <span class="n">padding</span><span class="o">=</span><span class="n">padding</span><span class="p">,</span> <span class="n">bias</span><span class="o">=</span><span class="bp">False</span>
        <span class="p">)</span>

    <span class="k">def</span> <span class="nf">forward</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">features</span><span class="p">):</span>
        <span class="n">average</span> <span class="o">=</span> <span class="n">features</span><span class="p">.</span><span class="nf">mean</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">keepdim</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
        <span class="n">maximum</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">features</span><span class="p">.</span><span class="nf">max</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">keepdim</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
        <span class="n">summary</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="nf">cat</span><span class="p">([</span><span class="n">average</span><span class="p">,</span> <span class="n">maximum</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">attention</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="nf">sigmoid</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="nf">score</span><span class="p">(</span><span class="n">summary</span><span class="p">))</span>
        <span class="n">focused</span> <span class="o">=</span> <span class="n">features</span> <span class="o">*</span> <span class="n">attention</span>
        <span class="k">return</span> <span class="n">focused</span><span class="p">,</span> <span class="n">attention</span>
</code></pre></div></div>

<p>Buradaki <code class="language-plaintext highlighter-rouge">attention</code>, görselleştirilebilen bir ısı haritasıdır. Ancak parlak bir bölge görmek, modelin karar nedenini kesin olarak kanıtlamaz. Dikkat haritası açıklanabilirlik için yararlı bir ipucu olsa da nedensellik testi değildir.</p>

<h2 id="model-gerçekten-doğru-yere-mi-bakıyor">Model gerçekten doğru yere mi bakıyor?</h2>

<p>Sadece doğruluk ölçmek yeterli değildir. Dikkat haritası insan tarafından işaretlenmiş nesne maskesiyle karşılaştırılabilir. Eşiklenmiş dikkat alanı $A$, gerçek bölge $G$ ise kesişim-birleşim oranı şöyledir:</p>

\[IoU = \frac{\vert A \cap G\vert }{\vert A \cup G\vert }\]

<p>Ayrıca görüntünün en dikkatli kısmını kapatıp tahmin güveninin düşüp düşmediği incelenebilir. Güven belirgin biçimde azalıyorsa model gerçekten o bölgeden yararlanıyor olabilir. Tersine, nesne yerine filigrana odaklanan bir ağ veri kümesindeki kestirme yolları öğrenmiş demektir.</p>

<p>Yönlendirilmiş dikkat; tıbbi görüntüleme, otonom sürüş, nesne takibi ve görsel soru cevaplama gibi alanlarda modelin enerjisini doğru yere toplar. Kısacası mesele daha fazla piksel görmek değil, hangi pikselin neden önemli olduğunu öğrenmektir.</p>

<p><img src="/img/yonlendirilmis-dikkat-sinir-45.svg" alt="yonlendirilmis-dikkat-sinir-45" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="yapay zeka" /><category term="bilgisayarlı görü" /><category term="derin öğrenme" /><category term="dikkat mekanizması" /><category term="pytorch" /><category term="sinir ağları" /><summary type="html"><![CDATA[Bir fotoğrafta kedi ararken duvardaki çatlakları, masanın desenini veya perde kıvrımlarını uzun uzun incelemeyiz; gözümüz hızla kulak, göz ve pati gibi ayırt edici bölgelere yönelir. Yönlendirilmiş dikkat (targeted attention), sinir ağlarına benzer bir seçicilik kazandırır. Model bütün pikselleri eşit derecede önemli kabul etmek yerine, yaptığı görev açısından anlamlı bölgelere daha yüksek ağırlık verir. Böylece hem tahminler iyileşebilir hem de ağın kararını nereden çıkardığı daha anlaşılır hâle gelebilir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/yonlendirilmis-dikkat-sinir-45.png" /><media:content medium="image" url="https://program.sonsuz.us/img/yonlendirilmis-dikkat-sinir-45.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">2-SAT Problemlerini SCC ile Doğrusal Zamanda Çözmek</title><link href="https://program.sonsuz.us/posts/2-sat-problemlerini-scc-ile-dogrusal-zamanda-cozmek/" rel="alternate" type="text/html" title="2-SAT Problemlerini SCC ile Doğrusal Zamanda Çözmek" /><published>2026-09-25T00:00:00+00:00</published><updated>2026-09-25T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/2-sat-problemlerini-scc-ile-dogrusal-zamanda-cozmek</id><content type="html" xml:base="https://program.sonsuz.us/posts/2-sat-problemlerini-scc-ile-dogrusal-zamanda-cozmek/"><![CDATA[<p>Bir festivalde her etkinlik için “yapılsın” veya “yapılmasın” kararı verdiğimizi düşünelim. Kurallar ise “Konser yapılacaksa güvenlik ekibi gelsin” ya da “Ya konser ya tiyatro seçilsin” biçiminde olsun. Binlerce ikili karar birbirine bağlandığında deneme-yanılma yaklaşımı hızla çöker. 2-SAT, tam da bu tür sistemlerin çözülebilirliğini yönlü grafikler ve güçlü bağlı bileşenler sayesinde zarifçe belirler.</p>

<p>``</p>

<h2 id="2-sat-nedir">2-SAT nedir?</h2>

<p>2-SAT formülleri, her parantezinde en fazla iki literal bulunan ve bağlaçlarla birleştirilen ifadelerdir:</p>

\[(x_1 \lor \neg x_2) \land (x_2 \lor x_3) \land (\neg x_1 \lor \neg x_3)\]

<p>Literal, bir değişkenin kendisi ($x$) veya değili ($\neg x$) olabilir. Genel bir madde $(a \lor b)$ biçimindedir. Bu ifade yalnızca $a$ ve $b$ birlikte yanlış olduğunda bozulur. Dolayısıyla şu iki zorunluluğu türetebiliriz:</p>

\[(a \lor b) \equiv (\neg a \Rightarrow b) \land (\neg b \Rightarrow a)\]

<p>Her zorunluluğu yönlü bir kenara dönüştürürsek <strong>implikasyon grafiği</strong> ortaya çıkar.</p>

<table>
  <thead>
    <tr>
      <th>Mantıksal kısıt</th>
      <th>Grafiğe eklenen kenarlar</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>$a \lor b$</td>
      <td>$\neg a \to b$, $\neg b \to a$</td>
    </tr>
    <tr>
      <td>$a \Rightarrow b$</td>
      <td>$a \to b$, $\neg b \to \neg a$</td>
    </tr>
    <tr>
      <td>$a$ doğru olmalı</td>
      <td>$\neg a \to a$</td>
    </tr>
    <tr>
      <td>$a$ ve $b$ eşit</td>
      <td>$a \to b$, $b \to a$, $\neg a \to \neg b$, $\neg b \to \neg a$</td>
    </tr>
  </tbody>
</table>

<h2 id="scc-neden-çözümü-belirliyor">SCC neden çözümü belirliyor?</h2>

<p>Bir güçlü bağlı bileşende, her düğümden diğer bütün düğümlere ulaşılabilir. Eğer $x$ ile $\neg x$ aynı SCC içindeyse hem $x \Rightarrow \neg x$ hem de $\neg x \Rightarrow x$ geçerlidir. Hangi doğruluk değerini seçersek seçelim sistem tersini de zorlar; formül çözülemez.</p>

<p>Böylece temel ölçüt şudur:</p>

\[\text{Formül çözülebilir} \iff \forall x_i,\ SCC(x_i) \ne SCC(\neg x_i)\]

<p>Bu, yönlü döngülerin mantıksal çelişkiyi görünür hâle getirmesidir. SCC’ler Tarjan veya Kosaraju algoritmasıyla $O(V+E)$ zamanda bulunur. $n$ değişken ve $m$ madde için grafikte $2n$ düğüm, $2m$ kenar bulunduğundan toplam karmaşıklık $O(n+m)$ olur.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th style="text-align: right">Zaman</th>
      <th>Büyük girdilerde durum</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Tüm atamaları denemek</td>
      <td style="text-align: right">$O(2^n)$</td>
      <td>Hızla kullanılamaz</td>
    </tr>
    <tr>
      <td>SCC tabanlı 2-SAT</td>
      <td style="text-align: right">$O(n+m)$</td>
      <td>Milyonlarca kısıta uygundur</td>
    </tr>
  </tbody>
</table>

<h2 id="kosaraju-ile-uygulama">Kosaraju ile uygulama</h2>

<p>Aşağıdaki C++ kodu, pozitif literali <code class="language-plaintext highlighter-rouge">2*x</code>, negatifini <code class="language-plaintext highlighter-rouge">2*x+1</code> ile temsil eder. <code class="language-plaintext highlighter-rouge">p^1</code> işlemi bir literalden karşıtına geçer. İlk DFS bitiş sırasını, ikinci DFS ise ters grafikte bileşenleri üretir.</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;bits/stdc++.h&gt;</span><span class="cp">
</span><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>

<span class="k">struct</span> <span class="nc">TwoSAT</span> <span class="p">{</span>
    <span class="kt">int</span> <span class="n">n</span><span class="p">;</span>
    <span class="n">vector</span><span class="o">&lt;</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;&gt;</span> <span class="n">g</span><span class="p">,</span> <span class="n">rg</span><span class="p">;</span>
    <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">order</span><span class="p">,</span> <span class="n">comp</span><span class="p">,</span> <span class="n">used</span><span class="p">;</span>

    <span class="n">TwoSAT</span><span class="p">(</span><span class="kt">int</span> <span class="n">n</span><span class="p">)</span> <span class="o">:</span> <span class="n">n</span><span class="p">(</span><span class="n">n</span><span class="p">),</span> <span class="n">g</span><span class="p">(</span><span class="mi">2</span><span class="o">*</span><span class="n">n</span><span class="p">),</span> <span class="n">rg</span><span class="p">(</span><span class="mi">2</span><span class="o">*</span><span class="n">n</span><span class="p">),</span>
                    <span class="n">comp</span><span class="p">(</span><span class="mi">2</span><span class="o">*</span><span class="n">n</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">),</span> <span class="n">used</span><span class="p">(</span><span class="mi">2</span><span class="o">*</span><span class="n">n</span><span class="p">)</span> <span class="p">{}</span>

    <span class="c1">// (a OR b) maddesini implikasyon grafiğine ekler.</span>
    <span class="kt">void</span> <span class="nf">addClause</span><span class="p">(</span><span class="kt">int</span> <span class="n">a</span><span class="p">,</span> <span class="kt">int</span> <span class="n">b</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">g</span><span class="p">[</span><span class="n">a</span> <span class="o">^</span> <span class="mi">1</span><span class="p">].</span><span class="n">push_back</span><span class="p">(</span><span class="n">b</span><span class="p">);</span>
        <span class="n">rg</span><span class="p">[</span><span class="n">b</span><span class="p">].</span><span class="n">push_back</span><span class="p">(</span><span class="n">a</span> <span class="o">^</span> <span class="mi">1</span><span class="p">);</span>
        <span class="n">g</span><span class="p">[</span><span class="n">b</span> <span class="o">^</span> <span class="mi">1</span><span class="p">].</span><span class="n">push_back</span><span class="p">(</span><span class="n">a</span><span class="p">);</span>
        <span class="n">rg</span><span class="p">[</span><span class="n">a</span><span class="p">].</span><span class="n">push_back</span><span class="p">(</span><span class="n">b</span> <span class="o">^</span> <span class="mi">1</span><span class="p">);</span>
    <span class="p">}</span>

    <span class="kt">void</span> <span class="nf">dfs1</span><span class="p">(</span><span class="kt">int</span> <span class="n">v</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">used</span><span class="p">[</span><span class="n">v</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
        <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">u</span> <span class="o">:</span> <span class="n">g</span><span class="p">[</span><span class="n">v</span><span class="p">])</span> <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">used</span><span class="p">[</span><span class="n">u</span><span class="p">])</span> <span class="n">dfs1</span><span class="p">(</span><span class="n">u</span><span class="p">);</span>
        <span class="n">order</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">v</span><span class="p">);</span>
    <span class="p">}</span>

    <span class="kt">void</span> <span class="nf">dfs2</span><span class="p">(</span><span class="kt">int</span> <span class="n">v</span><span class="p">,</span> <span class="kt">int</span> <span class="n">id</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">comp</span><span class="p">[</span><span class="n">v</span><span class="p">]</span> <span class="o">=</span> <span class="n">id</span><span class="p">;</span>
        <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">u</span> <span class="o">:</span> <span class="n">rg</span><span class="p">[</span><span class="n">v</span><span class="p">])</span> <span class="k">if</span> <span class="p">(</span><span class="n">comp</span><span class="p">[</span><span class="n">u</span><span class="p">]</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="n">dfs2</span><span class="p">(</span><span class="n">u</span><span class="p">,</span> <span class="n">id</span><span class="p">);</span>
    <span class="p">}</span>

    <span class="kt">bool</span> <span class="nf">solve</span><span class="p">(</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">bool</span><span class="o">&gt;&amp;</span> <span class="n">value</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">v</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">v</span> <span class="o">&lt;</span> <span class="mi">2</span><span class="o">*</span><span class="n">n</span><span class="p">;</span> <span class="o">++</span><span class="n">v</span><span class="p">)</span>
            <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">used</span><span class="p">[</span><span class="n">v</span><span class="p">])</span> <span class="n">dfs1</span><span class="p">(</span><span class="n">v</span><span class="p">);</span>

        <span class="n">reverse</span><span class="p">(</span><span class="n">order</span><span class="p">.</span><span class="n">begin</span><span class="p">(),</span> <span class="n">order</span><span class="p">.</span><span class="n">end</span><span class="p">());</span>
        <span class="kt">int</span> <span class="n">id</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
        <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">v</span> <span class="o">:</span> <span class="n">order</span><span class="p">)</span>
            <span class="k">if</span> <span class="p">(</span><span class="n">comp</span><span class="p">[</span><span class="n">v</span><span class="p">]</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="n">dfs2</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="n">id</span><span class="o">++</span><span class="p">);</span>

        <span class="n">value</span><span class="p">.</span><span class="n">resize</span><span class="p">(</span><span class="n">n</span><span class="p">);</span>
        <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">x</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">x</span> <span class="o">&lt;</span> <span class="n">n</span><span class="p">;</span> <span class="o">++</span><span class="n">x</span><span class="p">)</span> <span class="p">{</span>
            <span class="k">if</span> <span class="p">(</span><span class="n">comp</span><span class="p">[</span><span class="mi">2</span><span class="o">*</span><span class="n">x</span><span class="p">]</span> <span class="o">==</span> <span class="n">comp</span><span class="p">[</span><span class="mi">2</span><span class="o">*</span><span class="n">x</span><span class="o">+</span><span class="mi">1</span><span class="p">])</span> <span class="k">return</span> <span class="nb">false</span><span class="p">;</span>
            <span class="n">value</span><span class="p">[</span><span class="n">x</span><span class="p">]</span> <span class="o">=</span> <span class="n">comp</span><span class="p">[</span><span class="mi">2</span><span class="o">*</span><span class="n">x</span><span class="p">]</span> <span class="o">&gt;</span> <span class="n">comp</span><span class="p">[</span><span class="mi">2</span><span class="o">*</span><span class="n">x</span><span class="o">+</span><span class="mi">1</span><span class="p">];</span>
        <span class="p">}</span>
        <span class="k">return</span> <span class="nb">true</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">};</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">solve</code>, çelişki yoksa örnek bir doğruluk ataması da üretir. Bileşen numaralarına göre yapılan karşılaştırma, SCC’lerin yoğunlaştırılmış grafiğindeki ters topolojik sıradan yararlanır.</p>

<p>Sonuç olarak 2-SAT’ın gücü, mantığı kaba kuvvetle çözmek yerine onu erişilebilirlik problemine dönüştürmesinden gelir. Bir değişken kendi değiliyle aynı yönlü döngünün içine hapsolmuşsa çelişki kaçınılmazdır; aksi durumda bileşen sırası tutarlı bir atamayı doğrudan verir.</p>

<p><img src="/img/2-sat-problemlerini-73.svg" alt="2-sat-problemlerini-73" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="2-sat" /><category term="graf teorisi" /><category term="güçlü bağlı bileşenler" /><category term="algoritma" /><category term="kosaraju" /><category term="mantıksal kısıtlamalar" /><summary type="html"><![CDATA[Bir festivalde her etkinlik için “yapılsın” veya “yapılmasın” kararı verdiğimizi düşünelim. Kurallar ise “Konser yapılacaksa güvenlik ekibi gelsin” ya da “Ya konser ya tiyatro seçilsin” biçiminde olsun. Binlerce ikili karar birbirine bağlandığında deneme-yanılma yaklaşımı hızla çöker. 2-SAT, tam da bu tür sistemlerin çözülebilirliğini yönlü grafikler ve güçlü bağlı bileşenler sayesinde zarifçe belirler.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/2-sat-problemlerini-73.png" /><media:content medium="image" url="https://program.sonsuz.us/img/2-sat-problemlerini-73.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Derin Öğrenmede Batch Normalization: Gradyanlara Açılan Güvenli Koridor</title><link href="https://program.sonsuz.us/posts/derin-ogrenmede-batch-normalization-gradyanlara-acilan-guvenli-koridor/" rel="alternate" type="text/html" title="Derin Öğrenmede Batch Normalization: Gradyanlara Açılan Güvenli Koridor" /><published>2026-09-25T00:00:00+00:00</published><updated>2026-09-25T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/derin-ogrenmede-batch-normalization-gradyanlara-acilan-guvenli-koridor</id><content type="html" xml:base="https://program.sonsuz.us/posts/derin-ogrenmede-batch-normalization-gradyanlara-acilan-guvenli-koridor/"><![CDATA[<p><img src="/img/derin-ogrenmede-batch-65.svg" alt="derin-ogrenmede-batch-65" /></p>

<p>Derin bir sinir ağını eğitmek, onlarca kişilik bir kulaktan kulağa oyunu yönetmeye benzer: İlk katmandaki anlamlı sinyal, son katmana ulaşana kadar küçülebilir, büyüyebilir veya tamamen bozulabilir. Batch Normalization, yani Toplu Normalleştirme, katmanlar arasında dolaşan aktivasyonları daha düzenli ölçeklerde tutarak optimizasyonu kolaylaştırır. Böylece ağlar daha yüksek öğrenme oranlarıyla, daha kararlı ve çoğu zaman daha hızlı eğitilebilir.
``</p>

<h2 id="derin-ağlarda-sinyal-neden-bozulur">Derin ağlarda sinyal neden bozulur?</h2>

<p>Geri yayılım sırasında zincir kuralı uygulanır. Çok katmanlı bir ağdaki erken katmanın gradyanı kabaca şöyle düşünülebilir:</p>

\[G = g_1 g_2 g_3 \cdots g_L\]

<p>Buradaki her $g_i$, ilgili katmanın yerel türevidir. Değerlerin çoğu 1’den küçükse çarpım hızla sıfıra yaklaşır ve <strong>gradyan yok olması</strong> ortaya çıkar. Değerler büyükse bu kez gradyan patlayabilir. Ağırlık dağılımlarındaki değişimler ayrıca sonraki katmanların sürekli farklı ölçeklerde girdiler görmesine neden olur.</p>

<p>Batch Normalization bu sorunların tamamını sihirli biçimde çözmez; ancak aktivasyon ölçeklerini denetleyerek gradyanların daha sağlıklı akabileceği bir ortam oluşturur. ReLU, uygun ağırlık başlatma ve artık bağlantılar gibi tekniklerle birlikte kullanıldığında etkisi daha belirgindir.</p>

<h2 id="batch-normalization-nasıl-çalışır">Batch Normalization nasıl çalışır?</h2>

<p>Bir mini-batch içindeki $m$ adet aktivasyon için önce ortalama ve varyans hesaplanır:</p>

\[mean = \frac{1}{m}\sum_{i=1}^{m}x_i\]

\[variance = \frac{1}{m}\sum_{i=1}^{m}(x_i-mean)^2\]

<p>Ardından değerler normalize edilir ve öğrenilebilir iki parametreyle yeniden ölçeklenir:</p>

\[normalized_i = \frac{x_i-mean}{\sqrt{variance+epsilon}}\]

\[y_i = gamma \cdot normalized_i + beta\]

<p>Buradaki $epsilon$, sıfıra bölünmeyi önleyen küçük bir sabittir. $gamma$ ölçeği, $beta$ ise kaydırmayı öğrenir. Dolayısıyla Batch Normalization ağı her şeyi zorla standart normal dağılıma hapsetmez; model, ihtiyaç duyduğu dönüşümü yeniden kurabilir.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Batch Normalization olmadan</th>
      <th>Batch Normalization ile</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Aktivasyon ölçeği</td>
      <td>Katmanlar arasında değişken</td>
      <td>Daha kontrollü</td>
    </tr>
    <tr>
      <td>Öğrenme oranı</td>
      <td>Genellikle daha temkinli</td>
      <td>Daha yüksek seçilebilir</td>
    </tr>
    <tr>
      <td>Gradyan akışı</td>
      <td>Kararsızlaşabilir</td>
      <td>Çoğunlukla daha düzenli</td>
    </tr>
    <tr>
      <td>Eğitimin hassasiyeti</td>
      <td>Başlatmaya daha duyarlı</td>
      <td>Görece daha dayanıklı</td>
    </tr>
    <tr>
      <td>Ek hesaplama</td>
      <td>Yok</td>
      <td>Ortalama ve varyans hesabı var</td>
    </tr>
  </tbody>
</table>

<h2 id="eğitim-ve-tahmin-arasındaki-kritik-fark">Eğitim ve tahmin arasındaki kritik fark</h2>

<p>Eğitim sırasında o anki mini-batch’in istatistikleri kullanılır. Tahmin aşamasında ise tek örnek gelebileceğinden eğitim boyunca biriktirilen hareketli ortalama ve varyans devreye girer.</p>

<table>
  <thead>
    <tr>
      <th>Mod</th>
      <th>Kullanılan istatistik</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Eğitim</td>
      <td>Mini-batch ortalaması ve varyansı</td>
    </tr>
    <tr>
      <td>Değerlendirme</td>
      <td>Biriktirilmiş hareketli istatistikler</td>
    </tr>
  </tbody>
</table>

<p>Bu nedenle PyTorch’ta değerlendirme öncesinde <code class="language-plaintext highlighter-rouge">model.eval()</code> çağrılmalıdır. Aksi hâlde model, tahmin sırasında da batch istatistikleri hesaplayarak tutarsız sonuçlar üretebilir.</p>

<h2 id="pytorch-ile-kullanım">PyTorch ile kullanım</h2>

<p>Aşağıdaki ağda Batch Normalization, doğrusal katmandan sonra ve ReLU’dan önce uygulanır:</p>

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

<span class="n">model</span> <span class="o">=</span> <span class="n">nn</span><span class="p">.</span><span class="nc">Sequential</span><span class="p">(</span>
    <span class="n">nn</span><span class="p">.</span><span class="nc">Linear</span><span class="p">(</span><span class="mi">128</span><span class="p">,</span> <span class="mi">256</span><span class="p">),</span>
    <span class="n">nn</span><span class="p">.</span><span class="nc">BatchNorm1d</span><span class="p">(</span><span class="mi">256</span><span class="p">),</span>
    <span class="n">nn</span><span class="p">.</span><span class="nc">ReLU</span><span class="p">(),</span>
    <span class="n">nn</span><span class="p">.</span><span class="nc">Linear</span><span class="p">(</span><span class="mi">256</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span>
<span class="p">)</span>

<span class="c1"># Eğitim modu: mini-batch istatistikleri kullanılır.
</span><span class="n">model</span><span class="p">.</span><span class="nf">train</span><span class="p">()</span>

<span class="c1"># Tahmin modu: hareketli istatistikler kullanılır.
</span><span class="n">model</span><span class="p">.</span><span class="nf">eval</span><span class="p">()</span>
</code></pre></div></div>

<p>Evrişimli ağlarda özellik kanallarını normalleştirmek için <code class="language-plaintext highlighter-rouge">BatchNorm2d</code>, zaman veya özellik tabanlı doğrusal verilerde ise çoğunlukla <code class="language-plaintext highlighter-rouge">BatchNorm1d</code> tercih edilir.</p>

<h2 id="her-durumda-iyi-bir-fikir-mi">Her durumda iyi bir fikir mi?</h2>

<p>Çok küçük batch boyutlarında ortalama ve varyans gürültülü olabilir. Bu durumda Layer Normalization veya Group Normalization daha kararlı seçeneklerdir. Transformer mimarilerinde de batch’ten bağımsız çalışabilen Layer Normalization yaygındır.</p>

<p>Özetle Batch Normalization, gradyan yok olmasını tek başına ortadan kaldıran bir kalkan değil, katmanlar arası sinyal trafiğini düzenleyen etkili bir trafik polisidir. Doğru konumlandırıldığında derin ağların eğitimini hızlandırır, optimizasyonu kararlı hâle getirir ve hiperparametre seçimindeki hassasiyeti azaltır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="derin öğrenme" /><category term="batch normalization" /><category term="sinir ağları" /><category term="gradyan" /><category term="python" /><category term="pytorch" /><summary type="html"><![CDATA[Derin bir sinir ağını eğitmek, onlarca kişilik bir kulaktan kulağa oyunu yönetmeye benzer: İlk katmandaki anlamlı sinyal, son katmana ulaşana kadar küçülebilir, büyüyebilir veya tamamen bozulabilir. Batch Normalization, yani Toplu Normalleştirme, katmanlar arasında dolaşan aktivasyonları daha düzenli ölçeklerde tutarak optimizasyonu kolaylaştırır. Böylece ağlar daha yüksek öğrenme oranlarıyla, daha kararlı ve çoğu zaman daha hızlı eğitilebilir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/derin-ogrenmede-batch-65.png" /><media:content medium="image" url="https://program.sonsuz.us/img/derin-ogrenmede-batch-65.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Fenwick Ağacı ile Çok Boyutlu Aralık Sorgularında Bellek Tasarrufu</title><link href="https://program.sonsuz.us/posts/fenwick-agaci-ile-cok-boyutlu-aralik-sorgularinda-bellek-tasarrufu/" rel="alternate" type="text/html" title="Fenwick Ağacı ile Çok Boyutlu Aralık Sorgularında Bellek Tasarrufu" /><published>2026-09-25T00:00:00+00:00</published><updated>2026-09-25T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/fenwick-agaci-ile-cok-boyutlu-aralik-sorgularinda-bellek-tasarrufu</id><content type="html" xml:base="https://program.sonsuz.us/posts/fenwick-agaci-ile-cok-boyutlu-aralik-sorgularinda-bellek-tasarrufu/"><![CDATA[<p>Bir oyun haritasındaki kaynak miktarlarını, elektronik tablodaki hücre değerlerini veya koordinat düzlemindeki hareketli puanları sürekli güncellediğimizi düşünelim. Her değişiklikten sonra dikdörtgen bir bölgenin toplamını hesaplamak, naif yöntemle pahalıdır. Fenwick Ağacı ya da kısa adıyla <strong>BIT (Binary Indexed Tree)</strong>, segment ağacına göre daha az kod ve yardımcı bellek kullanarak bu işi logaritmik sürede yapar.</p>

<p>``</p>

<h2 id="fenwick-ağacının-temel-fikri">Fenwick Ağacının temel fikri</h2>

<p>Tek boyutlu BIT, her indeksin belirli uzunluktaki bir aralığın toplamını saklamasına dayanır. Bir indeksin sorumlu olduğu aralık, ikili gösterimindeki en düşük anlamlı bit ile belirlenir:</p>

\[lowbit(x)=x\ \&amp;\ (-x)\]

<p>Örneğin $12=(1100)_2$ için $lowbit(12)=4$ olur. Güncelleme sırasında indeksleri $lowbit(i)$ kadar artırır, önek toplamında ise aynı miktarı çıkarırız. Böylece her işlem en fazla $O(\log n)$ düğüme dokunur.</p>

<p>İki boyutta aynı düşünceyi satır ve sütun eksenlerine ayrı ayrı uygularız. $(x,y)$ noktasına eklenen değer, iki iç içe Fenwick yürüyüşüyle ilgili hücrelere taşınır. Bir dikdörtgen toplamı ise dahil etme–hariç tutma ilkesiyle bulunur:</p>

\[R(x_1,y_1,x_2,y_2)=P(x_2,y_2)-P(x_1-1,y_2)-P(x_2,y_1-1)+P(x_1-1,y_1-1)\]

<p>Burada $P(x,y)$, $(1,1)$ ile $(x,y)$ arasındaki önek toplamıdır.</p>

<h2 id="segment-ağacı-mı-fenwick-mi">Segment ağacı mı, Fenwick mi?</h2>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th style="text-align: right">2B Fenwick Ağacı</th>
      <th style="text-align: right">2B Segment Ağacı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Nokta güncelleme</td>
      <td style="text-align: right">$O(\log n\log m)$</td>
      <td style="text-align: right">$O(\log n\log m)$</td>
    </tr>
    <tr>
      <td>Dikdörtgen toplamı</td>
      <td style="text-align: right">$O(\log n\log m)$</td>
      <td style="text-align: right">$O(\log n\log m)$</td>
    </tr>
    <tr>
      <td>Tipik yardımcı bellek</td>
      <td style="text-align: right">Yaklaşık $nm$</td>
      <td style="text-align: right">Yaklaşık $4n\cdot4m$</td>
    </tr>
    <tr>
      <td>Uygulama karmaşıklığı</td>
      <td style="text-align: right">Düşük</td>
      <td style="text-align: right">Yüksek</td>
    </tr>
    <tr>
      <td>Min/maks gibi işlemler</td>
      <td style="text-align: right">Sınırlı</td>
      <td style="text-align: right">Daha esnek</td>
    </tr>
  </tbody>
</table>

<p><img src="/img/fenwick-agaci-ile-35.svg" alt="fenwick-agaci-ile-35" /></p>

<p>BIT’in önemli sınırlaması, işlemin tersinin bulunabilmesidir. Toplamada çıkarma sayesinde iki önekten aralık üretilebilir. Ancak genel minimum sorgusunda “önek minimumlarını çıkarma” diye bir işlem yoktur. Bu durumda segment ağacı daha doğru seçimdir.</p>

<h2 id="bellek-dostu-2b-uygulama">Bellek dostu 2B uygulama</h2>

<p>Aşağıdaki C++ sınıfı matrisi satır satır tek bir <code class="language-plaintext highlighter-rouge">vector</code> içinde tutar. Ayrı ayrı vektörler oluşturmadığı için tahsis maliyetini azaltır ve önbellek yerelliğini iyileştirir.</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;bits/stdc++.h&gt;</span><span class="cp">
</span><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>

<span class="k">class</span> <span class="nc">Fenwick2D</span> <span class="p">{</span>
    <span class="kt">int</span> <span class="n">n</span><span class="p">,</span> <span class="n">m</span><span class="p">;</span>
    <span class="n">vector</span><span class="o">&lt;</span><span class="kt">long</span> <span class="kt">long</span><span class="o">&gt;</span> <span class="n">bit</span><span class="p">;</span>

    <span class="kt">long</span> <span class="kt">long</span><span class="o">&amp;</span> <span class="n">at</span><span class="p">(</span><span class="kt">int</span> <span class="n">x</span><span class="p">,</span> <span class="kt">int</span> <span class="n">y</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">return</span> <span class="n">bit</span><span class="p">[</span><span class="n">x</span> <span class="o">*</span> <span class="p">(</span><span class="n">m</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="o">+</span> <span class="n">y</span><span class="p">];</span>
    <span class="p">}</span>

<span class="k">public</span><span class="o">:</span>
    <span class="n">Fenwick2D</span><span class="p">(</span><span class="kt">int</span> <span class="n">rows</span><span class="p">,</span> <span class="kt">int</span> <span class="n">cols</span><span class="p">)</span>
        <span class="o">:</span> <span class="n">n</span><span class="p">(</span><span class="n">rows</span><span class="p">),</span> <span class="n">m</span><span class="p">(</span><span class="n">cols</span><span class="p">),</span> <span class="n">bit</span><span class="p">((</span><span class="n">rows</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="o">*</span> <span class="p">(</span><span class="n">cols</span> <span class="o">+</span> <span class="mi">1</span><span class="p">),</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{}</span>

    <span class="c1">// (x, y) noktasına delta ekler.</span>
    <span class="kt">void</span> <span class="nf">add</span><span class="p">(</span><span class="kt">int</span> <span class="n">x</span><span class="p">,</span> <span class="kt">int</span> <span class="n">y</span><span class="p">,</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">delta</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="n">x</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">n</span><span class="p">;</span> <span class="n">i</span> <span class="o">+=</span> <span class="n">i</span> <span class="o">&amp;</span> <span class="o">-</span><span class="n">i</span><span class="p">)</span>
            <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="n">y</span><span class="p">;</span> <span class="n">j</span> <span class="o">&lt;=</span> <span class="n">m</span><span class="p">;</span> <span class="n">j</span> <span class="o">+=</span> <span class="n">j</span> <span class="o">&amp;</span> <span class="o">-</span><span class="n">j</span><span class="p">)</span>
                <span class="n">at</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">)</span> <span class="o">+=</span> <span class="n">delta</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="c1">// (1,1) ile (x,y) arasındaki toplamı döndürür.</span>
    <span class="kt">long</span> <span class="kt">long</span> <span class="nf">prefix</span><span class="p">(</span><span class="kt">int</span> <span class="n">x</span><span class="p">,</span> <span class="kt">int</span> <span class="n">y</span><span class="p">)</span> <span class="p">{</span>
        <span class="kt">long</span> <span class="kt">long</span> <span class="n">result</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
        <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="n">x</span><span class="p">;</span> <span class="n">i</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">-=</span> <span class="n">i</span> <span class="o">&amp;</span> <span class="o">-</span><span class="n">i</span><span class="p">)</span>
            <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="n">y</span><span class="p">;</span> <span class="n">j</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">;</span> <span class="n">j</span> <span class="o">-=</span> <span class="n">j</span> <span class="o">&amp;</span> <span class="o">-</span><span class="n">j</span><span class="p">)</span>
                <span class="n">result</span> <span class="o">+=</span> <span class="n">at</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">);</span>
        <span class="k">return</span> <span class="n">result</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="kt">long</span> <span class="kt">long</span> <span class="nf">rectangle</span><span class="p">(</span><span class="kt">int</span> <span class="n">x1</span><span class="p">,</span> <span class="kt">int</span> <span class="n">y1</span><span class="p">,</span> <span class="kt">int</span> <span class="n">x2</span><span class="p">,</span> <span class="kt">int</span> <span class="n">y2</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">return</span> <span class="n">prefix</span><span class="p">(</span><span class="n">x2</span><span class="p">,</span> <span class="n">y2</span><span class="p">)</span> <span class="o">-</span> <span class="n">prefix</span><span class="p">(</span><span class="n">x1</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="n">y2</span><span class="p">)</span>
             <span class="o">-</span> <span class="n">prefix</span><span class="p">(</span><span class="n">x2</span><span class="p">,</span> <span class="n">y1</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">+</span> <span class="n">prefix</span><span class="p">(</span><span class="n">x1</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="n">y1</span> <span class="o">-</span> <span class="mi">1</span><span class="p">);</span>
    <span class="p">}</span>
<span class="p">};</span>
</code></pre></div></div>

<p>İndekslerin <strong>1’den başlaması</strong> önemlidir; sıfır için <code class="language-plaintext highlighter-rouge">lowbit(0)</code> sıfırdır ve güncelleme döngüsü ilerlemez.</p>

<h2 id="boyutlar-devasa-olduğunda">Boyutlar devasa olduğunda</h2>

<p>Koordinatlar milyarlara ulaşıyor fakat yalnızca birkaç bin nokta kullanılıyorsa tam matris ayırmak anlamsızdır. Güncelleme ve sorgulardaki koordinatları sıralayıp benzersizleştirerek <strong>koordinat sıkıştırma</strong> uygulanabilir. Her gerçek koordinat, sıralamadaki 1 tabanlı sırasına dönüştürülür.</p>

<p>$d$ boyutta güncelleme ve sorgu maliyeti yaklaşık $O(\log^d n)$ olur. Buna karşılık yoğun depolama $O(n^d)$ büyüdüğünden, pratikte üç ve üzeri boyutlarda yalnızca erişilen Fenwick hücrelerini karma tablo veya sıkıştırılmış iç vektörlerle saklamak gerekir. Kısacası toplam ve frekans sorgularında BIT, küçük kodu ve düşük sabit maliyetiyle güçlüdür; karmaşık birleştirme işlemlerinde ise segment ağacı hâlâ sahnededir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="fenwick ağacı" /><category term="bit" /><category term="veri yapıları" /><category term="algoritma" /><category term="aralık sorguları" /><category term="bellek optimizasyonu" /><category term="cpp" /><summary type="html"><![CDATA[Bir oyun haritasındaki kaynak miktarlarını, elektronik tablodaki hücre değerlerini veya koordinat düzlemindeki hareketli puanları sürekli güncellediğimizi düşünelim. Her değişiklikten sonra dikdörtgen bir bölgenin toplamını hesaplamak, naif yöntemle pahalıdır. Fenwick Ağacı ya da kısa adıyla BIT (Binary Indexed Tree), segment ağacına göre daha az kod ve yardımcı bellek kullanarak bu işi logaritmik sürede yapar.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/fenwick-agaci-ile-35.png" /><media:content medium="image" url="https://program.sonsuz.us/img/fenwick-agaci-ile-35.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Few-Shot Prompting: Büyük Dil Modellerini Üç Örnekle Uysallaştırmak</title><link href="https://program.sonsuz.us/posts/few-shot-prompting-buyuk-dil-modellerini-uc-ornekle-uysallastirmak/" rel="alternate" type="text/html" title="Few-Shot Prompting: Büyük Dil Modellerini Üç Örnekle Uysallaştırmak" /><published>2026-09-25T00:00:00+00:00</published><updated>2026-09-25T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/few-shot-prompting-buyuk-dil-modellerini-uc-ornekle-uysallastirmak</id><content type="html" xml:base="https://program.sonsuz.us/posts/few-shot-prompting-buyuk-dil-modellerini-uc-ornekle-uysallastirmak/"><![CDATA[<p>Milyarlarca parametreli bir dil modelini yeniden eğitmeden belirli bir göreve uyarlamak mümkün mü? Few-shot prompting, modele yalnızca birkaç doğru örnek göstererek bunu yapmamızı sağlar. Bir bakıma modele uzun bir kullanım kılavuzu vermek yerine, “Bak, ilk ikisini ben çözdüm; üçüncüsünü de sen yap” deriz. Üstelik çoğu zaman üç iyi örnek, üç sayfalık açıklamadan daha etkili olabilir.</p>

<p><img src="/img/few-shot-prompting-34.svg" alt="few-shot-prompting-34" /></p>

<p>``</p>

<h2 id="few-shot-prompting-nedir">Few-shot prompting nedir?</h2>

<p>Few-shot prompting, bir görevin nasıl yapılacağını modelin girdisine yerleştirilen az sayıdaki örnek üzerinden tarif etme tekniğidir. Modelin parametreleri değişmez; öğrenme, yalnızca mevcut bağlam penceresi içinde gerçekleşir. Bu nedenle süreç gerçek bir eğitimden ziyade <strong>bağlam içi öğrenme</strong> olarak adlandırılır.</p>

<p>Bir dil modeli, sıradaki parçanın olasılığını yaklaşık olarak şöyle hesaplar:</p>

\[P(y \mid x, E)\]

<p>Burada $x$ yeni girdi, $y$ beklenen çıktı ve $E$ ise prompt içine koyduğumuz örnekler kümesidir. Örnekler modele yalnızca cevabı değil; biçimi, tonu, sınıfları ve karar sınırlarını da sezdirir.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Verilen bilgi</th>
      <th>Güçlü yanı</th>
      <th>Zayıf yanı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Zero-shot</td>
      <td>Yalnızca talimat</td>
      <td>Hızlı ve ucuzdur</td>
      <td>Biçim sapmaları görülebilir</td>
    </tr>
    <tr>
      <td>One-shot</td>
      <td>Tek örnek</td>
      <td>Çıktı yapısını gösterir</td>
      <td>Tek örnek yanıltıcı olabilir</td>
    </tr>
    <tr>
      <td>Few-shot</td>
      <td>Birkaç örnek</td>
      <td>Deseni ve istisnaları öğretir</td>
      <td>Daha fazla token tüketir</td>
    </tr>
    <tr>
      <td>Fine-tuning</td>
      <td>Eğitim veri kümesi</td>
      <td>Kalıcı uzmanlaşma sağlar</td>
      <td>Maliyetli ve zahmetlidir</td>
    </tr>
  </tbody>
</table>

<h2 id="neden-üç-örnek-işe-yarayabilir">Neden üç örnek işe yarayabilir?</h2>

<p>İyi seçilmiş üç örnek, görevin farklı köşelerini temsil edebilir. Örneğin müşteri yorumlarını sınıflandırırken bir olumlu, bir olumsuz ve bir kararsız yorum göstermek, modelin olası çıktı uzayını anlamasını kolaylaştırır:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Yorum: Ürün harika, teslimat da hızlıydı.
Etiket: olumlu

Yorum: Paket yırtılmış ve ürün çalışmıyor.
Etiket: olumsuz

Yorum: Fiyat iyi ama malzeme kalitesi ortalama.
Etiket: kararsız

Yorum: Kurulumu kolaydı fakat pil ömrü çok kısa.
Etiket:
</code></pre></div></div>

<p>Model burada yalnızca kelime eşleştirme yapmaz. Önceki örneklerden beklenen etiket biçimini ve karışık duyguların nasıl değerlendirildiğini çıkarır. Yine de örneklerin sırası veya ifadeleri değiştiğinde sonuç farklılaşabilir.</p>

<h2 id="python-ile-dinamik-prompt-oluşturma">Python ile dinamik prompt oluşturma</h2>

<p>Aşağıdaki kod, örnekleri tek bir şablonda birleştirerek yeni yorum için sınıflandırma promptu üretir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">examples</span> <span class="o">=</span> <span class="p">[</span>
    <span class="p">(</span><span class="sh">'</span><span class="s">Arayüz çok kullanışlı.</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">olumlu</span><span class="sh">'</span><span class="p">),</span>
    <span class="p">(</span><span class="sh">'</span><span class="s">Uygulama sürekli çöküyor.</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">olumsuz</span><span class="sh">'</span><span class="p">),</span>
    <span class="p">(</span><span class="sh">'</span><span class="s">Hızlı ama tasarımı eski.</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">kararsız</span><span class="sh">'</span><span class="p">)</span>
<span class="p">]</span>

<span class="k">def</span> <span class="nf">build_prompt</span><span class="p">(</span><span class="n">new_review</span><span class="p">):</span>
    <span class="n">parts</span> <span class="o">=</span> <span class="p">[</span><span class="sh">'</span><span class="s">Yorumları olumlu, olumsuz veya kararsız olarak etiketle.</span><span class="sh">'</span><span class="p">]</span>

    <span class="k">for</span> <span class="n">review</span><span class="p">,</span> <span class="n">label</span> <span class="ow">in</span> <span class="n">examples</span><span class="p">:</span>
        <span class="n">parts</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="sa">f</span><span class="sh">'</span><span class="s">Yorum: </span><span class="si">{</span><span class="n">review</span><span class="si">}</span><span class="se">\n</span><span class="s">Etiket: </span><span class="si">{</span><span class="n">label</span><span class="si">}</span><span class="sh">'</span><span class="p">)</span>

    <span class="n">parts</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="sa">f</span><span class="sh">'</span><span class="s">Yorum: </span><span class="si">{</span><span class="n">new_review</span><span class="si">}</span><span class="se">\n</span><span class="s">Etiket:</span><span class="sh">'</span><span class="p">)</span>
    <span class="k">return</span> <span class="sh">'</span><span class="se">\n\n</span><span class="sh">'</span><span class="p">.</span><span class="nf">join</span><span class="p">(</span><span class="n">parts</span><span class="p">)</span>

<span class="n">prompt</span> <span class="o">=</span> <span class="nf">build_prompt</span><span class="p">(</span><span class="sh">'</span><span class="s">Özellikleri güzel fakat abonelik pahalı.</span><span class="sh">'</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="n">prompt</span><span class="p">)</span>
</code></pre></div></div>

<p>Bu yaklaşımda örnekleri koddan bağımsız bir veri kaynağında tutabilir, göreve göre en uygun olanları seçebiliriz. Büyük sistemlerde benzer örnekler gömme vektörleriyle aranarak prompta otomatik biçimde eklenir.</p>

<h2 id="i̇yi-örnek-seçmenin-kuralları">İyi örnek seçmenin kuralları</h2>

<ul>
  <li>Örnekler gerçek kullanıcı girdilerine benzemelidir.</li>
  <li>Her olası sınıf en az bir kez temsil edilmelidir.</li>
  <li>Çıktı biçimi bütün örneklerde tutarlı kalmalıdır.</li>
  <li>Birbirini çürüten veya hatalı etiketlenmiş örneklerden kaçınılmalıdır.</li>
  <li>En alakalı örnekleri yeni girdiye yakın yerleştirmek denenmelidir.</li>
</ul>

<p>Few-shot prompting sihirli bir değnek değildir. Uzun örnekler token maliyetini artırır; taraflı örnekler ise taraflı cevaplar üretir. Ayrıca prompt içindeki kullanıcı metni talimat gibi algılanabileceğinden güvenilmeyen girdiler açık ayraçlarla sınırlandırılmalıdır.</p>

<p>Sonuç olarak birkaç kaliteli örnek, dev bir modeli görev odaklı bir asistana dönüştürebilir. Başarının sırrı örnek sayısını artırmak değil, karar uzayını açıklayan temsil gücü yüksek örnekleri seçmektir. Modeli uysallaştıran şey kırbaç değil; iyi hazırlanmış üç küçük ipucudur.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="few-shot" /><category term="prompt-engineering" /><category term="yapay-zeka" /><category term="büyük-dil-modelleri" /><category term="llm" /><category term="python" /><summary type="html"><![CDATA[Milyarlarca parametreli bir dil modelini yeniden eğitmeden belirli bir göreve uyarlamak mümkün mü? Few-shot prompting, modele yalnızca birkaç doğru örnek göstererek bunu yapmamızı sağlar. Bir bakıma modele uzun bir kullanım kılavuzu vermek yerine, “Bak, ilk ikisini ben çözdüm; üçüncüsünü de sen yap” deriz. Üstelik çoğu zaman üç iyi örnek, üç sayfalık açıklamadan daha etkili olabilir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/few-shot-prompting-34.png" /><media:content medium="image" url="https://program.sonsuz.us/img/few-shot-prompting-34.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">FFT ile Dev Sayıları O(N log N) Sürede Çarpmak</title><link href="https://program.sonsuz.us/posts/fft-ile-dev-sayilari-on-log-n-surede-carpmak/" rel="alternate" type="text/html" title="FFT ile Dev Sayıları O(N log N) Sürede Çarpmak" /><published>2026-09-25T00:00:00+00:00</published><updated>2026-09-25T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/fft-ile-dev-sayilari-on-log-n-surede-carpmak</id><content type="html" xml:base="https://program.sonsuz.us/posts/fft-ile-dev-sayilari-on-log-n-surede-carpmak/"><![CDATA[<p>İlkokulda öğrendiğimiz uzun çarpma yöntemi küçük sayılarda harikadır; ancak milyonlarca basamak söz konusu olduğunda işler dramatik biçimde yavaşlar. Neyse ki sinyal işlemenin yıldızı Hızlı Fourier Dönüşümü, yani FFT, basamakları birer polinom katsayısı gibi ele alarak çarpma işlemini yaklaşık $O(N \log N)$ sürede gerçekleştirebilir.</p>

<p>``</p>

<h2 id="uzun-çarpma-neden-yavaş">Uzun çarpma neden yavaş?</h2>

<p>İki sayının da $N$ basamaklı olduğunu düşünelim. Geleneksel yöntemde birinci sayının her basamağı, ikinci sayının her basamağıyla çarpılır. Dolayısıyla yaklaşık $N^2$ işlem gerekir:</p>

\[T(N)=O(N^2)\]

<p>Basamak sayısı iki katına çıktığında çalışma miktarı yaklaşık dört katına çıkar. FFT tabanlı yaklaşımda ise büyüme çok daha sakindir:</p>

\[T(N)=O(N\log N)\]

<table>
  <thead>
    <tr>
      <th>Yöntem</th>
      <th style="text-align: right">Zaman karmaşıklığı</th>
      <th>Temel fikir</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Uzun çarpma</td>
      <td style="text-align: right">$O(N^2)$</td>
      <td>Tüm basamak çiftlerini çarp</td>
    </tr>
    <tr>
      <td>Karatsuba</td>
      <td style="text-align: right">$O(N^{1.585})$</td>
      <td>Çarpımları parçalayarak azalt</td>
    </tr>
    <tr>
      <td>FFT</td>
      <td style="text-align: right">$O(N\log N)$</td>
      <td>Konvolüsyonu frekans uzayında hesapla</td>
    </tr>
  </tbody>
</table>

<h2 id="sayıları-polinoma-dönüştürmek">Sayıları polinoma dönüştürmek</h2>

<p>Örneğin $1234$ sayısını şu polinomla temsil edebiliriz:</p>

\[A(x)=4+3x+2x^2+x^3\]

<p>Burada $x=10$ seçildiğinde yeniden 1234 elde edilir. İki sayıyı çarpmak, bunlara karşılık gelen polinomları çarpmaya eşdeğerdir. Polinom çarpımındaki katsayılar ise ayrık konvolüsyonla bulunur:</p>

\[c_k=\sum_{i=0}^{k}a_i b_{k-i}\]

<p>Bu formül doğrudan uygulanırsa yine $O(N^2)$ zaman harcar. FFT’nin sihri, konvolüsyonu noktasal çarpıma dönüştürmesidir:</p>

\[\operatorname{FFT}(a*b)=\operatorname{FFT}(a)\cdot\operatorname{FFT}(b)\]

<p>Yani önce katsayıları frekans uzayına taşır, karşılık gelen değerleri tek tek çarpar ve ters FFT ile geri döneriz.</p>

<h2 id="birim-kökler-ve-böl-parçala-yönet">Birim kökler ve böl-parçala-yönet</h2>

<p>Ayrık Fourier Dönüşümü şu şekilde tanımlanır:</p>

\[X_k=\sum_{j=0}^{N-1}x_j e^{-2\pi i jk/N}\]

<p>Üstel ifadeler, karmaşık düzlemde eşit aralıklarla yerleşmiş $N$’inci birim köklerdir. FFT, çift ve tek indeksli katsayıları ayırarak aynı hesaplamaları tekrar yapmaktan kurtulur. Her seviyede toplam $O(N)$ iş yapılır ve yaklaşık $\log_2N$ seviye bulunur.</p>

<table>
  <thead>
    <tr>
      <th>Alan</th>
      <th>İşlem</th>
      <th style="text-align: right">Maliyet</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Katsayı uzayı</td>
      <td>Konvolüsyon</td>
      <td style="text-align: right">$O(N^2)$</td>
    </tr>
    <tr>
      <td>Frekans uzayı</td>
      <td>Noktasal çarpım</td>
      <td style="text-align: right">$O(N)$</td>
    </tr>
    <tr>
      <td>FFT ve ters FFT</td>
      <td>Dönüşüm</td>
      <td style="text-align: right">$O(N\log N)$</td>
    </tr>
  </tbody>
</table>

<h2 id="python-ile-sade-bir-uygulama">Python ile sade bir uygulama</h2>

<p>Aşağıdaki örnek, sayıları onluk basamaklarına ayırır. NumPy FFT hesaplamasını yapar; son döngü ise yuvarlama ve elde taşıma işlemlerini düzeltir.</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">fft_multiply</span><span class="p">(</span><span class="n">x</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">y</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
    <span class="n">a</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="nf">int</span><span class="p">(</span><span class="n">d</span><span class="p">)</span> <span class="k">for</span> <span class="n">d</span> <span class="ow">in</span> <span class="n">x</span><span class="p">[::</span><span class="o">-</span><span class="mi">1</span><span class="p">]],</span> <span class="n">dtype</span><span class="o">=</span><span class="nb">float</span><span class="p">)</span>
    <span class="n">b</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="nf">int</span><span class="p">(</span><span class="n">d</span><span class="p">)</span> <span class="k">for</span> <span class="n">d</span> <span class="ow">in</span> <span class="n">y</span><span class="p">[::</span><span class="o">-</span><span class="mi">1</span><span class="p">]],</span> <span class="n">dtype</span><span class="o">=</span><span class="nb">float</span><span class="p">)</span>

    <span class="n">size</span> <span class="o">=</span> <span class="mi">1</span>
    <span class="k">while</span> <span class="n">size</span> <span class="o">&lt;</span> <span class="nf">len</span><span class="p">(</span><span class="n">a</span><span class="p">)</span> <span class="o">+</span> <span class="nf">len</span><span class="p">(</span><span class="n">b</span><span class="p">):</span>
        <span class="n">size</span> <span class="o">*=</span> <span class="mi">2</span>

    <span class="n">fa</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">fft</span><span class="p">.</span><span class="nf">fft</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">size</span><span class="p">)</span>
    <span class="n">fb</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">fft</span><span class="p">.</span><span class="nf">fft</span><span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">size</span><span class="p">)</span>
    <span class="n">coefficients</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">rint</span><span class="p">(</span><span class="n">np</span><span class="p">.</span><span class="n">fft</span><span class="p">.</span><span class="nf">ifft</span><span class="p">(</span><span class="n">fa</span> <span class="o">*</span> <span class="n">fb</span><span class="p">).</span><span class="n">real</span><span class="p">).</span><span class="nf">astype</span><span class="p">(</span><span class="n">np</span><span class="p">.</span><span class="n">int64</span><span class="p">)</span>

    <span class="n">carry</span> <span class="o">=</span> <span class="mi">0</span>
    <span class="n">digits</span> <span class="o">=</span> <span class="p">[]</span>
    <span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">coefficients</span><span class="p">:</span>
        <span class="n">total</span> <span class="o">=</span> <span class="nf">int</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> <span class="o">+</span> <span class="n">carry</span>
        <span class="n">digits</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="n">total</span> <span class="o">%</span> <span class="mi">10</span><span class="p">)</span>
        <span class="n">carry</span> <span class="o">=</span> <span class="n">total</span> <span class="o">//</span> <span class="mi">10</span>

    <span class="k">while</span> <span class="n">carry</span><span class="p">:</span>
        <span class="n">digits</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="n">carry</span> <span class="o">%</span> <span class="mi">10</span><span class="p">)</span>
        <span class="n">carry</span> <span class="o">//=</span> <span class="mi">10</span>

    <span class="k">while</span> <span class="nf">len</span><span class="p">(</span><span class="n">digits</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span> <span class="ow">and</span> <span class="n">digits</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
        <span class="n">digits</span><span class="p">.</span><span class="nf">pop</span><span class="p">()</span>

    <span class="k">return</span> <span class="sh">''</span><span class="p">.</span><span class="nf">join</span><span class="p">(</span><span class="nf">map</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">digits</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="nf">fft_multiply</span><span class="p">(</span><span class="sh">"</span><span class="s">123456789012345</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">987654321098765</span><span class="sh">"</span><span class="p">))</span>
</code></pre></div></div>

<p>Bu uygulama öğreticidir; kayan nokta hataları nedeniyle gerçekten milyonlarca basamakta güvenilir olmayabilir. Pratik sistemler basamakları daha büyük bloklara ayırır veya modüler aritmetik kullanan Sayı Teorik Dönüşümü’nü (NTT) tercih eder. Birden fazla asal modülle yapılan sonuçlar Çin Kalan Teoremi aracılığıyla birleştirilebilir.</p>

<p>Sonuçta FFT yalnızca ses ve görüntü analizi yapan bir araç değildir. Büyük sayı çarpımını polinom çarpımına, polinom çarpımını konvolüsyona ve konvolüsyonu ucuz noktasal çarpımlara dönüştüren güçlü bir algoritmik köprüdür.</p>

<p><img src="/img/fft-ile-dev-80.svg" alt="fft-ile-dev-80" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="fft" /><category term="algoritma" /><category term="matematik" /><category term="python" /><category term="büyük sayılar" /><category term="polinomlar" /><summary type="html"><![CDATA[İlkokulda öğrendiğimiz uzun çarpma yöntemi küçük sayılarda harikadır; ancak milyonlarca basamak söz konusu olduğunda işler dramatik biçimde yavaşlar. Neyse ki sinyal işlemenin yıldızı Hızlı Fourier Dönüşümü, yani FFT, basamakları birer polinom katsayısı gibi ele alarak çarpma işlemini yaklaşık $O(N \log N)$ sürede gerçekleştirebilir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/fft-ile-dev-80.png" /><media:content medium="image" url="https://program.sonsuz.us/img/fft-ile-dev-80.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>