Jump to content
  • entries
    55
  • comments
    2
  • views
    281

Gradyan İnişi Algoritması Nedir?


Doğuhan ELMA

89 views

Gradyan inişi algoritmasının çalışma prensibi oldukça basittir. Türevler veya gradyanlar, bir fonksiyonun belirli bir noktadaki eğimini temsil eder. Eğer bir fonksiyonun türevini alırsak ve bu türev pozitif bir değerse, bu fonksiyonun o noktada arttığını biliriz. Eğer türev negatif bir değerse, fonksiyonun azaldığını biliriz.

Bu bilgi, fonksiyonun minimum veya maksimum değerlerini bulmak için kullanılabilir. Bir fonksiyonun minimum değerini bulmak istiyorsak, türevin negatif yönünde bir adım atarız. Çünkü türevin negatif yönü, fonksiyonun azalmaya başladığı yönü gösterir.

Öte yandan, bir fonksiyonun maksimum değerini bulmak istiyorsak, türevin pozitif yönünde bir adım atarız. Çünkü türevin pozitif yönü, fonksiyonun artmaya başladığı yönü gösterir.

def f(x):
    return x**2 + x + 2

def df(x):
    return 2*x + 1

def gradient_descent(initial_x, learning_rate, epochs):
    x = initial_x
    for i in range(epochs):
        grad = df(x)
        x = x - learning_rate * grad
        print(f"At iteration {i+1}, x = {x}, f(x) = {f(x)}")
    return x
minimum = gradient_descent(10, 0.1, 50)
print(f"The minimum value of the function is at x = {minimum}")

Gradyan inişi algoritması, belirli bir başlangıç noktasından başlar ve her adımda fonksiyonun türevini hesaplar. Ardından bu türevin negatif yönünde, yani fonksiyonun azalmaya başladığı yönünde, bir adım atar. Bu adımın büyüklüğü genellikle öğrenme hızı adı verilen bir parametre ile kontrol edilir. Daha büyük bir öğrenme hızı, daha büyük adımlar atar ve algoritma daha hızlı ilerler. Ancak, öğrenme hızı çok büyükse, algoritma minimum değeri "geçebilir" ve asla tam olarak converging, yani yakınsamayabilir.

Bu süreç, belirli bir durdurma kriteri karşılanana kadar (genellikle belirli bir sayıda adım sonra) tekrarlanır. Sonuç olarak, algoritma, fonksiyonun minimum değerine yakın bir nokta bulmaya çalışır.

Bu yaklaşım genellikle derin öğrenme ve makine öğrenmesi gibi alanlarda kullanılır, çünkü bu alanlardaki birçok problem, belirli bir hedef fonksiyonunu minimize etmeyi içerir. Örneğin, bir sinir ağı eğitirken, genellikle hedef fonksiyonunu (genellikle bir "kayıp" veya "maliyet" fonksiyonu olarak adlandırılır) minimize etmeye çalışırız, bu da modelin tahminlerinin gerçek değerlere ne kadar yakın olduğunu ölçer.

Bir fonksiyonun en aza indirgenmesi (minimize edilmesi) genellikle optimizasyon problemlarında karşımıza çıkar. Bu tür problemlarda, belirli bir hedef fonksiyonunu (genellikle bir maliyet veya kayıp fonksiyonu olarak adlandırılır) en aza indirgemek isteriz.

Python, belirli bir fonksiyonu minimize etmek için scipy.optimize modülünde bir dizi farklı algoritma sunar. Bu algoritmalar genellikle Newton metodu, BFGS, Nelder-Mead, Powel, CG, TNC, COBYLA, SLSQP vb. gibi optimizasyon algoritmalarını içerir. Bu yöntemlerin her biri farklı türde problemlar için uygundur ve belirli avantaj ve dezavantajlara sahiptir.

En basit örnekle başlayalım: Bir fonksiyonun minimizasyonunu hesaplamak için en basit yöntem 'brute force' yöntemidir. Bu yöntemde, fonksiyonu belirli bir aralıkta ve belirli bir adımda değerlendiririz ve en düşük değeri bulmaya çalışırız. Ancak bu yöntem çok verimsizdir ve genellikle pratikte kullanılmaz.

