Puntos

¿Por qué?

¿Cómo?

¿Por qué?

Ejemplo: Tenemos una red para detectar caras.

¿Cuántos pesos tiene la última red?

¡¿Y qué más?!

Una red menor será más fácil que cumpla los requisitos: ejecutará en menos tiempo, ocupará menos memoria.

Y puede funcionar igual de bien, porque es fácil que no se necesiten todos los parámetros ¿Hace falta multiplicar algo por 10-7 y sumarlo?

¿Cuántos pesos tiene la última red menores de 0.001? (este código quizá te inspire)

¿Cómo?

A priori

¿Qué sabes de la convolución con filtros separables?

¿Cómo?

A posteriori

Recortar

¿Recuerdas del diagrama de Hinton de pesos?

En Pytorch está torch.nn.utils.prune.L1Unstructured(ratioaeliminar)

¿Recuerdas cuando dijimos que también puedes eliminar procesadores?

En Pytorch está torch.nn.utils.prune.LnStructured(ratio,tiponorma) basado en el conjunto de pesos de entrada

¿Y si tuviésemos en cuenta derivadas respecto a los pesos?

Cuantizar

¿Cuántos bits ocupa cada peso? ¿Y si lo pusiéramos en sólo 4 bits, o en 2?

No tienen por qué ser equiespaciados. Podemos usar una tabla índice.

En Pytorch puedes tener algo como este ejemplo con la idea de calibrar la tabla de cuantización

¿Hay relación entre esto y un agrupamiento?

Rediseñar

Preparamos un modelo pequeño para que replique al grande, dándole la salida del grande y la real

En vez de dar la salida del grande, si es clasificación, se le puede dar logits (logaritmos de la probabilidad [antes de softmax])

O también un softmax modificado: y i = e z i / T j e z j / T

Para tener ventaja respecto a entrenar desde cero, hay que meter errores por capa, simulando la grande, etc.

¿Se puede aprovechar un estudio del grande para diseñar el pequeño?

Descomposición SVD

P m × n : matriz de pesos P = US V T , U m × r , S r × r , V T r × n r m r n } m × r + r + r × n m × n

Pero sólo si r m r n

¿Hay funciones para hacer esto por ahí?