Bu yazı Makine Öğrenmesi Matematiği yazı dizisinin 4. bölümüdür. Hatırlamak isterseniz:

Kaldığımız yerden devam edelim. Bu öğrenme oranı alfa değerini rastgele belirledik; 0.0001. Bu sayı bize neyi ifade ediyor, evet biliyoruz optimum ağırlığa doğru ne kadar hızlı veya yavaş hareket edeceğimizi belirtiyor, ancak neden alfa‘ya bu değeri verdik. Doğru değeri verdiğimizi nereden bilebiliriz ya da problemimizde doğru alfa değerini nasıl bildik?

Soruyu şöyle değiştirmeliyiz: Dereceli Azalma Ne Zaman Doğru Çalışır? Şimdi sorunumuz daha mantıklı hale geldi. Dereceli Azalma doğru çalıştığında alfadeğerini doğru bilmişiz demek değil midir?

Maliyet fonksiyonu her adımda azalıyorsa, Dereceli Azalma doğru çalışıyor demektir.

O zaman her devirde (adımda) maliyet fonksiyonuna karşılık gelen grafiğe bakarsak, dereceli azalma algoritmamızın ve bulduğumuz alfadeğerinin ne denli doğru olduğunu görebiliriz.

Programımızın calistir.py‘in sonuna şunu ekleyelim:

u""" 5- Sonuc"""
print colored('5- [Sonuc]: Grafikler ...', 'blue')
print colored(('Hesaplanan Teta ', teta), 'green')
maliyet_devir_grafigi(toplam_devir, maliyet)

grafik_ciz.py ‘nin içine de aşağıdaki metodu ekleyin.

def maliyet_devir_grafigi(toplam_devir, maliyet):
    """

    :param toplam_devir: Toplam Devir Sayisi
    :param maliyet: Maliyet
    """
    plt.title("Maliyet - Devir")
    plt.xlabel("Devir Sayisi")
    plt.ylabel(r"Maliyet Fonksiyonu $J(\theta)$")
    plt.plot(np.arange(toplam_devir), maliyet, 'blue')
    plt.show()

Şimdi programımızı çalıştırdığımızda, maliyet fonksiyonu – devir sayısı grafiğini görüyoruz. Grafiği dikkatlice incelerseniz aslında alfa değerini iyi seçmiş olduğumuzu görebilirsiniz.

maliyet_devir.png

Programımızı sonlandırmadan önce Makine Öğrenmesi Matematiği 2‘de bahsettiğimiz kontur grafiklerini hatırlayalım. Kontur grafikleri sayesinde maliyet fonksiyonu ve parametreler arasındaki ilişkiyi görselleştirebiliyorduk. Şimdi biz de bu örnek için kontur grafiklerine bir göz atalım.

calistir.py‘in sonuna şunu ekleyelim:

maliyet_fonksiyonu_grafikleri(X, y, teta)
print colored('[BILGI] : Program Basari ile Sonlandi.', 'blue')

grafik_ciz.py ‘nin içine de aşağıdaki metodu ekleyin.

def maliyet_fonksiyonu_grafikleri(x, y, teta):
    """

    :param x:Ongorucu Degisken
    :param y:Hedef Degisken
    :param teta:
    """
    from matplotlib import cm
    from matplotlib.colors import LogNorm
    from mpl_toolkits.mplot3d import Axes3D

    theta0_vals = np.linspace(-10, 10, 100)
    theta1_vals = np.linspace(-1, 4, 100)

    J_vals = np.zeros([len(theta0_vals), len(theta1_vals)])

    for i in range(1, len(theta0_vals)):
        for j in range(1, len(theta1_vals)):
            t = [theta0_vals[i], theta1_vals[j]]
            J_vals[i, j] = np.sum(np.power((np.dot(x, t) - y), 2)) / (2 * len(x))

    J_vals = J_vals.T
    teta = np.asarray(teta)

    fig = plt.figure(1)

    fig.suptitle("Maliyet Fonksiyonu Kontur Grafikleri")

    ax1 = fig.add_subplot(1, 2, 1, projection='3d')
    ax1.plot_surface(theta1_vals, theta0_vals, J_vals, cmap=cm.jet)
    ax1.set_xlabel(r"$\theta_1$")
    ax1.set_ylabel(r"$\theta_0$")

    ax2 = fig.add_subplot(2, 2, 4)
    ax2.plot(teta[0][0], teta[0][1], 'rx', markersize=10)
    ax2.set_xlabel(r"$\theta_0$")
    ax2.set_ylabel(r"$\theta_1$")
    # -4,5,40 #-4, 6, 20
    ax2.contour(theta0_vals, theta1_vals, J_vals,
                norm=LogNorm(),
                levels=np.logspace(-4, 6, 20))  # -4, 6, 20
    plt.tight_layout()

    fig.savefig("deneme.png")
    plt.show()

