اذهب إلى المحتوى

السؤال

نشر (معدل)

السلام عليكم،
لدي مسألة احاول فيها التنبؤ بالطول الموجي للحركة الزلزالية عند 19 تردد (مثلا كم سيكون طول الموجة عند تردد 0.1, 0.3, 0.5, 0.85, 1...,24 hz) ولدي اربع مدخلات ثلاث منها عددية (قوة الزلزال، المسافة، معامل التربة في الموقع) استُخدم عليها ال (standardization) Standard Scalar والرابع يصف الشرخ الزلزالي وتمت معالجته عن طريق OneHotEcndoer.
هناك ما يقارب 150 زلزال مسجل في قاعدة البيانات وكل زلزال تم رصده على الاقل من 3 مواقع (بعضها اكثر من 3 بكثير) فقمت بتقسيم البيانات بناء على الزلزال وليس على التسجيلات لمنع التسريب الى ثلاث مجموعات 70% تدريب والباقي مناصفة بين الاختبار والتصديق.
ولضمان عدم تأثير حالة خاصة او العدد الكبير لسجلات زلزال معين على جميع الزلازل (فمثلا قد يمتلك زلزال 50 سجل فيؤثر اكثر على قيمة الخسارة بشكل اكبر او قد يمتلك ظاهرة خاصة بسبب نوعية التربة فتؤثر على القيمة الخسارة) تم تعديل دالة الخسارة واضافة شرطين معنيين بقيمة الخسارة.

في البداية MSE اساسي من الشبكة العصبية، الشرط الاول على مستوى الحدث الزلزالي حيث نحسب متوسط الخطأ للتسجيلات التابعة لنفس الزلزال، والثاني على مستوى التسجيل نفسه نحسب متوسط الخطأ عبر قيمة طول الموجة عند 19 تردد.

بالنسبة للشبكة العصبية فهي موضحة ادناه

