Derin Öğrenme — Giriş

Engin UNAL
9 min readJun 1, 2020
kaynak:r3

Derin Öğrenme, Makine Öğrenmesi(Machine Learning) konusundaki en popüler başlıktır. Oldukça kapsamlı ve alt dalları çeşitli olan Derin Öğrenme konusuna bu yazıda giriş yapacak genel bilgi vermeye çalışacak ve örneklerle yazıyı tamamlamaya çalışacağım.

Makine Öğrenmesi konusunda fikri olanların okumadan geçmesini önerdiğim aşağıdaki giriş sonrasında Derin Öğrenme konusuna giriş yapılacaktır.

Geleneksel programlama yaklaşımında makinelere çözmesi istenen problem için birtakım girdiler verilir ve çıktı olarak problemin çözümü beklenir. Bilgisayara verdiğimiz girdiler, kurallar ve veri seti olarak iki gruba ayrılabilir. Kurallar, programlama diliyle yazılmış algoritmalar ve prosedürlerdir. Makine bunlara göre kendisine verilen veri setini de kullanarak çıktı üretir. Beklenen çıktı ise problemin çözümü yani yanıttır.

Makine öğrenmesinde ise bu paradigmada kökten değişiklik olmuştur. Problemlerin çözümünün farklı bir yaklaşımla ele alınmasına neden olan bu değişiklik neticesinde yeni imkanlar ve çözüm yolları ortaya çıkmıştır.

Geleneksel yaklaşımı yukarıda özetlemeye çalıştım. Makine öğrenmesinde ise makineye veri seti ve çıkabilecek sonuçlar verilir. Makinenin bunları kullanıp kuralı oluşturması yani modellemesi beklenir.

Makinenin veri seti üzerinde çalışma işlemine eğitim, eğitim sonucu elde ettiği matematiksel kuralları içeren yapıya model denir.

Örneğin verilen sayıları ikiyle çarpacak bir program geliştirmek isteyelim. Makineye bunu yaptırmak için öncelikle algoritmayı kodlamalıyız. Örnekte bunu fonksiyon içerisinde yapacağız ve girdi olarak çarpılması istenen sayıyı alacak ve çarpımı dönecek. Örnek kodlaması:

def ikiyleCarp(x):
R = x * 2
return R

Buradaki ikiyleCarp fonksiyonu içerisinde kural kodlanmıştır buna göre girdi verisi olarak x alır, ve R yanıtını döner.

x: 1, 2, 3, 4

R: 2, 4, 6, 8

Bu işlemi Makine Öğrenmesi ile yaptırmak istediğimizde, x verisini ve R sonuçlarını makineye vererek kuralların tanımlandığı ikiyleCarp fonksiyonunun modelinin makine tarafından bulunmasını bekleriz.

Girdi ve çıktı arasındaki bağlantıyı bulmak için makine öğrenme algoritmaları her girdi-çıktı değerini işler ve bunlar arasındaki ilişkiyi modellemeye çalışır. Eğitim sürecinde doğru modeli kurabilmesi için yeterli veri seti olmalıdır. Eğitim sonrasında oluşturulan model, daha önce algoritmaya verilmemiş yeni verilerle test edilir.

Makine öğrenmesinde makineye veri seti ve sonuçları veriyor sonrasında kuralları içeren modeli alıyorduk. Bu yaklaşım üç alt gruba ayrılmaktadır.

Supervised Learning(Denetimli Öğrenme): Veri ve sonuçlar birlikte verilir. Öğrenme sürecinde makine, veri ve sonuçlar arasındaki ilişkiyi matematiksel olarak kurar ve modeli üretir. Buradaki sonuç kelimesi yerine etiket(label) kelimesi de kullanılabilir.

Unsupervised Learning(Denetimsiz Öğrenme): Makineye veri seti verilir ve bu verinin kendi içindeki gruplamasını diğer ifadeyle aralarındaki bağlantıları bulmasını bekleriz. Makineye etiketlenmiş veri seti verilmez.

Reinforcement Learning(Takviyeli Öğrenme): Makineye etiketsiz veriler verilirken sonuca ulaşması için ürettiği her doğru çözüme ödül verilir. Böylece hep ödül alarak çözüm üretmesi sağlanır ve sürekli iyileştirme prensibiyle modeli geliştirmesi istenir.

Toparlarsak, makine öğrenmesi öncesinde geleneksel programlamada makineler kural+veri alır ve sonuç üretirken makine öğrenmesi ile bu paradigmadan farklı olarak yeni yaklaşımlar gündeme gelmiştir. Buna göre veri setinden kuralların keşfedildiği yeni paradigmalar kullanılmaya başlanmıştır. Daha önceden çözme imkanımız olmayan bazı problemlere çözüm üretmemize veya çok emek harcayarak çözebildiğimiz problemleri çok kısa sürede çözebilmemize imkan tanımıştır.

