Перейти к содержанию

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\) не менялся.