समस्या
लेयर नॉर्मलाइज़ेशन हर टोकन के एक्टिवेशन को स्थिर पैमाने पर रखता है। मैट्रिक्स की हर पंक्ति x के लिए:
- mean = Σ x / d और var = Σ (x - mean)² / d (पंक्ति के d मानों पर जनसंख्या प्रसरण)
- x̂ = (x - mean) / √(var + epsilon)
- आउटपुट = 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
उदाहरण
इनपुट:
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।
इनपुट:
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 के लिए अनुकूलित की गई है। ऊपर दिए गए स्टेटमेंट और सीमाओं का पालन करें।