إنقاص حجم نموذج ML بدون تسجيل و SMS



يفهم أي شخص يواجه التعلم الآلي أن هذا يتطلب قوة حاسوبية خطيرة. في هذه المقالة ، سنحاول تطبيق الخوارزمية التي تم تطويرها في معهد ماساتشوستس للتكنولوجيا لضغط شبكة عصبية ، مما سيقلل من أبعاد أوزان النموذج المدرب وسيؤدي إلى تعلم أسرع وإطلاق أسرع للنموذج.

أثبتت الشبكات العصبية أنها أداة ممتازة لحل مجموعة متنوعة من المهام ، ولكن للأسف ، يتطلب استخدامها قوة حوسبة كبيرة ، والتي قد لا تكون في الأعمال التجارية الصغيرة. هناك العديد من أنواع ضغط الشبكات العصبية التي يمكن تقسيمها إلى أجهزة ومستوى منخفض ورياضي ، لكن هذه المقالة ستناقش الطريقة التي تم تطويرها في معهد ماساتشوستس للتكنولوجيا في عام 2019 والعمل مباشرة مع الشبكة العصبية نفسها.

تسمى هذه الطريقة "فرضية التذاكر الفائزة". بشكل عام ، يبدو الأمر كما يلي: أي شبكة عصبية متصلة بالكامل مع أوزان مبدئية عشوائية تحتوي على شبكة فرعية بنفس الأوزان ، ويمكن أن تكون هذه الشبكة الفرعية المدربة بشكل منفصل مساوية في الدقة للشبكة الأصلية.

يمكن العثور على دليل رسمي ومقال كامل هنا . نحن مهتمون بإمكانية التطبيق العملي. باختصار ، الخوارزمية هي كما يلي:

  1. نقوم بإنشاء نموذج ، تهيئة معلماته بشكل عشوائي
  2. تعلم شبكة التكرارات ي
  3. نقطع معلمات الشبكة ذات القيمة الأصغر (أبسط مهمة هي تعيين بعض قيمة العتبة)
  4. نعيد تعيين المعلمات المتبقية إلى قيمها الأولية ، نحصل على الشبكة الفرعية التي نحتاجها.


نظريًا ، تحتاج هذه الخوارزمية إلى تكرار العدد التاسع من الخطوات ، ولكن على سبيل المثال ، سننفذ تكرارًا واحدًا فقط. إنشاء شبكة بسيطة متصلة بالكامل باستخدام tensorflow و 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'])

سنحصل على بنية الشبكة التالية:



وسندربها على مجموعة بيانات أزياء MNIST التي تضم 60.000 صورة. ستكون دقتها على بيانات التحقق تساوي 0.8594. نطبق على معلمات تكرار الشبكة 1 لهذه الخوارزمية. في التعليمات البرمجية ، يبدو كما يلي:

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

وهكذا ، بعد تنفيذ هذا الرمز ، سوف نتخلص من الأوزان غير المستخدمة عمليا. هناك شيئان جديران بالملاحظة: في هذا المثال ، تم اختيار العتبة تجريبيًا ولا يمكن تطبيق هذه الخوارزمية على أوزان طبقات الإدخال والإخراج.

بعد تلقي أوزان جديدة ، من الضروري إعادة تعريف النموذج الأصلي ، وإزالة الفائض. نتيجة لذلك ، نحصل على:



يمكنك ملاحظة أن العدد الإجمالي للمعلمات انخفض بمعدل مرتين تقريبًا ، مما يعني أنه عند تدريب الشبكة الأولى ، كانت أكثر من نصف المعلمات غير ضرورية ببساطة. في الوقت نفسه ، تبلغ دقة الشبكة الفرعية 0.8554 ، وهي أقل بقليل من الشبكة الرئيسية. بالطبع ، هذا المثال إرشادي ، عادة يمكن تقليل الشبكة بنسبة 10-20 ٪ من العدد الأولي للمعلمات. هنا ، حتى بدون تطبيق هذه الخوارزمية ، من الواضح أنه تم اختيار الهندسة المعمارية الأصلية مرهقة للغاية.

في الختام ، يمكننا القول أن هذه التقنية لم يتم تطويرها بشكل جيد في الوقت الحالي ، وفي المهام الحقيقية ، فإن محاولة تحسين أوزان النموذج بهذه الطريقة يمكن أن تطيل عملية التعلم فقط ، ولكن الخوارزمية نفسها لديها الكثير من الإمكانات.

All Articles