TensorFlow में क्रॉस-एन्ट्रापी लॉस कैसे चुनें?


84

वर्गीकरण समस्याएं, जैसे कि लॉजिस्टिक रिग्रेशन या मल्टीमोनियल लॉजिस्टिक रिग्रेशन, एक क्रॉस-एन्ट्रापी लॉस का अनुकूलन करते हैं । आम तौर पर, क्रॉस-एन्ट्रापी परत सॉफ्टमैक्स परत का अनुसरण करती है , जो संभावना वितरण का उत्पादन करती है।

टेंसरफ़्लो में, कम से कम एक दर्जन विभिन्न क्रॉस-एंट्रोपी हानि कार्य हैं :

  • tf.losses.softmax_cross_entropy
  • tf.losses.sparse_softmax_cross_entropy
  • tf.losses.sigmoid_cross_entropy
  • tf.contrib.losses.softmax_cross_entropy
  • tf.contrib.losses.sigmoid_cross_entropy
  • tf.nn.softmax_cross_entropy_with_logits
  • tf.nn.sigmoid_cross_entropy_with_logits
  • ...

कौन सा केवल द्विआधारी वर्गीकरण के लिए काम करता है और जो बहु-वर्ग की समस्याओं के लिए उपयुक्त हैं? आपको sigmoidइसके बजाय कब उपयोग करना चाहिए softmax? sparseकार्य दूसरों से अलग कैसे हैं और यह केवल क्यों है softmax?

संबंधित (अधिक गणित-उन्मुख) चर्चा: केरस और टेन्सरफ्लो में इन सभी क्रॉस-एन्ट्रापी नुकसानों के बीच अंतर क्या हैं?


1
इसके अलावा, हमारे पास tf.losses.log_lossवास्तव में केवल बाइनरी क्रॉसेंट्रोपी के लिए है। इसके अलावा github.com/tensorflow/tensorflow/issues/2462
mrgloom

जवाबों:


140

प्रारंभिक तथ्य

  • कार्यात्मक अर्थों में, सिग्मॉइड सॉफ्टमैक्स फ़ंक्शन का एक आंशिक मामला है , जब कक्षाओं की संख्या 2 बराबर होती है। दोनों ही एक ही ऑपरेशन करते हैं: लॉगबिलिटी (नीचे देखें) को संभावनाओं में बदलना।

    सरल बाइनरी वर्गीकरण में, दोनों के बीच कोई बड़ा अंतर नहीं है, हालांकि बहुराष्ट्रीय वर्गीकरण के मामले में , सिग्मॉइड गैर-अनन्य लेबल (उर्फ मल्टी-लेबल ) से निपटने की अनुमति देता है , जबकि सॉफ्टमैक्स अनन्य वर्गों (नीचे देखें) के साथ काम करता है।

  • एक तर्क (जिसे स्कोर भी कहा जाता है) एक वर्ग के साथ जुड़ा हुआ एक कच्चा अनसुलझा मूल्य है , संभाव्यता की गणना करने से पहले। तंत्रिका नेटवर्क वास्तुकला के संदर्भ में, इसका मतलब है कि एक लॉगिट एक घने (पूरी तरह से जुड़ा हुआ) परत का आउटपुट है।

    Tensorflow का नामकरण थोड़ा अजीब है: नीचे दिए गए सभी कार्य लॉग स्वीकार करते हैं, संभाव्यता नहीं , और स्वयं परिवर्तन लागू करें (जो कि बस अधिक कुशल है)।

सिग्मॉइड फ़ंक्शंस परिवार

जैसा कि पहले कहा गया है, sigmoidहानि फ़ंक्शन बाइनरी वर्गीकरण के लिए है। लेकिन टेंसरफ्लो फ़ंक्शन अधिक सामान्य हैं और कक्षाएं स्वतंत्र होने पर मल्टी-लेबल वर्गीकरण करने की अनुमति देते हैं। दूसरे शब्दों में, एक ही बार में द्विआधारी वर्गीकरण को tf.nn.sigmoid_cross_entropy_with_logitsहल करता Nहै।

लेबल एक-गर्म एन्कोडेड होना चाहिए या इसमें सॉफ्ट क्लास संभावनाएं हो सकती हैं।

tf.losses.sigmoid_cross_entropyइसके अलावा इन-बैच वेट सेट करने की अनुमति देता है , यानी कुछ उदाहरणों को दूसरों की तुलना में अधिक महत्वपूर्ण बनाते हैं। वर्ग भारtf.nn.weighted_cross_entropy_with_logits निर्धारित करने की अनुमति देता है (याद रखें, वर्गीकरण द्विआधारी है), अर्थात सकारात्मक त्रुटियों को नकारात्मक त्रुटियों से बड़ा बनाते हैं। यह उपयोगी है जब प्रशिक्षण डेटा असंतुलित हो।

सॉफ्टमैक्स फ़ंक्शंस परिवार

इन नुकसान कार्यों का उपयोग बहुराष्ट्रीय पारस्परिक रूप से अनन्य वर्गीकरण के लिए किया जाना चाहिए, अर्थात Nकक्षाओं में से एक को चुनना । जब लागू हो N = 2

