Deep-network initialization for absolute#
The absolute construction (mode="absolute") constrains weights to |W|. Under a generic
init (he_normal) this is poorly conditioned with depth, and deep absolute stacks fail to
train. mononet now derives a static, per-activation init (variance-preserving gain +
layer-mean-centering bias; mononet.core.init.absolute_init_params), the default for
mode="absolute".
What this fixes. At moderate depth the new init makes absolute train where the old
he_normal default does not (see the table below — lower train MSE is better; the target is
unit-variance, so about 1.0 means “not learning”).
What it does not fix (Follow-up B). A genuinely deep (>= 8) plain stack still blows up:
|W|’s all-positive weights make layer outputs strongly correlated, so variance compounds
with depth — for both absolute and switch. Static per-layer init cannot make an
unnormalized deep stack forward-stable. Deep training is the subject of Follow-up B
(near-identity MonoResidual skip connections every few layers, and/or normalization).
import json
from pathlib import Path
import pandas as pd
RESULTS = Path("../../benchmarks/results/deep-init/trainability.json")
if not RESULTS.exists():
print(
"No deep-init results committed yet. Run the sweep "
"(see benchmarks/README.md, 'Deep-network init')."
)
else:
rows = json.loads(RESULTS.read_text())
df = pd.DataFrame(rows)
table = df.pivot_table(index="depth", columns="method", values="final_train_mse")
display(table)
| method | absolute (he_normal) | absolute (new init) | switch |
|---|---|---|---|
| depth | |||
| 2 | 1.7324 | 0.1167 | 0.0945 |
| 4 | 1.9424 | 0.8033 | 14.7118 |
| 8 | 2.0000 | 2.0000 | 373799.6256 |
| 16 | 2.0000 | 1000000.0000 | 1000000.0000 |