Yapay sinir ağları: hangi maliyet fonksiyonu kullanılacak?


48

TensorFlow'u özellikle sinir ağları ile yapılan deneyler için kullanıyorum . Her ne kadar bazı deneyler yapmama rağmen (XOR-Problem, MNIST, bazı Regresyon işleri, ...) şimdi, belirli problemler için "doğru" maliyet fonksiyonunu seçmekle uğraşıyorum, çünkü genel olarak bir başlangıç ​​olarak kabul edilebilirim.

TensorFlow'a gelmeden önce, tamamen bağlı bazı MLP'leri ve bazı tekrarlayan ağları Python ve NumPy ile kodladım ancak çoğunlukla basit bir kare hatasının ve basit bir gradyan inatçısının yeterli olduğu yerlerde sorun yaşadım.

Bununla birlikte, TensorFlow özel maliyet fonksiyonlarının yanı sıra kendi başına oldukça fazla maliyet fonksiyonu sunduğu için, özellikle sinir ağlarındaki maliyet fonksiyonları için bir tür öğretici olup olmadığını bilmek ister misiniz? (Resmi TensorFlow eğitimlerinin yarısı gibi zaten yaptım, ancak belirli maliyet işlevlerinin veya öğrencilerin neden belirli sorunlar için kullanıldığını açıklamıyorlar - en azından yeni başlayanlar için değil)

Bazı örnekler vermek için:

cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(y_output, y_train))

Softmax fonksiyonunu her iki girişe de uygular, böylece bir vektörün toplamı 1'e eşittir. Fakat logitlerle çapraz entropi nedir? Değerleri topladığını ve çapraz entropiyi hesapladığını sanıyordum ... bu yüzden bazı metrik ölçümler ?! Çıktıyı normalleştirir, özetler ve kare hatası alırsam, bu pek aynı olmaz mıydı? Ek olarak, bu neden örneğin MNIST (ya da daha da zor sorunlar) için kullanılıyor? 10 veya hatta 1000 sınıf olarak sınıflandırmak istediğimde, değerlerin toplanması, hangi sınıfın gerçekte çıktı olduğu hakkında herhangi bir bilgiyi tamamen yok etmiyor mu?

cost = tf.nn.l2_loss(vector)

Bu ne için? L2 kaybının karesel bir hata olduğunu düşünmüştüm, ancak TensorFlow'un API'si bunun sadece bir tensör olduğunu söylüyor. Fikri hiç anlamadı mı?

Ayrıca bunu çapraz entropi için çok sık gördüm :

cross_entropy = -tf.reduce_sum(y_train * tf.log(y_output))

... ama bu neden kullanılıyor? Çapraz entropinin kaybı matematiksel olarak şöyle olmaz:

-1/n * sum(y_train * log(y_output) + (1 - y_train) * log(1 - y_output))

(1 - y_train) * log(1 - y_output)Çoğu TensorFlow örneğindeki kısım nerede ? Kayıp değil mi?


Cevaplar: Bu sorunun oldukça açık olduğunu biliyorum, ancak her bir problem / maliyet fonksiyonunda ayrıntılı olarak listelenen 10 sayfa gibi olmasını beklemiyorum. Hangi maliyet fonksiyonunun ne zaman kullanılacağına (genel olarak veya TensorFlow'da benim için önemli değil) ve bu konuyla ilgili bazı açıklamalara kısa bir özete ihtiyacım var. Ve / veya yeni başlayanlar için bazı kaynaklar;)


1
İyi soru. Siteye Hoşgeldiniz :)
Dawny33

2
Genellikle, MSE regresyon için ve sınıflandırma için Çapraz Entropi için alınır. Merit'in Sınıflandırma Figürü (CFM), Hampshire ve Waibel tarafından "Zaman gecikmeli sinir ağlarını kullanarak gelişmiş ses düzeni tanıma için yeni bir nesnel işlev" de tanıtıldı. Doğru hatırlıyorsam, CFM'yi neden onlar gibi tasarladıklarını da açıklarlar.
Martin Thoma

1
Düşüş_sum (y_train * tf.log (y_output)) oldukça yaygın bir "basit durum" örneği olduğu için çok kullanıldığını düşünüyorum. Her bir toplu işin hatasında toplamı çalıştırır; bu, eğer toplu işiniz_likleri iki katına çıkarsa, hatanın iki katını (ve degradenin büyüklüğünü) ikiye katlar. Reduc_mean için basit bir değişiklik yapmak, en azından hata ayıklamayı ve ayarlarla oynamayı bence daha anlaşılır hale getirecektir.
nöron

Yanıtlar:


33

Bu cevap, TensorFlow ile ilgili olmayan maliyet fonksiyonlarının genel tarafındadır ve çoğunlukla sorunuzun "bu konu hakkında bazı açıklamalarını" ele alacaktır.

İzlediğim çoğu örnek / öğreticide, kullanılan maliyet işlevi biraz isteğe bağlıydı. Mesele okuyucuyu belirli bir maliyet yöntemine değil belirli bir yönteme tanıtmaktı. Araçları tanımak için öğreticiyi izlemenizi durdurmamalı, ancak cevabım kendi sorunlarınız için maliyet işlevini nasıl seçeceğiniz konusunda size yardımcı olacaktır.

Çapraz Entropi, Logit, L2 normları veya özel bir şeyle ilgili cevaplar istiyorsanız, size birden fazla, daha spesifik sorular göndermenizi öneririm. Bu, belirli bilgiye sahip birisinin sorunuzu görme olasılığını artıracaktır.


İstenilen sonucu elde etmek için doğru maliyet fonksiyonunu seçmek, makine öğrenmesi problemlerinin kritik bir noktasıdır. Temel yaklaşım, yönteminizden tam olarak ne istediğinizi bilmiyorsanız, regresyon sorunları için Ortalama Kare Hatası (Wikipedia) ve sınıflandırma sorunları için hata yüzdesi kullanmaktır. Ancak, yönteminizden iyi sonuçlar almak istiyorsanız, iyi tanımlamanız ve böylece uygun maliyet işlevini tanımlamanız gerekir. Bu, hem alan bilgisinden (verileriniz nedir, ne elde etmeye çalışıyorsunuzdur) hem de emrinizdeki araçların bilgisinden gelir.

TensorFlow'da halihazırda uygulanan maliyet fonksiyonları hakkında size rehberlik edebileceğime inanmıyorum, çünkü araç hakkında çok az bilgim var, ancak size farklı maliyet fonksiyonlarının nasıl yazılacağı ve değerlendirileceği hakkında bir örnek verebilirim.


Maliyet fonksiyonları arasındaki çeşitli farklılıkları göstermek için, her bir örneği için sınıfındaki sınıfındaki istediğimiz ikili sınıflandırma probleminin örneğini .xnf(xn){0,1}

