Optimizasyon Teknikleri

Gradyan iniş(gradient descent) bir çok makine öğrenmesi algoritmalarının ve yapay sinir ağlarının temelini oluşturmaktadır. Bu yüzden, her ne kadar gradyan iniş algoritmasının daha gelişmiş versiyonları bulunsa da işin temelini ve mantığını oturtmak adına nasıl işlediğine dair bilgi sahibi olmak önemlidir.

Gradyan İniş(Gradient Descent)

Gradyan eğim demektir. Yani gradyan iniş algoritmasının amacı yitim fonksiyonlarımızın eğim değerlerini kullanarak fonksiyonumuzun minimum noktasına inmektir. Bu durumu anlamak adına yitim fonksiyonlarımıza göre daha basit bir fonksiyon olan f(x) = x^4 – 5x^3  + x^2 + 21x – 18 parabolünü inceleyelim. Fonksiyonun grafiğini aşağıda görebilirsiniz.

optimizasyon teknikleri
f(x) = x^4- 5x^3 + x^2 + 21x – 18

Fonksiyonumuzun minimum değeri -32 x = -1 noktasında bulunmaktadır. Amacımız y değerini minimize eden x değerini bulmak. Başlangıç noktası olarak x = -2 noktasını seçelim ve hedefimiz ise -1 noktasına iniş yapabilmek. x = -2 noktasında fonksiyonumuzun değeri 0′ dır.

optimizasyon teknikleri
x = -2

Şimdi fonksiyonumuzun 1. dereceden türevini almalıyız ve sonucumuz f’(x) = 4x^3 – 15x^2 + 2x + 21. x = -2 noktasının türev değeri ise -75 olmaktadır. Bu değerin işareti bize fonksiyondaki artışın yönünü göstermektedir. f’(-2) = -75 ise x = -2 noktasından – yönüne gittikçe fonksiyonumuzda artış gözlemleyeceğiz, + yönüne gittikçe azalış gözlemleyeceğiz. O zaman her zaman eğim değerimizin tam tersi yönünde yol almalıyız, o zaman x değerimizi güncelleyeceğimiz formülümüz aşağıdaki gibi olmaktadır.

optimizasyon teknikleri
X Güncelleme Formülü

Her bir yinelemede(iterasyon) x değerimizi güncellemekteyiz. Formüle göre yeni x değerimizi 73 olarak hesaplıyoruz. Fonksiyonumuzun x = 73 noktasındaki değeri 26 milyon 460 bin gibi büyük bir değer oluyor. Burada yaptığımız hata x = -2 noktasından çok büyük adım atarak x = -1 noktasını ıskaladık ve fonksiyonumuzda daha büyük bir değeri elde ettik.

optimizasyon teknikleri
x = 73

Böyle bir hata yapmak yerin daha küçük ama daha emin adımlar ile hedefimize doğru ilerlemeliyiz. O zaman formülümüzde ufak bir değişikliğe gidiyoruz ve f’(x) değerimize bir öğrenme hızı(learning rate) katsayısı ekliyoruz. Yeni formülümüz aşağıdaki gibi olmaktadır.

optimizasyon teknikleri
Güncellenmiş Formül

Öğrenme hızı değeri yapay sinir ağlarını eğitirken seçmemiz gereken bir parametredir. Biz şimdilik 0.01 olarak seçelim. O zaman -2 noktasına geri dönecek olursak yeni formülümüze göre x değerimizi güncellediğimiz zaman yeni x değerimizi -1.25 olarak hesaplıyoruz. Gördüğünüz gibi x = -1 değerini ıskalamadan daha emin adımlar ile hedefimize ilerliyoruz. f(-1.25) değerimiz yaklaşık olarak -30.48 ve f’(-1.25) = -12.75 olarak hesaplıyoruz.

optimizasyon teknikleri
x = -1.25

Geriye kalan adımları elimiz ile hesaplamak yerine python üzerinde kodlayarak fonksiyonumuzu minimize edelim. Aşağıda kodu inceleyebilirsiniz, farklı başlangıç x değerleri ve farklı öğrenme hızı değerleri ile kendiniz de deneyebilirsiniz. Örnek olarak eğer eğitime x = 6 noktasından başlarsanız x = 3 noktasındaki lokal minimum değerine takılabilirsiniz. Yapay sinir ağlarını eğitirken buradaki gibi lokal minimum noktalarında takılmalar yaşanabilir, ilerleyen yazılarımızda bu gibi durumlarda izlenebilecek çözüm yollarına değineceğiz.

def fonksiyon(x):
    # f(x) = x^4 - 5x^3 + x^2 + 21x - 18
    return pow(x,4) - 5 * pow(x,3) + pow(x,2) + 21*x - 18

def turev(x):
    # f'(x) = 4x^3 - 15x^2 + 2x + 21
    return 4 * pow(x,3) - 15 * pow(x,2) + 2 * x + 21

