समस्या
अटेंशन शब्दों के क्रम को नज़रअंदाज़ करता है, इसलिए मूल Transformer हर टोकन एम्बेडिंग में एक पोज़िशनल एन्कोडिंग जोड़ता है। d_model आकार वाले मॉडल में पोज़िशन pos और आयाम j (दोनों 0 से) के लिए:
- 'सम j: PE[pos][j] = sin(pos / 10000^(j / d_model))'
- 'विषम j: PE[pos][j] = cos(pos / 10000^((j - 1) / d_model))'
इसलिए आयाम 0 और 1 एक आवृत्ति साझा करते हैं, आयाम 2 और 3 अगली, और इसी तरह आगे।
positional_encoding(length, d_model) लागू करें।
इनपुट
length: पोज़िशन की संख्या (0 से length - 1)।
d_model: एम्बेडिंग का आकार।
आउटपुट
length × d_model मैट्रिक्स लौटाएँ।
सीमाएँ
1 ≤ length ≤ 200, 1 ≤ d_model ≤ 128
उदाहरण
इनपुट:
length = 2
d_model = 4
अपेक्षित आउटपुट:
expected = [
[0.0, 1.0, 0.0, 1.0],
[0.841471, 0.540302, 0.01, 0.99995]
]
इनपुट:
long long length = 2;
long long d_model = 4;
अपेक्षित आउटपुट:
std::vector<std::vector<double>> expected = {
{0.0, 1.0, 0.0, 1.0},
{0.841471, 0.540302, 0.01, 0.99995}
};
इनपुट:
long length = 2;
long d_model = 4;
अपेक्षित आउटपुट:
double[][] expected = new double[][] {
new double[] {0.0, 1.0, 0.0, 1.0},
new double[] {0.841471, 0.540302, 0.01, 0.99995}
};
व्याख्या
पोज़िशन 0 हर जोड़ी के लिए sin(0) = 0 और cos(0) = 1 है: [0, 1, 0, 1]। पोज़िशन 1 आवृत्तियाँ 1 और 1 / 10000^(2/4) = 0.01 उपयोग करती है: [sin 1, cos 1, sin 0.01, cos 0.01] ≈ [0.841471, 0.540302, 0.01, 0.99995]।
इनपुट:
length = 3
d_model = 1
अपेक्षित आउटपुट:
expected = [
[0.0],
[0.841471],
[0.909297]
]
इनपुट:
long long length = 3;
long long d_model = 1;
अपेक्षित आउटपुट:
std::vector<std::vector<double>> expected = {
{0.0},
{0.841471},
{0.909297}
};
इनपुट:
long length = 3;
long d_model = 1;
अपेक्षित आउटपुट:
double[][] expected = new double[][] {
new double[] {0.0},
new double[] {0.841471},
new double[] {0.909297}
};
व्याख्या
केवल एक आयाम होने पर सिर्फ़ sin(pos) उपयोग होता है: [[0], [0.841471], [0.909297]]।
संदर्भ
यह चुनौती CodeUtility के लिए अनुकूलित की गई है। ऊपर दिए गए स्टेटमेंट और सीमाओं का पालन करें।