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

بنیة LSTM

لدى LSTM اتصالات تغذية مرتدة، على عكس الشبكات العصبية التقليدية للتغذية الأمامية (conventional feed-forward neural networks). يمكنه التعامل ليس مع نقاط البيانات الفردية (مثل الصور) فحسب، بل تتعامل مع تدفقات البيانات الكاملة (مثل الكلام أو الفيديو) أيضا. يمكن استخدام LSTM في مهام مثل التعرف على خطوط اليد غير المقسمة أو المرتبطة أو التعرف على الكلام.

بنية LSTM

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

بنیة LSTM

تخزن الخلايا المعلومات، بينما تتلاعب البوابات بالذاكرة. يوجد ثلاث مداخل:

  • بوابة الإدخال (Input Gate): تحدد قيم الإدخال التي يجب استخدامها لتغيير الذاكرة. تحدد الدالة السينية (sigmoid function) ما إذا كان سيتم السماح بمرور قيم 0 أو 1. وتحدد الدالة tanh وزناً للبيانات المقدمة، وتحدد أهميتها على مقياس من 1- إلى 1.
بنیة LSTM
  • بوابة النسيان (forget gate): يجد التفاصيل التي لابد من إزالتها من الكتلة. يتم تحديده من خلال وظيفة السينية (sigmoid function). لكل رقم في حالة الخلية Ct-1، ينظر إلى الحالة السابقة (ht-1) وإدخال المحتوى (Xt) وينتج رقمًا بين 0 (حذف هذا) و 1 (احتفظ بهذا).
بنیة LSTM
  • بوابة الإخراج (Output Gate): يتم استخدام مدخلات وذاكرة الكتلة لتحديد الإخراج. تحدد الدالة السينية ما إذا كان سيتم السماح بمرور قيم 0 أو 1. وتحدد الدالة tanh القيم المسموح لها بالمرور عبر 0، 1. وتعين الدالة tanh وزنًا للقيم المقدمة، وتحدد مدى ملاءمتها على مقياس من 1- إلى 1 وتضربها في الناتج السيني (sigmoid output).
بنیة LSTM

تستخدم الشبكة العصبية المتكررة كتل ذاكرة طويلة المدى (long-term memory) لتوفير سياق لكيفية قبول البرنامج للمدخلات وإنشاء المخرجات. نظرًا إلى أن البرنامج يستخدم بنية تعتمد على عمليات الذاكرة قصيرة المدى (short-term memory) لبناء ذاكرة طويلة المدى، فإن الوحدة يطلق عليها اسم كتلة ذاكرة طويلة المدى. في معالجة اللغة الطبيعية، ويتم استخدام هذه الأنظمة على نطاق واسع.

شبكات LSTM

تشكل سلسلة من وحدات الشبكة العصبية المتكررة جميع الشبكات العصبية المتكررة (recurrent neural networks). سيكون لهذه الوحدة النمطية المكررة في RNNs التقليدية بنية بسيطة، مثل طبقة تان واحدة.

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

توجد طبقة واحدة في الوحدة النمطية المتكررة لـ RNN التقليدية:

بنیة LSTM

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

بنیة 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 الذي يعمل بالطاقة لمعرفة ما إذا كانت أسعار الأسهم سترتفع أو تنخفض في المستقبل.

المصادر

الأول

الثاني

منشور ذات صلة
ميزات الجيل الثالث للويب 6 Minutes

ميزات الجيل الثالث للويب (Web 3)

هدى عكرش

بينما لا تزال موجة الويب 2 تنمو ويتم تنفيذ العديد من الأنشطة البشرية على هذه المنصة، يمكن أيضًا رؤية العلامات الأولى لنمو الويب 3 في تطبيقات الإنترنت.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

السلة