Estás en una entrevista para Ingeniero de ML en Tesla. Entrevistador: Necesitamos desplegar una red neuronal en el hardware de borde del vehículo, pero no cabe en la memoria. ¿Cómo lo gestionaríais vosotros? Tú: Usaré la destilación de conocimiento para entrenar un modelo más pequeño. Entrevista terminada. Esto es lo que te perdiste:
La destilación de conocimiento requiere semanas de cálculo, porque básicamente estás entrenando un nuevo modelo. Pero la solución ya está dentro de tu red entrenada. La mayoría de las neuronas son un lastre muerto: consumen memoria pero apenas contribuyen a las predicciones. ¡Veamos cómo identificarlos!
Estos son los pasos: Paso 1) Entrene la red neuronal como de costumbre. Paso 2) Pase el conjunto de validación a través de la red entrenada y, para cada neurona en capas ocultas, calcule: - La activación promedio - La varianza de las activaciones (si las activaciones pueden ser -ve) Mira esto👇
Paso 3) Pode las neuronas que tienen una media de activación y una varianza cercanas a cero, ya que tienen poco impacto en la salida del modelo. Idealmente, trace el rendimiento en varios umbrales de poda para seleccionar el modelo que se ajuste a sus compensaciones de tamaño frente a precisión. Mira esto 👇
Veamos el código. Comenzamos definiendo una red neuronal simple y la entrenamos. Dado que calcularemos las activaciones a nivel de neurona más adelante para la poda, devolvemos todas las activaciones intermedias en el paso hacia adelante. Mira esto👇
A continuación, definimos dos listas con tres elementos: - Uno almacenará el medio de las activaciones - Otro almacenará std dev de activaciones Pasamos el conjunto de validación a través de nuestro modelo para calcular estas estadísticas para cada capa oculta. Mira esto 👇
En este punto, creemos un gráfico de distribución de estadísticas a nivel de neurona que generamos anteriormente. Como se muestra a continuación, las activaciones promedio de la mayoría de las neuronas y su desarrollo estándar están fuertemente distribuidas alrededor de valores cercanos a cero. Intentemos podarlos a continuación.
Para la poda, iteramos sobre una lista de umbrales y: - Cree una nueva red y transfiera pesos que superen el umbral. - Evalúe la nueva red y calcule los parámetros totales. - Anexa los resultados a una lista. Mira esto 👇
En esta tabla se compara la precisión y la reducción de tamaño del modelo podado en varios umbrales en relación con el modelo original. En la media = 0.1 y std-dev = 0.4: - La precisión del modelo cae un 0,08%. - El tamaño del modelo se reduce en un 62%. Esa es una gran reducción. Mira esto 👇
Aquí hay otro resultado interesante. En media = 0.5 y std-dev = 1: - La precisión del modelo se reduce en un 0,5%. - El tamaño del modelo se reduce en un 74%. Entonces, esencialmente, obtenemos un rendimiento casi similar para 1/4 de los parámetros. Mira esto 👇
Por supuesto, existe una compensación entre precisión y tamaño. A medida que reducimos el tamaño, su precisión disminuye (mira el video). Pero en la mayoría de los casos, la precisión no es la única métrica que optimizamos. En cambio, varias métricas operativas como la eficiencia, la memoria, etc., son los factores clave.
384