तंत्रिका नेटवर्क में मल्टी-क्लास, मल्टी-लेबल वर्गीकरण कार्यों के लिए क्या नुकसान कार्य करता है?


64

मैं एन-कक्षाओं में वस्तुओं के एक सेट को वर्गीकृत करने के लिए एक तंत्रिका नेटवर्क का प्रशिक्षण दे रहा हूं। प्रत्येक वस्तु एक ही समय में कई वर्गों (मल्टी-क्लास, मल्टी-लेबल) से संबंधित हो सकती है।

मैंने पढ़ा है कि बहु-वर्ग की समस्याओं के लिए आम तौर पर एमएमएस के बजाय हानि फ़ंक्शन के रूप में सॉफ्टमैक्स और श्रेणीबद्ध क्रॉस एन्ट्रापी का उपयोग करने की सिफारिश की जाती है और मैं समझता हूं कि कम या ज्यादा क्यों।

मल्टी-लेबल की मेरी समस्या के लिए यह निश्चित रूप से सॉफ्टमैक्स का उपयोग करने के लिए समझ में नहीं आएगा क्योंकि प्रत्येक वर्ग की संभावना दूसरे से स्वतंत्र होनी चाहिए। इसलिए मेरी अंतिम परत सिर्फ सिग्मॉइड इकाइयाँ हैं जो हर वर्ग के लिए एक संभाव्यता सीमा 0..1 में अपने इनपुट को स्क्वैश करती हैं।

अब मुझे यकीन नहीं है कि इसके लिए मुझे कौन से नुकसान का उपयोग करना चाहिए। श्रेणीगत क्रॉसेंट्रॉपी की परिभाषा को देखते हुए मेरा मानना ​​है कि यह इस समस्या पर अच्छी तरह से लागू नहीं होगा क्योंकि यह केवल न्यूरॉन्स के उत्पादन को ध्यान में रखेगा जो 1 होना चाहिए और दूसरों की उपेक्षा करता है।

बाइनरी क्रॉस एन्ट्रापी लगता है जैसे यह बेहतर फिट होगा, लेकिन मैं केवल एक आउटपुट न्यूरॉन के साथ बाइनरी वर्गीकरण समस्याओं के लिए इसका उल्लेख करता हूं।

यदि यह मायने रखता है तो मैं प्रशिक्षण के लिए अजगर और केरस का उपयोग कर रहा हूं।


1
मेरा मानना है कि softmax है "अवग्रह इकाइयों है कि हर वर्ग के लिए एक संभावना सीमा 0..1 में उनके आदानों स्क्वैश"।
हांग ओई

आप सॉफ्टमैक्स को अपने नुकसान फ़ंक्शन के रूप में उपयोग कर सकते हैं और फिर अपने डेटा को मल्टीलेबल करने के लिए संभावनाओं का उपयोग कर सकते हैं।
बाल्बोआ

जवाबों:


30

यदि आप केर का उपयोग कर रहे हैं, तो बस अपने आउटपुट लेयर पर sigmoids लगाएं और अपने लागत फ़ंक्शन पर बाइनरी_क्रोसेंट्रॉपी करें।

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

nclasses

यदि औसतन किसी पंक्ति को कम लेबल दिए गए हैं, तो आप सॉफ्टमैक्स_क्रॉस_एंट्रोपि_विथ_लॉग का उपयोग कर सकते हैं क्योंकि इस नुकसान के साथ जबकि कक्षाएं पारस्परिक रूप से अनन्य हैं, उनकी संभावनाओं की आवश्यकता नहीं है। यह आवश्यक है कि लेबल की प्रत्येक पंक्ति एक वैध संभावना वितरण है। यदि वे नहीं हैं, तो ढाल की गणना गलत होगी।


प्रिय आलोक, क्या आप ओपी को समझा सकते हैं कि वे इस फ़ंक्शन का उपयोग करने के बारे में कैसे जाएंगे और यह समझ में क्यों आता है? जैसा कि आप दौरे में देखेंगे , साइट पर केवल उत्तरों को प्रोत्साहित नहीं किया गया है।
एंटोनी वर्नेट

केरस गितुब में एक अच्छी संक्षिप्त व्याख्या देखी जा सकती है: github.com/fchollet/keras/issues/741
Dror Hilman

1
क्रॉस एन्ट्रॉपी का उपयोग करते समय अपनी लागत फ़ंक्शन लिखने की अनुशंसा नहीं की जाती है - यह संख्यात्मक स्थिरता के मुद्दों के अधीन हो सकता है। चर्चा के लिए github.com/tensorflow/tensorflow/issues/2462 देखें ।
kbrose

