¿Hay alguna forma de medir explícitamente la complejidad de un modelo de aprendizaje automático en Python?

Aug 20 2020

Me interesa la depuración de modelos y uno de los puntos que recomienda es comparar su modelo con uno "menos complejo" para ver si el rendimiento es sustancialmente mejor en el modelo más complejo.

Surge mi pregunta:

Suponga que tiene un modelo de conjunto y un modelo lineal para una tarea de clasificación "Parece natural pensar que el modelo de conjunto es más complejo que el modelo lineal"

  1. Pero, ¿cuál sería una forma de medir numéricamente la complejidad del modelo para poder comparar dos o más modelos en esos términos?

  2. ¿Existe alguna implementación de Python que pueda ayudar con tal tarea?

Respuestas

4 CarlosMougan Aug 24 2020 at 14:56

No he oído hablar de ninguna forma independiente del modelo para medir la complejidad del modelo. Existen varias estrategias, pero dependen del modelo.

Puede abordar el problema utilizando diferentes familias de modelos.

  • Para modelos lineales , puede contar el número de parámetros distintos de cero que está utilizando. Número de características utilizadas para la predicción.

  • Para el árbol de decisión , puede contar la profundidad máxima que alcanza el árbol.

  • Para las redes neuronales , puede contar la cantidad de parámetros que su NN está optimizando.

  • Para los métodos de conjunto (bosque aleatorio, aumento de gradiente), puede usar una agregación de los diferentes estudiantes débiles utilizados en el modelo.

Para la implementación de Python, existen varias implementaciones dependiendo del modelo para el que desee medirlo. Algunos de ellos, si te fijas, son realmente fáciles de medir.

Es intuitivamente difícil comparar la complejidad entre diferentes familias de modelos. ¿Qué es más compleja una regresión lineal con 4 coeficientes o un árbol de decisión con max_depth = 3?

Sobre el tema de la complejidad del aprendizaje profundo, Hinton, Oriol y Jeff Dean publicaron un artículo Destilando el conocimiento de una red neuronal . Donde hablan de simplificar la complejidad de una red neuronal.

3 Erwan Aug 20 2020 at 03:26

Quizás sea un poco ingenuo, pero la primera idea que me viene a la mente es simplemente contar el número de parámetros que hay que estimar durante el entrenamiento: cuantos más valores hay que estimar, más complejo es el modelo, ya que el espacio de hipótesis es mayor . Por ejemplo, un modelo lineal solo necesita$n+1$ parámetros (con $n$el número de características), mientras que el número de parámetros que necesita un modelo de conjunto es la suma del número de parámetros de cada alumno, por lo que es probable que sea mayor. Esta idea podría refinarse para tener en cuenta el rango de valores de un parámetro.

Como una aproximación muy aproximada, uno podría simplemente calcular el tamaño del objeto que representa el modelo en Python (asumiendo que la representación del modelo es eficiente en el espacio, podría no ser siempre el caso).

3 cag51 Aug 23 2020 at 14:03

Como probablemente sepa, "complejidad" es un término cargado en informática. Normalmente, la complejidad se mide en "notación O grande" y tiene que ver con cómo las soluciones escalan en el tiempo a medida que aumenta el número de entradas. Por ejemplo, esta publicación analiza la complejidad computacional de las capas convolucionales.

Sin embargo, en el aprendizaje profundo, las arquitecturas de redes neuronales en competencia generalmente aplican el mismo algoritmo (propagación hacia atrás) a los mismos tipos de problemas (por ejemplo, clasificación ImageNet); la única diferencia es la arquitectura. Además, la mayoría de las arquitecturas utilizan elementos computacionales similares (por ejemplo, capas convolucionales y capas lineales). Por tanto, es una convención utilizar el número de parámetros como sustituto de la complejidad. Es cierto que esto es solo una aproximación: dos redes pueden tener el mismo número de parámetros pero requieren diferentes números de operaciones. Pero en general es una buena aproximación, dado que las diferentes arquitecturas generalmente tienen las similitudes mencionadas anteriormente, pero pueden tener tamaños que difieren en varios órdenes de magnitud.

Como referencia, considere la Figura 1 en el documento EfficientNet . Utilizan el número de parámetros entrenables como sustituto del "tamaño del modelo" y observan que el número de parámetros está más o menos correlacionado linealmente con el tiempo de ejecución.

En cuanto a una función de Python que cuenta el número de parámetros entrenables, esto dependerá de si está utilizando Keras, Tensorflow, PyTorch, etc. En Keras, se trata de una línea: model.count_params(). En PyTorch, puede calcularlo model.parameters()como se explica aquí .

3 NicholasJamesBailey Aug 24 2020 at 15:43

Como se menciona en otras respuestas aquí, cuando hablamos de complejidad del modelo, generalmente pensamos en la cantidad de parámetros que aprende el modelo. Cuando alguien habla de comparar con un modelo menos complejo, a menudo se refiere a comparar con un modelo intuitivamente menos complejo (ya sea un modelo de la misma clase, por ejemplo, una red neuronal con menos neuronas, o un modelo de una clase más simple, por ejemplo, un modelo lineal en lugar de un bosque aleatorio).

Una forma de pensar en la complejidad del modelo entre modelos muy diferentes es la Complejidad de Kolmogorov , y puede aproximarse a esto mirando la cantidad de espacio ocupado por sus modelos guardados (por ejemplo, en escabeche). En el ejemplo que dio, el conjunto ocuparía más espacio en disco que el modelo lineal, a menos que el conjunto fuera más simple que el modelo lineal (por ejemplo, un conjunto de dos modelos lineales con 10 coeficientes aprendidos cada uno versus un modelo lineal con 200 coeficientes aprendidos).

2 BrianSpiering Aug 20 2020 at 03:56

Una opción es el criterio de información bayesiano (BIC), que es un criterio de selección del modelo que intenta recompensar el ajuste del modelo, medido por la probabilidad maximizada, al tiempo que penaliza el número de parámetros.

Una implementación de BIC está en el RegscorePypaquete.

2 Dhanushkumar Aug 27 2020 at 14:26

1. Pero, ¿cuál sería una forma de medir numéricamente la complejidad del modelo para poder comparar dos o más modelos en esos términos?

Puede utilizar la dimensión VC para medir la complejidad de un modelo en un formato numérico. Consulte la dimensión Vapnik-Chervonenkis en Wikipedia .

2. ¿Existe alguna implementación de Python que pueda ayudar con esta tarea?

Ya existe un enlace de intercambio de pila que explica la dimensión de VC. ¿Cómo calcular la dimensión VC?