def guncelle(x,ogrenme_hizi):
    return x - turev(x) * ogrenme_hizi


x = -2

yineleme = 50
ogrenme_hizi = 0.01

print("X baslangic degeri : ", x, ", f({}) : ".format(x), fonksiyon(x))

# 50 iterasyon boyunca x değerimizi güncelliyoruz
for i in range(yineleme):
    x = guncelle(x,ogrenme_hizi)
    
    print(i + 1,". iterasyon sonucu x : ", x, " f({}) : ".format(x), fonksiyon(x))

İşin yapay sinir ağları kısmına gelecek olursak yitim fonksiyonumuzun değeri modelimizin parametrelerine bağlıdır. Bu parametreler nöronların ağırlık değerleri ve eşik değerleridir. Örnek olarak aşağıdaki yapay sinir ağında toplamda 41 adet parametre vardır.

optimizasyon teknikleri
Yapay Sinir Ağı

Yukarıdaki örneğimizde fonksiyonumuz sadece x değişkenine bağlıydı. Bu yüzden 2 boyutta fonksiyonumuzu görselleştirebildik fakat 43 değişkenli yitim fonksiyonumuzu 2 boyutta veya 3 boyutta mükemmel bir şekilde görselleştirebilmemiz imkansızdır. Milyonlarca parametreli modellerin karmaşıklığını artık siz düşünün. Bu noktada ise yitim fonksiyonumuzu minimize eden her bir parametre değerini bulmalıyız. Bu işlem şu an için değinemeyeceğimiz kompleks matematiksel formüller yardımı ile hesaplanmaktadır fakat mantık yine yukarıda verdiğimiz örnek ile aynı işlemektedir. İşin bu kısmında imdadımıza derin öğrenme kütüphaneleri yetişiyor ve modelimizin optimizasyon kısmını arka planda hallediyor.

Gradyan iniş algoritmasında, eğitim veri seti üzerindeki her bir örnek için işlenip modelin yitim değeri hesaplandıktan sonra optimizasyon yapılır. Bu işlemin bazı dezavantajları vardır. Bu dezavantajlar: büyük veri setlerinde çok yavaş çalışması ve fazla hafıza gereksinimidir. Gradyan iniş algoritmasına ek olarak rastgele gradyan iniş(stochastic gradient descent) ve parçalı gradyan iniş(mini-batch gradient descent) algoritmaları da mevcuttur.

Rastgele Gradyan İniş(Stochastic Gradient Descent)

Rastgele gradyan iniş algoritmasında her bir yineleme içerisinde rastgele bir örnek seçilir, yitim değeri hesaplanır ve optimizasyon yapılır. Eğitim kümesindeki her bir örnek için bu işlemler yapıldıktan sonra bir sonraki yinelemeye geçilir. Bu işlemin avantajı parametrelerdeki güncellemeler daha sık yapıldığı için model minimum noktaya daha hızlı yaklaşabilir ve her seferinde bir örneği işlediğimiz için daha az hafıza gerektirir. Dezavantajları ise yitim değerinde minimuma ulaştıktan sonra bile parametreleri güncelleyip minimum değerden uzaklaşabilir ve eğitim sürecinde öğrenme hızını kademeli olarak ayarlamamız gerekir.

Parçalı Gradyan İniş(Mini-batch Gradient Descent)

Diğer iki gradyan iniş türüne göre en çok tercih edilenidir. Bu algoritmada eğitim kümesi belirli parçalara bölünür. Örnek olarak 128 adet örneği bulunan bir eğitim kümesi 16’ lık 8 adet parçaya bölünebilir. Her bir parça için modelin yitim değeri hesaplandıktan optimizasyon işlemi gerçekleştirilir. Eğitimden önce parça sayısına kara vermemiz gerekir. Genellikle 2’ nin katları tercih edilir 2,4,8,16,32,64 olacak şekilde.

Son olarak aşağıda bu üç tekniğin minimuma inişini karşılaştırabilirsiniz. Bu grafiği kafanızda bir dağın tepesinden aşağıya iniş olarak canlandırabilirsiniz. Gradyan inişte güncellemeler daha az yapıldığı için inerken adım sayısı az fakat büyük adımlar ile iniyoruz ve genellikle hedefte sapmalar olmuyor ama daha yavaş ilerliyoruz. Rastgele gradyan inişte ise hızlı bir şekilde, küçük ama sık adımlar ile iniyoruz fakat bazen hedeften şaşmalar olabiliyor. Paraçalı gradyan inişi ise diğer iki algoritmanın ortası olarak düşünebiliriz. Orta adım sıklığında, orta adım büyüklüğünde ve orta bir hızda ilerliyoruz.    

optimizasyon teknikleri
Karşılaştırma