البرمجة

حل مشكلة التحذير: تفسير invalid value encountered in log في دالة Cross-Entropy باستخدام Python

عند تنفيذ الكود الخاص بك، يظهر تحذير يشير إلى “invalid value encountered in log”، وهو تحذير يتم إصداره عند محاولة حساب لوغاريتم القيمة الصفرية أو السالبة. في هذا السياق، يحدث هذا الخطأ عندما يكون الوسط (argument) الذي يتم إرساله إلى دالة اللوغاريتم في بعض الحالات خارج نطاق القيم المسموح به.

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

python
np.sum(np.nan_to_num(-y*np.log(a+ 1e-7)-(1-y)*np.log(1-a+ 1e-7)))

حيث يتم استخدام np.nan_to_num لتحويل أي NaNs إلى أصفار. السبب وراء إضافة 1e-7 إلى القيم داخل اللوغاريتم هو تجنب القيم الصفرية التي قد تؤدي إلى تعطيل عملية اللوغاريتم.

تظهر المشكلة عندما تكون القيمة داخل اللوغاريتم سالبة أو تساوي صفر، وهذا يحدث عندما تكون قيمة a في المجموعة (0, 1) بحيث تكون 1 - a أو a تساوي صفر. في هذه الحالة، سيكون لديك تكرار لوغاريتم لقيمة سالبة أو صفر.

لتجنب هذا التحذير، يمكنك تحسين الكود بالتأكد من أن قيم a و (1-a) داخل اللوغاريتم تكون في نطاق صالح. يمكنك استخدام np.clip لتأمين القيم في النطاق المسموح به، على سبيل المثال:

python
log = np.sum(np.nan_to_num(-y*np.log(np.clip(a, 1e-10, 1-1e-10)) - (1-y)*np.log(np.clip(1-a, 1e-10, 1-1e-10))))

هذا يضمن أن القيم داخل اللوغاريتم لن تكون أقل من 1e-10 أو أكبر من 1-1e-10، مما يمنع القيم الصفرية أو السالبة.

المزيد من المعلومات

بهدف فهم المشكلة بعمق، يمكننا النظر في بنية ومفهوم الدالة التكلفة Cross-Entropy وكيف يتم حسابها في هذا السياق.

دالة التكلفة Cross-Entropy هي واحدة من الدوال الشائعة المستخدمة في تقييم أداء نماذج التصنيف، خاصةً في حالات تصنيف الفئات الثنائية. الصيغة العامة لل Cross-Entropy تكون كالتالي:

J(y,a)=1mi=1m(yilog(ai)+(1yi)log(1ai))J(y, a) = – \frac{1}{m} \sum_{i=1}^{m} \left( y_i \log(a_i) + (1 – y_i) \log(1 – a_i) \right)

حيث:

  • mm هو عدد النقاط في البيانات.
  • yiy_i هو القيمة الحقيقية للفئة للنقطة ii.
  • aia_i هو القيمة المتوقعة (الإخراج النموذج) للنقطة ii.

التعبير الذي قدمه المستخدم هو مشتق من هذه الصيغة، وقد أضاف 1e-7 داخل اللوغاريتم لتجنب مشكلة القيم الصفرية. ومع ذلك، قد يحدث تحذير “invalid value encountered in log” عندما تكون القيمة داخل اللوغاريتم سالبة أو NaN.

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

زر الذهاب إلى الأعلى