चुनौतियों पर वापस जाएँ
मध्यम 0 हल किए गए 0% स्वीकृति

लेयर नॉर्मलाइज़ेशन

हर पंक्ति को माध्य 0 और प्रसरण 1 पर नॉर्मलाइज़ करें, फिर स्केल और शिफ़्ट करें, जैसा हर Transformer ब्लॉक करता है।

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

  • हर पंक्ति को माध्य 0 और प्रसरण 1 पर लाना
  • gamma और beta से स्केल और शिफ़्ट करना
  • समझना कि epsilon क्यों ज़रूरी है

समस्या

लेयर नॉर्मलाइज़ेशन हर टोकन के एक्टिवेशन को स्थिर पैमाने पर रखता है। मैट्रिक्स की हर पंक्ति x के लिए:

  1. mean = Σ x / d और var = Σ (x - mean)² / d (पंक्ति के d मानों पर जनसंख्या प्रसरण)
  2. x̂ = (x - mean) / √(var + epsilon)
  3. आउटपुट = gamma × x̂ + beta (तत्व-दर-तत्व: कॉलम j के लिए gamma[j] और beta[j])

layer_norm(x, gamma, beta, epsilon) लागू करें।

इनपुट

x: हर टोकन के लिए एक पंक्ति और d कॉलम वाला मैट्रिक्स।

gamma, beta: सीखे गए स्केल और शिफ़्ट, प्रत्येक में d मान।

epsilon: एक छोटी संख्या जो शून्य से भाग को रोकती है।

आउटपुट

नॉर्मलाइज़ किया गया मैट्रिक्स लौटाएँ, जिसका आकार x जैसा हो।

सीमाएँ

1 ≤ पंक्तियाँ ≤ 100, 1 ≤ d ≤ 128

-100 ≤ हर मान ≤ 100, 0 < epsilon ≤ 0.001

उदाहरण

उदाहरण 1
इनपुट:
x = [
    [1.0, 2.0, 3.0]
]
beta = [0.0, 0.0, 0.0]
gamma = [1.0, 1.0, 1.0]
epsilon = 1.0e-05

अपेक्षित आउटपुट:
expected = [
    [-1.224736, 0.0, 1.224736]
]
इनपुट:
std::vector<std::vector<double>> x = {
    {1.0, 2.0, 3.0}
};
std::vector<double> beta = {0.0, 0.0, 0.0};
std::vector<double> gamma = {1.0, 1.0, 1.0};
double epsilon = 1.0e-05;

अपेक्षित आउटपुट:
std::vector<std::vector<double>> expected = {
    {-1.224736, 0.0, 1.224736}
};
इनपुट:
double[][] x = new double[][] {
    new double[] {1.0, 2.0, 3.0}
};
double[] beta = new double[] {0.0, 0.0, 0.0};
double[] gamma = new double[] {1.0, 1.0, 1.0};
double epsilon = 1.0e-05;

अपेक्षित आउटपुट:
double[][] expected = new double[][] {
    new double[] {-1.224736, 0.0, 1.224736}
};

व्याख्या

mean = 2 और var = (1 + 0 + 1) / 3 ≈ 0.666667, इसलिए √(var + epsilon) ≈ 0.816503। पंक्ति लगभग [-1.224736, 0, 1.224736] बन जाती है: 0 पर केंद्रित और प्रसरण 1।

उदाहरण 2
इनपुट:
x = [
    [5.0, 5.0]
]
beta = [1.0, -1.0]
gamma = [2.0, 3.0]
epsilon = 1.0e-05

अपेक्षित आउटपुट:
expected = [
    [1.0, -1.0]
]
इनपुट:
std::vector<std::vector<double>> x = {
    {5.0, 5.0}
};
std::vector<double> beta = {1.0, -1.0};
std::vector<double> gamma = {2.0, 3.0};
double epsilon = 1.0e-05;

अपेक्षित आउटपुट:
std::vector<std::vector<double>> expected = {
    {1.0, -1.0}
};
इनपुट:
double[][] x = new double[][] {
    new double[] {5.0, 5.0}
};
double[] beta = new double[] {1.0, -1.0};
double[] gamma = new double[] {2.0, 3.0};
double epsilon = 1.0e-05;

अपेक्षित आउटपुट:
double[][] expected = new double[][] {
    new double[] {1.0, -1.0}
};

व्याख्या

दोनों मान माध्य के बराबर हैं, इसलिए x̂ = [0, 0] और आउटपुट सिर्फ़ beta है: [1, -1]। Epsilon शून्य से भाग को रोकता है।

कैसे हल करें

पहले खुद कोशिश करें, फिर एक-एक करके संकेत खोलें।

संकेत 1

हर row को independently normalize करें, पूरे matrix के statistics की बजाय उस row के अपने mean और variance use करके.

संकेत 2

एक row को standardize करने के बाद, gamma और beta के साथ learned scale और shift को element-wise apply करें.

संकेत 3

Population variance use करें और division by zero से बचने के लिए square root से पहले epsilon add करें.

अपेक्षित जटिलता

समय O(rows * d), अतिरिक्त स्थान O(1)

संदर्भ

यह चुनौती CodeUtility के लिए अनुकूलित की गई है। ऊपर दिए गए स्टेटमेंट और सीमाओं का पालन करें।

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

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

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