البرنامج التعليمي للشبكة العصبية الاصطناعية مع أمثلة TensorFlow ANN

ما هي الشبكة العصبية الاصطناعية؟

An شبكة اعصاب صناعية (ANN) هو نظام حاسوبي مستوحى من الشبكات العصبية البيولوجية لإنشاء أدمغة صناعية تعتمد على مجموعة من الوحدات المتصلة التي تسمى الخلايا العصبية الاصطناعية. وهي مصممة لتحليل ومعالجة المعلومات مثل البشر. تتمتع الشبكة العصبية الاصطناعية بقدرات التعلم الذاتي لتحقيق نتائج أفضل مع توفر المزيد من البيانات.

شبكة اعصاب صناعية
شبكة اعصاب صناعية

تتكون الشبكة العصبية الاصطناعية (ANN) من أربعة عناصر رئيسية:

  • طبقات: كل ​​التعلم يحدث في الطبقات. هناك 3 طبقات 1) الإدخال 2) مخفي و 3) الإخراج
  • الميزة والتسمية: إدخال البيانات إلى الشبكة (الميزات) والإخراج من الشبكة (التسميات)
  • فقدان وظيفة: المقياس المستخدم لتقدير أداء مرحلة التعلم
  • محسن: تحسين التعلم عن طريق تحديث المعرفة في الشبكة

ستأخذ الشبكة العصبية البيانات المدخلة وتدفعها إلى مجموعة من الطبقات. تحتاج الشبكة إلى تقييم أدائها باستخدام دالة الخسارة. تعطي وظيفة الخسارة للشبكة فكرة عن المسار الذي يجب أن تسلكه قبل أن تتقن المعرفة. تحتاج الشبكة إلى تحسين معرفتها بمساعدة المُحسِّن.

إذا ألقيت نظرة على الشكل أعلاه، سوف تفهم الآلية الأساسية.

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

لتحسين معرفتها، تستخدم الشبكة مُحسِّنًا. في تشبيهنا، يمكن اعتبار المُحسِّن بمثابة إعادة قراءة الفصل. يمكنك الحصول على رؤى/درس جديد من خلال القراءة مرة أخرى. وبالمثل، تستخدم الشبكة المُحسِّن، وتحدث معرفتها، وتختبر معرفتها الجديدة للتحقق من مقدار ما لا تزال بحاجة إلى تعلمه. سيقوم البرنامج بتكرار هذه الخطوة حتى يقوم بأقل خطأ ممكن.

في تشبيهنا لمشكلة الرياضيات، يعني هذا أنك تقرأ فصل الكتاب المدرسي عدة مرات حتى تفهم محتوى الدورة تمامًا. حتى بعد القراءة عدة مرات، إذا استمريت في ارتكاب خطأ، فهذا يعني أنك وصلت إلى سعة المعرفة بالمادة الحالية. تحتاج إلى استخدام كتاب مدرسي مختلف أو اختبار طريقة مختلفة لتحسين نتيجتك. بالنسبة للشبكة العصبية، فهي نفس العملية. إذا كان الخطأ بعيدًا عن 100٪، ولكن المنحنى مسطح، فهذا يعني أنه مع البنية الحالية؛ لا يمكنها تعلم أي شيء آخر. يجب تحسين الشبكة بشكل أفضل لتحسين المعرفة.

الشبكة العصبية Architecture

الشبكة العصبية الاصطناعية Archiيتكون الهيكل من المكونات التالية:

  • طبقات
  • وظيفة التنشيط
  • فقدان وظيفة
  • محسن

طبقات

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

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

تأخذ الشبكة مدخلاً وترسله إلى جميع العقد المتصلة وتحسب الإشارة باستخدام تفعيل وظيفة.

الشبكة العصبية Architecture
الشبكة العصبية Architecture

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

  1. العقدة الأولى هي قيم الإدخال
  2. تتحلل الخلية العصبية إلى جزء الإدخال ووظيفة التنشيط. يتلقى الجزء الأيسر كل المدخلات من الطبقة السابقة. الجزء الأيمن هو مجموع المدخلات التي تمر إلى وظيفة التنشيط.
  3. قيمة الإخراج محسوبة من الطبقات المخفية وتستخدم للتنبؤ. بالنسبة للتصنيف فهو يساوي عدد الفئة. بالنسبة للانحدار، يتم توقع قيمة واحدة فقط.

وظيفة التنشيط

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

وظيفة التنشيط

وظائف التنشيط الأخرى هي:

  • خطي متقطع
  • السيني
  • تانه
  • ريلو المتسرب

القرار الحاسم الذي يجب اتخاذه عند بناء شبكة عصبية هو:

  • كم عدد الطبقات في الشبكة العصبية
  • كم عدد الوحدات المخفية لكل طبقة

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

فقدان وظيفة

بعد تحديد الطبقات المخفية ووظيفة التنشيط، تحتاج إلى تحديد وظيفة الخسارة والمحسن.

بالنسبة للتصنيف الثنائي، من الشائع استخدام دالة خسارة الإنتروبيا الثنائية. في الانحدار الخطي، يمكنك استخدام متوسط ​​مربع الخطأ.

تعتبر دالة الخسارة مقياسًا مهمًا لتقدير أداء المحسن. أثناء التدريب، سيتم تقليل هذا المقياس. يتعين عليك تحديد هذه الكمية بعناية اعتمادًا على نوع المشكلة التي تتعامل معها.

محسن

دالة الخسارة هي مقياس لأداء النموذج. سيساعد المحسن على تحسين أوزان الشبكة لتقليل الخسارة. هناك أدوات تحسين مختلفة متاحة، ولكن الأكثر شيوعًا هو Stochastic Gradient Descent.

أدوات التحسين التقليدية هي:

  • Momentum الاقوي،
  • نيستيروف التدرج المتسارع,
  • أداغراد,
  • آدم الأمثل

حدود الشبكة العصبية

فيما يلي حدود الشبكة العصبية:

Overfitting

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

هناك مقايضة في التعلم الآلي بين التحسين والتعميم.

يتطلب تحسين النموذج العثور على أفضل المعلمات التي تقلل من فقدان مجموعة التدريب.

ومع ذلك، فإن التعميم يخبرنا كيف يتصرف النموذج بالنسبة للبيانات غير المرئية.

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

حجم الشبكة

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

تنظيم الوزن

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

L1: لاسو: التكلفة تتناسب مع القيمة المطلقة لمعاملات الوزن

L2: ريدج: التكلفة تتناسب مع مربع قيمة معاملات الوزن

أوقع

التسرب هو أسلوب غريب ولكنه مفيد. الشبكة ذات التسرب تعني أنه سيتم ضبط بعض الأوزان بشكل عشوائي على الصفر. تخيل أن لديك مجموعة من الأوزان [0.1، 1.7، 0.7، -0.9]. إذا كانت الشبكة العصبية بها تسرب، فسوف يصبح [0.1، 0، 0، -0.9] مع 0 موزع عشوائيًا. المعلمة التي تتحكم في التسرب هي معدل التسرب. يحدد المعدل عدد الأوزان التي سيتم تعيينها على الأصفار. وجود معدل يتراوح بين 0.2 و 0.5 أمر شائع.

مثال على الشبكة العصبية في TensorFlow

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

  • طبقتين مخفيتين
    • تحتوي الطبقة الأولى على أربع خلايا عصبية متصلة بالكامل
    • الطبقة الثانية تحتوي على خليتين عصبيتين متصلتين بالكامل
  • وظيفة التنشيط هي Relu
  • أضف تنظيم L2 بمعدل تعلم 0.003

الشبكة العصبية في TensorFlow

ستعمل الشبكة على تحسين الوزن خلال 180 حقبة بحجم دفعة يبلغ 10. في فيديو مثال ANN أدناه، يمكنك رؤية كيف تتطور الأوزان وكيف تعمل الشبكة على تحسين تعيين التصنيف.

أولًا، تقوم الشبكة بتعيين قيم عشوائية لجميع الأوزان.

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

الشبكة العصبية في TensorFlow

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

كما ترون، في تعيين الإخراج، ترتكب الشبكة الكثير من الأخطاء. دعونا نرى كيف تتصرف الشبكة بعد التحسين.

توضح صورة مثال ANN أدناه نتائج الشبكة المحسنة. أولاً، لاحظت أن الشبكة قد تعلمت بنجاح كيفية تصنيف نقطة البيانات. يمكنك أن ترى من الصورة من قبل؛ كان الوزن الأولي -0.43 بينما بعد التحسين ينتج وزن -0.95.

الشبكة العصبية في TensorFlow

يمكن تعميم الفكرة على الشبكات ذات الطبقات والخلايا العصبية المخفية. يمكنك اللعب في الصفحة .

