🎓Правильная инициализация весов нейронной сети
При обучении нейросети используется градиентный спуск, метод нахождения локального минимума или максимума функции. В градиентном спуске нужно выбрать начальную точку для спуска, то есть начальные значения весов.
Обычно эта точка выбирается случайно. Но от неё существенно зависит успех градиентного спуска. Поэтому веса нужно инициализировать наиболее удачным образом.
🌸
Хорошее начальное приближение
Начальные значения весов должны быть далеко от плато
Иначе на первых итерациях градиентного спуска мы столкнёмся с затуханием градиента.
В целом, нужно вывести такое правил
о: «генерировать начальные значения весов с помощью случайных чисел из интервала [a, b]». И вот эти a и b следует найти.
➡️
Как это сделать?Например, когда нам нужно сгенерировать веса между парой полносвязных слоёв и каждый слой состоит из n нейронов, то вполне можно было бы выбрать диапазон [-1/n; 1/n].
Если же в слоях разное число нейронов, то в вышеприведённом интервале n можно заменить на среднее арифметическое числа нейронов в соседних слоях.
❗️Выше было упрощённо описано правило Xavier. В оригинале веса генерируются не из такого простого интервала [-1/n; 1/n], а с помощью равномерного распределения с дисперсией 1/n. Но суть примерно такая же.
Можно пользоваться готовой функцией из PyTorch:
conv1 = torch.nn.Conv2d(...)
torch.nn.init.xavier_uniform(conv1.weight)
Также в случае с инициализацией Xavier стоит помнить, что этот способ подходит для симметричных относительно нуля функций активации (например гиперболический тангенс).
🔹 Курс «Математика для разработки AI-моделей»🔹
Получить консультацию менеджера🔹 Сайт Академии 🔹 Сайт Proglib
🏃♀️ Proglib Academy
#буст