Ejemplo: Tenemos una red para detectar caras.
¿Cuántos pesos tiene la última red?
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)
A priori
¿Qué sabes de la convolución con filtros separables?
¿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?
¿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?
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:
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?
Pero sólo si
¿Hay funciones para hacer esto por ahí?