Çok temel olarak özetlemeye çalıştığım genel makine öğrenmesi girişinden sonra yazının asıl konusu olan Deep Learning konusuna geçelim.

Derin Öğrenme — Deep Learning

Yapay Sinir Ağları(Artificial Neural Network) konusunun gündeme gelmesiyle çok katmanlı mimariler geliştirilmiş ve devamında Deep Neural Network veya Deep Learning pek çok alanda yaygın olarak kullanılmaya başlanan bir teknoloji olmuştur. Derin öğrenmedeki derin kelimesi çok katmanlı nöron ağı olması nedeniyle verilmiştir. Temel bilgilerle başlayalım.

Derin Öğrenme ağına genel bakış. Kaynak:r1

Yapay sinir ağları temel olarak katmanlar halinde organize edilmiş nöron grubu olarak görülebilir. Nöronlar karar verici yapılardır. Nöron, aldığı girdiyi bir takım matematiksel işlemlerden geçirir ve sonucu bağlantılı sonraki nörona aktarır. Nöron nasıl çalışır? Kısaca inceleyelim.

Bir nöronun yapısı.

Nöronun görevi ona verilen girdiyi almak, işlemek ve çıktı üretmektir. Nöron, ona verilen girdiyi(input), ağırlık(weight) değişkeniyle çarpar ve sapma değişkeni(bias) ile toplayarak bir sonuç üretir. Sonra bu sonucu aktivasyon fonksiyonundan(activation function) geçirerek çıktı üretir. Nöronun görevi burada biter. Üretilen çıktı bağlantılı nörona aktarılır ve katmanlar içinde böylece devam eder. Öğrenme işlemi weight ve bias değişkenlerinin algoritma tarafından sürekli ayarlanması süreciyle gerçekleşir.

Input, Weight, Bias ve Activation Function

Weight, bias ve aktivasyon fonksiyonu arasında nasıl bir bağlantı var? Bunlar ne işe yarıyor? Aktivasyon fonksiyonu, bir nöronun çıktısını belirleyen matematiksel bir denklemdir. Nöronun weight*input+bias toplamları sonucu aktivasyon fonksiyonundan geçirilip nihai sonuç elde edilir.

y = activation(∑(weight * input) + bias)

Bu işlemi neden yapıyoruz? Bunun nedeni doğrusallıktan kaçıp sonucumuzun non-linear yani doğrusal olmayan bir yapıda olmasını sağlamak. Eğer lineer bir çıktımız olsaydı yani üssel olarak tek dereceli bir polinomumuz olsaydı lineer regresyon gibi doğrusal bir denklemimiz olurdu ve karmaşık öğrenme işlemlerini bu denklemle gerçekleştiremezdik.

Sonuç olarak aktivasyon fonksiyonu, karmaşık yani doğrusal olmayan paternlerin öğrenilmesinde önemlidir. Bu fonksiyonlara bir kaç örnek Sigmoid, ReLU ve türevleri, tanh, swish, softmax olarak sıralanabilir.

Örnek olarak Sigmoid, TanH ve ReLU aktivasyon fonksiyonları. Kaynak: r2

Aktivasyon fonksiyonunu ve bias alakasını anlamak için aşağıdaki örnekle devam edelim.

Diyelim ki kullandığımız aktivasyon fonksiyonu çıktıları 0–1 aralığında olsun. Ve bir nöronun aktive olmasını(fire) istemiyoruz. Nöronun input ve weight çarpımını içeren denklemimizin sonucu ise 1'den büyük çıkıyor.

(x1.w1 + x2.w2 + x3.w3) > 1

Bu şekilde nöron aktive olmaya devam edecek ve istediğimiz sonuca ulaşamayacağız. Eğer denkleme, sonucu etkileyecek bir değişken eklersek istediğimiz ayarı yapabiliriz. Başka bir ifadeyle aktivasyon fonksiyonunu grafik üzerinde sağa veya sola taşımaya yarar. Bu değere bias denir.

(x1.w1 + x2.w2 + x3.w3) + b < 0

Doğru weight ve bias değerlerinin algoritma tarafından bulunması sürecine yapay sinir ağlarında öğrenme denir, weight ve bias ise algoritma tarafından kontrol edilen değişkenlerdir.

Input Layer, Hidden Layer, Output Layer

Yapay sinir ağlarının birbirine bağlı nöronlardan oluştuğunu ve bir katman mimarisine sahip olduğundan bahsetmiştim. Ağdaki ilk katman girdi katmanı(input layer), son katman ise çıktı katmanıdır(output layer). Aradaki katmanlara gizli katman(hidden layer) denir. Her nöron sonraki katmandaki nöronlarla bağlantı halindedir.

