Как в PyTorch случайным образом мутировать веса, включая биасы
Объясняем, как написать короткий и нехитрый код для мутаций тензоров PyTorch. С примерами кода и комментариями к нему.
1К открытий1К показов
Объяснение
Цикл обходит все тензоры, по каждому тензору он выполняет следующие действия:
Поэлементно инкрементирует тензор произведением трех переменных:
- сила мутации
- тензор той же размерности, заполненный случайными значениями в промежутке [0..1]
- тензор той же размерности, заполненный случайным образом нулями и единицами, единицы там просыпаны с управляемой вероятностью, потому что мы хотим управлять вероятностью мутирования весов.
Вот в этой последней величине нетривиальная магия.
Что тут происходит: сначала создается тензор заполненный случайными величинами.
Затем каждая величина проверяется на условие что она меньше вероятности мутации,
Получается тензон из булевых значений True/False, и чем ближе вероятность мутации к нулю, тем меньше будет True.
Затем этот тензор, как я понимаю, с помощью TORCH.TENSOR.INT() преобразуется к тензору, содержащему целочисленные значения. То есть:
превращается в:
По сути, при этом умножении, получается маскирование нулями тензора со случайными величинами.
Вывод
Есть серьезное подозрение, что это должно делаться как-то проще, каким-то встроенным методом, но я не нашел. Либо, возможно, мутация весов вот таким варварским образом в корне неверна, я хз.
Как бы там ни было, может быть кому пригодится.
1К открытий1К показов