Weight init
3.9 Инициализация весов Xavier¶
При создании ребра с weight_scale \(= \sigma\) функция _init_conv_random:
1. Xavier uniform с gain \(g = |\sigma|\) (если \(\sigma = 0\), то \(g = 1\)):
\[
W_{c',c,i,j} \sim \mathcal{U}\!\left(-a,\; a\right),\quad
a = g\sqrt{\frac{6}{n_\text{in} + n_\text{out}}}
\]
где для Conv2d с \(C_\text{in} = C_\text{out} = 3\):
\[
n_\text{in} = 3 k_h k_w, \quad n_\text{out} = 3 k_h k_w \quad \Rightarrow \quad a = g\sqrt{\frac{6}{6 k_h k_w}} = g \cdot \frac{1}{\sqrt{k_h k_w}}
\]
2. Если \(\sigma < 0\): \(\mathbf{W} \leftarrow -\mathbf{W}\) (инверсия знака).
3. Bias: \(\mathbf{b} \leftarrow \mathbf{0}\).
Диапазон новых \(\sigma\): WEIGHT_INIT_MIN = -2, WEIGHT_INIT_MAX = 2.
Два уровня весов:
| Механизм | Что меняется | Когда влияет на форвард |
|---|---|---|
mutate_weights (мутация \(\sigma\)) |
только weight_scale в гене |
Не меняет \(\mathbf{W}\) до structural rebuild |
finetune_genome (Adam) |
\(\mathbf{W}, \mathbf{b}\) напрямую | Сразу, через backprop |
| structural rebuild | переинициализация \(\mathbf{W}\) из \(\sigma\) | После split/add/remove/crossover |
При rebuild без structural изменений веса сохраняются из snapshot (_snapshot_conv_weights), если \(\sigma\) не менялся.