TemelML:1 Giriş

Neden Bu Diziyi Yazıyorum?

Uzun süredir ben de makine öğrenmesi öğrencisiyim, çook uzun süre de buralarda kalıp bu dönüşümün zevkini tatmak istiyorum. BEn kitaplardan öğreniyorum ve internette de bir çok makale, tutorial, kurs var. Bir çoğu 2020 öncesinden tensorflow temelinde konulara yaklaşık çok teorik kalıyor. Hepsinde çok benzer bir yaklaşım var: “Önce temeller, linear regression, sonra neural networks, sonra deep learning…” klasik sıralama az çok böyle. Bu yaklaşımı takip eden çok kaliteli kitaplar/video serileri de mevcut (çoğu İngilizce). Fakat benim deneyimlerimde fark ettiğim şey şu oldu; bu yöntem benim gibi “nasıl çalışıyor anlamaya çalışan” geliştiriciler için her zaman çalışmıyor. Deneme yanılma çoğu zaman daha kalıcı oluyor bende, pahalı bir yöntem olsa da.

Bu diziyi yazma sebebim de biraz bu. Deneme yanılma sonucunda öğrenme pahalı bir süreç, çıktılarını paylaşıp birilerinin yolunu kısaltabilirim düşüncesi. Bir şeyin nasıl yapılamayacağını bilmek bile büyük bir kazanç olabilir. Derdim keşfettiklerimi paylaşmak hem de farklı bir bakış açısıyla konuya yaklaşmak. Şu an zaten ChatGPT’ye “makine öğrenmesi nedir?” diye sorduğunuzda tatmin edici bir cevap alabilirsiniz, hatta eğitmen gibi kullanabilirsiniz. Benim yapmaya çalıştığım ise içerikleri süzmek, notlarımı ve önemli gördüğüm yerlerde en ince ayrıntısına kadar gidebilmek, pragmatik yaklaşıp bazı kavramları yüzeysel geçmek bazılarında ise graphı sonuna kadar takip etmek. Yani biraz debug eder gibi anlama, sistemi parçalara ayırarak kavramak.

Kimler İçin?

Benim gibi:

  • Yazılım geliştirme deneyimi var ama ML konusunda acemi
  • “GPT nasıl çalışıyor?” diye merak eden
  • Salt teoriden çok pratik anlayış arayan
  • Hype’dan sıyrılıp biraz daha teknik detayları öğrenmek isteyen

Nasıl?

Makine öğrenmesi bir çok yazılımcının (seviye fark etmeksizin her yaşta) ilgisini çekse de tüketicisi olarak kalıyoruz. İlgili bir çoğunluk var ama nereden başlayacaklarını da bilemiyorlar. Bu dizinin amacı Türkçede makine öğrenmesi ile ilgili özellikle mevcut geliştiricileri hedefleyen, küçük parçaları soyut olarak anlatıp daha sonra daha somut bir bütüne ilerlemekten ziyade bütünü parçalayarak aslında debug ederek parçaların anlaşılmasını sağlamak. Öncelikle kabaca genel kavramları ve önemli makalelere değinerek daha küçük parçalara ve daha derine inmeyi hedefliyorum. Fakat bunun bir kötü yanı kabaca öğrenilen ile sınırlı kalırsa Dunnig-Kruger ekisini canlı canlı hissedebilirsiniz. Oysa konular fraktal gibi; tüm resmi anladığınızı sandığınızda her zaman daha keşfedilmemiş bir detayı vardır. Öğrenme yönteminizi biliyor olmanız bu yazıların sizin için faydasını arttıracaktır.

Neden Türkçe? Bu yazıların Türkçe hazırlanmış olması İngilizcenin bir gereklilik olduğu gerçeğini değiştirmez. Çeviri araçlarının kolay erişilebilir olması makine çeviri metinlerin sayısını arttırsa da bir kavramın ana dili Türkçe olan birine Türkçe de anlatılması BENCE temeldir. Kavramı anadilde anladıktan sonra implementasyon için İngilizceye devretmek gerekecektir. Genel olarak Can Yücel’in çeviri yöntemi esastır:

Bu adam ne söylemiş, ne yapmak istiyor, hangi olayı durumu kurmak istiyor deyip onun söylediğini yeniden söylerim ben.

Nereye bakıyor bu adamlar?