def build_tunable_model(hp):
    inputs = keras.Input(shape=(INPUT_DIM,))
    x = inputs
    
    num_layers = hp.Int('num_layers',1, 2, 😎
    unit_choices = sorted(set([
    INPUT_DIM,
    8, 16, 32, 64, 128, 256, 512
]))
    for i in range(num_layers):
        units = hp.Choice(f"units_{i}", values=unit_choices)
        activation = hp.Choice(f'activation_{i}', ['gelu','elu','relu','tanh'])
        l2 = hp.Float("l2", 1e-7, 1e-3, sampling="log")
        
        x = layers.Dense(units, activation=activation, 
                         kernel_regularizer=keras.regularizers.l2(l2))(x)
        
        dropout_rate = hp.Float(f'dropout_{i}', 0.0, 0.4, step=0.1)
        if dropout_rate > 0:
            x = layers.Dropout(dropout_rate)(x)

    # Output Layer: 19 Neurons (one per frequency bin)
    outputs = layers.Dense(OUTPUT_DIM, activation='linear')(x)
    
    model = keras.Model(inputs, outputs)
    
    lr = hp.Float('learning_rate', 1e-4, 1e-2, sampling='log')
    a_event = hp.Float('alpha_event', 1e-3, 1.0, sampling='log')
    a_record = hp.Float('alpha_record', 1e-3, 1.0, sampling='log')
    
    model.compile(
        optimizer=keras.optimizers.Adam(learning_rate=lr),
        loss=vector_mixed_effects_loss(alpha_event=a_event, alpha_record=a_record, n_targets=OUTPUT_DIM),
        metrics=[unpacked_mae]
    )
    return model

الشبكة في النهاية تكون مكونة من طبقة مخفية واحدة من 128
المشكلة تكمن انه عند رسم قيم التنبؤ مقابل القيم الحقيقية لعينة الاختبار، يظهر جليا ان الشبكة غير قادرة على التنبؤ بالقيم الاعلى من موجب وسالب 2 على المقياس اللوجارثمي خصوصا عند الترددات المنخفضة مثل 0.1، ولا استطيع ايجاد سبب لذلك.

yil2zbyil2zbyil2.png

all0.png

 

all.png

تم التعديل في بواسطة عبدالرحمن_

Recommended Posts

  • 0
نشر

قم بتجربة تعديل دالة الخسارة لتقليل الانحياز نحو المتوسط، باستبدال MSE بـ Huber Loss أو Log-Cosh لأنها أقل حساسية للقيم المتطرفة، وتسمح للنموذج بأن يخطئ أكثر في القيم الكبيرة دون أن تفرض عقوبة كبيرة تشوه التدرج.

وتدريب النموذج ليتنبأ بعدة كميات مثلاً 10%، 50%، 90%، مما يعطي فكرة عن عدم اليقين ويجبر النموذج على تغطية الأطراف، وأضف وزناً أكبر لعينات التدريب التي لها قيمة EAS مطلقة عالية أي أكبر من 1.5 من خلال تمرير sample_weight أثناء التدريب.

وبدلاً من 19 خرج منفصل، اجعل التردد متغير إدخال إضافي بعد ترميزه log10(Hz) أو ترميز دوري، وليكن لديك خرج واحد فقط هو log10(EAS)، فكل سجل زلزالي سيمثل 19 عينة تدريب بدلاً من واحدة، ذاك يضاعف حجم البيانات 19 مرة، ويسمح للنموذج بتعلم دالة مستمرة للطيف، ويستفيد من التداخل بين الترددات، لتجنب تسرب الحدث، ولا تزال تقسّم على مستوى الزلزال أي جميع نقاط تردد تسجيل معين تذهب معاً إلى نفس المجموعة، وذاك التصميم أثبت فعاليته في نماذج GMPEs العصبية مثل نموذج ESM-net ونحوه.

وجرّب طبقتين أو ثلاث، وابدأ بعدد وحدات أكبر 64 > 128 > 256 واستخدم تنظيم BatchNormalization بدلاً من dropout المفرط، وجرب LeakyReLU أو GELU كدوال تفعيل.

كذلك الدالة الخطية في طبقة الخرج جيدة، لكن تأكد أن التحيز bias لا يمنع الوصول إلى قيم بعيدة. يمكن إزالة bias من الطبقة الأخيرة لتجنب الحد من المدى، أو استخدام tf.keras.layers.Rescaling لضبط المقياس.

 

  • 0
نشر

إن مشكلتك واضحة وشائعة جدا في نماذج التعلم الآلي المطبقة على علوم الزلازل (Seismology). والظاهرة التي تصفها تعرف بالانحدار نحو المتوسط (Regression to the Mean) أى بعبارة أخرى يفضل النموذج التنبؤ بقيم قريبة من المتوسط لتقليل الخسارة الكلية (MSE) لأنه يخشى المخاطرة بتوقع قيم متطرفة قد تكلفه خطأً كبيرا خصوصاً مع البيانات القليلة.

وهناك عدة عوامل في تصميمك تنتج هذه المشكلة وإليك التوضيح التالي.

لماذا يعجز النموذج عن التنبؤ بالقيم المتطرفة :

  • تأثير دالة الخسارة (Mixed Effects Loss): الشرطين اللذين أضفتهما متوسط خطأ الحدث الزلزالي ومتوسط خطأ السجل عبر الترددات فكرتهما ممتازة لمنع سيطرة زلزال معين على الخسارة ولكنهما رياضيا يعملان كعامل تنظيم (Regularizer) قوي جدا. وحساب المتوسطات يجبر النموذج على تقريب التنبؤات لتناسب النمط العام للزلزال، مما يلغي القيم المتطرفة (Peaks) التي تحدث عند ترددات معينة مثل 0.1 هرتز.
  • ندرة البيانات (Data Sparsity): قاعدة بيانات من 150 زلزال تعتبر صغيرة جدا في سياق التعلم العميق. والقيم التي تتجاوز +2 أو تقل عن -2 على المقياس اللوغاريتمي هي على الأرجح حالات نادرة (Outliers) في بياناتك ودالة الخسارة MSE تعطي وزنا أكبر للأغلبية فيتجاهل النموذج هذه الحالات النادرة لتحسين أدائه على الـ 95% الباقية من البيانات.
  • نقص السعة النموذجية (Model Capacity): الشبكة التي استقر عليها ال Tuner تتكون من طبقة مخفية واحدة 128 عصبون. والترددات المنخفضة في الزلازل (مثل 0.1 هرتز) تمثل موجات طويلة (Long-period waves) تتأثر بعوامل فيزيائية شديدة التعقيد والتداخل. وطبقة واحدة غالبا غير قادرة على استخراج العلاقات غير الخطية العميقة بين المدخلات الأربعة للتنبؤ بهذه الموجات.

وإليك الحلول العملية :

  • إعطاء وزن أكبر للقيم المتطرفة (Sample Weighting) :

أفضل طريقة لإجبار النموذج على الانتباه للقيم الأكبر من 2+ والأقل من 2- هي استخدام أوزان العينات يمكنك تعديل دالة الخسارة لتعاقب النموذج بشكل مضاعف عندما يخطئ في القيم المتطرفة.

  • تخفيف قيود دالة الخسارة (Tuning the Loss) :

في أداة ضبط المعاملات (Keras Tuner) أنت تسمح لقيم alpha_event و alpha_record بالوصول إلى 1.0 وهذه القيم قد تكون مرتفعة جداً وتسبب إخفاء التفاصيل (Over-smoothing).

  • إجبار الشبكة على زيادة العمق :

طبقة واحدة غير كافية لنمذجة 19 مخرج معقد لهذا قم بتعديل مساحة البحث (Search Space) لتجبر النموذج على استخدام طبقتين على الأقل لاستخراج الميزات المعقدة.

  • تطبيق Standardization على المخرجات (Targets) :

إذا كانت قيم الأطوال الموجية تتفاوت بشكل كبير بين تردد 0.1 وتردد 24 فيجب تطبيق StandardScaler على المتغيرات المستهدفة (y) قبل التدريب ثم عكس التحويل (Inverse Transform) بعد التنبؤ وهذا يضمن أن الشبكة العصبية لا تعاني من تفاوت المقاييس أثناء حساب ال Gradients.

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...