Başarabilirsin: Makine Öğrenmesine Giriş 3 — Modelimizde Hata, Hata Optimizasyonu ve Hiper Parametreler

Fethi Tekyaygil
Deep Learning Türkiye
8 min readMay 18, 2020

Merhabalar,
Bu sıralar işlerimin yoğunluğu, karantina ve Kurtlar Vadisi’ne sarışımdan dolayı gecikmeli olarak Makine Öğrenmesine Giriş serimin 3.yazısı ile karşınızdayım. Bu yazıda birlikte bir veri seti kullanarak ilk modelimizi eğiteceğiz demem gerekiyordu ancak bu yazıyı eğitim öncesi bilmeniz gereken bazı konulara ayırmam gerekti :) Sıkıcı girişimi yaptığıma göre hadi biraz eğlenceli kısımlara başlayalım! Işınla bizi Solo! (Biliyorum orjinali Scotty!)

GİRİZGAH

Bu kısımda işin azıcık matematiğine ve işleyişine değinmek istiyorum. Korkmayın zor değil. Sadece düz mantık yetecektir :)

Öğrenci örneğimizi hatırladınız değil mi hani şu üniversite sınavına hazırlanan öğrencimiz.

ÖSS’yi kaçırdığına inanan koca yürekli Nazif’e buradan koskocaman selamlar.

İşte bu öğrencimizi bu yazımızda çooook kullanacağız :)

MODELİMİZDE HATA NASIL OLUŞUR?

Her kul gibi modelimiz de hatasız olmaz. Eğer hatasız bir modelimiz var ise işkillenmeye başlayabilirsiniz diyebiliriz. Neden mi? Hadi size iki kavram açıklayayım:

OVERFITTING:

Overfitting kavramını bir örnekle açıklamam gerekirse:

Öğrencimiz üniversite sınavına hazırlanırken aynı deneme testlerindeki soruları çok sık çözerse öğrenmekten ziyade ezberler. Peki ezberlemesi neden kötü olsun ki?

Eğer aynı soruları ezberlerse bu sefer yeni soru tipini çözmekte sorun yaşayacaktır çünkü soruların çözüm mantığından ziyade çözümleri ezberlemiştir diyebiliriz.

Peki matematiğe bunu nasıl uydururuz?

Önceki yazımda modelimizin grafiğe lineer bir çizgi koyduğunu görmüştük. Bu çizgiler bazı durumlarda değişkenlik gösterebilir.

Overfitting

Yukarıdaki figürde görünen x değerleri veri setimizdeki gerçek değerler, üstünden geçen çizgiler ise modelimizin düzleme koyduğu tahmin doğrusudur. Bu doğrunun muazzam şekilde uygun bir doğru olduğunu farkettiniz değil mi? Eğitim veri setindeki tüm değerler için %100 doğru tahmin gerçekleştirir ancak biz veri setimizde olmayan başka bir değeri verip tahmin gerçekleştirmek istersek bu tahminde çok kötü bir performans sergiler.

UNDERFITTING:

Klasik düz mantığımızı kullandığımızda Underfitting’in Overfit’in tersi olduğu çıkarımını yapabiliriz.

Underfit’te ise öğrencimiz sadece bir kez tekrar yapıp sınava girmiş diyebiliriz. Bu tekrar sayısı az olduğu için öğrenci sınavda çok kötü bir performans sergiler.

Underfitting

Yukarıdaki figürde gerçek değerler ile modelimizin düzleme koyduğu doğru arasında uzaktan yakından bir alaka yok. Gerçi hakkını yemeyelim aşağılarda ve yukarılarda tutturur gibi olmuş :)

Peki Hata Nasıl Oluşur?

Siyah yuvarlaklar gerçek verimiz,

Kırmızı doğru, modelimizin oluşturduğu doğru,

