Вы на собеседовании на должность ML Engineer в Tesla. Интервьюер: Нам нужно развернуть нейронную сеть на аппаратном обеспечении автомобиля, но она не помещается в память. Как бы вы с этим справились? Вы: Я использую дистилляцию знаний, чтобы обучить меньшую модель. Собеседование завершено. Вот что вы пропустили:
Дистилляция знаний требует недель вычислений, потому что по сути вы обучаете новую модель. Но решение уже внутри вашей обученной сети. Большинство нейронов - это мертвый груз - они потребляют память, но едва способствуют предсказаниям. Давайте посмотрим, как их идентифицировать!
Вот шаги: Шаг 1) Обучите нейронную сеть как обычно. Шаг 2) Пропустите валидационный набор через обученную сеть, и для каждого нейрона в скрытых слоях вычислите: - Среднюю активацию - Дисперсию активаций (если активации могут быть отрицательными) Проверьте это👇
Шаг 3) Удалите нейроны, которые имеют почти нулевое среднее значение активации и дисперсию, так как они имеют небольшое влияние на выход модели. В идеале, постройте график производительности при различных порогах обрезки, чтобы выбрать модель, которая соответствует вашим компромиссам между размером и точностью. Проверьте это 👇
Давайте посмотрим на код. Мы начинаем с определения простой нейронной сети и ее обучения. Поскольку мы позже будем вычислять активации на уровне нейронов для обрезки, мы возвращаем все промежуточные активации в прямом проходе. Проверьте это👇
Далее мы определяем два списка с тремя элементами: - Один будет хранить среднее значение активаций - Другой будет хранить стандартное отклонение активаций Мы пропускаем валидационный набор через нашу модель, чтобы вычислить эти статистики для каждого скрытого слоя. Проверьте это 👇
На этом этапе давайте создадим график распределения статистики на уровне нейронов, которую мы сгенерировали выше. Как показано ниже, средние активации большинства нейронов и их стандартное отклонение сильно распределены вокруг значений, близких к нулю. Давайте попробуем обрезать их дальше.
Для обрезки мы проходим по списку порогов и: - Создаем новую сеть и переносим веса, которые проходят порог. - Оцениваем новую сеть и вычисляем общее количество параметров. - Добавляем результаты в список. Проверьте это 👇
Эта таблица сравнивает точность и уменьшение размера обрезанной модели по нескольким порогам относительно оригинальной модели. При mean=0.1 и std-dev=0.4: - Точность модели снижается на 0.08%. - Размер модели уменьшается на 62%. Это огромное сокращение. Проверьте это 👇
Вот еще один интересный результат. При mean=0.5 и std-dev=1: - Точность модели снижается на 0.5%. - Размер модели уменьшается на 74%. Таким образом, мы получаем почти аналогичную производительность при 1/4 параметров. Проверьте это 👇
Конечно, существует компромисс между точностью и размером. По мере уменьшения размера его точность снижается (посмотрите видео). Но в большинстве случаев точность не является единственным показателем, который мы оптимизируем. Вместо этого несколько операционных метрик, таких как эффективность, память и т. д., являются ключевыми факторами.
381