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

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

Ожидаемое стандартное отклонение инициализации 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

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

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

  1. Формула инициализации: Инициализация Xavier (также известная как инициализация Глорот) предполагает, что веса нейронной сети инициализируются нормально распределёнными значениями с нулевым средним и стандартным отклонением:
    [
    std = \sqrt{\frac{2}{n{in} + n{out}}}
    ]
    где (n{in}) и (n{out}) – количество входных и выходных нейронов, соответственно.

  2. Ваш пример: В вашем коде:

    import torch
    
    D = 27
    x = torch.zeros(1, D)
    torch.nn.init.xavier_normal_(x)
    print(torch.std(x, dim=-1))

    Параметр (D) здесь равен 27, но x рассматривается как однопараметрный тензор. Следовательно, количество входов и выходов определяются по умолчанию как (n{in} = D) и (n{out} = 1) (или наоборот, в зависимости от структуры). Тем самым, ожидаемое стандартное отклонение будет подсчитано как:
    [
    std = \sqrt{\frac{2}{D + 1}}
    ]

  3. Сравнение с теоретическим значением: Ожидаемое значение стандартного отклонения, которое вы вычислили вручную, составляет:
    [
    \frac{1}{\sqrt{D}} \approx 0.1925
    ]
    Однако функция xavier_normal_ использует другую формулу, из-за чего фактическое значение (0.2820) получается именно из:
    [
    std = \sqrt{\frac{2}{27 + 1}} \approx 0.2887
    ]

  4. Заключение: Исходя из вышеизложенного, чтобы получить стандартное отклонение, близкое к ожидаемому, нужно учитывать, как инициализация применяет параметры для вычисления. Если вы хотите использовать инициализацию с учетом только входного измерения, убедитесь, что при инициализации учитываете количество входящих и исходящих нейронов корректно.

Рекомендации

Чтобы углубить ваши знания и корректно использовать Xavier инициализацию, посмотрите на структуру вашей нейронной сети и числа входов/выходов для каждого слоя. Это даст вам более точные значения стандартного отклонения для инициализации весов. Кроме того, изучите альтернативные методы инициализации, такие как инициализация Каймингом, если это подходит для вашей задачи.

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

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