Yitim Fonksiyonları Nedir ?

Yitim(loss) fonksiyonları, yapay sinir ağı modellerinin veri seti üzerindeki başarısının bir ölçüsüdür. Eğer model tahminlerinde başarılı ise yitim fonksiyonumuzun değeri düşük, eğer başarısız ise yüksek olur. Modelimizin eğitimi sırasında yitim fonksiyonunun değerlerini takip ederiz. Eğer bu değerlerde düşüş varsa doğru yolda olduğumuzu anlarız. Düzenli olarak yükseldiği zamanlarda ise bazı işlerin ters gittiğini ve modelimiz üzerinde bazı değişikliklere gitmemiz gerektiğini düşünebiliriz.

Yitim fonksiyonları modelin bütün yönlerini tek bir çatı altında toplayarak tek bir sayıya indirger ve bu değer üzerinde yapılan optimizasyonlar ile daha başarılı modellere ulaşırız. Bu noktada modelimizden en yüksek verimi alabilmek için modelimizi en iyi şekilde temsil edecek yitim fonksiyonunun seçilmesi çok önemlidir. Yitim fonksiyonun seçerken problemimizin tipine göre seçim yapıyoruz. Bu problemlerimiz regresyon, sınıflandırma veya çoklu sınıflandırma olabilir.

Regresyon Yitim Fonksiyonları

Ortalama Mutlak Hata(Mean Absolute Error)

Yönlerini(pozitif/negatif) dikkate almadan tahminlerin ve gerçek değerlerin arasındaki farkın ölçüsüdür. Aykırı değerleri olan veri setleri için kullanılması daha uygundur. Yorumlanması diğer fonksiyonlara göre daha kolaydır. 

Yitim Fonksiyonları
Ortalama Mutlak Hata

Ortalama Kare Hatası(Mean Squared Error)

Tahmin değerleri ile gerçek değerlerin farkının karesinin alınıp daha sonra ortalama alınması ile hesaplanır. Buradaki kare alma işlemi hata payı yüksek olan değerlere daha çok katkı payı vermektedir. Örnek olarak veri setinde gerçek değeri 8.2 olan bir değerin model tarafında tahmin değeri 8 ise burada hatamız 0.2 olur ve karesi alındıktan sonra yitim fonksiyonuna 0.04 birimlik bir katkıda bulunur. Eğer modelimizin tahmini 2.2 ise burada hatamız 6 olur ve karesi alındıktan sonra yitim fonksiyonuna katkısı 36 birim olur. İki örnek arasında 900 kat fark var. 

Yitim Fonksiyonları
Ortalama Kare Hatası

Ortalama Kare Hatasının Karekökü(Root Mean Squared Error)

Adından da anlaşılacağı üzere ortalama kare hatasının karekökünün alınması ile elde edilir. Tahmin hatalarının standart sapmasıdır. Veri setindeki değerlerin tahminlerimiz etrafında ne kadar yoğun olduğunun göstergesidir.

Yitim Fonksiyonları
Ortalama Kare Hatasının Karekökü

Çoklu Sınıflandırma Yitim Fonksiyonları

Kategorik Çapraz Entropi(Categorical Cross Entropy Loss):

Çoklu sınıflandırmalarda kullanılır. Örnek olarak resimdeki bir meyvenin elma, armut veya muz olacak şekilde sınıflandırılması verilebilir. Genellikle softmax aktivasyon fonksiyonunun ardından kullanılır. Bu yüzden softmax loss olarak da anılır. Kısa bir hatırlatma olarak değinecek olursak softmax aktivasyon fonksiyonu çıktı olarak her bir sınıfın olasılık değerini verir ve bu olasılık değerleri toplamı da 1’ e eşit olur. Çapraz entropi(cross entropy) fonksiyonunun formülü aşağıdaki gibidir.

Yitim Fonksiyonları
Çapraz Entropi

Burada categorical cross entropy dememizin sebebi çoklu sınıflandırma için kullanmamızdır. Farklı sınıflandırma tipleri için cross entropy fonksiyonunu farklı varyasyonlarda kullanırız. Formülde yj değerleri gerçek değerlerimizi, pj değerleri ise tahmin değerlerimizi göstermektedir. Yitim değeri hesaplanırken gerçek değerlerimizi one-hot encoded olarak temsil ediyoruz. Örnek olarak elma, armut ve muz sınıfında [1,0,0] vektörünü elma sınıfına ait olarak düşünürüz. Modelimiz ise softmax aktivasyonu ile 3 elemanlı bir vektörü çıktı olarak verir. Örnek olarak modelimiz iyi eğitilmiş ise [0.956, 0.003, 0.41] vektörünü çıktı olarak alırız. Formüle göre yitim fonksiyonu sadece ait olduğu sınıftan etkileniyor çünkü one-hot encoded vektörümüzde diğer değerler 0 olduğundan etkisiz kalıyorlar. Örnek olarak aşağıdaki hesaplamayı inceleyebilirsiniz. Ek olarak formüldeki logaritmanın tabanını e olarak da hesaplayabilirsiniz 2 olarak da arada önemsenmeyecek kadar küçük bir fark vardır.

Yitim Fonksiyonları
Categorical Cross Entropy Örnek

Daha sonra veri setindeki bütün değerler için yitim değerleri hesaplandıktan sonra ortalama alınarak modelin veri seti üzerindeki yitim değeri hesaplanır. Formüldeki m değeri örnek sayısını temsil etmektedir.

Yitim Fonksiyonları
Kategorik Çapraz Entropi Veri Seti

Ek olarak python kodunu da inceleyebilirsiniz.

from math import log

def cross_entropy(p,q):
    return -sum([p[i]*log(q[i]) for i in range(len(q))])

coklu_sinif = [[1,0,0],[0,1,0],[0,0,1],[1,0,0],[1,0,0],[0,0,1],[0,1,0]]
coklu_sinif_tahmin = [[0.85,0.1,0.05],[0.03,0.8,0.17],[0.02,0.01,0.97],[0.75,0.21,0.04],[0.63,0.02,0.35],[0.02,0.1,0.88],[0.05,0.75,0.2]]


coklu_sinif_sonuclar = []

for i in range(len(coklu_sinif)):
    # her bir örnek için yitim değerini hesaplıyoruz
    coklu_yitim = cross_entropy(coklu_sinif[i], coklu_sinif_tahmin[i])
    
    coklu_sinif_sonuclar.append(coklu_yitim)
    
ortalama = np.mean(coklu_sinif_sonuclar)

print("Veri seti üzerindeki yitim degeri : ", ortalama)

İkili Sınıflandırma Yitim Fonksiyonları

İkili Çapraz Entropi(Binary Cross Entropy Loss)

İkili sınıflandırmada kullanılır, örnek olarak bir kitlenin iyi huylu veya kötü huylu olacak şekilde sınıflandırılması verilebilir. Genellikle sigmoid aktivasyon fonksiyonunun ardından kullanılır.

Yitim Fonksiyonları
İkili Çapraz Entropi

Formülde p1 değeri modelimizin tahmini, y1 değeri ise gerçek değerdir. Cross entropy fonksiyonunu bu şekilde kullanmamızın sebebi ikili sınıflandırmalarda değerleri one-hot encoded olarak tutmayız. Bir tek değer ile iki sınıfın da olasılık değerlerini tutabiliriz. Örnek olarak eğer sigmoid aktivasyon fonksiyonumuz çıktı olarak 0.83 değerini vermiş ise diğer sınıfın olasılığı 1 – 0.83′ ten 0.17 olur. Formülün altında yatan matematiği inceleyelim. Eğer y1(gerçek değer) değerimiz 1 ise otomatik olarak formülün sağındaki terim 1 – y1′ den 0 olacağı için etkisiz kalıyor. Geriye kalan değer -log(p1) oluyor. -log(p1)’ in grafiğini aşağıda inceleyebilirsiniz.

Yitim Fonksiyonları
-log(p1) Grafik

p1 değerimiz sadece 0 ve 1 arasında değer alabildiği için grafiğin sadece [0,1] aralığına odaklanabiliriz. Grafikten şunu çıkartabiliriz: p1 değerimiz 0′ a gittikçe grafiğimiz sonsuza gitmektedir. Bizim gerçek değerimiz ise 1 idi. Yani tahmin değerimiz gerçek değerimizden uzaklaştıkça yitim fonksiyonumuza çok yüksek değerler ekliyoruz. Bir nevi modelimizi tahmin değeri gerçek değerden uzaklaştıkça yitim fonksiyonunu artırarak tehdit ediyoruz. p1 değerimiz 1′ e doğru giderken ise azalıyor ve 1 noktasında 0 oluyor. Grafiğin geri kalan yeri ile ilgilenmiyoruz. Gerçek değerimizin 0 olduğu durumu da inceleyelim. Bu sefer de y1*log(p1) kısmı 0 oluyor ve geriye -log(1 – p1) kalıyor. -log(1-p1)’ in grafiğini aşağıda görebilirsiniz.

Yitim Fonksiyonları
-log(1 – p1) Grafiği

Yine grafiğin sadece [0,1] aralığına odaklanıyoruz. Bu grafiği ise şu şekilde yorumlarız: p1 değerimiz 1 e yaklaştıkça fonksiyonumuz sonsuza gitmektedir. Bizim gerçek değerimiz ise 0 idi. Yani yine önceki mantık aynı şekilde işliyor. Tahmin değerimiz olması gereken değerden uzaklaştıkça yitim değerimiz artıyor ve olması gereken değerde o oluyor. Modelin veri seti üzerindeki yitim değerini hesaplamak için yitim değerleri her bir örnek için hesaplandıktan sonra ortalaması alınmalıdır. Aşağıdaki ikili çapraz yitim fonksiyonu için yazılmış python kodunu inceleyebilirsiniz. Burada aynı veri üzerinde iyi yapılmış ve kötü yapılmış tahmin arasındaki yitim değerini karşılaştırabilirsiniz.

from math import log
import numpy as np


def binary_cross_entropy(p,q):
    return -p*log(q) - (1 - p)*log(1 - q)


# ikili sınıflandırma 
gercek_degerler = [1, 1, 0, 0, 1, 1, 0, 0]
# iyi tahmin değerleri
tahmin_degerleri = [0.9, 0.8, 0.3, 0.1, 0.95, 0.8, 0.23, 0.05]
# kötü tahmin değerleri
tahmin_degerleri_2 = [0.4, 0.2, 0.91, 0.8, 0.3, 0.15, 0.6, 0.7]

sonuclar = []

for i in range(len(gercek_degerler)):
    ikili_yitim = binary_cross_entropy(gercek_degerler[i],tahmin_degerleri[i])
    
    sonuclar.append(ikili_yitim)
    
ortalama_1 = np.mean(sonuclar)
    
print("Veri seti üzerindeki yitim degeri : ", ortalama_1)


sonuclar_2 = []

for i in range(len(gercek_degerler)):
    ikili_yitim = binary_cross_entropy(gercek_degerler[i],tahmin_degerleri_2[i])
    
    sonuclar_2.append(ikili_yitim)
    
ortalama_2 = np.mean(sonuclar_2)
    
print("Veri seti üzerindeki yitim degeri : ", ortalama_2)
Yitim Fonksiyonları
Çıktı

Önümüzdeki yazımızda ise yitim fonksiyonlarının nasıl optimize edildiğini inceleyeceğiz.