Является ли инициализация веса разной для плотных и сверточных слоев?

1 Ziofil [2018-01-07 15:56:00]

В плотном слое следует инициализировать весы в соответствии с некоторым правилом. Например, с RELU весы должны поступать из нормального распределения и должны быть перемасштабированы на 2/n, где n - количество входов в слой (согласно Andrew Ng).

То же самое верно для сверточных слоев? Каков правильный способ инициализации весов (и смещений) в сверточном слое?

machine-learning neural-network conv-neural-network data-science activation-function


1 ответ


2 Решение Maxim [2018-01-07 16:12:00]

Обычным инициализатором для сетей на основе сигмоида является инициализатор Xavier (он же инициализатор Glorot), названный в честь Ксавьера Глорота, одного из авторов книги "Понимание трудности обучения глубоким позитивным нейронным сетям". Формула учитывает не только количество входящих соединений, но также и выход. Авторы доказывают, что при этой инициализации распределение активации приблизительно нормальное, что помогает градиентному потоку в обратном проходе.

Для сетей, основанных на relu, лучшим инициализатором является инициализатор He от "Delving Deep to Rectifiers: превышение производительности на уровне человека по классификации ImageNet" от Kaiming He at al., Которые доказывают те же свойства для активации relu.

Плотный и сверточный слой в этом случае не так уж и различны, но важно помнить, что веса ядра распределены между входным изображением и пакетом, поэтому количество входящих соединений зависит от нескольких параметров, включая размер ядра и шага, а может и не легко вычислить вручную.

В tensorflow инициализация He реализуется в функции variance_scaling_initializer() (которая на самом деле является более общим инициализатором, но по умолчанию выполняет инициализацию He), а инициализатор Xavier - логически xavier_initializer().

См. Также обсуждение на CrossValidated.