Sinir Ağı'ndaki girişler nasıl dönüştürülür ve faydalı çıktılar çıkarılır?


9

Adam Geitgey'in makine öğrenimi bloguna rastladığımdan beri sinir ağlarını anlamaya çalışıyorum . Konuyla ilgili olabildiğince çok okudum (kavrayabileceğim) ve tüm geniş kavramları ve bazı çalışmaları (matematikte çok zayıf olmasına rağmen), nöronlar, sinapslar, ağırlıklar, maliyet fonksiyonları, geri yayılımı anladığımı düşünüyorum Ancak, gerçek dünyadaki problemleri sinir ağı çözümüne nasıl çevireceğimizi anlayamadım.

Durumda, Adam Geitgey örnek bir kullanım, yatak odası sayısı içeren bir veri seti verildiğinde bir ev fiyat tahmin sistemi , Sq. feet , Mahalle ve Satış fiyatı gibi bir evin fiyat tahmin edebilmek için bir sinir ağı eğitebilirsiniz. Bununla birlikte, kodda olası bir çözümü uygulamada yetersiz kalıyor. Bir örnek olarak, en yakın ağırlığını nasıl uygulayacağınızı gösteren bir işlevdir:

def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood):
  price = 0

  # a little pinch of this
  price += num_of_bedrooms * 1.0

  # and a big pinch of that
  price += sqft * 1.0

  # maybe a handful of this
  price += neighborhood * 1.0

  # and finally, just a little extra salt for good measure
  price += 1.0

  return price 

Diğer kaynaklar daha yoğun matematik ve anlayabildiğim bulabildiğim tek temel kod örneği gibi görünüyor (yani, tüm şarkı söyleme, tüm dans eden görüntü sınıflandırma kod tabanı) bir sinir ağını XOR olarak eğiten bir uygulamadır kapısı sadece 1 ve 0'larda.

Bu yüzden bilgimde bir köprü oluşturamayacağım bir boşluk var. Konut fiyat tahmini sorununa geri dönersek , veriler sinir ağına beslenmek için nasıl uygun hale getirir? Örneğin:

  • Yatak odası sayısı: 3
  • Sq. ayaklar: 2000
  • Yakın çevre: Normaltown
  • Satış fiyatı: 250.000 $

Sayılar olduğu için 3 ve 2000'i doğrudan sinir ağına besleyebilir misiniz ? Yoksa onları başka bir şeye dönüştürmeniz mi gerekiyor? Benzer şekilde Normaltown değeri, bu bir dize, bunu bir sinir ağının anlayabileceği bir değere nasıl çevirirsiniz ? Veriler boyunca tutarlı olduğu sürece, bir dizin gibi bir sayı seçebilir misiniz?

Katmanlar arasında geçen sayıların 0 ila 1 veya -1 ila 1 olduğunu gördüğüm sinir ağı örneklerinin çoğu Peki, işlemin sonunda çıktı değerini 185.000 dolar gibi kullanılabilir bir şeye nasıl dönüştürüyorsunuz ?

Ev fiyat tahmini örneğinin, sadece üç veri noktasına büyük ölçüde basitleştirildiği göz önüne alındığında, muhtemelen özellikle yararlı bir sorun olmadığını biliyorum. Ama sadece bu engeli aşabilsem ve sahte gerçek hayat verilerini kullanarak eğiten ve sahte bir gerçek hayat cevabı veren son derece basit bir uygulama yazabilirsem, arkasını kıracağım ve tekmeleyebileceğimden daha fazla ve makine öğrenimi hakkında daha fazla bilgi edinin.

Yanıtlar:


10

Bu, bir YSA kodlamaya ilk kez çalışırken kendimle güreştiğim iyi bir soru.

Aşağıda iyi bir genel amaçlı çözüm ve iyi davranışlı sayısal verileri tahmin etmeye çalışmak için kodumda uyguladığım çözüm. Verileriniz iyi davranmıyorsa (yani aykırı değerlerle doluysa), girişleri ve çıkışları normalleştirmek için daha fazla iş yapmanız gerekebilir. Daha gelişmiş yöntemlerden bazıları burada açıklanmaktadır .

Not: Etkinleştirme işleviniz olarak f (x) = tanh (x) kullandığınızı varsayacağım. Değilse, yine de bunu okuduktan sonra verilerinizi nasıl normalleştireceğinizi düşünebilmelisiniz.

Giriş verileri nasıl hazırlanır:

Temel fikir, her bir giriş parametresindeki önemli bir varyasyonun, bu girdilerin beslendiği nöronun aktivasyonundaki önemli bir varyasyon ile yansıtılmasını istemenizdir. Tan (x) hareket fonksiyonunun türevinin bir grafiğine bakarak, önemli eğim bölgesinin başlangıç ​​noktasından bir veya iki mesafede olduğunu göreceksiniz. Bu, aktivasyon fonksiyonuna girişin 2000 veya 3000 (türevinin ihmal edilebilir derecede küçük olduğu x değerleri) olup olmadığı, aktivasyonun çıktısının neredeyse aynı olacağı anlamına gelir ... böylece nöronunuzun durumu arasındaki farktan bağımsız olacaktır. 2000 ve 3000 ve ağınız asla bu aralıktaki değerlerden herhangi bir tahmin gücü üretmez.

Bu nedenle, evin kare görüntülerini bir nörona girmek istiyorsanız , ağın 2000 ve 3000 arasındaki farkı söyleyebilmesi için kare görüntüleri normalleştirmeniz gerekir. Bunu yapmanın bir yolu, veri nöron tarafından 'fark edilir' girişleri z-skor-normalize etmektir .

  • Tüm kare çekim değerlerinizi (egzersiz setinizden) toplayın ve ortalama ve standart sapmayı hesaplayın. Ortalama ve standart sapmayı saklayın --- test ederken yeni kare çekim değerlerini normalleştirmek için bu bilgilere ihtiyacınız olacaktır.

  • Ortalamayı çıkararak ve ardından sonucu standart sapmaya bölerek kare çekim değerlerinin vektörünü normalleştirin (elbette tüm işlemler element olarak). Ortalamanın çıkarılması, verilerinizi başlangıç ​​noktasında ortalar ve standart sapmaya bölünmesi, çoğunun nöronun çıktısının girdisine en duyarlı olduğu -1 ile 1 arasında olmasını sağlar. Buna z-skoru normalizasyonu denir, çünkü her bir giriş değeri z-puanı ile değiştirilir .

  • Her bir giriş değişkeni için yukarıdakileri yapın.

Şimdi, her bir giriş değerini bir nörondan geçirdiğinizde, nöronun çıkışı -1 ile 1 arasında bir aktivasyondur (tanh (x) görüntüsüne bakın). Bu zaten aktivasyon fonksiyonunun 'hassas' aralığında olduğundan, ilk gizli katmana göndermeden önce giriş katmanı nöronlarının çıkışını değiştirme konusunda endişelenmenize gerek yoktur. Sadece herhangi bir gizli katman nöronlarına doğrudan önceki katmanın çıktılarını verin - onları iyi idare edebileceklerdir.

Son katmana (çıkış nöron (lar)) ulaştığınızda, elde ettiğiniz şey yine -1 ile 1 arasında başka bir aktivasyon olur. Bu değeri , söz konusu değerin, bir test setinde tahmin veya egzersiz sırasında hatayı hesaplamak için. Ancak bunu yaparsanız, eğitimde ve testte tutarlı olmanız ve aynı normalleştirme prosedürünü kullanmanız yeterlidir. Bunu düşünmenin bir yolu: çıkış nöron (lar) ı 1 döndürdüğünde, ağın tahmini olarak mümkün olan maksimum ev değerini döndürdüğü anlamına gelir . Ağın tahmin edebileceği en yüksek değer ne olmalıdır? Burada doğru yaklaşım sadece uygulamanıza bağlıdır. Ben de öyle yaptım:

  • Çıkış değişkeninin ortalamasını hesaplayın ve saklayın.
  • Çıkış değişkeninin ortalamadan maksimum sapmasını hesaplayın. Python:MaxDev = max([abs(DataPoint-numpy.mean(TrainingData)) for DataPoint in TrainingData])
  • Ağ, çıktıları -1 ile 1 arasında döndürdüğünde, çıktıyı çarpın MaxDevve ortalamaya ekleyin.

