
TensorFlow وKeras وTensorBoard لرصد النماذج
إطار التعلّم الآلي الخاص بـGoogle ولوحة تحكّمه القوية للتصوير
منظومة TensorFlow: أكثر من مجرد إطار عمل
TensorFlow، الذي طوّره Google Brain وأُطلق في 2015، ليس مجرد مكتبة تعلّم عميق — بل منظومة كاملة لبناء وتدريب ونشر ورصد نماذج تعلّم آلي على أي نطاق. بينما يسيطر PyTorch على البحث، يظل TensorFlow قوة الإنتاج الرئيسية، منشور في أنظمة تعالج مليارات التنبّؤات يوميًا عند Google وAirbnb وTwitter وآلاف الشركات الأخرى.
تمتد المنظومة على دورة حياة التعلّم الآلي كاملة:
- Keras — واجهة البرمجة عالية المستوى لبناء وتدريب النماذج، مدمجة بالكامل الآن في TensorFlow كـ
tf.keras - TensorBoard — أدوات تصوير لرصد التدريب، ومقارنة التجارب، وتصحيح النماذج
- tf.data — أنابيب بيانات عالية الأداء لتغذية النماذج بمجموعات بيانات ضخمة
- TensorFlow Serving — تقديم نماذج بمستوى الإنتاج مع الإصدار، والتجميع، والتسريع بالعتاد
- TensorFlow Lite — بيئة تشغيل مُحسَّنة للأجهزة المحمولة وأجهزة الحدود (edge)
- TensorFlow.js — تشغيل النماذج مباشرة في المتصفح
هذا الاتّساع هو أعظم قوة لـTensorFlow. يمكنك بناء نموذج أولي في دفتر Jupyter بواسطة Keras، وتدريبه على مجموعة GPU، ورصد التدريب بواسطة TensorBoard، وتقديمه بواسطة TF Serving خلف واجهة برمجية (API)، ونشر نسخة مضغوطة على Raspberry Pi — كل ذلك داخل الإطار نفسه. بالنسبة للتطبيقات المالية حيث قد تحتاج نماذج تعمل في محرّك تداول سحابي (متصل بواجهة برمجية GaiaEx) وعلى محطة عمل محلية للبحث، هذه المرونة مهمّة.
Keras: واجهتا Sequential وFunctional لبناء النماذج
صُمِّم Keras بمبدأ توجيهي واحد: تقليل الحمل الذهني لبناء الشبكات العصبية. يحقّق ذلك من خلال واجهتَي بناء نماذج، كل واحدة مناسبة لمستوى تعقيد مختلف.
واجهة Sequential هي الأبسط — رصّة خطية من الطبقات:
import tensorflow as tf
from tensorflow import keras
model = keras.Sequential([
keras.layers.Dense(128, activation="relu", input_shape=(20,)),
keras.layers.Dropout(0.3),
keras.layers.Dense(64, activation="relu"),
keras.layers.Dropout(0.2),
keras.layers.Dense(1, activation="sigmoid"),
])
للنماذج ذات المدخلات المتعددة، أو المخرجات المتعددة، أو الطبقات المشتركة، أو روابط التخطّي، تمنحك واجهة Functional تحكّمًا كاملًا على مستوى الرسم البياني:
price_input = keras.Input(shape=(60, 5), name="price_sequence")
meta_input = keras.Input(shape=(10,), name="metadata")
x = keras.layers.LSTM(64, return_sequences=True)(price_input)
x = keras.layers.LSTM(32)(x)
combined = keras.layers.concatenate([x, meta_input])
combined = keras.layers.Dense(64, activation="relu")(combined)
output = keras.layers.Dense(1, activation="sigmoid")(combined)
model = keras.Model(inputs=[price_input, meta_input],
outputs=output)
يأخذ هذا النموذج مدخلَين — سلسلة سعر 60 خطوة تعالجها طبقات LSTM المكدّسة، ومتّجه بيانات وصفية من ميزات ثابتة — يجمعهما، ويُخرِج تنبؤًا اتجاهيًا. هذه البنية شائعة في التعلّم الآلي المالي حيث تريد مزج أنماط زمنية (حركة سعر أخيرة) مع معلومات سياقية (نظام التقلب، معدل التمويل، يوم الأسبوع).
أنواع الطبقات الأساسية للتطبيقات المالية: Dense للميزات الجدولية، LSTM وGRU للسلاسل الزمنية، Conv1D لتعلّم الأنماط الزمنية المحلية، وMultiHeadAttention لنمذجة السلاسل بأسلوب المحوِّل (transformer).
تجميع النماذج والاستدعاءات الخلفية للتدريب الأذكى
بعد البناء، يجب تجميع نموذج Keras بثلاثة مكوّنات: مُحسِّن، ودالة خسارة، ومقاييس تقييم.
model.compile(
optimizer=keras.optimizers.Adam(learning_rate=1e-3),
loss="binary_crossentropy",
metrics=["accuracy", keras.metrics.AUC(name="auc")],
)
history = model.fit(
X_train, y_train,
epochs=100,
batch_size=64,
validation_data=(X_val, y_val),
callbacks=[...],
)
الاستدعاءات الخلفية (Callbacks) هي نقاط ربط تُنفَّذ في لحظات محدَّدة خلال التدريب — بعد كل عهد، أو دفعة، أو عندما تُستوفى شروط معيّنة. تُؤتمِت إدارة تدريب كانت ستتطلب رصدًا يدويًا:
- EarlyStopping — يوقف التدريب عندما تتوقف خسارة التحقق عن التحسّن لعدد عهود يحدّده
patience. يمنع فرط التخصيص ويوفّر حوسبة مهدورة. اضبطrestore_best_weights=Trueللعودة تلقائيًا إلى أفضل نقطة تفتيش. - ModelCheckpoint — يحفظ النموذج كل مرة يتحسّن فيها أداء التحقق. لا تخسر أبدًا أفضل نموذج لديك بسبب تعطّل تدريب أو فرط تخصيص في عهود لاحقة.
- ReduceLROnPlateau — يخفّض معدل التعلّم عندما تصل خسارة التحقق إلى هضبة. هذا غالبًا يفتح أداءً إضافيًا يفوّته معدل تعلّم ثابت — يخطو النموذج خطوات كبيرة في البداية، ثم يضبط بدقة بخطوات أصغر.
callbacks = [
keras.callbacks.EarlyStopping(
monitor="val_loss", patience=15,
restore_best_weights=True),
keras.callbacks.ModelCheckpoint(
"best_model.keras", monitor="val_auc",
mode="max", save_best_only=True),
keras.callbacks.ReduceLROnPlateau(
monitor="val_loss", factor=0.5,
patience=5, min_lr=1e-6),
keras.callbacks.TensorBoard(log_dir="./logs"),
]
استخدم دائمًا EarlyStopping وModelCheckpoint معًا. تدريب نموذج مالي لعهود كثيرة جدًا يضمن تقريبًا فرط التخصيص — يبدأ النموذج بحفظ التشويش في بيانات التدريب. تضمن هاتان الاستدعاءتان توقّفك في الوقت الصحيح واحتفاظك بالأوزان الصحيحة.
TensorBoard: تصوير التدريب وتصحيح النماذج
TensorBoard هو أدوات تصوير TensorFlow، وهو من أقيم الأدوات في مسار عمل أي ممارس تعلّم آلي — سواء استخدمت TensorFlow أو PyTorch أو JAX. يحوّل سجلات التدريب الخام إلى لوحات تحكّم تفاعلية تكشف ما يحدث داخل نموذجك.
شغِّل TensorBoard بتوجيهه إلى مجلد سجلاتك:
# في الطرفية
tensorboard --logdir=./logs --port=6006
# أو في دفتر Jupyter
%load_ext tensorboard
%tensorboard --logdir ./logs
التصويرات الأساسية لتطوير النماذج المالية:
Scalars — منحنيات خسارة التدريب والتحقق مرسومة عبر الزمن. الفجوة بينهما تكشف فرط التخصيص: خسارة تدريب مستمرة بالانخفاض بينما ترتفع خسارة التحقق تعني أن نموذجك يحفظ التشويش. التدريب الصحي يُظهر كلا المنحنيَين ينخفضان معًا، مع منحنى التحقق أعلى قليلًا من التدريب.
Histograms — توزيعات الأوزان والانحيازات والتفعيلات عبر الطبقات والعهود. راقب انهيار توزيعات الأوزان إلى الصفر (تدرّجات متلاشية)، أو انفجارها إلى قيم كبيرة (تدريب غير مستقر)، أو تشبّع التفعيلات عند 0 أو 1 (خلايا عصبية ميتة). هذه المشاكل غير مرئية في منحنيات الخسارة لكنها واضحة في المدرّجات التكرارية.
Embeddings — عرض تمثيلات عالية الأبعاد في فضاء ثنائي أو ثلاثي الأبعاد باستخدام t-SNE أو PCA. صوّر إن كان نموذجك قد تعلّم فصل أنظمة سوق مختلفة، أو فئات أصول، أو حالات تقلب في تمثيلاته الداخلية.
HParams — مقارنة عمليات تجريب معاملات فائقة عبر التجارب. شغّل النموذج نفسه بمعدلات تعلّم مختلفة، وبنى مختلفة، وقيم تسرّب مختلفة، ثم حدّد أي مجموعة تُنتج أفضل مقاييس تحقق. هذه المقارنة المنهجية تستبدل التجريب العشوائي باختيار نماذج مبني على الأدلة.
يعمل TensorBoard أيضًا مع PyTorch عبر صنف torch.utils.tensorboard.SummaryWriter — أدوات التصوير مستقلة عن الإطار، وهذا أحد أسباب أن TensorBoard أصبح معيارًا فعليًا عبر منظومة التعلّم الآلي.
أنابيب tf.data وTensorFlow Serving للإنتاج
عندما تكون مجموعة بياناتك كبيرة جدًا بحيث لا تناسب الذاكرة — وضع شائع عند العمل مع بيانات على مستوى التداولات من بورصات مثل GaiaEx — يوفّر tf.data أنبوب بيانات فعّالًا وموازيًا يحافظ على تشغيل GPU دون تحميل كل شيء دفعة واحدة.
dataset = tf.data.Dataset.from_tensor_slices((features, labels))
dataset = (dataset
.window(60, shift=1, drop_remainder=True)
.flat_map(lambda w: w.batch(60))
.batch(64)
.prefetch(tf.data.AUTOTUNE)
)
استدعاء prefetch(AUTOTUNE) حاسم — يسمح بتحميل البيانات وحساب النموذج بالتداخل، حتى لا يظل GPU خاملًا في انتظار الدفعة التالية. لمجموعات البيانات المالية بهندسة ميزات معقّدة، تستطيع تسلسل تحويلات .map() تعمل بالتوازي، تحسب المؤشرات والتسويات لحظيًا بدلًا من حسابها وحفظها سابقًا.
TensorFlow Serving نظام بمستوى الإنتاج لنشر النماذج خلف واجهة برمجية gRPC أو REST عالية الأداء. يتعامل مع إصدار النماذج (تقديم النموذج الجديد مع الاحتفاظ بالقديم كخطة بديلة)، وتجميع الطلبات (دمج طلبات استدلال متعددة لكفاءة GPU)، والتسريع بالعتاد — كل ذلك حاسم لأنظمة التداول حيث تهم زمن الاستجابة والموثوقية معًا.
# تصدير SavedModel
model.save("models/price_predictor/1")
# التقديم بواسطة Docker
# docker run -p 8501:8501 \
# --mount type=bind,source=$(pwd)/models,target=/models \
# -e MODEL_NAME=price_predictor \
# tensorflow/serving
بنية إنتاج نموذجية: يتصل روبوت تداولك بتغذية WebSocket الخاصة بـGaiaEx، يحسب الميزات في الزمن الحقيقي، يرسل طلبات استدلال إلى TF Serving، ويستقبل تنبّؤات في ميلي ثوانٍ رقمية أحادية. عندما تعيد التدريب على بيانات جديدة، تنشر النموذج المُحدَّث كنسخة 2 — يبدّله TF Serving فورًا بلا توقّف.
TensorFlow Lite، النشر على أجهزة الحدود، وTF مقابل PyTorch
يضغط TensorFlow Lite النماذج للنشر على الأجهزة المحمولة، والأنظمة المدمجة، وعتاد الحدود (edge). من خلال تقنيات مثل التكميم (تحويل أوزان النقطة العائمة 32-بت إلى أعداد صحيحة 8-بت)، والتقليم (إزالة الأوزان شبه الصفرية)، وتحسين البنية، يستطيع TF Lite تصغير نموذج بمقدار 4× أو أكثر مع الحفاظ على أغلب دقته. هذا يمكِّن تشغيل الاستدلال مباشرة على أجهزة بحوسبة محدودة — مفيد لعقد تداول على الحدود أو لوحات مراقبة تحتاج للعمل بشكل مستقل عن البنية التحتية السحابية.
# تحويل نموذج Keras إلى TF Lite
converter = tf.lite.TFLiteConverter.from_saved_model("models/v1")
converter.optimizations = [tf.lite.Optimize.DEFAULT]
tflite_model = converter.convert()
with open("model.tflite", "wb") as f:
f.write(tflite_model)
TensorFlow مقابل PyTorch — أيّهما ينبغي أن تختار للتطبيقات المالية؟
- للبحث والنماذج الأولية: PyTorch. رسومه البيانية الديناميكية، وواجهته البرمجية على طريقة Python، وموقعه المهيمن في البحث الأكاديمي تعني أن مزيدًا من الأبحاث تحوي كود PyTorch، ومزيدًا من الدروس التعليمية تستخدم PyTorch، والتصحيح أكثر بديهية.
- لنشر الإنتاج على نطاق واسع: يظل TensorFlow يحتفظ بميزات. TF Serving وTF Lite وTensorFlow.js توفّر مسارات نشر مُختبَرة في المعارك بينما لا يزال TorchServe وONNX Runtime الخاصان بـPyTorch في طور النضوج نحوها.
- للتعلّم الآلي المالي على وجه التحديد: ابدأ بـPyTorch لتطوير النموذج والتجريب. إذا تطلبت متطلبات إنتاجك نضج TF Serving أو نشر TF Lite على الحدود، حوّل أفضل نماذجك. تستخدم فرق كثيرة PyTorch للبحث وTensorFlow للنشر، جاسرة بينهما عبر صيغة ONNX (Open Neural Network Exchange).
الحقيقة الصادقة: الإطاران يتقاربان. تبنّى TensorFlow التنفيذ الفوري (eager execution)؛ أضاف PyTorch torch.compile للتحسين على مستوى الرسم البياني. يدعم Keras نفسه الآن PyTorch وJAX وTensorFlow كخلفيات. أفضل إطار هو الذي يعرفه فريقك جيدًا ويستطيع شحن كود إنتاج به. اختر واحدًا، أتقنه، وحلّ المشكلة الفعلية — التنبؤ بالأسواق — بدلًا من مناقشة الأدوات.