Existe alguma maneira de medir explicitamente a complexidade de um modelo de aprendizado de máquina em Python

Aug 20 2020

Estou interessado na depuração de modelo e um dos pontos que ele recomenda é comparar seu modelo com um "menos complexo" para ver se o desempenho é substancialmente melhor no modelo mais complexo.

Isso levanta minha pergunta:

Suponha que você tenha um modelo Ensemble e um modelo Linear para uma tarefa de classificação "Parece natural pensar que o modelo ensemble é mais complexo do que o modelo linear"

  1. Mas, qual seria uma forma de medir numericamente a complexidade do modelo para poder comparar dois ou mais modelos nesses termos?

  2. Existe alguma implementação python que pode ajudar com essa tarefa?

Respostas

4 CarlosMougan Aug 24 2020 at 14:56

Eu não ouvi falar de nenhuma forma agnóstica de modelo para medir a complexidade do modelo. Existem várias estratégias, mas dependem do modelo.

Você pode resolver o problema usando diferentes famílias de modelos.

  • Para modelos lineares, você pode contar o número de parâmetros diferentes de zero que está usando. Número de recursos usados ​​para a previsão.

  • Para a árvore de decisão, você pode contar a profundidade máxima que a árvore atinge.

  • Para redes neurais, você pode contar o número de parâmetros que seu NN está otimizando.

  • Para métodos de conjunto (floresta aleatória, aumento de gradiente), você pode usar uma agregação dos diferentes alunos fracos usados ​​no modelo.

Para a implementação de python, existem várias implementações, dependendo de qual modelo você deseja medi-lo. Alguns deles, se você notar, são realmente fáceis de medir.

É intuitivamente difícil comparar a complexidade entre diferentes famílias de modelos. O que é mais complexo uma regressão linear com 4 coeficientes ou uma árvore de decisão com max_depth = 3?

Sobre o tópico da complexidade do aprendizado profundo, Hinton, Oriol e Jeff Dean publicaram um artigo Destilando o conhecimento de uma rede neural . Onde eles falam sobre simplificar a complexidade de uma rede neural.

3 Erwan Aug 20 2020 at 03:26

Talvez seja um pouco ingênuo, mas a primeira ideia que vem à mente é simplesmente contar o número de parâmetros que devem ser estimados durante o treinamento: quanto mais valores precisam ser estimados, mais complexo é o modelo, pois o espaço de hipóteses é maior . Por exemplo, um modelo linear precisa apenas$n+1$ parâmetros (com $n$o número de recursos), enquanto o número de parâmetros em um modelo de conjunto precisa é a soma dos números de parâmetros para cada aluno, então é provável que seja maior. Essa ideia pode ser refinada para levar em consideração a faixa de valores de um parâmetro.

Como uma aproximação muito grosseira, pode-se simplesmente calcular o tamanho do objeto que representa o modelo em python (assumindo que a representação do modelo é eficiente em termos de espaço, pode nem sempre ser o caso).

3 cag51 Aug 23 2020 at 14:03

Como você provavelmente sabe, "complexidade" é um termo carregado na ciência da computação. Normalmente, a complexidade é medida em "notação big-O" e tem a ver com a forma como as soluções aumentam no tempo à medida que o número de entradas aumenta. Por exemplo, este post discute a complexidade computacional das camadas convolucionais.

No aprendizado profundo, no entanto, arquiteturas de rede neural concorrentes geralmente aplicam o mesmo algoritmo (retropropagação) aos mesmos tipos de problemas (por exemplo, classificação ImageNet); a única diferença é a arquitetura. Além disso, a maioria das arquiteturas usa elementos computacionais semelhantes (por exemplo, camadas convolucionais e camadas lineares). Portanto, é uma convenção usar o número de parâmetros como um substituto para a complexidade. É verdade que se trata apenas de uma aproximação: duas redes podem ter o mesmo número de parâmetros, mas requerem diferentes números de operações. Mas geralmente é uma boa aproximação, visto que arquiteturas diferentes geralmente têm as semelhanças observadas acima, mas podem ter tamanhos que diferem em várias ordens de magnitude.

Como referência, considere a Figura 1 do documento EfficientNet . Eles usam o número de parâmetros treináveis ​​como substituto para o "tamanho do modelo" e observam que o número de parâmetros é mais ou menos linearmente correlacionado com o tempo de execução.

Quanto a uma função Python que conta o número de parâmetros treináveis, isso vai depender se você está usando Keras, Tensorflow, PyTorch, etc. Em Keras, esta é uma linha: model.count_params(). No PyTorch, você pode calculá-lo model.parameters()conforme discutido aqui .

3 NicholasJamesBailey Aug 24 2020 at 15:43

Conforme mencionado por outras respostas aqui, quando falamos sobre a complexidade do modelo, geralmente estamos pensando sobre o número de parâmetros que o modelo aprende. Quando alguém fala sobre a comparação com um modelo menos complexo, muitas vezes se refere à comparação com um modelo intuitivamente menos complexo (ou um modelo na mesma classe, por exemplo, uma rede neural com menos neurônios, ou um modelo de uma classe mais simples, por exemplo, um modelo linear em vez de uma floresta aleatória).

Uma maneira de pensar sobre a complexidade do modelo entre modelos muito diferentes é a Complexidade de Kolmogorov , e você pode aproximar isso observando a quantidade de espaço ocupado por seus modelos salvos (por exemplo, em conserva). No exemplo que você deu, o conjunto ocuparia mais espaço em disco do que o modelo linear, a menos que o conjunto fosse mais simples do que o modelo linear (por exemplo, um conjunto de dois modelos lineares com 10 coeficientes aprendidos cada contra um modelo linear com 200 coeficientes aprendidos).

2 BrianSpiering Aug 20 2020 at 03:56

Uma opção é o critério de informação Bayesiano (BIC), que é um critério de seleção de modelo que tenta recompensar o ajuste da modelagem, medido pela probabilidade maximizada, enquanto penaliza o número de parâmetros.

Uma implementação do BIC está no RegscorePypacote.

2 Dhanushkumar Aug 27 2020 at 14:26

1. Mas, qual seria uma forma de medir numericamente a complexidade do modelo para poder comparar dois ou mais modelos nesses termos?

Você pode usar a dimensão VC para medir a complexidade de um modelo em um formato numérico. Veja a dimensão Vapnik – Chervonenkis na Wikipedia .

2. Existe alguma implementação python que pode ajudar nessa tarefa?

Já existe um link de troca de pilha que explica sobre a dimensão VC. Como calcular a dimensão VC?