Optimizasyon Teknikleri
Türev Tabanlı Tekniklere Derinlemesine Bakış
Gradient Descent
Gradient descent parametlerin maliyet fonksiyonun türevi ile güncellenmesi ile minimum bulunmasını amaçlayan optimizsasyon methodur.matematiksel tanımı Burada:
- : parametre vektörü
- : öğrenme oranı (learning rate)
- : gradyan vektörü
Adım adım bur süreci anlatmamız gerekeirse:
1-) Her parametre için Kayıp Fonksiyonun (loss function) türevini al.
2-) Parametreler için rastgele değerler topla ve toplanan değerleri parametrelere gönder.
3-)Adım büyüklüğü (step size) hesapla.
4-) Yeni parametreyi hesapla.
5-) Minimum seviyeye ulaşasıya kadar 2. adıma dön.
Steepest descent, genellikle, öğrenme oranı 'nın her adımda negatif gradyan yönünde maksimum kazanç sağlayacak şekilde seçildiği gradient descent türü olarak tanımlanır. Bu 'nın (adım büyüklüğünün) her iterasyonda nasıl belirleneceğini araştıran kısma line search denir.
Steepest Descent
- Gradient descent yalnızca negatif gradyan yönünde bir azalma sağlar.
- Steepest gradient descent ise, fonksiyonun en büyük yönlü türevine göre azalma yapar.
En dik iniş yöntemi, bir fonksiyonun minimumunu bulmak için kullanılan iteratif bir optimizasyon algoritmasıdır. Her adımda fonksiyonun gradyanının tersi yönünde ilerleyerek minimuma doğru hareket edilir.
Adım Büyüklüğü ()
Yeni noktaya hangi büyüklükte adım atılacağını belirler:
Burada , genellikle çözülerek hesaplanır.
Diyelim ki bir tepenin eteklerindeyiz ve ne kadar ilerlememiz gerektigini hesaplalmız gerekiyorTepedeki eğim sana hangi yöne gitmen gerektiğini söyler (gradient yönü).Ama ne kadar uzağa gitmen gerektiğini seçmek için, adımını büyütüp küçülttüğünde yolda ne kadar aşağı indiğine bakarsın.En çok aşağı indiğin adım uzunluğunda durursun.Matematikte bu, fonksiyonun adım uzunluğuna göre türevini alıp sıfıra eşitlemekle aynı şeydir.
Örnek 1:
- Eğer minimum noktanın olduğu biliniyorsa:
Yine başlangıçtan bağımsız olarak tek adımda minimuma ulaşılır.
Örnek 1: 2 boyutlu —
- Gradyan:
- Arama yönü:
- Line search sonucunda optimal :
- İterasyon:
Aradaki farkı görmek python
import numpy as np
import matplotlib.pyplot as plt
# Fonksiyon ve gradient
def f(x):
return (x[0] - 3)**2 + (x[1] + 1)**2
def grad_f(x):
return np.array([2*(x[0] - 3), 2*(x[1] + 1)])
# Gradient descent sabit adımla
def gradient_descent_step(x, eta):
return x - eta * grad_f(x)
# Steepest descent line search ile
def steepest_descent_step(x):
d = -grad_f(x)
# line search: burada minimize edilecek fonksiyon
phi = lambda alpha: f(x + alpha * d)
# çok kaba bir search
alphas = np.linspace(0, 1, 100)
phi_values = [phi(a) for a in alphas]
best_alpha = alphas[np.argmin(phi_values)]
return x + best_alpha * d
# Başlangıç noktası
x0 = np.array([0.0, 0.0])
# İterasyonlar
steps = 20
eta = 0.1
gd_points = [x0]
sd_points = [x0]
x_gd = x0.copy()
x_sd = x0.copy()
for i in range(steps):
x_gd = gradient_descent_step(x_gd, eta)
x_sd = steepest_descent_step(x_sd)
gd_points.append(x_gd)
sd_points.append(x_sd)
gd_points = np.array(gd_points)
sd_points = np.array(sd_points)
# Plot
plt.figure(figsize=(8,6))
X, Y = np.meshgrid(np.linspace(-1,5,100), np.linspace(-3,2,100))
Z = (X - 3)**2 + (Y + 1)**2
plt.contour(X, Y, Z, levels=30)
plt.plot(gd_points[:,0], gd_points[:,1], 'o-', label='Gradient Descent (sabit adım)')
plt.plot(sd_points[:,0], sd_points[:,1], 's-', label='Steepest Descent (line search)')
plt.plot(3, -1, 'rx', markersize=12, label='Minimum')
plt.legend()
plt.title('Gradient Descent vs Steepest Descent')
plt.xlabel('x')
plt.ylabel('y')
plt.grid(True)
plt.show()
Lineer Yaklaşım (Linear Approximation)
Bir fonksiyonu belirli bir noktada doğrusal kabul ederek, değerini yaklaşık hesaplamaya çalışır. Bu, birinci dereceden Taylor açılımına dayanır:
Örnek 1:
- , ,
- Yaklaşım:
Örnek 2:
- 1'e yakınsa:
- 2'ye yakınsa:
Daha iyi yaklaşım için Taylor serisi
Daha yüksek dereceden serilerle daha doğru sonuçlar elde edilir:
Newton-Raphson Metodu
Bir fonksiyonun köklerini () veya ekstremumlarını () bulmak için kullanılan iteratif bir yöntemdir.
1. Dereceden (Kök Bulma)
- Örnek: bulmak için
ile başlayınca birkaç adımda .
2. Dereceden (Minimum/Maksimum Bulma)
Karşılaştırma
Özellik | Gradient Descent | Newton-Raphson |
---|---|---|
Adım Büyüklüğü | Belirlenir () | Yok (otomatik) |
Hesaplama | Daha az türev | Daha fazla türev |
Yakınsama | Genelde yavaş | Genelde hızlı |
Risk | Daha stabil | Döngü (cycle) riski |
Örneğin, için yanlış başlangıç noktaları yöntemin döngüye girmesine yol açabilir.
Tabii! İşte o yazının sonuna, adım adım çalışma açıklamasını eklenmiş hali:
Levenberg-Marquardt (LM) algoritması
Levenberg-Marquardt algoritması, doğrusal olmayan problemlerin karesal hata formülleri ile optimizasyonu için kullanılır.
Gradient descent ile Gauss-Newton yönteminin bir kombinasyonu gibidir.
⚙ Algoritmanın Çekirdeği
Her iterasyonda için şu lineer sistem çözülür:
- : Jacobian matrisi ()
- : damping parametresi
- : birim matris
Yeni parametre:
⚖ Gauss-Newton & Gradient Descent Köprüsü
- Küçük → Gauss-Newton gibi davranır (hızlı, ama kararsız olabilir).
- Büyük → gradient descent gibi davranır (daha yavaş, ama daha güvenli).
🔄 Adaptif
- Eğer adım başarılı (yani hata azalıyor) ise küçültülür → Gauss-Newton’a yaklaşır.
- Eğer adım başarısız (hata artıyor) ise büyütülür → gradient descent’e yaklaşır.
🚀 Algoritmanın Adım Adım İşleyişi
-
Başlangıç
- Başlangıç parametresi ve damping katsayısı seçilir.
- Bir büyütme oranı (ör. 10) belirlenir.
-
Her iterasyonda:
-
Residual vektörü ve Jacobian hesaplanır:
-
Lineer sistem çözülür:
-
Yeni parametre adayı hesaplanır:
-
-
Hata kontrol edilir:
-
Yeni hata hesaplanır.
-
Eğer :
- güncellenir:
- azaltılır:
-
Aksi halde:
- Adım reddedilir (eski korunur)
- artırılır:
-
-
Yakınsama kontrol edilir:
- çok küçükse veya hata yeterince azalmışsa algoritma durur.
import numpy as np
from scipy.optimize import least_squares
# Model fonksiyonu
def model(x, t):
return x[0] * np.exp(-x[1] * t) + x[2]
# Residual (hata) fonksiyonu
def residuals(x, t, y):
return y - model(x, t)
# Örnek veri
t_data = np.linspace(0, 5, 50)
y_data = 2 * np.exp(-1.3 * t_data) + 0.5 + 0.1*np.random.randn(len(t_data))
# Başlangıç tahmini
x0 = [1, 1, 1]
# LM optimizasyon
result = least_squares(residuals, x0, args=(t_data, y_data), method='lm')
print("Bulunan parametreler:", result.x)
bu video çok iyi : https://www.youtube.com/watch?v=UQsOyMj9lnI&t=19s
BFGS
Çok gelişmiş bir optimzasyon algoritması öptimizasyon kütüphanelerindeki min() funk arkasında çalışan genel algoritmadır kendisi .Bir quasi-Newton yöntemi olarak geçer. quasi newron yönteminin nasıl çalıştıgından bahsedelim ilk:
-
Newton yöntemindeki gibi H^-1 ∇f(x) (H = Hessian) kullanmak isteriz.
-
Ama Hessian matrisini (∇²f) doğrudan hesaplamak maliyetli ve bazen mümkün değil.
-
Bunun yerine iterasyonlarda Hessian (ya da onun tersi) için yaklaşık bir matris B veya H tutulur ve her adımda güncellenir.
bfgs algoritması bunu belli bir prensipte gerçekleştiri bunun nasıl çalıştıhını anlamak için adım adım inceleleyelim
🔍 BFGS algoritmasının adımları
Kısaca:
-
Başlangıç tahmini:
x_0
(başlangıç noktası)H_0 = I
(ters Hessian yaklaşık matrisi genelde birim matris ile başlatılır).
-
Her iterasyonda:
-
Gradient hesaplanır:
g_k = ∇f(x_k)
-
Adım yönü hesaplanır:
p_k = - H_k * g_k
-
Uygun adım büyüklüğü (line search) ile
α_k
bulunur. -
Yeni nokta:
x_{k+1} = x_k + α_k * p_k
-
Gradient farkı:
y_k = ∇f(x_{k+1}) - ∇f(x_k)
-
Nokta farkı:
s_k = x_{k+1} - x_k
-
H_k
güncellenir:ρ_k = 1 / (y_kᵗ s_k)
V_k = (I - ρ_k s_k y_kᵗ)
H_{k+1} = V_k H_k V_kᵗ + ρ_k s_k s_kᵗ(Bu formul BFGS update formülü olarak bilinir.)
-
-
Kriter sağlanmazsa (
||∇f||
küçük değilse) bir sonraki iterasyona geçilir.
Kaynakça
- https://www.youtube.com/watch?v=QGFct_3HMzk
- https://www.mit.edu/~hlb/StantonGrant/Lecture9/quadratic.pdf
- https://www.youtube.com/watch?v=VIoWzHlz7k8
- https://www.youtube.com/watch?v=UQsOyMj9lnI&t=19s
- Medium — Steepest Descent
- https://medium.com/data-science/linear-regression-using-gradient-descent-97a6c8700931