في تحديات التنبؤ بالتسلسل، تعد الذاكرة قصيرة المدى المستمرة لفترة أطول (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 التقليدية بنية بسيطة، مثل طبقة تان واحدة.

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

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

بنیة LSTM

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

بنیة LSTM
  • تعتبر حالة الخلية، التي يمثلها الخط الأفقي أعلى الرسم التخطيطي، أمرًا بالغ الأهمية لـ LSTMs.
  • تشبه حالة الخلية حالة الحزام الناقل من نواحٍ معينة. لا يوجد سوى عدد قليل من التفاعلات الخطية الصغيرة أثناء انتقالها إلى أسفل السلسلة بأكملها. من السهل جدًا أن تنتقل البيانات إلى أسفلها دون تغييرها.
  • يمكن لـ LSTM حذف أو إضافة معلومات إلى حالة الخلية، والتي يتم التحكم فيها بعناية بواسطة هياكل تسمى البوابات.
  • البوابات هي آلية تسمح بمرور المعلومات بشكل انتقائي. تتكون الطبقة الشبكية العصبية السينية  (sigmoid neural net layer) بالإضافة إلى عملية الضرب النقطي.
  • تنتج الطبقة السينية أعدادًا صحيحة تتراوح من صفر إلى واحد، مما يشير إلى مقدار كل مكون يجب أن يُسمح له بالمرور. تشير القيمة “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 الذي يعمل بالطاقة لمعرفة ما إذا كانت أسعار الأسهم سترتفع أو تنخفض في المستقبل.

المصادر

الأول

الثاني

منشور ذات صلة
KPCA 3 Minutes

تنفيذ تحليل العنصر الرئيسي للنواة (Kernel principal component analysis) في بایثون

حسن خنفري

تستخدم تحليل العنصر الرئيسي للنواة (Kernel PCA) دالة نواه (kernel) لعرض مجموعة البيانات في مساحة ميزة ذات أبعاد أعلى، حيث يمكن فصلها خطيًا. إنه مشابه لفكرة الآله المتجهات الداعمة (Support Vector Machine).

اترك تعليقاً

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

السلة