Bir Sinir Ağı Eğitimi
Şimdi bir sinir ağını nasıl eğiteceğimizi öğreneceğiz. Ayrıca Python Derin Öğrenme'de geri yayılma algoritmasını ve geriye doğru geçişi de öğreneceğiz.
İstenilen çıktıyı elde etmek için bir sinir ağının ağırlıklarının optimal değerlerini bulmalıyız. Bir sinir ağını eğitmek için yinelemeli gradyan iniş yöntemini kullanıyoruz. Başlangıçta ağırlıkların rastgele başlatılmasıyla başlıyoruz. Rastgele başlatmadan sonra, ileri yayılma süreciyle verilerin bazı alt kümeleri üzerinde tahminler yapar, karşılık gelen maliyet fonksiyonu C'yi hesaplar ve her ağırlık w'yi dC / dw ile orantılı bir miktarda güncelleriz, yani maliyet fonksiyonlarının türevi ağırlık. Orantılılık sabiti, öğrenme hızı olarak bilinir.
Gradyanlar, geri yayılma algoritması kullanılarak verimli bir şekilde hesaplanabilir. Geriye doğru yayılmanın veya geriye doğru yayılmanın temel gözlemi, farklılaşma zincir kuralı nedeniyle, sinir ağındaki her bir nörondaki gradyanın, nöronlardaki gradyan kullanılarak hesaplanabilmesidir. Bu nedenle, gradyanları geriye doğru hesaplıyoruz, yani önce çıktı katmanının gradyanlarını, ardından en üstteki gizli katmanı, ardından önceki gizli katmanı, vb. Hesaplayarak girdi katmanında sonlandırıyoruz.
Geri yayılma algoritması, çoğunlukla, her bir nöronun hesaplama grafiğindeki birçok düğüme genişletildiği ve toplama, çarpma gibi basit bir matematiksel işlem gerçekleştirdiği bir hesaplama grafiği fikri kullanılarak uygulanır. Hesaplama grafiğinin kenarlarında ağırlık yoktur; tüm ağırlıklar düğümlere atanır, böylece ağırlıklar kendi düğümlerine dönüşür. Geriye doğru yayılma algoritması daha sonra hesaplama grafiğinde çalıştırılır. Hesaplama tamamlandığında, güncelleme için yalnızca ağırlık düğümlerinin gradyanları gereklidir. Degradelerin geri kalanı atılabilir.
Gradyan İniş Optimizasyon Tekniği
Ağırlıkları neden oldukları hataya göre ayarlayan yaygın olarak kullanılan bir optimizasyon işlevine "gradyan inişi" denir.
Gradyan, eğimin başka bir adıdır ve bir xy grafiğindeki eğim, iki değişkenin birbiriyle nasıl ilişkili olduğunu temsil eder: yatay mesafenin üzerindeki yükselme, zamandaki değişime göre mesafedeki değişim, vb. Bu durumda, eğim şu şekildedir: ağ hatası ile tek bir ağırlık arasındaki oran; yani, ağırlık değiştikçe hata nasıl değişir?
Daha kesin bir ifadeyle, hangi ağırlığın en az hata verdiğini bulmak istiyoruz. Giriş verilerinde bulunan sinyalleri doğru şekilde temsil eden ve bunları doğru bir sınıflandırmaya çeviren ağırlığı bulmak istiyoruz.
Bir sinir ağı öğrendikçe, birçok ağırlığı yavaşça ayarlar, böylece sinyali doğru anlamla eşleştirebilirler. Ağ Hatası ile bu ağırlıkların her biri arasındaki oran, bir ağırlıktaki küçük bir değişikliğin hatada küçük bir değişikliğe ne ölçüde neden olduğunu hesaplayan bir türevdir, dE / dw.
Her ağırlık, birçok dönüşümü içeren derin bir ağda yalnızca bir faktördür; ağırlığın sinyali birkaç katman üzerinden etkinleştirmelerden ve toplamlardan geçer, bu nedenle ağ etkinleştirmeleri ve çıktıları üzerinden geri çalışmak için analiz zincir kuralını kullanırız.Bu bizi söz konusu ağırlığa ve genel hatayla ilişkisine götürür.
İki değişken verildiğinde, hata ve ağırlık, üçüncü bir değişken tarafından aracılık edilir, activationağırlığın geçtiği yer. Önce aktivasyondaki bir değişikliğin Hatadaki bir değişikliği nasıl etkilediğini ve ağırlıktaki bir değişikliğin aktivasyondaki bir değişikliği nasıl etkilediğini hesaplayarak ağırlıktaki bir değişikliğin hatadaki bir değişikliği nasıl etkilediğini hesaplayabiliriz.
Derin öğrenmedeki temel fikir bundan başka bir şey değildir: Hatayı daha fazla azaltamayana kadar ürettiği hataya yanıt olarak bir modelin ağırlıklarını ayarlamak.
Derin ağ, gradyan değeri küçükse yavaş ve değer yüksekse hızlı eğitilir. Eğitimdeki herhangi bir yanlışlık, yanlış çıktılara yol açar. Ağları çıktıdan girdiye geri döndürme sürecine geri yayılma veya geri propagasyon denir. İleriye doğru yayılmanın girdiyle başladığını ve ileriye doğru işlediğini biliyoruz. Back prop, gradyanı sağdan sola hesaplayarak ters / tersi yapar.
Bir gradyanı her hesapladığımızda, o noktaya kadar önceki tüm gradyanları kullanırız.
Çıktı katmanındaki bir düğümden başlayalım. Kenar, bu düğümdeki gradyanı kullanır. Gizli katmanlara geri döndüğümüzde, daha karmaşık hale geliyor. 0 ile 1 arasındaki iki sayının çarpımı size daha küçük bir sayı verir. Gradyan değeri küçülmeye devam ediyor ve sonuç olarak arka pervanenin eğitilmesi çok zaman alıyor ve doğruluk zarar görüyor.
Derin Öğrenme Algoritmalarındaki Zorluklar
Hem sığ sinir ağları hem de derin sinir ağları için aşırı uyum ve hesaplama süresi gibi belirli zorluklar vardır. DNN'ler aşırı uyumdan etkilenir çünkü ek soyutlama katmanlarının kullanımı, eğitim verilerinde nadir görülen bağımlılıkları modellemelerine olanak tanır.
RegularizationAşırı uyumla mücadele etmek için eğitim sırasında okulu bırakma, erken durdurma, veri artırma, aktarım öğrenme gibi yöntemler uygulanır. Düzenlemeyi bırakma, eğitim sırasında birimleri gizli katmanlardan rastgele çıkararak nadir görülen bağımlılıklardan kaçınmaya yardımcı olur. DNN'ler boyut, yani katman sayısı ve katman başına birim sayısı, öğrenme hızı ve başlangıç ağırlıkları gibi çeşitli eğitim parametrelerini dikkate alır. En uygun parametreleri bulmak, yüksek zaman maliyeti ve hesaplama kaynakları nedeniyle her zaman pratik değildir. Gruplama gibi birkaç hack işlemi, hesaplamayı hızlandırabilir. GPU'ların büyük işlem gücü, gereken matris ve vektör hesaplamaları GPU'larda iyi uygulandığından eğitim sürecine önemli ölçüde yardımcı oldu.
Bırakmak
Bırakma, sinir ağları için popüler bir düzenleme tekniğidir. Derin sinir ağları, özellikle aşırı uyuma eğilimlidir.
Şimdi bırakmanın ne olduğunu ve nasıl çalıştığını görelim.
Derin Öğrenmenin öncülerinden Geoffrey Hinton'un sözleriyle, 'Derin bir sinir ağınız varsa ve bu fazla uygun değilse, muhtemelen daha büyük bir tane kullanmalı ve bırakmayı kullanmalısınız'.
Bırakma, gradyan inişinin her yinelemesi sırasında rastgele seçilen bir dizi düğüm düşürdüğümüz bir tekniktir. Bu, bazı düğümleri yokmuş gibi rastgele görmezden geldiğimiz anlamına gelir.
Her nöron q olasılığı ile tutulur ve 1-q olasılığı ile rastgele düşer. Q değeri, sinir ağındaki her katman için farklı olabilir. Gizli katmanlar için 0,5 ve giriş katmanı için 0 değeri çok çeşitli görevlerde iyi çalışır.
Değerlendirme ve tahmin sırasında, herhangi bir bırakma kullanılmaz. Her nöronun çıktısı q ile çarpılır, böylece bir sonraki katmana giriş aynı beklenen değere sahip olur.
Dropout'un arkasındaki fikir şu şekildedir - Bırakma düzenlemesi olmayan bir sinir ağında, nöronlar birbirleri arasında aşırı uyuma yol açan bir bağımlılık geliştirir.
Uygulama hilesi
TensorFlow ve Pytorch gibi kütüphanelerde rastgele seçilen nöronların çıktısını 0 olarak tutarak bırakma uygulanır. Yani nöron var olsa da çıktısının üzerine 0 yazılır.
Erken Durma
Gradyan iniş adı verilen yinelemeli bir algoritma kullanarak sinir ağlarını eğitiyoruz.
Erken durdurmanın arkasındaki fikir sezgiseldir; Hata artmaya başladığında eğitimi durdururuz. Burada, hata ile, hiper parametreleri ayarlamak için kullanılan eğitim verilerinin bir parçası olan doğrulama verilerinde ölçülen hatayı kastediyoruz. Bu durumda, hiper parametre durdurma ölçütüdür.
Veri Büyütme
Elimizdeki verinin kuantumunu arttırdığımız veya var olan verileri kullanarak ve üzerinde bazı dönüşümler uygulayarak onu büyüttüğümüz süreç. Kullanılan tam dönüşümler, başarmayı planladığımız göreve bağlıdır. Dahası, sinir ağına yardımcı olan dönüşümler mimarisine bağlıdır.
Örneğin, nesne sınıflandırması gibi birçok bilgisayar görüşü görevinde, etkili bir veri artırma tekniği, orijinal verilerin kırpılmış veya çevrilmiş sürümleri olan yeni veri noktaları eklemektir.
Bir bilgisayar bir görüntüyü girdi olarak kabul ettiğinde, bir dizi piksel değeri alır. Tüm görüntünün 15 piksel sola kaydırıldığını varsayalım. Farklı yönlerde birçok farklı kayma uygulayarak, orijinal veri kümesinin boyutunun birçok katı genişletilmiş bir veri kümesiyle sonuçlanır.
Transfer Öğrenimi
Önceden eğitilmiş bir model alma ve modeli kendi veri setimizle "ince ayar yapma" sürecine aktarım öğrenimi denir. Bunu yapmanın birkaç yolu vardır: Aşağıda birkaç yol açıklanmıştır -
Önceden eğitilmiş modeli büyük bir veri kümesi üzerinde eğitiyoruz. Ardından, ağın son katmanını kaldırıp, rastgele ağırlıklara sahip yeni bir katmanla değiştiriyoruz.
Daha sonra diğer tüm katmanların ağırlıklarını donduruyoruz ve ağı normal şekilde eğitiyoruz. Burada katmanları dondurmak, gradyan inişi veya optimizasyonu sırasında ağırlıkları değiştirmez.
Bunun arkasındaki konsept, önceden eğitilmiş modelin bir özellik çıkarıcı olarak hareket etmesi ve yalnızca son katmanın mevcut görev için eğitilmesidir.