Contents
Deep Breakdown
What it tells me (Situation Awareness): Absolute homogeneity is one of the three defining axioms of a norm: . It says that scaling a vector by a scalar scales its norm by — the absolute value, not itself. This is the property that ensures a norm is consistent with scalar multiplication. If you double a vector, its length doubles (). If you negate a vector (), its length is unchanged (because ). This axiom distinguishes a norm from an arbitrary function on vectors.
Flowchart
Real-world use
Where it is used
Verifying that a function qualifies as a valid norm (must satisfy all three axioms: positive definiteness, absolute homogeneity, triangle inequality). This comes up when: defining custom distance measures for ML, checking that a regularization penalty behaves correctly, understanding why when (gradient norm scales linearly with learning rate), and in theoretical analysis of optimization algorithms.
Problem it solves
Without homogeneity, a "norm" could behave erratically under scaling: doubling a vector might triple its "length," or reversing a vector might change its "length." Absolute homogeneity enforces that scaling and norms interact consistently: stretching a vector stretches its norm proportionally, and direction (sign) does not affect length.
How it solves the problem
For the norm: . The under the square root becomes after the root, giving the absolute value. The same derivation works for any norm.
Example in a business
A DS applies gradient descent with learning rate . The gradient vector has norm . The update step has norm — the step size is exactly times the gradient magnitude. This is absolute homogeneity: the norm of the scaled vector is times the norm of the original.
The formula, piece by piece
- : any valid norm (must satisfy all three norm axioms)
- : any scalar (real or complex)
- : the vector scaled by ; every component multiplied by
- : the absolute value of ; ensures the right-hand side is non-negative
- : the norm of the original unscaled vector
- The property:
The formula in words
"Scaling a vector by a factor scales its norm by . The absolute value ensures that reversing direction () does not change the length." Tiny examples with norm:
- , . : .
- : .
Critical Concepts
- All norms satisfy this: for all .
- Part of the three norm axioms: a function is a norm if and only if it satisfies: (1) positive definiteness, (2) absolute homogeneity, (3) triangle inequality.
- Consequence for unit vectors: has . Normalization works because of absolute homogeneity.
- Consequences for optimization: the gradient of is (linear in ). This is because itself is quadratic, and homogeneity ensures it behaves predictably.
- Not a norm axiom violation: is a consequence of absolute homogeneity with .
Reversing a vector does not change its length.
Step-by-step calculation (tiny example)
Step 1: Choose a vector, compute its norm . .
Step 2: Scale by a negative scalar . .
Step 3: Verify the property . .
Code examples
Beginner example (Python)
import numpy as np
# -- Absolute homogeneity: verify for L2, L1, Linf norms ---
x = np.array([1.0, -2.0, 2.0])
for lam in [2.0, -3.0, 0.5, -1.0, 0.0]:
scaled_x = lam * x
for p, name in [(2, "L2"), (1, "L1"), (np.inf, "Linf")]:
lhs = np.linalg.norm(scaled_x, ord=p)
rhs = abs(lam) * np.linalg.norm(x, ord=p)
ok = np.isclose(lhs, rhs)
print(f"lambda={lam:4g} {name}: ||lam*x|| = {lhs:.4f}, |lam|*||x|| = {rhs:.4f}, match={ok}")
print()Beginner example (R)
# -- Absolute homogeneity for L2 norm ---
x <- c(1, -2, 2)
for (lam in c(2, -3, 0.5, -1, 0)) {
scaled_x <- lam * x
lhs <- sqrt(sum(scaled_x^2))
rhs <- abs(lam) * sqrt(sum(x^2))
cat(sprintf("lambda=%4g : ||lam*x|| = %.4f, |lam|*||x|| = %.4f, match=%s\n", lam, lhs, rhs, isTRUE(all.equal(lhs, rhs))))
}Professional example (Python)
import numpy as np
import pandas as pd
np.random.seed(42)
# -- Business scenario: gradient norm vs. learning rate ---
# Demonstrates absolute homogeneity: ||alpha * grad||_2 = alpha * ||grad||_2
# Shows how step size scales exactly linearly with learning rate.
N_PARAMS = 10
n_trials = 8
# Simulate gradient vectors of varying magnitudes
gradients = [np.random.randn(N_PARAMS) * scale for scale in np.linspace(0.1, 5.0, n_trials)]
learning_rates = [0.001, 0.01, 0.1, 1.0]
results = []
for lr in learning_rates:
for i, grad in enumerate(gradients):
step = lr * grad # alpha * gradient
step_norm = np.linalg.norm(step) # ||alpha * grad||
predicted = abs(lr) * np.linalg.norm(grad) # |alpha| * ||grad||
results.append({
"learning_rate": lr,
"grad_trial": i,
"grad_norm": round(np.linalg.norm(grad), 4),
"step_norm": round(step_norm, 4),
"predicted_norm": round(predicted, 4),
"matches": np.isclose(step_norm, predicted),
})
df = pd.DataFrame(results)
print("All absolute homogeneity checks pass:")
print(f" {df['matches'].all()}")
print(f"\nSample rows (lr=0.01):")
print(df[df["learning_rate"] == 0.01][["grad_norm", "step_norm", "predicted_norm", "matches"]].head(5).to_string(index=False))
print("\nConclusion: step_norm = lr * grad_norm always. Step size is exactly proportional to lr.")Source: MML1 p. 76