Problem
Die Layer-Normalisierung hält die Aktivierungen jedes Tokens auf einer stabilen Skala. Für jede Zeile x der Matrix:
- mean = Σ x / d und var = Σ (x - mean)² / d (Populationsvarianz über die d Werte der Zeile)
- x̂ = (x - mean) / √(var + epsilon)
- Ausgabe = gamma × x̂ + beta (elementweise: Spalte j verwendet gamma[j] und beta[j])
Implementiere layer_norm(x, gamma, beta, epsilon).
Eingabe
x: Eine Matrix mit einer Zeile pro Token und d Spalten.
gamma, beta: Die gelernte Skalierung und Verschiebung, je d Werte.
epsilon: Eine kleine Zahl, die eine Division durch null verhindert.
Ausgabe
Gib die normalisierte Matrix zurück, mit derselben Form wie x.
Einschränkungen
1 ≤ Zeilen ≤ 100, 1 ≤ d ≤ 128
-100 ≤ jeder Wert ≤ 100, 0 < epsilon ≤ 0.001
Beispiele
Eingabe:
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
Erwartete Ausgabe:
expected = [
[-1.224736, 0.0, 1.224736]
]
Eingabe:
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;
Erwartete Ausgabe:
std::vector<std::vector<double>> expected = {
{-1.224736, 0.0, 1.224736}
};
Eingabe:
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;
Erwartete Ausgabe:
double[][] expected = new double[][] {
new double[] {-1.224736, 0.0, 1.224736}
};
Erläuterung
mean = 2 und var = (1 + 0 + 1) / 3 ≈ 0.666667, also √(var + epsilon) ≈ 0.816503. Die Zeile wird zu etwa [-1.224736, 0, 1.224736]: zentriert bei 0 mit Varianz 1.
Eingabe:
x = [
[5.0, 5.0]
]
beta = [1.0, -1.0]
gamma = [2.0, 3.0]
epsilon = 1.0e-05
Erwartete Ausgabe:
expected = [
[1.0, -1.0]
]
Eingabe:
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;
Erwartete Ausgabe:
std::vector<std::vector<double>> expected = {
{1.0, -1.0}
};
Eingabe:
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;
Erwartete Ausgabe:
double[][] expected = new double[][] {
new double[] {1.0, -1.0}
};
Erläuterung
Beide Werte entsprechen dem Mittelwert, also x̂ = [0, 0] und die Ausgabe ist einfach beta: [1, -1]. Epsilon verhindert die Division durch null.
Referenzen
Diese Aufgabe wurde für CodeUtility angepasst. Beachte die oben genannten Vorgaben und Einschränkungen.