Neural Architecture Search (NAS)
Автоматизированный поиск нейросетевой архитектуры (NAS) подбирает структуру нейросети, перебирая слои и связи. Разбираем методы, вычислительные затраты и модели, созданные с помощью NAS.
Поиск нейронных архитектур (NAS) — это направление автоматизированного машинного обучения (AutoML), которое автоматически проектирует структуру нейронной сети. Вместо того чтобы инженер вручную выбирал свёртку и другие типы слоёв, глубину, ширину и связи, алгоритм поиска предлагает варианты архитектур, оценивает, насколько хорошо каждая из них справляется с задачей, и использует результаты, чтобы предлагать более удачные варианты. Целевой метрикой обычно служит точность, при этом часто учитываются затраты, например задержка инференса, количество параметров или FLOPs на целевом оборудовании. NAS привёл к появлению нескольких широко используемых в области компьютерного зрения базовых сетей, включая EfficientNet и MobileNetV3.
Как работает NAS#
В обзоре в Journal of Machine Learning Research методы NAS классифицируются по трём направлениям:
- Пространство поиска: Набор архитектур, которые можно построить: например, допустимые типы операций, размеры ядер и пропускаемые соединения, а также способы их объединения. Многие методы ищут небольшую повторяющуюся ячейку, а затем собирают сеть из её копий. Это сокращает пространство поиска и позволяет переносить ячейку, найденную на небольшом наборе данных, на крупный.
- Стратегия поиска: Алгоритм, который выбирает варианты для проверки: от контроллеров с обучением с подкреплением и эволюционных методов до градиентных методов и простого случайного перебора.
- Стратегия оценки производительности: Способ оценить вариант без полного обучения: использовать меньше эпох обучения, изображения или наборы данных меньшего размера, прогноз итоговой точности либо общие веса для разных вариантов.
От тысяч дней работы GPU до нескольких часов#
Первые методы NAS требовали больших затрат, поскольку каждый вариант обучали до сходимости. В исследовании Зофа и Ле 2016 года рекуррентный контроллер, обученный с помощью обучения с подкреплением, генерировал сети, а поиск одновременно выполнялся на 800 GPU. В последующей работе NASNet ячейку, перенесённую на ImageNet, искали на 500 GPU в течение четырёх дней. AmoebaNet достигла похожих результатов с регуляризованной эволюцией, потратив около 3,150 дней работы GPU. ENAS сократил поиск до менее чем 16 часов на одном GPU за счёт общих весов модели для всех вариантов, рассматриваемых как подграфы одной большой сети. В DARTS дискретный выбор операций заменили непрерывными весами, благодаря чему саму архитектуру можно было оптимизировать градиентным спуском за несколько дней работы GPU. Бенчмаркинг также охладил энтузиазм в этой области: случайный поиск с ранней остановкой показал результаты не хуже ENAS на тестах Penn Treebank и CIFAR-10.
NAS с учётом аппаратного обеспечения и созданные с помощью NAS модели#
Наибольшее практическое влияние NAS оказал на эффективные модели для периферийного ИИ, где нужно находить баланс между точностью и скоростью на конкретном устройстве. MnasNet включил задержку, измеренную на реальных телефонах, в целевую функцию поиска и достиг точности top-1 на ImageNet 75.2% при времени обработки 78 мс на телефоне Pixel — в 1.8 раза быстрее MobileNetV2 при точности на 0.5% выше. EfficientNet-B0 появилась в результате похожего поиска, после чего её масштабировали до семейства B1-B7 методом комплексного масштабирования; MobileNetV3 объединила NAS с учётом аппаратного обеспечения и алгоритм NetAdapt для настройки под мобильные CPU. Для обнаружения объектов модели YOLO-NAS от Deci, найденные поисковой системой AutoNAC и разработанные так, чтобы минимизировать снижение точности после квантования INT8, доступны для инференса, валидации и экспорта в пакете Ultralytics через класс NAS, но не для обучения. Позднее NVIDIA приобрела Deci, и исходная команда больше не обновляет эти модели.
Простейший пример NAS#
В следующем примере используется простейшая стратегия поиска — случайная выборка из небольшого пространства многослойных перцептронов для набора рукописных цифр из scikit-learn. Каждый вариант обучается всего 30 эпох как недорогой способ оценки производительности и оценивается на проверочных данных:
import random
import warnings
from sklearn.datasets import load_digits
from sklearn.exceptions import ConvergenceWarning
from sklearn.model_selection import train_test_split
from sklearn.neural_network import MLPClassifier
warnings.simplefilter("ignore", ConvergenceWarning) # short training runs are the cheap estimate
X, y = load_digits(return_X_y=True)
X_train, X_val, y_train, y_val = train_test_split(X / 16, y, random_state=0)
# Search space: 1-3 hidden layers, each 8-128 units wide. Search strategy: 12 random samples
random.seed(0)
space = [8, 16, 32, 64, 128]
candidates = {tuple(random.choices(space, k=random.randint(1, 3))) for _ in range(12)}
# Performance estimation: train each candidate for only 30 epochs, then score it on validation data
scores = {}
for layers in candidates:
model = MLPClassifier(hidden_layer_sizes=layers, max_iter=30, random_state=0)
scores[layers] = model.fit(X_train, y_train).score(X_val, y_val)
worst, best = min(scores, key=scores.get), max(scores, key=scores.get)
print(f"{len(scores)} architectures: worst {worst} {scores[worst]:.3f}, best {best} {scores[best]:.3f}")Из 12 вариантов получаются 10 уникальных архитектур; точность на проверочных данных варьируется от 0.398 для двух слоёв по 8 нейронов до 0.978 для слоёв из 128, 128 и 16 нейронов. Таким образом, только выбор архитектуры меняет точность почти на 60 процентных пунктов. В полном запуске NAS победителя переобучили бы до сходимости, а его результат оценили бы на отдельной тестовой выборке.
NAS и связанные термины#
- Настройка гиперпараметров: Оптимизирует параметры обучения, например скорость обучения, для фиксированной архитектуры. В NAS переменной становится сама архитектура; эти процессы часто выполняют вместе.
- Прореживание модели и дистилляция знаний: Уменьшают уже обученную сеть или имитируют её, тогда как NAS ищет эффективную архитектуру до обучения.
- Перенос обучения: Повторно использует выученные веса предварительно обученной модели. NAS определяет структуру, которую заполнят эти веса; сети, найденные с помощью NAS, например EfficientNet, сами стали популярными предварительно обученными базовыми сетями.