Yeşiller ise hata değerlerimizdir. Gerçek veriler ile modelimizin oluşturduğu doğru arasındaki uzaklıklar hatalarımız olur. Burada her verinin uzaklığına hata dediğimiz için her yeşil çizgi her verimizin hatası diyebiliriz.

Daha Türkçe anlatmak gerekirse; bir veri örneğinin(bir yuvarlağın) hata oranı =(yapılan tahmin(kırmızı doğrumuzun koordinatı)-gerçek değer(siyah yuvarlaklarımızın koordinatı)

Ancak komple modelimizin hatasını nasıl bulabiliriz?

Mean Squared Loss Function:

Bunun için birden fazla yöntem var ancak ben popülerlerden biri olan Mean Squared Loss Function’dan bahsedeceğim. Önce denklem:

y: Bizim gerçek değerlerimiz (siyah yuvarlak)

prediction: Modelimizin oluşturduğu kırmızı doğru

N: Toplam veri sayımız(düzlemdeki siyah yuvarlak sayısı)

Burada Mean denmesinin sebebi ortalama alınması, Squared denmesinin debebi ise (y-tahmin) uzaklık değerinin karesinin alınmasıdır.

Modelimizin hatasını Mean Squared Error denklemi ile hesaplayabiliriz. Bu denklemimiz her veri örneğimiz(her siyah yuvarlak) için hata oranını bulup karelerini toplar ve ortalamaya böler.

Bu durumda eğer modelimiz en optimum weight değerlerini buluyorsa modelimiz hata oranını en çok düşürecek weight değerlerini bize sunmalı.

Modelimizin hatasını bulduk ancak bu hatayı sadece bakmak için bulmadık. Sırada bu hatayı olabildiğince düşürmek var. O zaman sizlere Gradyan İnişi’ni (Gradient Descent) takdim ediyorum.

GRADYAN İNİŞİ (GRADIENT DESCENT)

Çok güzel bir isim değil mi? Ama yaptığı şey daha da güzel. Modelimizin hatalarını düşürmek. İyi de nasıl?

Türev :)

Durun durun kaçmayın :) Oturup türev çözmeyeceğiz sadece türevin bu puzzle’ın neresinde olduğunu ve işlevini göreceğiz :)

Öncelikle Gradyan İnişi iteratif bir fonksiyondur yani birden fazla kez çalışan bir fonksiyondur. Bunun nedeni gradyan inişi modelimiz en optimum weight değerlerini elde edip modelimizi en optimum seviyede çizebilene kadar bu fonksiyon tekrarlı çalışır.

Gradyan inişindeki amacımız en optimum weight değerini bulup hataları olabildiğince aza düşürmekti. Yukarıdaki figürde weight değerinin çok az veya çok fazla olması hata (loss) değerimizi yükseltecektir. Hatamız yeşil veya kırmızı noktalar olabilirdi, zaten hatamız bu grafikte herhangi bir yerde olabilirdi.

Eğer hatanız yeşil noktadaysa negatif bir eğim, kırmızı noktadaysa pozitif bir eğim var diyebiliriz.

Eğimi aşağıdaki şekilde gösterebiliriz:

Buradaki kırmızı ve yeşil çizgi o noktanın eğimidir. Zaten türev bize der ki: “Hadi teğeti bu noktaya götürelim ve bu teğet çizgisinin eğimine bakalım.”

Her iterasyonda eğimimiz türev yardımıyla en alt noktaya ve dikleşmeye daha da yaklaşır. Eğim formülümüz:

y=mx+b

Gradyan İnişi’nin en optimum hali aşağıdaki gibi görünür:

Burada mavi nokta kayıp değerimizin en az olduğu değerdir. Gradyan İnişi her iterasyonda noktanın eğimini (türevini) alır ancak en optimum seviyede doğrumuz dikleşeceğinden artık eğimi alınamaz. Bunu formülize edecek olursak:

Bir anda bakınca tepkiniz bu olmuş olabilir:

Ancak hadi bunu Türkçe’ye çevirelim :)