Makine öğrenmesi artık teorik bir kavram değil her yerde karşılaşıyoruz. Transformer mimarisi (GPT, Llama gibi modellerin temelindeki yapı) 2017’de “Attention Is All You Need” (ileride detaylı değineceğiz) makalesinde çeviri problemi için tanıtıldı. Ama bugün aynı teknoloji kod yazıyor, görsel üretiyor, hatta müzik besteliyebiliyor. Biraz timeline’a bakalım:

2020 Kırılma Noktası: Veri + GPU

Bu sorunun cevabı 2020 civarında yaşanan bir kaç şeye dayanıyor:

Veri patlaması: Yıllarca biriken dijital veriler kritik bir noktaya ulaştı. 2010’larda bir kırılma noktası yaşandı. İnternet kullanıcısı sayısı arttı, akıllı telefonlar yaygınlaştı, sosyal medya platformları milyarlarca içerik üretmeye başladı. Daha önemlisi, bu veriler artık dijital formatta depolanıyor, etiketlenmiş halde yani hangi verinin ne olduğu belli ve erişilebilir halde geldi. Makine öğrenmesi için kritik olan şu: model kalitesi, veri miktarı ile logaritmik olarak artar. 1 milyon örnek ile 1 milyar örnek arasında büyük fark var. 2020’ye gelindiğinde Common Crawl gibi projeler web’in büyük kısmını tarıyor, Wikipedia’nın tamamı, GitHub’daki milyonlarca kod deposu, kitaplar, makaleler v.s. hepsi eğitim verisi olarak kullanılabilir hale gelmişti. Bu veri zenginliği olmadan milyarlarca parametreli modeller anlamsız olurdu.

GPU gücü: Oyunlar için geliştirilen grafik kartları, aslında makine öğrenmesi hesaplamaları için çok elverişli çünkü genelde CPU’lar seri işleme optimize edilmiş <32 çekirdekten oluşuyor, GPU’lar ise paralel işlemede ve binlerce küçük çekirdekten oluşuyor. Makine öğrenmesindeki temel işlem matris çarpımı, yani binlerce sayının aynı anda çarpılıp toplanması. CPU bunu sırayla yaparken, GPU hemen hepsini paralel yapar. Örneğin bir transformer modelinin attention hesaplaması milyonlarca paralel işlem gerektirir. NVIDIA CUDA ile artık geliştiriciler GPU’ları sadece grafik için değil, genel amaçlı hesaplamalar için kolayca(?) kullanabilir hale geldi. Örneğin GPT modellerini CPU’da eğitmek yıllar sürerdi, GPU cluster’da aylar sürdü. Bu hız farkı olmadan büyük dil modelleri imkansızdı.

Yapay sinir ağları 1950’lerden beri biliniyor, ama yeterince büyük ölçekte çalıştırıp sonuçlarını bekleyecek teknoloji ve sabır yoktu. Bu faktörler bir araya geldiğinde, sıradan insanların hayatında hissedilebilir fark yaratan uygulamalar ortaya çıktı. Eskiden sadece araştırma laboratuvarlarında çalışan teknolojiler, günlük yaşamın parçası oldu.

Kış ve Bahar: Yapay Zekanın Dalgalı Tarihi

Peki bu teknoloji bu kadar yeniyse neden “yapay sinir ağları yıllardır var” diyoruz? Çünkü makine öğrenmesi tarihinde birkaç kez “büyük umutlar -> hayal kırıklığı -> unutulma” döngüsü yaşandı. Benzer döngü elektrikli araçlarda da var.

AI Kışı (1987-2000): Bu dönemde “expert systems” popülerdi. Örneğin bakteriyel enfeksiyonları teşhis edip antibiyotik öneren sistem:

diagnose(Patient, meningitis) :-
fever(Patient, high),
neck_stiffness(Patient, yes),
headache(Patient, severe),
csf_analysis(Patient, abnormal).
treat(Patient, penicillin) :-
diagnose(Patient, meningitis),
allergy(Patient, penicillin, no).
% Her durum için yeni kural...
diagnose(Patient, pneumonia) :-
fever(Patient, high),
cough(Patient, productive),
chest_xray(Patient, infiltration).

Problem şuydu: her yeni hastalık için yüzlerce kural yazmanız gerekiyordu. Sistem binlerce kural içerdiğinde çelişkiler çıkarıyor, yeni kural eklemek neredeyse imkansız hale geliyordu. Kural motorları hala kullanılsa da AI penceresinden sonuç büyük hayal kırıklığı ve yatırımların çekilmesine sebep oldu.

Yeniden Doğuş (2010-2017): Bu dönemde üç kritik teknik gelişme yaşandı:

1. Backpropagation’ın yeniden keşfi: 1986’da bulunmuş ama hesaplama gücü yetersizliğinden geri kalmıştı. Bu algoritma, sinir ağlarının hatalarını geriye doğru yayarak ağırlıkları nasıl güncelleyeceğini hesaplamak için kullanılıyor. 2010’larda GPU’larla birlikte derin ağlarda (çoook katman) çalışabilir hale geldi.

2. Activation fonksiyonları: Eski sigmoid fonksiyonlar derin ağlarda “vanishing gradient” problemi yaratıyordu. Alt katmanlara sinyal ulaşmıyordu. ReLU (Rectified Linear Unit) fonksiyonunun yaygınlaşması bu sorunu çözdü:

sigmoid: f(x) = 1/(1+e^-x)
ReLU: f(x) = max(0,x)

3. Dropout ve regularization: Overfitting (ezberleme) problemi için Geoffrey Hinton’ın dropout tekniği eğitim sırasında rastgele nöronları kapatarak modelin genelleme yapmasını sağladı.[https://www.cs.toronto.edu/~hinton/absps/JMLRdropout.pdf]

ImageNet (2012): AlexNet, görüntü tanıma yarışmasında %15 hata oranı yakaladı (geleneksel yöntemler %26). Alex makale başyazarının adında geliyor, diğer yazar da çok tanıdık :) [https://proceedings.neurips.cc/paper_files/paper/2012/file/c399862d3b9d6b76c8436e924a68c45b-Paper.pdf].

Transformers (2017-günümüz): Google’ın “Attention is All You Need” makalesi makine öğrenmesi tarihinin dönüm noktası oldu. [https://arxiv.org/abs/1706.03762] Önceki dil modelleri RNN (Recurrent Neural Networks) kullanıyordu yani kelimeleri sırayla işlemek zorundaydı, tıpkı bir kitabı sayfa sayfa okumak gibi. “Bu film çok güzel, ama sonu berbattı” cümlesinde “berbat” kelimesi “film”e atıfta yapıyor ama aralarında 6 kelime var. RNN bu uzun bağlantıları kurmakta zorlanıyor, hesaplama da seri olduğu için çok yavaş. “Attention” mekanizması ile tüm kelimelerin birbirine olan ilişkisini paralel olarak hesaplıyor. “Berbat” kelimesi aynı anda hem “film”e hem “sonu”na bakabiliyor ve hangisini değerlendirdiğini anlıyor.

API Ekonomisi

Buraya kadar iyiydi ama asıl olay, OpenAI’ın yaptığı hamle oldu: bu devasa modelleri API olarak sunmak.

GPT-2 (2019): İlk “şov”u yaptı. Açık kaynaklı olarak yayınlandı ama çalıştırmak için ciddi teknik bilgi gerekiyordu. GPT-3 (2020): Burada işler değişti. Model açık kaynak değildi ama API’si vardı:

Artık makine öğrenmesi uzmanı olmadan da bu teknolojileri kullanabiliyordunuz. Bu “prompt engineering” kavramını doğurdu yani normal dille programlama. Geliştiriciler, uygulamalarının belirli kısımlarını doğal dil komutlarıyla yapabilir hale geldi ve “openai wrapper” uygulamalar da çıkmaya başladı. Tabii bunun bedeli de vardı: bu modeller OpenAI’ın sunucularında çalışıyor, bizim erişemeyeceğimiz kadar büyük işlem gücü gerektiriyordu.

Artık bundan sonra modeller tabana yayıldı, “lokallerin” yani biz fanilerin kullanabileceği hale geldi. Bu noktadan sonra sadece API çağrıları yetmemeye başladı ve hızlıca gelişen bir ekosistemin içerisinde bulduk kendimizi. Artık dil modelleri olmadan, uygulamalarımızın bir yerinde kurgulamadan bir şey yapamaz hale gelmeye başlıyoruz. Mikroservisler yakında yerlerini agent-servislere bırakacaklar ve geliştiricilerin bu dönüşümü gerçekleştirmesi artık kaçınılmaz. Şİmdi temellerden başlayalım. Embeddings veya gömüler veya gömmeler veya “vektör temsiller” :)


Editleme, düzenleme ve çoğu zaman örnekleri zenginleştirme için dil modellerini (çoğunlukla Claude) kullanıyorum. Claude ile birlikte çalışmak çok zevkli, ama buna rağmen günler sürebiliyor böyle bir yazıyı yazmak.

Kaynaklar

Bu yazıları üretirken destek aldığım kaynaklar aşağıda, faydalanabilirsiniz.

Author

Osman Orhan