Стандарт инициализации Xavier не соответствует ожиданиям

Вопрос или проблема

Ожидаемое стандартное отклонение Инициализации Xavier для тензора с размерностью D будет $1 / \sqrt (D)$, но на практике это не так. Пожалуйста, помогите понять, почему.

import torch

D = 27


x = torch.zeros(1, D)
torch.nn.init.xavier_normal_(x)
torch.std(x, dim=-1)
-----
tensor([0.2820])

Ожидаемое стандартное отклонение

1 / np.sqrt(D)
---
0.1925

Ответ или решение

Инициализация весов — важный этап в обучении нейронных сетей, и метод инициализации Xavier (или Glorot) представляет собой один из популярных подходов для равномерного распределения значений весов. При этом возникает вопрос относительно ожидаемого стандартного отклонения для инициализации, которое зависит от размерности тензора.

Вы заметили, что ожидаемое стандартное отклонение для D-мерного тензора по формуле

[
\frac{1}{\sqrt{D}}
]

равно 0.1925, в то время как фактическое стандартное отклонение, вычисленное после применения функции torch.nn.init.xavier_normal_, составляет 0.2820. Давайте разберем, почему может возникать такое несоответствие.

Причины различий в стандартном отклонении

  1. Тип распределения: Функция torch.nn.init.xavier_normal_ инициализирует веса по нормальному распределению с нулевым средним и стандартным отклонением, вычисленным на основе входного количества нейронов. Важно понимать, что стандартное отклонение в данном случае может зависеть не только от размерности D, но и от других факторов, таких как количество входных и выходных нейронов в слоях. Если не указан параметр gain, то по умолчанию используется значение 1.

  2. Число значений для стандарта: В вашем коде создается один тензор размерности (1, D), при этом стандартное отклонение вычисляется по 27 элементам, что также может повлиять на итоговое значение. Стандартное отклонение для одного большого вектора чисел может не полностью отражать теорию, основанную на многомасштабном представлении нейронной сети.

  3. Статистическая выборка: Индивидуальный пример инициализации может не дать точное значение, ближайшее к теоретическому. Вы можете проверить это, инициализируя множество весов и усредняя стандартное отклонение по всем инициализациям, чтобы получить более точную оценку.

Как это проверить?

Вы можете протестировать несколько попыток и оценить стандартное отклонение на большом количестве инициализаций:

import torch
import numpy as np

D = 27
num_samples = 1000
stds = []

for _ in range(num_samples):
    x = torch.zeros(1, D)
    torch.nn.init.xavier_normal_(x)
    stds.append(torch.std(x, dim=-1).item())

mean_std = np.mean(stds)
print("Среднее стандартное отклонение:", mean_std)
print("Ожидаемое стандартное отклонение:", 1 / np.sqrt(D))

Таким образом, вы сможете получить большее число выборок, что даст вам более близкое значение к теоретическому стандартному отклонению.

Заключение

Несоответствие между вашим ожидаемым и фактическим стандартным отклонением может быть вызвано несколькими факторами, связанными с методами инициализации и выборками. Рассматривая множество инициализаций, вы сможете более точно приблизиться к теоретически ожидаемым значениям.

Оцените материал
Добавить комментарий

Капча загружается...