<?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-27T06:05:44+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">eBPF ile Çekirdeği Yeniden Derlemeden Ağ Paketlerini Manipüle Etmek</title><link href="https://program.sonsuz.us/posts/ebpf-ile-cekirdegi-yeniden-derlemeden-ag-paketlerini-manipule-etmek/" rel="alternate" type="text/html" title="eBPF ile Çekirdeği Yeniden Derlemeden Ağ Paketlerini Manipüle Etmek" /><published>2026-09-27T00:00:00+00:00</published><updated>2026-09-27T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/ebpf-ile-cekirdegi-yeniden-derlemeden-ag-paketlerini-manipule-etmek</id><content type="html" xml:base="https://program.sonsuz.us/posts/ebpf-ile-cekirdegi-yeniden-derlemeden-ag-paketlerini-manipule-etmek/"><![CDATA[<p>Linux ağ yığınında paketleri yakalamak, filtrelemek veya yönlendirmek eskiden çekirdek modülü geliştirmeyi ve bazen çekirdeği yeniden derlemeyi gerektiriyordu. eBPF sayesinde artık doğrulanmış küçük programları çekirdek içinde güvenli biçimde çalıştırabiliyoruz. Böylece DDoS filtrelerinden gecikme ölçümüne kadar pek çok işi, kaynak koduna neşter vurmadan gerçekleştirmek mümkün.</p>

<p>``</p>

<h2 id="ebpf-tam-olarak-nedir">eBPF tam olarak nedir?</h2>

<p>eBPF, kullanıcı alanında hazırlanan programların Linux çekirdeğindeki belirli kancalara yüklenmesini sağlayan bir çalışma ortamıdır. İsmindeki BPF, tarihsel olarak “Berkeley Packet Filter” anlamına gelse de teknoloji bugün ağ paketlerinin çok ötesine uzanır: sistem çağrıları, süreçler, dosya erişimleri ve performans olayları da izlenebilir.</p>

<p>“Çekirdeğe dokunmadan” ifadesi, kodun çekirdek dışında çalıştığı anlamına gelmez. eBPF programı çekirdek bağlamında çalışır; ancak çekirdek kaynak kodunu değiştirmeye veya özel bir modül yüklemeye gerek bırakmaz. Program yüklenmeden önce <strong>verifier</strong> tarafından incelenir. Geçersiz bellek erişimi, güvensiz işaretçi kullanımı veya sonlanmama riski varsa program reddedilir.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Çalışma noktası</th>
      <th style="text-align: right">Performans</th>
      <th>Risk ve esneklik</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Kullanıcı alanı yakalama</td>
      <td>Ağ yığınından sonra</td>
      <td style="text-align: right">Orta</td>
      <td>Güvenli, kopyalama maliyetli</td>
    </tr>
    <tr>
      <td>Netfilter/iptables</td>
      <td>Çekirdek ağ yığını</td>
      <td style="text-align: right">Yüksek</td>
      <td>Kurallarla sınırlı</td>
    </tr>
    <tr>
      <td>Çekirdek modülü</td>
      <td>Çekirdek içinde</td>
      <td style="text-align: right">Çok yüksek</td>
      <td>Hata tüm sistemi etkileyebilir</td>
    </tr>
    <tr>
      <td>eBPF/XDP</td>
      <td>Sürücüye çok yakın</td>
      <td style="text-align: right">Çok yüksek</td>
      <td>Verifier ile denetimli</td>
    </tr>
  </tbody>
</table>

<h2 id="xdp-neden-bu-kadar-hızlı">XDP neden bu kadar hızlı?</h2>

<p>XDP, yani <strong>eXpress Data Path</strong>, paketi ağ sürücüsünden gelir gelmez işleyebilir. Paket henüz <code class="language-plaintext highlighter-rouge">sk_buff</code> yapısına dönüştürülmeden karar verildiği için ayırma, kopyalama ve ağ yığını maliyetleri azaltılır.</p>

<p>Bir paketin yaklaşık işlem maliyetini şöyle düşünebiliriz:</p>

\[T_{toplam} = T_{alma} + T_{ayrıştırma} + T_{karar} + T_{yönlendirme}\]

<p>XDP özellikle $T_{ayrıştırma}$ ve $T_{yönlendirme}$ bileşenlerini küçültür. Program paketi kabul etmek için <code class="language-plaintext highlighter-rouge">XDP_PASS</code>, düşürmek için <code class="language-plaintext highlighter-rouge">XDP_DROP</code>, başka arayüze göndermek için <code class="language-plaintext highlighter-rouge">XDP_REDIRECT</code> döndürebilir.</p>

<p>Aşağıdaki orta düzey örnek, IPv4 UDP paketlerini erken aşamada düşürür:</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;linux/bpf.h&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;linux/if_ether.h&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;linux/ip.h&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;linux/udp.h&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;bpf/bpf_helpers.h&gt;</span><span class="cp">
</span>
<span class="n">SEC</span><span class="p">(</span><span class="s">"xdp"</span><span class="p">)</span>
<span class="kt">int</span> <span class="nf">drop_udp</span><span class="p">(</span><span class="k">struct</span> <span class="n">xdp_md</span> <span class="o">*</span><span class="n">ctx</span><span class="p">)</span>
<span class="p">{</span>
    <span class="kt">void</span> <span class="o">*</span><span class="n">data</span> <span class="o">=</span> <span class="p">(</span><span class="kt">void</span> <span class="o">*</span><span class="p">)(</span><span class="kt">long</span><span class="p">)</span><span class="n">ctx</span><span class="o">-&gt;</span><span class="n">data</span><span class="p">;</span>
    <span class="kt">void</span> <span class="o">*</span><span class="n">data_end</span> <span class="o">=</span> <span class="p">(</span><span class="kt">void</span> <span class="o">*</span><span class="p">)(</span><span class="kt">long</span><span class="p">)</span><span class="n">ctx</span><span class="o">-&gt;</span><span class="n">data_end</span><span class="p">;</span>
    <span class="k">struct</span> <span class="n">ethhdr</span> <span class="o">*</span><span class="n">eth</span> <span class="o">=</span> <span class="n">data</span><span class="p">;</span>

    <span class="k">if</span> <span class="p">((</span><span class="kt">void</span> <span class="o">*</span><span class="p">)(</span><span class="n">eth</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="o">&gt;</span> <span class="n">data_end</span><span class="p">)</span>
        <span class="k">return</span> <span class="n">XDP_ABORTED</span><span class="p">;</span>

    <span class="k">if</span> <span class="p">(</span><span class="n">eth</span><span class="o">-&gt;</span><span class="n">h_proto</span> <span class="o">!=</span> <span class="n">__constant_htons</span><span class="p">(</span><span class="n">ETH_P_IP</span><span class="p">))</span>
        <span class="k">return</span> <span class="n">XDP_PASS</span><span class="p">;</span>

    <span class="k">struct</span> <span class="n">iphdr</span> <span class="o">*</span><span class="n">ip</span> <span class="o">=</span> <span class="p">(</span><span class="kt">void</span> <span class="o">*</span><span class="p">)(</span><span class="n">eth</span> <span class="o">+</span> <span class="mi">1</span><span class="p">);</span>
    <span class="k">if</span> <span class="p">((</span><span class="kt">void</span> <span class="o">*</span><span class="p">)(</span><span class="n">ip</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="o">&gt;</span> <span class="n">data_end</span><span class="p">)</span>
        <span class="k">return</span> <span class="n">XDP_ABORTED</span><span class="p">;</span>

    <span class="k">return</span> <span class="n">ip</span><span class="o">-&gt;</span><span class="n">protocol</span> <span class="o">==</span> <span class="n">IPPROTO_UDP</span> <span class="o">?</span> <span class="n">XDP_DROP</span> <span class="o">:</span> <span class="n">XDP_PASS</span><span class="p">;</span>
<span class="p">}</span>

<span class="kt">char</span> <span class="n">LICENSE</span><span class="p">[]</span> <span class="n">SEC</span><span class="p">(</span><span class="s">"license"</span><span class="p">)</span> <span class="o">=</span> <span class="s">"GPL"</span><span class="p">;</span>
</code></pre></div></div>

<p>Sınır kontrolleri yalnızca iyi programlama alışkanlığı değildir; verifier, <code class="language-plaintext highlighter-rouge">data_end</code> kontrolü bulunmayan paket erişimini kabul etmez. Kod Clang ile eBPF bytecode’una çevrilip bir arayüze bağlanabilir:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>clang <span class="nt">-O2</span> <span class="nt">-g</span> <span class="nt">-target</span> bpf <span class="nt">-c</span> filter.c <span class="nt">-o</span> filter.o
<span class="nb">sudo </span>ip <span class="nb">link set </span>dev eth0 xdp obj filter.o sec xdp
<span class="nb">sudo </span>ip <span class="nb">link set </span>dev eth0 xdp off
</code></pre></div></div>

<p>İlk komut programı derler, ikincisi <code class="language-plaintext highlighter-rouge">eth0</code> arayüzüne yükler, sonuncusu ise bağlantıyı kaldırır. Uzaktan bağlı bir sunucuda bütün UDP trafiğini düşürmeden önce DNS ve VPN kullanımını düşünmek iyi fikirdir; aksi hâlde güvenlik demosu hızla bağlantı kesme demosuna dönüşebilir.</p>

<h2 id="haritalar-ve-gözlemlenebilirlik">Haritalar ve gözlemlenebilirlik</h2>

<p>eBPF haritaları, çekirdek ve kullanıcı alanı arasında paylaşılan anahtar-değer depolarıdır. IP başına paket sayacı tutmak, engelli adresleri dinamik olarak güncellemek veya CPU başına istatistik toplamak için kullanılabilirler. Üretimde C ile doğrudan uğraşmak yerine libbpf, BCC, bpftrace, Cilium ve Rust tabanlı Aya gibi araçlardan yararlanılabilir.</p>

<p>TC kancaları paket değişikliği ve trafik şekillendirme konusunda daha esnekken XDP mümkün olan en erken kararı hedefler. Sonuç olarak eBPF, klasik çekirdek modüllerinin bütün risklerini üstlenmeden çekirdek hızına yaklaşan, programlanabilir bir ağ güvenliği ve izleme katmanı sunar.</p>

<p><img src="/img/ebpf-ile-cekirdegi-78.svg" alt="ebpf-ile-cekirdegi-78" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="ebpf" /><category term="linux" /><category term="xdp" /><category term="ağ güvenliği" /><category term="paket işleme" /><category term="gözlemlenebilirlik" /><summary type="html"><![CDATA[Linux ağ yığınında paketleri yakalamak, filtrelemek veya yönlendirmek eskiden çekirdek modülü geliştirmeyi ve bazen çekirdeği yeniden derlemeyi gerektiriyordu. eBPF sayesinde artık doğrulanmış küçük programları çekirdek içinde güvenli biçimde çalıştırabiliyoruz. Böylece DDoS filtrelerinden gecikme ölçümüne kadar pek çok işi, kaynak koduna neşter vurmadan gerçekleştirmek mümkün.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/ebpf-ile-cekirdegi-78.png" /><media:content medium="image" url="https://program.sonsuz.us/img/ebpf-ile-cekirdegi-78.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Linux Çekirdeğinde Cgroups v2: Kaynak İzolasyonunun Modern Mimarisi</title><link href="https://program.sonsuz.us/posts/linux-cekirdeginde-cgroups-v2-kaynak-izolasyonunun-modern-mimarisi/" rel="alternate" type="text/html" title="Linux Çekirdeğinde Cgroups v2: Kaynak İzolasyonunun Modern Mimarisi" /><published>2026-09-27T00:00:00+00:00</published><updated>2026-09-27T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/linux-cekirdeginde-cgroups-v2-kaynak-izolasyonunun-modern-mimarisi</id><content type="html" xml:base="https://program.sonsuz.us/posts/linux-cekirdeginde-cgroups-v2-kaynak-izolasyonunun-modern-mimarisi/"><![CDATA[<p>Bir konteynere “en fazla 512 MB bellek kullan” veya “işlemcinin yalnızca yarısını tüket” dediğimizde bu kuralları Docker’ın sihirli değneği değil, Linux çekirdeğinin <strong>control groups</strong> mekanizması uygular. Cgroups v2, ilk sürümün yıllar içinde karmaşıklaşan yapısını tek bir hiyerarşide birleştirerek kaynak yönetimini daha tutarlı, güvenli ve öngörülebilir hâle getirir.
``</p>
<h2 id="cgroups-neyi-çözer">Cgroups neyi çözer?</h2>

<p>Cgroups, süreçleri gruplandırır ve CPU, bellek, disk G/Ç ya da süreç sayısı gibi kaynakları bu gruplar üzerinden denetler. Namespace’ler bir konteynerin <em>neyi görebildiğini</em>, cgroups ise <em>ne kadar tüketebildiğini</em> belirler. Dolayısıyla ikisi tamamlayıcıdır: namespace izolasyon perdesiyken cgroups kaynak bütçesidir.</p>

<p>Bir grubun CPU kullanım oranı basitçe</p>

\[R = \frac{Q}{P}\]

<p>ile düşünülebilir. Burada $Q$ izin verilen CPU süresi, $P$ ise periyottur. Örneğin <code class="language-plaintext highlighter-rouge">cpu.max</code> dosyasına <code class="language-plaintext highlighter-rouge">50000 100000</code> yazılması, grubun her 100 milisaniyede en fazla 50 milisaniye CPU kullanabilmesi, yani yaklaşık $R=0.5$ CPU kapasitesi anlamına gelir.</p>

<h2 id="v1-neden-yorucuydu">v1 neden yorucuydu?</h2>

<p>Cgroups v1’de her denetleyici bağımsız bir hiyerarşiye bağlanabiliyordu. Aynı süreç CPU ağacında bir grupta, bellek ağacında başka bir grupta bulunabiliyordu. Esneklik gibi görünen bu model; Docker, systemd ve Kubernetes gibi araçlar aynı makinede çalıştığında yönetim karmaşasına, belirsiz yetki devrine ve tutarsız kaynak davranışlarına yol açıyordu.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Cgroups v1</th>
      <th>Cgroups v2</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Hiyerarşi</td>
      <td>Denetleyici başına ayrı olabilir</td>
      <td>Tek ve birleşik</td>
    </tr>
    <tr>
      <td>Süreç organizasyonu</td>
      <td>Farklı ağaçlarda farklı üyelik</td>
      <td>Tek cgroup üyeliği</td>
    </tr>
    <tr>
      <td>Yetki devri</td>
      <td>Karmaşık ve riskli</td>
      <td>Kontrollü delegation</td>
    </tr>
    <tr>
      <td>Bellek denetimi</td>
      <td>Daha parçalı davranış</td>
      <td>Tutarlı limit ve basınç modeli</td>
    </tr>
    <tr>
      <td>Arayüz</td>
      <td>Denetleyiciler arasında düzensiz</td>
      <td>Standartlaştırılmış dosyalar</td>
    </tr>
  </tbody>
</table>

<h2 id="birleşik-hiyerarşi-nasıl-çalışır">Birleşik hiyerarşi nasıl çalışır?</h2>

<p>v2 çoğunlukla <code class="language-plaintext highlighter-rouge">/sys/fs/cgroup</code> altında tek bir ağaç sunar. Bir sürecin kimliği <code class="language-plaintext highlighter-rouge">cgroup.procs</code>, kullanılabilir denetleyiciler <code class="language-plaintext highlighter-rouge">cgroup.controllers</code>, alt gruplara aktarılacak denetleyiciler ise <code class="language-plaintext highlighter-rouge">cgroup.subtree_control</code> üzerinden yönetilir.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Sistemde etkin olan v2 denetleyicilerini gösterir.</span>
<span class="nb">cat</span> /sys/fs/cgroup/cgroup.controllers

<span class="c"># Yeni bir uygulama grubu oluşturur.</span>
<span class="nb">sudo mkdir</span> /sys/fs/cgroup/demo

<span class="c"># Kabuğun PID'sini gruba taşır.</span>
<span class="nb">echo</span> <span class="nv">$$</span> | <span class="nb">sudo tee</span> /sys/fs/cgroup/demo/cgroup.procs
</code></pre></div></div>

<p>v2’nin önemli kurallarından biri <strong>no internal process constraint</strong> ilkesidir. Kaynak denetleyicileri alt gruplara dağıtan bir cgroup, normalde aynı anda doğrudan süreç barındırmaz. Başka bir deyişle dallar organizasyon, yapraklar iş yükü içindir. Bu kural, ebeveyn ve çocuk gruplar arasında kaynak hesabının bulanıklaşmasını önler.</p>

<h2 id="bellek-cpu-ve-süreç-sınırları">Bellek, CPU ve süreç sınırları</h2>

<p>Bellek tarafında <code class="language-plaintext highlighter-rouge">memory.max</code> kesin tavanı, <code class="language-plaintext highlighter-rouge">memory.high</code> ise çekirdeğin agresif geri kazanım uygulamaya başlayacağı yumuşak eşiği ifade eder. Böylece uygulamayı anında öldürmeden önce baskı oluşturmak mümkündür. <code class="language-plaintext highlighter-rouge">memory.current</code> mevcut tüketimi gösterirken <code class="language-plaintext highlighter-rouge">memory.events</code>, OOM gibi olayları sayar.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Kesin bellek limitini 512 MiB yapar.</span>
<span class="nb">echo </span>536870912 | <span class="nb">sudo tee</span> /sys/fs/cgroup/demo/memory.max

<span class="c"># Yaklaşık yarım CPU ve en fazla 100 süreç tanımlar.</span>
<span class="nb">echo</span> <span class="s1">'50000 100000'</span> | <span class="nb">sudo tee</span> /sys/fs/cgroup/demo/cpu.max
<span class="nb">echo </span>100 | <span class="nb">sudo tee</span> /sys/fs/cgroup/demo/pids.max
</code></pre></div></div>

<p>CPU paylaşım önceliği için v1’deki <code class="language-plaintext highlighter-rouge">cpu.shares</code> yerine daha anlaşılır bir aralığa sahip <code class="language-plaintext highlighter-rouge">cpu.weight</code> kullanılır. G/Ç denetimi de <code class="language-plaintext highlighter-rouge">io.max</code> ve <code class="language-plaintext highlighter-rouge">io.weight</code> gibi tutarlı adlarla sunulur.</p>

<h2 id="docker-açısından-anlamı">Docker açısından anlamı</h2>

<p>Docker’daki <code class="language-plaintext highlighter-rouge">--memory</code>, <code class="language-plaintext highlighter-rouge">--cpus</code> ve <code class="language-plaintext highlighter-rouge">--pids-limit</code> seçenekleri sonuçta bu dosyalara dönüştürülür. Modern systemd sürümleri de servisleri cgroup ağacında doğal olarak düzenler. Tek hiyerarşi sayesinde orkestratör, çalışma zamanı ve init sistemi aynı kaynak ağacını paylaşabilir; “bu süreci aslında kim yönetiyor?” bilmecesi büyük ölçüde ortadan kalkar.</p>

<p>Cgroups v2 yalnızca temizlenmiş bir arayüz değildir. Tutarlı muhasebe, güvenli yetki devri, gelişmiş bellek baskısı ve sade hiyerarşi sayesinde konteyner izolasyonunu daha sağlam bir çekirdek sözleşmesine dönüştürür. Kısacası v1 kaynaklara ayrı ayrı kilit vuruyordu; v2 ise bütün binaya düzenli bir erişim planı çiziyor.</p>

<p><img src="/img/linux-cekirdeginde-cgroups-17.svg" alt="linux-cekirdeginde-cgroups-17" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="linux" /><category term="cgroups" /><category term="docker" /><category term="konteyner" /><category term="çekirdek" /><category term="devops" /><summary type="html"><![CDATA[Bir konteynere “en fazla 512 MB bellek kullan” veya “işlemcinin yalnızca yarısını tüket” dediğimizde bu kuralları Docker’ın sihirli değneği değil, Linux çekirdeğinin control groups mekanizması uygular. Cgroups v2, ilk sürümün yıllar içinde karmaşıklaşan yapısını tek bir hiyerarşide birleştirerek kaynak yönetimini daha tutarlı, güvenli ve öngörülebilir hâle getirir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/linux-cekirdeginde-cgroups-17.png" /><media:content medium="image" url="https://program.sonsuz.us/img/linux-cekirdeginde-cgroups-17.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Meta-Learning: Öğrenmeyi Öğrenen Modellerin Kısa Tarihi</title><link href="https://program.sonsuz.us/posts/meta-learning-ogrenmeyi-ogrenen-modellerin-kisa-tarihi/" rel="alternate" type="text/html" title="Meta-Learning: Öğrenmeyi Öğrenen Modellerin Kısa Tarihi" /><published>2026-09-27T00:00:00+00:00</published><updated>2026-09-27T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/meta-learning-ogrenmeyi-ogrenen-modellerin-kisa-tarihi</id><content type="html" xml:base="https://program.sonsuz.us/posts/meta-learning-ogrenmeyi-ogrenen-modellerin-kisa-tarihi/"><![CDATA[<p>Geleneksel makine öğrenmesinde her yeni problem için veri toplar, modeli eğitir ve sabırla sonuç bekleriz. Meta-learning ise bu rutine küçük bir itiraz getirir: Model yalnızca görevleri çözmesin, yeni bir görevi nasıl hızlı öğreneceğini de keşfetsin. Böylece binlerce örnek yerine birkaç örnekle uyum sağlayabilen, deyim yerindeyse eğitim salonunda nasıl antrenman yapacağını öğrenen sistemler ortaya çıkar.</p>

<p><img src="/img/meta-learning-ogrenmeyi-67.svg" alt="meta-learning-ogrenmeyi-67" /></p>

<p>``</p>

<h2 id="fikir-nereden-çıktı">Fikir nereden çıktı?</h2>

<p>“Öğrenmeyi öğrenme” düşüncesi yapay zekâdan daha eskidir. Psikoloji, insanların önceki deneyimlerinden yararlanarak yeni becerileri daha hızlı kazandığını uzun süredir inceliyordu. Makine öğrenmesinde ise erken dönem çalışmalar, algoritmaların kendi öğrenme kurallarını ayarlayıp ayarlayamayacağı sorusuna odaklandı.</p>

<p>1990’larda sinir ağlarının ağırlık güncellemelerini başka ağlarla yönetme fikri belirginleşti. 2000’lerde çoklu görev öğrenmesi ve aktarım öğrenmesi güçlü temeller sağladı. 2010’ların ortasında derin öğrenme, büyük veri kümeleri ve GPU’larla birleşince meta-learning uygulanabilir hâle geldi. 2016 tarihli Matching Networks ve 2017’de yayımlanan MAML, alanın en etkili dönüm noktaları arasında yer aldı.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Temel amaç</th>
      <th>Yeni görevde gereken</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Klasik eğitim</td>
      <td>Tek görevi iyi çözmek</td>
      <td>Çok veri ve yeniden eğitim</td>
    </tr>
    <tr>
      <td>Transfer learning</td>
      <td>Önceden öğrenilmiş özellikleri aktarmak</td>
      <td>İnce ayar ve orta miktarda veri</td>
    </tr>
    <tr>
      <td>Few-shot learning</td>
      <td>Birkaç örnekle tahmin yapmak</td>
      <td>Küçük destek kümesi</td>
    </tr>
    <tr>
      <td>Meta-learning</td>
      <td>Uyum sağlama sürecini öğrenmek</td>
      <td>Birkaç örnek ve az sayıda güncelleme</td>
    </tr>
  </tbody>
</table>

<h2 id="görevler-üzerinden-öğrenmek">Görevler üzerinden öğrenmek</h2>

<p>Normal eğitimde veri noktaları örneklenir. Meta-learning eğitiminde ise <strong>görevler</strong> örneklenir. Her görev genellikle iki parçaya ayrılır:</p>

<ul>
  <li><strong>Destek kümesi:</strong> Modelin göreve uyum sağladığı az sayıdaki örnek.</li>
  <li><strong>Sorgu kümesi:</strong> Uyumun gerçekten işe yarayıp yaramadığını ölçen örnekler.</li>
</ul>

<p>Bir görev $T_i$ için destek kaybı $L_{S_i}$ olsun. Modelin başlangıç parametreleri $θ$ ise tek adımlık uyarlama şöyle yazılabilir:</p>

\[θ'_i = θ - α ∇_θ L_{S_i}(θ)\]

<p>Burada $α$ iç döngünün öğrenme oranıdır. Meta-model, uyarlanmış parametrelerin sorgu kümelerindeki toplam hatasını azaltmaya çalışır:</p>

\[min_θ Σ_i L_{Q_i}(θ'_i)\]

<p>İşin sihri burada yatar: Sistem yalnızca doğru cevabı değil, birkaç gradyan adımından sonra iyi sonuç verecek bir <strong>başlangıç noktası</strong> öğrenir. MAML’ın modelden bağımsız sayılmasının nedeni de bu fikrin sınıflandırma, regresyon veya pekiştirmeli öğrenme gibi farklı alanlara uygulanabilmesidir.</p>

<h2 id="üç-ana-meta-learning-ailesi">Üç ana meta-learning ailesi</h2>

<table>
  <thead>
    <tr>
      <th>Aile</th>
      <th>Öğrendiği şey</th>
      <th>Bilinen örnek</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Optimizasyon tabanlı</td>
      <td>Hızlı uyarlanabilir parametreler</td>
      <td>MAML, Reptile</td>
    </tr>
    <tr>
      <td>Metrik tabanlı</td>
      <td>Örnekler arasındaki benzerlik uzayı</td>
      <td>Prototypical Networks</td>
    </tr>
    <tr>
      <td>Model tabanlı</td>
      <td>Bellek veya öğrenme mekanizması</td>
      <td>Memory-Augmented Networks</td>
    </tr>
  </tbody>
</table>

<p>Metrik tabanlı yöntemlerde her sınıfın prototipi hesaplanabilir. $k$ sınıfına ait destek temsillerinin ortalaması:</p>

\[c_k = (1 / \vert S_k\vert ) Σ_{x ∈ S_k} f_θ(x)\]

<p>Yeni örnek, temsili hangi $c_k$ noktasına daha yakınsa o sınıfa atanır. Bir bakıma model, “Bu fotoğraf hangi aile albümüne daha çok benziyor?” diye sorar.</p>

<h2 id="maml-mantığının-küçük-bir-kod-karşılığı">MAML mantığının küçük bir kod karşılığı</h2>

<p>Aşağıdaki PyTorch taslağı, tek görev için iç güncelleme yapar ve sorgu kaybını hesaplar. <code class="language-plaintext highlighter-rouge">create_graph=True</code>, dış döngünün iç güncelleme üzerinden türev alabilmesini sağlar:</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">from</span> <span class="n">torch.func</span> <span class="kn">import</span> <span class="n">functional_call</span>

<span class="n">support_logits</span> <span class="o">=</span> <span class="nf">model</span><span class="p">(</span><span class="n">x_support</span><span class="p">)</span>
<span class="n">support_loss</span> <span class="o">=</span> <span class="nf">loss_fn</span><span class="p">(</span><span class="n">support_logits</span><span class="p">,</span> <span class="n">y_support</span><span class="p">)</span>

<span class="n">params</span> <span class="o">=</span> <span class="nf">dict</span><span class="p">(</span><span class="n">model</span><span class="p">.</span><span class="nf">named_parameters</span><span class="p">())</span>
<span class="n">grads</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">autograd</span><span class="p">.</span><span class="nf">grad</span><span class="p">(</span>
    <span class="n">support_loss</span><span class="p">,</span>
    <span class="n">params</span><span class="p">.</span><span class="nf">values</span><span class="p">(),</span>
    <span class="n">create_graph</span><span class="o">=</span><span class="bp">True</span>
<span class="p">)</span>

<span class="n">fast_params</span> <span class="o">=</span> <span class="p">{</span>
    <span class="n">name</span><span class="p">:</span> <span class="n">param</span> <span class="o">-</span> <span class="n">inner_lr</span> <span class="o">*</span> <span class="n">grad</span>
    <span class="nf">for </span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">param</span><span class="p">),</span> <span class="n">grad</span> <span class="ow">in</span> <span class="nf">zip</span><span class="p">(</span><span class="n">params</span><span class="p">.</span><span class="nf">items</span><span class="p">(),</span> <span class="n">grads</span><span class="p">)</span>
<span class="p">}</span>

<span class="n">query_logits</span> <span class="o">=</span> <span class="nf">functional_call</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">fast_params</span><span class="p">,</span> <span class="p">(</span><span class="n">x_query</span><span class="p">,))</span>
<span class="n">outer_loss</span> <span class="o">=</span> <span class="nf">loss_fn</span><span class="p">(</span><span class="n">query_logits</span><span class="p">,</span> <span class="n">y_query</span><span class="p">)</span>

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

<p>Gerçek uygulamada bu işlem birçok görev için tekrarlanır ve sorgu kayıpları ortalanır. Hesaplama maliyeti özellikle ikinci dereceden türevler nedeniyle yükselebilir; First-Order MAML ve Reptile gibi yöntemler bu yükü azaltmayı hedefler.</p>

<h2 id="neden-önemli">Neden önemli?</h2>

<p>Meta-learning; nadir hastalıkların sınıflandırılması, yeni robot hareketleri, kişiselleştirilmiş öneriler ve az kaynaklı diller gibi verinin pahalı olduğu alanlarda değerlidir. Yine de görev dağılımı kötü seçilirse model yeni koşullara uyum sağlayamaz. Kısacası öğrenmeyi öğrenen bir sistem de öğretmeninin hazırladığı müfredat kadar iyidir. Meta-learning’in büyük vaadi, her şeyi bilen modeller değil; bilmediği bir şeyle karşılaştığında ne yapacağını daha çabuk anlayan modeller üretmesidir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="meta-learning" /><category term="yapay zeka" /><category term="makine öğrenmesi" /><category term="few-shot learning" /><category term="maml" /><category term="derin öğrenme" /><summary type="html"><![CDATA[Geleneksel makine öğrenmesinde her yeni problem için veri toplar, modeli eğitir ve sabırla sonuç bekleriz. Meta-learning ise bu rutine küçük bir itiraz getirir: Model yalnızca görevleri çözmesin, yeni bir görevi nasıl hızlı öğreneceğini de keşfetsin. Böylece binlerce örnek yerine birkaç örnekle uyum sağlayabilen, deyim yerindeyse eğitim salonunda nasıl antrenman yapacağını öğrenen sistemler ortaya çıkar.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/meta-learning-ogrenmeyi-67.png" /><media:content medium="image" url="https://program.sonsuz.us/img/meta-learning-ogrenmeyi-67.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Ring 0’dan Ring 3’e: Kullanıcı Modu ve Çekirdek Modu Arasındaki Duvar</title><link href="https://program.sonsuz.us/posts/ring-0dan-ring-3e-kullanici-modu-ve-cekirdek-modu-arasindaki-duvar/" rel="alternate" type="text/html" title="Ring 0’dan Ring 3’e: Kullanıcı Modu ve Çekirdek Modu Arasındaki Duvar" /><published>2026-09-27T00:00:00+00:00</published><updated>2026-09-27T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/ring-0dan-ring-3e-kullanici-modu-ve-cekirdek-modu-arasindaki-duvar</id><content type="html" xml:base="https://program.sonsuz.us/posts/ring-0dan-ring-3e-kullanici-modu-ve-cekirdek-modu-arasindaki-duvar/"><![CDATA[<p>Bir müzik uygulamasının yanlışlıkla diskin tamamını silmesini veya sıradan bir oyunun klavye sürücüsünü yeniden programlamasını istemeyiz. İşletim sistemleri bu felaketleri yalnızca yazılım kurallarıyla değil, işlemcinin uyguladığı <strong>ayrıcalık seviyeleriyle</strong> engeller. x86 mimarisinde bunlar Ring 0 ile Ring 3 arasında numaralandırılan güvenlik halkalarıdır: Sayı küçüldükçe yetki büyür, sorumluluk ağırlaşır.
``</p>

<h2 id="halkaların-temel-mantığı">Halkaların temel mantığı</h2>

<p>İşlemci, çalışan kodun hangi ayrıcalık seviyesinde olduğunu takip eder. x86 terminolojisinde mevcut seviye <strong>CPL</strong> (Current Privilege Level) olarak adlandırılır. Kaynakların ve kod bölümlerinin erişim seviyesi ise <strong>DPL</strong> (Descriptor Privilege Level) gibi alanlarla belirtilir.</p>

<p>Basitleştirilmiş erişim düşüncesi şu eşitsizlikle anlatılabilir:</p>

\[P_{etkin} \leq P_{gerekli}\]

<p>Burada küçük sayı daha yüksek yetkiyi temsil eder. Dolayısıyla Ring 0 kodu pek çok ayrıcalıklı kaynağa ulaşabilirken Ring 3 kodu aynı işlemi yapmaya çalıştığında işlemci bir koruma hatası üretir.</p>

<table>
  <thead>
    <tr>
      <th>Halka</th>
      <th>Tipik kullanım</th>
      <th style="text-align: right">Yetki düzeyi</th>
      <th>Modern sistemlerde durum</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Ring 0</td>
      <td>Çekirdek ve temel sürücüler</td>
      <td style="text-align: right">En yüksek</td>
      <td>Yoğun biçimde kullanılır</td>
    </tr>
    <tr>
      <td>Ring 1</td>
      <td>Yardımcı sistem servisleri</td>
      <td style="text-align: right">Yüksek</td>
      <td>Genellikle kullanılmaz</td>
    </tr>
    <tr>
      <td>Ring 2</td>
      <td>Bazı sürücüler</td>
      <td style="text-align: right">Orta</td>
      <td>Genellikle kullanılmaz</td>
    </tr>
    <tr>
      <td>Ring 3</td>
      <td>Tarayıcı, oyun, editör</td>
      <td style="text-align: right">En düşük</td>
      <td>Kullanıcı uygulamalarının evidir</td>
    </tr>
  </tbody>
</table>

<p>Linux, Windows ve çoğu genel amaçlı işletim sistemi pratikte iki seviyeli bir model kullanır: çekirdek Ring 0’da, uygulamalar Ring 3’te çalışır. Ring 1 ve Ring 2 donanımda bulunsa da taşınabilirlik ve tasarım sadeliği nedeniyle çoğunlukla boş bırakılır.</p>

<h2 id="duvar-işlemci-seviyesinde-nasıl-kurulur">Duvar işlemci seviyesinde nasıl kurulur?</h2>

<p>Duvarın ilk tuğlası <strong>ayrıcalıklı komutlardır</strong>. Kesme sistemini kapatan <code class="language-plaintext highlighter-rouge">cli</code>, kontrol yazmaçlarını değiştiren talimatlar veya sayfa tablolarını yöneten işlemler Ring 3’te yürütülemez. Bir uygulama bunları denerse CPU işlemi reddeder ve çekirdeğe bir istisna bildirir.</p>

<p>İkinci tuğla <strong>bellek korumasıdır</strong>. Sanal bellekteki her sayfa için sayfa tablosu girdileri bulunur. x86 mimarisindeki U/S biti, sayfanın kullanıcı modundan erişilebilir olup olmadığını belirtir:</p>

<table>
  <thead>
    <tr>
      <th style="text-align: right">U/S biti</th>
      <th>Ring 3 erişimi</th>
      <th>Ring 0 erişimi</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: right">0</td>
      <td>Yasak</td>
      <td>İzinli</td>
    </tr>
    <tr>
      <td style="text-align: right">1</td>
      <td>İzinlere bağlı</td>
      <td>İzinlere bağlı</td>
    </tr>
  </tbody>
</table>

<p>Buna yazılabilirlik ve çalıştırılabilirlik bitleri de eklenir. Böylece bir süreç başka bir sürecin ya da çekirdeğin belleğine yalnızca adresini tahmin ederek ulaşamaz.</p>

<h2 id="uygulamalar-hizmeti-nasıl-ister">Uygulamalar hizmeti nasıl ister?</h2>

<p>Ring 3 tamamen çaresiz değildir; çekirdekten kontrollü biçimde yardım ister. Bunun kapısı <strong>sistem çağrısıdır</strong>. x86-64 sistemlerinde <code class="language-plaintext highlighter-rouge">syscall</code> komutu işlemciyi önceden belirlenmiş çekirdek giriş noktasına taşır, ayrıcalık seviyesini değiştirir ve kullanıcı bağlamının geri yüklenebilmesi için gerekli bilgileri saklar.</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;unistd.h&gt;</span><span class="cp">
</span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">const</span> <span class="kt">char</span> <span class="n">mesaj</span><span class="p">[]</span> <span class="o">=</span> <span class="s">"Merhaba, cekirdek!</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
    <span class="n">write</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">mesaj</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">mesaj</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span><span class="p">);</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Buradaki <code class="language-plaintext highlighter-rouge">write</code>, ekrana doğrudan erişmez. Standart kütüphane uygun sistem çağrısını başlatır; çekirdek dosya tanımlayıcısını ve kullanıcı belleğindeki adresi doğrular. İstek güvenliyse terminal sürücüsüne kadar uzanan işi çekirdek gerçekleştirir.</p>

<p>Geçişin maliyeti kabaca şöyle düşünülebilir:</p>

\[T_{toplam} = T_{geçiş} + T_{doğrulama} + T_{işlem} + T_{dönüş}\]

<p>Bu nedenle her küçük işlem için sistem çağrısı yapmak yerine tamponlama kullanılır. Örneğin yüzlerce karakter tek tek değil, bir blok hâlinde yazılabilir.</p>

<h2 id="kesintiler-hatalar-ve-kontrollü-dönüş">Kesintiler, hatalar ve kontrollü dönüş</h2>

<p>Donanım kesintileri ve sayfa hataları da kontrolü çekirdeğe aktarabilir. İşlemci, <strong>IDT</strong> içindeki hedef kapının yetki kurallarını denetler; rastgele bir adrese sıçramaz. Çekirdek olayı işledikten sonra özel dönüş talimatlarıyla Ring 3 bağlamını geri yükler.</p>

<p>Sonuç olarak kullanıcı modu ile çekirdek modu arasındaki duvar basit bir programlama geleneği değildir. Ayrıcalıklı komutlar, sayfa tabloları, kesme kapıları ve sistem çağrısı mekanizması birlikte çalışır. Uygulama kontrolden çıksa bile işlemci ona nazikçe ama kesin biçimde şunu söyler: Donanıma dokunmak istiyorsan önce çekirdekten izin al.</p>

<p><img src="/img/ring-0dan-ring-41.svg" alt="ring-0dan-ring-41" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="işletim sistemi" /><category term="çekirdek" /><category term="işlemci mimarisi" /><category term="güvenlik" /><category term="x86" /><category term="sistem programlama" /><summary type="html"><![CDATA[Bir müzik uygulamasının yanlışlıkla diskin tamamını silmesini veya sıradan bir oyunun klavye sürücüsünü yeniden programlamasını istemeyiz. İşletim sistemleri bu felaketleri yalnızca yazılım kurallarıyla değil, işlemcinin uyguladığı ayrıcalık seviyeleriyle engeller. x86 mimarisinde bunlar Ring 0 ile Ring 3 arasında numaralandırılan güvenlik halkalarıdır: Sayı küçüldükçe yetki büyür, sorumluluk ağırlaşır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/ring-0dan-ring-41.png" /><media:content medium="image" url="https://program.sonsuz.us/img/ring-0dan-ring-41.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Swarm Intelligence: Parçacık Sürü Optimizasyonunun Yapay Zekâdaki Yeri</title><link href="https://program.sonsuz.us/posts/swarm-intelligence-parcacik-suru-optimizasyonunun-yapay-zekadaki-yeri/" rel="alternate" type="text/html" title="Swarm Intelligence: Parçacık Sürü Optimizasyonunun Yapay Zekâdaki Yeri" /><published>2026-09-27T00:00:00+00:00</published><updated>2026-09-27T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/swarm-intelligence-parcacik-suru-optimizasyonunun-yapay-zekadaki-yeri</id><content type="html" xml:base="https://program.sonsuz.us/posts/swarm-intelligence-parcacik-suru-optimizasyonunun-yapay-zekadaki-yeri/"><![CDATA[<p>Doğada merkezi bir yönetici olmadan sergilenen kolektif davranışlar, şaşırtıcı derecede başarılı sonuçlar üretir. Kuşlar yiyecek ararken birbirlerinin hareketlerinden yararlanır, balıklar tehlikeden birlikte kaçar ve karıncalar en kısa yolu kimse onlara harita vermeden bulur. <strong>Parçacık Sürü Optimizasyonu</strong> (Particle Swarm Optimization veya PSO), bu sosyal davranışı matematiksel bir optimizasyon yöntemine dönüştürür.</p>

<p>``</p>

<h2 id="sürü-zekâsı-nedir">Sürü zekâsı nedir?</h2>

<p>Sürü zekâsı, basit kuralları izleyen çok sayıda bireyin etkileşiminden ortaya çıkan kolektif problem çözme yeteneğidir. Buradaki temel fikir, tek bir bireyin kusursuz olmasına gerek olmadığıdır. Bireyler kendi deneyimlerini grubun deneyimiyle birleştirdiğinde etkili bir arama mekanizması oluşur.</p>

<p>PSO, 1995 yılında James Kennedy ve Russell Eberhart tarafından geliştirilmiştir. Algoritmada her olası çözüm bir <strong>parçacık</strong>, tüm parçacıklar ise bir <strong>sürü</strong> olarak temsil edilir. Parçacıklar çözüm uzayında dolaşarak amaç fonksiyonunun en iyi değerini arar.</p>

<table>
  <thead>
    <tr>
      <th>Doğadaki kavram</th>
      <th>PSO karşılığı</th>
      <th>Görevi</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Kuş</td>
      <td>Parçacık</td>
      <td>Aday çözümü temsil eder</td>
    </tr>
    <tr>
      <td>Kuşun konumu</td>
      <td>Çözüm vektörü</td>
      <td>Parametrelerin mevcut değerlerini taşır</td>
    </tr>
    <tr>
      <td>Uçuş yönü</td>
      <td>Hız vektörü</td>
      <td>Sonraki hareketi belirler</td>
    </tr>
    <tr>
      <td>Bulunan yiyecek</td>
      <td>En iyi çözüm</td>
      <td>Amaç fonksiyonunun optimumuna karşılık gelir</td>
    </tr>
    <tr>
      <td>Sürü iletişimi</td>
      <td>Küresel en iyi bilgi</td>
      <td>Parçacıkları umut vadeden bölgeye yönlendirir</td>
    </tr>
  </tbody>
</table>

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

<p>Her parçacığın bir konumu $x_i$ ve hızı $v_i$ bulunur. Ayrıca parçacık, şimdiye kadar keşfettiği en iyi konumu $p_i$ olarak hatırlar. Sürünün bulduğu en iyi konum ise $g$ ile gösterilir.</p>

<p>Hız güncelleme denklemi şöyledir:</p>

\[v_i(t+1)=w v_i(t)+c_1r_1(p_i-x_i(t))+c_2r_2(g-x_i(t))\]

<p>Yeni konum da şu şekilde hesaplanır:</p>

\[x_i(t+1)=x_i(t)+v_i(t+1)\]

<p>Burada $w$ eylemsizlik katsayısıdır ve parçacığın önceki yönünü ne kadar koruyacağını belirler. $c_1$ bilişsel katsayıdır; parçacığın kendi deneyimine bağlılığını temsil eder. $c_2$ sosyal katsayıdır ve sürünün keşfine verilen önemi kontrol eder. $r_1$ ile $r_2$, $[0,1]$ aralığında rastgele sayılardır. Bu rastlantısallık, bütün parçacıkların erkenden aynı noktaya yığılmasını önlemeye yardımcı olur.</p>

<table>
  <thead>
    <tr>
      <th>Katsayı tercihi</th>
      <th>Baskın davranış</th>
      <th>Olası sonuç</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Yüksek $w$</td>
      <td>Geniş alanları keşfetme</td>
      <td>Optimumu kaçırma riski azalabilir</td>
    </tr>
    <tr>
      <td>Yüksek $c_1$</td>
      <td>Bireysel hareket</td>
      <td>Parçacıklar bağımsız davranır</td>
    </tr>
    <tr>
      <td>Yüksek $c_2$</td>
      <td>Sürüye uyum</td>
      <td>Hızlı yakınsama sağlanır</td>
    </tr>
    <tr>
      <td>Dengeli değerler</td>
      <td>Keşif ve sömürü dengesi</td>
      <td>Genellikle daha kararlı sonuç alınır</td>
    </tr>
  </tbody>
</table>

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

<p>Aşağıdaki örnek, $f(x)=x^2$ fonksiyonunun minimumunu arar. Teorik minimum $x=0$ noktasındadır.</p>

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

<span class="n">parcacik_sayisi</span> <span class="o">=</span> <span class="mi">20</span>
<span class="n">konumlar</span> <span class="o">=</span> <span class="p">[</span><span class="n">random</span><span class="p">.</span><span class="nf">uniform</span><span class="p">(</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span> <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="n">parcacik_sayisi</span><span class="p">)]</span>
<span class="n">hizlar</span> <span class="o">=</span> <span class="p">[</span><span class="n">random</span><span class="p">.</span><span class="nf">uniform</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span> <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="n">parcacik_sayisi</span><span class="p">)]</span>
<span class="n">kisisel_en_iyi</span> <span class="o">=</span> <span class="n">konumlar</span><span class="p">.</span><span class="nf">copy</span><span class="p">()</span>

<span class="k">def</span> <span class="nf">uygunluk</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">x</span> <span class="o">**</span> <span class="mi">2</span>

<span class="n">kuresel_en_iyi</span> <span class="o">=</span> <span class="nf">min</span><span class="p">(</span><span class="n">kisisel_en_iyi</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="n">uygunluk</span><span class="p">)</span>

<span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">100</span><span class="p">):</span>
    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="n">parcacik_sayisi</span><span class="p">):</span>
        <span class="n">r1</span><span class="p">,</span> <span class="n">r2</span> <span class="o">=</span> <span class="n">random</span><span class="p">.</span><span class="nf">random</span><span class="p">(),</span> <span class="n">random</span><span class="p">.</span><span class="nf">random</span><span class="p">()</span>
        <span class="n">hizlar</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span>
            <span class="mf">0.7</span> <span class="o">*</span> <span class="n">hizlar</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
            <span class="o">+</span> <span class="mf">1.5</span> <span class="o">*</span> <span class="n">r1</span> <span class="o">*</span> <span class="p">(</span><span class="n">kisisel_en_iyi</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">-</span> <span class="n">konumlar</span><span class="p">[</span><span class="n">i</span><span class="p">])</span>
            <span class="o">+</span> <span class="mf">1.5</span> <span class="o">*</span> <span class="n">r2</span> <span class="o">*</span> <span class="p">(</span><span class="n">kuresel_en_iyi</span> <span class="o">-</span> <span class="n">konumlar</span><span class="p">[</span><span class="n">i</span><span class="p">])</span>
        <span class="p">)</span>
        <span class="n">konumlar</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">+=</span> <span class="n">hizlar</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>

        <span class="k">if</span> <span class="nf">uygunluk</span><span class="p">(</span><span class="n">konumlar</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> <span class="o">&lt;</span> <span class="nf">uygunluk</span><span class="p">(</span><span class="n">kisisel_en_iyi</span><span class="p">[</span><span class="n">i</span><span class="p">]):</span>
            <span class="n">kisisel_en_iyi</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">konumlar</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>

    <span class="n">kuresel_en_iyi</span> <span class="o">=</span> <span class="nf">min</span><span class="p">(</span><span class="n">kisisel_en_iyi</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="n">uygunluk</span><span class="p">)</span>

<span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">Bulunan minimum noktası:</span><span class="sh">"</span><span class="p">,</span> <span class="n">kuresel_en_iyi</span><span class="p">)</span>
</code></pre></div></div>

<p>Kod, parçacıkları rastgele başlatır; ardından hız ve konumlarını 100 tur boyunca günceller. Her turda bireysel ve küresel rekorlar yenilenir. Sonuç genellikle sıfıra oldukça yakın çıkar.</p>

<h2 id="yapay-zekâdaki-kullanım-alanları">Yapay zekâdaki kullanım alanları</h2>

<p>PSO; sinir ağlarının ağırlıklarını ayarlamak, özellik seçmek, hiperparametre optimizasyonu yapmak, robot rotaları planlamak ve enerji sistemlerini düzenlemek için kullanılabilir. Türev bilgisi istememesi, karmaşık ve doğrusal olmayan problemlerde önemli bir avantajdır. Buna karşılık doğru katsayılar seçilmezse yerel optimuma erken yakınsayabilir ve yüksek boyutlarda maliyetli hâle gelebilir.</p>

<p>Kısacası PSO, “en iyi çözümü tek başına bul” yaklaşımı yerine “deneyimini paylaş ve birlikte ara” der. Bazen karmaşık bir problemi çözmek için gereken şey daha güçlü bir birey değil, daha iyi iletişim kuran bir sürüdür.</p>

<p><img src="/img/swarm-intelligence-parcacik-75.svg" alt="swarm-intelligence-parcacik-75" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="yapay zekâ" /><category term="pso" /><category term="sürü zekâsı" /><category term="optimizasyon" /><category term="sezgisel algoritmalar" /><category term="makine öğrenmesi" /><summary type="html"><![CDATA[Doğada merkezi bir yönetici olmadan sergilenen kolektif davranışlar, şaşırtıcı derecede başarılı sonuçlar üretir. Kuşlar yiyecek ararken birbirlerinin hareketlerinden yararlanır, balıklar tehlikeden birlikte kaçar ve karıncalar en kısa yolu kimse onlara harita vermeden bulur. Parçacık Sürü Optimizasyonu (Particle Swarm Optimization veya PSO), bu sosyal davranışı matematiksel bir optimizasyon yöntemine dönüştürür.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/swarm-intelligence-parcacik-75.png" /><media:content medium="image" url="https://program.sonsuz.us/img/swarm-intelligence-parcacik-75.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Active Learning: Modelin Etiket Seçme Sanatı</title><link href="https://program.sonsuz.us/posts/active-learning-modelin-etiket-secme-sanati/" rel="alternate" type="text/html" title="Active Learning: Modelin Etiket Seçme Sanatı" /><published>2026-09-26T00:00:00+00:00</published><updated>2026-09-26T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/active-learning-modelin-etiket-secme-sanati</id><content type="html" xml:base="https://program.sonsuz.us/posts/active-learning-modelin-etiket-secme-sanati/"><![CDATA[<p><img src="/img/active-learning-modelin-37.svg" alt="active-learning-modelin-37" /></p>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

<p>Bir otomobil sürücünün zihnini okuyamaz; ancak direksiyon hareketlerini, hız değişimlerini ve frenleme biçimini dikkatle dinleyebilir. Hidden Markov Modeli (HMM), doğrudan göremediğimiz <strong>uykulu</strong>, <strong>agresif</strong> veya <strong>normal</strong> sürüş durumlarını sensörlerden gelen ölçümler yardımıyla tahmin eder. Kısacası HMM, aracın küçük ipuçlarından sürücünün perde arkasındaki durumunu anlamaya çalışan istatistiksel bir dedektiftir.</p>

<p>``</p>

<h2 id="gizli-olan-ne-gözlenen-ne">Gizli olan ne, gözlenen ne?</h2>

<p>HMM’de sistemin gerçek durumu doğrudan gözlemlenemez. Sürücünün agresif olduğunu kesin biçimde ölçen bir sensör yoktur. Bunun yerine gaz pedalı konumu, direksiyon açısı, şerit sapması ve ivme gibi dolaylı belirtiler izlenir.</p>

<table>
  <thead>
    <tr>
      <th>HMM bileşeni</th>
      <th>Sürücü analizi karşılığı</th>
      <th>Örnek</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Gizli durum</td>
      <td>Sürücünün gerçek davranışı</td>
      <td>Uykulu, normal, agresif</td>
    </tr>
    <tr>
      <td>Gözlem</td>
      <td>Sensörlerden ölçülen değer</td>
      <td>Hız, ivme, direksiyon açısı</td>
    </tr>
    <tr>
      <td>Geçiş olasılığı</td>
      <td>Durumlar arasındaki değişim</td>
      <td>Normalden uykuluya geçiş</td>
    </tr>
    <tr>
      <td>Yayılım olasılığı</td>
      <td>Durumun belirli ölçümü üretmesi</td>
      <td>Agresifken yüksek ivme görülmesi</td>
    </tr>
    <tr>
      <td>Başlangıç olasılığı</td>
      <td>Yolculuk başındaki durum</td>
      <td>Yüzde 80 normal sürüş</td>
    </tr>
  </tbody>
</table>

<p>Bir HMM, gizli durum dizisini $S_1,S_2,…,S_T$ ve gözlem dizisini $O_1,O_2,…,O_T$ olarak ele alır. Model üç temel olasılık kümesiyle tanımlanır:</p>

<ul>
  <li>Başlangıç dağılımı: $P(S_1)$</li>
  <li>Geçiş olasılığı: $P(S_t \mid S_{t-1})$</li>
  <li>Gözlem olasılığı: $P(O_t \mid S_t)$</li>
</ul>

<p>Ortak olasılık genel olarak şöyle yazılır:</p>

\[P(S,O)=P(S_1)P(O_1 \mid S_1)\prod_{t=2}^{T}P(S_t \mid S_{t-1})P(O_t \mid S_t)\]

<p>Buradaki kritik varsayım, mevcut durumun yalnızca önceki duruma bağlı olmasıdır. Başka bir deyişle model, sürücünün bütün hayat hikâyesini değil yakın geçmişini hatırlar. Bu sadeleştirme hesaplamayı mümkün kılar.</p>

<h2 id="sensör-verisi-nasıl-hazırlanır">Sensör verisi nasıl hazırlanır?</h2>

<p>Ham sensör akışı doğrudan modele verilirse çukurlar, GPS hataları veya ani trafik olayları yanlış alarm üretebilir. Bu nedenle veriler kısa zaman pencerelerine ayrılır. Her pencere için ortalama hız, ivme varyansı, sert fren sayısı ve şerit sapmasının standart sapması gibi özellikler hesaplanır.</p>

<table>
  <thead>
    <tr>
      <th>Davranış</th>
      <th>Muhtemel sensör örüntüsü</th>
      <th>Karıştırılabileceği durum</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Uykulu</td>
      <td>Yavaş direksiyon düzeltmeleri, artan şerit sapması</td>
      <td>Bozuk yol</td>
    </tr>
    <tr>
      <td>Agresif</td>
      <td>Sert hızlanma, ani fren, keskin dönüş</td>
      <td>Acil manevra</td>
    </tr>
    <tr>
      <td>Normal</td>
      <td>Dengeli hız ve düşük değişkenlik</td>
      <td>Yoğun trafik</td>
    </tr>
  </tbody>
</table>

<p>Gözlemler sürekli değerliyse her gizli durum için Gauss dağılımı kullanılabilir. Çok sayıda özelliğin birlikte değerlendirilmesi gerekiyorsa çok değişkenli Gauss dağılımı tercih edilir.</p>

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

<p>Aşağıdaki örnek, hız, boylamsal ivme ve şerit sapması özelliklerinden üç davranış durumu öğrenir:</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="kn">from</span> <span class="n">hmmlearn.hmm</span> <span class="kn">import</span> <span class="n">GaussianHMM</span>

<span class="c1"># Her satır: [hız, ivme, şerit_sapması]
</span><span class="n">X</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">array</span><span class="p">([</span>
    <span class="p">[</span><span class="mi">82</span><span class="p">,</span> <span class="mf">0.1</span><span class="p">,</span> <span class="mf">0.08</span><span class="p">],</span> <span class="p">[</span><span class="mi">80</span><span class="p">,</span> <span class="mf">0.0</span><span class="p">,</span> <span class="mf">0.10</span><span class="p">],</span>
    <span class="p">[</span><span class="mi">110</span><span class="p">,</span> <span class="mf">2.4</span><span class="p">,</span> <span class="mf">0.25</span><span class="p">],</span> <span class="p">[</span><span class="mi">105</span><span class="p">,</span> <span class="o">-</span><span class="mf">3.1</span><span class="p">,</span> <span class="mf">0.30</span><span class="p">],</span>
    <span class="p">[</span><span class="mi">68</span><span class="p">,</span> <span class="mf">0.1</span><span class="p">,</span> <span class="mf">0.65</span><span class="p">],</span> <span class="p">[</span><span class="mi">66</span><span class="p">,</span> <span class="o">-</span><span class="mf">0.1</span><span class="p">,</span> <span class="mf">0.72</span><span class="p">]</span>
<span class="p">])</span>

<span class="n">model</span> <span class="o">=</span> <span class="nc">GaussianHMM</span><span class="p">(</span>
    <span class="n">n_components</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span>
    <span class="n">covariance_type</span><span class="o">=</span><span class="sh">"</span><span class="s">full</span><span class="sh">"</span><span class="p">,</span>
    <span class="n">n_iter</span><span class="o">=</span><span class="mi">100</span><span class="p">,</span>
    <span class="n">random_state</span><span class="o">=</span><span class="mi">42</span>
<span class="p">)</span>
<span class="n">model</span><span class="p">.</span><span class="nf">fit</span><span class="p">(</span><span class="n">X</span><span class="p">)</span>

<span class="n">hidden_states</span> <span class="o">=</span> <span class="n">model</span><span class="p">.</span><span class="nf">predict</span><span class="p">(</span><span class="n">X</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="n">hidden_states</span><span class="p">)</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">fit</code>, geçiş ve gözlem dağılımlarını veriden öğrenir. <code class="language-plaintext highlighter-rouge">predict</code> ise Viterbi algoritmasını kullanarak en olası gizli durum dizisini çıkarır. Ancak dönen <code class="language-plaintext highlighter-rouge">0</code>, <code class="language-plaintext highlighter-rouge">1</code> ve <code class="language-plaintext highlighter-rouge">2</code> etiketleri otomatik olarak “uykulu” anlamına gelmez; durumların sensör ortalamaları incelenerek uzmanlar tarafından adlandırılması gerekir.</p>

<h2 id="gerçek-hayatta-dikkat-edilmesi-gerekenler">Gerçek hayatta dikkat edilmesi gerekenler</h2>

<p>HMM zamansal bağımlılığı hesaba kattığı için tek ölçümlük eşik sistemlerinden daha kararlıdır. Yine de hava koşulları, araç tipi ve sürücünün kişisel alışkanlıkları modeli etkiler. Eğitim verisi farklı sürücülerden ve yol koşullarından toplanmalı; sonuçlar precision, recall ve karışıklık matrisiyle değerlendirilmelidir.</p>

<p>Üstelik “agresif” etiketi güvenlik, sigorta ve mahremiyet sonuçları doğurabilir. Bu yüzden tahminler kesin hüküm değil, sürücü destek sistemine sunulan olasılıksal uyarılar olarak ele alınmalıdır. HMM sihirli bir zihin okuyucu değildir; fakat sensörlerin fısıltısını anlamlı bir davranış hikâyesine dönüştürmekte oldukça yeteneklidir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="hidden markov modeli" /><category term="hmm" /><category term="sürücü analizi" /><category term="makine öğrenmesi" /><category term="sensör verisi" /><category term="python" /><summary type="html"><![CDATA[Bir otomobil sürücünün zihnini okuyamaz; ancak direksiyon hareketlerini, hız değişimlerini ve frenleme biçimini dikkatle dinleyebilir. Hidden Markov Modeli (HMM), doğrudan göremediğimiz uykulu, agresif veya normal sürüş durumlarını sensörlerden gelen ölçümler yardımıyla tahmin eder. Kısacası HMM, aracın küçük ipuçlarından sürücünün perde arkasındaki durumunu anlamaya çalışan istatistiksel bir dedektiftir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/direksiyon-basindaki-gorunmeyeni-86.png" /><media:content medium="image" url="https://program.sonsuz.us/img/direksiyon-basindaki-gorunmeyeni-86.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Federated Learning ve Diferansiyel Gizlilik: Veri Cihazdan Çıkmadan Model Eğitmek</title><link href="https://program.sonsuz.us/posts/federated-learning-ve-diferansiyel-gizlilik-veri-cihazdan-cikmadan-model-egitmek/" rel="alternate" type="text/html" title="Federated Learning ve Diferansiyel Gizlilik: Veri Cihazdan Çıkmadan Model Eğitmek" /><published>2026-09-26T00:00:00+00:00</published><updated>2026-09-26T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/federated-learning-ve-diferansiyel-gizlilik-veri-cihazdan-cikmadan-model-egitmek</id><content type="html" xml:base="https://program.sonsuz.us/posts/federated-learning-ve-diferansiyel-gizlilik-veri-cihazdan-cikmadan-model-egitmek/"><![CDATA[<p><img src="/img/federated-learning-ve-24.svg" alt="federated-learning-ve-24" /></p>

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

<p>``</p>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

<p>Sonuç olarak federe öğrenme veriyi cihazda tutar, diferansiyel gizlilik ise modelin veriyi istemeden ezberlemesini sınırlar. İkisi güvenli toplama, şifreli iletişim ve düzenli gizlilik muhasebesiyle birleştiğinde milyonlarca kullanıcıdan öğrenen; ancak tek bir kullanıcı hakkında mümkün olduğunca az şey söyleyen dev modeller kurulabilir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="federated learning" /><category term="diferansiyel gizlilik" /><category term="makine öğrenmesi" /><category term="yapay zeka" /><category term="veri güvenliği" /><category term="python" /><summary type="html"><![CDATA[Telefonunuzun yazdığınız kelimeleri tahmin etmeyi öğrendiğini, ancak mesajlarınızın hiçbir zaman merkezi bir sunucuya gönderilmediğini düşünün. Federated Learning, yani federe öğrenme, tam olarak bu fikri hayata geçirir: Veriyi modele taşımak yerine modeli veriye götürür. Diferansiyel gizlilik ise paylaşılan model güncellemelerinden kişisel bilgilerin çıkarılmasını matematiksel olarak zorlaştırır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/federated-learning-ve-24.png" /><media:content medium="image" url="https://program.sonsuz.us/img/federated-learning-ve-24.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>