सभी चुनौतियाँ
आसान 0 हल किए गए 0% स्वीकृति

सॉफ्टमैक्स फ़ंक्शन

बड़े मानों पर ओवरफ़्लो के बिना कच्चे स्कोर को ऐसी प्रायिकताओं में बदलें जिनका योग 1 हो।

आप क्या सीखेंगे

  • स्कोर को प्रायिकताओं में बदलना
  • ओवरफ़्लो से बचने के लिए अधिकतम घटाना
  • आउटपुट का योग 1 करना

समस्या

सॉफ्टमैक्स फ़ंक्शन स्कोर (लॉजिट) की सूची को प्रायिकताओं में बदलता है। लैंग्वेज मॉडल अगला शब्द चुनने के लिए इसका इस्तेमाल करते हैं:

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

उदाहरण

उदाहरण 1
इनपुट:
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] हैं।

उदाहरण 2
इनपुट:
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 के लिए अनुकूलित की गई है। ऊपर दिए गए स्टेटमेंट और सीमाओं का पालन करें।

दूसरों से सीखें

समुदाय समाधान

अभी तक कोई प्रकाशित समाधान नहीं। पहला साझा करने के लिए इस चुनौती को हल करें।