के लिए सॉफ्टमैक्स सक्रियण फ़ंक्शन का कार्यान्वयन मैं तंत्रिका नेटवर्क की अंतिम परत में Softmax सक्रियण फ़ंक्शन का उपयोग कर रहा हूं। लेकिन मुझे इस समारोह के सुरक्षित कार्यान्वयन में समस्याएं हैं।तंत्रिका नेटवर्क
Vector y = mlp(x); // output of the neural network without softmax activation function
for(int f = 0; f < y.rows(); f++)
y(f) = exp(y(f));
y /= y.sum();
यह> 100 छिपा नोड्स के लिए बहुत अच्छी तरह से काम नहीं करता है क्योंकि y कई मामलों में NaN
(यदि y (च)> 709, exp (होगा:
एक अनुभवहीन कार्यान्वयन यह एक होगा वाई (एफ)) इंफ वापस आ जाएगा)। मैं इस संस्करण के साथ आया था:
Vector y = mlp(x); // output of the neural network without softmax activation function
for(int f = 0; f < y.rows(); f++)
y(f) = safeExp(y(f), y.rows());
y /= y.sum();
जहां safeExp
double safeExp(double x, int div)
{
static const double maxX = std::log(std::numeric_limits<double>::max());
const double max = maxX/(double) div;
if(x > max)
x = max;
return std::exp(x);
}
इस समारोह के रूप में परिभाषित किया गया है exp के इनपुट सीमित करता है। ज्यादातर मामलों में यह काम करता है लेकिन सभी मामलों में नहीं और मैंने वास्तव में यह पता लगाने में कामयाब नहीं किया कि यह किस मामले में काम नहीं करता है। जब मेरी पिछली परत में 800 छिपा न्यूरॉन्स हैं तो यह बिल्कुल काम नहीं करता है।
हालांकि, अगर यह काम करता है तो भी मैं एएनएन के परिणाम को "विकृत" करता हूं। क्या आप सही समाधान की गणना करने के किसी अन्य तरीके से सोच सकते हैं? क्या कोई सी ++ पुस्तकालय या चाल है जिसका उपयोग मैं इस एएनएन के सटीक आउटपुट की गणना के लिए कर सकता हूं?
संपादित करें: Itamar Katz द्वारा प्रदान समाधान है:
Vector y = mlp(x); // output of the neural network without softmax activation function
double ymax = maximal component of y
for(int f = 0; f < y.rows(); f++)
y(f) = exp(y(f) - ymax);
y /= y.sum();
और यह वास्तव में गणितीय में ही है। अभ्यास में हालांकि, फ्लोटिंग पॉइंट परिशुद्धता के कारण कुछ छोटे मान 0 बन जाते हैं। मुझे आश्चर्य है कि पाठ्यपुस्तकों में इन कार्यान्वयन विवरणों में से कोई भी क्यों नहीं लिखता है।
"मुझे आश्चर्य है कि कोई भी पाठ्यपुस्तकों में इन कार्यान्वयन विवरणों को कभी भी क्यों नहीं लिखता है।" मैंने हमेशा एक ही चीज़ को सोचा है! – pjreddie
"यह वास्तव में गणितीय रूप से वही है" - आगे पढ़ने के बाद, कोई कहता है कि संख्यात्मक स्थिरता के कारण आपकी विधि को प्राथमिकता दी गई है .: https://stackoverflow.com/questions/34968722/softmax-function-python – gremwell