Yapay sinir ağlarında çoklu sınıf, çoklu etiket sınıflandırma görevleri için hangi kayıp fonksiyonu?


64

Bir dizi nesneyi n sınıflarına ayırmak için sinir ağını eğitiyorum. Her nesne aynı anda birden fazla sınıfa ait olabilir (çoklu sınıf, çoklu etiket).

Çok sınıflı problemlerde genellikle mse yerine kayıp fonksiyonu olarak softmax ve kategorik çapraz entropinin kullanılması önerildiğini ve nedenini az çok anladığımı okudum.

Çoklu etiket problemim için, her sınıf olasılık diğerinden bağımsız olması gerektiğinden softmax'ı kullanmak hiç mantıklı olmaz. Bu yüzden son katmam girişlerini her sınıf için 0..1 olasılık aralığında ezen sigmoid birimleri.

Şimdi hangi kayıp fonksiyonunu kullanmam gerektiğinden emin değilim. Kategorik crossentropinin tanımına baktığımda, sadece 1 olması gereken nöronların çıktısını göz önünde bulunduracağından ve diğerlerini görmezden geleceğinden, bu soruna iyi uygulanmayacağına inanıyorum.

İkili çapraz entropi daha iyi uyuyor gibi geliyor, ama sadece tek bir çıkış nöronuyla ikili sınıflandırma problemlerinde bahsettiğimi gördüm.

Önemli olması durumunda antrenman için python ve keras kullanıyorum.


1
Ben SoftMax inanmak olduğunu , "her sınıf için bir olasılık aralığı 0..1 içine kendi girdileri ezmek sigmoid birimleri".
Hong Ooi,

Softmax'ı kayıp işleviniz olarak kullanabilir ve ardından verilerinizi çoklu etiketlemek için olasılıkları kullanabilirsiniz.
balboa

Yanıtlar:


30

Keras kullanıyorsanız, çıktı katmanınıza sigmoidler ve maliyet fonksiyonunuz üzerine binary_crossentropy koymanız yeterli.

(yln(sigmoid(logits))+(1y)ln(1sigmoid(logits)))

nclasses

Ortalama olarak herhangi bir satıra daha az etiket atanırsa, softmax_cross_entropy_with_logits kullanabilirsiniz, çünkü sınıflar birbirini dışlayan bir durumdayken, bu kayıpla birlikte olasılıkları da gerekmez. Gerekli olan tek şey, her etiket sırasının geçerli bir olasılık dağılımı olmasıdır. Olmazsa, degradenin hesaplanması yanlış olacaktır.


Sevgili Alok, OP'ye bu işlevi nasıl kullanacaklarını ve neden anlamlı olduğunu açıklayabilir misiniz? Turda göreceğiniz gibi , link sadece sitedeki cevapları desteklememektedir.
Antoine Vernet

Keras github'da güzel bir kısa açıklama görülebilir: github.com/fchollet/keras/issues/741
Dror Hilman

1
Çapraz entropi kullanırken kendi maliyet fonksiyonunuzu yazmanız önerilmez - sayısal kararlılık sorunlarına maruz kalabilir . Bkz github.com/tensorflow/tensorflow/issues/2462 bir tartışma için.
kbrose

Bir şey multilabel, diğeri multilabel multiclass. Sigmoid çıktınızı 0 ile 1 arasında sıkıştırır, ancak OP birden fazla sınıfa sahiptir, bu nedenle çıktılar Eg 0 - 10 olmalıdır. Dolayısıyla çıktılar şöyle görünmelidir: [0,5,2,3,1] <--- yapar.
mimoralea

cost işlevini kullanmadan önce tf.round (logits) yapmalı mıyım veya gizli katmandan tf.nn.sigmoid .... 'e doğrudan logitleri kullanabilir miyim?
Monk

9

GÜNCELLEME (18/04/18): Eski cevap hala benim modelimde faydalı oldu. İşin püf noktası, bölme işlevini ve dağıtımı ayrı ayrı modellemek, böylece softmax'ın gücünü kullanmaktır.

ymyim=δimF(yi,xi)=logP(yi|xi)yim=ZP(ym) iki özellik elde etmek için:

  1. mP(ym)=1
  2. Z

max(0.01,output)

Pratikte, optimize edici seçimi de büyük bir fark yaratıyor. Çarpanlara ayırma yaklaşımı konusundaki deneyimim Adadelta altında en iyi şekilde çalışıyor (Adagrad benim için çalışmıyor, henüz RMSprop'u denemedi, SGD'nin performansları parametreye tabidir).

Z

GÜNCELLEME : (Rastgele düşünce) Dirichlet işlemini kullanmak, etiket sayısından önce bazılarının dahil edilmesine izin verir gibi görünüyor?

GÜNCELLEME : Deneyde, değiştirilmiş KL ayrışması çoklu etiketli çıktı yerine çoklu sınıf çıktı vermeye meyillidir.


(Eski cevap)

Sigmoid çapraz entropi ile olan deneyimim pek hoş değildi. Şu anda değiştirilmiş bir KL-diverjans kullanıyorum. Şeklinde alır

Loss(P,Q)=x|P(x)Q(x)||logP(x)Q(x)|=x|(P(x)Q(x))logP(x)Q(x)|
P(x)Q(x)

xP(x)=2

Keras aşılama

def abs_KL_div(y_true, y_pred):
    y_true = K.clip(y_true, K.epsilon(), None)
    y_pred = K.clip(y_pred, K.epsilon(), None)
    return K.sum( K.abs( (y_true- y_pred) * (K.log(y_true / y_pred))), axis=-1)

belirli veri adamrmsprop
setime

Eğer eğitim için böyle bir kayıp kullanıyorsanız, test aşamasında nasıl yapılır? Ayrıca, tahmin için softmax kullanın, ancak çoklu etiket sınıflarını belirlemek için eşik değeri nasıl seçilir?
karl_TUM


0

Aslında tensorsflow'ta hala çoklu etiketde sigmoid_cross_entropy_meankayıp hesaplama fonksiyonu olarak kullanabilirsiniz.


Bize belgeler için bir link verin
Ivelin

0

Ben burada acemiyim ama bu soruyu bir şansla deneyeceğim. Sizinle aynı şeyi araştırıyordum ve sonunda çok iyi bir keras sınıf sınıfı öğretici buldum @ http://machinelearningmastery.com/multi-class-classification-tutorial-keras-deep-learning-library/ .

Bu dersin yazarı kategorik çapraz entropi kaybı fonksiyonunu kullanır ve burada @ çözümünü bulmanıza yardımcı olabilecek başka bir konu vardır .


3
Sadece çoklu sınıf değil, aynı zamanda çoklu etiket.
Monk
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.