-Thetaj değerimiz bizim ağırlık değerimiz. Modelimizin oluşturduğu fonksiyonda kaç tane weight değeri varsa hepsi tek iterasyonda bu işleme girer.

-m değerimiz veri örneği sayımız. Grafiğimizdeki siyah yuvarlak sayısı diyebiliriz çünkü her siyah yuvarlak aslında veri setimizdeki gerçek değerlerin düzlemdeki gösterimleridir.

-a’ya benzeyen alfa değerimiz learning rate hiper parametremizdir. Hoaydaaa hiper parametre de ne dediğinizi duyar gibiyim ama sıkın dişinizi o konuya az kaldı. O konuyu açtığımda learning rate’i de açıklayacağım :)

En sonra toplama işleminin sağında olan kısımda ise ilgili veri örneğinin hatası gerçek değer — tahmin değeri ile bulunur ve türev alındığı için hangi weight değerinin türevi alınıyorsa o weight’in feature değeri ile çarpılır. Buradaki trick ise şudur, aslında toplama işaretinin sağında kalan kısım, Mean Squared Loss fonksiyonunun türevinin alınmış halidir. En temelde gradyan inşi fonksiyonumuz böyle gözükür:

Burada J, hata fonksiyonunu temsil etmektedir. Yani burada hata fonksiyonunun türevini alıyoruz.

Modelimiz hatalarımızı Gradyan İnişi ile düşürüyor. Elbette ki başka yöntemler de var ancak burada Gradyan İnişi’ni anlatmış olduk :)

Gradyan İnişi Çeşitleri

1. Batch Gradyan İnişi

Bu gradyan inişi çeşitinde batch_size, eğitim örneği sayısına eşit olur. Öğrenci ve 1000 sayfalık ders kitabı örneğini düşünürseniz öğrenci tek oturuşta 1000 sayfayı çalışacaktır. 1 epoch için batch_size 1000, dolayısıyla da 1 iterasyon olacaktır. Ancak sayfa sayısı fazla olduğu için öğrenci yorulacak ve bu çalışam süreci biraz uzun sürecektir.

2. Mini-Batch Gradyan İnişi

Bu gradyan inişi çeşitinde batch_size 1 ile eğitim örneği sayısı arasında olur. Öreğin batch_size’ı 20 belirledik diyelim. Öğrenci ve 1000 sayfalık ders kitabı örneğini düşünürseniz öğrenci tek oturuşta 20 sayfayı çalışacaktır. 1 epoch için batch_size 50, dolayısıyla da 20 iterasyon olacaktır.

3. Stochastic Gradyan İnişi

Bu gradyan inişi çeşitinde batch_size’ımız 1 olur. Öğrenci ve 1000 sayfalık ders kitabı örneğini düşünürseniz burada öğrencinin çalışacağı sayfa sayısı 1, iterasyon sayısı da 1 epoch için 1000 olacaktır.

Bu kısmı anladığımıza göre söz verdiğim Hiper Parametre konusuna geçiyorum :)

HİPER PARAMETRE NEDİR?

Modeli eğitim senasyosunda öğrencimiz burada modelimizi temsil ediyordu. Öğrencimizin çalıştığı dersler de veri setimizi temsil ediyordu. Buraya kadar problemimiz yok. Ancak Makine Öğrenmesi modelimiz bu verileri öğrenirken yapmamız gereken ufak ayarlamalar vardır.

Ayarlama yapmamız gereken değerlere hiper parametre deriz. Hiper parametre modelimizin eğitimi sırasında performansı sağlayabilmek adına verdiğimiz değerlere denir. Bu değerler kullanıcı tarafından yani bizim tarafımızdan verilir. Burada hiper parametreler modelimize eğitimin nasıl yapılacağını indike eder. Anlamadınız değil mi? O zaman haydi örnekli açıklamalarla hiper parametrelerimize bakmaya:

Epoch:

Öğrenci matematik sınavına 1000 sayfalık bir tane kitapla hazırlanıyor olsun.
Normal şartlarda bir öğrenci bu kitabı bir kere bitirip kitaba çalışmayı bırakacaktır ancak Makine Öğrenmesi’nde modelimiz ona verdiğimiz veri setini birden fazla kez çalışarak öğrenmeye çalışır. İşte bu çalışma sayısına epoch deriz. Öğrenci örneğinden devam edersek öğrencinin aynı kitabı baştan sonra çalışıp bitirme sayısına epoch denir.

batch_size:

Yukarıda bahsi geçen kitabımızda Türev, İntegral ve Polinomlar konuları olsun. Öğrencimiz tek oturuşta 1000 sayfalık kitabı bitirmeye kalktığında oldukça zorlanacaktır. Öğrenci bir oturuşta tüm kitabı komple çalışabilir, çalışmasını konulara bölebilir, ya da sayfalara bölebilir. İşte modelimizin de bu senaryodaki öğrenciden bir farkı yoktur. Öğrencimizin çalışmasını böldüğü sayfa sayısı batch_size olur. Örneğin öğrenci 1000 sayfalık kitabı 100'er sayfalara bölüp çalışırsa buradaki batch_size 100 olacaktır. batch_size 100 olduğu için modelimiz 10 iterasyon sonra 1 epoch gerçekleştirecektir.

1 epoch=1000 sayfa= 100(batch_size)*10(iterasyon)

Learning Rate:

Learning rate Gradyan İnişi sırasında kullandığımız bir hiper parametredir. Bu hiper parametre bize gradyan inişi sırasında bir noktadan diğer noktaya atılacak adımı belirler. Hadi bir kez daha gradyan inişi grafiğini hatırlayalım:

Her iterasyonda grafiğin durumu aşağıdaki gibi olur:

Burada her iterasyonda weight değerimiz de hata (cost olarak gösterilmiş) değerimiz de en optimum düzeye yakınsar (converge). Burada noktalarımızın optimum seviyeye doğru yaklaşma hızı (ben attığı adım demeyi tercih ediyorum.) learning rate’dir.

Learning rate değerini seçerken dikkat etmemiz gereken hususlar vardır:

Learning rate’i çok büyük seçerseniz noktamız optimum noktayı atlayacak, asla yakınsamayacak aksine uzaklaşacaktır.

Learning rate’i çok küçük seçerseniz gradyan inişi fonksiyonunuz çok yavaş çalışacaktır.

Bir konuya daha dikkatinizi çekmek istiyorum.

Farkettiyseniz noktalarımız hep eşit mesafede yakınsamıyor ve gittikçe noktalar arası mesafe azalıyor. Bunu nedeni ise her iterasyonda alınan türev ile aynı weight değerinin tekrar güncellenmesidir.

Burada farkedeceğiniz üzere thetaj(weight) değerimiz her iterasyonda daha da küçülecek, böylece atılan adımlar da her seferinde daha da küçülecektir. Çünkü thetaj değerinden learning rate * thetaj’nin türevini çıkarıp tekrar thetaj değerine eşitliyoruz.

KAPANIŞ

Bu yazımda modelimizi eğitmeden önce bilmemiz gereken şeyleri açıklamaya çalıştım. Artık umuyorum ki bir sonraki yazımda ilk modelimizi birlikte eğiteceğiz :) Umarım faydalı ve öğretici bir yazı olmuştur. Eğer yazının bu kısmına kadar geldiyseniz tebrikler ve teşekkürler :)

Herkese iyi ve sağlıklı haftalar diliyorum. Daha fazla yazı için lütfen takipte kalın :)

-Fethi Tekyaygil

--

--

Fethi Tekyaygil
Deep Learning Türkiye

.NET Core Backend & Google Certified Tensorflow Developer — Flutter & Solidity Padawan — Animal Person