حل معادلة الرياضيات الأساسية باستخدام RNN [مع مثال ترميز]
نشرت: 2020-12-07إذا كانت الحياة تمنحك RNN ، اصنع آلة حاسبة
الشبكة العصبية المتكررة هي إحدى الشبكات العصبية الاصطناعية الكلاسيكية ، حيث تشكل الاتصالات بين العقد رسمًا بيانيًا موجهًا متسلسلاً. تشتهر شبكات RNN بتطبيقات مثل التعرف على الكلام ، والتعرف على خط اليد ، وما إلى ذلك بسبب ذاكرة الحالة الداخلية الخاصة بها لمعالجة التسلسلات متغيرة الطول.
يتم تصنيف RNNs إلى نوعين. الأول هو نبضة محدودة تكون شبكتها العصبية في شكل رسم بياني لا دوري موجه حيث يمكن توصيل عقدة واحدة بعقد أو أكثر في المقدمة بدون دورة مرئية في الشبكة. واحد آخر هو الدافع اللانهائي الذي تكون شبكته العصبية في شكل رسم بياني دوري موجه لا يمكن فكه في شبكة عصبية تغذية للأمام.
جدول المحتويات
ماذا سنفعل؟
لنقم ببناء نموذج يتنبأ بمخرجات تعبير حسابي. على سبيل المثال ، إذا قدمت إدخالًا "11 +88" ، فيجب على النموذج توقع الكلمة التالية في التسلسل كـ "99". المدخلات والمخرجات عبارة عن سلسلة من الأحرف منذ أن تتعامل RNN مع البيانات المتسلسلة.
يبدو الآن تصميم بنية النموذج كمهمة بسيطة عند مقارنته بمجموعة مجموعة البيانات. يعد إنشاء البيانات أو جمع مجموعة البيانات مهمة شاقة لأن نماذج الذكاء الاصطناعي المتعطشة للبيانات تتطلب قدرًا معقولًا من البيانات للحصول على دقة مقبولة.
لذلك يمكن تنفيذ هذا النموذج في 6 خطوات أساسية:

- توليد البيانات
- بناء نموذج
- توجيه البيانات وإلغاء اتجاهها
- صنع مجموعة بيانات
- تدريب النموذج
- اختبار النموذج
قبل أن نتعمق في تنفيذ النموذج ، دعنا فقط نستورد جميع المكتبات المطلوبة.
استيراد numpy كـ np استيراد tensorflow مثل tf من tensorflow.keras.models استيراد تسلسلي من tensorflow.keras.layers استيراد كثيف ، تسرب ، SimpleRNN ، RepeatVector ، TimeDistributed من tensorflow.keras.callbacks استيراد EarlyStopping ، LambdaCallback من مصطلح الاستيراد الملون |
1. توليد البيانات
دعنا نحدد سلسلة أحرف تحتوي على جميع الأحرف التي نحتاجها لكتابة معادلة حسابية أساسية. لذلك ، تتكون السلسلة من جميع الأحرف من 0-9 وجميع العوامل الحسابية مثل / ، * ، + ، - ،. (عشري).
لا يمكننا تغذية البيانات الرقمية مباشرة في نموذجنا ، نحتاج إلى تمرير البيانات في شكل موترات. سوف يمنحنا تحويل السلسلة في البيانات إلى متجه مشفر واحدًا أداء نموذجيًا محسنًا. المتجه المشفر واحد ساخن هو مصفوفة بطول مماثل لطول سلسلة char الخاصة بنا ، كل متجه واحد ساخن له متجه واحد فقط في فهرس الحرف المعني الموجود في كل سلسلة.
على سبيل المثال ، لنفترض أن سلسلة الأحرف الخاصة بنا هي "0123456789" ، وإذا أردنا تشفير سلسلة مثل "12" ، فسيكون المتجه الوحيد الساخن [[0،1،0،0،0،0،0،0 ، 0،0] ، [0،0،1،0،0،0،0،0،0،0]]. للقيام بذلك ، نحتاج إلى إنشاء قاموسين مع فهرس واحد كمفاتيح وأحرف كقيم والآخر بالعكس.
char_string = ' 0123456789 / * + -. " num_chars = لين (char_string) character_to_index = ict ((c، i) for i، c في التعداد (char_string)) index_to_character = ict ((i، c) for i، c في التعداد (char_string)) |
لنكتب الآن دالة تُرجع معادلة حسابية عشوائية مع نتيجة تلك المعادلة.
تقسيم def (n، d): العودة n / d إذا كان d ! = 0 وإلا 0 def datagen (): عشوائي 1 = np.random.randint (منخفض = 0 ، مرتفع = 100 ) عشوائي 2 = np.random.randint (منخفض = 0 ، مرتفع = 100 ) المرجع = np.random.randint (منخفض = 0 ، مرتفع = 4 ) إذا كان المرجع == 1 : أريث = str (عشوائي 1) + ' + ' + str (عشوائي 2) الدقة = str (عشوائي 1 + عشوائي 2) عملية elif == 1 : أريث = str (عشوائي 1) + ' - ' + str (عشوائي 2) الدقة = str (عشوائي 1 - عشوائي 2) عملية elif == 2 : أريث = str (عشوائي 1) + ' * ' + str (عشوائي 2) الدقة = str (عشوائي 1 * عشوائي 2) آخر : أريث = str (عشوائي 1) + ' / ' + str (عشوائي 2) الدقة = str ( round (قسم (عشوائي 1 ، عشوائي 2) ، 2 )) عودة arith ، الدقة |
اقرأ أيضًا: أفكار مثيرة للاهتمام لمشروع الشبكة العصبية
2. بناء نموذج
سيحتوي النموذج على جهاز تشفير ووحدة فك ترميز. المشفر هو نموذج RNN بسيط مع شكل إدخال مثل (None ، num_chars) و 128 وحدة مخفية ، والسبب في اختيارنا للوحدات المخفية مثل 32،64،128 ، وما إلى ذلك هو بسبب الأداء الأفضل لوحدة المعالجة المركزية أو وحدة معالجة الرسومات مع الوحدات المخفية كصلاحيات 2.
سيكون برنامج التشفير الخاص بنا عبارة عن شبكة متصلة بالكامل وسيتم إعادة إخراجها إلى الشبكة ، وهذه هي الطريقة التي يعمل بها RNN. تستخدم طبقة RNN التنشيط "tanh" افتراضيًا ، ولن نتغير لأنها تناسب المشفر بشكل أفضل. سيكون ناتج هذه الطبقة متجهًا واحدًا ولتحقيق متجه واحد للمخرج بأكمله ، سنستخدم طبقة RepeatVector () مع العدد المطلوب من المرات كمعامل.
الآن سيحصل متجه الإخراج على جوهر المدخلات المعطاة ، وسيتم تغذية هذا المتجه في وحدة فك التشفير.
يتكون مفكك التشفير من طبقة RNN بسيطة وهذا سيولد تسلسل الإخراج لأننا نحتاج إلى طبقة RNN لإرجاع التسلسل المتوقع وسنقوم بوضع علامة على "عودة_تسلسل" على أنها صحيحة. من خلال تعيين 'return_sequences' كـ True ، ستعيد طبقة RNN التسلسل المتوقع لكل خطوة زمنية (كثير إلى العديد من RNN).
يتم تغذية ناتج طبقة RNN هذه في طبقة كثيفة بعدد "num_chars" من الوحدات المخفية وسنستخدم تنشيط softmax نظرًا لأننا نحتاج إلى احتمال كل حرف. قبل أن ننشر طبقة كثيفة ، نحتاج إلى اختصار هذه الطبقة في طبقة موزعة زمنيًا لأننا نحتاج إلى نشر طبقة كثيفة لإخراج كل خطوة زمنية.
وحدات مخفية = 128 max_time_steps = 5 # نقوم بترميز الإخراج ليكون من 5 أحرف نموذج def (): النموذج = متسلسل () model.add (SimpleRNN (hidden_units، input_shape = ( None ، num_chars))) model.add (RepeatVector (max_time_steps)) model.add (SimpleRNN (hidden_units، return_sequences = True )) model.add (توزيع الوقت (كثيف (عدد_أرقام ، التنشيط = ' softmax ' ))) نموذج العودة النموذج = النموذج () ملخص نموذج() model.compile (الخسارة = ' categorical_crossentropy ' ، المحسن = ' adam ' ، المقاييس = [ ' الدقة ' ]) |
ستكون بنية النموذج كما هو موضح أعلاه
يجب أن تقرأ: دروس الشبكة العصبية
3. توجيه البيانات وإلغاء اتجاهها
دعنا نحدد وظائف Vectorizing و de-vectorizing البيانات.
ها هي وظيفة توجيه التعبير الحسابي والنتيجة معًا.
def vectorize (arith، res): x = np.zeros ((max_time_steps، num_chars)) ![]() y = np.zeros ((max_time_steps، num_chars)) x_remaining = max_time_steps - len (arith) y_remaining = max_time_steps - len (res) ل ، ج في تعداد (arith): x [x_remaining + i، character_to_index [c]] = 1 بالنسبة لـ i في النطاق (x_remaining): x [i، character_to_index [ ' 0 ' ]] = 1 بالنسبة لـ i ، c في العد (الدقة): y [y_remaining + i، character_to_index [c]] = 1 بالنسبة لـ i في النطاق (y_remaining): y [i، character_to_index [ ' 0 ' ]] = 1 العودة x ، y |
وبالمثل ، هذه هي وظيفة إلغاء توجيه السلسلة. نظرًا لأن المخرجات التي نتلقاها هي متجه للاحتمالات ، فسنستخدم np.argmax () لاختيار الشخصية ذات الاحتمال الأعلى. الآن يتم استخدام قاموس index_to_character لتتبع الحرف في هذا الفهرس.
defectorize ( إدخال ): res = [index_to_character [np.argmax (vec)] لـ i ، vec في التعداد ( الإدخال )] عودة " . الانضمام (الدقة) |
الآن القيد الذي نواجهه مع وظيفة "devectorize" هو أنه سوف يقوم بتضمين الأحرف اللاحقة بالأصفار. على سبيل المثال ، إذا كان متجه الإدخال هو ('1-20' ، '-19') ، فسيكون الناتج غير المتجه ('01 -20 '، '00 -19'). نحن بحاجة إلى الاهتمام بهذه الأصفار المبطنة الإضافية. لنكتب دالة لنزع السلسلة.
تجريد مواطنه (المدخلات): العلم = خطأ الإخراج = " _ لـ c في الإدخال : إذا لم يكن العلم و c == ' 0 ' : استمر إذا كان c == ' + ' أو c == ' - ' أو c == ' * ' أو c == ' / ' أو c == ' . " : العلم = خطأ آخر : العلم = صحيح الإخراج + = ج عودة الإخراج |
4. عمل مجموعة بيانات
الآن وقد انتهينا من تحديد وظيفة لتوليد البيانات ، فلنستخدم هذه الوظيفة وننشئ مجموعة بيانات بها العديد من أزواج (التعبير الحسابي ، النتيجة).
def create_dataset (عدد_المعادلات): x_train = np.zeros ((عدد_المعادلات ، max_time_steps ، num_chars)) y_train = np.zeros ((عدد_المعادلات ، max_time_steps ، num_chars)) بالنسبة لـ i في النطاق (عدد_المعادلات): ه ، ل = داتاجين () س ، ص = متجه (ه ، ل) x_train [i] = x y_train [i] = y إرجاع x_train ، y_train |
5. تدريب النموذج
دعنا ننشئ مجموعة بيانات من 50000 عينة وهو رقم معقول لتدريب نموذج جوع البيانات الخاص بنا ، سنستخدم 25٪ من هذه البيانات للتحقق من صحتها. أيضًا ، لنقم بإنشاء رد اتصال لمقاطعة التدريب الذكية إذا ظلت الدقة دون تغيير لمدة 8 فترات. يمكن تحقيق ذلك من خلال ضبط معلمة الصبر على 8.

