โจทย์
โมเดลภาษาต้องไม่แอบดูคำในอนาคต Causal attention มาสก์อนาคตไว้: แถว query i สนใจได้เฉพาะแถว key 0 ถึง i
สำหรับแต่ละแถว i (queries, keys และ values มี n แถวทั้งหมด):
- ให้คะแนนแต่ละ key ที่อนุญาต j ≤ i: score = (queries[i] · keys[j]) / √d โดยที่ d คือจำนวนคอลัมน์ของ keys
- ใช้ softmax เฉพาะกับคะแนนที่อนุญาตเหล่านั้น (ลบค่าที่มากที่สุดก่อนคำนวณ e^x)
- แถวเอาต์พุต i = Σ weight_j × values[j] สำหรับ j ≤ i
จง implement causal_attention(queries, keys, values)
อินพุต
queries, keys: n แถว แถวละ d จำนวน
values: n แถว แถวละ v จำนวน
เอาต์พุต
คืนค่าเมทริกซ์เอาต์พุตขนาด n × v
เงื่อนไข
1 ≤ n ≤ 50, 1 ≤ d, v ≤ 32
-10 ≤ แต่ละค่า ≤ 10
ตัวอย่าง
อินพุต:
keys = [
[1.0],
[2.0],
[3.0]
]
values = [
[3.0],
[6.0],
[9.0]
]
queries = [
[0.0],
[0.0],
[0.0]
]
ผลลัพธ์ที่คาดหวัง:
expected = [
[3.0],
[4.5],
[6.0]
]
อินพุต:
std::vector<std::vector<double>> keys = {
{1.0},
{2.0},
{3.0}
};
std::vector<std::vector<double>> values = {
{3.0},
{6.0},
{9.0}
};
std::vector<std::vector<double>> queries = {
{0.0},
{0.0},
{0.0}
};
ผลลัพธ์ที่คาดหวัง:
std::vector<std::vector<double>> expected = {
{3.0},
{4.5},
{6.0}
};
อินพุต:
double[][] keys = new double[][] {
new double[] {1.0},
new double[] {2.0},
new double[] {3.0}
};
double[][] values = new double[][] {
new double[] {3.0},
new double[] {6.0},
new double[] {9.0}
};
double[][] queries = new double[][] {
new double[] {0.0},
new double[] {0.0},
new double[] {0.0}
};
ผลลัพธ์ที่คาดหวัง:
double[][] expected = new double[][] {
new double[] {3.0},
new double[] {4.5},
new double[] {6.0}
};
คำอธิบาย
คะแนนทั้งหมดเป็น 0 ดังนั้นแต่ละแถวเฉลี่ยค่าที่มองเห็นได้: แถว 0 เห็นแค่ 3 แถว 1 เฉลี่ย 3 และ 6 (4.5) แถว 2 เฉลี่ยทั้งสามค่า (6)
อินพุต:
keys = [
[1.0, 0.0],
[1.0, 0.0]
]
values = [
[1.0, 2.0],
[3.0, 4.0]
]
queries = [
[1.0, 0.0],
[1.0, 0.0]
]
ผลลัพธ์ที่คาดหวัง:
expected = [
[1.0, 2.0],
[2.0, 3.0]
]
อินพุต:
std::vector<std::vector<double>> keys = {
{1.0, 0.0},
{1.0, 0.0}
};
std::vector<std::vector<double>> values = {
{1.0, 2.0},
{3.0, 4.0}
};
std::vector<std::vector<double>> queries = {
{1.0, 0.0},
{1.0, 0.0}
};
ผลลัพธ์ที่คาดหวัง:
std::vector<std::vector<double>> expected = {
{1.0, 2.0},
{2.0, 3.0}
};
อินพุต:
double[][] keys = new double[][] {
new double[] {1.0, 0.0},
new double[] {1.0, 0.0}
};
double[][] values = new double[][] {
new double[] {1.0, 2.0},
new double[] {3.0, 4.0}
};
double[][] queries = new double[][] {
new double[] {1.0, 0.0},
new double[] {1.0, 0.0}
};
ผลลัพธ์ที่คาดหวัง:
double[][] expected = new double[][] {
new double[] {1.0, 2.0},
new double[] {2.0, 3.0}
};
คำอธิบาย
แถว 0 เห็นแค่ตัวเองและคัดลอก values[0] = [1, 2] แถว 1 ให้คะแนนเท่ากันกับทั้งสอง key และเฉลี่ยค่า: [2, 3]
แหล่งอ้างอิง
โจทย์นี้ปรับให้เหมาะกับ CodeUtility กรุณาทำตามคำชี้แจงและข้อจำกัดด้านบน