Input layer sadece girdi verilerini alarak işlemden geçirmeden yani weight ve bias işlemleri olmadan sonraki katmana aktarır. Hidden layer, girdi olarak bir önceki katmandaki nöron çıktılarını alır, işlemleri uygular ve sonucu sonraki katmana aktarır. Output layer ağdaki son katmandır. Son gizli katmandaki sonuçları girdi olarak alır, istenen sayıda ve aralıkta sonuçlar üretir ve işlem burada sonlanır.

Buraya kadar özet olarak yapay sinir ağı, katmanlar halinde organize edilmiş nöron grubudur. Her nöron aldığı girdiyi ağırlıklarla çarpar daha sonra hesapladığı toplamı aktivasyon fonksiyonu aracılığıyla diğer nöronlara iletir. Öğrenme işlemi, weight ve bias değişkenlerinin elde edilen sonuçlara göre yeniden hesaplanıp ayarlanması ile gerçekleşir.

Şimdi öğrenmenin derinleştiği nokta olan weight ve bias nasıl yeniden hesaplanır ve neden güncellenir ona bakalım. Aşağıda anlatacağım işlemler supervised deep learning özelinde düşünülerek anlatılmıştır. Kullanılan algoritmalara göre bazı adımlar farklılık gösterebilir. Daha net anlaşılması açısından supervised learning kullanmayı faydalı bulmaktayım.

Forwardpropagation ve Backpropagation

Nöronlar ve katmanlardan bahsetmiştim. Nöronlar aldıkları girdiyi ağırlıkla çarpıp, aktivasyondan geçirip bağlantıda oldukları bir sonraki nöronlara aktarıyorlardı.

Görüldüğü üzere burada ileri doğru bir yayılma var. Katmandaki nöronların grafiğini hatırlarsak soldan sağa bir ilerleme sözkonusu. Bu işlem son katmana kadar devam eder. Soldan sağa yani ileri(forward) doğru olan bu yayılım(propagation) işlemine forwardpropagation denir. Yani özetle tüm nöronlar yukarıda anlattığım işleri yapıp sonucu bir sonraki bağlantıdaki nörona aktarana ve böylece son katmana varana kadar devam eder ve orada sonlanır. Son katman olan output layer’da ise önceki katmandaki nöronlardan alınan sonuçlar nihai sonuça çevrilir ve tahmin olarak nitelendirebileceğimiz sonuç üretilir.

Eğer tahmin değeri beklenen değerden farklı ise öğrenme istenen seviyeye ulaşamamış demektir. Bunu düzeltmek için son gizli katmandan geriye doğru tüm weight ve bias değişkenleri yeniden düzenlenip ilk katmana kadar(chain rule tabanlıdır) işlenir buna da geriyayılım yani backpropagation denir.

Loss Function Ve Optimizer

Sistem, yaptığı tahminleri için hata kontrolü yapar ve hatayı sürekli olarak minimize etmeye çalışır. Bunun için hatayı hesaplayıp(loss function) beklenen sonuca yakınsamaya(optimizer kullanır) yani hatayı azaltmaya çalışır. Loss function ile hata hesaplanırken optimizer(örneğin: gradient descent) ile en düşük hata alınacak ihtimaller bulunulmaya çalışılır.

Grafikte yeşil noktalar tahmin edilen değerler, çizgi ise beklenen değerler.
İki parametreli bir örnekte Loss Function gösterimi.

Çözülmesi istenen probleme ve eldeki veriye göre kullanılacak Loss Function’lar da farklılık gösterebilir. Derin öğrenmede kullanılan bazı Loss Function’lara örnekler :

Mean Squared Error (MSE) : Regresyon problemleri için kullanılmakta. Eğer sürekli sayısal bir değer tahmini yapılacaksa kullanılabilir. Tahmin edilen ve gerçek değerler arasındaki kare farkı ortalaması alınarak hesaplanır.

Mean Squared Logarithmic Error Loss : Regresyon problemlerinde kullanılır. Eğer beklenen değerler büyükse genelde bu tip durumlarda kullanılır. Tahmin değerlerinin logaritmasını hesaplanır, ardından MSE hesaplanır.

Mean Absolute Error(MAE) : Regresyon problemlerinde kullanılır. Aykırı değerlere(outlier) karşı daha esnektir. Gerçek ve tahmin edilen değerler arasındaki mutlak farkın ortalaması alınarak hesaplanır.

Cross-Entropy Loss Function : Sınıflandırma problemlerinde kullanılır. Eğer activation function olarak Softmax kullanılıyorsa genelde bu kullanılır.

