يفهم أي شخص يواجه التعلم الآلي أن هذا يتطلب قوة حاسوبية خطيرة. في هذه المقالة ، سنحاول تطبيق الخوارزمية التي تم تطويرها في معهد ماساتشوستس للتكنولوجيا لضغط شبكة عصبية ، مما سيقلل من أبعاد أوزان النموذج المدرب وسيؤدي إلى تعلم أسرع وإطلاق أسرع للنموذج.أثبتت الشبكات العصبية أنها أداة ممتازة لحل مجموعة متنوعة من المهام ، ولكن للأسف ، يتطلب استخدامها قوة حوسبة كبيرة ، والتي قد لا تكون في الأعمال التجارية الصغيرة. هناك العديد من أنواع ضغط الشبكات العصبية التي يمكن تقسيمها إلى أجهزة ومستوى منخفض ورياضي ، لكن هذه المقالة ستناقش الطريقة التي تم تطويرها في معهد ماساتشوستس للتكنولوجيا في عام 2019 والعمل مباشرة مع الشبكة العصبية نفسها.تسمى هذه الطريقة "فرضية التذاكر الفائزة". بشكل عام ، يبدو الأمر كما يلي: أي شبكة عصبية متصلة بالكامل مع أوزان مبدئية عشوائية تحتوي على شبكة فرعية بنفس الأوزان ، ويمكن أن تكون هذه الشبكة الفرعية المدربة بشكل منفصل مساوية في الدقة للشبكة الأصلية.يمكن العثور على دليل رسمي ومقال كامل هنا . نحن مهتمون بإمكانية التطبيق العملي. باختصار ، الخوارزمية هي كما يلي:- نقوم بإنشاء نموذج ، تهيئة معلماته بشكل عشوائي
- تعلم شبكة التكرارات ي
- نقطع معلمات الشبكة ذات القيمة الأصغر (أبسط مهمة هي تعيين بعض قيمة العتبة)
- نعيد تعيين المعلمات المتبقية إلى قيمها الأولية ، نحصل على الشبكة الفرعية التي نحتاجها.
نظريًا ، تحتاج هذه الخوارزمية إلى تكرار العدد التاسع من الخطوات ، ولكن على سبيل المثال ، سننفذ تكرارًا واحدًا فقط. إنشاء شبكة بسيطة متصلة بالكامل باستخدام 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
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 ٪ من العدد الأولي للمعلمات. هنا ، حتى بدون تطبيق هذه الخوارزمية ، من الواضح أنه تم اختيار الهندسة المعمارية الأصلية مرهقة للغاية.في الختام ، يمكننا القول أن هذه التقنية لم يتم تطويرها بشكل جيد في الوقت الحالي ، وفي المهام الحقيقية ، فإن محاولة تحسين أوزان النموذج بهذه الطريقة يمكن أن تطيل عملية التعلم فقط ، ولكن الخوارزمية نفسها لديها الكثير من الإمكانات.