كيفية تدريب الشبكة العصبية باستخدام TensorFlow

فيما يلي عملية خطوة بخطوة حول كيفية تدريب شبكة عصبية باستخدام TensorFlow ANN باستخدام مُقدِّر DNNClassifier الخاص بواجهة برمجة التطبيقات.

سوف نستخدم مجموعة بيانات MNIST لتدريب شبكتك العصبية الأولى. تدريب الشبكة العصبية مع TensorFlow ليست معقدة للغاية. تبدو خطوة المعالجة المسبقة تمامًا كما في البرامج التعليمية السابقة. سوف تتصرف على النحو التالي:

  • الخطوة 1: استيراد البيانات
  • الخطوة 2: تحويل البيانات
  • الخطوة 3: بناء الموتر
  • الخطوة 4: بناء النموذج
  • الخطوة 5: تدريب النموذج وتقييمه
  • الخطوة 6: تحسين النموذج

الخطوة 1) استيراد البيانات

أولا وقبل كل شيء، تحتاج إلى استيراد المكتبة اللازمة. يمكنك استيراد مجموعة بيانات MNIST باستخدام scikit learn كما هو موضح في مثال شبكة TensorFlow العصبية أدناه.

مجموعة بيانات MNIST هي مجموعة البيانات المستخدمة بشكل شائع لاختبار التقنيات أو الخوارزميات الجديدة. تتكون مجموعة البيانات هذه من مجموعة من الصور بحجم 28×28 بكسل مع رقم مكتوب بخط اليد من 0 إلى 9. حاليًا، أقل خطأ في الاختبار هو 0.27 بالمائة مع لجنة مكونة من 7 شبكات عصبية ملتوية.

import numpy as np
import tensorflow as tf
np.random.seed(1337)

يمكنك تنزيل scikit learn مؤقتًا على هذا العنوان. انسخ مجموعة البيانات والصقه في مجلد مناسب. لاستيراد البيانات إلى لغة بايثون، يمكنك استخدام fetch_mldata من scikit learn. الصق مسار الملف داخل fetch_mldata لجلب البيانات.

from sklearn.datasets import fetch_mldata
mnist = fetch_mldata(' /Users/Thomas/Dropbox/Learning/Upwork/tuto_TF/data/mldata/MNIST original')
print(mnist.data.shape)
print(mnist.target.shape)

بعد ذلك، يمكنك استيراد البيانات والحصول على شكل مجموعتي البيانات.

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(mnist.data, mnist.target, test_size=0.2, random_state=42)
y_train  = y_train.astype(int)
y_test  = y_test.astype(int)
batch_size =len(X_train)

print(X_train.shape, y_train.shape,y_test.shape )

الخطوة 2) تحويل البيانات

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

(X-min_x)/(max_x - min_x)

يتعلم Scikit بالفعل وظيفة لذلك: MinMaxScaler()

## resclae
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
# Train
X_train_scaled = scaler.fit_transform(X_train.astype(np.float64))
# test
X_test_scaled = scaler.fit_transform(X_test.astype(np.float64))

الخطوة 3) بناء الموتر

أنت الآن على دراية بطريقة إنشاء الموتر في Tensorflow. يمكنك تحويل مجموعة القطار إلى عمود رقمي.

feature_columns = [tf.feature_column.numeric_column('x', shape=X_train_scaled.shape[1:])]

الخطوة 4) بناء النموذج

تحتوي بنية الشبكة العصبية على طبقتين مخفيتين تحتوي الطبقة الأولى على 2 وحدة وطبقة ثانية تحتوي على 300 وحدة. نستخدم هذه القيم بناءً على خبرتنا الخاصة. يمكنك ضبط هذه القيم ومعرفة مدى تأثيرها على دقة الشبكة.

لبناء النموذج، يمكنك استخدام المقدر DNNClassifier. يمكنك إضافة عدد الطبقات إلى وسيطات feature_columns. تحتاج إلى ضبط عدد الفصول على 10 نظرًا لوجود عشرة فصول في مجموعة التدريب. أنت بالفعل على دراية ببناء جملة كائن المقدر. تتميز الوسائط بالأعمدة وعدد الفئات وmodel_dir وهي نفسها تمامًا كما في البرنامج التعليمي السابق. تتحكم الوسيطة الجديدة Hidden_unit في عدد الطبقات وعدد العقد التي سيتم توصيلها بالشبكة العصبية. في الكود أدناه، هناك طبقتان مخفيتان، الأولى تربط 300 عقدة والثانية تحتوي على 100 عقدة.

