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

Регуляризация? Ортогонализация! Улучшаем компактные сети

Время на прочтение7 мин
Количество просмотров4.6K
Всего голосов 11: ↑11 и ↓0+11
Комментарии14

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

Прикольно. Скажите, вы наверное в курсе. А какие-нибудь другие регуляризации кроме L1 и L2 и вот этой вашей ортоганализации вы можете назвать? Меня интересуют методы, которые используют не только информацию о весах, а ещё что-нибудь из данных, которые можно из сети выковырять. Я когда-то в эту сторону эксперементировал, и просто интересно на сколько велосипед изобретался.
Посмотрите на главу про регуляризацию в Deep Learning Book, там конечно нет ничего принципиально нового, но основы с ссылками обозреваются. www.deeplearningbook.org/contents/regularization.html
В некотором смысле, early stopping, drop out и аугументация тоже являются регуляризацией.
Мда, хождения по ссылкам мне не избежать. :)
Есть специфичные техники как drop connect, sample pairing, mixup (статьи гуглятся по этим названиям), которые независят от весов и модифицируют именно входные данные. При этом, по своему эффекту они ближе к регуляризации, чем к аугментации, так как создают неправдоподбные изображения. Они не являются универсальными, но иногда могут помочь.
Спасибо, но я имел виду не это, а разные способы учитывания значения производной по синапсу при рассчёте его регуляризации. Я когда-то такой велосипед изобретал, но это было очень давно, целых пять лет назад. Было интересно, навевает ли это какие-то ассоциации тем, кто глубоко погружён в тему, и по всем ссылкам прошёл.

Ещё один вопрос на миллион, если можно. Вы какой движок используете для исполнения сильно разреженных сетей, где выжило, например 5-10% синапсов от своего полносвязанного предка? Я раньше свой писал вариант, но сейчас наверняка что-то претендует на индустриальный стандарт.
У нас полностью свой движок для исполнения сетей.
посмотри LayerNorm, InstanceNorm, BatchNorm и прочие
посмотри различные методы оптимизации...
это всё по одной теме: как сделать так, чтобы одна и та же сетка лучше училась.
Идея очень простая, но интересная! Спасибо за пост)
Несколько вопросов:
1) Пробовали вы прогонять алгоритм на более сложных датасетах? Хотелось бы увидеть как это работает на реальных данных.
2) Правильно ли я понимаю, что чем больше параметров в сети, тем меньше эффект от алгоритма? И если взять что-то большое, тип ResNet-101, то возможно прирост в качестве окажется минимальным?
3) На реальных данных почти никто не учит нейронки с нуля, берут предобученную на ImageNet'е модель и файнтюнят на своем датасете. Даст ли ортогонализация прирост в качестве, если дообучать уже готовые фильтры?
1) Пробовали на синтетически сгенерированных строках текста (цифры) с сильно отличающимися фонами и аугментацией. В среднем небольшой, но прирост есть.
2) Наши эксперименты показали, что эффект тем меньше, чем больше сверточных фильтров. Но тут есть одно но, а именно насколько ваши обучающие данные соответствуют тестовым. При малом числе фильтров сети ничего не остается, кроме как выцеплять наиболее значимые и глобальные для классов признаки. Имея же дополнительные фильтры в запасе, их можно настроить в линейно зависимом виде, но с прицелом на признаки, характерные не только для объектов, а для конкретного датасета в целом (без переобучения, учитывая искажения, особенности фона, и прочее). Так как наша регуляризация препятствует этому, качество может получиться даже хуже. Поэтому на практике все зависит от данных: если трейн слабо коррелирует с тестом, то мы предполагаем, что наша регуляризация только поможет. Если же трейн полно описывает закономерности в тестовых данных (что и было у нас в MNIST и CIFAR10), то обучение с большим количеством фильтров на особенностях датасета не является чем то плохим и потому пользы от нашей регуляризации будет меньше.
3) Мы не проводили подобных экспериментов, поэтому гарантировать какой-либо эффект тут затруднительно. Все зависит от того, на каких данных будете дообучать и насколько тяжела архитектура (аналогично ответу на 2ой вопрос).
В этой статье делали что-то похожее + есть код на гитхабе:
«Layer rotation: a surprisingly powerful indicator of generalization in deep networks?»
В чем Ваша новизна?
И как раскрыты маленькие сети в статье? Исследовалась ли зависимость эффективности ортогонализации от размера сети?
Эксперименты на MNIST и CIFAR-10… ну, такое… Особенно, когда у вас всего 37 ошибочно распознанных изображений и после применения алгоритма вы получаете 36 ошибочно распознанных изображений… Это запросто может быть погрешностью измерения, а если у вас было хотя бы 10 экспериментов, из которых вы выбрали лучший результат — то наверняка так и есть…
Вот ещё такое есть: Equi-normalization of Neural Networks (код: github.com/facebookresearch/enorm) и вот такое: Semi-Orthogonal Low-Rank Matrix Factorization for Deep Neural Networks. (какой-то код: github.com/cvqluu/Factorized-TDNN )
Посмотрите сами работы и по их ссылкам пройдитесь, там ещё другие работы есть… да и сравнить бы результат разных методов ортогонализации… хотя бы при доучивании какой-нибудь сетки на ImageNet, если хотите не сильно большую — ну возьмите EfficientNet, MobileNet V2 / V3 или ResNet34 (ResNet18 всё таки хуже по качеству).
А ещё, конечно же, лучше учить более крупную сетку, и потом её уменьшать (применив PCA, если вам так хочется добавить ортогонализации...), вместо того, чтобы учить мелкую сетку… Что несколько уменьшает ценность ваших выводов…

