Esiste un modo per misurare esplicitamente la complessità di un modello di machine learning in Python

Aug 20 2020

Mi interessa il debuggin del modello e uno dei punti che consiglia è di confrontare il proprio modello con uno "meno complesso" per vedere se le prestazioni sono sostanzialmente migliori sul modello più complesso.

Solleva la mia domanda:

Supponi di avere un modello di insieme e un modello lineare per un'attività di classificazione "Sembra naturale pensare che il modello di insieme sia più complesso del modello lineare"

  1. Ma quale sarebbe un modo per misurare numericamente la complessità del modello per poter confrontare due o più modelli in tali termini?

  2. Esiste un'implementazione di Python che può aiutare con tale compito?

Risposte

4 CarlosMougan Aug 24 2020 at 14:56

Non ho sentito parlare di alcun modo agnostico del modello per misurare la complessità del modello. Esistono diverse strategie ma dipendono dal modello.

Puoi affrontare il problema utilizzando diverse famiglie di modelli.

  • Per i modelli lineari è possibile contare il numero di parametri diversi da zero che sta utilizzando. Numero di funzioni utilizzate per la previsione.

  • Per l' albero decisionale è possibile contare la profondità massima raggiunta dall'albero.

  • Per le reti neurali puoi contare il numero di parametri che il tuo NN sta ottimizzando.

  • Per i metodi di insieme (foresta casuale, aumento del gradiente) è possibile utilizzare un'aggregazione dei diversi studenti deboli utilizzati nel modello.

Per l'implementazione di Python ci sono diverse implementazioni a seconda del modello che vuoi misurarlo. Alcuni di loro, se noti, sono davvero facili da misurare.

È intuitivamente difficile confrontare la complessità tra diverse famiglie di modelli. Cosa è più complesso una regressione lineare con 4 coefficienti o un albero decisionale con max_depth = 3?

Sul tema della complessità del deep learning, Hinton, Oriol, Jeff Dean hanno pubblicato un articolo Distilling the knowledge of a Neural Network . Dove si parla di semplificare la complessità di una rete neurale.

3 Erwan Aug 20 2020 at 03:26

Forse è un po 'ingenuo ma la prima idea che mi viene in mente è semplicemente contare il numero di parametri che devono essere stimati durante l'allenamento: più valori devono essere stimati, più complesso è il modello, poiché lo spazio delle ipotesi è maggiore . Ad esempio, un modello lineare necessita solo di$n+1$ parametri (con $n$il numero di caratteristiche), mentre il numero di parametri in un modello di insieme ha bisogno è la somma del numero di parametri per ogni studente, quindi è probabile che sia più alto. Questa idea potrebbe essere affinata per tenere conto della gamma di valori di un parametro.

Come approssimazione molto approssimativa, si potrebbe semplicemente calcolare la dimensione dell'oggetto che rappresenta il modello in python (supponendo che la rappresentazione del modello sia efficiente in termini di spazio, potrebbe non essere sempre così).

3 cag51 Aug 23 2020 at 14:03

Come probabilmente saprai, "complessità" è un termine complicato in informatica. Normalmente, la complessità viene misurata in "notazione O grande" e ha a che fare con il modo in cui le soluzioni scalano nel tempo man mano che il numero di input cresce. Ad esempio, questo post discute la complessità computazionale degli strati convoluzionali.

Nell'apprendimento profondo, tuttavia, le architetture di reti neurali concorrenti generalmente applicano lo stesso algoritmo (retro-propagazione) agli stessi tipi di problemi (ad esempio, classificazione ImageNet); l'unica differenza è l'architettura. Inoltre, la maggior parte delle architetture utilizza elementi computazionali simili (ad esempio, strati convoluzionali e strati lineari). Pertanto, è una convenzione utilizzare il numero di parametri come sostituto della complessità. È vero che questa è solo un'approssimazione: due reti possono avere lo stesso numero di parametri ma richiedono un numero diverso di operazioni. Ma è generalmente una buona approssimazione, dato che architetture diverse generalmente hanno le somiglianze sopra indicate, ma possono avere dimensioni che differiscono di diversi ordini di grandezza.

Come riferimento, si consideri la Figura 1 nel documento EfficientNet . Usano il numero di parametri addestrabili come sostituto della "dimensione del modello" e notano che il numero di parametri è più o meno correlato linearmente con il runtime.

Per quanto riguarda una funzione Python che conta il numero di parametri addestrabili, questo dipenderà se si sta utilizzando Keras, tensorflow, PyTorch, ecc Keras, questa è una riga: model.count_params(). In PyTorch, puoi calcolarlo da model.parameters()come discusso qui .

3 NicholasJamesBailey Aug 24 2020 at 15:43

Come accennato da altre risposte qui, quando parliamo di complessità del modello di solito pensiamo al numero di parametri che il modello apprende. Quando qualcuno parla di confronto con un modello meno complesso, spesso intende confrontare un modello intuitivamente meno complesso (o un modello nella stessa classe, ad esempio una rete neurale con meno neuroni, o un modello di una classe più semplice, ad esempio un modello lineare piuttosto che una foresta casuale).

Un modo per pensare alla complessità del modello tra modelli molto diversi è Kolmogorov Complexity , e puoi approssimarlo osservando la quantità di spazio occupata dai tuoi modelli salvati (ad esempio in salamoia). Nell'esempio fornito, l'insieme occuperebbe più spazio su disco rispetto al modello lineare, a meno che l'insieme non fosse più semplice del modello lineare (ad es. Un insieme di due modelli lineari con 10 coefficienti appresi ciascuno rispetto a un modello lineare con 200 coefficienti appresi).

2 BrianSpiering Aug 20 2020 at 03:56

Un'opzione è il criterio di informazione bayesiano (BIC), un criterio di selezione del modello che tenta di ricompensare l'adattamento alla modellazione, misurato dalla probabilità massimizzata, penalizzando il numero di parametri.

Un'implementazione di BIC è nel RegscorePypacchetto.

2 Dhanushkumar Aug 27 2020 at 14:26

1. Ma quale sarebbe un modo per misurare numericamente la complessità del modello per poter confrontare due o più modelli in tali termini?

È possibile utilizzare la dimensione VC per misurare la complessità di un modello in un formato numerico. Vedi la dimensione Vapnik – Chervonenkis su Wikipedia .

2. Esiste un'implementazione di Python che può aiutare con tale compito?

Esiste già un collegamento per lo scambio di stack che spiega la dimensione VC. Come calcolare la dimensione VC?