x_train ، y_train = create_dataset ( 50000 ) simple_logger = LambdaCallback ( on_epoch_end = lambda e، l: print ( ' {: .2f} ' .format (l [ ' val_accuracy ' ])، end = ' _ ' ) ) early_stopping = EarlyStopping (الشاشة = ' val_loss ' ، الصبر = 8 ) model.fit (x_train، y_train، epochs = 100 ، validation_split = 0.25 ، مطول = 0 ، عمليات الاسترجاعات = [simple_logger، early_stopping]) |
6. اختبار النموذج
الآن دعنا نختبر نموذجنا عن طريق إنشاء مجموعة بيانات بحجم 30.
x_test ، y_test = create_dataset (عدد_المعادلات = 20 ) preds = model.predict (x_test) full_seq_acc = 0 بالنسبة إلى i ، قبل التعداد (الافتراضات): pred_str = تجريد (تفكك (بري)) y_test_str = تجريد (تفريغ (y_test [i])) x_test_str = تجريد (تفريغ (x_test [i])) col = " أخضر " إذا كان pred_str == y_test_str وإلا " أحمر " full_seq_acc + = 1 / len (preds) * int (pred_str == y_test_str) outstring = ' الإدخال: {} ، الإخراج: {} ، التنبؤ: {} ' .format (x_test_str، y_test_str، pred_str) طباعة (ملونة (خارجية ، عمود)) طباعة ( ' \ n دقة التسلسل الكاملة: {: .3f}٪ '. تنسيق ( 100 * full_seq_acc)) |
سيكون الإخراج على النحو التالي
يمكننا أن نرى أن الدقة ضعيفة هنا ، على أي حال يمكننا تحسينها عن طريق تعديل بعض المعلمات الفائقة مثل عدد الوحدات المخفية ، وتقسيم التحقق من الصحة ، وعدد العهود ، وما إلى ذلك.
خاتمة
لقد فهمنا سير العمل الأساسي لـ RNN ، وفهمنا أن RNNs هي الأنسب للبيانات المتسلسلة ، وقمنا بإنشاء مجموعة بيانات من المعادلات الحسابية العشوائية ، وقمنا بتطوير نموذج تسلسلي للتنبؤ بإخراج التعبير الحسابي الأساسي ، ودربنا هذا النموذج مع مجموعة البيانات التي لقد أنشأنا هذا النموذج واختبرناه أخيرًا باستخدام مجموعة بيانات صغيرة لم يسبق للنموذج رؤيته من قبل.
إذا كنت مهتمًا بمعرفة المزيد حول RNN ، والتعلم الآلي ، فراجع IIIT-B & upGrad's دبلوم PG في التعلم الآلي والذكاء الاصطناعي المصمم للمهنيين العاملين ويقدم أكثر من 450 ساعة من التدريب الصارم ، وأكثر من 30 دراسة حالة ومهمة ، حالة خريجي IIIT-B ، أكثر من 5 مشاريع تكميلية عملية ومساعدة وظيفية مع أفضل الشركات.
ما هي الأنواع المختلفة للشبكات العصبية في التعلم الآلي؟
في التعلم الآلي ، الشبكات العصبية الاصطناعية هي في الأساس نماذج حسابية تم تصميمها لتشبه الدماغ البشري. هناك أنواع مختلفة من الشبكات العصبية الاصطناعية التي يستخدمها التعلم الآلي بناءً على الحساب الرياضي المطلوب تحقيقه. هذه الشبكات العصبية هي مجموعة فرعية من تقنيات التعلم الآلي المختلفة التي تتعلم من البيانات بطرق مختلفة. بعض أنواع الشبكات العصبية الأكثر استخدامًا هي - الشبكة العصبية المتكررة - الذاكرة طويلة المدى ، الشبكة العصبية المغذية - الخلايا العصبية الاصطناعية ، الشبكة العصبية ذات الأساس الشعاعي ، شبكة Kohonen العصبية ذاتية التنظيم ، الشبكة العصبية التلافيفية ، والشبكة العصبية المعيارية ، من بين أمور أخرى.
ما هي مزايا الشبكة العصبية المتكررة؟
الشبكات العصبية المتكررة هي من بين الشبكات العصبية الاصطناعية الأكثر استخدامًا في التعلم العميق والتعلم الآلي. في هذا النوع من نموذج الشبكة العصبية ، يتم تغذية النتيجة التي تم الحصول عليها من الخطوة السابقة كمدخلات إلى الخطوة التالية. تأتي الشبكة العصبية المتكررة مع العديد من المزايا مثل - يمكنها الاحتفاظ بكل جزء من المعلومات بمرور الوقت ، بما في ذلك المدخلات السابقة ، مما يجعلها مثالية للتنبؤ بالسلسلة الزمنية. هذا النوع هو أفضل مثيل للذاكرة الطويلة والقصيرة. أيضًا ، توفر الشبكات العصبية المتكررة حيًا بنّاءً للبكسل باستخدام الطبقات التلافيفية.
كيف يتم توظيف الشبكات العصبية في تطبيقات العالم الحقيقي؟
تعد الشبكات العصبية الاصطناعية جزءًا لا يتجزأ من التعلم العميق ، والذي يعد أيضًا فرعًا فائق التخصص من التعلم الآلي والذكاء الاصطناعي. تُستخدم الشبكات العصبية عبر الصناعات المختلفة لتحقيق أهداف حاسمة مختلفة. تتضمن بعض التطبيقات الواقعية الأكثر إثارة للاهتمام للشبكات العصبية الاصطناعية ، التنبؤ بسوق الأوراق المالية ، والتعرف على الوجه ، والتجربة الآلية عالية الأداء وتشخيص الأخطاء في صناعة الطيران ، وتحليل الهجمات المسلحة وموقع الكائن في قطاع الدفاع ، ومعالجة الصور ، اكتشاف الأدوية والكشف عن الأمراض في قطاع الرعاية الصحية ، والتحقق من التوقيع ، وتحليل خط اليد ، والتنبؤ بالطقس والتنبؤ باتجاهات وسائل التواصل الاجتماعي ، من بين أمور أخرى.