Reduzca el tamaño del modelo ML sin registro y SMS



Cualquiera que se encuentre con el aprendizaje automático comprende que esto requiere una gran potencia informática. En este artículo, intentaremos aplicar el algoritmo desarrollado en MIT para comprimir una red neuronal, lo que reducirá la dimensión de los pesos del modelo entrenado y conducirá a un aprendizaje más rápido y un lanzamiento más rápido del modelo.

Las redes neuronales han demostrado ser una excelente herramienta para resolver una amplia variedad de tareas, pero, desafortunadamente, su uso requiere una potencia informática considerable, que aún puede no estar en una pequeña empresa. Hay muchos tipos de compresión de redes neuronales que se pueden dividir en hardware, bajo nivel y matemático, pero este artículo analizará el método desarrollado en MIT en 2019 y trabajando directamente con la red neuronal misma.

Este método se llama la "Hipótesis del boleto ganador". En términos generales, suena así: cualquier red neuronal completamente conectada con pesos inicializados aleatoriamente contiene una subred con los mismos pesos, y una subred entrenada por separado puede tener la misma precisión que la red original.

La prueba formal y el artículo completo se pueden encontrar aquí . Estamos interesados ​​en la posibilidad de aplicación práctica. En resumen, el algoritmo es el siguiente:

  1. Creamos un modelo, inicializamos aleatoriamente sus parámetros
  2. Aprendiendo una red de iteraciones j
  3. Cortamos los parámetros de red que tienen el valor más pequeño (la tarea más simple es establecer un valor umbral)
  4. Restablecemos los parámetros restantes a sus valores iniciales, obtenemos la subred que necesitamos.


En teoría, este algoritmo debe repetirse el enésimo número de pasos, pero por ejemplo, solo realizaremos una iteración. Cree una red simple completamente conectada usando tensorflow y Keras:

import tensorflow as tf
from tensorflow import keras

model = keras.Sequential([
    keras.layers.Flatten(input_shape=(28, 28)),
    keras.layers.Dense(300, activation='relu'),
    keras.layers.Dense(150, activation='relu'),
    keras.layers.Dense(10, activation='softmax')
])

model.compile(optimizer='SGD',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])





Obtendremos la siguiente arquitectura de red: y la entrenaremos en el conjunto de datos de moda MNIST de 60,000 imágenes. Su precisión en los datos de verificación será igual a 0.8594. Aplicamos a los parámetros de la iteración de la red 1 de este algoritmo. En código, se ve así:

#  
threshold = 0.001

#       np.array
weights = model.weights
weights = np.asarray(weights)

#    
first_h_layer_weights = weights[1]
second_h_layer_weights = weights[3]

def delete_from_layers(one_d_array, threshold):
    index = []
    for i in range(one_d_array.shape[0]):
        #   ,       
        if abs(one_d_array[i]) <= threshold:
            index.append(i)
    #    ,   
    new_layer = np.delete(one_d_array, index)
    return new_layer

new_layer_weights = delete_from_layers(second_h_layer_weights, threshold)

Por lo tanto, después de ejecutar este código, eliminaremos los pesos prácticamente no utilizados. Vale la pena señalar dos cosas: en este ejemplo, el umbral se eligió empíricamente y este algoritmo no se puede aplicar a los pesos de las capas de entrada y salida.

Habiendo recibido nuevos pesos, es necesario redefinir el modelo original, eliminando el exceso. Como resultado, obtenemos:



Puede notar que el número total de parámetros disminuyó casi 2 veces, lo que significa que al entrenar la primera red, más de la mitad de los parámetros simplemente eran innecesarios. Al mismo tiempo, la precisión de la subred es 0.8554, que es bastante más baja que la red principal. Por supuesto, este ejemplo es indicativo, por lo general, la red se puede reducir en un 10-20% del número inicial de parámetros. Aquí, incluso sin aplicar este algoritmo, está claro que la arquitectura original se eligió demasiado engorrosa.

En conclusión, podemos decir que esta técnica no está bien desarrollada en este momento, y en problemas reales, un intento de optimizar los pesos del modelo de esta manera solo puede alargar el proceso de aprendizaje, pero el algoritmo en sí tiene mucho potencial.

All Articles