ปานกลาง 0 ข้อที่แก้แล้ว อัตราผ่าน 0%

Layer normalization

ปรับแต่ละแถวให้มีค่าเฉลี่ย 0 และความแปรปรวน 1 จากนั้นปรับสเกลและเลื่อน แบบเดียวกับที่ทุกบล็อก Transformer ทำ

สิ่งที่คุณจะได้เรียนรู้

  • ทำให้แต่ละแถวมีค่าเฉลี่ย 0 และความแปรปรวน 1
  • ปรับสเกลและเลื่อนด้วย gamma และ beta
  • เข้าใจว่าทำไมต้องมี epsilon

โจทย์

Layer normalization รักษาค่า activation ของแต่ละ token ให้อยู่ในสเกลที่คงที่ สำหรับแต่ละแถว 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])

จง implement layer_norm(x, gamma, beta, epsilon)

อินพุต

x: เมทริกซ์ที่มีหนึ่งแถวต่อ token และ d คอลัมน์

gamma, beta: สเกลและค่าเลื่อนที่เรียนรู้ได้ อย่างละ d ค่า

epsilon: ค่าเล็ก ๆ ที่ป้องกันการหารด้วยศูนย์

เอาต์พุต

คืนค่าเมทริกซ์ที่ normalize แล้ว ซึ่งมีรูปร่างเดียวกับ 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 ป้องกันการหารด้วยศูนย์

แหล่งอ้างอิง

โจทย์นี้ปรับให้เหมาะกับ CodeUtility กรุณาทำตามคำชี้แจงและข้อจำกัดด้านบน

เรียนรู้จากคนอื่น

แนวทางจากชุมชน

ยังไม่มีวิธีทำที่เผยแพร่ ลองแก้โจทย์นี้เพื่อแชร์วิธีแรก