С каждым днем сфера применения нейронных сетей расширяется, требуется все большая скорость работы, поддерживаемость на разных устройствах. И одна из задач которая встает перед разработчиками это уменьшение времени обучения и инференса нейронных сетей. Делать это можно как аппаратно за счет железа, так и программно, за счет уменьшения количества вычислений, уменьшений размера сети и т.д. , давайте рассмотрим второй вариант.
Прунинг. Нейронная сеть состоит из множества нейронов и взвешенных связей. Но зачастую, если сеть достаточно глубокая не все нейроны одинаково важны, некоторые практически не вносят вклада в итоговое предсказание. Прунинг или прореживание это удаление таких "неважных" нейронов и как следствие уменьшение размера сети. Как понять что нейрон не важен? Для этого применяется множество разных эвристик, например отрезание по весу, если он близок к нулю или ранжирование весов по L1, L2 норме, соответствующие возможности уже вшиты например в PyTorch.
После прунинга важно проводить 1-2 эпохи дообучения, чтобы свести к минимуму возможную потерю информации.
Дистилляция. Дистилляция это процесс передачи знаний от большой модели к маленькой, с более простой архитектурой. Происходит это следующим образом: большая тяжеловесная модель обучается решать поставленную задачу, меньшая модель обучается повторять предсказания большой. В итоге, в некоторых случаях может достигать даже лучших результатов!
Квантизация. Обычно, нейронные сети оперируют числами с плавающей точкой, которые занимают 32 бита (float32), это достаточно большой объем. А что если конвертировать это в целые 8 битные, а еще лучше 4х битные числа? Тогда нейронная сеть будет занимать меньше места и сможет поместиться в браслет или чайник. Идея квантизации достаточно проста: мы переводим числа из одного диапазона например (-1,1) в другой (-128, 128), таким образом переводя числа с плавающей точкой в целые числа. Здесь неминуемо теряется информация, но в то же время модель становится более легковесной. Поэтому тут, как и во всем, приходится искать баланс🧘
Приходилось ли вам ускорять (ужимать) свои нейронные сети?
Прунинг. Нейронная сеть состоит из множества нейронов и взвешенных связей. Но зачастую, если сеть достаточно глубокая не все нейроны одинаково важны, некоторые практически не вносят вклада в итоговое предсказание. Прунинг или прореживание это удаление таких "неважных" нейронов и как следствие уменьшение размера сети. Как понять что нейрон не важен? Для этого применяется множество разных эвристик, например отрезание по весу, если он близок к нулю или ранжирование весов по L1, L2 норме, соответствующие возможности уже вшиты например в PyTorch.
После прунинга важно проводить 1-2 эпохи дообучения, чтобы свести к минимуму возможную потерю информации.
Дистилляция. Дистилляция это процесс передачи знаний от большой модели к маленькой, с более простой архитектурой. Происходит это следующим образом: большая тяжеловесная модель обучается решать поставленную задачу, меньшая модель обучается повторять предсказания большой. В итоге, в некоторых случаях может достигать даже лучших результатов!
Квантизация. Обычно, нейронные сети оперируют числами с плавающей точкой, которые занимают 32 бита (float32), это достаточно большой объем. А что если конвертировать это в целые 8 битные, а еще лучше 4х битные числа? Тогда нейронная сеть будет занимать меньше места и сможет поместиться в браслет или чайник. Идея квантизации достаточно проста: мы переводим числа из одного диапазона например (-1,1) в другой (-128, 128), таким образом переводя числа с плавающей точкой в целые числа. Здесь неминуемо теряется информация, но в то же время модель становится более легковесной. Поэтому тут, как и во всем, приходится искать баланс🧘
Приходилось ли вам ускорять (ужимать) свои нейронные сети?