
2.596 kelime · ~13 dk okuma
Yeni bir araba aldığınızda galeriden çıkarır çıkarmaz değeri düşer ya. Ben hiç yeni araba almadım gerçi. Belgesellerden, efsanelerden öğrendiğim kadarıyla konuşuyorum. Sonuçta araba eskidikçe değerini kaybeden bir şey.
En büyük değer kaybı da ilk günlerde oluyor. Oysa sinir ağlarında durum tam tersi. Sıfır bir ağın değeri de sıfıra yakın. Ayarları rastgele olduğundan hiçbir işe yaramıyor.
Yazı turat daha iyi. Fakat onu kullanıp eğittikçe değeri yavaş yavaş artıyor. Bir noktadan sonra da gerçekten işe yarar hale geliyor. Kıssadan hisse eğitim şart.
Eğitim şart ama nasıl bir eğitim? Basit ağlarda bu iş basitti. Tahminimiz biraz fazla yüksek çıkmışsa tüm ayarları aynı miktarda düşürüp tekrar deniyorduk, düşük çıkmışsa tersini yapıyorduk. Her örnekte böyle gel git gel git, o kadar.
Furkan Üniversitesi, Burkan Koleji ayarında bir eğitim. Fakat karmaşık ağlarda herhangi bir ayarı değiştirmenin sonucu ne yönde ve ne kadar etkileyeceği bariz değil. Vallahi biz eğitilmeyiz diye bağırıyorlar adeta, ta ki 80'lere kadar. Tamam, The Wall albümü teknik olarak 80'lerden değil ama Happy Top'u bir ay yüzünden de birbirimizi kırmayalım şimdi.
Fullarsız Entell'e hoş geldiniz. Ben İmmanuel Tostoyevski. Yapay Zeka serisinin 101. bölümündeyiz.
Binary sistemle sayarsak tabii. Konumuz sinir ağlarının eğitimi. Bununla kastedilenin ağın iyi ayarlanması olduğunu biliyorsunuz zaten. Bugün işin detayına gireceğiz ve üç önemli kavram öğreneceğiz.
Yanlışımızı anlatan hata fonksiyonu, Hatayı azaltmanın bir yöntemi olan gradient descent ve onun etkili biçimde uygulanmasını sağlayan backpropagation tekniği. Hepsi birbirle ilintili. İlkinden başlayalım. Yapay zeka içersin içermesin, her modelin amacı isabetli tahmin yapabilmek.
Dolayısıyla hata ölçümü en önemli şey. Ta ilk bölümden beri tekrarlıyoruz. Şimdi size bir senaryo sunayım. İki tane hava durumu uygulamamız olsun.
Günlük en yüksek sıcaklığı söylüyorlardı. Ertesi günde gerçek değerlerle karşılaştırıyoruz. Bunu bir hafta boyunca yapıyoruz. İlk uygulamanın tahminleri her gün artı eksi bir derece şaşmış.
İkinci uygulama ise haftanın altı günü kusursuz çalışmış, yalnız pazar günü tam yedi derece şaşmış. Hangi uygulama daha güvenilir? Eğer dümdüz hata ortalamasına bakarsak ikisinin de performansı aynı. Günlük bir derecelik şaşma.
Fakat pratikte ikinci uygulama çok daha yanıltıcı. En azından benim için. Çünkü her gün 1 derecelik farkın hayatıma pek etkisi olmazken 7 derece bazı durumlarda ölüm kalım meselesi bile olabilir. Bize büyük hataları iyice ön plana çıkaran bir ölçüm yöntemi lazım.
Bunun en basit yolu hatanın karesini almak. İlk uygulamamız için hiçbir şey değişmeyecek. Günlük ortalama yine 1. İkinci uygulamanın hata puanı ise 7 olacak.
49 bölü 7 gün. Daha güvenilmez olduğunu hissediyorduk da şimdi bu farkı sayıya dökmüş olduk. Başka yöntemler de mümkün. Hatta kendi yönteminizi kendiniz de geliştirebilirsiniz.
Ne olacak ki? Tahmin ile gerçek sonuç arasındaki farka bağlı olduğu sürece atış serbest. Şimdi uygulamayı bir sinir ağı olarak hayal edelim. Öyle bir haftalık veri eğitim için yetmez.
Geçen senenin tüm meteorolojik verileri elimizde olsun. Gün gün sırayla A'ı yediriyoruz. Sonra gerçek sonuçlarla karşılaştırıp deminki gibi tek bir ortalama performans değeri elde ediyoruz. Kritik soru şu, bu performans neye bağlı?
Ve ilkin eğitim setine bağlı. Başka örnekler üstünden tahmin yürütseydik belki daha isabetli olurdu. Ama genelde erişebildiğimiz en büyük ve en kaliteli eğitim setini kullanacağımızdan onu değiştirme lüksümüz yok. Dolayısıyla onu sabit kabul edelim.
Başka neye bağlı performans? Ağın kendisine tabii ki. Fakat ağı tanımlayan şeylerin de bir kısmının sabit olduğunu unutmayın. Kaç katman var?
Her birinde kaç nöron var? Birbirlerine nasıl bağlılar? Hangi aktivasyon fonksiyonlarını kullanıyorlar? Tüm bunlar baştan verilmiş tasarım kararları.
Onları değiştirirsek eğitime yeniden başlamak gerekir. Geriye kaldı eğitim esnasında değişen parametreler. Bağlantıların ağırlıkları ve nöronların eşik değerleri. Bundan sonra kısaca ayar veya ağırlık diyeceğim.
Bunlar değişirse ağ içinde yapılan hesaplar da değişiyor. Bir başka deyişle, performans bu ayarların bir fonksiyonu. Hata fonksiyonu terimi buradan geliyor. Eğer onu bilirsek minimum noktasına karşılık gelen ayarları çat diye bulabiliriz.
Böylece eğitim de başlar başlamaz biter. Yalnız ufak bir sorun var, fonksiyonu bilmiyoruz. Kimse bunun formülünü baştan bize vermiyor. Biz sadece belli bir dizi ayarın sebep olduğu ortalama hatayı görüyoruz.
Fonksiyonu tüm hatlarıyla öğrenmenin tek yolu sayısız ayar kombinasyonu denemek. Bunun da imkansızlığı bariz. Ta 50'lerde inşa edilen o Perceptron makinesinde bile yüzlerce bağlantı vardı. O yüzden ağ ayarlarıyla performans arasındaki ilişki bizim için bir sır olarak kalacak.
Yalnız başka bir şey öğrenmemiz mümkün. O ilişkinin ne yöne gittiğini. Bir an için sizi bir gece ansızın kaçırıp helikopterle dağlık bir araziye bıraktığımı hayal edin. En dip noktaya bir telefon koymuşum.
Bulursanız jandarmayı arayıp kurtulabilirsiniz. Fakat zifiri karanlık iki adım öteniz görünmüyor. Ne arazinin genel yapısını ne de başlangıç noktanızı biliyorsunuz. Nasıl kurtulacaksınız?
Her sene Patreon destekçileriyle yaptığım bir aktivite bu arada. Sizi de bekliyorum. Yapabileceğiniz basit bir şey var. İleri geri sağa sola adım atarak, etrafınızı böyle yoklayarak ne kadar yükselip alçaldığınızı anlamak.
Bunu yapabilirseniz en dik iniş yönüne doğru koca bir adım atarsınız, aynısını orada tekrarlarsınız. Yani orada durur, etrafınızı kolaçan eder, oradaki en eğimli inişi seçip oradan devam edersiniz. Böyle böyle alçalacak ve bir noktada duracaksınız. Çünkü her yanınız ya düzlük olacak ya da tırmanış gerektirecek.
Tebrik ederim. Gradient descent yöntemini öğrendiniz. Gradient herhangi bir yüzeyin eğimi demek. Descent de iniş.
Belli aralıklarla en eğimli yüzeyi seçip o yönde indiniz. O kadar. Şimdi jandarmayı arayın ve kesinlikle benden şikayetçi olmadığınızı söyleyin. Keşke her öğretmen işini bu kadar sevse diye de eklersiniz.
Peki neydi bu analojinin manası? Biraz açalım. Siz neyi temsil ediyorsunuz? Siz algoritmasınız.
Bir optimizasyon algoritması arazi hata fonksiyonunu temsil ediyor. Tamamını göremeden minimum noktasını arıyoruz. Nasıl arıyoruz? Konum değiştirerek.
Bunlar da ayarlar. Bu örnekte sadece iki ayar vardı, enlem ve boylam. Sağa sola gitmek bir tanesini, ileri geri gitmek de diğerini azıcık değiştiriyor. Başlangıç konumu ne?
Eğitim başında rastgele seçilen ilk ayarlar. Şimdi gelelim arazinin eğimine. Sağa sola adım atarak etrafımızı yoklamamız bir bağlantı ağırlığını, mesela 0.8'den 0.9'a getirmek gibi bir şey.
Tüm eğitim setini o ayarla işleyip ortalama hataya bakıyoruz. Sonra bir de ağırlığı 0.7'ye çekip bakıyoruz ne oluyor. Tek bir ayar için ölçtüğümüz değişim.
Aynısını diğerleri için de tekrarlayacağız. Toplam hatada en büyük düşüşe sebep olan değişiklik kalıcı olacak. Oraya doğru adım atacağız. Ha, eğer sistem lineer olsaydı, hep aynı ayarları hep aynı yönde oynatarak hatayı düşürmek mümkün olurdu.
En azından bir noktaya kadar. Ama sistem lineer olmayınca işler karışıyor. Deminki adımda işe yaramış bir değişikliğin aynısı şimdi her şeyi eskisinden de kötü yapabilir. Yani o yönde bir adım daha atarsam bu sefer bir tepeye tırmanmış olabilirim.
O yüzden sık sık durup aynı hesapları tekrarlamam lazım. Arazi benzetmesi kafanızda oturduysa, bu yöntemin en büyük eksikliğini de şıp diye görmüşsünüzdür. Ya birden fazla vadi varsa? Yani hata fonksiyonu biraz karmışıksa, biraz şekilsizse, o zaman dibi bulmanın garantisi yok.
Araziyi gündüz gözüyle görebilseydik, uzakta bir yerde derin bir vadi olduğunu görürdük. Global minimum orası. Fakat oraya varmak için önce bu indiğimiz vadiden, lokal minimumdan çıkmamız gerek. Hatta belki bir dağ tırmanmamız gerek.
Ne yazık ki kullandığımız algoritmada yokuş çıkmak diye bir şey yok. İndiğimiz yerde kalıyoruz. O ayarlar bir daha değişmeyecek. Benzer şekilde kendimizi bir düzlükte de bulabiliriz.
Ayarları değiştirmemize rağmen performansın aynı kaldığı yerler buralar. Artmıyor da azalmıyor da. Bir süre sonra bundan iyisi olmayacak herhalde diye bırakacağız. Halbuki az biraz ilerleseydik, yani bazı ayarları değiştirmeye devam etseydik tekrar bir yamaç başlayacaktı ve hata fonksiyonunda daha da alçalmamız mümkün olacaktı.
Bu algoritma bizi böyle düzlüklerden veya yerel vadilerden çıkaramaz. En azından tek seferde çıkaramaz. Olası bir çözüm, arazinin birkaç farklı noktasından başlayarak defalarca iniş yapmak. Bir başka deyişle, farklı başlangıç değerleriyle tüm eğitim sürecini tekrarlamak.
Hatta fonksiyonu basit, konveks bir yapıysa her seferinde aynı vadide buluşuruz. Değilse bambaşka yerler keşfederiz, en alçak olanı da seçeriz. Bu sayede gerçek minimuma ulaşma ihtimalimiz artıyor. Ama hesap maliyeti de katlanarak artıyor.
Unutmayın öğrenme pahalı bir şey. Çünkü her adımda eğitim setinin tamamını baştan işliyoruz. Ne kadar çok örnek kullanıyorsak o kadar hesap maliyeti var. Ama öte yandan modelin gerçek dünyada işimize yaraması için çok örnek kullanmamız lazım.
Nasıl çıkacağız bu işin içinden? Dağdan hızlı inmenin iki yolu var. Ya adımlarımızı büyük atacağız ya da daha çabuk atacağız. Adım büyüklüğü her seferinde yapacağımız ayar değişikliğinin miktarını belirliyor.
Ufak ufak değiştirmek garantici ve yavaş. Büyük değişiklikler yapmaksa evet hızlı ama vadinin dibini ıskalama riski taşıyor. Geçen bölümdeki golf örneğini hatırlıyorsunuzdur. Topa hep hızlı vurursak deliğin bir o yanına bir bu yanına savruluruz.
Burada da aynı durum mevcut. En iyi performansı sağlayacak ayarları hep kaçırıyoruz. Adımları çabuklaştırmak biraz daha ilginç bir çözüm. Burada eğitim setini ufak parçalara bölüp her adımda rastgele bir parçayı kullanıyoruz.
Toplam örnek sayısı değişmiyor. Yine bir senelik meteoroloji verisi var elimizde ama her adımda hepsini işlemek yerine rastgele 30 günlük bir kısmını kullanıyoruz mesela. Aslında yaptığımız şey gerçek hata fonksiyonu yerine onun bir yakınsamasına bakmak, düşük çözünürlükle haline bakmak gibi. Bu arazide yaptığımız eğim hesabı çok daha kısa sürecek ve biraz indikten sonra başka bir grup örnek seçip onlar üstünden eğim hesabı yapacağız.
Tabii bu demektir ki ayağımızın altındaki arazi biraz değişmiş olacak. Ama umulan şey genel olarak vadilerin ve dağların yerlerinin pek değişmeyeceği. Tüm yol boyunca pür dikkat inmek yerine biraz yanlış yönlere doğru da olsa çabuk çabuk iniyoruz ve sonra aynı yerde buluşuyoruz. Bu tekniğe Stochastic Gradient Descent deniyor.
Stochastic biliyorsunuz fullarlıca rastgele demek. Örnekleri rastgele seçtiğimizden ötürü. Bu arada ironik bir şekilde bu teknik bizi hızlandırmakla kalmıyor, bazen daha iyi performansa bile sebep olabiliyor. Her adımda arazi biraz değiştiği için düzlüklerde takılı kalma ihtimali azalıyor.
Şimdi düzlük olan yer bir sonraki adımda biraz eğimli olabilir. Oradan inmeye devam ederim. Velhasıl olan biteni tek cümlede özetlersek, sadece yerel bilgileri kullanarak global bir optimizasyon yaptık. Tüm olası ayarları tek tek denemeden yine de en iyi ayarları bulmuş olduk.
göreceğimiz üç kavramdan ikisi gitti bile. Kaldı bir. Deminki dağ fantezimde iniş yönünü bulmak epey kolaydı. İleri geri sağa sola git bak işte değişime.
Alt tarafı iki boyutta hareket ediyorsun. Peki o hava durumu uygulamamızda kaç boyut var? Tuzak soru. Ağın detaylarını vermemiştim size.
Şimdi uyduralım bir şeyler. Diyelim ki 10 farklı meteoroloji bilgisi kullanıyoruz tahmin yapabilmek için. Bunlar onar nöronundan oluşan iki ara katmana bağlanıyorlar. Oradan da tek bir çıkış nöronuna.
Yanlış hesaplamadıysam toplam 232 farklı parametre var. 232 boyutlu bir yüzeyde hareket demek. En dik inişi nasıl hesaplayacağız? Backpropagation, bu hesabı hızlıca yapmanın bir yolu.
Analitik açıdan olan biten bir dizi türevden ibaret. Zaten ne zamanki bir şeyin değişiminden bahsediyoruz, o zaman başrolde türev vardır. Ayrıntısını merak edenler için harika bir video iliştirdim. 3Blue1Brown kıvamında ama ondan bile iyi anlatmış bence.
Burada kavramsal açıdan bakalım. Tek bir sıcaklık tahminini düşünün, bir gün için. Diyelim bu tahmin biraz düşük kaldı, hatamız var. Onu azaltmak için çıkan sonucu yükseltmemiz gerek.
Hangi ayarlardaki değişim, sonucu ne yönde ve ne kadar değiştirecek? Kritik soru bu. Bunu bulmak için en sonundan başlayacağız. Bir tane çıktığın önemimiz var ya, onun çıktısı neye bağlı?
E, aktivasyon fonksiyonuna bağlı da onu zaten sabit kabul ediyoruz. Önceki katmandan gelen sinyallere ve o bağlantılardaki ağırlıklara bağlı. Değiştirebileceğimiz faktörler bunlar. Önce ağırlıklara odaklanalım.
Diyelim ki önceki katmandaki bir nöron hiçbir sinyal göndermemiş, aktive olmamış. Öyleyse ona giden bağlantıyı kuvvetlendirmemin sonuca hiçbir etkisi olmaz. Hiç araba gelmeyen bir yere geniş bir otoyol kurmak gibi. Öte yandan bir başka nöron maksimum seviyede sinyal gönderiyorsa onun bağlantısını kuvvetlendirmemin sonuca etkisi büyük olacak.
Yaptığım hata da azalacak. İşin yarısı buydu. Şimdi gelelim diğer yarısına. Önceki katmandan gelen sinyallerin kuvvetine.
Benzer şekilde diğer her şeyi sabitleyip tek tek bunları değiştirdiğimizi düşünün. Hangi nöronların sonuca etkisi büyük olur? Çıktıya giden bağlantısı hali hazırda kuvvetli olanların tabii ki. nöron aktivasyonunda yaptığım her değişiklik daha yüksek bir katsayıyla çarpılıyor gibi olacak.
Tersine bazı bağlantılar biyolojik nöronlarda olduğu gibi negatif ağırlıktalar. Dolayısıyla o bağlantının ucundaki nöronun ateşlenmemesi lazım. Oradan gelecek her türlü sinyal benim çıktığımı düşürecek. Kısacası bir yandan tüm bağlantılar arasında en aktif nöronların bağlantılarının kuvvetlenmesi daha önemli.
Bir yandan da tüm nöronlar arasında hali hazırda en kuvvetli bağlantıları olanların aktive olmaları daha önemli. Biraz birbirinin içine geçmiş bir durum var burada. Şimdi ağırlıkları doğrudan kontrol edebiliyorum. İstediğim gibi ayarlayabiliyorum.
Ama önceki katmandaki nöronların sinyalini, onların aktivasyonunu doğrudan değiştiremiyorum. Onlar başka şeylere bağlılar. Ve neye bağlılar? Onlar da bir önceki katmanda olan bitenlere bağlılar.
Demin tek bir çıktı nöronu açısından yaptığım hesapları şimdi bu katmandaki 10 nöronun her biri için yapacağım. Böyle böyle ağın ilk katmanına kadar geri gideceğiz. Nam-ı diğer backpropagation, geriye doğru ilerleme. Yalnız bu noktada işler biraz karışıyor.
Çünkü farklı nöronlar önceki katmanlardaki ayarları farklı yönlerde oynatmak isteyecekler. Farz edin ki üçüncü katmandaki tüm nöronların ateşlenmesi nihai hatayı azaltıyor olsun. her biri için tek tek bakacağız bunların ateşlenmesi neye bağlı diye. Görüyoruz ki bunlardan bir tanesi açısından önceki katmandaki bir nöronun ateşlenmesi iyi olacakken, diğeri açısından aynı nöronun ateşlenmesi kötü bir şey.
Çünkü aralarındaki bağlantı ağırlığı negatif. Ben bu ilişkiyi bir emir komuta zincirine benzetiyorum. En sonda bir general var, emir veriyor. Bize en hızlı yukarı çıkaracak yönü bulun diyor.
Bu emir bir takım albaylara gidiyor. Onlar kendi şartlarına göre yorumluyorlar. Benim aşağı gitmem lazım, benim yukarı gitmem lazım. O emirleri altlarına iletiyorlar.
Yalnız sorun şu ki bunu her albay yapıyor. Yani her yüzbaşı tüm albaylardan gelen bu farklı emirleri dinlemek zorunda kalıyor. Ve her teğmen de tüm bu yüzbaşılardan gelen farklı farklı emirleri dinlemek zorunda. Bazısı emri verirken çok bağırmış, bazısı biraz az bağırmış.
Her parametre için tüm bu emirlerin net etkisi hesaplanıyor. Ve bu tek bir eğitim örneği içinde. Aynısını tüm eğitim örnekleri için yapıyoruz ve ortalama hatayı azaltmak için gereken net değişim hesaplanıyor. Ve sonunda 232 boyutlu bir yön tabelamız oluyor.
En dik inişi gösteren. Yalnız burada potansiyel bir problem var. Sonuca en çok etki eden ayarlar genelde çıktığıya en yakın olanlar olacak. Bazı bağlantıların etkisi sıfıra iniyor.
Çünkü onun etkili olabilmesi için bağlandığı nöronun aktif olması lazım. Hadi o oldu, sonra o sinyal gidip başka sinyallerle öyle bir şekilde birleşmeli ki bir sonraki katmandaki bir nörona doğru yönde etki etmeli. Ölme eşeğim ölme. O ayarların taa çıktı katmanına kadar etkin kalmaları çok fazla şarta bağlı.
O yüzden bazıları önemsizleşiyor. O katmanlarda pek değişim olmuyor. Bir başka deyişle o katmanlar çok yavaş öğreniyorlar. Bu şuna benziyor.
Çok boyutlu bir vadede dibi bulmaya çalışıyorsunuz ama diyelim ki ilk 50 boyutta aşırı yavaş hareket edebiliyorsunuz. Bazen şanslı çıkacaksınız. O ilk 50 boyuta gerek olmadan dibi bulursunuz. Bazen de o boyutlarda hareket etmek şart olur.
O yüzden de ağınız asla en iyi performansa ulaşamaz. Bu ciddi bir sorun ve üstesinden gelmek için bir sürü farklı teknik geliştirmişler. Duruma göre ağ yapısını değiştirmek, farklı aktivasyon fonksiyonları kullanmak, başlangıç ayarlarını tamamen rastgele değil de belli şekillerde yapmak bu riski azaltabiliyor. Detaylara girmeyeceğiz, sadece şunun altını çizmek istedim.
Karmaşık ilişkileri modellemek için karmaşık ağlar gerekiyor ya, o ağın eğitimini de çok boyutlu bir arazide keşif yapmak olarak hayal ettik. Fakat işte boyut sayısındaki artış bedavaya gelmiyor bize, başka sorunlara sebep oluyor. Velhasıl işte sinir ağa eğitimi denen şey bu. Neler yaptık?
Bir dönüp bakalım. Önce bir hata ölçüm yöntemi belirledik. Sonra ayarlarımızla yaptığımız hatalar arasında bir ilişki olduğunu ama bu ilişkinin iç yüzünü asla bilemeyeceğimizi kabul ettik. Onun yerine fonksiyonun bir noktasından başlayıp adım adım aşağı yuvarlanmasını öğrendik.
Bu noktada ağımızı artık bir sınava sokmamız lazım. Bakalım iyi öğrenmiş mi? Sınav soruları kesinlikle daha önce görmediğimiz örneklerden oluşmalı. Eğitimdeki örneklerle test etmenin hiçbir manası yok.
Zaten onlara göre optimize etmişiz ağı. Burada amaç, o optimizasyonun aşırıya kaçıp kaçmadığını anlamak. Bildiğiniz overfitting meselesi. Eğer sınav sorularındaki başarı oranı eğitim setine kıyasla düşükse, kalemi kağıda alıp en başa döneceğiz.
Ya daha çok örnekle eğiteceğiz ya da başka bir ağ yapısı kullanacağız. Belki biraz basitleştireceğiz. Yok eğer sınavda da başarılıysak, tebrikler. Artık yavrumuzu doğaya salabiliriz.
Bununla birlikte artık ben de sizi salayım. Çok boyutlu dünyalardan çıkalım. Üç boyutlu dünyamıza geri dönelim. Ailemize, arkadaşlarımıza sarılalım.
Onları optimize etmeye uğraşmadan oldukları gibi sevelim. Sosyal mesaj vermeden duramayan insan. Tüm dinleyenlere ve patronlarıma çok teşekkürler. Salih Ünal, Erman Korkut, Mr.
X, Tunç Mart, Can Karakuş, Aydın Kahraman, Seküre, Can Emrah Yaldız ve Refik Şekercoğlu'na teşekkürler. Bir sonraki bölüm tam olarak ne hakkında olacak bilmiyorum ama yapay zekadan devam edeceğiz.
Bu transkript otomatik olarak oluşturulmuştur; küçük hatalar içerebilir.