Mean Absolute Percentage Error (MAPE) : Genelde eğitim süresi boyunca ağın performansını gözlemlemek için kullanılır.

Hatanın hesaplanması yukarıda özetlemeye çalıştığım gibi yapılan tahmin ile olması beklenen arasındaki farkın hesaplandığı fonksiyonlar aracılığı ile yapılır. Loss function ile hesaplanan değerler arasında en az hatanın olduğu değerlere nasıl ulaşılıyor şimdi ona bakalım. Yukarıdaki grafikte bir konveks fonksiyonu bulunmakta bu fonksiyonu loss function olarak düşünürsek bunun en az hata içeren bölgesi doğal olarak en aşağısı olacaktır. Buradaki amaç hatanın en düşük olduğu bölgeye ulaşmaktır. Matematiksel olarak buraya ulaşmak için bazı yöntemler vardır. Hatanın minimize edilmesi için kullanılan bu fonksiyonlara optimizer denir. Bunlardan en bilinenleri; SGD, RMSprop, Adam, Adadelta, Adagrad, Adamax, Nadam ve Ftrl olarak örneklenebilir. Optimizer konusunda detay için Keras dokümanı incelebilir.

Hatanın yani loss function’ın minimumu çizdiği bölgeye ulaşmak için optimizer kullanılmakta. Optimizer bunu nasıl yapıyor anlamak için işin çekirdeğini oluşturan Gradient Descent incelenmelidir.

Üç boyutlu bu grafiği düşündüğümüzde dip noktasına yani minimum noktasına en hızlı ulaşmak için yukarısından bırakılan bir topun yuvarlanması gibi yol izlemek gerekir.

Matematiksel olarak bunu yapabilmek için bir noktadan başlayıp eğimi hesaplayıp aşağı doğru devam ederek bu işlemleri lokal minimum noktasına varana kadar tekrarlamak gerekir.

Bir eğri üzerinde bulunduğunuz noktada eğimi hesapladığınızda(türev alarak) eğim negatif ise sonraki adımda pozitif ilerleme sizi eğride daha aşağıya götürecektir, eğim pozitif ise sonraki adımda negatif ilerleme aşağıya götürecektir. Yani bulunulan noktanın eğimi hesaplanıp -1 ile işlem yapıldığında sonraki adımda daha aşağıya gidebilirsiniz. Gradient Descent temel olarak bu işlemi yapmaktadır.

Stochastic Gradient Descent (SGD), yukarıda anlattığım şekilde çalışır, tüm örnekler üzerinden gradient hesaplamaları yapar bu nedenle diğerlerinden yavaştır. Mini-Batch Gradient Descent, örnekleri tek tek işleme almak yerine gruplar halinde işler, daha hızlıdır. Momentum, yukarıda anlattığım gibi bir topun aşağıya yuvarlanması gibi çalışır eğim arttıkça alınan yol artar, bu nedenle sonuca ulaşmada daha hızlıdır.

Optimizasyon algoritmaları konusunda detaya girmeden biraz daha bilgi verip yazıyı sonlandıracağım. Optimizasyon işlemlerindeki temel mantığı yukarıda vermiştim. Buna ek olarak optimizasyonda öğrenme katsayısı(learning rate veya alpha) da önemlidir. Dip noktasını ararken öğrenme katsayısı kadar ileri veya geri hareket edilir. Bu katsayı büyükse dibi sürekli ıskalayabiliriz veya katsayı küçükse de işlemin uzun süremesi ve performansı azaltıcı etkisi olur. Buna çözüm olarak bazı algoritmalar adaptif öğrenme katsayısı kullanırlar. Bu katsayı algoritma çalışırken belirlenerek hem performansta artış hem de minimum noktasına ulaşmada avantajlar sağlar.

Örneğin Stochastic Gradient Descent(SGD) weight güncellemeleri için tek bir öğrenme katsayısı kullanır ve eğitim sırasında bu oran değişmez. Adaptif öğrenme katsayılarını kullanan algoritmalar ise Adaptive Gradient Algorithm(AdaGrad), ADADELTA, Root Mean Square Propagation(RMSProp), Adaptive Moment Estimation (ADAM) olarak verilebilir. Deep Learning problemlerinde sık kullanılan ADAM algoritması, AdaGrad ve RMSProp algoritmalarının avantajlarını birleştirerek daha verimli ve hızlı sonuca ulaşma konusunda başarı sağlamıştır.

MNIST veri seti için optimizasyon algoritma karşılaştırmaları. kaynak:r4

Umarım bu yazıda paylaştığım bilgiler faydalı olmuştur. Okuduğunuz için teşekkürler.

--

--