Как стать автором
Обновить

Комментарии 10

Когда-же этакую таблетку-оптимизатор для нейросетей мозга изобретут?)

Спасибо за информацию, актуально для предстоящей работы. Думал делать перебор, вырубать нейроны и оценивать результат работы сети. Благо процедура разовая.
Прямо как в живом мозге на раннем этапе развития, когда первоначальный массивный нейрогенез сменяется массовым отмиранием «не нашедших себя» нейронов и синапсов. Занятно, что происходит это задолго до того, когда, казалось бы, мозг человека учится наиболее интенсивно.
Спасибо за наукоёмкую статью! Хабр торт!
Вопросы:
1. Правльно ли я понял, что в конечных результатах показаны графики на которых отмечен процент редукции весов, но алгоритмы (оба, L1, L0) удаляют нейроны целиком? Т.е. получаются не разреженные матрицы весов, а просто более «простая» архитектура сети? было бы интересно нарисовать… архитектуру что ли, сеть «до» и «после» такого прунинга. Или табличку кол-ва нейронов в слоях до и после прунинга.

2. А если руками какой-то слой раздуть в 20 раз, алгоритм эти 20 раз обратно спрунит? Т.е. его первым спрунит без ухудшения качества, а потом за остальные возьмется?

3. А если сравнивать эти алгоритмы с классческими типа Optimal Brain Damage, где прунятся веса, а не нейроны, то где при одинаковом кол-ве нейронов точность выше? Наверное, если точечно обнулять веса, а не нейроны целиком, то сжать можно сильнее? Было бы интересно на графиках так же видеть результат прунинга этими алгоритмами vs алгоритмами прунинга нейронов целиком.
  1. Да, нейроны удаляются целиком, но на графике именно компрессия по весам. Так сделано потому что в конечном итоге нас интересуют сэкономленные TFLOPS'ы, а они кореллируют именно с убранными весами. Тогда как количество весов нелинейно зависит от количества редуцированных нейронов. Так если предположить, что в сети N >> 1 одинаковых слоёв, и из каждого слоя мы убираем по 50% нейронов, то количество весов сократится на 75%.

    Вообще, действительно стоило выложить и прокомментировать финальную архитектуру, но там вроде бы ничего особо интересного. У меня получилось, что при одинаковом размере слоёв нейроны сильнее удаляются из первых свёрточных слоёв, и полносвязных слоёв прямо перед logit-слоем. Впрочем, это может зависить от архитектуры сети и конкретной задачи, так что не хочется делать обобщения.
  2. Хороший вопрос. Если размеры слоёв выбраны удачно (т.е. нейронов хватает на все полезные фичи из предыдущего слоя), то скорее всего да, может, не в 20 раз, а поменьше, но примерно так. Этот вопрос уже залезает исследования широких сетей. Может быть я когда-нибудь попробую поэкспериментировать с обучением сильно раздутых сеток. Это перекликается с моей предыдущей статьёй про ландшафт функции потерь нейронной сети.
  3. Не совсем честно сравнивать OBD и групповые алгоритмы прунинга, т.к. последние налагают ещё дополнительное ограничение, какие веса нужно делать менее значимыми вместе. Мне кажется, что при одинаковой изначальной структуре сети и одинаковом количестве удалённых весов, OBD покажет больший val accuracy, но результат L0 или L1 группового алгоритма будет тратить меньше TFLOPS.

Если прунятся именно нейроны, то это пересекается уже с AutoML. Можно попробовать делать поиск оптимальной архитектуры с точки зрения ширины слоев, выкидывая нейроны там где они прунятся хорошо, и подсыпая туда где плохо. Да, наверное, потребуется при этом обучать сеть каждый раз заново, но тем не менее. Может быть, хотя бы так появится хоть один вменяемый критерий «как выбрать ширину слоя», типа если процент прунинга нейронов по всем слоям одинаковый, то типа ширина всех слоев оптимальна.
> Можно попробовать делать поиск оптимальной архитектуры с точки зрения ширины слоев, выкидывая нейроны там где они прунятся хорошо, и подсыпая туда где плохо.
Да, звучит разумно.
Так сделано потому что в конечном итоге нас интересуют сэкономленные TFLOPS'ы, а они кореллируют именно с убранными весами. Тогда как количество весов нелинейно зависит от количества редуцированных нейронов.

Я так понимаю, это верно только для разреженных матриц? Для плотных как раз хорошо выкидывать нейроны (столбцы) целиком.
В данном случае, это верно и для тех и для других. Мы ведь и выкидываем нейроны целиком. Но я полагаю, что выкинуть 16 нейронов с 128 связями (2048 весов) лучше с точки зрения TFLOPS, чем 16 нейронов с 64 связями (1024 весов).

Но вообще да, для плотных матриц между TFLOPS и вырезанными весами тоже зависимость не совсем линейная из-за внутренней GPU'шной кухни. Выкинуть 16 нейронов с 64 связями это не то же самое, что выкинуть 64 нейрона с 16 связями. По-честному нужно было посчитать график TFLOPS на пачку inference'ов (что и делают в некоторых статьях), но я поленился.
А, ну в этом смысле согласен, я имел в виду, что если порезать только _часть_ синапсов данного нейрона, производительность типового решения (плотные матрицы) не вырастет.
если порезать только _часть_ синапсов данного нейрона, производительность типового решения (плотные матрицы) не вырастет.

Разумеется, в этом и есть основной смысл именно понейронного прунинга. Я упомянул об этом во введении.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории