2016-11-01 6 views
6

मैं कैफे के SigmoidCrossEntropyLoss layer और docs के कोड को देख रहा था और मैं थोड़ा उलझन में हूं। दस्तावेज़ हानि फ़ंक्शन को लॉजिट लॉस के रूप में सूचीबद्ध करते हैं (मैं इसे यहां दोहराना चाहता हूं, लेकिन लेटेक्स के बिना, सूत्र को पढ़ना मुश्किल होगा। दस्तावेज़ लिंक देखें, यह बहुत ऊपर है)।कैफे सिग्मोइड क्रॉसइंटरोपॉइस लेयर लॉस फ़ंक्शन

हालांकि, कोड में ही (Forward_cpu(...)) से पता चलता एक अलग सूत्र

Dtype loss = 0; 
for (int i = 0; i < count; ++i) { 
    loss -= input_data[i] * (target[i] - (input_data[i] >= 0)) - 
     log(1 + exp(input_data[i] - 2 * input_data[i] * (input_data[i] >= 0))); 
} 
top[0]->mutable_cpu_data()[0] = loss/num; 

यह है क्योंकि इस अवग्रह समारोह के लिए लेखांकन पहले से ही इनपुट के लिए लागू किया गया है है?

हालांकि, (input_data[i] >= 0) स्निपेट भी मुझे भ्रमित कर रहे हैं। वे दस्तावेजों में हानि सूत्र से p_hat के स्थान पर दिखाई देते हैं, जो सिग्मोइड फ़ंक्शन द्वारा निर्धारित भविष्यवाणी माना जाता है। तो वे सिर्फ बाइनरी थ्रेसहोल्ड क्यों ले रहे हैं? यह और भी भ्रमित हो गया है क्योंकि इस हानि की भविष्यवाणी [0,1] आउटपुट है, इसलिए (input_data[i] >= 0)1 होगा जब तक कि यह 100% सुनिश्चित न हो।

क्या कोई मुझे यह समझा सकता है?

उत्तर

6

Caffe में SigmoidCrossEntropy परत 2 चरणों (Sigmoid + CrossEntropy) है कि कोड का एक टुकड़ा में input_data पर प्रदर्शन करेंगे जोड़ती है:

Dtype loss = 0; 
for (int i = 0; i < count; ++i) { 
    loss -= input_data[i] * (target[i] - (input_data[i] >= 0)) - 
     log(1 + exp(input_data[i] - 2 * input_data[i] * (input_data[i] >= 0))); 
} 
top[0]->mutable_cpu_data()[0] = loss/num; 

वास्तव में, कोई फर्क नहीं पड़ता कि क्या input_data >= 0 है या नहीं, इसके बाद के संस्करण कोड हमेशा होता है गणित में निम्न कोड के बराबर:

Dtype loss = 0; 
for (int i = 0; i < count; ++i) { 
    loss -= input_data[i] * (target[i] - 1) - 
     log(1 + exp(-input_data[i]); 
} 
top[0]->mutable_cpu_data()[0] = loss/num; 

, इस कोड को सीधा गणित सूत्र पर आधारित है Sigmoid औरलागू करने के बादinput_data पर और गणित में कुछ संयोजन बनाते हैं।

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

+0

तो अगर कोई नरम ग्राउंड सच्चाई लेबल (यानी [0,1] के बजाय {0,1] का उपयोग करना था, तो क्या कुछ भी बदलना होगा? – marcman

+0

यदि ग्राउंड सच्चाई लेबल का योग 1 के बराबर है, तो इस परत में कोई बदलाव नहीं होना चाहिए। अन्यथा, आपको कुछ बदलाव करना चाहिए जो नेटवर्क के प्रत्येक आउटपुट पर क्रॉस एन्ट्रॉपी लागू करता है। @marcman – Dale

+0

मुझे लगता है कि मैं समझता हूं कि यह मामला क्यों नहीं है, लेकिन व्यवहार में, जब मैंने प्रत्येक लेबल को सामान्यीकृत किया, तो मुझे नाएन हानि मिलनी शुरू हुई, हालांकि यह एक सीखने की दर मुद्दा हो सकता है – marcman

संबंधित मुद्दे