Различные способы инициализации весов встраивания слоя в Pytorch - PullRequest
1 голос
/ 21 марта 2019

Кажется, что есть два способа инициализации встраиваемых слоев в Pytorch 1.0 с использованием равномерного распределения.

Например, у вас есть встраиваемый слой:

self.in_embed = nn.Embedding(n_vocab, n_embed)

И вы хотите инициализировать еговеса с равномерным распределением.Первый способ сделать это:

self.in_embed.weight.data.uniform_(-1, 1)

И еще один будет:

nn.init.uniform_(self.in_embed.weight, -1.0, 1.0)

Мой вопрос: в чем разница между первой и второй формой инициализации.Оба метода делают одно и то же?

Ответы [ 2 ]

1 голос
/ 21 марта 2019

По моим сведениям, обе формы идентичны, когда @ mujjiga отвечает.

В общем, мои предпочтения касаются второго варианта, потому что:

  1. Вы должны получить доступ к атрибуту .data в ручном регистре.

  2. Использование torch.nn.init более явно и читабельно (немного субъективно)

  3. Позволяет другим легче изменять ваш исходный код (если бы они изменили схему инициализации, скажем, на xavier_uniform, изменилось бы только имя).

Небольшой оффтоп: TBH, я думаю, torch.nn.init должен вызываться на самом слое, поскольку это помогло бы инициализировать torch.nn.Sequential модели с использованием простых model.apply(torch.nn.init.xavier_uniform_). Кроме того, для него может быть полезно инициализировать bias Tensor (или использовать соответствующий аргумент) для него, но это то, что есть.

1 голос
/ 21 марта 2019

Оба одинаковы

torch.manual_seed(3)
emb1 = nn.Embedding(5,5)
emb1.weight.data.uniform_(-1, 1)

torch.manual_seed(3)
emb2 = nn.Embedding(5,5)
nn.init.uniform_(emb2.weight, -1.0, 1.0)

assert torch.sum(torch.abs(emb1.weight.data - emb2.weight.data)).numpy() == 0

Каждый тензор имеет метод uniform_, который инициализирует его значениями из равномерного распределения.Кроме того, модуль nn.init имеет метод uniform_, который принимает тензор и присваивает ему значения из равномерного распределения.Оба одинаковы, ожидайте, что первый использует функцию-член, а второй использует общую функцию полезности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...