Hesaplamalı özelliklerle başlayarak ; "aynı şeyi" ölçen iki fonksiyonun nasıl farklı sonuçlara yol açabileceği. Aşağıdaki basit maliyet fonksiyonunu alın; hatanın yüzdesi. Eğer varsa örnekleri, öngörülen sınıftır ve gerçek sınıf, en aza indirmek istiyorumNf(yn)yn

  • 1Nn{1 if f(xn)yn0 otherwise=nyn[1f(xn)]+[1yn]f(xn) .

Bu maliyet fonksiyonu kolayca yorumlanabilme avantajına sahiptir. Ancak pürüzsüz değildir; sadece iki numuneniz varsa, "0" dan 0,5'e, 1'e "atlar" fonksiyonu, bu fonksiyon üzerinde degrade iniş kullanmaya çalışırsanız, bu tutarsızlıklara yol açacaktır. Bunu engellemenin bir yolu, atama olasılıklarını kullanmak için maliyet işlevini değiştirmektir; . İşlevp(yn=1|xn)

  • 1Nnynp(yn=0|xn)+(1yn)p(yn=1|xn) .

Bu işlev daha yumuşak ve degrade iniş yaklaşımlarıyla daha iyi çalışacaktır. Daha iyi bir model elde edeceksiniz. Ancak, başka bir sorunu var; Belirsiz olan bir örneğiniz varsa, daha iyi bir şey söylemek için yeterli bilgiye sahip olmadığınızı . Ardından, bu maliyet işlevinde gradyan inişini kullanmak, bu olasılığı olabildiğince artıran ve dolayısıyla belki de uygun olan bir modele yol açacaktır.p(yn=1|xn)=0.5

Bu işlevin diğer bir problemi, eğer ise ise, olduğunuzdan emin olabilirsiniz, ama yanılıyorsunuz. Bu sorunu önlemek için, olasılığın günlüğünü alabilirsiniz, . Şöyle ve sorunu yoktur İzleyen fonksiyon, bir önceki paragrafta tarif edilen:p(yn=1|xn)=1yn=0logp(yn|xn)log(0)=log(1)=0

  • 1Nnynlogp(yn=0|xn)+(1yn)logp(yn=1|xn) .

Bu, aynı şeyi optimize etmek için , hata yüzdesini, farklı tanımların hesaplama açısından anlamlı hale getirmeleri kolaysa farklı sonuçlar verebileceğini göstermelidir.

Maliyet fonksiyonlarının ve aynı kavramı ölçmesi mümkündür , ancak , yönteminizi daha iyi sonuçlara götürebilir .ABAB


Şimdi farklı maliyet fonksiyonlarının farklı kavramları nasıl ölçebileceğini görelim. Bilgi alımı bağlamında, google aramasında olduğu gibi (sıralamayı yoksayarsak), döndürülen sonuçların

Algoritmanız her şeyi döndürürse , mümkün olan her sonucu döndürür ve bu nedenle yüksek geri çağırma özelliğine sahiptir, ancak çok düşük hassasiyete sahiptir. Öte yandan, eğer sadece bir elementi döndürürse , en kesin olanı alakalı, yüksek hassasiyetli fakat düşük hatırlama olacaktır.

Bu tür algoritmaları değerlendirmek için, ortak maliyet işlevi puanlarıdır (Wikipedia) . Yaygın durumdur hassasiyet ve hatırlama eşit ağırlık verir -score, fakat genel durum o -score ve ince ayar yapabilirsiniz olsun içinFF1Fββ

  • Daha yüksek geri çağırma, eğerβ>1
  • kullanıyorsanız, daha yüksek hassasiyet .β<1

Bu senaryoda, maliyet işlevini seçmek, algoritmanızın ne yapabileceğini seçmektir .

Sıklıkla ortaya çıkan bir başka örnek, tıbbi teşhis durumunda, tercih edilebilir olana bağlı olarak daha yanlış negatifleri veya yanlış pozitifleri cezalandıran bir maliyet işlevi seçebilirsiniz:

  • Daha sağlıklı insanlar hasta olarak sınıflandırılıyor (Fakat o zaman, sağlıklı insanlara davranabiliriz, bu da masraflı ve aslında hasta değillerse onlara zarar verebilir)
  • Daha çok hasta insan sağlıklı olarak sınıflandırılıyor (Fakat daha sonra, tedavi olmadan ölebilirler)

Sonuç olarak, maliyet fonksiyonunu tanımlamak algoritmanızın amacını tanımlamaktır. Algoritma oraya nasıl gidileceğini tanımlar.


Not: Bazı maliyet fonksiyonlarının amaçlarına ulaşmak için iyi algoritma yöntemleri vardır. Örneğin, SVM'deki (Wikipedia) ikili problemi çözerek, Menteşe kaybının (Wikipedia) minimumuna güzel bir yolu var.


10

Cross entropi ile ilgili sorunuza cevap vermek için bahsettiğiniz her ikisinin de aynı olduğunu fark edeceksiniz.

1n(y_trainlog(y_output)+(1y_train)log(1y_output))

Bahsettiğiniz, sadece 0/1 skaler olduğunu ve un tekrar çıktının 1 olduğunu belirten skaler olduğunu varsaydığınız ikili çapraz entropi kaybıdır .y_trainy_output

Bahsettiğiniz diğer denklem, birden fazla sınıfa yayılanın daha genel bir çeşididir.

-tf.reduce_sum(y_train * tf.log(y_output)) yazı ile aynı şey

ntrain_problog(out_prob)

toplamın çoklu sınıfların üzerinde olduğu ve olasılıkların her sınıf için olduğu. Açıkçası ikili durumda bu daha önce belirtildiği gibi tamamen aynı şey. sabit bir olduğu gibi zarar en aza indirilmesi için herhangi bir şekilde katkıda bulunmaz şekliyle atlanmıştır.n


4

BLUF: veri alt kümesi ve matplotlib ile yinelemeli deneme yanılma.

Uzun cevap:

Takımım uzun zaman önce bu aynı soruyla mücadele ediyordu. Buradaki tüm cevaplar harika, ancak bağlamda ve makinede öğrenmeye yeni başlayanlar için bir başlangıç ​​noktası olarak "acemi cevabımı" sizinle paylaşmak istedim.

Özel algoritma ve veri seti seçiminiz için yumuşak ve dışbükey bir maliyet fonksiyonunu hedeflemek istersiniz. Bunun nedeni, algoritmanızın, sonunda bu maliyet fonksiyonunun küresel asgari seviyesine ulaşmak için ağırlıkları güvenli ve verimli bir şekilde ayarlayabilmesini istediğinizdir. Maliyet işleviniz yerel en yüksek ve en düşük değerlerle "engebeli" ise ve / veya genel minimum değeri yoksa, algoritmanız yakınsama zor olabilir; ağırlıkları sadece her yere sıçrayabilir, sonuçta size doğru ve / veya tutarlı tahminler veremez.

Örneğin, birinin ağırlığını (gerçek sayı, pound cinsinden), boylarına (gerçek sayı, inç) ve yaşına (gerçek sayı, yıl cinsinden) göre tahmin etmek için doğrusal regresyon kullanıyorsanız, ortalama kare hata maliyet fonksiyonu; güzel, pürüzsüz, dışbükey bir eğri. Algoritmanızın yakınsama problemi olmayacak.

Ancak, bunun yerine ikili bir sınıflandırma problemi için bir lojistik regresyon algoritması kullandığınızı söyleyin, örneğin bir kişinin son 30 günde çocuk bezi alıp almadığına ve kişinin son 30 günde bira satın alıp almadığına dayanarak cinsiyetini tahmin etmek gibi. Bu durumda, ortalama kare hatası size antrenman için kötü olabilecek pürüzsüz bir dışbükey yüzey vermeyebilir. Ve bunu deneyimle söylerdin.

MSE ve verilerinizin küçük ve basit bir örneğini kullanarak veya bu deneme için oluşturduğunuz sahte verilerle bir deneme çalıştırarak başlayabilirsiniz. Matplotlib ile neler olup bittiğini görselleştirin (veya tercih ettiğiniz herhangi bir komplo çözümünü). Ortaya çıkan hata eğrisi düz ve dışbükey mi? Ek bir giriş değişkeni ile tekrar deneyin ... elde edilen yüzey hala düz ve dışbükey mi? Bu deney sayesinde, MSE'nin probleminize / çözümünüze uymadığı halde, çapraz entropinin size gereksinimlerinize daha iyi uyan pürüzsüz bir dışbükey şekil verdiğini görebilirsiniz. Böylece daha büyük bir örnek veri seti ile deneyebilir ve hipotezin hala geçerli olup olmadığını görebilirsiniz. Ve eğer öyleyse, birkaç kez tam antrenman setinizle deneyebilir ve nasıl performans gösterdiğini ve sürekli olarak benzer modeller sunup sunmadığını görebilirsiniz. Olmazsa, o zaman başka bir maliyet fonksiyonu seçin ve işlemi tekrarlayın.

Bu tür yüksek yinelemeli deneme-yanılma süreci benim ve yeni başlayanlar için çalışan bilim adamları ekibim için gayet iyi çalışıyor ve maliyet teorisi seçiminin arkasındaki matematik teorisine derinlemesine dalmadan sorularımıza çözüm bulmaya odaklanmamızı sağlıyor. model optimizasyonu.

Tabii ki, bu denemenin ve hatanın çoğu zaten başkaları tarafından yapıldığı için, sürecin başlarında iyi maliyet fonksiyonlarının ne olabileceği konusundaki seçimlerimizi filtrelememize yardımcı olmak için kamuoyundaki bilgiden de faydalanıyoruz. Örneğin, çapraz entropi, sınıflandırma problemleri için genellikle iyi bir seçimdir, ister yukarıdaki örnek gibi lojistik regresyon ile ikili sınıflandırma, isterse çıktı olarak softmax katmanlı daha karmaşık çok etiketli sınıflandırma. MSE, bilinen bir olası kategoriler kümesinden bilinen bir kategoriye üye olma olasılığı yerine, olası bir kategori kümesinden bilinen bir kategoriye üyelik olasılığı yerine, bir skalar tahmininde bulunmak istediğiniz lineer regresyon problemleri için iyi bir ilk seçimdir. d sadece aktivasyon fonksiyonu olmayan girdilerin ağırlıklı bir artı toplamına eklenebilir.

Umarım bu cevabı çok basit ve açık olmadan dışarıdaki diğer yeni başlayanlara yardımcı olur.


3

Sorunuzu yeniden düzenlemek

TensorFlow örneklerinin çoğunda (1 - y_train) * log (1 - y_output) bölümü nerededir? Kayıp değil mi?

Cevap, çoğu çıkış fonksiyonunun softmax olmasıdır. Bu, yanlış durumlarda tüm olasılıkları azaltmanız gerekmediği anlamına gelir, çünkü doğru olanın olasılığını artırdığınızda otomatik olarak azalırlar.

Örneğin:

optimizasyondan önce

y_output = [0.2, 0.2, 0.6] ve y_train = [0, 0, 1]

optimizasyondan sonra

y_output = [0.15, 0.15, 0.7] ve y_train = [0, 0, 1]

Burada, üçüncü terimi arttırmamıza rağmen, diğer tüm şartların otomatik olarak azaldığını gözlemliyoruz.

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.