В целом, вот пока что мой вывод от исследования данных методов: подобная оптимизация повышает среднее качество сети (разброс качества одной и той же сетки при разных рандом сидах и немного отличающихся гиперпараметрах может быть до 5%!), но почти не влияет или совсем не влияет на качество лучшей сети. Ну и методы типа SWA (Stochastic Weight Averaging), что удивительно, приводят примерно к такому же результату, так что ортогонализацию можно совсем не использовать.
Да, и, кстати, ещё есть Grouped Convolutions… они случаем не будут похожи на ортогонализацию?
1) Наши эксперименты и предполагали проверку того, что метод улучшает среднее качество сетей — мы брали среднее качество по 10 экспериментам, а не лучшее достигнутое.
2) Насчет названных вами архитектур — мы ни в каком виде не ориентируемся на сети с таким большим количеством параметров. Минимальное число коэффициентов среди названных вами архитектур примерно в 50-100 раз больше, чем в распознающих текст сетях у нас. И ведь это только число коэффициентов, количество операций же будет значительно больше (т.к. сети сверточные). Если мы будем использовать подобные модели при распознавании того же паспорта РФ, где происходит более 20 вызовов нейронных сетей на различных полях, то об использовании такой системы на мобильнике можно забыть (на условном iPhone 5s или того хуже, а не на самых современных флагманах с нейронными сопроцессорами).
3) Насчет облегчения тяжелых сетей, вместо того чтобы учить сразу легкую сеть — это крайне спорное утверждение. Если тяжелая сеть обучилась так, что после этого из нее можно выкинуть 90% связей — то мы предпочтем сделать это еще на этапе подготовки архитектуры. Здесь же мы предпочтем и убрать лишние слои, сократив их до минимума. К сожалению, главная проблема, в которой мы много раз убеждались на практике — чтобы получить быстро работающую сеть, ориентироваться только на число параметров/операций недостаточно. При прогоне обученной сети существует множество различных оптимизаций как быстро вычислять выход сети, в ходе которых та же сепарабельность фильтров и т.п. подходы могут полностью перекрываться оверхедами, связанными, например, с дополнительными копированиями.
На счёт 3-его пункта вы на самом деле неправы. Раз уж взялись делать сильно разреженные сети надо пользоваться всеми их преимуществами. :) habr.com/ru/post/249031 Вот в этой моей статье аж 2015 ого года приводится пример нейросетки из 37 нейронов (из них 3 выходных) и 460 синапсов в 11 условных слоях. И если вы изначально попытаетесь взять сетку с итоговой архитектурой и обучить её на такое качество, то хрена с два у вас что получится. :))) Можете попробовать, с интересом погляжу на сколько вам удастся приблизиться при условии указанных ограничений. :)

Это связанно с тем, что адаптивный рельеф для таких задач дофига не гладкий, и архитектура, которая является оптимальной при данных весах синапсов при других будет ужасной. Сеть у вас просто не придёт в такое состояние, потому что для этого пришлось бы километр топать против градиента и через сотни локальных минимумов.
Хотя я тут подумал, что если у вас всего 10 полносвязаных нейронов, например, то в вашем случае действительно разрежать особо нечего. Все мои рассуждения и опыты делались на гораздо более классических сетях.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий