في تحديات التنبؤ بالتسلسل، تعد الذاكرة قصيرة المدى المستمرة لفترة أطول (Long Short Term Memory) نوعًا من الشبكات العصبية المتكررة التي يمكنها تعلم الاعتماد على النظام (order dependence). يتم استخدام إخراج الخطوة السابقة كمدخل في الخطوة الحالية في RNN. لقد تناولت مسألة التبعية طويلة المدى لـ RNN، إذ لا يستطيع RNN التنبؤ بالمخزون اللغوي للذاكرة طويلة المدى (long term memory) ولكن يمكنها تقديم تنبؤات أكثر دقة بناءً على البيانات الحالية. لا توفر RNN أداءً فعالاً مع ارتفاع طول الفجوة. لقد تحتفظ LSTM افتراضيا بالمعلومات لفترة طويلة، إذ يتم استخدامها لمعالجة بيانات السلاسل الزمنية (time-series data processing) والتنبؤ والتصنيف (classification).

لدى LSTM اتصالات تغذية مرتدة، على عكس الشبكات العصبية التقليدية للتغذية الأمامية (conventional feed-forward neural networks). يمكنه التعامل ليس مع نقاط البيانات الفردية (مثل الصور) فحسب، بل تتعامل مع تدفقات البيانات الكاملة (مثل الكلام أو الفيديو) أيضا. يمكن استخدام LSTM في مهام مثل التعرف على خطوط اليد غير المقسمة أو المرتبطة أو التعرف على الكلام.
بنية LSTM
يتكون LSTM من أربع شبكات عصبية والعديد من كتل الذاكرة المعروفة باسم الخلايا في بنية السلسلة (chain structure). تتكون وحدة LSTM التقليدية من خلية (cell)، بوابة إدخال (input gate)، بوابة إخراج (output gate) وبوابة نسيان (forget gate) أيضا. يتم التحكم في تدفق المعلومات داخل وخارج الخلية من خلال البوابات الثلاث هذه، وتتذكر الخلية القيم على فترات زمنية عشوائية. تم تكييف خوارزمية LSTM جيدًا لتصنيف وتحليل وتوقع السلاسل الزمنية ذات المدة غير المؤكدة.

تخزن الخلايا المعلومات، بينما تتلاعب البوابات بالذاكرة. يوجد ثلاث مداخل:
- بوابة الإدخال (Input Gate): تحدد قيم الإدخال التي يجب استخدامها لتغيير الذاكرة. تحدد الدالة السينية (sigmoid function) ما إذا كان سيتم السماح بمرور قيم 0 أو 1. وتحدد الدالة tanh وزناً للبيانات المقدمة، وتحدد أهميتها على مقياس من 1- إلى 1.

- بوابة النسيان (forget gate): يجد التفاصيل التي لابد من إزالتها من الكتلة. يتم تحديده من خلال وظيفة السينية (sigmoid function). لكل رقم في حالة الخلية Ct-1، ينظر إلى الحالة السابقة (ht-1) وإدخال المحتوى (Xt) وينتج رقمًا بين 0 (حذف هذا) و 1 (احتفظ بهذا).

- بوابة الإخراج (Output Gate): يتم استخدام مدخلات وذاكرة الكتلة لتحديد الإخراج. تحدد الدالة السينية ما إذا كان سيتم السماح بمرور قيم 0 أو 1. وتحدد الدالة tanh القيم المسموح لها بالمرور عبر 0، 1. وتعين الدالة tanh وزنًا للقيم المقدمة، وتحدد مدى ملاءمتها على مقياس من 1- إلى 1 وتضربها في الناتج السيني (sigmoid output).

تستخدم الشبكة العصبية المتكررة كتل ذاكرة طويلة المدى (long-term memory) لتوفير سياق لكيفية قبول البرنامج للمدخلات وإنشاء المخرجات. نظرًا إلى أن البرنامج يستخدم بنية تعتمد على عمليات الذاكرة قصيرة المدى (short-term memory) لبناء ذاكرة طويلة المدى، فإن الوحدة يطلق عليها اسم كتلة ذاكرة طويلة المدى. في معالجة اللغة الطبيعية، ويتم استخدام هذه الأنظمة على نطاق واسع.
شبكات LSTM
تشكل سلسلة من وحدات الشبكة العصبية المتكررة جميع الشبكات العصبية المتكررة (recurrent neural networks). سيكون لهذه الوحدة النمطية المكررة في RNNs التقليدية بنية بسيطة، مثل طبقة تان واحدة.
يصبح ناتج الخطوة الزمنية الحالية، المدخل للخطوة الزمنية التالية، والتي يشار إليها باسم المتكررة (Recurrent). في كل من عناصر التسلسل، لا يفحص النموذج المدخلات الحالية وحسب، بل يفحص أيضًا ما يعرفه عن المدخلات السابقة.
توجد طبقة واحدة في الوحدة النمطية المتكررة لـ RNN التقليدية:

تتكون الوحدة النمطية المتكررة لـ LSTM من أربع طبقات تتفاعل مع بعضها البعض:

- تعتبر حالة الخلية، التي يمثلها الخط الأفقي أعلى الرسم التخطيطي، أمرًا بالغ الأهمية بالنسبة لـ LSTMs.
- تشبه حالة الخلية، حالة الحزام الناقل من نواحٍ معينة. لا يوجد سوى عدد قليل من التفاعلات الخطية الصغيرة أثناء انتقالها إلى أسفل السلسلة بأكملها. من السهل جدًا أن تنتقل البيانات إلى أسفلها دون التغيير فيها.
- يمكن لـ LSTM حذف أو إضافة معلومات إلى حالة الخلية، والتي يتم التحكم فيها بعناية بواسطة هياكل تسمى البوابات.
- البوابات هي آلية تسمح بمرور المعلومات بشكل انتقائي. تتكون الطبقة الشبكية العصبية السينية (sigmoid neural net layer) إضافة إلى عملية الضرب النقطي.
- تنتج الطبقة السينية أعدادًا صحيحة تتراوح من 0 إلى 1، مما يشير إلى مقدار كل مكون يجب السماح له بالمرور. تشير القيمة “0” إلى أنه يجب السماح بمرور “لا شيء”، بينما تشير القيمة “1” إلى أنه يجب السماح بمرور “كل شيء”.
- توجد ثلاث من هذه البوابات في LSTM لحماية حالة الخلية (cell state) والتحكم فيها.
دورة LSTM
تنقسم دورة (cycle) LSTM إلى أربع خطوات:
- باستخدام بوابة النسيان (forget gate)، يتم تحديد المعلومات التي يجب نسيانها من خطوة زمنية سابقة.
- باستخدام بوابة الإدخال (input gate) و tanh، يتم البحث عن معلومات جديدة لتحديث حالة الخلية (cell state).
- تُستخدم المعلومات الواردة من البوابتين أعلاه لتحديث حالة الخلية.
- توفر بوابة الإخراج وعملية السحق معلومات مفيدة.

مثال طبقة LSTM مع توقع سعر السهم في Keras
سنستخدم في المثال أدناه على Keras LSTM، بيانات أسعار الأسهم للتنبؤ بما إذا كانت أسعار الأسهم سترتفع أم تنخفض باستخدام شبكة LSTM.
تحميل المكتبات الأولية
سنقوم أولاً، بتحميل المكتبات المطلوبة:
import numpy as np import matplotlib.pyplot as plt import pandas as pd
تحميل مجموعة البيانات
سنقوم الآن بتحميل مجموعة البيانات، وسنستخدم الأمر “head” للحصول على فكرة عن محتواها:
dataset_train = pd.read_csv('NSE-TATAGLOBAL.csv') dataset_train.head()
الإخراج:
Date Open High Low Last Close Total Trade Quantity Turnover (Lacs) 0 2018-09-28 234.05 235.95 230.20 233.50 233.75 3069914 7162.35 1 2018-09-27 234.55 236.80 231.10 233.80 233.25 5082859 11859.95 2 2018-09-26 240.00 240.00 232.50 235.00 234.25 2240909 5248.60 3 2018-09-25 233.30 236.75 232.00 236.25 236.10 2349368 5503.90 4 2018-09-24 233.55 239.20 230.75 234.00 233.30 3423509 7999.55
سنختار الآن أول عمودين ضروريين لبناء نموذجنا.
من العمودين المحددين من مجموعة البيانات، يمثل عمود “open” سعر البداية للسهم لهذا اليوم، بينما يمثل عمود “close” السعر النهائي للسهم في يوم معين.
training_set = dataset_train.iloc[:, 1:2].values
تحجيم الخصیصة (Feature Scaling)
لتحقيق أفضل النتائج بالنماذج، علينا توسيع نطاق البيانات. لهذا نستخدم أداة قياس minmax لمكتبة scikit-Learn لتحويل قيم الإدخال بين 0 و 1.
from sklearn.preprocessing import MinMaxScaler sc = MinMaxScaler(feature_range = (0, 1)) training_set_scaled = sc.fit_transform(training_set)
إنشاء البيانات بواسطة Timesteps
عندما نعمل بـ LSTM، نحتاج للاحتفاظ بالبيانات بتنسيق معين. بمجرد إنشاء البيانات في 60 خطوة زمنية (timesteps)، يمكننا بعد ذلك تحويلها إلى مصفوفة NumPy. أخيرًا، يتم تحويل البيانات إلى مصفوفة ثلاثية الأبعاد، 60 إطارًا زمنيًا (timeframes)، وأيضًا خصیصة واحدة في كل خطوة.
X_train = [] y_train = [] for i in range(60, 2035): X_train.append(training_set_scaled[i-60:i, 0]) y_train.append(training_set_scaled[i, 0]) X_train, y_train = np.array(X_train), np.array(y_train) X_train = np.reshape(X_train, (X_train.shape[0], X_train.shape[1], 1))
تحميل Keras LSTM والوحدات النمطية الأخرى
حان الوقت لبناء LSTM الخاص بنا، لذلك سنقوم بتحميل وحدات Keras معينة – متسلسلة (Sequential)، كثيفة (Dense)، LSTM، ومتسربة (Dropout).
from keras.models import Sequential from keras.layers import Dense from keras.layers import LSTM from keras.layers import Dropout
بناء LSTM في keras
نضيف أولاً طبقة Keras LSTM، وبعد ذلك نضيف طبقات منسدلة (Dropout) للوقاية من overfitting.
بالنسبة لطبقة LSTM، سنضيف 50 وحدة تمثل أبعاد الفضاء الخارجي. ويتم تعيين المعلمة return_sequences على true لإرجاع آخر إخراج في المخرجات.
نحدد النسبة المئوية للطبقات التي يجب إسقاطها، لإضافة طبقات منسدلة (Dropout). الخطوة التالية هي إضافة الطبقة الكثيفة (dense layer). أخيرًا، نقوم بتجميع (compile) النموذج بمساعدة مُحسِّن (optimizer) adam. ويتم حساب الخطأ باستخدام mean_squared_error.
أخيرًا، النموذج مناسب باستخدام 100 حقبة بحجم دفعة (batch size) 32.
regressor = Sequential() regressor.add(LSTM(units = 50, return_sequences = True, input_shape = (X_train.shape[1], 1))) regressor.add(Dropout(0.2)) regressor.add(LSTM(units = 50, return_sequences = True)) regressor.add(Dropout(0.25)) regressor.add(LSTM(units = 50, return_sequences = True)) regressor.add(Dropout(0.25)) regressor.add(LSTM(units = 50)) regressor.add(Dropout(0.25)) regressor.add(Dense(units = 1)) regressor.compile(optimizer = 'adam', loss = 'mean_squared_error') regressor.fit(X_train, y_train, epochs = 100, batch_size = 32)
الإخراج:
Epoch 1/100 62/62 [==============================] - 13s 107ms/step - loss: 0.0178 Epoch 2/100 62/62 [==============================] - 7s 105ms/step - loss: 0.0039 Epoch 3/100 62/62 [==============================] - 7s 106ms/step - loss: 0.0030 Epoch 4/100 62/62 [==============================] - 7s 107ms/step - loss: 0.0025 Epoch 5/100 62/62 [==============================] - 7s 109ms/step - loss: 0.0029 Epoch 6/100 62/62 [==============================] - 7s 109ms/step - loss: 0.0024 Epoch 7/100 62/62 [==============================] - 7s 110ms/step - loss: 0.0021 Epoch 8/100 62/62 [==============================] - 7s 109ms/step - loss: 0.0025 Epoch 9/100 62/62 [==============================] - 7s 110ms/step - loss: 0.0023 Epoch 10/100 62/62 [==============================] - 7s 112ms/step - loss: 0.0023 Epoch 11/100 62/62 [==============================] - 7s 111ms/step - loss: 0.0021 Epoch 12/100 62/62 [==============================] - 7s 110ms/step - loss: 0.0021 . . . Epoch 89/100 62/62 [==============================] - 7s 112ms/step - loss: 6.3740e-04 Epoch 90/100 62/62 [==============================] - 7s 112ms/step - loss: 7.1106e-04 Epoch 91/100 62/62 [==============================] - 7s 112ms/step - loss: 6.8522e-04 Epoch 92/100 62/62 [==============================] - 7s 112ms/step - loss: 6.1644e-04 Epoch 93/100 62/62 [==============================] - 7s 112ms/step - loss: 8.3309e-04 Epoch 94/100 62/62 [==============================] - 7s 113ms/step - loss: 6.6484e-04 Epoch 95/100 62/62 [==============================] - 7s 114ms/step - loss: 7.1230e-04 Epoch 96/100 62/62 [==============================] - 7s 112ms/step - loss: 6.1534e-04 Epoch 97/100 62/62 [==============================] - 7s 112ms/step - loss: 7.8100e-04 Epoch 98/100 62/62 [==============================] - 7s 112ms/step - loss: 6.7760e-04 Epoch 99/100 62/62 [==============================] - 7s 113ms/step - loss: 5.6843e-04 Epoch 100/100 62/62 [==============================] - 7s 113ms/step - loss: 6.8640e-04
توقع الأسهم المستقبلية باستخدام مجموعة الاختبار
سنقوم هنا باستيراد مجموعة الاختبار لإجراء التنبؤات:
dataset_test = pd.read_csv('tatatest.csv') real_stock_price = dataset_test.iloc[:, 1:2].values
للتنبؤ بأسعار الأسهم، يجب أولاً دمج مجموعتي التدريب والاختبار. نقوم بتعيين الخطوة الزمنية (timestep) على 60، ونطبق أيضًا MinMaxScaler على مجموعة البيانات الجديدة وأخيرًا، تمت إعادة تشكيل مجموعة البيانات.
علينا أن نستخدم inverse_transform للحصول على أسعار الأسهم.
dataset_total = pd.concat((dataset_train['Open'], dataset_test['Open']), axis = 0) inputs = dataset_total[len(dataset_total) - len(dataset_test) - 60:].values inputs = inputs.reshape(-1,1) inputs = sc.transform(inputs) X_test = [] for i in range(60, 76): X_test.append(inputs[i-60:i, 0]) X_test = np.array(X_test) X_test = np.reshape(X_test, (X_test.shape[0], X_test.shape[1], 1)) predicted_stock_price = regressor.predict(X_test) predicted_stock_price = sc.inverse_transform(predicted_stock_price)
رسم النتائج
لنرسم نتائج أسعار الأسهم بمساعدة مكتبة matplotlib:
plt.plot(real_stock_price, color = 'black', label = 'TATA Stock Price') plt.plot(predicted_stock_price, color = 'green', label = 'Predicted TATA Stock Price') plt.title('TATA Stock Price Prediction') plt.xlabel('Time') plt.ylabel('TATA Stock Price') plt.legend() plt.show()
الإخراج:

يوضح الرسم البياني أعلاه، أن سعر أسهم Tata سيرتفع ويظهر توقعنا النموذجي أيضًا، بأنه سيرتفع سعر أسهم Tata. يوضح هذا مدى نجاحنا في تدريب نموذجنا على السلاسل الزمنية والمشكلات المتسلسلة.
الاستنتاج
سننهي الآن هذه المقالة التعليمية حيث تطرقنا إلى تطبيق Keras LSTM Layer وتعلمنا كيف يمكننا تنفيذ شبكة LSTM للتنبؤ بأسعار المخزون بمساعدة مكتبة Keras. تم تدريب نموذج LSTM الذي يعمل بالطاقة لمعرفة ما إذا كانت أسعار الأسهم سترتفع أو تنخفض في المستقبل.
المصادر
This article is useful for me
1+ 9 People like this post