Является ли инициализация веса разной для плотных и сверточных слоев?
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.