لبناء المقدر، استخدم tf.estimator.DNNClassifier مع المعلمات التالية:

  • feature_columns: تحديد الأعمدة المراد استخدامها في الشبكة
  • Hidden_units: تحديد عدد الخلايا العصبية المخفية
  • n_classes: تحديد عدد الفئات المراد التنبؤ بها
  • model_dir: تحديد مسار TensorBoard
estimator = tf.estimator.DNNClassifier(
    feature_columns=feature_columns,
    hidden_units=[300, 100], 
    n_classes=10, 
    model_dir = '/train/DNN')

الخطوة 5) تدريب النموذج وتقييمه

يمكنك استخدام الطريقة numpy لتدريب النموذج وتقييمه

# Train the estimator
train_input = tf.estimator.inputs.numpy_input_fn(
    x={"x": X_train_scaled},
    y=y_train,
    batch_size=50,
    shuffle=False,
    num_epochs=None)
estimator.train(input_fn = train_input,steps=1000) 
eval_input = tf.estimator.inputs.numpy_input_fn(
    x={"x": X_test_scaled},
    y=y_test, 
    shuffle=False,
    batch_size=X_test_scaled.shape[0],
    num_epochs=1)
estimator.evaluate(eval_input,steps=None) 

الإخراج:

{'accuracy': 0.9637143,
 'average_loss': 0.12014342,
 'loss': 1682.0079,
 'global_step': 1000}

يؤدي التصميم الحالي إلى دقة في مجموعة التقييم تصل إلى 96 بالمائة.

الخطوة 6) تحسين النموذج

يمكنك محاولة تحسين النموذج عن طريق إضافة معلمات التنظيم.

سنستخدم مُحسِّن Adam بمعدل إسقاط 0.3، L1 لـ X وL2 لـ y. في TensorFlow Neural Network، يمكنك التحكم في المُحسِّن باستخدام سلسلة الكائنات التي تتبع اسم المُحسِّن. TensorFlow عبارة عن واجهة برمجة تطبيقات مضمنة لمُحسِّن Proximal AdaGrad.

لإضافة التنظيم إلى الشبكة العصبية العميقة، يمكنك استخدام tf.train.ProximalAdagradOptimizer مع المعلمة التالية

  • معدل التعلم: Learning_rate
  • تسوية L1: l1_regularization_strength
  • تسوية L2: l2_regularization_strength
estimator_imp = tf.estimator.DNNClassifier(
    feature_columns=feature_columns,
    hidden_units=[300, 100],
    dropout=0.3, 
    n_classes = 10,
    optimizer=tf.train.ProximalAdagradOptimizer(
      learning_rate=0.01,
      l1_regularization_strength=0.01, 
      l2_regularization_strength=0.01
    ),
    model_dir = '/train/DNN1')
estimator_imp.train(input_fn = train_input,steps=1000) 
estimator_imp.evaluate(eval_input,steps=None) 

الإخراج:

{'accuracy': 0.95057142,
 'average_loss': 0.17318928,
 'loss': 2424.6499,
 'global_step': 2000}

القيم المختارة لتقليل التركيب الزائد لم تحسن دقة النموذج. النموذج الأول الخاص بك يتمتع بدقة تبلغ 96% بينما النموذج المزود بمنظم L2 يتمتع بدقة تبلغ 95%. يمكنك تجربة قيم مختلفة ومعرفة مدى تأثيرها على الدقة.

الملخص

ستتعلم في هذا البرنامج التعليمي كيفية بناء شبكة عصبية. تتطلب الشبكة العصبية ما يلي:

  • عدد الطبقات المخفية
  • عدد العقد المتصلة بالكامل
  • وظيفة التنشيط
  • محسن
  • عدد الفصول

في TensorFlow ANN، يمكنك تدريب الشبكة العصبية على حل مشكلة التصنيف باستخدام:

  • tf.estimator.DNNClassifier

يتطلب المقدر تحديد:

  • feature_columns=feature_columns,
  • Hidden_units=[300, 100]
  • n_classes=10
  • model_dir

يمكنك تحسين النموذج باستخدام أدوات تحسين مختلفة. في هذا البرنامج التعليمي، تعلمت كيفية استخدام مُحسِّن Adam Grad بمعدل تعلم وإضافة عنصر تحكم لمنع التجاوز.