Есть ли способ явно измерить сложность модели машинного обучения в Python?

Aug 20 2020

Меня интересует отладка модели, и один из пунктов, который он рекомендует, - сравнить вашу модель с «менее сложной», чтобы увидеть, существенно ли улучшилась производительность самой сложной модели.

Возникает мой вопрос:

Предположим, у вас есть модель ансамбля и линейная модель для задачи классификации «Кажется естественным думать, что модель ансамбля более сложна, чем линейная модель»

  1. Но как бы можно было численно измерить сложность модели, чтобы иметь возможность сравнивать две или более моделей в таких условиях?

  2. Есть ли какая-нибудь реализация на Python, которая может помочь с такой задачей?

Ответы

4 CarlosMougan Aug 24 2020 at 14:56

Я не слышал ни о каком модельном независимом способе измерения сложности модели. Есть несколько стратегий, но они зависят от модели.

Вы можете решить эту проблему, используя разные семейства моделей.

  • Для линейных моделей вы можете подсчитать количество используемых ненулевых параметров. Количество функций, использованных для прогноза.

  • Для дерева решений вы можете подсчитать максимальную глубину, которую достигает дерево.

  • Для нейронных сетей вы можете подсчитать количество параметров, которые оптимизирует ваша сеть .

  • Для методов ансамбля (случайный лес, повышение градиента) вы можете использовать агрегацию различных слабых учеников, используемых в модели.

Для реализации python существует несколько реализаций в зависимости от того, для какой модели вы хотите ее измерить. Некоторые из них, если вы заметили, действительно легко измерить.

Интуитивно сложно сравнивать сложность различных семейств моделей. Что сложнее: линейная регрессия с 4-мя коэффициентами или дерево решений с max_depth = 3?

На тему сложности глубокого обучения Хинтон, Ориол и Джефф Дин опубликовали статью « Выявление знаний о нейронной сети» . Где они говорят об упрощении сложности нейронной сети.

3 Erwan Aug 20 2020 at 03:26

Возможно, это немного наивно, но первая идея, которая приходит в голову, - просто подсчитать количество параметров, которые необходимо оценить во время обучения: чем больше значений необходимо оценить, тем сложнее модель, поскольку пространство гипотез больше . Например, линейная модель требует только$n+1$ параметры (с $n$количество функций), в то время как количество параметров в ансамблевой модели является суммой количества параметров для каждого учащегося, поэтому оно, вероятно, будет выше. Эту идею можно улучшить, чтобы учесть диапазон значений параметра.

В качестве очень грубого приближения можно просто рассчитать размер объекта, который представляет модель в Python (при условии, что представление модели эффективно по пространству, это может быть не всегда).

3 cag51 Aug 23 2020 at 14:03

Как вы, наверное, знаете, термин «сложность» широко используется в информатике. Обычно сложность измеряется в «нотации большого О» и связана с тем, как решения масштабируются во времени по мере роста количества входных данных. Например, в этом посте обсуждается вычислительная сложность сверточных слоев.

Однако в глубоком обучении конкурирующие архитектуры нейронных сетей обычно применяют один и тот же алгоритм (обратное распространение) к одним и тем же типам проблем (например, классификация ImageNet); единственное отличие - архитектура. Кроме того, в большинстве архитектур используются аналогичные вычислительные элементы (например, сверточные слои и линейные слои). Таким образом, принято использовать количество параметров в качестве замены сложности. Верно, что это только приближение: две сети могут иметь одинаковое количество параметров, но требуют разного количества операций. Но, как правило, это хорошее приближение, учитывая, что разные архитектуры обычно имеют сходства, указанные выше, но могут иметь размеры, которые отличаются на несколько порядков.

В качестве справки рассмотрим рисунок 1 в документе EfficientNet . Они используют количество обучаемых параметров в качестве замены для «размера модели» и отмечают, что количество параметров более или менее линейно коррелирует со временем выполнения.

Что касается функции Python , которая подсчитывает количество обучаемых параметров, это будет зависеть от того, используется ли Keras, Tensorflow, PyTorch и т.д. В Keras, это одна строки: model.count_params(). В PyTorch вы можете рассчитать это, model.parameters()как описано здесь .

3 NicholasJamesBailey Aug 24 2020 at 15:43

Как упоминалось в других ответах здесь, когда мы говорим о сложности модели, мы обычно думаем о количестве параметров, которые модель изучает. Когда кто-то говорит о сравнении с менее сложной моделью, они часто имеют в виду сравнение с интуитивно менее сложной моделью (либо моделью того же класса, например нейронной сетью с меньшим количеством нейронов, либо моделью из более простого класса, например линейной моделью. а не случайный лес).

Один из способов подумать о сложности модели между очень разными моделями - это сложность по Колмогорову , и вы можете приблизительно это оценить, посмотрев на объем пространства, занятого вашими сохраненными (например, маринованными) моделями. В приведенном вами примере ансамбль будет занимать больше места на диске, чем линейная модель, если только ансамбль не будет проще, чем линейная модель (например, ансамбль из двух линейных моделей с 10 изученными коэффициентами каждая по сравнению с линейной моделью с 200 изученными коэффициентами).

2 BrianSpiering Aug 20 2020 at 03:56

Одним из вариантов является байесовский информационный критерий (BIC), который представляет собой критерий выбора модели, который пытается поощрять соответствие моделирования, измеряемое максимальной вероятностью, при одновременном наказании количества параметров.

Одна реализация BIC входит в RegscorePyкомплект.

2 Dhanushkumar Aug 27 2020 at 14:26

1. Но каков был бы способ численного измерения сложности модели, чтобы иметь возможность сравнивать две или более моделей в таких условиях?

Вы можете использовать измерение VC для измерения сложности модели в числовом формате. См. Измерение Вапника – Червоненкиса в Википедии .

2. Есть ли какая-нибудь реализация на Python, которая может помочь с такой задачей?

Уже есть ссылка на обмен стеком, в которой объясняется размер VC. Как рассчитать VC-размерность?