एक चीज़ है मल्टीलेबल, दूसरी चीज़ है मल्टीलेबल मल्टीस्केल्स। सिग्मॉइड 0 और 1 के बीच आपके आउटपुट को नष्ट कर देता है, लेकिन ओपी में कई वर्ग होते हैं, इसलिए आउटपुट एग 0 होना चाहिए। 10. इसलिए आउटपुट दिखना चाहिए: [0,5,2,3,1] <--- यह सिग्मॉइड नहीं है कर देता है।
मिमोरिया

क्या मुझे कॉस्ट फंक्शन में इस्तेमाल करने से पहले tf.round (लॉगिट्स) करना चाहिए या क्या मैं छिपी हुई लेयर से tf.nn.sigmoid में सीधे लॉगिट्स का उपयोग कर सकता हूं ....?
भिक्षु

9

अद्यतन (18/04/18): पुराना उत्तर अभी भी मेरे मॉडल पर उपयोगी साबित हुआ है। चाल विभाजन फ़ंक्शन और वितरण को अलग से मॉडल करना है, इस प्रकार सॉफ्टमैक्स की शक्ति का शोषण करना है।

ymyim=δimF(yi,xi)=logP(yi|xi)yim=ZP(ym) दो संपत्ति प्राप्त करने के लिए:

  1. mP(ym)=1
  2. Z

max(0.01,output)

व्यावहारिक रूप से, आशावादी की पसंद भी एक बड़ा अंतर बनाती है। कारक के दृष्टिकोण के साथ मेरा अनुभव यह है कि यह आदेलदत्ता (मेरे लिए काम न करें) के तहत सबसे अच्छा काम करता है, फिर भी आरएमएसप्रॉप की कोशिश नहीं की, परफॉर्मेंस का प्रदर्शन पैरामीटर के अधीन है)।

Z

अद्यतन : (यादृच्छिक सोचा) यह लगता है कि Dirichlet प्रक्रिया का उपयोग लेबल की संख्या पर कुछ पूर्व को शामिल करने की अनुमति देगा?

अद्यतन : प्रयोग द्वारा, संशोधित KL-divergence अभी भी मल्टी-लेबल आउटपुट के बजाय मल्टी-क्लास आउटपुट देने के लिए इच्छुक है।


(पुराना उत्तर)

सिग्मॉइड क्रॉस-एंट्रोपी के साथ मेरा अनुभव बहुत सुखद नहीं था। फिलहाल मैं एक संशोधित केएल-विचलन का उपयोग कर रहा हूं। यह रूप लेता है

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

करैस अभेद्य

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)

मेरी विशेष डेटासेट पर, adamकी तुलना में बेहतर थाrmsprop
shadi

यदि आप प्रशिक्षण के लिए इस तरह के नुकसान का उपयोग करते हैं, तो इसे परीक्षण चरण में कैसे करें? भविष्यवाणी के लिए सॉफ्टमैक्स का भी उपयोग करें, लेकिन मल्टी-लेबल कक्षाओं को निर्धारित करने के लिए दहलीज का चयन कैसे करें?
karl_TUM

1

मैंने अभी तक केरस का उपयोग नहीं किया है। उदाहरण के लिए कैफीन लेना, आप SigmoidCrossEntropyLossLayerमल्टी-लेबल समस्याओं के लिए उपयोग कर सकते हैं ।


1
यह समझाने के लिए कि यह एक अच्छा तरीका क्यों है?
Firebug

0

वास्तव में टेनसफ़्लो में आप अभी भी sigmoid_cross_entropy_meanमल्टी-लेबल में हानि गणना फ़ंक्शन के रूप में उपयोग कर सकते हैं , मैं इसकी पुष्टि करता हूं


हमें प्रलेखन के लिए एक लिंक दें
Ivelin

0

मैं यहाँ एक नौसिखिया हूँ, लेकिन मैं इस सवाल के साथ इसे एक शॉट देने की कोशिश करूँगा। मैं आप के रूप में एक ही बात खोज रहा था, और अंत में मुझे एक बहुत अच्छा केरस मल्टी-क्लास वर्गीकरण ट्यूटोरियल @ http://machinelearningmastery.com/multi-class-classification-tutorial-keras-deep-learning-library/ मिला

उस ट्यूटोरियल के लेखक श्रेणीबद्ध क्रॉस एन्ट्रापी लॉस फ़ंक्शन का उपयोग करते हैं, और एक अन्य धागा है जो आपको यहां @ समाधान खोजने में मदद कर सकता है


3
यह न केवल मल्टी क्लास है, यह मल्टी लेबल भी है।
भिक्षु
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.