maliyet_kontur.png

  • Eğer alfa değerini çok küçük seçerseniz, dereceli azalma algoritması çok yavaş hareket edecektir.
  • Eğer alfa değerini çok büyük seçerseniz dereceli azalma minimum’u geçip gidebilir. Yakınsama da başarız olur hatta aradığımız minimum değerinden sapabilir.
  • Dereceli azalma, öğrenme oranıalfa sabit olsa bile, yerel bir minimuma yaklaşabilir.  Yerel bir minimuma yaklaştığımızda dereceli azalma otomatik olarak daha küçük adımlar atacaktır. Yani, zamanlaalfa’nın azaltılmasına gerek yoktur.

Dereceli Azalma konusunda başka kaynaklara göz attıysanız, bir çok farklı çeşidinin olduğunu görmüşsünüzdür. Hepsini aynı anda öğrenmeye çalışarak kafanızı karıştırmayın. Şimdi Batch Gradient Descent ile başlayalım. Batch’in türkçe karşılığının bir defada alınan miktar olduğunu biliyoruz. Batch Gradient Descent’e biz Toplu Dereceli Azalma diyeceğiz.

Toplu Dereceli Azalma,  dereceli azalma algoritmasının her bir adımında (devirinde) bütün eğitim örneklerini kullanır.

Yaptığımız örnek, toplu dereceli azalma’ya bir örnektir. Elimizde var olan bütün öngörücü değişkenlerini kullanarak algoritmayı implement ettik. Formulümüze tekrar bakalım ve hatırlayalım:

sss

Bütün eğitim örneklerini kullanmak demek, yukarıya baktığınızda, maliyet fonksiyonundaki toplamda yer alan m değerini göstermektedir. Biz m değerini maliyeti hesaplarken m = len(x) olarak seçmiştik. Bu da elimizdeki tüm örnekleri kullandığımızı gösteriyor.

Unutmadan, Batch Gradient Descent, Vanilla Gradient Descent diye de bilinir.

Şimdi biraz daha basitçe anlatalım.

cost

yakinsayanakadar

Yukarıdaki algoritma, Dereceli Azalmayı (Toplu Dereceli Azalmayı) gerçekleştirmek için maliyet fonksiyonu J’nin gradyanını hesaplamamız gerektiğini ve maliyet fonksiyonunun gradyanını hesaplamak için de , her bir örneğin toplamını (üstteki maliyet fonksiyonu) toplamamız gerektiğini söylüyor. Peki eğer, 5 milyon örneğe sahipsek bu durumda bu işlemi 5 milyon kez tekrar etmemiz gerekir.

Yani bizim şimdi sadece minimum düzeye doğru tek bir adım atmak için, her maliyeti 5 milyon kez hesaplamamız mı gerekiyor? 

Tabiki böyle yapmadıklarını biliyorsunuz. Böyle bir durumda, her adımda her örneği kullanmak bize hem zaman açısından hem de yer açısından çok büyük olumsuzluklar getirecektir. Evet anladınız sanırım. Bütün örnekleri kullanmak zorunda mıyız? Değiliz. Sırada Stochastic Gradient Descent yani Olasılıksak Dereceli Azalma var.

Olasılıksak Dereceli Azalma, bütün örneklerin maliyet eğrisinin toplamını kullanmak yerine, her yinelemede bir örnekteki maliyet eğimini kullanır.

Olasılıksal Dereceli Azalma’da dikkat edilmesi gereken bir kaç nokta var,

  • Döngüden önce, eğitim örneklerini rasgele karıştırmanız gerekir.
  • Her seferinde yalnızca bir örnek kullandığı için, minimum değere giden yol, toplu dereceli daha gürültülüdür. Ancak, bize aynı minimum değeri, kısa bir eğitim süresinde verdiği sürece sorun değil.

Son olarak Mini Batch Gradient Descent‘den bahsedelim.

Mini Toplu Dereceli Azalma,  her yinelemede toplam m örnek içerisinden n örnek seçerek kullanır. (n<m)

Devamı ->Makine Öğrenmesi Matematiği 5

Designed by Freepik