समस्या
सॉफ्टमैक्स फ़ंक्शन स्कोर (लॉजिट) की सूची को प्रायिकताओं में बदलता है। लैंग्वेज मॉडल अगला शब्द चुनने के लिए इसका इस्तेमाल करते हैं:
softmax(x)_i = e^(x_i) / (e^(x_1) + e^(x_2) + … + e^(x_n))
बड़े स्कोर पर e^x ओवरफ़्लो हो जाता है, इसलिए पहले हर स्कोर में से सबसे बड़ा स्कोर घटाएँ। गणितीय रूप से परिणाम वही रहता है।
softmax(logits) लागू करें।
इनपुट
logits: स्कोर की एक सूची।
आउटपुट
प्रायिकताओं की सूची उसी क्रम में लौटाएँ। सभी 0 और 1 के बीच होती हैं और उनका योग 1 होता है।
सीमाएँ
1 ≤ लंबाई ≤ 1,000
-1,000 ≤ हर स्कोर ≤ 1,000
उदाहरण
इनपुट:
logits = [1.0, 2.0, 3.0]
अपेक्षित आउटपुट:
expected = [0.090031, 0.244728, 0.665241]
इनपुट:
std::vector<double> logits = {1.0, 2.0, 3.0};
अपेक्षित आउटपुट:
std::vector<double> expected = {0.090031, 0.244728, 0.665241};
इनपुट:
double[] logits = new double[] {1.0, 2.0, 3.0};
अपेक्षित आउटपुट:
double[] expected = new double[] {0.090031, 0.244728, 0.665241};
व्याख्या
e¹ ≈ 2.718, e² ≈ 7.389 और e³ ≈ 20.086 का योग 30.193 है, इसलिए प्रायिकताएँ लगभग [0.090031, 0.244728, 0.665241] हैं।
इनपुट:
logits = [1000.0, 1000.0]
अपेक्षित आउटपुट:
expected = [0.5, 0.5]
इनपुट:
std::vector<double> logits = {1000.0, 1000.0};
अपेक्षित आउटपुट:
std::vector<double> expected = {0.5, 0.5};
इनपुट:
double[] logits = new double[] {1000.0, 1000.0};
अपेक्षित आउटपुट:
double[] expected = new double[] {0.5, 0.5};
व्याख्या
e^1000 को सीधे निकालने पर ओवरफ़्लो होता है। अधिकतम मान घटाने पर [0, 0] मिलता है, और दोनों के लिए e⁰ / (e⁰ + e⁰) = 0.5 है।
संदर्भ
यह चुनौती CodeUtility के लिए अनुकूलित की गई है। ऊपर दिए गए स्टेटमेंट और सीमाओं का पालन करें।