Derin Öğrenme Eğitimi: Algılayıcılardan Derin Ağlara

Yayınlanan: 2022-03-11

Son yıllarda, Yapay Zeka alanında bir canlanma oldu. Google, Microsoft ve Facebook gibi büyük oyuncuların kendi araştırma ekiplerini oluşturması ve bazı etkileyici kazanımlar elde etmesi ile akademik dünyanın ötesine yayılmıştır.

Bunlardan bazıları, sosyal ağ kullanıcıları tarafından üretilen ve çoğu analiz edilmesi gereken ham verilerin bolluğuna, gelişmiş veri bilimi çözümlerinin yükselişine ve GPGPU'lar aracılığıyla sağlanan ucuz hesaplama gücüne bağlanabilir.

Ancak bu fenomenlerin ötesinde, bu canlanma, yapay zekada, özellikle de "Derin Öğrenme" olarak bilinen makine öğreniminde yeni bir trend tarafından desteklendi. Bu eğitimde, size en basit kompozisyon biriminden başlayıp Java'da makine öğrenimi kavramlarına kadar derin öğrenmenin arkasındaki temel kavramları ve algoritmaları tanıtacağım.

(Tam açıklama için: Ayrıca burada bulunan bir Java derin öğrenme kitaplığının da yazarıyım ve bu makaledeki örnekler yukarıdaki kitaplık kullanılarak uygulanmıştır. Beğenirseniz GitHub'da ona bir yıldız vererek destekleyebilirsiniz. , minnettar olacağım. Kullanım talimatları ana sayfada mevcuttur.)

Makine Öğrenimi Üzerine Otuz Saniyelik Eğitim

Aşina değilseniz, makine öğrenimine bu girişe göz atın:

Genel prosedür aşağıdaki gibidir:

  1. Bir avuç dolusu etiketli örnek veren bazı algoritmalarımız var, örneğin 1 (“Köpek”) etiketli 10 köpek resmi ve 0 etiketli (“Köpek değil”) 10 başka şey resmi - esas olarak yapıştırdığımızı unutmayın. bu gönderi için denetimli, ikili sınıflandırmaya.
  2. Algoritma, köpeklerin resimlerini tanımlamayı "öğrenir" ve yeni bir resim beslendiğinde doğru etiketi üretmeyi umar (bir köpek resmiyse 1, aksi takdirde 0).

Bu ayar inanılmaz derecede geneldir: verileriniz belirtiler ve etiketleriniz hastalıklar olabilir; veya verileriniz elle yazılmış karakterlerin resimleri ve etiketleriniz temsil ettikleri gerçek karakterler olabilir.

Algılayıcılar: Erken Derin Öğrenme Algoritmaları

En eski denetimli eğitim algoritmalarından biri, temel bir sinir ağı yapı taşı olan algılayıcının algoritmasıdır.

Düzlemde '0' ve '1' olarak etiketlenmiş n noktamız olduğunu varsayalım. Bize yeni bir nokta verildi ve etiketini tahmin etmek istiyoruz (bu, yukarıdaki “Köpek” ve “Köpek değil” senaryosuna benzer). Bunu nasıl yaparız?

Bir yaklaşım, en yakın komşuya bakmak ve o noktanın etiketini döndürmek olabilir. Ancak bunu yapmanın biraz daha akıllıca bir yolu, etiketlenmiş verileri en iyi ayıran bir çizgi seçmek ve bunu sınıflandırıcınız olarak kullanmak olacaktır.

Girdi verilerinin doğrusal bir sınıflandırıcıya göre tasviri, derin öğrenmeye temel bir yaklaşımdır.

Bu durumda, girdi verilerinin her bir parçası bir x = ( x_1, x_2 ) vektörü olarak temsil edilecektir ve fonksiyonumuz satırın altındaysa "0", yukarısındaysa "1" gibi bir şey olacaktır.

Bunu matematiksel olarak temsil etmek için, ayırıcımızın w ağırlıklarının bir vektörü ve bir dikey kayma (veya sapma) b ile tanımlanmasına izin verin. Ardından, fonksiyonumuz girdileri ve ağırlıkları ağırlıklı toplam transfer fonksiyonuyla birleştirir:

ağırlıklı toplam transfer fonksiyonu

Bu transfer fonksiyonunun sonucu daha sonra bir etiketleme üretmek için bir aktivasyon fonksiyonuna beslenecektir. Yukarıdaki örnekte, etkinleştirme işlevimiz bir eşik kesme değeriydi (örneğin, bir değerden büyükse 1):

bu transfer fonksiyonunun sonucu

Perceptron Eğitimi

Algılayıcının eğitimi, ona birden çok eğitim örneğini beslemekten ve her biri için çıktıyı hesaplamaktan oluşur. Her numuneden sonra ağırlıklar w , istenen (hedef) ve gerçek çıktılar arasındaki fark olarak tanımlanan çıktı hatasını en aza indirecek şekilde ayarlanır. Ortalama kare hatası gibi başka hata işlevleri de vardır, ancak eğitimin temel ilkesi aynı kalır.

Tek Algılayıcı Dezavantajları

Derin öğrenmeye yönelik tek algılayıcı yaklaşımının önemli bir dezavantajı vardır: yalnızca doğrusal olarak ayrılabilir işlevleri öğrenebilir. Bu dezavantaj ne kadar önemli? Nispeten basit bir işlev olan XOR'u alın ve doğrusal bir ayırıcı tarafından sınıflandırılamayacağına dikkat edin (aşağıdaki başarısız denemeye dikkat edin):

Bu derin öğrenme yaklaşımının dezavantajı, bazı işlevlerin doğrusal bir ayırıcı tarafından sınıflandırılamamasıdır.

Bu sorunu çözmek için, ileri beslemeli sinir ağı olarak da bilinen çok katmanlı bir algılayıcı kullanmamız gerekecek: aslında, öğrenme için daha güçlü bir mekanizma oluşturmak için bu algılayıcılardan bir demet oluşturacağız.

Derin Öğrenme için İleri Beslemeli Sinir Ağları

Bir sinir ağı, farklı şekillerde birbirine bağlanan ve farklı aktivasyon fonksiyonları üzerinde çalışan algılayıcıların bir bileşimidir.

İleri beslemeli tarafsız ağ derin öğrenmesi, tek algılayıcılardan daha karmaşık bir yaklaşımdır.

Yeni başlayanlar için, aşağıdaki özelliklere sahip olan ileri beslemeli sinir ağına bakacağız:

  • Bir girdi, çıktı ve bir veya daha fazla gizli katman. Yukarıdaki şekil, 3 birimlik giriş katmanı, 4 birimlik gizli katman ve 2 birimli bir çıkış katmanına sahip bir ağı göstermektedir (birimler ve nöronlar terimleri birbirinin yerine kullanılabilir).
  • Her birim, yukarıda açıklanana benzer tek bir algılayıcıdır.
  • Girdi katmanının birimleri, gizli katmanın birimleri için girdi görevi görürken, gizli katmanın birimleri çıktı katmanının girdileridir.
  • İki nöron arasındaki her bağlantının bir w ağırlığı vardır (algılayıcı ağırlıklarına benzer).
  • Katman t'nin her birimi tipik olarak önceki katman t - 1'in her birimine bağlıdır (ancak ağırlıklarını 0'a ayarlayarak bunların bağlantısını kesebilirsiniz).
  • Giriş verilerini işlemek için, giriş vektörünü giriş katmanına "bağlarsınız", vektörün değerlerini giriş birimlerinin her biri için "çıkışlar" olarak ayarlarsınız. Bu özel durumda, ağ 3 boyutlu bir giriş vektörünü işleyebilir (3 giriş birimi nedeniyle). Örneğin, giriş vektörünüz [7, 1, 2] ise, üst giriş biriminin çıkışını 7'ye, orta birimin çıkışını 1'e vb. ayarlarsınız. Bu değerler daha sonra her bir gizli birim için ağırlıklı toplam transfer fonksiyonu (dolayısıyla ileri yayılma terimi) kullanılarak gizli birimlere ileriye doğru yayılır, bu da sırasıyla çıktılarını hesaplar (etkinleştirme fonksiyonu).
  • Çıktı katmanı, çıktılarını gizli katmanla aynı şekilde hesaplar. Çıktı katmanının sonucu ağın çıktısıdır.

Doğrusallığın Ötesinde

Algılayıcılarımızın her birinin yalnızca doğrusal bir etkinleştirme işlevi kullanmasına izin verilirse ne olur? Ardından, ağımızın nihai çıktısı, ağ boyunca toplanan bir ton farklı ağırlıkla ayarlanmış, girdilerin doğrusal bir fonksiyonu olmaya devam edecektir. Başka bir deyişle, bir grup lineer fonksiyonun lineer bileşimi hala sadece lineer bir fonksiyondur. Doğrusal aktivasyon fonksiyonlarıyla sınırlıysak, o zaman ileri beslemeli sinir ağı, kaç katmanı olursa olsun, algılayıcıdan daha güçlü değildir.

Bir grup lineer fonksiyonun lineer bileşimi hala sadece lineer bir fonksiyondur, bu nedenle çoğu sinir ağı lineer olmayan aktivasyon fonksiyonlarını kullanır.

Bu nedenle, çoğu sinir ağı, lojistik, tanh, ikili veya doğrultucu gibi doğrusal olmayan aktivasyon işlevlerini kullanır. Bunlar olmadan ağ, yalnızca girdilerinin doğrusal kombinasyonları olan işlevleri öğrenebilir.

Eğitim Algılayıcıları

Çok katmanlı algılayıcıların denetimli eğitimi için en yaygın derin öğrenme algoritması geri yayılım olarak bilinir. Temel prosedür:

  1. Bir eğitim örneği sunulur ve ağ üzerinden ileriye doğru yayılır.
  2. Çıkış hatası, tipik olarak ortalama kare hatası hesaplanır:

    ortalama kare hatası

    Burada t hedef değer ve y gerçek ağ çıktısıdır. Diğer hata hesaplamaları da kabul edilebilir, ancak MSE iyi bir seçimdir.

  3. Ağ hatası, stokastik gradyan inişi adı verilen bir yöntem kullanılarak en aza indirilir.

    Dereceli alçalma

    Gradyan inişi evrenseldir, ancak sinir ağları durumunda bu, giriş parametrelerinin bir fonksiyonu olarak eğitim hatasının bir grafiği olacaktır. Her ağırlık için optimal değer, hatanın global minimuma ulaştığı değerdir. Eğitim aşamasında, ağırlıklar küçük adımlarla (her eğitim numunesinden veya birkaç numuneden oluşan mini bir partiden sonra) her zaman global minimuma ulaşmaya çalışacak şekilde güncellenir - ancak bu kolay bir iş değildir. genellikle sağdaki gibi yerel minimumda sonuçlanır. Örneğin ağırlığın değeri 0,6 ise 0,4'e doğru değiştirilmesi gerekir.

    Bu şekil, hatanın tek bir parametreye bağlı olduğu en basit durumu temsil eder. Ancak, ağ hatası her ağ ağırlığına bağlıdır ve hata işlevi çok, çok daha karmaşıktır.

    Neyse ki, geri yayılım, çıktı hatasına göre iki nöron arasındaki her bir ağırlığı güncellemek için bir yöntem sağlar. Türetmenin kendisi oldukça karmaşıktır, ancak belirli bir düğüm için ağırlık güncellemesi aşağıdaki (basit) forma sahiptir:

    örnek form

    Burada E , çıktı hatasıdır ve w_i , i girişinin nörona olan ağırlığıdır.

    Esasen amaç, i ağırlığına göre gradyan yönünde hareket etmektir. Anahtar terim, elbette, hesaplanması her zaman kolay olmayan hatanın türevidir: Büyük bir ağın ortasındaki rastgele gizli bir düğümün rastgele bir ağırlığı için bu türevi nasıl bulursunuz?

    Cevap: geri yayılım yoluyla. Hatalar önce formülün oldukça basit olduğu (hedef ve tahmin edilen değerler arasındaki farka dayalı olarak) çıktı birimlerinde hesaplanır ve daha sonra ağ üzerinden akıllı bir şekilde geri yayılır, bu da eğitim sırasında ağırlıklarımızı verimli bir şekilde güncellememizi sağlar. (umarım) minimuma ulaşır.

Gizli Katman

Gizli katman özellikle ilgi çekicidir. Evrensel yaklaşım teoremi ile, sonlu sayıda nörona sahip tek bir gizli katman ağı, keyfi bir rastgele fonksiyona yaklaşmak için eğitilebilir. Başka bir deyişle, tek bir gizli katman, herhangi bir işlevi öğrenebilecek kadar güçlüdür. Bununla birlikte, pratikte çoklu gizli katmanlarla (yani daha derin ağlar) genellikle daha iyi öğreniriz.

Gizli katman, ağın eğitim verilerinin dahili soyut temsilini depoladığı yerdir.

Gizli katman, bir insan beyninin (büyük ölçüde basitleştirilmiş analoji) gerçek dünyanın dahili bir temsiline sahip olmasına benzer şekilde, ağın eğitim verilerinin dahili soyut temsilini depoladığı yerdir. Öğreticide ilerlerken, gizli katmanla oynamanın farklı yollarına bakacağız.

Örnek Bir Ağ

Java'da uygulanan IRIS veri kümesini testMLPSigmoidBP yöntemi aracılığıyla sınıflandıran basit (4-2-3 katmanlı) ileri beslemeli bir sinir ağı görebilirsiniz. Veri kümesi, çanak yaprağı uzunluğu, taç yaprağı uzunluğu, vb. gibi özelliklere sahip üç sınıf iris bitkisi içerir. Ağa, sınıf başına 50 örnek sağlanır. Her bir çıktı birimi veri kümesinin tek bir sınıfına karşılık gelirken, özellikler giriş birimlerine sabitlenmiştir: "1/0/0" tesisin Setosa sınıfında olduğunu, "0/1/0" ise Versicolor'u ve " 0/0/1” Virginica'yı gösterir). Sınıflandırma hatası 2/150'dir (yani 150'den 2'sini yanlış sınıflandırır).

Büyük Ağlarla İlgili Sorun

Bir sinir ağı birden fazla gizli katmana sahip olabilir: bu durumda, daha yüksek katmanlar önceki katmanların üzerine yeni soyutlamalar “inşa eder”. Ve daha önce de belirttiğimiz gibi, daha büyük ağlarla pratikte daha iyi öğrenebilirsiniz.

Ancak, gizli katmanların sayısını artırmak bilinen iki soruna yol açar:

  1. Kaybolan gradyanlar: Gittikçe daha fazla gizli katman ekledikçe, geri yayılım alt katmanlara bilgi aktarmada giderek daha az kullanışlı hale gelir. Gerçekte, bilgi geri iletildikçe, gradyanlar kaybolmaya başlar ve ağların ağırlıklarına göre küçülür.
  2. Fazla takma: makine öğrenimindeki belki de temel sorun. Kısaca, fazla uydurma, eğitim verilerini çok yakın, belki de çok karmaşık hipotezlerle uydurma olgusunu tanımlar. Böyle bir durumda, öğrenciniz eğitim verilerine gerçekten iyi uyum sağlar, ancak gerçek örnekler üzerinde çok, çok daha kötü performans gösterir.

Bu sorunları çözmek için bazı derin öğrenme algoritmalarına bakalım.

Otomatik kodlayıcılar

Başlangıç ​​düzeyindeki çoğu makine öğrenimi sınıfı, ileri beslemeli sinir ağlarıyla durma eğilimindedir. Ancak olası ağların alanı çok daha zengin - öyleyse devam edelim.

Bir otomatik kodlayıcı, tipik olarak , bir veri kümesinin sıkıştırılmış, dağıtılmış bir temsilini (kodlaması) öğrenmeyi amaçlayan ileri beslemeli bir sinir ağıdır.

Otomatik kodlayıcı, bir veri kümesinin belirli bir temsilini öğrenmeyi amaçlayan bir sinirsel derin öğrenme ağıdır.

Kavramsal olarak, ağ girişi "yeniden yaratmak" için eğitilmiştir, yani giriş ve hedef veriler aynıdır. Başka bir deyişle: girdiğiniz aynı şeyi çıkarmaya çalışıyorsunuz, ancak bir şekilde sıkıştırıyorsunuz. Bu kafa karıştırıcı bir yaklaşım, o yüzden bir örneğe bakalım.

Girdiyi Sıkıştırma: Gri Tonlamalı Görüntüler

Eğitim verilerinin 28x28 gri tonlamalı görüntülerden oluştuğunu ve her pikselin değerinin bir giriş katmanı nöronuna kenetlendiğini (yani, giriş katmanının 784 nörona sahip olacağını) varsayalım. Ardından, çıktı katmanı, giriş katmanıyla aynı sayıda birime (784) sahip olacak ve her bir çıktı birimi için hedef değer, görüntünün bir pikselinin gri tonlamalı değeri olacaktır.

Bu mimarinin ardındaki sezgi, ağın eğitim verileri ve etiketleri arasında bir "eşleme" öğrenmeyecek, bunun yerine verilerin kendi iç yapısını ve özelliklerini öğreneceğidir. (Bu nedenle, gizli katmana özellik detektörü de denir.) Genellikle, gizli birimlerin sayısı giriş/çıkış katmanlarından daha küçüktür, bu da ağı yalnızca en önemli özellikleri öğrenmeye zorlar ve bir boyutsallık azalması sağlar.

Ortadaki birkaç küçük düğümün verileri kavramsal düzeyde öğrenmesini ve kompakt bir temsil üretmesini istiyoruz.

Aslında, ortadaki birkaç küçük düğümün verileri kavramsal düzeyde gerçekten öğrenmesini ve bir şekilde girdimizin temel özelliklerini yakalayan kompakt bir temsil üretmesini istiyoruz.

Grip Hastalığı

Otomatik kodlayıcıları daha fazla göstermek için bir uygulamaya daha bakalım.

Bu durumda, grip semptomlarından oluşan basit bir veri seti kullanacağız (fikir için bu blog gönderisine bakın). İlgileniyorsanız, bu örneğin kodu testAEBackpropagation yönteminde bulunabilir.

Veri kümesi şu şekilde bozulur:

  • Altı ikili giriş özelliği vardır.
  • İlk üçü hastalığın belirtileridir. Örneğin 1 0 0 0 0 0 bu hastanın ateşinin yüksek olduğunu gösterirken, 0 1 0 0 0 0 öksürüğü, 1 1 0 0 0 0 öksürüğü ve ateşi yüksek vb.
  • Son üç özellik “karşı” belirtilerdir; Bir hastada bunlardan biri varsa, hasta olma olasılığı daha düşüktür. Örneğin 0 0 0 1 0 0 bu hastanın grip aşısı olduğunu gösterir. İki özellik kümesinin kombinasyonlarına sahip olmak mümkündür: 0 1 0 1 0 0 , öksürüğü olan bir aşı hastasını gösterir, vb.

İlk üç özellikten en az ikisine sahip olan bir hastayı hasta ve ikinci üç özelliğinden en az ikisine sahipse (bağlar sağlıklı hastalar lehine koparak) sağlıklı olarak kabul edeceğiz, örneğin:

  • 111000, 101000, 110000, 011000, 011100 = hasta
  • 000111, 001110, 000101, 000011, 000110 = sağlıklı

Altı giriş ve altı çıkış birimi, ancak yalnızca iki gizli birimi olan bir otomatik kodlayıcıyı (geri yayılım kullanarak) eğiteceğiz.

Birkaç yüz yinelemeden sonra, "hasta" örneklerin her biri makine öğrenimi ağına sunulduğunda, iki gizli birimden birinin (her "hasta" örnek için aynı birim) her zaman daha yüksek bir aktivasyon değeri sergilediğini gözlemliyoruz. diğer. Aksine, “sağlıklı” bir örnek sunulduğunda, diğer gizli birimin aktivasyonu daha yüksektir.

Makine Öğrenimine Geri Dönmek

Esasen, iki gizli birimimiz grip semptomu veri setinin kompakt bir temsilini öğrendi . Bunun öğrenmeyle nasıl bir ilişkisi olduğunu görmek için aşırı uyum sorununa dönüyoruz. Verilerin kompakt bir temsilini öğrenmek için ağımızı eğiterek, eğitim verilerine fazla uyan oldukça karmaşık bir hipotez yerine daha basit bir temsili tercih ediyoruz.

Bir bakıma bu daha basit temsilleri tercih ederek, verileri daha doğru bir şekilde öğrenmeye çalışıyoruz.

Kısıtlı Boltzmann Makineleri

Bir sonraki mantıklı adım, girdi seti üzerinden bir olasılık dağılımı öğrenebilen üretken bir stokastik sinir ağı olan Kısıtlı Boltzmann makinelerine (RBM) bakmaktır.

Makine öğreniminde Kısıtlı Botlzmann Makineleri, görünür ve gizli birimlerden oluşur.

RBM'ler gizli, görünür ve önyargı katmanından oluşur. İleri beslemeli ağlardan farklı olarak, görünür ve gizli katmanlar arasındaki bağlantılar yönsüzdür (değerler hem görünürden-gizliye hem de gizliden-görünür yönlerde yayılabilir) ve tamamen bağlantılıdır (belirli bir katmandaki her birim birbirine bağlıdır). sonraki her birim—herhangi bir katmandaki herhangi bir birimin başka bir katmana bağlanmasına izin verirsek, o zaman bir Boltzmann ( sınırlı bir Boltzmann yerine) makinesine sahip olurduk.

Standart RBM, ikili gizli ve görünür birimlere sahiptir: yani, birim aktivasyonu bir Bernoulli dağılımı altında 0 veya 1'dir, ancak diğer doğrusal olmayan değişkenler vardır.

Araştırmacılar bir süredir RBM'ler hakkında bilgi sahibi olsalar da, kontrastlı diverjans denetimsiz eğitim algoritmasının son tanıtımı ilgiyi yeniledi.

zıtlık

Tek adımlı karşılaştırmalı sapma algoritması (CD-1) şu şekilde çalışır:

  1. Olumlu aşama :
    • Bir girdi örneği v , girdi katmanına kenetlenir.
    • v , ileri beslemeli ağlara benzer şekilde gizli katmana yayılır. Gizli katman aktivasyonlarının sonucu h olur.
  2. Negatif aşama :
    • h'yi görünür katmana geri yayın ve sonuç v' (görünür ve gizli katmanlar arasındaki bağlantılar yönsüzdür ve bu nedenle her iki yönde de harekete izin verir).
    • Aktivasyon sonucu h' ile yeni v'yi gizli katmana geri yayın.
  3. Ağırlık güncellemesi :

    ağırlık güncellemesi

    Burada a öğrenme oranıdır ve v , v' , h , h' ve w vektörlerdir.

Algoritmanın arkasındaki sezgi, pozitif fazın ( h verilen v ), ağın gerçek dünya verilerinin dahili temsilini yansıtmasıdır. Bu arada, negatif faz, bu dahili temsile ( v' verilen h ) dayalı olarak verileri yeniden yaratma girişimini temsil eder. Ana amaç, üretilen verilerin mümkün olduğunca gerçek dünyaya yakın olmasıdır ve bu, ağırlık güncelleme formülüne yansıtılır.

Başka bir deyişle, ağın girdi verilerinin nasıl temsil edilebileceğine dair bir algısı vardır, bu nedenle verileri bu algıya dayalı olarak yeniden üretmeye çalışır. Reprodüksiyonu gerçeğe yeterince yakın değilse bir ayar yapar ve tekrar dener.

Gribe dönüş

Karşılaştırmalı sapmayı göstermek için, daha önce olduğu gibi aynı semptom veri setini kullanacağız. Test ağı, altı görünür ve iki gizli birimi olan bir RBM'dir. Ağı, görünür katmana kenetlenmiş semptomlar v ile kontrastlı sapma kullanarak eğiteceğiz. Test sırasında semptomlar tekrar görünür katmana sunulur; daha sonra veriler gizli katmana yayılır. Gizli birimler, otomatik kodlayıcıya çok benzer bir mimari olan hasta/sağlıklı durumu temsil eder (verileri görünürden gizli katmana yayar).

Birkaç yüz yinelemeden sonra, otomatik kodlayıcılarla aynı sonucu gözlemleyebiliriz: "hasta" numunelerden herhangi biri sunulduğunda gizli birimlerden biri daha yüksek bir aktivasyon değerine sahipken, diğeri "sağlıklı" numuneler için her zaman daha aktiftir.

Bu örneği, testContrastiveDivergence yönteminde çalışırken görebilirsiniz.

Derin Ağlar

Artık otomatik kodlayıcıların ve RBM'lerin gizli katmanlarının etkili özellik algılayıcıları olarak hareket ettiğini gösterdik; ancak bu özellikleri doğrudan kullanabilmemiz nadirdir. Aslında, yukarıdaki veri seti bir kuraldan çok bir istisnadır. Bunun yerine, tespit edilen bu özellikleri dolaylı olarak kullanmanın bir yolunu bulmamız gerekiyor.

Şans eseri bu yapıların üst üste dizilerek derin ağlar oluşturabileceği keşfedildi. Bu ağlar, klasik geri yayılımla ilişkili kaybolan gradyan ve aşırı uyum sorunlarının üstesinden gelmeye yardımcı olmak için her seferinde bir katman olmak üzere açgözlü bir şekilde eğitilebilir.

Ortaya çıkan yapılar genellikle oldukça güçlüdür ve etkileyici sonuçlar verir. Örneğin, etiketlenmemiş verilere dayalı olarak insan ve kedi yüzü algılamayı "öğrenmek" için özel türde derin otomatik kodlayıcılar kullandıkları Google'ın ünlü "kedi" makalesini ele alalım.

Hadi daha yakından bakalım.

Yığılmış Otomatik Kodlayıcılar

Adından da anlaşılacağı gibi, bu ağ birden çok yığılmış otomatik kodlayıcıdan oluşur.

Yığılmış Otomatik Kodlayıcılar, makine öğrenimi sonuçlarına katkıda bulunan bir dizi girdi, çıktı ve gizli katmana sahiptir.

Otomatik kodlayıcı t'nin gizli katmanı, otomatik kodlayıcı t + 1 için bir giriş katmanı görevi görür. İlk otomatik kodlayıcının giriş katmanı, tüm ağ için giriş katmanıdır. Açgözlü katman bazında eğitim prosedürü şu şekilde çalışır:

  1. İlk otomatik kodlayıcıyı ( t=1 veya yukarıdaki şekildeki kırmızı bağlantıları, ancak ek bir çıktı katmanıyla) mevcut tüm eğitim verileriyle geri yayılım yöntemini kullanarak ayrı ayrı eğitin.
  2. İkinci otomatik kodlayıcıyı eğitin t=2 (yeşil bağlantılar). t=2'nin girdi katmanı t=1'in gizli katmanı olduğundan, artık t=1'in çıktı katmanıyla ilgilenmiyoruz ve onu ağdan kaldırıyoruz. Eğitim, bir girdi örneğini t=1 girdi katmanına kenetleyerek başlar, bu da t=2 çıktı katmanına ileri doğru yayılır. Daha sonra, t=2'nin ağırlıkları (giriş-gizli ve gizli-çıktı) geri yayılım kullanılarak güncellenir. t=2 , t=1'e benzer şekilde tüm eğitim örneklerini kullanır.
  3. Tüm katmanlar için önceki prosedürü tekrarlayın (yani, önceki otomatik kodlayıcının çıktı katmanını kaldırın, başka bir otomatik kodlayıcıyla değiştirin ve geri yayılımla eğitin).
  4. 1-3 arasındaki adımlar ön eğitim olarak adlandırılır ve ağırlıkları uygun şekilde başlatılmış halde bırakır. Ancak, girdi verileri ile çıktı etiketleri arasında eşleme yoktur. Örneğin, ağ el yazısı rakamların görüntülerini tanımak için eğitilmişse, son özellik algılayıcıdan (yani, son otomatik kodlayıcının gizli katmanından) birimleri görüntünün rakam tipine eşlemek hala mümkün değildir. Bu durumda en yaygın çözüm, son katmana (mavi bağlantılar) bir veya daha fazla tam bağlı katman(lar) eklemektir. Tüm ağ artık çok katmanlı bir algılayıcı olarak görülebilir ve geri yayılım kullanılarak eğitilir (bu adıma ince ayar da denir).

Yığılmış otomatik kodlayıcılar, bu durumda, bir ağın ağırlıklarını başlatmak için etkili bir ön eğitim yöntemi sağlamakla ilgilidir ve sizi eğitmeye (veya ince ayara ) hazır olan karmaşık, çok katmanlı bir algılayıcı ile bırakır.

Derin İnanç Ağları

Otomatik kodlayıcılarda olduğu gibi, derin inanç ağları (DBN'ler) olarak bilinen bir sınıf oluşturmak için Boltzmann makinelerini de yığınlayabiliriz.

Derin inanç ağları, bir dizi Boltzmann makinesinden oluşur.

Bu durumda, RBM t'nin gizli katmanı, RBM t +1 için görünür bir katman görevi görür. İlk RBM'nin giriş katmanı, tüm ağ için giriş katmanıdır ve açgözlü katman bazında ön eğitim şu şekilde çalışır:

  1. Tüm eğitim örnekleriyle karşılaştırmalı sapma kullanarak ilk RBM t=1'i eğitin.
  2. İkinci RBM'yi eğitin t=2 . t=2 için görünür katman, t=1'in gizli katmanı olduğundan, eğitim, giriş örneğini, t=1'in gizli katmanına ileri doğru yayılan t =1'in görünür katmanına sıkıştırarak başlar. Bu veriler daha sonra t=2 için karşılaştırmalı sapma eğitimini başlatmaya hizmet eder.
  3. Tüm katmanlar için önceki prosedürü tekrarlayın.
  4. Yığılmış otomatik kodlayıcılara benzer şekilde, ön eğitimden sonra ağ, bir veya daha fazla tamamen bağlı katmanın son RBM gizli katmanına bağlanmasıyla genişletilebilir. Bu, daha sonra geri yayılım kullanılarak ince ayarlanabilen çok katmanlı bir algılayıcı oluşturur.

Bu prosedür, yığılmış otomatik kodlayıcılarınkine benzer, ancak otomatik kodlayıcıların yerini RBM'ler ve geri yayılımın yerini kontrastlı sapma algoritması almıştır.

(Not: Yığılmış otomatik kodlayıcılar veya derin inanç ağları oluşturma ve eğitme hakkında daha fazla bilgi için buradaki örnek kodu inceleyin.)

Evrişimsel Ağlar

Son bir derin öğrenme mimarisi olarak, görüntü tanımaya çok uygun olan, özellikle ilginç ve özel bir ileri beslemeli ağ sınıfı olan evrişimli ağlara bir göz atalım.

Evrişimli ağlar, derin öğrenme ileri beslemeli ağların özel bir sınıfıdır.
DeepLearning.net aracılığıyla görüntü

Evrişimli ağların gerçek yapısına bakmadan önce, önce bir görüntü filtresi veya ilişkili ağırlıklarla kare bir bölge tanımlarız. Giriş görüntüsünün tamamına bir filtre uygulanır ve genellikle birden çok filtre uygularsınız. Örneğin, belirli bir giriş görüntüsüne dört adet 6x6 filtre uygulayabilirsiniz. Ardından, 1,1 koordinatlarına sahip çıktı pikseli, sol üst köşesi 1,1 olan giriş piksellerinin 6x6 karesinin ve filtrenin ağırlıklarının (6x6 kare olan) ağırlıklı toplamıdır. Çıktı pikseli 2,1, sol üst köşesi 2,1 olan giriş karesinin ve benzerinin sonucudur.

Bu kapsamda, bu ağlar aşağıdaki özelliklerle tanımlanır:

  • Evrişimli katmanlar , girişe bir dizi filtre uygular. Örneğin, görüntünün ilk evrişim katmanı dört 6x6 filtreye sahip olabilir. Görüntü boyunca uygulanan bir filtrenin sonucuna özellik haritası (FM) denir ve özellik haritası sayısı filtre sayısına eşittir. Önceki katman da evrişimliyse, filtreler tüm FM'lerine farklı ağırlıklarla uygulanır, böylece her bir FM girişi her bir FM çıkışına bağlanır. Görüntü boyunca paylaşılan ağırlıkların ardındaki sezgi, özelliklerin konumlarından bağımsız olarak algılanacağı, filtrelerin çokluğu ise her birinin farklı özellik kümesini algılamasına izin vermesidir.
  • Alt örnekleme katmanları girdinin boyutunu azaltır. Örneğin, girdi 32x32'lik bir görüntüden oluşuyorsa ve katman 2x2'lik bir alt örnekleme bölgesine sahipse, çıktı değeri 16x16'lık bir görüntü olur, bu da girdi görüntüsünün 4 pikselinin (her biri 2x2 kare) tek bir çıktıda birleştirildiği anlamına gelir. piksel. Alt örneklemenin birden fazla yolu vardır, ancak en popülerleri maksimum havuzlama, ortalama havuzlama ve stokastik havuzlamadır.
  • Son alt örnekleme (veya evrişimli) katman genellikle, sonuncusu hedef verileri temsil eden bir veya daha fazla tamamen bağlı katmana bağlanır.
  • Eğitim, alt örnekleme katmanlarını hesaba katan ve bu filtrenin uygulandığı tüm değerlere dayalı olarak evrişimli filtre ağırlıklarını güncelleyen değiştirilmiş geri yayılım kullanılarak gerçekleştirilir.

MNIST veri setinde (el yazısı harflerin gri tonlamalı görüntüleri) burada, özellikle testLeNet* yöntemlerinde eğitilmiş (geri yayılımlı) birkaç evrişimsel ağ örneğini görebilirsiniz (yaklaşık %2'lik düşük bir hata oranına ulaştığı için testLeNetTiny2'yi öneririm ) nispeten kısa bir süre içinde). Burada benzer bir ağın güzel bir JavaScript görselleştirmesi de var.

uygulama

Artık en yaygın sinir ağı varyantlarını ele aldığımıza göre, bu derin öğrenme yapılarının uygulanması sırasında ortaya çıkan zorluklar hakkında biraz yazacağımı düşündüm.

Genel olarak konuşursak, bir Derin Öğrenme kitaplığı oluşturma amacım, aşağıdaki kriterleri karşılayan sinir ağı tabanlı bir çerçeve oluşturmaktı (ve hala da öyle):

  • Çeşitli modelleri temsil edebilen ortak bir mimari (örneğin yukarıda gördüğümüz sinir ağlarındaki tüm değişkenler).
  • Farklı eğitim algoritmalarını kullanma becerisi (geri yayılım, kontrastlı sapma, vb.).
  • İyi performans.

Bu gereksinimleri karşılamak için yazılımın tasarımına katmanlı (veya modüler) bir yaklaşım getirdim.

Yapı

Temel bilgilerle başlayalım:

  • NeuralNetworkImpl, tüm sinir ağı modelleri için temel sınıftır.
  • Her ağ bir dizi katman içerir.
  • Her katmanın bir bağlantı listesi vardır; burada bir bağlantı, ağın yönlendirilmiş bir döngüsel olmayan grafiği olacak şekilde iki katman arasındaki bir bağlantıdır.

Bu yapı, klasik ileri beslemeli ağların yanı sıra RBM'ler ve ImageNet gibi daha karmaşık mimariler için kullanılabilecek kadar çeviktir.

Ayrıca bir katmanın birden fazla ağın parçası olmasına izin verir. Örneğin, bir Derin İnanç Ağındaki katmanlar aynı zamanda ilgili RBM'lerindeki katmanlardır.

Ek olarak, bu mimari, bir DBN'nin, hem sezgisel olarak güzel hem de programatik olarak uygun olan, ön eğitim aşaması sırasında yığılmış RBM'lerin bir listesi ve ince ayar aşaması sırasında ileri beslemeli bir ağ olarak görüntülenmesine izin verir.

Veri Yayılımı

Bir sonraki modül, iki adımlı bir süreç olan ağ üzerinden veri yayılımıyla ilgilenir:

  1. Katmanların sırasını belirleyin. Örneğin, çok katmanlı bir algılayıcıdan sonuçları elde etmek için, veriler giriş katmanına “kenetlenir” (dolayısıyla bu, hesaplanacak ilk katmandır) ve çıkış katmanına kadar yayılır. Geri yayılım sırasında ağırlıkları güncellemek için, çıktı hatasının çıktı katmanından başlayarak her katmana genişlik-birinci sırada yayılması gerekir. Bu, ağın grafik yapısından yararlanan ve farklı grafik geçiş yöntemleri kullanan LayerOrderStrategy'nin çeşitli uygulamaları kullanılarak elde edilir. Bazı örnekler, genişlik öncelikli stratejiyi ve belirli bir katmanın hedeflemesini içerir. Sıra aslında katmanlar arasındaki bağlantılar tarafından belirlenir, bu nedenle stratejiler sıralı bir bağlantı listesi döndürür.
  2. Aktivasyon değerini hesaplayın. Her katman, bağlantıların listesini (önceki adımdan) ve giriş değerlerini (diğer katmanlardan) alan ve ortaya çıkan aktivasyonu hesaplayan ilişkili bir ConnectionCalculator'a sahiptir. Örneğin, basit bir sigmoidal ileri beslemeli ağda, gizli katmanın Bağlantı Hesaplayıcısı, giriş ve önyargı katmanlarının (sırasıyla giriş verileri ve 1s dizisidir) değerlerini ve birimler arasındaki ağırlıkları (tamamen bağlı olması durumunda) alır. katmanlar, ağırlıklar aslında bir Matrix olarak FullyConnected bağlantısında depolanır), ağırlıklı toplamı hesaplar ve sonucu sigmoid işlevine besler. Bağlantı hesaplayıcıları, çeşitli aktarım (örneğin, ağırlıklı toplam, evrişimli) ve etkinleştirme (örneğin, çok katmanlı algılayıcı için lojistik ve tanh, RBM için ikili) işlevlerini uygular. Çoğu, Aparapi kullanılarak bir GPU üzerinde yürütülebilir ve mini toplu eğitimle kullanılabilir.

Aparapi ile GPU Hesaplama

Daha önce de belirttiğim gibi, sinir ağlarının son yıllarda yeniden canlanmasının nedenlerinden biri, eğitim yöntemlerinin paralelliğe son derece elverişli olması ve GPGPU kullanımıyla eğitimi önemli ölçüde hızlandırmanıza olanak sağlamasıdır. Bu durumda GPU desteği eklemek için Aparapi kütüphanesi ile çalışmayı tercih ettim.

Aparapi, bağlantı hesaplayıcılarına bazı önemli kısıtlamalar getirir:

  • İlkel veri türlerinin yalnızca tek boyutlu dizilerine (ve değişkenlerine) izin verilir.
  • Yalnızca Aparapi Kernel sınıfının üye yöntemlerinin GPU yürütülebilir kodundan çağrılmasına izin verilir.

Bu nedenle, verilerin çoğu (ağırlıklar, girdi ve çıktı dizileri), dahili olarak tek boyutlu kayan diziler kullanan Matrix örneklerinde depolanır. Tüm Aparapi bağlantı hesaplayıcıları, AparapiWeightedSum (tamamen bağlı katmanlar ve ağırlıklı toplam giriş işlevleri için), AparapiSubsampling2D (alt örnekleme katmanları için) veya AparapiConv2D (konvolüsyon katmanları için) kullanır. Bu sınırlamalardan bazıları, Heterojen Sistem Mimarisi'nin tanıtılmasıyla aşılabilir. Aparapi also allows to run the same code on both CPU and GPU.

Eğitim

The training module implements various training algorithms. It relies on the previous two modules. For example, BackPropagationTrainer (all the trainers are using the Trainer base class) uses feedforward layer calculator for the feedforward phase and a special breadth-first layer calculator for propagating the error and updating the weights.

My latest work is on Java 8 support and some other improvements, will soon be merged into master.

Çözüm

The aim of this Java deep learning tutorial was to give you a brief introduction to the field of deep learning algorithms, beginning with the most basic unit of composition (the perceptron) and progressing through various effective and popular architectures, like that of the restricted Boltzmann machine.

The ideas behind neural networks have been around for a long time; but today, you can't step foot in the machine learning community without hearing about deep networks or some other take on deep learning. Hype shouldn't be mistaken for justification, but with the advances of GPGPU computing and the impressive progress made by researchers like Geoffrey Hinton, Yoshua Bengio, Yann LeCun and Andrew Ng, the field certainly shows a lot of promise. There's no better time to get familiar and get involved like the present.

Appendix: Resources

If you're interested in learning more, I found the following resources quite helpful during my work:

  • DeepLearning.net: a portal for all things deep learning. It has some nice tutorials, software library and a great reading list.
  • An active Google+ community.
  • Two very good courses: Machine Learning and Neural Networks for Machine Learning, both offered on Coursera.
  • The Stanford neural networks tutorial.
Related: Schooling Flappy Bird: A Reinforcement Learning Tutorial