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

स्केल्ड डॉट-प्रोडक्ट अटेंशन

अटेंशन ऑपरेशन लागू करें, जो ट्रांसफ़ॉर्मर और बड़े लैंग्वेज मॉडल का दिल है।

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

  • क्वेरी को की से स्कोर करना
  • अटेंशन वज़न पाने के लिए सॉफ़्टमैक्स लगाना
  • उन वज़नों से वैल्यू मिलाना

समस्या

अटेंशन किसी अनुक्रम की हर स्थिति को बाकी सभी स्थितियों को देखने और उनकी जानकारी मिलाने देता है। यह ट्रांसफ़ॉर्मर आर्किटेक्चर का मूल है, जिसे बड़े लैंग्वेज मॉडल इस्तेमाल करते हैं:

Attention(Q, K, V) = softmax(Q × Kᵀ / √d) × V

हर क्वेरी पंक्ति q के लिए:

  1. हर की (key) पंक्ति k का स्कोर निकालें: score = (q · k) / √d, जहाँ d, K के कॉलम की संख्या है।
  2. सॉफ्टमैक्स से स्कोर को वेट में बदलें (e^x निकालने से पहले सबसे बड़ा स्कोर घटाएँ)।
  3. आउटपुट पंक्ति वैल्यू पंक्तियों का वेटेड योग है: Σ weight_j × values[j]।

attention(queries, keys, values) लागू करें।

इनपुट

queries: n पंक्तियाँ, हर एक में d संख्याएँ।

keys: m पंक्तियाँ, हर एक में d संख्याएँ।

values: m पंक्तियाँ (हर की के लिए एक), हर एक में v संख्याएँ।

आउटपुट

n × v आउटपुट मैट्रिक्स लौटाएँ।

सीमाएँ

1 ≤ n, m ≤ 50, 1 ≤ d, v ≤ 32

-10 ≤ हर मान ≤ 10

उदाहरण

उदाहरण 1
इनपुट:
keys = [
    [1.0, 0.0],
    [1.0, 0.0]
]
values = [
    [2.0, 4.0],
    [6.0, 8.0]
]
queries = [
    [1.0, 0.0]
]

अपेक्षित आउटपुट:
expected = [
    [4.0, 6.0]
]
इनपुट:
std::vector<std::vector<double>> keys = {
    {1.0, 0.0},
    {1.0, 0.0}
};
std::vector<std::vector<double>> values = {
    {2.0, 4.0},
    {6.0, 8.0}
};
std::vector<std::vector<double>> queries = {
    {1.0, 0.0}
};

अपेक्षित आउटपुट:
std::vector<std::vector<double>> expected = {
    {4.0, 6.0}
};
इनपुट:
double[][] keys = new double[][] {
    new double[] {1.0, 0.0},
    new double[] {1.0, 0.0}
};
double[][] values = new double[][] {
    new double[] {2.0, 4.0},
    new double[] {6.0, 8.0}
};
double[][] queries = new double[][] {
    new double[] {1.0, 0.0}
};

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

व्याख्या

दोनों की का स्कोर बराबर है, इसलिए सॉफ्टमैक्स वेट 0.5 और 0.5 हैं। आउटपुट वैल्यू पंक्तियों का औसत है: [(2 + 6) / 2, (4 + 8) / 2] = [4, 6]।

उदाहरण 2
इनपुट:
keys = [
    [3.0, 1.0],
    [-2.0, 5.0],
    [7.0, 7.0]
]
values = [
    [1.0],
    [2.0],
    [6.0]
]
queries = [
    [0.0, 0.0]
]

अपेक्षित आउटपुट:
expected = [
    [3.0]
]
इनपुट:
std::vector<std::vector<double>> keys = {
    {3.0, 1.0},
    {-2.0, 5.0},
    {7.0, 7.0}
};
std::vector<std::vector<double>> values = {
    {1.0},
    {2.0},
    {6.0}
};
std::vector<std::vector<double>> queries = {
    {0.0, 0.0}
};

अपेक्षित आउटपुट:
std::vector<std::vector<double>> expected = {
    {3.0}
};
इनपुट:
double[][] keys = new double[][] {
    new double[] {3.0, 1.0},
    new double[] {-2.0, 5.0},
    new double[] {7.0, 7.0}
};
double[][] values = new double[][] {
    new double[] {1.0},
    new double[] {2.0},
    new double[] {6.0}
};
double[][] queries = new double[][] {
    new double[] {0.0, 0.0}
};

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

व्याख्या

शून्य क्वेरी का हर की के साथ स्कोर 0 है, इसलिए अटेंशन बराबर बँटता है: (1 + 2 + 6) / 3 = 3।

संदर्भ

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

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

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

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