Daha verimli bir yöntem, gradyan inişi algoritmasıdır. Bu algoritma, fonksiyonun türevini (veya gradyanını) hesaplar ve bu türevin negatif yönünde adımlar atar. Bu, fonksiyonun en hızlı azaldığı yönü bulmamıza yardımcı olur. Gradyan inişi, özellikle makine öğrenmesi ve derin öğrenme gibi alanlarda çok yaygın olarak kullanılır.

Örneğin, scipy kütüphanesindeki minimize fonksiyonunu kullanarak bir fonksiyonun minimumunu bulabiliriz.

from scipy.optimize import minimize

# Hedef fonksiyonumuz
def func(x):
    return x**2 + x + 2

# Başlangıç tahmini
x0 = 0

# Fonksiyonun minimumunu bul
result = minimize(func, x0)

print(result.x)

Bu kod, bir fonksiyonu minimize eder. Fonksiyon, func adlı bir Python fonksiyonu olarak tanımlanır ve minimize fonksiyonuna argüman olarak verilir. Ayrıca bir başlangıç tahmini x0 da verilir. minimize fonksiyonu, fonksiyonun minimumunu bulmak için bir optimizasyon algoritması çalıştırır.

Çıktı, bulunan minimum değeri ve diğer bazı bilgileri içeren bir OptimizeResult nesnesidir. result.x, bulunan minimum noktasını verir.

Bu örnekte, hedef fonksiyonumuz x**2 + x + 2 idi ve minimize fonksiyonu, bu fonksiyonun minimumunu bulmak için bir optimizasyon algoritması çalıştırdı.

Unutmayın, bazı optimizasyon algoritmaları yerel minimumlara takılabilirler, yani bu algoritmalar her zaman global minimumu bulmayabilirler. Bu, başlangıç tahminine ve kullanılan optimizasyon algoritmasına bağlıdır. İkinci derece bir polinom olan örneğimizde bu problem yaşanmaz çünkü bu tür fonksiyonların yalnızca tek bir minimumu vardır. Ancak daha karmaşık fonksiyonlarda, global minimumu bulmak daha zor olabilir.

 

Performans Değerlendirmesi:

Gradyan inişi ve `scipy.optimize.minimize` fonksiyonu arasındaki performans karşılaştırması genellikle problemin türüne, seçilen algoritmanın uygulanabilirliğine ve başlangıç tahminlerine bağlıdır.

Gradyan inişi yöntemi, genellikle makine öğrenmesi ve derin öğrenme gibi büyük veri setleri üzerinde çalışan ve fonksiyonun türevini (veya gradyanını) hesaplama yeteneğine sahip olan problemlar için kullanılır. Gradyan inişi, her adımda tüm veri setine bakmak yerine, rastgele seçilen alt kümeler (mini-batch) üzerinde çalışabilen stokastik gradyan inişi (SGD) veya mini-batch gradyan inişi gibi varyasyonlara da sahiptir. Bu, büyük veri setleri için oldukça yararlıdır.

Diğer taraftan, `scipy.optimize.minimize` genellikle küçük ölçekli optimizasyon problemları için kullanılır ve birçok farklı türde optimizasyon algoritması sunar (Nelder-Mead, BFGS, CG, L-BFGS-B, TNC, COBYLA ve SLSQP dahil). Bu algoritmalar genellikle daha sofistikedir ve karmaşık veya kısıtlı optimizasyon problemlarında daha iyi performans gösterir. Ancak, bu algoritmalar genellikle tüm veri setine aynı anda bakmayı gerektirir, bu da çok büyük veri setleri için pratik olmayabilir.

Genellikle, hangi yöntemin daha iyi performans göstereceğini belirlemek için denemeler yapmak ve hangi yöntemin belirli bir problem için daha uygun olduğunu görmek gerekir. Ayrıca, bu yöntemlerin her birinin belirli hiperparametreleri (örneğin, öğrenme oranı veya adım boyutu) vardır ve bu hiperparametrelerin ayarlanması da performansı etkiler.

 

 

0 Comments


Recommended Comments

There are no comments to display.

Guest
Add a comment...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...