Bir problemin çözümünü bulmak için belirli bir hedefe doğru ilerleriz. İşte bu hedefi tanımlayan şey genellikle bir "hedef fonksiyonu" veya "amaç fonksiyonu" olarak adlandırılır. Bu hedef fonksiyonu, genellikle bir dizi girdinin (genellikle bir veya daha fazla değişkenin) alınıp işlenmesi ve bir çıktının üretilmesi şeklinde bir fonksiyondur.
Hedef fonksiyonları genellikle optimizasyon problemlarında karşımıza çıkar. Optimizasyon problemları, belirli bir hedef fonksiyonunu maksimize etme veya minimize etme eylemini içerir. Bu, daha geniş bir alan olan matematiksel programlamanın bir parçasıdır.
Örnek vermek gerekirse, bir işletmenin karını maksimize etmek isteyebileceği bir durum düşünün. İşte bu durumda hedef fonksiyonu, karı hesaplayan ve çeşitli girdileri (üretim miktarı, fiyatlar, maliyetler vb.) kullanarak bir çıktı üreten bir fonksiyon olacaktır. Bu durumda, hedefimiz bu fonksiyonu maksimize etmektir.
Benzer şekilde, bir lojistik şirketi, belirli bir taşıma işlemini gerçekleştirme maliyetini minimize etmeye çalışabilir. Bu durumda hedef fonksiyonu, bu maliyeti hesaplayan bir fonksiyon olacaktır ve hedefimiz bu fonksiyonu minimize etmektir.
Amaç fonksiyonu terimi genellikle makine öğrenmesi ve yapay zeka bağlamında kullanılır ve genellikle bir modelin performansını ölçmek için kullanılır. Amaç fonksiyonu, bir modelin ne kadar iyi veya kötü olduğunu belirlemek için bir metriktir. Modelin hedefi genellikle bu amaç fonksiyonunu minimize etmektir. Örneğin, bir regresyon modelinde amaç fonksiyonu genellikle gerçek değerler ile modelin tahminleri arasındaki farkı ölçen bir fonksiyon olacaktır. Modelin hedefi, bu farkı (yani hata miktarını) minimize etmektir.
Sonuç olarak, amaç ve hedef fonksiyonları belirli bir problemi çözmek için belirli bir hedefi ifade eden matematiksel ifadelerdir. Bu hedefler genellikle bir şeyi maksimize etmek veya minimize etmek şeklinde formüle edilir.
Basit bir hedef fonksiyonu optimizasyonu örneği üzerinden gidelim. Problemimiz, belirli bir matematiksel fonksiyonu minimize etmek olsun. Bu fonksiyon f(x) = x^2 + x + 2 olsun.
Önce bu fonksiyonu tanımlayalım:
def f(x): return x**2 + x + 2
Bu durumda, hedefimiz f(x)'in en küçük değerini bulmaktır. Yani f(x)'i minimize etmek istiyoruz.
Bu tür bir problemin çözümü için genellikle gradyan inişi (gradient descent) adı verilen bir yöntem kullanılır. Gradyan inişi, hedef fonksiyonunun türevini alır ve bu türevi kullanarak fonksiyonun minimum değerine adım adım ilerler.
Önce f(x)'in türevini bulmamız gerekiyor. Bu fonksiyonun türevi f'(x) = 2x + 1 olacaktır.
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}")
Bu algoritma, başlangıç "x" değerini alır, bir öğrenme hızı belirler ve belirli bir sayıda döngü (epochs) boyunca çalışır. Her döngüde, x değerini hedef fonksiyonun türeviyle günceller ve f(x)'in değerini yazdırır.
Şimdi bu algoritmayı, initial_x = 10, learning_rate = 0.1 ve epochs = 50 değerleriyle çağıralım:
Bu kod parçası, f(x)'in minimum değerine doğru adım adım ilerler ve her adımdaki x değerini ve f(x) değerini yazdırır. Sonunda, fonksiyonun minimum değerine en yakın x değerini verir.
Hatırlatma:
Matematiksel bir fonksiyonun türevi, fonksiyonun belirli bir noktadaki eğimini veya hızını temsil eder. Pratikte, bir fonksiyonun türevini almak, o fonksiyonun nasıl değiştiğini (artış veya azalış) ve ne kadar hızlı değiştiğini anlamamıza yardımcı olur.
Optimizasyon problemlarında, türev genellikle bir fonksiyonun minimum veya maksimum değerlerini bulmak için kullanılır. Bu noktalar, genellikle türevin sıfır olduğu noktalardır. Yani, bir fonksiyonun türevi, fonksiyonun eğiminin yönünü ve büyüklüğünü belirler. Bu bilgi, fonksiyonun minimum veya maksimum değerine doğru hangi yönde ilerlememiz gerektiğini belirler.
Gradyan inişi algoritması örneğinde olduğu gibi, türev, her adımda hedef fonksiyonun minimum değerine doğru "adım atma" kararımızı belirler. Algoritma, her adımda fonksiyonun türevini alır ve bu türevin negatif yönünde bir adım atar. Bu, hedef fonksiyonun eğiminin en hızlı azaldığı yönü belirler, yani fonksiyonun minimum değerine en hızlı ulaştığımız yön.
Sonuç olarak, bir fonksiyonun türevini almak, fonksiyonun en düşük veya en yüksek değerlerini bulmamıza yardımcı olur, bu da optimizasyon problemlarının çözümünde temel bir adımdır.
Gradyan inişi algoritması:
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.
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.