Normalleştirme-renormalizasyon şemanızın uygun olup olmadığını görmek için yapabileceğiniz iki temel hızlı kontrol (bunlar gereklidir, ancak belki de yeterli koşullar değildir):

  1. Tüm giriş değerleri ortalama ise (örneğin ortalama yatak odası sayısı, ortalama fitkare, vb.), Ağın çıkışı da çıkış değişkeninin ortalamasına (örneğin ev değeri) eşit mi? (Olmalı.)
  2. Tüm giriş değerleri alışılmadık derecede yüksek / düşükse, ağ çıkışı da alışılmadık derecede yüksek / düşük mü? (Bu sadece tüm girdiler çıktıyla olumlu bir şekilde ilişkiliyse çalışır ... eğer bazıları tersine ilişkili ise, biraz daha düşünmek zorunda kalacaksınız).

Burada sunulan şemanın bu iki koşulu karşıladığını gözlemleyin.

Bu şema, ağ sadece ev değerlerini tahmin etmek için izin vereceğini Bildirimi içindeki antrenman veri setinde ev değerler aralığında. Uygulamaya bağlı olarak, bu davranış arzu edilebilir veya istenmeyen olabilir.

Örneğin: ağınızın negatif ev değerlerini tahmin etmesini imkansız hale getirmek isteyebilirsiniz. Bunu nasıl yapacağınızı düşünün. -1 0 ile eşlenecek şekilde çıktıyı normalleştirin.

Ağınızın tahmin edebileceği değerlerde sınır belirlemek istemiyorsanız, ağ çıkışını [-1,1] aralığını arctanh (x) gibi tüm gerçek sayılarla eşleştiren bir işlevle çalıştırabilirsiniz! Eğitim sırasında bunu yaptığınız sürece, ağınız ağırlıklarını buna göre ayarlayacaktır.

Umarım bu yardımcı olmuştur. Başka sorularınız varsa bana bildirin. ANN modülüm bu arada Python'da, bu nedenle dile özgü tavsiyem olabilir.


Bu çok faydalı oldu! Karşılaştığım her blog / öğretici (neredeyse kasıtlı olarak) bu süreci tarif etmekten kaçınıyor gibi görünüyor, ama evet hepsi mantıklı. Düzgün sindirmem biraz zaman alacak, ancak takip sorularım olursa geri döneceğim. Çok minnettarım!
David

Birkaç soru. Benim Sq. Ayak egzersizi verileri {2000, 800, 850, 550, 2000} idi, o zaman {1900, 1500, 600} için z skor girişlerim (doğru hesaplarsam) {1.0496, 0.4134, -1.0177} olur. Bu değerlerden biri> 1 ve biri <-1, bunlarla ne yapmalıyım? Bunları ne olursa olsun giriş katmanı düğümlerine girin veya 1 & -1? 1900 ve 600, 550-2000 aralığında olduklarında neden bu değerleri üretir? Bu kadar küçük bir veri kümesi olduğu için bu sadece bir veri numarası mı?
David

Çıktı katmanı yeniden normalizasyonu ile ilgili olarak, çıktıyı min ve maks değerlerine çizmeniz doğru mu? Minimum değer olsaydı0birndthembirxbenmum100 ve çıktı sıfır (-1 ila 1 olduğu varsayılarak) 50 $?
David

Girişlerin kesinlikle 1 ile -1 arasında olması gerekmediğini unutmayın. Girişler için ihtiyacınız olan tek şey, verilerin çoğunun bu aralıkta olmasıdır. Birden büyük veya daha küçük bir değer, noktanın ortalamadan birden fazla standart sapma olduğu anlamına gelir, böylece bu nokta verilerin üst ucuna daha yakındır. Verilerinizin [-1, 1] 'in dışına çıkması biraz nadir, [-2, 2]' nin dışına çıkması daha nadir ve [-3, 3] 'ün dışına çıkması çok nadir olmalıdır. Tanh (x) 'e bakın ve hassas aralığın sadece -1 ile 1 arasında olmadığını, bundan biraz daha ileri gittiğini göreceksiniz.
Marko Bakić

Çıktı denormalizasyonu ile ilgili olarak, bu min-maks denormalizasyon benim uygulamamda yaptığım şeydir ve yorumunuz doğrudur, ancak bunu yapmanız gerekmez. Bunu, 1'in maksimum ev değerinin iki katına karşılık gelmesini sağlayabilirsiniz - bu şekilde ağınız, eğitim verdiğiniz değerin üzerindeki ev değerlerini tahmin edebilir.
Marko Bakić
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.