Reduzieren Sie die Größe des ML-Modells ohne Registrierung und SMS



Jeder, der auf maschinelles Lernen stößt, versteht, dass dies ernsthafte Rechenleistung erfordert. In diesem Artikel werden wir versuchen, den am MIT entwickelten Algorithmus anzuwenden, um ein neuronales Netzwerk zu komprimieren. Dies reduziert die Dimension der Gewichte des trainierten Modells und führt sowohl zu einem schnelleren Lernen als auch zu einem schnelleren Modellstart.

Neuronale Netze haben sich als hervorragendes Werkzeug zur Lösung einer Vielzahl von Aufgaben erwiesen. Leider erfordert ihre Verwendung eine erhebliche Rechenleistung, die in kleinen Unternehmen möglicherweise noch nicht vorhanden ist. Es gibt viele Arten der Komprimierung neuronaler Netze, die in Hardware, Low-Level und Mathematik unterteilt werden können. In diesem Artikel wird jedoch die Methode erörtert, die 2019 am MIT entwickelt wurde und direkt mit dem neuronalen Netz selbst zusammenarbeitet.

Diese Methode wird als "Winning Ticket Hypothesis" bezeichnet. Im Allgemeinen klingt es so: Jedes vollständig verbundene neuronale Netzwerk mit zufällig initialisierten Gewichten enthält ein Subnetz mit denselben Gewichten, und ein solches separat trainiertes Subnetz kann in seiner Genauigkeit dem ursprünglichen Netzwerk entsprechen.

Formale Beweise und vollständiger Artikel finden Sie hier . Wir sind an der Möglichkeit der praktischen Anwendung interessiert. Kurz gesagt lautet der Algorithmus wie folgt:

  1. Wir erstellen ein Modell und initialisieren seine Parameter zufällig
  2. Lernen eines Netzwerks von Iterationen j
  3. Wir schneiden die Netzwerkparameter ab, die den kleinsten Wert haben (die einfachste Aufgabe besteht darin, einen Schwellenwert festzulegen).
  4. Wir setzen die restlichen Parameter auf ihre Anfangswerte zurück und erhalten das Subnetz, das wir benötigen.


Theoretisch muss dieser Algorithmus die n-te Anzahl von Schritten wiederholt werden, aber für ein Beispiel werden wir nur eine Iteration durchführen. Erstellen Sie mit Tensorflow und Keras ein einfaches, vollständig verbundenes Netzwerk:

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'])

Wir erhalten die folgende Netzwerkarchitektur:



Und wir werden sie auf dem MNIST-Modedatensatz von 60.000 Bildern trainieren. Die Genauigkeit der Verifizierungsdaten beträgt 0,8594. Wir wenden auf die Parameter der Netzwerk-1-Iteration dieses Algorithmus an. Im Code sieht es so aus:

#  
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)

Nachdem wir diesen Code ausgeführt haben, werden wir praktisch nicht verwendete Gewichte entfernen. Zwei Dinge sind erwähnenswert: In diesem Beispiel wurde der Schwellenwert empirisch ausgewählt und dieser Algorithmus kann nicht auf die Gewichte der Eingabe- und Ausgabeschichten angewendet werden.

Nachdem Sie neue Gewichte erhalten haben, müssen Sie das ursprüngliche Modell neu definieren und den Überschuss entfernen. Als Ergebnis erhalten wir:



Sie können feststellen, dass sich die Gesamtzahl der Parameter um fast das Zweifache verringert hat, was bedeutet, dass beim Training des ersten Netzwerks mehr als die Hälfte der Parameter einfach unnötig waren. Gleichzeitig beträgt die Genauigkeit des Subnetzes 0,8554, was erheblich unter dem des Hauptnetzwerks liegt. Dieses Beispiel ist natürlich bezeichnend. Normalerweise kann das Netzwerk um 10 bis 20% der ursprünglichen Anzahl von Parametern reduziert werden. Hier ist auch ohne Anwendung dieses Algorithmus klar, dass die ursprüngliche Architektur zu umständlich gewählt wurde.

Zusammenfassend können wir sagen, dass diese Technik derzeit nicht gut entwickelt ist und bei realen Aufgaben ein Versuch, die Gewichte des Modells auf diese Weise zu optimieren, den Lernprozess nur verlängern kann, aber der Algorithmus selbst hat ein großes Potenzial.

All Articles