लेबल एक-गर्म एन्कोडेड होना चाहिए या इसमें सॉफ्ट क्लास संभावनाएं हो सकती हैं: एक विशेष उदाहरण 50% प्रायिकता के साथ वर्ग ए और 50% संभावना के साथ वर्ग बी हो सकता है। ध्यान दें कि कड़ाई से बोलने का यह मतलब नहीं है कि यह दोनों वर्गों का है, लेकिन कोई इस तरह से संभावनाओं की व्याख्या कर सकता है।

sigmoidपरिवार की तरह , इन-बैच वेटtf.losses.softmax_cross_entropy सेट करने की अनुमति देता है , अर्थात कुछ उदाहरणों को दूसरों की तुलना में अधिक महत्वपूर्ण बनाते हैं। जहाँ तक मुझे पता है, टेंसरफ़्लो 1.3 के रूप में, क्लास वेट सेट करने का कोई अंतर्निहित तरीका नहीं है ।

[UPD] टेंसरफ़्लो १.५ में, v2संस्करण पेश किया गया था और मूल softmax_cross_entropy_with_logitsनुकसान को घटाया गया था । उनके बीच एकमात्र अंतर यह है कि एक नए संस्करण में, बैकप्रोपैजेशन लॉगिट और लेबल दोनों में होता है ( यहां चर्चा है कि यह क्यों उपयोगी हो सकता है)।

विरल कार्य परिवार

softmaxऊपर सामान्य की तरह , इन नुकसान कार्यों का उपयोग बहुराष्ट्रीय पारस्परिक रूप से अनन्य वर्गीकरण के लिए किया जाना चाहिए, अर्थात Nकक्षाओं में से एक को चुनना । अंतर एन्कोडिंग लेबल में है: कक्षाएं पूर्णांक (क्लास इंडेक्स) के रूप में निर्दिष्ट की जाती हैं, एक-गर्म वैक्टर नहीं। जाहिर है, यह नरम कक्षाओं की अनुमति नहीं देता है, लेकिन हजारों या लाखों वर्गों के होने पर यह कुछ मेमोरी को बचा सकता है। हालाँकि, ध्यान दें कि logitsतर्क में अभी भी प्रत्येक वर्ग के लॉगिट्स होने चाहिए, इस प्रकार यह कम से कम [batch_size, classes]मेमोरी का उपभोग करता है ।

ऊपर की तरह, tf.lossesसंस्करण में एक weightsतर्क है जो इन-बैच वजन सेट करने की अनुमति देता है।

सैंपल्ड सॉफ्टमैक्स फ़ंक्शंस परिवार

ये फ़ंक्शन बड़ी संख्या में कक्षाओं से निपटने के लिए एक और विकल्प प्रदान करते हैं। कंप्यूटिंग और एक सटीक संभावना वितरण की तुलना करने के बजाय, वे एक यादृच्छिक नमूने से नुकसान के अनुमान की गणना करते हैं।

तर्क weightsऔर biasesएक पूरी तरह से जुड़े परत को निर्दिष्ट करते हैं जो किसी चुने हुए नमूने के लिए लॉग की गणना के लिए उपयोग किया जाता है।

ऊपर की तरह, labelsएक-गर्म एन्कोडेड नहीं हैं, लेकिन आकार है [batch_size, num_true]

नमूना कार्य केवल प्रशिक्षण के लिए उपयुक्त हैं। परीक्षण समय में, softmaxवास्तविक वितरण प्राप्त करने के लिए एक मानक हानि (या तो विरल या एक-गर्म) का उपयोग करने की सिफारिश की जाती है ।

एक और वैकल्पिक नुकसान है tf.nn.nce_loss, जो शोर-विपरीत अनुमान लगाता है (यदि आप रुचि रखते हैं, तो इसे बहुत विस्तृत चर्चा देखें )। मैंने इस फ़ंक्शन को सॉफ्टमैक्स परिवार में शामिल किया है, क्योंकि एनसीई सीमा में सॉफ्टमैक्स के लिए सन्निकटन की गारंटी देता है।


क्या मुझे सिग्मॉइड क्रॉस एन्ट्रॉपी (sigCE) के बारे में स्पष्टीकरण के लिए पूछना चाहिए? यदि यह Nएक ही बार में द्विआधारी वर्गीकरण कार्यों के लिए हल करता है N = prod(output.shape), उदाहरण के लिए shape = [batch, examples, channels]; N = (batch * examples * channels)? यदि tf.lossesउम्मीद है कि "लॉगिट्स" (नेटवर्क का आउटपुट), तो क्या मुझे उपयोग में आसानी के लिए संभाव्यताएं भी लौटानी चाहिए? क्या आप शायद stackoverflow.com/questions/53612973/…
SumNeuron

5

हालाँकि, संस्करण 1.5 softmax_cross_entropy_with_logits_v2के लिए argument key=..., उदाहरण के लिए, इसके तर्क का उपयोग करते समय इसके बजाय उपयोग किया जाना चाहिए

softmax_cross_entropy_with_logits_v2(_sentinel=None, labels=y,
                                    logits=my_prediction, dim=-1, name=None)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.