Apa fungsi kerugian untuk tugas klasifikasi multi-kelas, multi-label dalam jaringan saraf?

64

Saya melatih jaringan saraf untuk mengklasifikasikan satu set objek menjadi n-kelas. Setiap objek dapat menjadi milik beberapa kelas sekaligus (multi-class, multi-label).

Saya membaca bahwa untuk masalah multi-kelas umumnya direkomendasikan untuk menggunakan softmax dan entropi lintas kategorikal sebagai fungsi kerugian alih-alih mse dan saya kurang lebih mengerti mengapa.

Untuk masalah saya multi-label tidak masuk akal untuk menggunakan softmax tentu saja karena setiap probabilitas kelas harus independen dari yang lain. Jadi layer terakhir saya hanyalah unit sigmoid yang memasukkan input mereka ke dalam rentang probabilitas 0..1 untuk setiap kelas.

Sekarang saya tidak yakin apa fungsi kerugian yang harus saya gunakan untuk ini. Melihat definisi crossentropy kategoris, saya percaya itu tidak akan berlaku dengan baik untuk masalah ini karena hanya akan memperhitungkan output neuron yang seharusnya 1 dan mengabaikan yang lain.

Entropi silang biner sepertinya lebih cocok, tetapi saya hanya melihatnya pernah disebutkan untuk masalah klasifikasi biner dengan neuron keluaran tunggal.

Saya menggunakan python dan keras untuk pelatihan jika itu penting.

aKzenT
sumber
1
Saya percaya softmax adalah "unit sigmoid yang menekan input mereka ke dalam rentang probabilitas 0..1 untuk setiap kelas".
Hong Ooi
Anda dapat menggunakan softmax sebagai fungsi kerugian Anda dan kemudian menggunakan probabilitas untuk multilabel data Anda.
balboa

Jawaban:

30

Jika Anda menggunakan keras, cukup letakkan sigmoids di layer output dan binary_crossentropy pada fungsi biaya Anda.

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

nclasses

Jika rata-rata setiap baris diberi label lebih sedikit maka Anda dapat menggunakan softmax_cross_entropy_with_logits karena dengan kehilangan ini sementara kelas-kelasnya saling eksklusif, probabilitasnya tidak perlu. Semua yang diperlukan adalah bahwa setiap baris label adalah distribusi probabilitas yang valid. Jika tidak, perhitungan gradien akan salah.

Alok Nayak
sumber
Dear Alok, dapatkah Anda menjelaskan kepada OP bagaimana mereka akan menggunakan fungsi ini dan mengapa itu masuk akal? Seperti yang akan Anda lihat dalam tur , hanya tautan jawaban yang tidak dianjurkan di situs.
Antoine Vernet
Penjelasan singkat yang bagus dapat dilihat di keras github: github.com/fchollet/keras/issues/741
Dror Hilman
1
Tidak disarankan untuk menulis fungsi biaya Anda sendiri saat menggunakan cross entropy - ini dapat dikenakan masalah stabilitas numerik. Lihat github.com/tensorflow/tensorflow/issues/2462 untuk diskusi.
kbrose
Satu hal adalah multilabel, satu lagi multilabel multiclass. Sigmoid memencet output Anda antara 0 dan 1, tetapi OP memiliki beberapa kelas, jadi output harus Eg 0 - 10. Jadi output akan terlihat: [0,5,2,3,1] <--- ini bukan apa sigmoid tidak.
mimoralea
haruskah saya tf.round (log) sebelum menggunakan fungsi biaya atau dapatkah saya langsung menggunakan log dari lapisan tersembunyi ke tf.nn.sigmoid ....?
Biksu
9

UPDATE (18/04/18): Jawaban lama masih terbukti bermanfaat pada model saya. Caranya adalah dengan memodelkan fungsi partisi dan distribusi secara terpisah, sehingga memanfaatkan kekuatan softmax.

ymyim=δimF(yi,xi)=logP(yi|xi)yim=ZP(ym) untuk mencapai dua properti:

  1. mP(ym)=1
  2. Z

max(0.01,output)

Secara praktis, pilihan pengoptimal juga membuat perbedaan besar. Pengalaman saya dengan pendekatan factorisation bekerja paling baik di bawah Adadelta (Adagrad tidak bekerja untuk saya, belum mencoba RMSprop, kinerja SGD tergantung pada parameter).

Z

UPDATE : (Pemikiran acak) Sepertinya menggunakan proses Dirichlet akan memungkinkan penggabungan beberapa sebelum pada jumlah label?

PEMBARUAN : Dengan percobaan, KL-divergence yang dimodifikasi masih cenderung untuk memberikan keluaran multi-kelas daripada keluaran multi-label.


(Jawaban lama)

Pengalaman saya dengan sigmoid lintas-entropi tidak terlalu menyenangkan. Saat ini saya menggunakan KL-divergence yang dimodifikasi. Itu mengambil bentuk

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

Penerapan keras

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)
seharusnya lihat
sumber
pada dataset khusus saya, adamjauh lebih baik daripadarmsprop
shadi
Jika Anda menggunakan kehilangan semacam itu untuk pelatihan, bagaimana melakukannya dalam fase pengujian? Juga menggunakan softmax untuk prediksi, tetapi bagaimana cara memilih ambang untuk menentukan kelas multi-label?
karl_TUM
1

Saya belum pernah menggunakan keras. Mengambil caffe misalnya, bisa Anda gunakan SigmoidCrossEntropyLossLayeruntuk masalah multi-label.

mintaka
sumber
1
Mau jelaskan mengapa itu pendekatan yang bagus?
Firebug
0

Sebenarnya dalam tensorsflow Anda masih dapat menggunakan sigmoid_cross_entropy_meanfungsi perhitungan rugi dalam multi-label, saya sangat mengonfirmasinya

monyet yang unik
sumber
Beri kami tautan ke dokumentasi
Ivelin
0

Saya seorang pemula di sini tetapi saya akan mencoba mencobanya dengan pertanyaan ini. Saya mencari hal yang sama seperti Anda, dan akhirnya saya menemukan tutorial klasifikasi multi-kelas keras yang sangat bagus @ http://machinelearningmastery.com/multi-class-classification-tutorial-keras-deep-learning-library/ .

Penulis tutorial itu menggunakan fungsi kerugian lintas entropi kategoris, dan ada utas lain yang dapat membantu Anda menemukan solusi @ di sini .

Willy satrio nugroho
sumber
3
Ini bukan hanya multi kelas, Ini juga multi label.
Biksu