<?xml version="1.0"?>
<rss version="2.0"><channel><title>&#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629;: &#x630;&#x643;&#x627;&#x621; &#x627;&#x635;&#x637;&#x646;&#x627;&#x639;&#x64A;</title><link>https://academy.hsoub.com/programming/artificial-intelligence/page/6/?d=2</link><description>&#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629;: &#x630;&#x643;&#x627;&#x621; &#x627;&#x635;&#x637;&#x646;&#x627;&#x639;&#x64A;</description><language>ar</language><item><title>&#x62F;&#x644;&#x64A;&#x644; &#x627;&#x644;&#x645;&#x628;&#x62A;&#x62F;&#x626;&#x64A;&#x646; &#x644;&#x641;&#x647;&#x645; &#x623;&#x633;&#x627;&#x633;&#x64A;&#x627;&#x62A; &#x627;&#x644;&#x62A;&#x639;&#x644;&#x645; &#x627;&#x644;&#x639;&#x645;&#x64A;&#x642;</title><link>https://academy.hsoub.com/programming/artificial-intelligence/%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D9%85%D8%A8%D8%AA%D8%AF%D8%A6%D9%8A%D9%86-%D9%84%D9%81%D9%87%D9%85-%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%B9%D9%85%D9%8A%D9%82-r1422/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2022_01/bitmap.png.c9adf89e3f9d3fb94e218e58278cdaf6.png" /></p>
<p>
	حققت برامج التعلم العميق و<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A-%D8%A3%D9%87%D9%85-%D8%A7%D9%84%D8%A5%D9%86%D8%AC%D8%A7%D8%B2%D8%A7%D8%AA-%D9%88%D8%A7%D9%84%D8%A7%D8%AE%D8%AA%D8%B1%D8%A7%D8%B9%D8%A7%D8%AA-%D9%88%D9%83%D9%8A%D9%81-%D8%A3%D8%AB%D8%B1%D8%AA-%D9%81%D9%8A-%D8%AD%D9%8A%D8%A7%D8%AA%D9%86%D8%A7-%D8%A7%D9%84%D9%8A%D9%88%D9%85%D9%8A%D8%A9-r975/" rel="">الذكاء</a><a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A-%D8%A3%D9%87%D9%85-%D8%A7%D9%84%D8%A5%D9%86%D8%AC%D8%A7%D8%B2%D8%A7%D8%AA-%D9%88%D8%A7%D9%84%D8%A7%D8%AE%D8%AA%D8%B1%D8%A7%D8%B9%D8%A7%D8%AA-%D9%88%D9%83%D9%8A%D9%81-%D8%A3%D8%AB%D8%B1%D8%AA-%D9%81%D9%8A-%D8%AD%D9%8A%D8%A7%D8%AA%D9%86%D8%A7-%D8%A7%D9%84%D9%8A%D9%88%D9%85%D9%8A%D8%A9-r975/" rel=""> </a><a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A/" rel="">الاصطناعي</a> نموًا متزايدًا في الآونة الأخيرة، إذ تشير الإحصاءات إلى أن القيمة السوقية لهذه التقنيات الحديثة قد تصل إلى<a href="https://datafloq.com/read/5-key-deep-learning-ai-challenges-in-2018/5400" rel="external nofollow"> </a><a href="https://datafloq.com/read/5-key-deep-learning-ai-challenges-in-2018/5400" rel="external nofollow">930 </a><a href="https://datafloq.com/read/5-key-deep-learning-ai-challenges-in-2018/5400" rel="external nofollow">مليون</a><a href="https://datafloq.com/read/5-key-deep-learning-ai-challenges-in-2018/5400" rel="external nofollow"> </a><a href="https://datafloq.com/read/5-key-deep-learning-ai-challenges-in-2018/5400" rel="external nofollow">دولار</a><a href="https://datafloq.com/read/5-key-deep-learning-ai-challenges-in-2018/5400" rel="external nofollow"> </a><a href="https://datafloq.com/read/5-key-deep-learning-ai-challenges-in-2018/5400" rel="external nofollow">بحلول</a><a href="https://datafloq.com/read/5-key-deep-learning-ai-challenges-in-2018/5400" rel="external nofollow"> </a><a href="https://datafloq.com/read/5-key-deep-learning-ai-challenges-in-2018/5400" rel="external nofollow">العام</a><a href="https://datafloq.com/read/5-key-deep-learning-ai-challenges-in-2018/5400" rel="external nofollow"> 2025</a><a href="https://datafloq.com/read/5-key-deep-learning-ai-challenges-in-2018/5400" rel="external nofollow">م</a>، كما ارتفع عدد الأعمال والوظائف التي تتطلب فهم مهارات الذكاء الاصطناعي بنسبة 450 % منذ تسع سنوات مضت. فما هو التعلم العميق Deep Leaning؟ وما هي تطبيقاته الأكثر استخدامًا في العالم؟
</p>

<p>
	إليك قائمة محتويات المقال:
</p>

<ul>
	<li>
		<a href="#%D9%85%D9%81%D9%87%D9%88%D9%85-%D8%A7%D9%84%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%B9%D9%85%D9%8A%D9%82" rel="">مفهوم التعلم العميق</a>
	</li>
	<li>
		<a href="#%D9%83%D9%8A%D9%81-%D9%8A%D8%B9%D9%85%D9%84-%D8%A7%D9%84%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%B9%D9%85%D9%8A%D9%82" rel="">كيف يعمل التعلم العميق؟</a>
	</li>
	<li>
		<a href="#%D8%A7%D9%84%D9%81%D8%B1%D9%82-%D8%A8%D9%8A%D9%86-%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9-%D9%88%D8%A7%D9%84%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%B9%D9%85%D9%8A%D9%82" rel="">الفرق بين تعلم الآلة والتعلم العميق</a>
	</li>
	<li>
		<a href="#%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%B9%D9%85%D9%8A%D9%82" rel="">تطبيقات التعلم العميق</a>
		<ul>
			<li>
				الرعاية الصحية
			</li>
			<li>
				التعلم العميق في التسويق الإلكتروني
			</li>
			<li>
				البحث الصوتي والمرئي والدردشة الآلية
			</li>
			<li>
				التعلم العميق في التعليم
			</li>
			<li>
				عالم الترفيه
			</li>
			<li>
				تقصى الحقائق وكشف الأخبار المزيفة
			</li>
			<li>
				السيارات ذاتية القيادة
			</li>
			<li>
				الأرصاد والمناخ
			</li>
		</ul>
	</li>
	<li>
		<a href="#%D8%AA%D8%AD%D8%AF%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%B9%D9%85%D9%8A%D9%82" rel="">تحديات التعلم العميق</a>
		<ul>
			<li>
				الجودة الضعيفة للبيانات
			</li>
			<li>
				خداع التعلم العميق
			</li>
			<li>
				عدم فهم السياق جيدًا
			</li>
			<li>
				ضغوط على المؤسسات
			</li>
			<li>
				قرصنة التعلم العميق
			</li>
		</ul>
	</li>
</ul>

<h2 id="مفهوم-التعلم-العميق">
	مفهوم التعلم العميق
</h2>

<p>
	التعلم العميق Deep Learning هو فئة فرعية من تعلم الآلة Machine Learning الذي يعتمد على الشبكات العصبية الاصطناعية إلى جانب التعلم التمثيلي. لذلك، فإنه عبارة عن تقنية حاسوبية تحاكي العقل البشري من خلال تصميم خوارزميات مستوحاة من بنية القشرة الدماغية ووظيفتها حتى يمكنها تقليد جميع قدرات الدماغ مثل فهم اللغة الطبيعية والأصوات ومحتوى الصور والقدرة على تنفيذ العديد من الأوامر والتعليمات كما يفعل الإنسان.
</p>

<p>
	ويعد التعلم العميق من العلامات الفارقة المميزة في العصر الحديث، فقد نجح العلماء في إنشاء شبكات البرسبترون العصبونية Perceptron القائمة على فكرة وظائف الشبكات العصبية Neural network، فهو يتضمن بناء شبكات عصبية قادرة على معالجة البيانات المعقدة بدرجة أكثر شمولًا وتركيزًا من تقنيات الذكاء الاصطناعي الأخرى.
</p>

<h2 id="كيف-يعمل-التعلم-العميق">
	كيف يعمل التعلم العميق؟
</h2>

<p>
	استطاع العلماء دراسة العقل البشري وكيفية عمل الأدمغة التي تحتوي على مليارات الخلايا العصبية المتشابكة معًا، وذلك بهدف إنشاء نموذج محاكاة من هذه الخلايا العصبية القادرة على تصفية المعلومات وتصنيفها ومعالجتها كما يحدث في دماغ الإنسان، ومن هنا جاءت فكرة إنشاء خوارزميات التعلم العميق. ويطلق عليه التعلم العميق لأنه يستخدم الشبكة العصبية الاصطناعية العميقة.
</p>

<p>
	وهذه الشبكة الاصطناعية تحتوي على خلايا عصبية تضم مجموعة من الطبقات المتصلة والمتراكمة فوق بعضها بعضًا، التي تبدأ بطبقة الإدخال المستوحاة من حواس الإنسان وتستقبل إشارات البيانات والمعلومات وتنتهي بطبقة الإخراج التي تظهر النتيجة النهائية للمعلومات، وبين هاتين الطبقتين توجد طبقات مخفية تكون مسؤولة عن تحليل البيانات للوصول إلى الاستنتاجات قبل استخراجها على هيئة معلومات مفيدة.
</p>

<p>
	وكل طبقة في الشبكات العصبية العميقة Deep Neural Networks تكون مسؤولة عن التقاط أنماط معينة من البيانات أو معلومات محددة ومعالجتها باستخدام خوارزميات التعلم العميق. ويطلق على الخلية العصبية في هذه الشبكة اسم (عصبون) وكل خلية لها وزن يحدد أهمية كل عنصر على حدة، إضافة إلى إمكانية تعديل الأوزان أكثر من مرة لضمان الحصول على نتائج دقيقة في نهاية المطاف. وبذلك يمكن لخاصية التعلم العميق معالجة كمية هائلة من البيانات.
</p>

<p>
	وتعد <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D9%84%D9%85%D9%81%D8%A7%D9%87%D9%8A%D9%85-%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A9-%D9%84%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9-r1009/" rel="">الشبكات العصبية التلافيفية</a> Convolutional Neural Network التي تعرف اختصارًا CNN، من أبرز الشبكات العصبية العميقة المستخدمة في التعلم العميق، فإنها تشتمل على طبقات متعددة ذات بنية استثنائية بهدف معالجة بيانات غير منظمة غالبًا مثل الصور للتنبؤ بما فيها وقراءتها ومعرفة الميزات الفريدة بها.
</p>

<h2 id="ما-الفرق-بين-تعلم-الآلة-والتعلم-العميق">
	ما الفرق بين تعلم الآلة والتعلم العميق؟
</h2>

<p>
	يظن الكثيرون من غير المتخصصين أن التعلم العميق وتعلم الآلة والذكاء الاصطناعي مفاهيم مترادفة وتُستخدم لتنفيذ الوظائف التقنية ذاتها، لكن الحقيقة عكس ذلك، لأن تعلم الآلة Machine Learning أحد فروع الذكاء الاصطناعي Artificial Intelligence، وأعم وأشمل من التعلم العميق Deep learning.
</p>

<p>
	ببساطة، يركز تعلم الآلة عمومًا على جعل الأجهزة الحاسوبية لديها القدرة على أداء المهام دون الحاجة إلى برمجة واضحة استنادًا إلى خوارزميات أكثر بساطة كتلك التي تعتمد على التوقع الخطي أو شجرة القرارات، أما التعلم العميق يستوجب إنشاء خوارزميات أكثر تعقيدًا وذات مستويات مختلفة مثل الشبكات العصبية الاصطناعية ANNs والشبكات العصبية التلافيفية CNN.
</p>

<p>
	كما أن خوارزميات التعلم الآلي يمكن تغذيتها ببيانات منظمة من أجل تحليلها والوصول إلى استنتاجات مفهومة، أما التعلم العميق يحتاج إلى بيانات غير منظمة وأنماط معقدة مثل النصوص المكتوبة والصور ومقاطع الفيديو والأصوات واللغات.
</p>

<p>
	كذلك، يتطلب التعلم العميق تدخلًا بشريًا أقل من تعلم الآلة، لكنه يحتاج إلى قوة حاسوبية وطاقة كبير للغاية من أجل المشكلات الأكثر تعقيدًا ومعالجة البيانات الضخمة باستخدام أجهزة وتقنيات معينة، على عكس تعلم الآلة الذي يتطلب كمية أقل من البيانات وقوة حاسوبية أقل أيضًا.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="88041" href="https://academy.hsoub.com/uploads/monthly_2022_01/61d59c341ecbe_The-Difference-between-Artificial-Intelligence-Machine-learning-and-deep-learning.png.d7c674f9daad60aa6288f9c314675f97.png" rel=""><img alt="The-Difference-between-Artificial-Intelligence,-Machine-learning-and-deep-learning.png" class="ipsImage ipsImage_thumbnailed" data-fileid="88041" style="width: 550px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2022_01/61d59c38cb60c_The-Difference-between-Artificial-Intelligence-Machine-learning-and-deep-learning.thumb.png.8f0871c1015147a98100215367318a60.png"></a>
</p>

<h2 id="تطبيقات-التعلم-العميق">
	تطبيقات التعلم العميق
</h2>

<p>
	لا يقتصر استخدام تقنيات التعلم العميق على فهم الصور ومقاطع الفيديو فحسب، إنما يُستخدم على نطاق واسع في مجالات وقطاعات مختلفة، ونرى العديد من التطبيقات في حياتنا الراهنة خاصة مع تزايد حجم البيانات وبعدما أصبحت التكنولوجيا ميسورة التكلفة، فنلاحظ مثلًا أن النظام الأساسي في شبكة التواصل الاجتماعي "فيسبوك" لديه القدرة على معرفة أصدقائك وقراءة صورهم وتمييزها، وفيما يلي أهم تطبيقات التعلم العميق:
</p>

<h3>
	الرعاية الصحية
</h3>

<p>
	مع تطور الذكاء الاصطناعي، دخلت خوارزميات التعلم العميق في مجالات الطب والرعاية الصحية، ومكنت هذا القطاع من توفير القدرة على تحليل البيانات وفحصها بسرعة استثنائية، إضافة إلى دعم رعاية المرضى مع تقليل التكاليف وتحسين الكفاءات وتشخيص الأمراض. على سبيل المثال، تُستخدم أداة Aidoc في دعم الأطباء خاصة أنها تعتمد على خوارزميات تسرع تشخيص المريض وعلاجه مثل اكتشاف أماكن النزيف داخل الجمجمة والانسداد الرئوي، وغير ذلك.
</p>

<p>
	وبفضل خوارزميات التعلم العميق، نجح فريق بجامعة كاليفورنيا في عام 2016م، بتطوير تقنية تصور الخلايا في عينات الدم بسرعة كبيرة دون أن تؤثر سلبًا على هذه الخلايا والاستفادة منها في التحليلات المستقبلية الأخرى. كما تُستخدم الشبكات العصبية التلافيفية CNN في معرفة نتائج التصوير بالرنين المغناطيسي والأشعة السينية.
</p>

<p>
	وتوصلت دراسة -نُشرت نتائجها في المجلة العلمية Annals of Oncology- إلى أن خوارزميات الشبكات CNN قادرة على تحليل صور الأمراض الجلدية التي تحدد الإصابة بسرطان الجلد بدقة أكبر من الأطباء البشريين بنسبة 10%. لذلك أكد الفريق البحثي أن هذه الشبكات الاصطناعية تُعد أداة مناسبة للكشف عن سرطان الجلد.
</p>

<p>
	لا تقتصر تطبيقات التعلم العميق في القطاع الطبي على ذلك، بل شملت الدخول في عالم الطب الدقيق واكتشاف وتصنيع الأدوية والتنبؤ بالوفيات في المستشفيات. على سبيل المثال، طور فريق من جوجل بالتعاون مع جامعات أمريكية تقنية تعتمد على خوارزمية التعلم العميق ومعالجة اللغة الطبيعية التي حللت ما يزيد عن<a href="https://healthitanalytics.com/features/what-is-deep-learning-and-how-will-it-change-healthcare" rel="external nofollow"> </a><a href="https://healthitanalytics.com/features/what-is-deep-learning-and-how-will-it-change-healthcare" rel="external nofollow">46 </a><a href="https://healthitanalytics.com/features/what-is-deep-learning-and-how-will-it-change-healthcare" rel="external nofollow">مليار</a><a href="https://healthitanalytics.com/features/what-is-deep-learning-and-how-will-it-change-healthcare" rel="external nofollow"> </a><a href="https://healthitanalytics.com/features/what-is-deep-learning-and-how-will-it-change-healthcare" rel="external nofollow">نقطة</a><a href="https://healthitanalytics.com/features/what-is-deep-learning-and-how-will-it-change-healthcare" rel="external nofollow"> </a><a href="https://healthitanalytics.com/features/what-is-deep-learning-and-how-will-it-change-healthcare" rel="external nofollow">بيانات</a> في 216 ألف سجل صحي إلكتروني عبر مستشفيين. وساعدت هذه التقنية في التنبؤ بطول فترة إقامة المرضى واحتمالات الوفاة بينهم.
</p>

<h3>
	التعلم العميق في التسويق الإلكتروني
</h3>

<p>
	أصبح<a href="https://academy.hsoub.com/marketing/inbound-marketing/%D9%83%D9%8A%D9%81-%D9%8A%D9%85%D9%83%D9%86-%D9%84%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A-%D8%A3%D9%86-%D9%8A%D8%B4%D9%83%D9%84-%D9%85%D8%B3%D8%AA%D9%82%D8%A8%D9%84-%D8%AA%D8%B3%D9%88%D9%8A%D9%82-%D8%A7%D9%84%D9%85%D8%AD%D8%AA%D9%88%D9%89-r330/" rel=""> </a><a href="https://academy.hsoub.com/marketing/inbound-marketing/%D9%83%D9%8A%D9%81-%D9%8A%D9%85%D9%83%D9%86-%D9%84%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A-%D8%A3%D9%86-%D9%8A%D8%B4%D9%83%D9%84-%D9%85%D8%B3%D8%AA%D9%82%D8%A8%D9%84-%D8%AA%D8%B3%D9%88%D9%8A%D9%82-%D8%A7%D9%84%D9%85%D8%AD%D8%AA%D9%88%D9%89-r330/" rel="">التعلم</a><a href="https://academy.hsoub.com/marketing/inbound-marketing/%D9%83%D9%8A%D9%81-%D9%8A%D9%85%D9%83%D9%86-%D9%84%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A-%D8%A3%D9%86-%D9%8A%D8%B4%D9%83%D9%84-%D9%85%D8%B3%D8%AA%D9%82%D8%A8%D9%84-%D8%AA%D8%B3%D9%88%D9%8A%D9%82-%D8%A7%D9%84%D9%85%D8%AD%D8%AA%D9%88%D9%89-r330/" rel=""> </a><a href="https://academy.hsoub.com/marketing/inbound-marketing/%D9%83%D9%8A%D9%81-%D9%8A%D9%85%D9%83%D9%86-%D9%84%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A-%D8%A3%D9%86-%D9%8A%D8%B4%D9%83%D9%84-%D9%85%D8%B3%D8%AA%D9%82%D8%A8%D9%84-%D8%AA%D8%B3%D9%88%D9%8A%D9%82-%D8%A7%D9%84%D9%85%D8%AD%D8%AA%D9%88%D9%89-r330/" rel="">العميق</a><a href="https://academy.hsoub.com/marketing/inbound-marketing/%D9%83%D9%8A%D9%81-%D9%8A%D9%85%D9%83%D9%86-%D9%84%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A-%D8%A3%D9%86-%D9%8A%D8%B4%D9%83%D9%84-%D9%85%D8%B3%D8%AA%D9%82%D8%A8%D9%84-%D8%AA%D8%B3%D9%88%D9%8A%D9%82-%D8%A7%D9%84%D9%85%D8%AD%D8%AA%D9%88%D9%89-r330/" rel=""> </a><a href="https://academy.hsoub.com/marketing/inbound-marketing/%D9%83%D9%8A%D9%81-%D9%8A%D9%85%D9%83%D9%86-%D9%84%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A-%D8%A3%D9%86-%D9%8A%D8%B4%D9%83%D9%84-%D9%85%D8%B3%D8%AA%D9%82%D8%A8%D9%84-%D8%AA%D8%B3%D9%88%D9%8A%D9%82-%D8%A7%D9%84%D9%85%D8%AD%D8%AA%D9%88%D9%89-r330/" rel="">جزء</a><a href="https://academy.hsoub.com/marketing/inbound-marketing/%D9%83%D9%8A%D9%81-%D9%8A%D9%85%D9%83%D9%86-%D9%84%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A-%D8%A3%D9%86-%D9%8A%D8%B4%D9%83%D9%84-%D9%85%D8%B3%D8%AA%D9%82%D8%A8%D9%84-%D8%AA%D8%B3%D9%88%D9%8A%D9%82-%D8%A7%D9%84%D9%85%D8%AD%D8%AA%D9%88%D9%89-r330/" rel="">ً</a><a href="https://academy.hsoub.com/marketing/inbound-marketing/%D9%83%D9%8A%D9%81-%D9%8A%D9%85%D9%83%D9%86-%D9%84%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A-%D8%A3%D9%86-%D9%8A%D8%B4%D9%83%D9%84-%D9%85%D8%B3%D8%AA%D9%82%D8%A8%D9%84-%D8%AA%D8%B3%D9%88%D9%8A%D9%82-%D8%A7%D9%84%D9%85%D8%AD%D8%AA%D9%88%D9%89-r330/" rel="">ا</a><a href="https://academy.hsoub.com/marketing/inbound-marketing/%D9%83%D9%8A%D9%81-%D9%8A%D9%85%D9%83%D9%86-%D9%84%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A-%D8%A3%D9%86-%D9%8A%D8%B4%D9%83%D9%84-%D9%85%D8%B3%D8%AA%D9%82%D8%A8%D9%84-%D8%AA%D8%B3%D9%88%D9%8A%D9%82-%D8%A7%D9%84%D9%85%D8%AD%D8%AA%D9%88%D9%89-r330/" rel=""> </a><a href="https://academy.hsoub.com/marketing/inbound-marketing/%D9%83%D9%8A%D9%81-%D9%8A%D9%85%D9%83%D9%86-%D9%84%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A-%D8%A3%D9%86-%D9%8A%D8%B4%D9%83%D9%84-%D9%85%D8%B3%D8%AA%D9%82%D8%A8%D9%84-%D8%AA%D8%B3%D9%88%D9%8A%D9%82-%D8%A7%D9%84%D9%85%D8%AD%D8%AA%D9%88%D9%89-r330/" rel="">لا</a><a href="https://academy.hsoub.com/marketing/inbound-marketing/%D9%83%D9%8A%D9%81-%D9%8A%D9%85%D9%83%D9%86-%D9%84%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A-%D8%A3%D9%86-%D9%8A%D8%B4%D9%83%D9%84-%D9%85%D8%B3%D8%AA%D9%82%D8%A8%D9%84-%D8%AA%D8%B3%D9%88%D9%8A%D9%82-%D8%A7%D9%84%D9%85%D8%AD%D8%AA%D9%88%D9%89-r330/" rel=""> </a><a href="https://academy.hsoub.com/marketing/inbound-marketing/%D9%83%D9%8A%D9%81-%D9%8A%D9%85%D9%83%D9%86-%D9%84%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A-%D8%A3%D9%86-%D9%8A%D8%B4%D9%83%D9%84-%D9%85%D8%B3%D8%AA%D9%82%D8%A8%D9%84-%D8%AA%D8%B3%D9%88%D9%8A%D9%82-%D8%A7%D9%84%D9%85%D8%AD%D8%AA%D9%88%D9%89-r330/" rel="">يتجزأ</a><a href="https://academy.hsoub.com/marketing/inbound-marketing/%D9%83%D9%8A%D9%81-%D9%8A%D9%85%D9%83%D9%86-%D9%84%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A-%D8%A3%D9%86-%D9%8A%D8%B4%D9%83%D9%84-%D9%85%D8%B3%D8%AA%D9%82%D8%A8%D9%84-%D8%AA%D8%B3%D9%88%D9%8A%D9%82-%D8%A7%D9%84%D9%85%D8%AD%D8%AA%D9%88%D9%89-r330/" rel=""> </a><a href="https://academy.hsoub.com/marketing/inbound-marketing/%D9%83%D9%8A%D9%81-%D9%8A%D9%85%D9%83%D9%86-%D9%84%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A-%D8%A3%D9%86-%D9%8A%D8%B4%D9%83%D9%84-%D9%85%D8%B3%D8%AA%D9%82%D8%A8%D9%84-%D8%AA%D8%B3%D9%88%D9%8A%D9%82-%D8%A7%D9%84%D9%85%D8%AD%D8%AA%D9%88%D9%89-r330/" rel="">من</a><a href="https://academy.hsoub.com/marketing/inbound-marketing/%D9%83%D9%8A%D9%81-%D9%8A%D9%85%D9%83%D9%86-%D9%84%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A-%D8%A3%D9%86-%D9%8A%D8%B4%D9%83%D9%84-%D9%85%D8%B3%D8%AA%D9%82%D8%A8%D9%84-%D8%AA%D8%B3%D9%88%D9%8A%D9%82-%D8%A7%D9%84%D9%85%D8%AD%D8%AA%D9%88%D9%89-r330/" rel=""> </a><a href="https://academy.hsoub.com/marketing/inbound-marketing/%D9%83%D9%8A%D9%81-%D9%8A%D9%85%D9%83%D9%86-%D9%84%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A-%D8%A3%D9%86-%D9%8A%D8%B4%D9%83%D9%84-%D9%85%D8%B3%D8%AA%D9%82%D8%A8%D9%84-%D8%AA%D8%B3%D9%88%D9%8A%D9%82-%D8%A7%D9%84%D9%85%D8%AD%D8%AA%D9%88%D9%89-r330/" rel="">التسويق</a><a href="https://academy.hsoub.com/marketing/inbound-marketing/%D9%83%D9%8A%D9%81-%D9%8A%D9%85%D9%83%D9%86-%D9%84%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A-%D8%A3%D9%86-%D9%8A%D8%B4%D9%83%D9%84-%D9%85%D8%B3%D8%AA%D9%82%D8%A8%D9%84-%D8%AA%D8%B3%D9%88%D9%8A%D9%82-%D8%A7%D9%84%D9%85%D8%AD%D8%AA%D9%88%D9%89-r330/" rel=""> </a><a href="https://academy.hsoub.com/marketing/inbound-marketing/%D9%83%D9%8A%D9%81-%D9%8A%D9%85%D9%83%D9%86-%D9%84%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A-%D8%A3%D9%86-%D9%8A%D8%B4%D9%83%D9%84-%D9%85%D8%B3%D8%AA%D9%82%D8%A8%D9%84-%D8%AA%D8%B3%D9%88%D9%8A%D9%82-%D8%A7%D9%84%D9%85%D8%AD%D8%AA%D9%88%D9%89-r330/" rel="">الإلكتروني</a>، إذ سخرت قنوات التسويق الرقمي مثل فيسبوك قدرات التعلم العميق لتقديم أفضل تجربة للمتسوقين والمعلنين، وذلك من خلال استخدام تحليلات النص العميق Deep Text الذي يعالج اللغة بالذكاء الاصطناعي ويفهمها مثل البشر، إضافة إلى تصفية "موجز الأخبار" الخاص بالمستخدمين واكتشاف المحتوى الجديد وفهم النصوص المرغوب فيها وتجنب غيرها.
</p>

<p>
	وتشير الإحصائيات إلى أن أكثر من 51% من المسوقين يستثمرون تقنيات الذكاء الاصطناعي والتعلم العميق في حملات <a href="https://blog.khamsat.com/12-essential-skills-for-success-in-e-marketing/" rel="external">التسويق</a><a href="https://blog.khamsat.com/12-essential-skills-for-success-in-e-marketing/" rel="external"> </a><a href="https://blog.khamsat.com/12-essential-skills-for-success-in-e-marketing/" rel="external">الإلكتروني</a> للحصول على رؤى مستنيرة حول جمهورهم المستهدف في العام 2019، وفقا لما نقلته شبكة "<a href="https://www.businessinsider.com/ai-marketing-report-2018-3?r=US&amp;IR=T" rel="external nofollow">businessinsider</a>". بينما يرى<a href="https://www.marketingaiinstitute.com/2021-state-of-marketing-ai-report" rel="external nofollow"> </a><a href="https://www.marketingaiinstitute.com/2021-state-of-marketing-ai-report" rel="external nofollow">52% </a><a href="https://www.marketingaiinstitute.com/2021-state-of-marketing-ai-report" rel="external nofollow">من</a><a href="https://www.marketingaiinstitute.com/2021-state-of-marketing-ai-report" rel="external nofollow"> </a><a href="https://www.marketingaiinstitute.com/2021-state-of-marketing-ai-report" rel="external nofollow">جهات</a><a href="https://www.marketingaiinstitute.com/2021-state-of-marketing-ai-report" rel="external nofollow"> </a><a href="https://www.marketingaiinstitute.com/2021-state-of-marketing-ai-report" rel="external nofollow">التسويق</a> أن الذكاء الاصطناعي مهم لنجاح حملاتهم التسويقية ويؤكد 41% منهم أن تسريع نمو الإيرادات كان نتاجًا عن استخدام هذه الخوارزميات ويتوقع 80% منهم أتمتة أكثر من ربع مهامهم التسويقية خلال السنوات الخمسة المقبلة.
</p>

<p>
	يوجد العديد من المسوقين الذين يستخدمون تقنيات تعلم الآلة والتعلم العميق في تقديم محتوى مخصص وتحليل الفيديو والوصول إلى جمهور أكثر استهدافًا وفقًا لتفضيلاتهم أو سلوكياتهم والتفاعل معهم بفاعلية والتنبؤ برغبات العملاء والاستفادة من البيانات لأداء عروض أسعار في الوقت الفعلي. على سبيل المثال وليس الحصر، تهتم منصة "Google Cloud Video Intelligence" بإنشاء تحليلات لمقاطع الفيديو وتتيح إعداد ملخصات آلية لمستخدميها.
</p>

<h3>
	البحث الصوتي والمرئي والدردشة الآلية
</h3>

<p>
	هناك العديد من الشركات التي تستخدم خاصية التعلم العميق في منتجاتها الرقمية، فنجد تطبيق المساعد الصوتي Apple Siri الذي ترجم الصوت البشري إلى أوامر حاسوبية تسمح لمالكي أجهزة آيفون الحصول على المعلومات بناءً على أسئلتهم، كما أن أداة البحث الصوتي التي تستخدم <a href="https://blog.mostaql.com/detailed-guide-to-google-algorithm/" rel="external">خوارزميات</a><a href="https://blog.mostaql.com/detailed-guide-to-google-algorithm/" rel="external"> </a><a href="https://blog.mostaql.com/detailed-guide-to-google-algorithm/" rel="external">جوجل</a> Google Voice Search تتيح البحث بالصوت بدلًا من النصوص المكتوبة. فهي أدوات قائمة على فهم الأوامر الصوتية التي يطلبها المستخدمين.
</p>

<p>
	وهناك برامج سخرت التعلم العميق في البحث المرئي للجوال، مثل تطبيق "CamFind" الذي يتيح لمستخدميه التقاط صورة ما واستخدامها في إجراء عمليات البحث بدلًا من كتابة النصوص. إضافة إلى <a href="https://blog.khamsat.com/chatbots-enhance-user-experience/" rel="external">روبوتات</a><a href="https://blog.khamsat.com/chatbots-enhance-user-experience/" rel="external"> </a><a href="https://blog.khamsat.com/chatbots-enhance-user-experience/" rel="external">الدردشة</a> الآلية المستخدمة في حل مشكلات العملاء والتواصل معهم دون تدخل بشري، وهذه الروبوتات فعالة في <a href="https://academy.hsoub.com/marketing/social-media/4-%D8%B7%D8%B1%D9%82-%D9%85%D8%AC%D8%A7%D9%86%D9%8A%D8%A9-%D9%84%D9%84%D8%B9%D8%AB%D9%88%D8%B1-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D8%B9%D9%85%D9%84%D8%A7%D8%A1-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%B3%D9%88%D9%8A%D9%82-%D8%B9%D8%A8%D8%B1-%D9%88%D8%B3%D8%A7%D8%A6%D9%84-%D8%A7%D9%84%D8%AA%D9%88%D8%A7%D8%B5%D9%84-%D8%A7%D9%84%D8%A7%D8%AC%D8%AA%D9%85%D8%A7%D8%B9%D9%8A-r313/" rel="">التسويق</a><a href="https://academy.hsoub.com/marketing/social-media/4-%D8%B7%D8%B1%D9%82-%D9%85%D8%AC%D8%A7%D9%86%D9%8A%D8%A9-%D9%84%D9%84%D8%B9%D8%AB%D9%88%D8%B1-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D8%B9%D9%85%D9%84%D8%A7%D8%A1-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%B3%D9%88%D9%8A%D9%82-%D8%B9%D8%A8%D8%B1-%D9%88%D8%B3%D8%A7%D8%A6%D9%84-%D8%A7%D9%84%D8%AA%D9%88%D8%A7%D8%B5%D9%84-%D8%A7%D9%84%D8%A7%D8%AC%D8%AA%D9%85%D8%A7%D8%B9%D9%8A-r313/" rel=""> </a><a href="https://academy.hsoub.com/marketing/social-media/4-%D8%B7%D8%B1%D9%82-%D9%85%D8%AC%D8%A7%D9%86%D9%8A%D8%A9-%D9%84%D9%84%D8%B9%D8%AB%D9%88%D8%B1-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D8%B9%D9%85%D9%84%D8%A7%D8%A1-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%B3%D9%88%D9%8A%D9%82-%D8%B9%D8%A8%D8%B1-%D9%88%D8%B3%D8%A7%D8%A6%D9%84-%D8%A7%D9%84%D8%AA%D9%88%D8%A7%D8%B5%D9%84-%D8%A7%D9%84%D8%A7%D8%AC%D8%AA%D9%85%D8%A7%D8%B9%D9%8A-r313/" rel="">عبر</a><a href="https://academy.hsoub.com/marketing/social-media/4-%D8%B7%D8%B1%D9%82-%D9%85%D8%AC%D8%A7%D9%86%D9%8A%D8%A9-%D9%84%D9%84%D8%B9%D8%AB%D9%88%D8%B1-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D8%B9%D9%85%D9%84%D8%A7%D8%A1-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%B3%D9%88%D9%8A%D9%82-%D8%B9%D8%A8%D8%B1-%D9%88%D8%B3%D8%A7%D8%A6%D9%84-%D8%A7%D9%84%D8%AA%D9%88%D8%A7%D8%B5%D9%84-%D8%A7%D9%84%D8%A7%D8%AC%D8%AA%D9%85%D8%A7%D8%B9%D9%8A-r313/" rel=""> </a><a href="https://academy.hsoub.com/marketing/social-media/4-%D8%B7%D8%B1%D9%82-%D9%85%D8%AC%D8%A7%D9%86%D9%8A%D8%A9-%D9%84%D9%84%D8%B9%D8%AB%D9%88%D8%B1-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D8%B9%D9%85%D9%84%D8%A7%D8%A1-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%B3%D9%88%D9%8A%D9%82-%D8%B9%D8%A8%D8%B1-%D9%88%D8%B3%D8%A7%D8%A6%D9%84-%D8%A7%D9%84%D8%AA%D9%88%D8%A7%D8%B5%D9%84-%D8%A7%D9%84%D8%A7%D8%AC%D8%AA%D9%85%D8%A7%D8%B9%D9%8A-r313/" rel="">مواقع</a><a href="https://academy.hsoub.com/marketing/social-media/4-%D8%B7%D8%B1%D9%82-%D9%85%D8%AC%D8%A7%D9%86%D9%8A%D8%A9-%D9%84%D9%84%D8%B9%D8%AB%D9%88%D8%B1-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D8%B9%D9%85%D9%84%D8%A7%D8%A1-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%B3%D9%88%D9%8A%D9%82-%D8%B9%D8%A8%D8%B1-%D9%88%D8%B3%D8%A7%D8%A6%D9%84-%D8%A7%D9%84%D8%AA%D9%88%D8%A7%D8%B5%D9%84-%D8%A7%D9%84%D8%A7%D8%AC%D8%AA%D9%85%D8%A7%D8%B9%D9%8A-r313/" rel=""> </a><a href="https://academy.hsoub.com/marketing/social-media/4-%D8%B7%D8%B1%D9%82-%D9%85%D8%AC%D8%A7%D9%86%D9%8A%D8%A9-%D9%84%D9%84%D8%B9%D8%AB%D9%88%D8%B1-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D8%B9%D9%85%D9%84%D8%A7%D8%A1-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%B3%D9%88%D9%8A%D9%82-%D8%B9%D8%A8%D8%B1-%D9%88%D8%B3%D8%A7%D8%A6%D9%84-%D8%A7%D9%84%D8%AA%D9%88%D8%A7%D8%B5%D9%84-%D8%A7%D9%84%D8%A7%D8%AC%D8%AA%D9%85%D8%A7%D8%B9%D9%8A-r313/" rel="">التواصل</a><a href="https://academy.hsoub.com/marketing/social-media/4-%D8%B7%D8%B1%D9%82-%D9%85%D8%AC%D8%A7%D9%86%D9%8A%D8%A9-%D9%84%D9%84%D8%B9%D8%AB%D9%88%D8%B1-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D8%B9%D9%85%D9%84%D8%A7%D8%A1-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%B3%D9%88%D9%8A%D9%82-%D8%B9%D8%A8%D8%B1-%D9%88%D8%B3%D8%A7%D8%A6%D9%84-%D8%A7%D9%84%D8%AA%D9%88%D8%A7%D8%B5%D9%84-%D8%A7%D9%84%D8%A7%D8%AC%D8%AA%D9%85%D8%A7%D8%B9%D9%8A-r313/" rel=""> </a><a href="https://academy.hsoub.com/marketing/social-media/4-%D8%B7%D8%B1%D9%82-%D9%85%D8%AC%D8%A7%D9%86%D9%8A%D8%A9-%D9%84%D9%84%D8%B9%D8%AB%D9%88%D8%B1-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D8%B9%D9%85%D9%84%D8%A7%D8%A1-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%B3%D9%88%D9%8A%D9%82-%D8%B9%D8%A8%D8%B1-%D9%88%D8%B3%D8%A7%D8%A6%D9%84-%D8%A7%D9%84%D8%AA%D9%88%D8%A7%D8%B5%D9%84-%D8%A7%D9%84%D8%A7%D8%AC%D8%AA%D9%85%D8%A7%D8%B9%D9%8A-r313/" rel="">الاجتماعي</a> والتفاعل مع العملاء وتقديم استجابات فورية لهم.
</p>

<h3>
	التعلم العميق في التعليم
</h3>

<p>
	يُستخدم تعلم الآلة والتعلم العميق في التعليم لمنح الطلاب تجربة تعليمية فردية وتحليل أدائهم وتعديل طرق التدريس والمناهج الدراسية استنادًا إلى البيانات التي يتم معالجتها في أثناء تجارب الطلاب، ويساعد على زيادة كفاءة المعلمين من خلال فهم إمكانات الطلاب وتقديم محتوى تعليمي ممتع يشجع المتعلمين على التعلم والمشاركة. كما يسهم في إجراء التحليلات المتقدمة والتنبؤية المتعلقة بالعملية التعليمية. ومِنْ ثَمَّ، اتخاذ القرارات والإجراءات الصحيحة الأكثر عقلانية.
</p>

<p>
	توجد أمثلة عديدة لاستخدام التعلم العميق والتعلم الآلي في التعليم، مثل أداة "Quizlet" التي تتيح للمتعلمين تصميم الاختبارات والبطاقات التعليمية والرسوم البيانات وتضم ما يزيد عن 50 مليون مستخدم نشط. أما منصة "SchooLinks" فإنها تمكّن الطلاب من تصميم السير الذاتية ومعرفة الدورات التدريبية التي ينبغي الحصول عليها، وغيرها من الخدمات التي تتطلب استخدام خوارزميات التعلم الآلي. وغيرها من التطبيقات والأدوات التي تستعين بخوارزميات التعلم العميق والهادفة إلى جذب الطلاب وزيادة مشاركتهم وتنوع طرق التدريس.
</p>

<h3>
	عالم الترفيه
</h3>

<p>
	تُستخدم تطبيقات التعلم العميق والذكاء الاصطناعي في عالم الترفيه من أجل تقديم تجربة ممتعة للعملاء، فهناك شركات عالمية عديدة مثل يوتيوب وأمازون ونتفلكس تستغل خوارزميات الذكاء الاصطناعي في عرض الأفلام والأغاني ومقاطع الفيديو المختلفة بناءً على رغبات وسلوكيات وخيارات العميل التي نفذها سابقًا. كما يمكن الاستعانة بتقنيات التعلم العميق في تحويل أصوات الممثلين إلى ترجمات نصية تلقائية أو إدراج الأصوات في الأفلام السينمائية الصامتة.
</p>

<p>
	وقد استخدمت بعض شركات الترفيه هذه الخوارزميات لإنشاء نمذجة التنبؤ في الوقت الفعلي اعتمادًا على الاتجاهات الحالية للعملاء التي تُجمع من مصادر البيانات، وذلك يساعد الشركات على التفاعل مع عملائهم بشكل فوري، وتوقع سلوكياتهم المستقبلية والتعرف على الأفلام ومقاطع الفيديو التي تستهلكها شرائح صغيرة من الجمهور في الوقت الحالي ومن المتوقع شهرتها مستقبلًا، فضلًا عن إمكانية إنتاج الموسيقى باستخدام نماذج قائمة على خوارزميات التعلم العميق.
</p>

<h3>
	تقصي الحقائق وكشف الأخبار المزيفة
</h3>

<p>
	لجأت غرف الأخبار وصالات التحرير إلى تقنيات الذكاء الاصطناعي والتعلم العميق للتحقق من المعلومات المضللة وتقصي الحقائق، فقد طور باحثون من جامعة<a href="https://arxiv.org/abs/1911.11951" rel="external nofollow"> </a><a href="https://arxiv.org/abs/1911.11951" rel="external nofollow">Waterloo</a> الكندية نظام يستخدم خوارزميات الذكاء الاصطناعي للتعلم العميق لتقييم المقالات الإخبارية تلقائيًا بهدف تحديد المعلومات المضللة. وهناك منصات عديدة لتقصي الحقائق مثل Snopes و FactCheck.org، و PolitiFact تسخر الذكاء الاصطناعي في هذه المهمة.
</p>

<p>
	وتعد تقنية التحليل الرقمي "InVID" من أبرز الأدوات التي تستخدم خوارزميات التعلم العميق والذكاء الاصطناعي في الكشف عن الأخبار المزيفة والمعلومات المضللة، فهي تتضمن أكثر من 15 أداة لتقصي الحقائق، فمثلًا تسمح بتجزئة الفيديو إلى صور ثابتة لإجراء بحث عكسي عليها عبر محركات البحث العملاقة مثل Google و Yandex و Baidu، إضافة إلى استخراج البيانات الوصفية للفيديوهات وتحليلها والتعرف على ما إذا كانت الصور معدلة أم أصلية، وما إلى ذلك.
</p>

<h3>
	السيارات ذاتية القيادة
</h3>

<p>
	واحدة من تطبيقات التعلم العميق التي أدهشت العالم، هي السيارات ذاتية القيادة التي تعتمد على الشبكات العصبية الاصطناعية في القيادة وتحديد إشارات المرور واكتشاف الأشياء التي ينبغي تجنبها في أثناء القيادة دون أي تدخل بشري، إضافة إلى التعرف على وقت ضبط السرعة وتوجيهها بطريقة آمنة في الطرقات.
</p>

<p>
	ففي عام 1989م، استخدمت أول سيارة ذاتية القيادة التي عرفت باسم ALVINN الشبكات العصبية لاكتشاف خطوط الممرات وتقسيم البيئة وإمكانية القيادة، وكانت النتيجة جيدة إلا أنها محدودة لعدم توافر البيانات وضعف المعالجة. والآن، أضحت هذه التجربة أفضل مما كانت عليه في الماضي، فقد استحوذت خوارزميات التعلم العميق على النواحي الفرعية للقيادة الذاتية، لا سيما في ظل توفر البيانات الضخمة والمعالجات القوية.
</p>

<p>
	وتعتمد القيادة الذاتية على أجهزة الاستشعار المختلفة مثل الكاميرات أو GPS لجلب البيانات من البيئة المحيطة بالسيارة ومعالجتها باستخدام خوارزميات التعلم العميق من أجل اتخاذ القرارات المناسبة والجيدة وذات الصلة بالبيئة، وهذا يتطلب توافر فحص وفهم أربعة مكونات أساسية في هذه السيارات تتمثل في التصور والإدراك perception ومعرفة الخريطة والموقع المبدئي Localization والتنبؤ بالأشياء المحيطة Prediction وصناعة القرار Decision Making.
</p>

<h3>
	الأرصاد والمناخ
</h3>

<p>
	ساعدت تقنيات التعلم العميق على تحليل بيانات الأرصاد الجوية والأبحاث البيولوجية والتنبؤات المناخية ومعرفة أحوال الطقس مثل احتمالات سقوط الأمطار أو وقوع الزلازل واندلاع البراكين، مما يسهم في اتخاذ الاحتياطات والإجراءات اللازمة التي تحمي الناس من مخاطر هذه الكوارث الطبيعية. على سبيل المثال، ابتكر فريق بحثي في جامعة واترلو الكندية تقنية تعتمد على خوارزميات التعلم العميق للكشف عن نقاط التحول في التغير المناخي والعمل كنظام إنذار مبكر.
</p>

<p>
	وإذا كنت ترغب في تطبيق هذه الخوارزميات في مشروعك أو خدماتك التقنية وتحتاج إلى بعض المساعدة، فإنه يمكنك الاستعانة <a href="https://khamsat.com/search?q=%D8%A7%D9%84%D8%AA%D8%B9%D9%84%D9%85%2B%D8%A7%D9%84%D8%B9%D9%85%D9%8A%D9%82&amp;c%5B0%5D=6&amp;siv=false&amp;no_keyword=false" rel="external">بخدمات</a><a href="https://khamsat.com/search?q=%D8%A7%D9%84%D8%AA%D8%B9%D9%84%D9%85%2B%D8%A7%D9%84%D8%B9%D9%85%D9%8A%D9%82&amp;c%5B0%5D=6&amp;siv=false&amp;no_keyword=false" rel="external"> </a><a href="https://khamsat.com/search?q=%D8%A7%D9%84%D8%AA%D8%B9%D9%84%D9%85%2B%D8%A7%D9%84%D8%B9%D9%85%D9%8A%D9%82&amp;c%5B0%5D=6&amp;siv=false&amp;no_keyword=false" rel="external">التعلم</a><a href="https://khamsat.com/search?q=%D8%A7%D9%84%D8%AA%D8%B9%D9%84%D9%85%2B%D8%A7%D9%84%D8%B9%D9%85%D9%8A%D9%82&amp;c%5B0%5D=6&amp;siv=false&amp;no_keyword=false" rel="external"> </a><a href="https://khamsat.com/search?q=%D8%A7%D9%84%D8%AA%D8%B9%D9%84%D9%85%2B%D8%A7%D9%84%D8%B9%D9%85%D9%8A%D9%82&amp;c%5B0%5D=6&amp;siv=false&amp;no_keyword=false" rel="external">العميق</a> التي توفرها منصة خمسات -أكبر سوق عربي لبيع وشراء الخدمات المصغرة- وتضم لفيف من الخبراء العرب والمحترفين في مجال الذكاء الاصطناعي والتعلم العميق ولديهم القدرة على تقديم الدعم لك على أكمل وجه.
</p>

<h2 id="تحديات-التعلم-العميق">
	تحديات التعلم العميق
</h2>

<p>
	على الرغم من الطفرة الهائلة التي أحدثتها خوارزميات التعلم العميق في مختلف القطاعات، فهو ليس حلًا سحريًا لمعالجة جميع المشكلات، لأن هناك تحديات صعبة تواجه هذه التقنيات الحديثة وتمنعها من منافسة العقل البشري. فعلى سبيل المثال، تستلزم عملية التعرف على صورة ما معالجة ملايين البيانات لتحديدها.
</p>

<h3>
	الجودة الضعيفة للبيانات
</h3>

<p>
	تتطلب تقنيات التعلم العميق استخدام بيانات عالية الجودة لاستخراج نتائج جيدة ودقيقة، أما البيانات الرديئة التي تحتوي على أخطاء كثيرة وقيم متطرفة وبيانات فوضوية، فلن تعمل خوارزميات التعلم العميق بصورة صحيحة. لذلك، يعكف الكثير من علماء البيانات على تنظيف البيانات وتنقيتها في أغلب أوقاتهم من خلال تجاهل القيم المتطرفة أو إصلاحها وملء البيانات المفقودة يدويًا.
</p>

<h3>
	خداع التعلم العميق
</h3>

<p>
	يظن البعض أن خوارزميات التعلم العميق لا يمكن خداعها، وهذا اعتقاد خاطئ تمامًا، لأنه من السهل نسبيًا استخدام الاحتيال مع هذه التقنيات. فقد أجرى باحثون في معهد ماساتشوستس للتكنولوجيا MIT في عام 2017م، دراسة حول إمكانية خداع مصنف الصور InceptionV3 التابع لجوجل، وبعد التلاعب المتعمد في صورة سلحفاة ثلاثية الأبعاد، صنفتها الشبكة العصبية الاصطناعية على أنها بندقية وليست سلحفاة، وفي تجربة أخرى حدث خلط بين طائرة الهليكوبتر والبندقية.
</p>

<h3>
	عدم فهم السياق جيدا
</h3>

<p>
	تحتاج خوارزميات التعلم العميق إلى بيانات كافية لتعمل بطريقة صحيحة، فهي جيدة في ربط المدخلات مع المخرجات، لكنها لا تفهم سياق البيانات التي تتعامل معها بدقة في كثير من الأحيان. فكلمة "عميق" في مصطلح التعلم العميق تركز على بنية الخوارزميات وعدد الطبقات المخفية أكثر من مستوى فهمها لما تعالجه من بيانات. وتتطلب الشبكة العصبية الاصطناعية التدريب والتأقلم حتى تفهم السياق إذا حدثت أي تغيرات في البيانات.
</p>

<h3>
	ضغوط على المؤسسات
</h3>

<p>
	توصلت دراسة استقصائية أجريت في عام 2017 إلى أن<a href="https://www.teradata.com/Press-Releases/2017/Survey-80-Percent-of-Enterprises-Invest-in-AI" rel="external nofollow"> </a><a href="https://www.teradata.com/Press-Releases/2017/Survey-80-Percent-of-Enterprises-Invest-in-AI" rel="external nofollow">80% </a><a href="https://www.teradata.com/Press-Releases/2017/Survey-80-Percent-of-Enterprises-Invest-in-AI" rel="external nofollow">من</a><a href="https://www.teradata.com/Press-Releases/2017/Survey-80-Percent-of-Enterprises-Invest-in-AI" rel="external nofollow"> </a><a href="https://www.teradata.com/Press-Releases/2017/Survey-80-Percent-of-Enterprises-Invest-in-AI" rel="external nofollow">المؤسسات</a> تستثمر في الذكاء الاصطناعي رغم توقعها بوجود عوائق صعبة أمامها. وهذه النتيجة تشير إلى احتمالية وجود ضغط متزايد على الشركات ومطوريها للتركيز على تقنيات التعلم العميق وحلول الذكاء الاصطناعي لزيادة الإنتاجية والوصول إلى استنتاجات مستنيرة واتخاذ قرارات صائبة تدفع هذه الشركات للأمام.
</p>

<h3>
	قرصنة التعلم العميق
</h3>

<p>
	هناك تخوفات من أن تصبح الشبكات العصبية عرضة للقرصنة و<a href="https://blog.mostaql.com/5-best-plugins-to-secure-your-site-on-wordpress/" rel="external">الهجمات</a><a href="https://blog.mostaql.com/5-best-plugins-to-secure-your-site-on-wordpress/" rel="external"> </a><a href="https://blog.mostaql.com/5-best-plugins-to-secure-your-site-on-wordpress/" rel="external">الإلكترونية</a>، على سبيل المثال، من المحتمل استغلال خوارزميات التعلم العميق في السيارات ذاتية القيادة لتغيير سلوكها بطريقة مؤذية، وهذا ما فعله باحثون في تجربة نُشرت نتائجها في دورية Nature، فقد تعمدوا تضليل الشبكات العصبونية بالسيارة ذاتية القيادة من خلال وضع ملصقات معينة على كلمة "توقف" إلا أن النظام أخطأ في قراءتها واعتبرها "الحد الأقصى للسرعة 45".
</p>

<p>
	أخيرًا، هل يمكن القول بأن تجارب التعلم العميق محكوم عليها بالفشل؟ بالتأكيد لا، لأن تقنيات التعلم العميق تعمل بكفاءة عالية إذا ما توفرت البيانات الكافية وعالية الجودة، كما يكرس علماء البيانات والمطورون جهودهم من أجل التغلب على هذه التحديات وتحسين نماذج التعلم العميق وتطويرها وسط تخوفات من تهديد التعلم العميق النسيج الاجتماعي والاقتصادي من خلال دفع البشر إلى البطالة أو غير ذلك.
</p>

<h2>
	المراجع والمصادر
</h2>

<ol>
	<li>
		<a href="https://www.simplilearn.com/tutorials/deep-learning-tutorial/what-is-deep-learning" rel="external nofollow">What is Deep Learning and How Does It Works [Explained]</a>
	</li>
	<li>
		<a href="http://%20https://www.simplilearn.com/tutorials/deep-learning-tutorial/introduction-to-deep-learning?source=slfrsnavplaylistvideo_clicked" rel="external nofollow">The Best Introduction to Deep Learning - A Step by Step Guide</a>
	</li>
	<li>
		<a href="https://www.simplilearn.com/tutorials/deep-learning-tutorial/deep-learning-applications?source=slfrsnavplaylistvideo_clicked" rel="external nofollow">Top 10 Deep Learning Applications Used Across Industries</a>
	</li>
	<li>
		<a href="https://www.guru99.com/deep-learning-tutorial.html" rel="external nofollow">Deep Learning Tutorial for Beginners: Neural Network Basics</a>
	</li>
	<li>
		<a href="https://www.guru99.com/machine-learning-vs-deep-learning.html" rel="external nofollow">Difference Between Deep Learning and Machine Learning Vs AI</a>
	</li>
	<li>
		<a href="https://www.nature.com/scitable/blog/brain-metrics/are_there_really_as_many/" rel="external nofollow">Are There Really as Many Neurons in the Human Brain as Stars in the Milky Way?</a>
	</li>
	<li>
		<a href="https://www.brainfacts.org/in-the-lab/meet-the-researcher/2018/how-many-neurons-are-in-the-brain-120418" rel="external nofollow">How Many Neurons Are in the Brain?</a>
	</li>
	<li>
		<a href="https://technologyreview.ae/%D9%85%D8%A7-%D9%87%D9%88-%D8%A7%D9%84%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%B9%D9%85%D9%8A%D9%82%D8%9F/" rel="external nofollow">ما هو التعلم العميق؟</a>
	</li>
	<li>
		<a href="https://flatironschool.com/blog/deep-learning-vs-machine-learning" rel="external nofollow">Deep Learning vs. Machine Learning — What’s the Difference?</a>
	</li>
	<li>
		<a href="https://www.geeksforgeeks.org/difference-between-machine-learning-and-deep-learning/" rel="external nofollow">Difference Between Machine Learning and Deep Learning</a>
	</li>
	<li>
		<a href="https://levity.ai/blog/difference-machine-learning-deep-learning" rel="external nofollow">Deep learning vs. machine learning – What’s the difference?</a>
	</li>
	<li>
		<a href="https://www.forbes.com/sites/bernardmarr/2017/08/08/the-amazing-ways-how-google-uses-deep-learning-ai/?sh=6e6238783204" rel="external nofollow">The Amazing Ways Google Uses Deep Learning AI</a>
	</li>
	<li>
		<a href="https://data-flair.training/blogs/machine-learning-in-education/" rel="external nofollow">How is Machine Learning enhancing the Future of Education?</a>
	</li>
	<li>
		<a href="https://www.sciencedaily.com/releases/2021/09/210923082933.htm" rel="external nofollow">Artificial intelligence may be set to reveal climate-change tipping points</a>
	</li>
	<li>
		<a href="https://www.businessinsider.com/ai-marketing-report-2018-3?r=US&amp;IR=T" rel="external nofollow">AI in Marketing: How brands can improve personalization, enhance ad targeting, and make their marketing teams more agile</a>
	</li>
	<li>
		<a href="https://www.marketingaiinstitute.com/2021-state-of-marketing-ai-report" rel="external nofollow">The 2021 State of Marketing AI Report</a>
	</li>
	<li>
		<a href="https://light-it.net/blog/machine-learning-in-education-explanation-benefits-cases/" rel="external nofollow">MACHINE LEARNING IN EDUCATION: EXPLANATION, BENEFITS, CASE</a>
	</li>
	<li>
		<a href="https://healthitanalytics.com/features/what-is-deep-learning-and-how-will-it-change-healthcare" rel="external nofollow">What Is Deep Learning and How Will It Change Healthcare?</a>
	</li>
	<li>
		<a href="https://www.aidoc.com/blog/deep-learning-in-healthcare/" rel="external nofollow">DEEP LEARNING IN HEALTHCARE – HOW IT’S CHANGING THE GAME</a>
	</li>
	<li>
		<a href="https://www.dataiku.com/stories/ai-in-media-and-entertainment/" rel="external nofollow" style="background-color: rgb(255, 255, 255);">Top Use Cases for AI in Media and Entertainment</a>
	</li>
	<li>
		<a href="https://bdtechtalks.com/2020/02/24/deep-learning-fake-news-stance-detection/" rel="external nofollow" style="background-color: rgb(255, 255, 255);">Deep learning won’t detect fake news, but it will give fact-checkers a boost</a>
	</li>
	<li>
		<a href="https://arxiv.org/abs/1911.11951" rel="external nofollow" style="background-color: rgb(255, 255, 255);">Taking a Stance on Fake News: Towards Automatic Disinformation Assessment via Deep Bidirectional Transformer Language Models for Stance Detection</a>
	</li>
	<li>
		<a href="https://www.thinkautonomous.ai/blog/?p=deep-learning-in-self-driving-cars" rel="external nofollow" style="background-color: rgb(255, 255, 255);">Deep Learning in Self-Driving Cars</a>
	</li>
	<li>
		<a href="https://neptune.ai/blog/self-driving-cars-with-convolutional-neural-networks-cnn" rel="external nofollow" style="background-color: rgb(255, 255, 255);">Self-Driving Cars With Convolutional Neural Networks (CNN)</a>
	</li>
	<li>
		<a href="https://www.analyticsvidhya.com/blog/2021/06/5-challenges-of-machine-learning/" rel="external nofollow" style="background-color: rgb(255, 255, 255);">5 Challenges of Machine Learning!</a>
	</li>
	<li>
		<a href="https://datafloq.com/read/5-key-deep-learning-ai-challenges-in-2018/" rel="external nofollow">5 Key Deep Learning/AI Challenges in 2018</a>
	</li>
	<li>
		<a href="https://bdtechtalks.com/2018/02/27/limits-challenges-deep-learning-gary-marcus/" rel="external nofollow">The limits and challenges of deep learning</a>
	</li>
	<li>
		<a href="https://news.cgtn.com/news/77636a4d34597a6333566d54/share_p.html" rel="external nofollow">Turtle or rifle? Google AI tricked by MIT students</a>
	</li>
	<li>
		<a href="https://arabicedition.nature.com/journal/2019/11/d41586-019-03013-5/%D9%85%D8%B4%D9%83%D9%84%D8%A9%D9%8C-%D8%B9%D9%88%D9%8A%D8%B5%D8%A9-%D8%AA%D9%88%D8%A7%D8%AC%D9%87-%D8%AA%D9%82%D9%86%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%B9%D9%85%D9%8A%D9%82" rel="external nofollow">مشكلةٌ عويصة تواجه تقنيات التعلم العميق</a>
	</li>
	<li>
		<a href="https://towardsdatascience.com/simply-deep-learning-an-effortless-introduction-45591a1c4abb" rel="external nofollow">The Complete Beginner’s Guide to Deep Learning: Artificial Neural Networks</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/marketing/inbound-marketing/%D9%83%D9%8A%D9%81-%D9%8A%D9%85%D9%83%D9%86-%D9%84%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A-%D8%A3%D9%86-%D9%8A%D8%B4%D9%83%D9%84-%D9%85%D8%B3%D8%AA%D9%82%D8%A8%D9%84-%D8%AA%D8%B3%D9%88%D9%8A%D9%82-%D8%A7%D9%84%D9%85%D8%AD%D8%AA%D9%88%D9%89-r330/" rel="">كيف يمكن للذكاء الاصطناعي أن يشكل مستقبل تسويق المحتوى</a>
	</li>
</ol>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A-%D9%85%D8%B1%D8%A7%D8%AD%D9%84-%D8%A7%D9%84%D8%A8%D8%AF%D8%A1-%D9%88%D8%A7%D9%84%D8%AA%D8%B7%D9%88%D8%B1-%D9%88%D8%A7%D9%84%D8%A3%D8%B3%D8%B3-%D8%A7%D9%84%D8%AA%D9%8A-%D9%86%D8%B4%D8%A3-%D8%B9%D9%84%D9%8A%D9%87%D8%A7-r988/" rel="">الذكاء الاصطناعي: مراحل البدء والتطور والأسس التي نشأ عليها</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9-%D8%A7%D9%84%D8%AA%D8%AD%D8%AF%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%B1%D8%A6%D9%8A%D8%B3%D9%8A%D8%A9-%D9%88%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A7%D9%84%D8%AA%D9%88%D8%B3%D8%B9-%D9%81%D9%8A-%D8%A7%D9%84%D9%85%D8%AC%D8%A7%D9%84-r1010/" rel="">تعلم الآلة: التحديات الرئيسية وكيفية التوسع في المجال</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A/" rel="">تعلم الذكاء الاصطناعي</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1422</guid><pubDate>Sun, 16 Jan 2022 16:05:00 +0000</pubDate></item><item><title>&#x62E;&#x637;&#x648;&#x627;&#x62A; &#x62A;&#x646;&#x641;&#x64A;&#x630; &#x645;&#x634;&#x631;&#x648;&#x639; &#x639;&#x646; &#x62A;&#x639;&#x644;&#x645; &#x627;&#x644;&#x622;&#x644;&#x629; &#x641;&#x64A; &#x628;&#x627;&#x64A;&#x62B;&#x648;&#x646;: &#x627;&#x644;&#x62C;&#x632;&#x621; &#x627;&#x644;&#x62B;&#x627;&#x644;&#x62B;</title><link>https://academy.hsoub.com/programming/artificial-intelligence/%D8%AE%D8%B7%D9%88%D8%A7%D8%AA-%D8%AA%D9%86%D9%81%D9%8A%D8%B0-%D9%85%D8%B4%D8%B1%D9%88%D8%B9-%D8%B9%D9%86-%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9-%D9%81%D9%8A-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-%D8%A7%D9%84%D8%AC%D8%B2%D8%A1-%D8%A7%D9%84%D8%AB%D8%A7%D9%84%D8%AB-r1359/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2021_10/617ae8c4a68fe_--------.png.a77017079e82b4fece0ebdc49c44a597.png" /></p>
<p>
	يوجه النقد لنماذج تعلّم الآلة غالبًا بأنها <a href="https://datascience.stackexchange.com/questions/22335/why-are-machine-learning-models-called-black-boxes" rel="external nofollow">صناديق سوداء</a> نُدخَل فيها البيانات من جهة للحصول على أجوبة دقيقة في أغلب الأحيان، ومن جهة أخرى دون أي تفسير واضح لكيفية الحصول على الجواب.
</p>

<p>
	نعاين في هذا الجزء الثالث من بناء نموذج تعلّم آلة في بايثون نموذج التعلّم المطوّر لمحاولة فهم كيفية وصوله للتنبؤ الدقيق، وما يُمكن تعلمه حول مسألتنا المطروحة (التنبؤ بمعامل نجمة الطاقة) من هذا النموذج. وسنختم بمناقشة جزءٍ مهمٍ في مشاريع تعلّم الآلة وهو توثيق العمل وعرض النتائج بوضوح.
</p>

<p>
	عرضنا في الجزء الأول مسألة تنظيف البيانات و<a href="https://academy.hsoub.com/programming/python/%D8%AA%D8%AD%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D8%A7%D9%84%D8%A7%D8%B3%D8%AA%D9%83%D8%B4%D8%A7%D9%81%D9%8A%D8%A9-%D9%84%D8%A5%D8%AB%D8%A8%D8%A7%D8%AA-%D8%A7%D9%84%D9%86%D8%B8%D8%B1%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%A5%D8%AD%D8%B5%D8%A7%D8%A6%D9%8A%D8%A9-r1246/" rel="">تحليلها الاستكشافي</a>، ومن ثم آليات هندسة الميزات لاختيار المناسب منها؛ أما في الجزء الثاني فشرحنا آلية احتساب القيم الناقصة وعرضنا الشيفرة اللازمة لإنشاء نماذج تعلّم، كما وازنا بين عدة نماذج تعلّم ممكنة وصولًا إلى اختيار النموذج الأمثل لمسألتنا. وبهدف تحسين أداء النموذج المختار عالجنا مسألة معايرة المعاملات الفائقة للنموذج باستخدام البحث العشوائي مع التقويم المتقاطع. وفي النهاية حسبنا أداء النموذج مع بيانات الاختبار. ننصح الجميع بتحميل <a href="https://github.com/WillKoehrsen/machine-learning-project-walkthrough" rel="external nofollow">الشيفرة</a> ومعاينتها ومشاركتها، فهي متاحة للعموم.
</p>

<p>
	نُذكّر بأننا نعمل على تطوير نموذج تعلّم آلة من نمط موجه عبر الانحدار، وذلك باستخدام بيانات الطاقة لمباني نيويورك <a href="https://www1.nyc.gov/html/gbee/html/plan/ll84_scores.shtml" rel="external nofollow">المتاحة</a> للعموم بهدف التنبؤ بمعامل نجمة الطاقة للمبنى، ووصلنا في النهاية إلى بناء نموذج تعلّم من نمط الانحدار المعزز بالتدرج مع متوسط خطأ مطلق يساوي إلى 9.1 نقطة، بحيث يتراوح معامل نجمة الطاقة بين 1 و100 نقطة.
</p>

<h2>
	تفسير وفهم النموذج
</h2>

<p>
	يُعدّ الانحدار المعزز بالتدرج من النماذج المعقدة، إلا أنه يتموضع في منتصف مقياس إمكانية تفسير النموذج نظرًا لاحتوائه على أشجار القرار القابلة للشرح والتفسير.
</p>

<p>
	سننظر في الطرق الثلاثة التالية لمحاولة فهم آلية التنبؤ:
</p>

<ol>
	<li>
		أهمية الميزات.
	</li>
	<li>
		معاينة شجرة قرار واحدة.
	</li>
	<li>
		التفسيرات المحلية المحايدة للنموذج.
	</li>
</ol>

<p>
	تختص الطريقة الأولى والثانية بأشجار القرار؛ أما الطريقة الثالثة فهي طريقة عامة يُمكن استخدامها مع أي نموذج، وهي حزمة برمجية جديدة وخطوة مهمة نحو فهم آلية التنبؤ في مسائل تعلّم الآلة.
</p>

<h3>
	أهمية الميزات
</h3>

<p>
	تُحسب أهمية ميزة ما بمدى تأثيرها في الوصول إلى القيمة الهدف. وهنا لن نخوض في حسابات الأهمية المعقدة مثل حساب <a href="https://papers.nips.cc/paper/2013/file/e3796ae838835da0b6f6ea37bcf8bcb7-Paper.pdf" rel="external nofollow">متوسط الانخفاض في عدم النقاء</a> أو حساب <a href="https://stackoverflow.com/questions/15810339/how-are-feature-importances-in-randomforestclassifier-determined" rel="external nofollow">انخفاض الخطأ عند تضمين الميزة</a>، إذ توفر مكتبات Scikit-Learn إمكانية حساب <a href="https://scikit-learn.org/stable/auto_examples/ensemble/plot_forest_importances.html" rel="external nofollow">أهمية</a> كل ميزة لأي نموذج متعلّم يعتمد على الأشجار.
</p>

<p>
	تحسب الشيفرة التالية أهمية الميزات باستخدام <code>model.feature_importances</code>، حيث <code>model</code> هو النموذج المطور، ثم نضع الأهميات المحسوبة في إطار بيانات بهدف رسم العشر الأوائل الأكثر أهمية:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1507_8" style=""><span class="kwd">import</span><span class="pln"> pandas </span><span class="kwd">as</span><span class="pln"> pd

</span><span class="com"># model النموذج المطور</span><span class="pln">
importances </span><span class="pun">=</span><span class="pln"> model</span><span class="pun">.</span><span class="pln">feature_importances_

</span><span class="com"># train_features إطار بيانات المزايا</span><span class="pln">
feature_list </span><span class="pun">=</span><span class="pln"> list</span><span class="pun">(</span><span class="pln">train_features</span><span class="pun">.</span><span class="pln">columns</span><span class="pun">)</span><span class="pln">

</span><span class="com"># وضع أهميات المزايا في إطار بيانات</span><span class="pln">
feature_results </span><span class="pun">=</span><span class="pln"> pd</span><span class="pun">.</span><span class="typ">DataFrame</span><span class="pun">({</span><span class="str">'feature'</span><span class="pun">:</span><span class="pln"> feature_list</span><span class="pun">,</span><span class="pln"> 
                                </span><span class="str">'importance'</span><span class="pun">:</span><span class="pln"> importances</span><span class="pun">})</span><span class="pln">

</span><span class="com"># إظهار الميزات العشر الأكثر أهمية</span><span class="pln">
feature_results </span><span class="pun">=</span><span class="pln"> feature_results</span><span class="pun">.</span><span class="pln">sort_values</span><span class="pun">(</span><span class="str">'importance'</span><span class="pun">,</span><span class="pln"> 
                                              ascending </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">False</span><span class="pun">).</span><span class="pln">reset_index</span><span class="pun">(</span><span class="pln">drop</span><span class="pun">=</span><span class="kwd">True</span><span class="pun">)</span><span class="pln">
feature_results</span><span class="pun">.</span><span class="pln">head</span><span class="pun">(</span><span class="lit">10</span><span class="pun">)</span></pre>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="81152" href="https://academy.hsoub.com/uploads/monthly_2021_10/001Importance.png.e580d9acd348c2f931d86e543c4aef68.png" rel="" data-fileext="png"><img alt="001Importance.png" class="ipsImage ipsImage_thumbnailed" data-fileid="81152" data-unique="f6dhzauxr" src="https://academy.hsoub.com/uploads/monthly_2021_10/001Importance.thumb.png.83b2a0c895de4918845cb9fbe8ca87ee.png"></a>
</p>

<p>
	يُظهِر الشكل بوضوح أن أهم ميزتين (تُشكّلان لوحدهما حوالي 66% من الأهمية الكلية هما كثافة استخدام الطاقة <code>Site EUI </code><a href="https://www.energystar.gov/buildings/benchmark/understand_metrics/what_eui" rel="external nofollow">Energy Use Intensity</a>، وكثافة الكهرباء وفق الطقس <code>Weather Normalized Site Electricity Intensity</code>.
</p>

<p>
	تنخفض أهمية الميزات الأخرى بعد هاتين الميزتين مما يعني أننا لسنا مضطرين لاستخدام كل الميزات في النموذج (64 ميزة) للوصول إلى دقة كبيرة، وقد اخترنا عمليًا على سبيل التجريب عشر ميزات فقط وقمنا بإعادة بناء النموذج إلا أن دقته لم تكن جيدةً. وبهذا تعرّفنا السريع عن أهم الميزات المؤثرة في معامل نجمة الطاقة دون الاضطرار للغوص كثيرًا في الخلفية النظرية لهذا الموضوع.
</p>

<h3>
	معاينة شجرة قرار وحيدة
</h3>

<p>
	تُعَد أشجار القرار من أبسط الأشياء القابلة للفهم بخلاف الانحدار المعزز بالتدرج، حيث نستخدم في الشيفرة التالية التابع <code>export_graphviz</code> من <a href="https://scikit-learn.org/stable/modules/generated/sklearn.tree.export_graphviz.html" rel="external nofollow">Scikit-Learn</a> لمعاينة أي شجرة من غابة الأشجار، إذ نستخرج أولًا شجرةً من غابة الأشجار ثم نحفظها في ملف نقطي dot.
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1507_10" style=""><span class="kwd">from</span><span class="pln"> sklearn </span><span class="kwd">import</span><span class="pln"> tree

</span><span class="com"># استخراج الشجرة (105)</span><span class="pln">
single_tree </span><span class="pun">=</span><span class="pln"> model</span><span class="pun">.</span><span class="pln">estimators_</span><span class="pun">[</span><span class="lit">105</span><span class="pun">][</span><span class="lit">0</span><span class="pun">]</span><span class="pln">

</span><span class="com"># حفظ الشجرة في ملف نقطي</span><span class="pln">
tree</span><span class="pun">.</span><span class="pln">export_graphviz</span><span class="pun">(</span><span class="pln">single_tree</span><span class="pun">,</span><span class="pln"> out_file </span><span class="pun">=</span><span class="pln"> </span><span class="str">'images/tree.dot'</span><span class="pun">,</span><span class="pln"> 
                     feature_names </span><span class="pun">=</span><span class="pln"> feature_list</span><span class="pun">)</span></pre>

<p>
	نستخدم برمجية المعاينة من <a href="https://www.graphviz.org/" rel="external nofollow">Graphviz</a> لحفظ الصورة بصيغة png وذلك باستخدام التعليمة cmd التالية:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1507_12" style=""><span class="pln">dot </span><span class="pun">-</span><span class="typ">Tpng</span><span class="pln"> images</span><span class="pun">/</span><span class="pln">tree</span><span class="pun">.</span><span class="pln">dot </span><span class="pun">-</span><span class="pln">o images</span><span class="pun">/</span><span class="pln">tree</span><span class="pun">.</span><span class="pln">png</span></pre>

<p>
	ويكون الناتج عبارة عن شجرة كاملة:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="110548" href="https://academy.hsoub.com/uploads/monthly_2022_10/002FullTree.png.378aca2967a197ee375c036da467993f.png" rel="" data-fileext="png"><img alt="002FullTree.png" class="ipsImage ipsImage_thumbnailed" data-fileid="110548" data-unique="6fv18dm8f" src="https://academy.hsoub.com/uploads/monthly_2022_10/002FullTree.thumb.png.348f0b4e8de1f89cf5adb2cd9251fb54.png"></a>
</p>

<p>
	لا يُمكن تفحص الشجرة السابقة جيدًا على الرغم من أن عمقها 6 فقط لذا سنعيد توليد الشجرة بعمق 2 عن طريق تعديل معامل العمق للتابع <code>export_graphviz</code>:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="81153" href="https://academy.hsoub.com/uploads/monthly_2021_10/003Tree.png.dfc3a7d7e1a281b0ffd9b57fc2d6df4d.png" rel="" data-fileext="png"><img alt="003Tree.png" class="ipsImage ipsImage_thumbnailed" data-fileid="81153" data-unique="j6sv1jggy" src="https://academy.hsoub.com/uploads/monthly_2021_10/003Tree.thumb.png.d85d5378a128e19c5c0d29a93bcfc470.png"></a>
</p>

<p>
	تحوي كل عقدة من الشجرة المعلومات التالية:
</p>

<ol>
	<li>
		اختبار منطقي لقيمة ميزة ما، حيث تُحدّد نتيجة هذا الاختبار المنطقي الاتجاه التالي في الشجرة نزولًا يمينًا أو يسارًا.
	</li>
	<li>
		<code>mse</code> قياس الخطأ في العقدة.
	</li>
	<li>
		<code>samples</code> عدد الأمثلة في العقدة.
	</li>
	<li>
		<code>value</code> تقدير القيمة الهدف عند هذه العقدة.
	</li>
</ol>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="81154" href="https://academy.hsoub.com/uploads/monthly_2021_10/004Node.png.d371fb131782bc31ec33366d6acb1b66.png" rel="" data-fileext="png"><img alt="004Node.png" class="ipsImage ipsImage_thumbnailed" data-fileid="81154" data-unique="gtb3hnc0h" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2021_10/004Node.png.d371fb131782bc31ec33366d6acb1b66.png"></a>
</p>

<p>
	بالطبع لن يكون في أوراق الشجرة إلا الخطأ وتقدير القيمة الهدف.
</p>

<p>
	تتنبأ شجرة القرار بالنتيجة كما يلي: تبدأ من العقدة الأولى (الجذر) وتتحرك نحو الأسفل حتى تصل لورقة من أوراق الشجرة، ويُحدّد الاختبار المنطقي نعم/لا في كل عقدة اتجاه الحركة يمينًا أو يسارًا. فمثلًا، تسأل عقدة الشكل السابق عما إذا كانت قيمة ميزة كثافة الطاقة EUI أقل من 68.95 أم لا؟ فإذا كان الاختبار صحيحًا ينتقل للعقدة الأدنى اليسرى، وإلا للعقدة الأدنى اليمنى، وهكذا حتى الوصول لورقة فتكون القيمة فيها هي قيمة التنبؤ النهائي. وإذا حوت الورقة على عدد من الأمثلة فسيكون لهم جميعًا نفس قيمة التنبؤ.
</p>

<p>
	وبالطبع فكلما نزلنا في الشجرة ينقص الخطأ المرتكب في التنبؤ لأننا ننعم عمليًا الأمثلة أكثر فأكثر، إلا أن زيادة العمق قد توقعنا في مشكلة فرط التخصيص ولن تتمكن الشجرة عندها من تعميم الأمثلة.
</p>

<p>
	عايرنا المعاملات الفائقة للنموذج في <a href="https://academy.hsoub.com/programming/python/%D8%AE%D8%B7%D9%88%D8%A7%D8%AA-%D8%AA%D9%86%D9%81%D9%8A%D8%B0-%D9%85%D8%B4%D8%B1%D9%88%D8%B9-%D8%B9%D9%86-%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9-%D9%81%D9%8A-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-%D8%A7%D9%84%D8%AC%D8%B2%D8%A1-%D8%A7%D9%84%D8%AB%D8%A7%D9%86%D9%8A-r1358/" rel="">المقالة السابقة</a> والتي تتحكم في شجرة القرار الناتجة، مثل العمق الأعظم للشجرة وعدد الأمثلة الأصغر المطلوب في ورقة، وهما معاملان يلعبان دورًا كبيرًا في المقايضة الملائمة/عدم الملائمة الفائضة.
</p>

<p>
	تسمح معاينة شجرة القرار لنا بفهم تأثير هذه المعاملات الفائقة عمليًا، وعلى الرغم من أن معاينة جميع الأشجار أمرًا صعبًا، إلا أنه يكفي لنا معاينة شجرة واحدة فقط لنتمكن من فهم آلية التنبؤ التي ينجزها النموذج. وتبدو هذه الطريقة المعتمدة على <a href="https://ar.wiki2.wiki/wiki/Flowchart" rel="external nofollow">مخطط انسيابي</a> مشابهةً لما يفعله الإنسان عند اتخاذ قراراته بالإجابة على سؤال حول قيمة معينة في كل مرة.
</p>

<p>
	تراكب <a href="https://scikit-learn.org/stable/modules/ensemble.html" rel="external nofollow">أشجار القرار المعتمدة على مجموعات</a> يبَيّن تنبؤات العديد من أشجار القرار الفردية من أجل إنشاء نموذج أكثر دقة مع تباين أقل، وتميل <a href="https://blog.statsbot.co/ensemble-learning-d1dcd548e936" rel="external nofollow">مجموعات الأشجار</a> عامةً إلى أن تكون دقيقةً للغاية، كما أنها سهلة الشرح.
</p>

<h3>
	التفسيرات المحلية المحايدة للنموذج LIME
</h3>

<p>
	تهدف هذه الأداة الجديدة إلى شرح تنبؤ وحيد لأي نموذج، وذلك بإنشاء <a href="https://www.oreilly.com/content/introduction-to-local-interpretable-model-agnostic-explanations-lime/" rel="external nofollow">تقريب محلي للنموذج</a> يكون قريبًا من المثال المدروس باستخدام نموذج بسيط مثل الانحدار الخطي (للحصول على تفاصيل أكثر يُمكن مراجعة <a href="https://arxiv.org/pdf/1602.04938.pdf" rel="external nofollow">الملف</a>).
</p>

<p>
	سنستخدم LIME لتفحص تنبؤ خاطئ ينجزه نموذجنا المطور، وللحصول على تنبؤ خاطئ نستخرج المثال الذي يكون معامل الخطأ المطلق له أكبر ما يُمكن:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1507_15" style=""><span class="kwd">from</span><span class="pln"> sklearn</span><span class="pun">.</span><span class="pln">ensemble </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">GradientBoostingRegressor</span><span class="pln">

</span><span class="com"># إنشاء النموذج مع المعاملات الفائقة الأمثل</span><span class="pln">
model </span><span class="pun">=</span><span class="pln"> </span><span class="typ">GradientBoostingRegressor</span><span class="pun">(</span><span class="pln">loss</span><span class="pun">=</span><span class="str">'lad'</span><span class="pun">,</span><span class="pln"> max_depth</span><span class="pun">=</span><span class="lit">5</span><span class="pun">,</span><span class="pln"> max_features</span><span class="pun">=</span><span class="kwd">None</span><span class="pun">,</span><span class="pln">
                                  min_samples_leaf</span><span class="pun">=</span><span class="lit">6</span><span class="pun">,</span><span class="pln"> min_samples_split</span><span class="pun">=</span><span class="lit">6</span><span class="pun">,</span><span class="pln"> 
                                  n_estimators</span><span class="pun">=</span><span class="lit">800</span><span class="pun">,</span><span class="pln"> random_state</span><span class="pun">=</span><span class="lit">42</span><span class="pun">)</span><span class="pln">

</span><span class="com"># ملائمة واختبار النموذج</span><span class="pln">
model</span><span class="pun">.</span><span class="pln">fit</span><span class="pun">(</span><span class="pln">X</span><span class="pun">,</span><span class="pln"> y</span><span class="pun">)</span><span class="pln">
model_pred </span><span class="pun">=</span><span class="pln"> model</span><span class="pun">.</span><span class="pln">predict</span><span class="pun">(</span><span class="pln">X_test</span><span class="pun">)</span><span class="pln">

</span><span class="com"># إيجاد الأخطاء</span><span class="pln">
residuals </span><span class="pun">=</span><span class="pln"> abs</span><span class="pun">(</span><span class="pln">model_pred </span><span class="pun">-</span><span class="pln"> y_test</span><span class="pun">)</span><span class="pln">

</span><span class="com"># استخراج أكثر تنبؤ خاطئ</span><span class="pln">
wrong </span><span class="pun">=</span><span class="pln"> X_test</span><span class="pun">[</span><span class="pln">np</span><span class="pun">.</span><span class="pln">argmax</span><span class="pun">(</span><span class="pln">residuals</span><span class="pun">),</span><span class="pln"> </span><span class="pun">:]</span><span class="pln">

</span><span class="kwd">print</span><span class="pun">(</span><span class="str">'Prediction: %0.4f'</span><span class="pln"> </span><span class="pun">%</span><span class="pln"> np</span><span class="pun">.</span><span class="pln">argmax</span><span class="pun">(</span><span class="pln">residuals</span><span class="pun">))</span><span class="pln">
</span><span class="kwd">print</span><span class="pun">(</span><span class="str">'Actual Value: %0.4f'</span><span class="pln"> </span><span class="pun">%</span><span class="pln"> y_test</span><span class="pun">[</span><span class="pln">np</span><span class="pun">.</span><span class="pln">argmax</span><span class="pun">(</span><span class="pln">residuals</span><span class="pun">)])</span></pre>

<p>
	يكون الناتج:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1507_17" style=""><span class="typ">Prediction</span><span class="pun">:</span><span class="pln"> </span><span class="lit">12.8615</span><span class="pln">
</span><span class="typ">Actual</span><span class="pln"> </span><span class="typ">Value</span><span class="pun">:</span><span class="pln"> </span><span class="lit">100.0000</span></pre>

<p>
	تُنشئ الشيفرة التالية كائن شرح مع تمرير المعاملات التالية له: بيانات التدريب والنمط وعناوين بيانات التدريب وأسماء الميزات.
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1507_19" style=""><span class="kwd">import</span><span class="pln"> lime 

</span><span class="com"># إنشاء كائن شرح</span><span class="pln">
explainer </span><span class="pun">=</span><span class="pln"> lime</span><span class="pun">.</span><span class="pln">lime_tabular</span><span class="pun">.</span><span class="typ">LimeTabularExplainer</span><span class="pun">(</span><span class="pln">training_data </span><span class="pun">=</span><span class="pln"> X</span><span class="pun">,</span><span class="pln"> 
                                                   mode </span><span class="pun">=</span><span class="pln"> </span><span class="str">'regression'</span><span class="pun">,</span><span class="pln">                                               training_labels </span><span class="pun">=</span><span class="pln"> y</span><span class="pun">,</span><span class="pln">                                                  feature_names </span><span class="pun">=</span><span class="pln"> feature_list</span><span class="pun">)</span><span class="pln">

</span><span class="com"># شرح أسوء تنبؤ</span><span class="pln">
exp </span><span class="pun">=</span><span class="pln"> explainer</span><span class="pun">.</span><span class="pln">explain_instance</span><span class="pun">(</span><span class="pln">data_row </span><span class="pun">=</span><span class="pln"> wrong</span><span class="pun">,</span><span class="pln"> 
                                 predict_fn </span><span class="pun">=</span><span class="pln"> model</span><span class="pun">.</span><span class="pln">predict</span><span class="pun">)</span><span class="pln">

</span><span class="com"># رسم شرح التنبؤ</span><span class="pln">
exp</span><span class="pun">.</span><span class="pln">as_pyplot_figure</span><span class="pun">();</span></pre>

<p>
	ويكون الناتج ما يلي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="81155" href="https://academy.hsoub.com/uploads/monthly_2021_10/005Explanation.png.eb7ee743cc0205386478949fe9f88de4.png" rel="" data-fileext="png"><img alt="005Explanation.png" class="ipsImage ipsImage_thumbnailed" data-fileid="81155" data-unique="ftq7hzk31" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2021_10/005Explanation.png.eb7ee743cc0205386478949fe9f88de4.png"></a>
</p>

<p>
	يُمكن تفسير الشكل كما يلي: يُظهِر المحور y الميزات التي أوصلت للنتيجة مع شريط أخضر في حال كانت قيمة الميزة تؤثر إيجابًا على القيمة الهدف؛ أما إذا كان تأثير قيمة الميزة سلبًيا فيكون لون الشريط أحمر. مثلًا: تؤدي قيمة الميزة الأولى والتي هي أكبر من 95.90 إلى طرح حوالي 40 من القيمة الهدف؛ أما الميزة الثانية والتي قيمتها أقل من 3.80 فتجمع 10 للتنبؤ، حيث تكون قيمة التنبؤ النهائية حاصل جمع كل هذه القيم الموجبة والسالبة.
</p>

<p>
	يُمكن الحصول على نظرة أخرى لنفس المعلومات باستخدام الطريقة <code>show_in_notebook</code>:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1507_22" style=""><span class="com"># إظهار الشروحات</span><span class="pln">
exp</span><span class="pun">.</span><span class="pln">show_in_notebook</span><span class="pun">()</span></pre>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="81156" href="https://academy.hsoub.com/uploads/monthly_2021_10/006LIME.png.a88ae9a13ca2318c420f555b2aff512f.png" rel="" data-fileext="png"><img alt="006LIME.png" class="ipsImage ipsImage_thumbnailed" data-fileid="81156" data-unique="zdtm6hchm" src="https://academy.hsoub.com/uploads/monthly_2021_10/006LIME.png.a88ae9a13ca2318c420f555b2aff512f.png"></a>
</p>

<p>
	يُبين الشكل آلية المحاكمة التي ينجزها النموذج وصولًا للهدف من خلال عرض تأثير كل ميزة على التنبؤ (يسار الشكل)، وعرض القيم الفعلية (يمين الشكل).
</p>

<p>
	للأسف، يُظهر المثال تنبؤ النموذج للقيمة الهدف بحوالي 12 بينما القيمة الفعلية هي 100؛ إلا أنه بتفحص قيم الميزات يتبين أن قيمة معامل كثافة الطاقة مرتفعة نسبيًا، مما يعني أن معامل نجمة الطاقة يجب أن يكون منخفضًا لأن الارتباط بين كثافة الطاقة ومعامل نجمة الطاقة هو ارتباط سلبي كما عرضنا سابقًا. في مثل هذه الحالة يجب البحث عن سبب إعطاء المبنى معاملًا مرتفعًا على الرغم من أن كثافة الطاقة مرتفعة. وهنا قد تبدو أدوات الشرح المتوفرة غير كاملة، إلا أنها وفي جميع الأحوال ساعدتنا على فهم النموذج المتعلّم، مما يسمح لنا باتخاذ قرارات <a href="https://www.youtube.com/watch?v=hnSgIUA57hg" rel="external nofollow">أفضل</a>.
</p>

<h2>
	توثيق العمل وإعداد تقارير النتائج
</h2>

<p>
	يغفل الكثيرون في المشاريع التقنية عن ضرورة توثيق العمل وعرض النتائج بوضوح، حيث يُمكن أن يُهمَل عملنا ولو كان رائعًا في حال لم نعرض النتائج بطريقة مناسبة.
</p>

<p>
	يهدف التوثيق إلى وضع جميع الشروحات والتعليقات التي تُمكّن الآخرين من قراءة الشيفرة المكتوبة وفهمها وإعادة بنائها بسرعة عند الحاجة، إذ يُعدّ استخدام أدوات مثل <a href="http://jupyter.org/" rel="external nofollow">Jupyter Notebooks</a> والتي تسمح بوضع الشروحات المطلوبة أمرًا أساسيًا كي نتمكن نحن أولًا، ومن ثم الآخرين بمراجعة الشيفرة وتعديلها إن لزم ولو بعد أشهر من كتابتها. تسمح بعض <a href="https://github.com/ipython-contrib/jupyter_contrib_nbextensions" rel="external nofollow">الإضافات</a> للأداة السابقة <a href="https://github.com/kirbs-/hide_code" rel="external nofollow">بإخفاء الشيفرة</a> في التقرير النهائي، إذ قد لا يرغب البعض بمشاهدة قطع بايثون في كل فقرة.
</p>

<p>
	يجد كاتب المقال الأصلي صعوبةً في تلخيص العمل المنجز وإخفاء التفاصيل، إلا أنه يوجز العمل كله في النقطتين التاليتين:
</p>

<ol>
	<li>
		يُمكن بناء نموذج تعلّم للتنبؤ بمعامل نجمة الطاقة بالاعتماد على بيانات الطاقة لمدينة نيويورك مع خطأ ممكن بحوالي 9.1 نقطة.
	</li>
	<li>
		تلعب الميزتان التاليتان الدور الأكبر في تحديد معامل نجمة الطاقة: كثافة استخدام الطاقة Site EUI' Energy Use Intensity` وكثافة الكهرباء وفق الطقس Weather Normalized Site Electricity Intensity.
	</li>
</ol>

<p>
	أُنجز هذا المشروع بصفة اختبار لكاتب المقال لقبوله في وظيفة في شركة ناشئة، كما طُلب منه عرضُ عمله واستنتاجاته في النهاية، ولذا فقد طور ملفًا من النمط Jupyter Notebook لتسليمه للشركة، وعوضًا عن تحويل الملف إلى pdf فورًا استخدم <a href="https://www.latex-project.org/" rel="external nofollow">Latex</a> لتحويله إلى ملف من النمط tex، ومن ثم تحريره باستخدام <a href="https://www.texstudio.org/" rel="external nofollow">texStudio</a> قبل توليد <a href="https://github.com/WillKoehrsen/machine-learning-project-walkthrough/blob/master/Building%20Data%20Report.pdf" rel="external nofollow">الملف النهائي</a> بصيغة pdf. علمًا أنه يُمكن توليد الصيغة pdf من Jupyter مباشرةً وتحريرها لإجراء بعض التحسينات عليها.
</p>

<p>
	وفي نهاية المطاف تلعب مهارة عرض النتائج دورًا أساسيًا في إبراز أهمية العمل ونتائجه التي يُمكن أن تُبنى القرارات وفقها.
</p>
<div class="banner-container ipsBox ipsPadding">
	<div class="inner-banner-container">
		<p class="banner-heading">
			دورة الذكاء الاصطناعي
		</p>

		<p class="banner-subtitle">
			احترف برمجة الذكاء الاصطناعي AI وتحليل البيانات وتعلم كافة المعلومات التي تحتاجها لبناء نماذج ذكاء اصطناعي متخصصة.
		</p>

		<div>
			<a class="ipsButton ipsButton_large ipsButton_primary ipsButton_important" href="https://academy.hsoub.com/learn/artificial-intelligence" rel="">اشترك الآن</a>
		</div>
	</div>

	<div class="banner-img">
		<a href="https://academy.hsoub.com/learn/artificial-intelligence" rel=""><img alt="دورة الذكاء الاصطناعي AI" src="https://academy.hsoub.com/learn/assets/images/courses/artificial-intelligence.png"></a>
	</div>
</div>
<h2>
	النتائج
</h2>

<p>
	استعرضنا في هذه السلسلة من المقالات الثلاثة خطوات بناء مشروع تعلّم آلة كامل من البداية إلى النهاية، حيث بدأنا بتنظيف البيانات ثم انتقلنا إلى بناء النموذج ومن ثم لمحاولة فهم نموذج التعلّم.
</p>

<p>
	نُعيد التذكير أخيًرا بخطوات بناء نموذج تعلّم الآلة:
</p>

<ol>
	<li>
		تنظيف البيانات وتنسيقها.
	</li>
	<li>
		تحليل البيانات الاستكشافي.
	</li>
	<li>
		هندسة الميزات والاختيار منها.
	</li>
	<li>
		موازنة نماذج تعلّم الآلة باستخدام مقياس للأداء.
	</li>
	<li>
		معايرة المعاملات الفائقة لنموذج التعلّم.
	</li>
	<li>
		تقويم النموذج الأمثل مع بيانات الاختبار.
	</li>
	<li>
		تفسير نتائج النموذج إلى أقصى حد ممكن.
	</li>
	<li>
		استخلاص النتائج وتوثيق العمل.
	</li>
</ol>

<p>
	قد تختلف هذه الخطوات وفق المسألة المطروحة طبعًا، وغالبًا ما يكون العمل في مسائل تعلّم الآلة تكراريًا وليس تسلسليًا، أي يُمكن أن نعود لخطوات سابقة دومًا.
</p>

<p>
	نأمل أن توفر لك هذه السلسلة من المقالات الثلاثة دليلًا جيدًا يُساعدك أثناء معالجتك لمشاريع تعلّم الآلة المستقبلية، كما نتمنى أن تكون هذه السلسلة قد منحتك الثقة لتكون قادرًا على تنفيذ مشاريع تعلّم الآلة الخاصة بك. وتذكر بأن أحدًا لا يعمل بمفرده وأنه يوجد الكثير من المجموعات الداعمة والتي يُمكن طلب المساعدة منها. ننصحك بالرجوع إلى كتاب <a href="https://academy.hsoub.com/files/17-%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A7%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A-%D9%88%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9/" rel="">مدخل إلى الذكاء الاصطناعي وتعلم الآلة</a> من أكاديمية حسوب.
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://towardsdatascience.com/a-complete-machine-learning-walk-through-in-python-part-three-388834e8804b" rel="external nofollow">A Complete Machine Learning Project Walk-Through in Python: Part Three</a> لكاتبه Will Koehrsen.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/programming/python/%D8%AE%D8%B7%D9%88%D8%A7%D8%AA-%D8%AA%D9%86%D9%81%D9%8A%D8%B0-%D9%85%D8%B4%D8%B1%D9%88%D8%B9-%D8%B9%D9%86-%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9-%D9%81%D9%8A-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-%D8%A7%D9%84%D8%AC%D8%B2%D8%A1-%D8%A7%D9%84%D8%A3%D9%88%D9%84-r1357/" rel="">خطوات تنفيذ مشروع عن تعلم الآلة في بايثون: الجزء الأول</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/python/%D8%AF%D9%88%D8%A7%D9%84-%D8%A7%D9%84%D9%83%D8%AB%D8%A7%D9%81%D8%A9-%D8%A7%D9%84%D8%A7%D8%AD%D8%AA%D9%85%D8%A7%D9%84%D9%8A%D8%A9-%D9%81%D9%8A-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-r1335/" rel="">دوال الكثافة الاحتمالية في بايثون</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/python/%D8%A7%D9%84%D9%85%D8%B1%D8%AC%D8%B9-%D8%A7%D9%84%D8%B4%D8%A7%D9%85%D9%84-%D8%A5%D9%84%D9%89-%D8%AA%D8%B9%D9%84%D9%85-%D9%84%D8%BA%D8%A9-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-r735/" rel="">المرجع الشامل إلى تعلم لغة بايثون</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1359</guid><pubDate>Sat, 23 Oct 2021 15:00:00 +0000</pubDate></item><item><title>&#x62E;&#x637;&#x648;&#x627;&#x62A; &#x62A;&#x646;&#x641;&#x64A;&#x630; &#x645;&#x634;&#x631;&#x648;&#x639; &#x639;&#x646; &#x62A;&#x639;&#x644;&#x645; &#x627;&#x644;&#x622;&#x644;&#x629; &#x641;&#x64A; &#x628;&#x627;&#x64A;&#x62B;&#x648;&#x646;: &#x627;&#x644;&#x62C;&#x632;&#x621; &#x627;&#x644;&#x62B;&#x627;&#x646;&#x64A;</title><link>https://academy.hsoub.com/programming/artificial-intelligence/%D8%AE%D8%B7%D9%88%D8%A7%D8%AA-%D8%AA%D9%86%D9%81%D9%8A%D8%B0-%D9%85%D8%B4%D8%B1%D9%88%D8%B9-%D8%B9%D9%86-%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9-%D9%81%D9%8A-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-%D8%A7%D9%84%D8%AC%D8%B2%D8%A1-%D8%A7%D9%84%D8%AB%D8%A7%D9%86%D9%8A-r1358/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2021_10/617ae34b06468_--------.png.b497a8f407ccead2a79dc46ee6637bc4.png" /></p>
<p>
	نعرض في هذه السلسلة من المقالات تسلسل خطوات تنفيذ مسألة حقيقية في تعلّم الآلة بهدف تسليط الضوء على أهم الصعوبات التي يُمكنها مواجهة المبرمج وكيفية التغلب عليها.
</p>

<p>
	شرحنا في <a href="https://academy.hsoub.com/programming/python/%D8%AE%D8%B7%D9%88%D8%A7%D8%AA-%D8%AA%D9%86%D9%81%D9%8A%D8%B0-%D9%85%D8%B4%D8%B1%D9%88%D8%B9-%D8%B9%D9%86-%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9-%D9%81%D9%8A-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-%D8%A7%D9%84%D8%AC%D8%B2%D8%A1-%D8%A7%D9%84%D8%A3%D9%88%D9%84-r1357/" rel="">المقالة السابقة</a> الخطوات الثلاثة الأولى في مسألة تعلّم الآلة، وهي تنظيف البيانات أولًا، ومن ثم إجراء التحليل الاستكشافي لها بهدف اختيار الميزات المناسبة للمسألة، وأخيرًا تحديد خط الأساس الذي سنقيّم أداء نموذج التعلّم وفقه.
</p>

<p>
	نتابع في هذه المقالة عرض إنشاء عدة نماذج تعلّم مختلفة باستخدام بايثون، وذلك بهدف موازنة هذه النماذج لاختيار الأفضل منها، ومن ثم آلية ضبط ومعايرة المعاملات الفائقة للنموذج المختار بشكل أمثلي. وأخيرًا كيفية تقويم النموذج النهائي باستخدام بيانات الاختبار المتوفرة. يُمكن تنزيل واستخدام ومشاركة الشيفرة المتاحة للعموم من <a href="https://github.com/WillKoehrsen/machine-learning-project-walkthrough/blob/master/Machine%20Learning%20Project%20Part%201.ipynb" rel="external nofollow">مستودع github</a>.
</p>

<h2>
	اختيار النموذج وتقييمه
</h2>

<p>
	نُذكّر بأننا نريد بناء نموذج يتنبأ <a href="https://www.energystar.gov/buildings/benchmark/analyze_benchmarking_results" rel="external nofollow">بمعامل نجمة الطاقة</a> Energy Star Score لمدينة نيويوركk مع التركيز على دقة النتائج وقابلية تفسيرها وذلك باستخدام <a href="https://www1.nyc.gov/html/gbee/html/plan/ll84_scores.shtml" rel="external nofollow">بيانات الطاقة المتاحة للعموم</a>. وبهذا تكون المسألة المطروحة مسألة تعلّم آلة من نمط موجه عبر الانحدار كما عرضنا سابقًا.
</p>

<p>
	كي لا نغوص في الموازنات الكثيرة بين <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D9%84%D9%85%D9%81%D8%A7%D9%87%D9%8A%D9%85-%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A9-%D9%84%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9-r1009/" rel="">نماذج تعلّم الآلة المعروفة</a> ونتمعن في <a href="https://docs.microsoft.com/en-us/azure/machine-learning/algorithm-cheat-sheet" rel="external nofollow">مخططات موازنة النماذج</a> سنجرب العديد منها عمليًا لاختيار الأمثل.
</p>

<p>
	لنتذكر أن تعلّم الآلة مازال <a href="https://www.quora.com/How-much-of-deep-learning-research-is-empirical-versus-theoretical" rel="external nofollow">حقلًا تجريبيًا</a>، وقد يكون من المستحيل <a href="http://www.statsblogs.com/2014/01/25/machine-learning-lesson-of-the-day-the-no-free-lunch-theorem/" rel="external nofollow">معرفة النموذج الأمثل مسبقًا</a>.
</p>

<p>
	نبدأ عادةً بتجربة نموذج بسيط قابل للتفسير مثل نموذج الانحدار الخطي linear regression، وفي حال كانت دقته غير مقبولة، فسننتقل لنماذج أكثر تعقيدًا. يُبين الشكل التالي (المرسوم بشكل تجريبي) العلاقة بين الدقة accuracy وقابلية التفسير interpretability.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="81139" href="https://academy.hsoub.com/uploads/monthly_2021_10/001AccuracyInterprtability.png.3da389320baf3ae5eb8f1e82e3dcb0cc.png" rel="" data-fileext="png"><img alt="001AccuracyInterprtability.png" class="ipsImage ipsImage_thumbnailed" data-fileid="81139" data-unique="f10pp3ui2" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2021_10/001AccuracyInterprtability.png.3da389320baf3ae5eb8f1e82e3dcb0cc.png"></a>
</p>

<p>
	سنجرب النماذج الخمسة التالية:
</p>

<ul>
	<li>
		الانحدار الخطي Linear Regression.
	</li>
	<li>
		انحدار أقرب الجيران K-Nearest Neighbors Regression.
	</li>
	<li>
		انحدار الغابة العشوائية Random Forest Regression.
	</li>
	<li>
		الانحدار المعزز بالتدرج Gradient Boosted Regression.
	</li>
	<li>
		انحدار آلة متجهة الدعم Support Vector Machine Regression.
	</li>
</ul>

<p>
	لن نغوص في الخلفية النظرية لهذه النماذج بل سنُركز على برمجتها وتقويمها. يُمكن العودة للمزيد من التفاصيل للمقال العربي <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D9%84%D9%85%D9%81%D8%A7%D9%87%D9%8A%D9%85-%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A9-%D9%84%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9-r1009/" rel="">المفاهيم الأساسية لتعلم الآلة</a>، وللمرجع المجاني من <a href="http://faculty.marshall.usc.edu/gareth-james/" rel="external nofollow">Introduction to Statistical Learning</a>، وللكتاب <a href="https://www.oreilly.com/library/view/hands-on-machine-learning/9781491962282/" rel="external nofollow">Hands-On Machine Learning with Scikit-Learn and TensorFlow</a>، لأخذ معرفة أكثر حول ذلك.
</p>

<h3>
	احتساب القيم الناقصة
</h3>

<p>
	حذفنا في مرحلة تنظيف البيانات الأعمدة التي يتجاوز فيها عدد القيم الناقصة 50% من قيم العمود. وسيتعين علينا الآن ملء القيم الناقصة المتبقية لأن جميع خوارزميات التعلّم لا تعمل بوجود قيم ناقصة.
</p>

<p>
	لنبدأ أولًا بعرض كل البيانات باستخدام الشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4939_8" style=""><span class="kwd">import</span><span class="pln"> pandas </span><span class="kwd">as</span><span class="pln"> pd
</span><span class="kwd">import</span><span class="pln"> numpy </span><span class="kwd">as</span><span class="pln"> np

</span><span class="com"># قراءة البيانات ووضعها في إطار بيانات </span><span class="pln">
train_features </span><span class="pun">=</span><span class="pln"> pd</span><span class="pun">.</span><span class="pln">read_csv</span><span class="pun">(</span><span class="str">'data/training_features.csv'</span><span class="pun">)</span><span class="pln">
test_features </span><span class="pun">=</span><span class="pln"> pd</span><span class="pun">.</span><span class="pln">read_csv</span><span class="pun">(</span><span class="str">'data/testing_features.csv'</span><span class="pun">)</span><span class="pln">
train_labels </span><span class="pun">=</span><span class="pln"> pd</span><span class="pun">.</span><span class="pln">read_csv</span><span class="pun">(</span><span class="str">'data/training_labels.csv'</span><span class="pun">)</span><span class="pln">
test_labels </span><span class="pun">=</span><span class="pln"> pd</span><span class="pun">.</span><span class="pln">read_csv</span><span class="pun">(</span><span class="str">'data/testing_labels.csv'</span><span class="pun">)</span><span class="pln">

</span><span class="typ">Training</span><span class="pln"> </span><span class="typ">Feature</span><span class="pln"> </span><span class="typ">Size</span><span class="pun">:</span><span class="pln">  </span><span class="pun">(</span><span class="lit">6622</span><span class="pun">,</span><span class="pln"> </span><span class="lit">64</span><span class="pun">)</span><span class="pln">
</span><span class="typ">Testing</span><span class="pln"> </span><span class="typ">Feature</span><span class="pln"> </span><span class="typ">Size</span><span class="pun">:</span><span class="pln">   </span><span class="pun">(</span><span class="lit">2839</span><span class="pun">,</span><span class="pln"> </span><span class="lit">64</span><span class="pun">)</span><span class="pln">
</span><span class="typ">Training</span><span class="pln"> </span><span class="typ">Labels</span><span class="pln"> </span><span class="typ">Size</span><span class="pun">:</span><span class="pln">   </span><span class="pun">(</span><span class="lit">6622</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">)</span><span class="pln">
</span><span class="typ">Testing</span><span class="pln"> </span><span class="typ">Labels</span><span class="pln"> </span><span class="typ">Size</span><span class="pun">:</span><span class="pln">    </span><span class="pun">(</span><span class="lit">2839</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">)</span></pre>

<p>
	والذي يُظهر:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="81141" href="https://academy.hsoub.com/uploads/monthly_2021_10/002Data.png.7c3cff3584d3503841303d488519029a.png" rel="" data-fileext="png"><img alt="002Data.png" class="ipsImage ipsImage_thumbnailed" data-fileid="81141" data-unique="pd5od9wi1" src="https://academy.hsoub.com/uploads/monthly_2021_10/002Data.thumb.png.15875400260a610c2cd50c1a6b752463.png"></a>
</p>

<p>
	لاحظ أن كل قيمة "ليست رقمًا" NaN تُمثّل قيمةً ناقصة، وهنا سنستبدل ببساطة كل قيمة ناقصة بالقيمة الأوسط median لعمودها. يُمكن العودة <a href="https://www.hilarispublisher.com/open-access/a-comparison-of-six-methods-for-missing-data-imputation-2155-6180-1000224.pdf" rel="external nofollow">للمرجع</a> لمعاينة طرق أخرى لاستبدال القيم الناقصة.
</p>

<p>
	نُنشئ في الشيفرة التالية <a href="http://scikit-learn.org/stable/" rel="external nofollow">كائنًا Scikit-Learn</a> من النمط <code>Imputer</code> مع إسناد استراتيجيته إلى القيمة الأوسط، ونُدرّب بعدها هذا الكائن باستخدام بيانات التدريب عن طريق تابع الملاءمة <code>imputer.fit</code>، ومن ثم نستخدمه لملء القيم الناقصة في كل من بيانات التدريب والاختبار باستخدام تابع التحويل <code>imputer.transform</code>. لاحظ أن القيم الناقصة في بيانات الاختبار تُستبدل بالقيمة الأوسط لبيانات التدريب.
</p>

<p>
	نستخدم هذه الطريقة في الحساب لتجنب الوقوع في فخ تسرب بيانات الاختبار <a href="https://www.kaggle.com/dansbecker/data-leakage" rel="external nofollow">test data leakage,</a> وبهذا لا تختلط بيانات الاختبار مع بيانات التدريب أبدًا.
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4939_11" style=""><span class="com"># إنشاء كائن الحساب مع استراتيجية القيمة الأوسط</span><span class="pln">
imputer </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Imputer</span><span class="pun">(</span><span class="pln">strategy</span><span class="pun">=</span><span class="str">'median'</span><span class="pun">)</span><span class="pln">

</span><span class="com"># الملاءمة مع ميزات التدريب</span><span class="pln">
imputer</span><span class="pun">.</span><span class="pln">fit</span><span class="pun">(</span><span class="pln">train_features</span><span class="pun">)</span><span class="pln">

</span><span class="com"># حساب كل من بيانات التدريب والاختبار</span><span class="pln">
X </span><span class="pun">=</span><span class="pln"> imputer</span><span class="pun">.</span><span class="pln">transform</span><span class="pun">(</span><span class="pln">train_features</span><span class="pun">)</span><span class="pln">
X_test </span><span class="pun">=</span><span class="pln"> imputer</span><span class="pun">.</span><span class="pln">transform</span><span class="pun">(</span><span class="pln">test_features</span><span class="pun">)</span><span class="pln">

</span><span class="typ">Missing</span><span class="pln"> values </span><span class="kwd">in</span><span class="pln"> training features</span><span class="pun">:</span><span class="pln">  </span><span class="lit">0</span><span class="pln">
</span><span class="typ">Missing</span><span class="pln"> values </span><span class="kwd">in</span><span class="pln"> testing features</span><span class="pun">:</span><span class="pln">   </span><span class="lit">0</span></pre>

<p>
	يؤدي تنفيذ الشيفرة السابقة إلى الحصول على ميزات لها قيم حقيقية منتهية وبدون أي نقص فيها.
</p>

<h3>
	تحجيم الميزات
</h3>

<p>
	نعني <a href="https://ar.wikinew.wiki/wiki/Feature_scaling" rel="external nofollow">بتحجيم الميزات</a> الإجرائية العامة التي تُغير مجال قيم الميزة، وهي عملية <a href="https://stats.stackexchange.com/questions/121886/when-should-i-apply-feature-scaling-for-my-data" rel="external nofollow">ضرورية</a> لأن الميزات تأتي عادةً بوحدات مختلفة، وبالتالي ستتوزع قيمها على مجالات مختلفة، تتأثر بعض النماذج كثيرًا ولاسيما تلك التي تحسب المسافة بين الأمثلة بمجالات هذه القيم، مثل نموذج <a href="https://ar.wikipedia.org/wiki/%D8%B4%D8%B9%D8%A7%D8%B9_%D8%A7%D9%84%D8%AF%D8%B9%D9%85_%D8%A7%D9%84%D8%A2%D9%84%D9%8A" rel="external nofollow">آلة متجهة الدعم support vector machine</a> ونموذج أقرب الجيران، بينما لا تتطلب بعض النماذج بالضرورة تحجيم الميزات، مثل نموذج الانحدار الخطي linear regression ونموذج الغابة العشوائية random forest. وتكون هذه الخطوة ضروريةً في جميع الأحوال عند الحاجة لموازنة نماذج التعلّم المختلفة.
</p>

<p>
	نفعّل من أجل إرجاع قيم أي ميزة إلى المجال [0-1] من أجل كل قيمة في ميزة بطرح أصغر قيمة للميزة من هذه القيمة، ومن ثم القسمة على ناتج طرح أعلى قيمة للميزة من أصغر قيمة للميزة (مجال الميزة). تّدعى هذه العملية أحيانًا بالتسوية normalization أو التوحيد standardization.
</p>

<p>
	يُمكن لنا برمجة العملية الحسابية السابقة طبعًا بسهولة، إلا أننا نستخدم الكائن <code>MinMaxScaler</code> في Scikit-Learn والذي ينجزها، وتُطابق شيفرة التحجيم شيفرة الحساب السابق مع استبدال scaler بـ imputer. سنؤكد على أننا نُدرّب باستخدام بيانات التدريب فقط ونحسب لكل البيانات بما فيها بيانات الاختبار كما نوّه سابقًا.
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4939_13" style=""><span class="com"># إنشاء كائن التحجيم مع المجال 0 إلى 1</span><span class="pln">
scaler </span><span class="pun">=</span><span class="pln"> </span><span class="typ">MinMaxScaler</span><span class="pun">(</span><span class="pln">feature_range</span><span class="pun">=(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">))</span><span class="pln">

</span><span class="com"># الملاءمة مع بيانات التدريب</span><span class="pln">
scaler</span><span class="pun">.</span><span class="pln">fit</span><span class="pun">(</span><span class="pln">X</span><span class="pun">)</span><span class="pln">

</span><span class="com"># تحويل كل من بيانات التدريب والاختبار</span><span class="pln">
X </span><span class="pun">=</span><span class="pln"> scaler</span><span class="pun">.</span><span class="pln">transform</span><span class="pun">(</span><span class="pln">X</span><span class="pun">)</span><span class="pln">
X_test </span><span class="pun">=</span><span class="pln"> scaler</span><span class="pun">.</span><span class="pln">transform</span><span class="pun">(</span><span class="pln">X_test</span><span class="pun">)</span></pre>

<p>
	تكون لكل ميزة بعد تنفيذ هذه الشيفرة قيمة صغرى هي 0 وقيمة عظمى هي 1.
</p>

<p>
	يُستحسن فهم كل من عملية احتساب القيم الناقصة وعملية تحجيم الميزات جيدًا لأنهما موجودتان عمليًا في أي مشروع تعلّم آلة.
</p>

<h3>
	تنفيذ نماذج تعلم الآلة باستخدام Scikit-Learn
</h3>

<p>
	يُعدّ إنشاء النماذج وتدريبها ومن ثم استخدامها للتنبؤ أمرًا يسيرًا بعد أن أنهينا مراحل تنظيف البيانات وإعدادها. نستخدم المكتبة <a href="https://scikit-learn.org/stable/index.html" rel="external nofollow">Scikit-Learn</a> في بايثون والتي يتوفر لها توثيق ممتاز وطريقة بناء موحدة لكل نماذج التعلّم، مما يسمح بتنفيذ العديد من النماذج بسرعة.
</p>

<p>
	تُبين الشيفرة التالية آلية إنشاء نموذج الانحدار المعزز بالتدرج Gradient Boosted Regression وتدريبه باستخدام تابع الملاءمة <code>fit</code>، ومن ثم اختباره باستخدام تابع التنبؤ <code>predict</code>.
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4939_15" style=""><span class="kwd">from</span><span class="pln"> sklearn</span><span class="pun">.</span><span class="pln">ensemble </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">GradientBoostingRegressor</span><span class="pln">

</span><span class="com"># إنشاء النموذج</span><span class="pln">
gradient_boosted </span><span class="pun">=</span><span class="pln"> </span><span class="typ">GradientBoostingRegressor</span><span class="pun">()</span><span class="pln">

</span><span class="com"># ملاءمة النموذج مع بيانات التدريب</span><span class="pln">
gradient_boosted</span><span class="pun">.</span><span class="pln">fit</span><span class="pun">(</span><span class="pln">X</span><span class="pun">,</span><span class="pln"> y</span><span class="pun">)</span><span class="pln">

</span><span class="com"># التنبؤ باستخدام بيانات الاختبار</span><span class="pln">
predictions </span><span class="pun">=</span><span class="pln"> gradient_boosted</span><span class="pun">.</span><span class="pln">predict</span><span class="pun">(</span><span class="pln">X_test</span><span class="pun">)</span><span class="pln">

</span><span class="com"># تقويم النموذج</span><span class="pln">
mae </span><span class="pun">=</span><span class="pln"> np</span><span class="pun">.</span><span class="pln">mean</span><span class="pun">(</span><span class="pln">abs</span><span class="pun">(</span><span class="pln">predictions </span><span class="pun">-</span><span class="pln"> y_test</span><span class="pun">))</span><span class="pln">

</span><span class="kwd">print</span><span class="pun">(</span><span class="str">'Gradient Boosted Performance on the test set: MAE = %0.4f'</span><span class="pln"> </span><span class="pun">%</span><span class="pln"> mae</span><span class="pun">)</span></pre>

<p>
	حيث يكون الناتج:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4939_17" style=""><span class="typ">Gradient</span><span class="pln"> </span><span class="typ">Boosted</span><span class="pln"> </span><span class="typ">Performance</span><span class="pln"> on the test set</span><span class="pun">:</span><span class="pln"> MAE </span><span class="pun">=</span><span class="pln"> </span><span class="lit">10.0132</span></pre>

<p>
	لاحظ أن كل عملية من العمليات الأساسية (إنشاء وتدريب واختبار) تأخذ سطرًا واحدًا فقط، وبالتالي لبناء بقية النماذج يكفي تغيير اسم النموذج المطلوب في الشيفرة. يُبين الشكل التالي نتائج النماذج المختبرة:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="81142" href="https://academy.hsoub.com/uploads/monthly_2021_10/003MAE.png.6932df79e017d553806bb97d076ec44d.png" rel="" data-fileext="png"><img alt="003MAE.png" class="ipsImage ipsImage_thumbnailed" data-fileid="81142" data-unique="ag0wd251l" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2021_10/003MAE.png.6932df79e017d553806bb97d076ec44d.png"></a>
</p>

<p>
	تُثبت الأرقام في الشكل أن جميع نماذج تعلّم الآلة قابلة للتطبيق في مسألتنا لأنها جميعها تتميز بمتوسط قيم خطأ مطلق أصغر من خط الأساس المُحدّد لمسألتنا (وهو 24.5) والذي حُسب باستخدام القيمة الأوسط للهدف (معامل نجمة الطاقة).
</p>

<p>
	لاحظ تقارب متوسط الخطأ المطلق لكل من <a href="https://machinelearningmastery.com/gentle-introduction-gradient-boosting-algorithm-machine-learning/" rel="external nofollow">نموذج الانحدار المعزز</a> MAE=10.013 ونموذج الغابة العشوائية MAE=10.014. قد لا تكون الموازنة في هذه المرحلة عادلةً بين النماذج لاسيما بالنسبة لنموذج آلة متجهة الدعم support vector machine لأننا تركنا القيم الافتراضية لمعاملات النماذج دون أي معايرة أو ضبط.
</p>

<h2>
	معايرة المعاملات الفائقة وصولا لنموذج أمثلي
</h2>

<p>
	يُمكن الوصول لنموذج أمثلي بمعايرة معاملاته الفائقة وفق معطيات المشروع. لنُبين أولًا <a href="https://machinelearningmastery.com/difference-between-a-parameter-and-a-hyperparameter/" rel="external nofollow">الفرق</a> بين المعاملات الفائقة لنموذج والمعاملات الأخرى له:
</p>

<ul>
	<li>
		المعاملات الفائقة hyperparameters: هي إعدادات خوارزمية التعلّم قبل التدريب (والتي وضعها مصممو الخوارزمية) مثل عدد الجيران في نموذج أقرب الجيران أو عدد الأشجار في نموذج الغابة العشوائية.
	</li>
	<li>
		المعاملات parameters: هي المعاملات التي يتعلّمها النموذج أثناء التدريب مثل أوزان نموذج الانحدار الخطي.
	</li>
</ul>

<p>
	تؤثر عملية معايرة المعاملات الفائقة على أداء النموذج لاسيما لجهة <a href="https://towardsdatascience.com/overfitting-vs-underfitting-a-conceptual-explanation-d94ee20ca7f9" rel="external nofollow">التوزان المطلوب</a> بين مشكلة قلة التخصيص underfitting ومشكلة فرط التخصيص overfitting، واللتان تؤديان إلى نموذج غير قادر على تعميم أمثلة التدريب، وبالتالي لن يتمكن من التنبؤ مع معطيات جديدة. ويُمكن العودة <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9-%D8%A7%D9%84%D8%AA%D8%AD%D8%AF%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%B1%D8%A6%D9%8A%D8%B3%D9%8A%D8%A9-%D9%88%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A7%D9%84%D8%AA%D9%88%D8%B3%D8%B9-%D9%81%D9%8A-%D8%A7%D9%84%D9%85%D8%AC%D8%A7%D9%84-r1010/" rel="">للرابط</a> من أكاديمية حسوب للمزيد من التفصيل حول هاتين المشكلتين.
</p>

<p>
	تظهر مشكلة قلة التخصيص عندما لا يكون للنموذج درجات حرية كافية ليتعلّم الربط بين الميزات والهدف، وبالتالي يكون له <a href="https://ae.wikinew.wiki/wiki/Bias%E2%80%93variance_tradeoff" rel="external nofollow">انحياز</a> كبير نحو قيم معينة للهدف. يُمكن تصحيح قلة التخصيص بجعل النموذج أكثر تعقيدًا، بينما تظهر مشكلة فرط التخصيص عندما يخزن النموذج بيانات التدريب، فيكون له بالتالي <a href="https://ae.wikinew.wiki/wiki/Bias%E2%80%93variance_tradeoff" rel="external nofollow">تباين</a> كبير، والذي يُمكن تصحيحه بالحد من تعقيد النموذج باستخدام التسوية regularization.
</p>

<p>
	تكمن المشكلة في معايرة المعاملات الفائقة بأن قيمها المثلى تختلف من مسألة لأخرى، وبالتالي تُعَد الطريقة الوحيدة للوصول لهذه القيم المثلى هي تجريب قيم مختلفة مع كل مجموعة بيانات تدريب جديدة.
</p>

<p>
	يحاول الكثيرون مثل مخبر <a href="https://epistasislab.github.io/tpot/" rel="external nofollow">Epistasis</a> الوصول للقيم المثلى باستخدام خوارزميات مناسبة مثل الخوارزميات الجينية، إذ يوفر Scikit-Learn لحسن الحظ العديد من الطرق لتقويم المعاملات الفائقة وبالتالي سنعتمد في مشروعنا عليها دون تعقيد الأمور أكثر.
</p>

<h3>
	البحث العشوائي مع التقييم المتقاطع
</h3>

<p>
	تُدعى الطريقة التي سنستخدمها في إيجاد القيم المثلى بالبحث العشوائي مع التقويم المتقاطع random search with cross validation:
</p>

<ul>
	<li>
		البحث العشوائي: نُعرّف شبكة grid من قيم المعاملات الفائقة، ومن ثم نختار تركيبات مختلفة منها عشوائيًا، أي أننا لا نختار كل التركيبات الممكنة مثل سلوك البحث الشبكي (يكون أداء البحث العشوائي لحسن الحظ قريب من البحث الشبكي مع تخفيض كبير في الزمن اللازم).
	</li>
	<li>
		التقييم المتقاطع: وهو الطريقة المستخدمة لتقويم مجموعة قيم محدّدة للمعاملات الفائقة، عوضًا عن تقسيم البيانات إلى بيانات للتدريب وبيانات للتقويم، مما يُخفّض من البيانات التي يُمكن لنا استخدامها للتدريب، كما نستخدم التقويم المتقاطع مع عدد محدّد من الحاويات K-Fold. إذ تُقسم بيانات التدريب إلى عدد K من الحاويات ومن ثم ننكرر ما يلي K مرة: في كل مرة ندرب النموذج مع بيانات K-1 حاوية، ومن ثم تقويمه مع بيانات الحاوية K. حيث يكون مقياس الأداء النهائي هو متوسط الخطأ لكل التكرارات.
	</li>
</ul>

<p>
	يوضح الشكل التالي فكرة التقويم المتقاطع من أجل K=5:
</p>

<p style="text-align: center;">
	<img alt="004K-Fold-Cross-Validation.png" class="ipsImage ipsImage_thumbnailed" data-fileid="81146" data-unique="6e54huevc" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2021_10/004K-Fold-Cross-Validation.png.3124b1ca3acea145549e95d565de0994.png">
</p>

<p>
	يُمكن تلخيص خطوات البحث العشوائي مع التقويم المتقاطع كما يلي:
</p>

<ol>
	<li>
		إعداد شبكة من المعاملات الفائقة.
	</li>
	<li>
		اختيار مجموعة عشوائية من تركيبات قيم المعاملات الفائقة.
	</li>
	<li>
		إنشاء نموذج مع قيم المعاملات المختارة.
	</li>
	<li>
		تقويم النموذج باستخدام التقويم المتقاطع.
	</li>
	<li>
		اختيار تركيب قيم المعاملات ذو الأداء الأفضل.
	</li>
</ol>

<p>
	لن نبرمج هذه الخطوات طبعًا لأن الكائن <code>RandomizedSearchCV</code> في Scikit-Learn ينجز كل ذلك.
</p>

<h3>
	طرق التعزيز المتدرج مرة أخرى
</h3>

<p>
	يُعدّ <a href="https://ar.wikipedia.org/wiki/%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85:Gaith120/%D8%AA%D8%B9%D8%B2%D9%8A%D8%B2_%D8%A7%D9%84%D8%AA%D8%AF%D8%B1%D8%AC" rel="external nofollow">نموذج الانحدار المعزز بالتدرج</a> Gradient Boosted Regression (المستخدم في حالتنا) من طرق المجموعات، بمعنىً أنه يدرب مجموعةً من المتدربين الضعفاء (أشجار قرار) تسلسليًا، وبحيث أن كل متدرب يستفيد من أخطاء المتدرب السابق، بخلاف نموذج الغابة العشوائية والذي يدرب مجموعةً من المتدربين الضعفاء على التوازي ومن ثم يتنبأ عن طريق الانتخاب بينهم.
</p>

<p>
	تصدرت طرقُ التعزيز طرقَ تعلّم الآلة في السنوات الأخيرة لاسيما بعد فوزها في العديد من مسابقات التعلّم، إذ تستخدم طريقة التعزيز المتدرجِ النزولَ المتدرجَ Gradient Descent لتخفيض تابع الكلفة عن طريق تدريب المتدربين واحدًا تلو الآخر، بحيث يستفيد كل متدرب من أخطاء المتدرب السابق.
</p>

<p>
	تسبق بعض المكتبات أداء المكتبة Scikit-Learn المستخدمة في مشروعنا مثل <a href="https://xgboost.readthedocs.io/en/latest/model.html" rel="external nofollow">XGBoost</a>، إلا أننا سنحافظ على استخدامها مع بياناتنا الصغيرة نسبيًا نظرًا لدقتها الواضحة.
</p>

<h3>
	معايرة المعاملات الفائقة في نموذج الانحدار المعزز بالتدريج
</h3>

<p>
	يُمكن العودة <a href="https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.GradientBoostingRegressor.html#sklearn.ensemble.GradientBoostingRegressor" rel="external nofollow">لتوثيق Scikit-Learn</a> لتفاصيل المعاملات الفائقة، والتي سنجد القيم الأمثل لها:
</p>

<ul>
	<li>
		<code>loss</code> تابع الخسارة والذي يجب تخفيضه.
	</li>
	<li>
		<code>n_estimators</code> عدد المتدربين الضعفاء (أشجار القرار).
	</li>
	<li>
		<code>max_depth</code> العمق الأعظم لشجرة القرار.
	</li>
	<li>
		<code>min_samples_leaf</code> العدد الأصغر للأمثلة في ورقة شجرة قرار.
	</li>
	<li>
		<code>min_samples_split</code> العدد الأصغر المطلوب لتقسيم عقدة في شجرة قرار.
	</li>
	<li>
		<code>max_features</code> العدد الأعظم للميزات المطلوب لتقسيم عقدة في شجرة قرار.
	</li>
</ul>

<p>
	قد لا نجد أحدًا يفهم كيفية تأثير هذه المعاملات على بعضها البعض، ولابدّ من التجريب للوصول إلى القيم المثلى لها.
</p>

<p>
	نبني في الشيفرة التالية شبكةً من قيم المعاملات الفائقة، حيث نُنشئ كائن <code>RandomizedSearchCV</code> ونبحث باستخدام 4 حاويات للتقويم المتقاطع مع 25 تركيبةً مختلفةً لقيم المعاملات الفائقة:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4939_21" style=""><span class="com"># تابع الخسارة المطلوب تخفيضه</span><span class="pln">
loss </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">'ls'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'lad'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'huber'</span><span class="pun">]</span><span class="pln">

</span><span class="com"># عدد أشجار القرار المستخدمة</span><span class="pln">
n_estimators </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">100</span><span class="pun">,</span><span class="pln"> </span><span class="lit">500</span><span class="pun">,</span><span class="pln"> </span><span class="lit">900</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1100</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1500</span><span class="pun">]</span><span class="pln">

</span><span class="com"># العمق الأعظم لكل شجرة</span><span class="pln">
max_depth </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">,</span><span class="pln"> </span><span class="lit">10</span><span class="pun">,</span><span class="pln"> </span><span class="lit">15</span><span class="pun">]</span><span class="pln">

</span><span class="com"># عدد الأمثلة الأصغر لكل ورقة</span><span class="pln">
min_samples_leaf </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4</span><span class="pun">,</span><span class="pln"> </span><span class="lit">6</span><span class="pun">,</span><span class="pln"> </span><span class="lit">8</span><span class="pun">]</span><span class="pln">

</span><span class="com"># عدد الأمثلة الأصغر لتقسيم عقدة</span><span class="pln">
min_samples_split </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4</span><span class="pun">,</span><span class="pln"> </span><span class="lit">6</span><span class="pun">,</span><span class="pln"> </span><span class="lit">10</span><span class="pun">]</span><span class="pln">

</span><span class="com"># العدد الأعظم للميزات المستخدمة لتقسيم عقدة</span><span class="pln">
max_features </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">'auto'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'sqrt'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'log2'</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">None</span><span class="pun">]</span><span class="pln">

</span><span class="com"># تعريف شبكة المعاملات الفائقة للبحث فيها</span><span class="pln">
hyperparameter_grid </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="str">'loss'</span><span class="pun">:</span><span class="pln"> loss</span><span class="pun">,</span><span class="pln">
                       </span><span class="str">'n_estimators'</span><span class="pun">:</span><span class="pln"> n_estimators</span><span class="pun">,</span><span class="pln">
                       </span><span class="str">'max_depth'</span><span class="pun">:</span><span class="pln"> max_depth</span><span class="pun">,</span><span class="pln">
                       </span><span class="str">'min_samples_leaf'</span><span class="pun">:</span><span class="pln"> min_samples_leaf</span><span class="pun">,</span><span class="pln">
                       </span><span class="str">'min_samples_split'</span><span class="pun">:</span><span class="pln"> min_samples_split</span><span class="pun">,</span><span class="pln">
                       </span><span class="str">'max_features'</span><span class="pun">:</span><span class="pln"> max_features</span><span class="pun">}</span><span class="pln">

</span><span class="com"># إنشاء نموذج معايرة المعاملات الفائقة</span><span class="pln">
model </span><span class="pun">=</span><span class="pln"> </span><span class="typ">GradientBoostingRegressor</span><span class="pun">(</span><span class="pln">random_state </span><span class="pun">=</span><span class="pln"> </span><span class="lit">42</span><span class="pun">)</span><span class="pln">

</span><span class="com"># إعداد البحث العشوائي مع 4 حاويات للتقويم المتقاطع</span><span class="pln">
random_cv </span><span class="pun">=</span><span class="pln"> </span><span class="typ">RandomizedSearchCV</span><span class="pun">(</span><span class="pln">estimator</span><span class="pun">=</span><span class="pln">model</span><span class="pun">,</span><span class="pln">
                               param_distributions</span><span class="pun">=</span><span class="pln">hyperparameter_grid</span><span class="pun">,</span><span class="pln">
                               cv</span><span class="pun">=</span><span class="lit">4</span><span class="pun">,</span><span class="pln"> n_iter</span><span class="pun">=</span><span class="lit">25</span><span class="pun">,</span><span class="pln"> 
                               scoring </span><span class="pun">=</span><span class="pln"> </span><span class="str">'neg_mean_absolute_error'</span><span class="pun">,</span><span class="pln">
                               n_jobs </span><span class="pun">=</span><span class="pln"> </span><span class="pun">-</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> verbose </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> 
                               return_train_score </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">True</span><span class="pun">,</span><span class="pln">
                               random_state</span><span class="pun">=</span><span class="lit">42</span><span class="pun">)</span><span class="pln">

</span><span class="com"># الملاءمة مع بيانات التدريب</span><span class="pln">
random_cv</span><span class="pun">.</span><span class="pln">fit</span><span class="pun">(</span><span class="pln">X</span><span class="pun">,</span><span class="pln"> y</span><span class="pun">)</span></pre>

<p>
	نعاين الكائن <code>RandomizedSearchCV</code> بعد الانتهاء من البحث لنعرف النموذج الأمثل:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4939_23" style=""><span class="com"># إيجاد أفضل تركيبة ممكنة من القيم </span><span class="pln">
random_cv</span><span class="pun">.</span><span class="pln">best_estimator_
</span><span class="typ">GradientBoostingRegressor</span><span class="pun">(</span><span class="pln">loss</span><span class="pun">=</span><span class="str">'lad'</span><span class="pun">,</span><span class="pln"> max_depth</span><span class="pun">=</span><span class="lit">5</span><span class="pun">,</span><span class="pln">
                          max_features</span><span class="pun">=</span><span class="kwd">None</span><span class="pun">,</span><span class="pln">
                 min_samples_leaf</span><span class="pun">=</span><span class="lit">6</span><span class="pun">,</span><span class="pln">
                          min_samples_split</span><span class="pun">=</span><span class="lit">6</span><span class="pun">,</span><span class="pln">
                          n_estimators</span><span class="pun">=</span><span class="lit">500</span><span class="pun">)</span></pre>

<p>
	يُمكن لنا استخدام هذه النتائج لإنجاز البحث الشبكي باستخدام معاملات للشبكة قريبة من هذه المعاملات المثلى. لن يؤدي المزيد من البحث والمعايرة إلى تحسين ملحوظ على الأرجح، وذلك لأن عملية هندسة الميزات التي عملنا عليها في البداية كان لها التأثير الأكبر في تحسين نتائج النموذج، إذ يطبق في الحقيقة أيضًا قانون تناقص العوائد <a href="https://picnet.com.au/blog/diminishing-returns-machine-learning-projects/" rel="external nofollow">law of diminishing</a> في تعلّم الآلة والذي يقول: لقد أعطت هندسة الميزات الأثر الأكبر في تحسين النموذج ولن تؤدي معايرة المعاملات الفائقة إلا للقليل من التحسن.
</p>

<p>
	يُمكن تجربة تغيير عدد المتدربين مثلًا (أشجار القرار)، مع الحفاظ على بقية قيم المعاملات الفائقة ثابتةً مما يسمح لنا بمعاينة تأثير هذا المعامل. يُمكن الاطلاع على <a href="https://github.com/WillKoehrsen/machine-learning-project-walkthrough/blob/master/Machine%20Learning%20Project%20Part%202.ipynb" rel="external nofollow">الشيفرة</a> الموافقة والتي تعطي النتائج التالية:
</p>

<p style="text-align: center;">
	<img alt="005PerformanceVsTrees.png" class="ipsImage ipsImage_thumbnailed" data-fileid="81148" data-unique="vzrctengw" style="" src="https://academy.hsoub.com/uploads/monthly_2021_10/005PerformanceVsTrees.png.a1e135ac6aa2056168f817e3be6fe469.png">
</p>

<p>
	لاحظ أنه كلما ازداد عدد الأشجار يقل الخطأ سواءً في بيانات التدريب أو في بيانات الاختبار، كما يتناقص الخطأ في التدريب بسرعة أكبر من الخطأ في الاختبار. لكن يبدو أن نموذجنا ذو فرط تخصيص overfitting، حيث أن له أداءً ممتازًا مع بيانات التدريب لا يصل له مع بيانات الاختبار.
</p>

<p>
	نتوقع دائمًا بعض الانخفاض في الأداء مع بيانات الاختبار عن بيانات التدريب (لا تنسى أن النموذج يرى كل بيانات التدريب)، لكن وجود فارق كبير في الأداء بين التدريب والاختبار يعني مشكلة فرط التخصيص، والتي يُمكن حلها بزيادة بيانات التدريب أو تخفيض تعقيد النموذج عبر المعاملات الفائقة. نحافظ على قيم المعاملات الفائقة كما هي ونترك للقارئ محاولة البحث عن حل لمشكلة فرط التخصيص.
</p>

<p>
	نعتمد من أجل النموذج النهائي القيمة 800 لمعامل عدد الأشجار لأنها تُعطي أقل خطأ نتيجة التقويم المتقاطع.
</p>

<h2>
	التقويم باستخدام بيانات الاختبار
</h2>

<p>
	سنستخدم بيانات الاختبار والتي أخفيناها تمامًا عن نموذج التعلّم أثناء مرحلة التدريب، إذ سيُعطي اختبار النموذج طبعًا مع هذه البيانات مؤشرًا لأداء النموذج مع البيانات الحقيقية لاحقًا.
</p>

<p>
	تحسب الشيفرة التالية متوسط الخطأ المطلق (معيار الأداء) لكل من النموذج الأولي والنموذج النهائي الذي حصلنا عليه بعد معايرة المعاملات الفائقة:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4939_26" style=""><span class="com"># التنبؤ باستخدام النموذج الأولي والنهائي</span><span class="pln">
default_pred </span><span class="pun">=</span><span class="pln"> default_model</span><span class="pun">.</span><span class="pln">predict</span><span class="pun">(</span><span class="pln">X_test</span><span class="pun">)</span><span class="pln">
final_pred </span><span class="pun">=</span><span class="pln"> final_model</span><span class="pun">.</span><span class="pln">predict</span><span class="pun">(</span><span class="pln">X_test</span><span class="pun">)</span><span class="pln">

</span><span class="typ">Default</span><span class="pln"> model performance on the test set</span><span class="pun">:</span><span class="pln"> MAE </span><span class="pun">=</span><span class="pln"> </span><span class="lit">10.0118</span><span class="pun">.</span><span class="pln">
</span><span class="typ">Final</span><span class="pln"> model performance on the test set</span><span class="pun">:</span><span class="pln">   MAE </span><span class="pun">=</span><span class="pln"> </span><span class="lit">9.0446</span><span class="pun">.</span></pre>

<p>
	أدت معايرة المعاملات الفائقة إلى تحسين الأداء بنسبة 10% تقريبًا وهي نسبة قد تكون مهمةً في التطبيقات الحقيقية رغم الوقت الذي خصصناه لتنفيذها.
</p>

<p>
	يُمكن معايرة الوقت الذي يستغرقه تدريب النموذج باستخدام التعليمة السحرية <code>‎%timeit</code> في محيط التطوير المستخدم Jupyter Notebooks:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4939_28" style=""><span class="pun">%%</span><span class="pln">timeit </span><span class="pun">-</span><span class="pln">n </span><span class="lit">1</span><span class="pln"> </span><span class="pun">-</span><span class="pln">r </span><span class="lit">5</span><span class="pln">
default_model</span><span class="pun">.</span><span class="pln">fit</span><span class="pun">(</span><span class="pln">X</span><span class="pun">,</span><span class="pln"> y</span><span class="pun">)</span></pre>

<p>
	ويكون ناتج الشيفرة مثلًا:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4939_32" style=""><span class="lit">1.09</span><span class="pln"> s </span><span class="pun">±</span><span class="pln"> </span><span class="lit">153</span><span class="pln"> ms per loop </span><span class="pun">(</span><span class="pln">mean </span><span class="pun">±</span><span class="pln"> std</span><span class="pun">.</span><span class="pln"> dev</span><span class="pun">.</span><span class="pln"> of </span><span class="lit">5</span><span class="pln"> runs</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> loop each</span><span class="pun">)</span></pre>

<p>
	تُظهر النتيجة أن تدريب النموذج الأولي يحتاج لحوالي ثانية واحدة فقط وهو زمن معقول جدًا؛ أما النموذج النهائي فهو ليس بهذه السرعة إذ يستغرق حوالي 12 ثانيةً:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4939_34" style=""><span class="pun">%%</span><span class="pln">timeit </span><span class="pun">-</span><span class="pln">n </span><span class="lit">1</span><span class="pln"> </span><span class="pun">-</span><span class="pln">r </span><span class="lit">5</span><span class="pln">
final_model</span><span class="pun">.</span><span class="pln">fit</span><span class="pun">(</span><span class="pln">X</span><span class="pun">,</span><span class="pln"> y</span><span class="pun">)</span></pre>

<p>
	حيث يكون ناتج الشيفرة مثلًا:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4939_36" style=""><span class="lit">12.1</span><span class="pln"> s </span><span class="pun">±</span><span class="pln"> </span><span class="lit">1.33</span><span class="pln"> s per loop </span><span class="pun">(</span><span class="pln">mean </span><span class="pun">±</span><span class="pln"> std</span><span class="pun">.</span><span class="pln"> dev</span><span class="pun">.</span><span class="pln"> of </span><span class="lit">5</span><span class="pln"> runs</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> loop each</span><span class="pun">)</span></pre>

<p>
	يُعزز ذلك مبدأ المقايضة trade-offs العام في تعلّم الآلة، إذ نسعى دومًا لمقايضة الدقة مع قابلية التفسير و<a href="https://machinelearningmastery.com/gentle-introduction-to-the-bias-variance-trade-off-in-machine-learning/" rel="external nofollow">انحراف النتائج مع تباينها</a>، والدقة مع زمن التنفيذ وغيرها. ربما يبدو 12 ضعفًا رقمًا كبيرًا نسبيًا إلا أنه ليس بهذا السوء مطلقًا.
</p>

<p>
	يُمكننا الآن وبعد حصولنا على التنبؤات النهائية فحص فيما إذا يوجد أي انحراف أو مشكلة ما فيها. يُبين الشكل التالي (على اليسار) مخطط الكثافة لتوقعات النموذج (الأزرق) مع القيم الحقيقية (الأحمر)؛ أما على اليمين فيَظهر المدرج التكراري لقيمة الخطأ المرتكب.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="81149" href="https://academy.hsoub.com/uploads/monthly_2021_10/006DensityPlot.png.75c5caa359c06bbe88c7cd3b30c12425.png" rel="" data-fileext="png"><img alt="006DensityPlot.png" class="ipsImage ipsImage_thumbnailed" data-fileid="81149" data-unique="a9fttsqu3" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2021_10/006DensityPlot.thumb.png.9065dab67577d2ea133c5c202ba3178a.png"></a>
</p>

<p>
	يُبين مخطط الكثافة أن توقعات النموذج تتبع تقريبًا توزع القيم الحقيقية على الرغم من أن قمة كثافة التوقعات قريبة من القيمة الأوسط لقيم التدريب (66)، بينما تكون قمة كثافة القيم الحقيقية أقرب للقيمة العظمى (100)؛ أما المدرج التكراري فيُظهر توزعًا طبيعيًا تقريبًا للخطأ المرتكب مع ملاحظة وجود قيم سالبة للخطأ مما يعني توقعات أقل من الحقيقة. كما سنُلقي في المقالة التالية ضوءًا أكبر على النتائج.
</p>
<div class="banner-container ipsBox ipsPadding">
	<div class="inner-banner-container">
		<p class="banner-heading">
			دورة الذكاء الاصطناعي
		</p>

		<p class="banner-subtitle">
			احترف برمجة الذكاء الاصطناعي AI وتحليل البيانات وتعلم كافة المعلومات التي تحتاجها لبناء نماذج ذكاء اصطناعي متخصصة.
		</p>

		<div>
			<a class="ipsButton ipsButton_large ipsButton_primary ipsButton_important" href="https://academy.hsoub.com/learn/artificial-intelligence" rel="">اشترك الآن</a>
		</div>
	</div>

	<div class="banner-img">
		<a href="https://academy.hsoub.com/learn/artificial-intelligence" rel=""><img alt="دورة الذكاء الاصطناعي AI" src="https://academy.hsoub.com/learn/assets/images/courses/artificial-intelligence.png"></a>
	</div>
</div>
<h2>
	النتائج
</h2>

<p>
	تابعنا في هذه المقالة استعراض العديد من الخطوات في معالجة مسألة تعلّم الآلة:
</p>

<ul>
	<li>
		احتساب القيم الناقصة وتحجيم الميزات.
	</li>
	<li>
		تقويم وموازنة عدة نماذج تعلّم.
	</li>
	<li>
		معايرة المعاملات الفائقة باستخدام البحث العشوائي الشبكي والتقويم المتقاطع.
	</li>
	<li>
		تقويم النموذج الأفضل مع بيانات الاختبار.
	</li>
</ul>

<p>
	تُبرهن النتائج على إمكانية استخدام البيانات المتوفرة لبناء نموذج تعلّم الآلة بهدف توقع معامل نجمة الطاقة للمباني، إذ يتنبأ نموذج التعلّم من نمط الانحدار المعزز بالتدرج بمعامل نجمة الطاقة مع خطأ من مرتبة 9.1 نقطةً بالنسبة للقيمة الحقيقية في بيانات الاختبار. وقد ساعدت عملية معايرة المعاملات الفائقة رغم الوقت المستغرق لإنجازنا لها لتحسين أداء النموذج، وهي واحدة من المقايضات التي ننجزها في مسائل تعلّم الآلة.
</p>

<p>
	سنحاول في <a href="https://academy.hsoub.com/programming/python/%D8%AE%D8%B7%D9%88%D8%A7%D8%AA-%D8%AA%D9%86%D9%81%D9%8A%D8%B0-%D9%85%D8%B4%D8%B1%D9%88%D8%B9-%D8%B9%D9%86-%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9-%D9%81%D9%8A-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-%D8%A7%D9%84%D8%AC%D8%B2%D8%A1-%D8%A7%D9%84%D8%AB%D8%A7%D9%84%D8%AB-r1359/" rel="">المقالة التالية</a> فهم النموذج المتعلّم الدقيق الذي توصلنا له أكثر لاسيما آلية قيامه بالتنبؤات، كما سنحاول تحديد العوامل المؤثرة في معامل نجمة الطاقة. فمع العلم بأن النموذج المتعلّم الذي توصلنا إليه يبدو دقيقًا، إلا أننا نريد أن نفهم آلية وصوله لنتائجه.
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://towardsdatascience.com/a-complete-machine-learning-project-walk-through-in-python-part-two-300f1f8147e2" rel="external nofollow">A Complete Machine Learning Project Walk-Through in Python: Part Two</a> لكاتبه Will Koehrsen.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/programming/python/%D8%AF%D9%88%D8%A7%D9%84-%D8%A7%D9%84%D9%83%D8%AB%D8%A7%D9%81%D8%A9-%D8%A7%D9%84%D8%A7%D8%AD%D8%AA%D9%85%D8%A7%D9%84%D9%8A%D8%A9-%D9%81%D9%8A-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-r1335/" rel="">دوال الكثافة الاحتمالية في بايثون</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/python/%D8%A7%D9%84%D9%85%D8%B1%D8%AC%D8%B9-%D8%A7%D9%84%D8%B4%D8%A7%D9%85%D9%84-%D8%A5%D9%84%D9%89-%D8%AA%D8%B9%D9%84%D9%85-%D9%84%D8%BA%D8%A9-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-r735/" rel="">المرجع الشامل إلى تعلم لغة بايثون</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1358</guid><pubDate>Fri, 15 Oct 2021 15:00:00 +0000</pubDate></item><item><title>&#x62E;&#x637;&#x648;&#x627;&#x62A; &#x62A;&#x646;&#x641;&#x64A;&#x630; &#x645;&#x634;&#x631;&#x648;&#x639; &#x639;&#x646; &#x62A;&#x639;&#x644;&#x645; &#x627;&#x644;&#x622;&#x644;&#x629; &#x641;&#x64A; &#x628;&#x627;&#x64A;&#x62B;&#x648;&#x646;: &#x627;&#x644;&#x62C;&#x632;&#x621; &#x627;&#x644;&#x623;&#x648;&#x644;</title><link>https://academy.hsoub.com/programming/artificial-intelligence/%D8%AE%D8%B7%D9%88%D8%A7%D8%AA-%D8%AA%D9%86%D9%81%D9%8A%D8%B0-%D9%85%D8%B4%D8%B1%D9%88%D8%B9-%D8%B9%D9%86-%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9-%D9%81%D9%8A-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-%D8%A7%D9%84%D8%AC%D8%B2%D8%A1-%D8%A7%D9%84%D8%A3%D9%88%D9%84-r1357/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2021_10/617a71f331989_--------.png.7751474ef134dd3ffa3cd1f0c7701341.png" /></p>
<p>
	قد تظن عندما تتابع دورةً تدريبيةً أو تقرأ كتابًا في <a href="https://academy.hsoub.com/programming/general/%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA/" rel="">علم البيانات</a>، أنك تملكت من المطلوب لتنفيذ مشروعًا كاملًا في تعلّم الآلة، لكن لن تكون لديك الخبرة الكافية بالضرورة لتكامل جميع أجزاء ومراحل تطوير نظام تعلّم آلة لحل مسألة حقيقية على أرض الواقع. ربما يُشكّل تنفيذك المشروع الأول تحديًا كبيرًا لكن إتمامك له بنجاح سيمنحك الثقة والخبرة اللازمتين لتنفيذ مشاريع لاحقة بعدها. تعرض هذه السلسلة من المقالات آلية تسلسل خطوات معالجة مسائل تعلّم الآلة عبر القيام بتنفيذ مشروع متكامل مع بيانات حقيقية.
</p>

<p>
	نعمل وفق المنهجية العامة المتبعة عادةً في مسائل تعلّم الآلة خطوةً بخطوة وفق ما يلي:
</p>

<ol>
	<li>
		تنظيف البيانات وتنسيقها.
	</li>
	<li>
		استكشاف وتحليل البيانات.
	</li>
	<li>
		هندسة الميزات واختيار المناسب منها.
	</li>
	<li>
		اعتماد مقاييس الأداء وموازنة نماذج التعلّم وفقها.
	</li>
	<li>
		ضبط قيم المعاملات الفائقة لنموذج التعلّم الأفضل.
	</li>
	<li>
		تقويم النموذج الأفضل باستخدام مجموعة بيانات الاختبار.
	</li>
	<li>
		تفسير وشرح نتائج النموذج.
	</li>
	<li>
		عرض الاستنتاجات وتوثيق العمل.
	</li>
</ol>

<p>
	نُنفذ فيما يلي كل خطوة من الخطوات السابقة مع بيان تكامل كل خطوة مع الخطوة التالية لها، حيث نعرض في هذه المقالة الخطوات الثلاث الأولى ونتابع في مقالات لاحقة الخطوات المتبقية، ويُمكن الحصول على الشيفرة الكاملة للمشروع من <a href="https://github.com/WillKoehrsen/machine-learning-project-walkthrough" rel="external nofollow">هذا المستودع</a>.
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p data-gramm="false">
		نفذّ كاتب المقال هذا المشروع بصفة اختبار قبول لوظيفة في شركة ناشئة، وأُسندت الوظيفة الشاغرة له بالنتيجة، إلا أن المدير التنفيذي للشركة استقال ولم تتابع الشركة الناشئة العمل. ويبدو أن الأمور تجري هكذا في الشركات الناشئة.
	</p>
</blockquote>

<h2>
	تعريف المسألة
</h2>

<p>
	قبل البدء بالعمل البرمجي لابدّ من فهم المسألة ومعاينة <a href="https://www1.nyc.gov/html/gbee/html/plan/ll84_scores.shtml" rel="external nofollow">البيانات المتاحة</a>. نحلل في هذا المشروع ومعالجة بيانات الطاقة لمدينة نيويورك والمنشورة للعموم.
</p>

<p>
	يهدف المشروع إلى تحليل بيانات الطاقة للوصول إلى نموذج متعلّم يُمكنه التنبؤ بمعامل نجمة الطاقة Energy Star Score الذي يعتمده برنامج <a href="https://ar.wikipedia.org/wiki/%D9%86%D8%AC%D9%85%D8%A9_%D8%A7%D9%84%D8%B7%D8%A7%D9%82%D8%A9" rel="external nofollow">نجمة الطاقة</a> وهو برنامج تديره وكالة حماية البيئة الأمريكية ووزارة الطاقة الأمريكية لتعزيز كفاءة الطاقة. كما يجب في النهاية تفسير النتائج لمعرفة العوامل التي يُمكنها التأثير في هذا المعامل.
</p>

<p>
	تحوي البيانات المتاحة قيم معامل نجمة الطاقة، مما يعني أن المسألة المطروحة هي مسألة تعلّم آلة من نمط <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D9%84%D9%85%D9%81%D8%A7%D9%87%D9%8A%D9%85-%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A9-%D9%84%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9-r1009/" rel="">موجه عبر الانحدار</a> supervised regression machine learning:
</p>

<ul>
	<li>
		تعليم موجه Supervised: تحوي البيانات المتاحة الميزات والنتيجة معًا، لذلك تدريب نموذج يتعلّم الربط بين هذه الميزات والنتيجة هو المطلوب في هذا النمط.
	</li>
	<li>
		عبر الانحدار Regression: لأن المعامل المطلوب هو قيمة رقمية حقيقية.
	</li>
</ul>

<p>
	نهدف إلى بناء نموذج تعلّم دقيق يُمكنه التنبؤ بقيمة قريبة من القيمة الحقيقية لمعامل نجمة الطاقة، ويجب أن تكون نتائج النموذج المبني قابلةً للتفسير والفهم أيضًا. توجّه هذه الأهداف قراراتنا المتخَذة لاحقًا أثناء تحليلنا البيانات وبناء النموذج.
</p>

<h2>
	تنظيف البيانات
</h2>

<p>
	تُعَد عمليات تنظيف البيانات وتنسيقها في البداية من العمليات الأساسية، إذ أن بيانات العالم الحقيقة غالبًا ما تكون ناقصةً وتحوي العديد من القيم المتطرفة (بخلاف مجموعات بيانات التدريب المُعدّة لأهداف تعليمية مثل <a href="https://stat.ethz.ch/R-manual/R-devel/library/datasets/html/mtcars.html" rel="external nofollow">mtcars</a> و<a href="https://archive.ics.uci.edu/ml/datasets/iris" rel="external nofollow">iris</a>). حيث تكون بيانات العالم الحقيقية في فوضى كبيرة، مما يستلزم تنظيفها وإعادة تشكيلها قبل البدء بتحليلها. قد تبدو مهمة تنظيف البيانات غير ممتعة إلا أنها ضرورية في جميع مسائل العالم الحقيقي.
</p>

<p>
	نبدأ أولًا بتحميل البيانات ضمن إطار من البيانات <code>DataFrame</code> من مكتبة Pandas ومن ثم عرضها:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3963_7" style=""><span class="kwd">import</span><span class="pln"> pandas </span><span class="kwd">as</span><span class="pln"> pd
</span><span class="kwd">import</span><span class="pln"> numpy </span><span class="kwd">as</span><span class="pln"> np

</span><span class="com"># قراءة البيانات وتحميلها ضمن إطار من البيانات</span><span class="pln">
data </span><span class="pun">=</span><span class="pln"> pd</span><span class="pun">.</span><span class="pln">read_csv</span><span class="pun">(</span><span class="str">'data/Energy_and_Water_Data_Disclosure_for_Local_Law_84_2017__Data_for_Calendar_Year_2016_.csv'</span><span class="pun">)</span><span class="pln">

</span><span class="com"># إظهار الجزء الأعلى من إطار البيانات</span><span class="pln">
data</span><span class="pun">.</span><span class="pln">head</span><span class="pun">()</span></pre>

<p>
	يظهر لنا أولًا:
</p>

<p style="text-align: center;">
	<img alt="002What Actual Data Looks Like!.png" class="ipsImage ipsImage_thumbnailed" data-fileid="81102" data-unique="srl8hcoco" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2021_10/617a71f15e580_002WhatActualDataLooksLike!.png.66cb9f7ef481a47fd223505e72656625.png">
</p>

<p>
	يُظهِر الشكل مجموعةً جزئيةً من البيانات والتي تحوي 60 عمودًا، مما يطرح المسألة الأولى التالية: نريد التنبؤ بمعامل نجمة الطاقة <a href="https://www.energystar.gov/buildings/benchmark/analyze_benchmarking_results" rel="external nofollow"> </a><a href="https://www.energystar.gov/buildings/benchmark/analyze_benchmarking_results" rel="external nofollow">Energy Star Score</a>، إلا أننا لا نعرف أي عمود من الأعمدة يوافق هذا المعامل. قد تكون عدم معرفة معاني الأعمدة في بعض المسائل غير مهمة ويُمكن بناء نماذج دقيقة إلا أنه في حالتنا، وبما أن المطلوب تفسير النتائج فيجب فهم معاني بعض الأعمدة على الأقل.
</p>

<p>
	لم يُرد كاتب المقال عندما كُلّف بالعمل على هذا المشروع، سؤال أحد عن معاني الأعمدة، إلا أنه عندما تمعن في اسم الملف:
</p>

<p style="text-align: center;">
	<img alt="004FileName.png" class="ipsImage ipsImage_thumbnailed" data-fileid="81104" data-unique="is6sthnlj" src="https://academy.hsoub.com/uploads/monthly_2021_10/004FileName.png.2956c0e5f8a7934cd6ed82d550c46e75.png">
</p>

<p>
	قرر البحث عن القانون المدعو بـ Local Law 84، مما قاده إلى هذه <a href="https://www1.nyc.gov/site/buildings/business/compliance-instructions.page" rel="external nofollow">الصفحة</a> التي تفرض على جميع مباني مدينة نيويورك اعتبارًا من حجم معين، تقديم تقرير عن استهلاك الطاقة فيها. وبمزيد من البحث توصل إلى <a href="http://www.nyc.gov/html/gbee/downloads/misc/nyc_benchmarking_disclosure_data_definitions_2017.pdf" rel="external nofollow">تعريفات جميع الأعمدة</a>.
</p>

<p>
	يجب بدء العمل بتأن وروية دائمًا وعدم نسيان أي أمر قد يكون هامًا مثل معاينة اسم الملف، إذ لا نحتاج عمليًا لدراسة جميع الأعمدة، إلا أنه يجب أن نفهم معامل نجمة الطاقة والموصّف على أساس نسبة مئوية (رقم صحيح بين 1 و100) لتقييم استهلاك الطاقة في سنة معينة، والذي يُقدّر لكل بناء في مدينة نيويورك، وهو مقياس نسبي يُستخدم لموازنة كفاءة الطاقة في المباني.
</p>

<p>
	بعد حل المسألة الأولى نلتفت إلى المسألة الثانية وهي مشكلة القيم الناقصة، إذ تحوي البيانات المتاحة عبارة <em>غير متوفر Not Available</em> في الكثير من الخلايا التي لا تُعرَف قيمتها، ستُجبِر هذه القيمة النصية بايثون على تخزين العمود (ولو كان عمودًا رقميًا) كائن مثلًا object وذلك لأن مكتبة Pandas تعد جميع قيم العمود نصية بمجرد وجود قيمة نصية واحدة ضمن هذا العمود، ويُمكن معاينة نوع بيانات الأعمدة باستخدام طريقة إطار البيانات <code>dataframe.info</code>:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3963_10" style=""><span class="com"># معاينة بيانات الأعمدة والقيم غير الناقصة</span><span class="pln">
data</span><span class="pun">.</span><span class="pln">info</span><span class="pun">()</span></pre>

<p>
	ويكون الناتج:
</p>

<p style="text-align: center;">
	<img alt="003ColumnsDataTypes.png" class="ipsImage ipsImage_thumbnailed" data-fileid="81103" data-unique="c5jv87vsk" src="https://academy.hsoub.com/uploads/monthly_2021_10/003ColumnsDataTypes.png.c36ea283fa507f83904dea6b406bdca3.png">
</p>

<p>
	تُخزّن الكثير من الأعمدة الرقمية مثل كائن object مشابه للمساحة بالأقدام المربعة <code>ft<sup>2</sup></code>، مما يستلزم تحويلها إلى رقم حقيقي float كي نستطيع إنجاز عمليات التحليل المطلوبة والتي لا يُمكن تطبيقها على السلاسل النصية.
</p>

<p>
	سنعرض فيما يلي شيفرة بايثون التي تحول السلسلة النصية <em>Not Available</em> إلى القيمة <code>np.nan</code> "ليس رقمًا" not a number والتي يُمكن معاملتها مثل الأرقام ومن ثم تحويل العمود الموافق إلى نمط البيانات عدد حقيقي <code>float</code>:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3963_13" style=""><span class="com"># استبدال القيم الناقصة </span><span class="pln">
data </span><span class="pun">=</span><span class="pln"> data</span><span class="pun">.</span><span class="pln">replace</span><span class="pun">({</span><span class="str">'Not Available'</span><span class="pun">:</span><span class="pln"> np</span><span class="pun">.</span><span class="pln">nan</span><span class="pun">})</span><span class="pln">

</span><span class="com"># المرور على الأعمدة عمودًا عمودًا</span><span class="pln">
</span><span class="kwd">for</span><span class="pln"> col </span><span class="kwd">in</span><span class="pln"> list</span><span class="pun">(</span><span class="pln">data</span><span class="pun">.</span><span class="pln">columns</span><span class="pun">):</span><span class="pln">
    </span><span class="com"># اختيار الأعمدة التي يجب أن تكون رقميةً</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="str">'ft²'</span><span class="pln"> </span><span class="kwd">in</span><span class="pln"> col </span><span class="kwd">or</span><span class="pln"> </span><span class="str">'kBtu'</span><span class="pln"> </span><span class="kwd">in</span><span class="pln"> col </span><span class="kwd">or</span><span class="pln"> </span><span class="str">'Metric Tons CO2e'</span><span class="pln"> </span><span class="kwd">in</span><span class="pln"> col </span><span class="kwd">or</span><span class="pln"> </span><span class="str">'kWh'</span><span class="pln"> </span><span class="kwd">in</span><span class="pln"> 
        col </span><span class="kwd">or</span><span class="pln"> </span><span class="str">'therms'</span><span class="pln"> </span><span class="kwd">in</span><span class="pln"> col </span><span class="kwd">or</span><span class="pln"> </span><span class="str">'gal'</span><span class="pln"> </span><span class="kwd">in</span><span class="pln"> col </span><span class="kwd">or</span><span class="pln"> </span><span class="str">'Score'</span><span class="pln"> </span><span class="kwd">in</span><span class="pln"> col</span><span class="pun">):</span><span class="pln">
        </span><span class="com"># تحويل نمط البيانات إلى عدد</span><span class="pln">
        data</span><span class="pun">[</span><span class="pln">col</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> data</span><span class="pun">[</span><span class="pln">col</span><span class="pun">].</span><span class="pln">astype</span><span class="pun">(</span><span class="pln">float</span><span class="pun">)</span></pre>

<p>
	بعد الانتهاء من تعديل الأعمدة المناسبة إلى أرقام، ننتقل لمعاينة البيانات.
</p>

<h2>
	البيانات الناقصة والمتطرفة
</h2>

<p>
	من المشاكل الشائعة أيضًا وجود العديد من القيم الناقصة في البيانات لأسباب عديدة. يجب حذف هذه القيم أو إيجاد طريقة لملئها بقيم متوقعة قبل بناء نموذج التعلّم، لنبدأ أولًا بتحديد حجم هذه المشكلة لكل عمود (يُمكن العودة لرابط <a href="https://github.com/WillKoehrsen/machine-learning-project-walkthrough/blo" rel="external nofollow">المشروع</a> من أجل الحصول على الشيفرة).
</p>

<p>
	نُظهر الجدول التالي والذي يحسب نسبة القيم الناقصة لكل عمود باستخدام الشيفرة الموجودة في <a href="https://stackoverflow.com/questions/26266362/how-to-count-the-nan-values-in-a-column-in-pandas-dataframe/39734251#39734251" rel="external nofollow">هذا السؤال من موقع Stack Overflow</a>.
</p>

<p style="text-align: center;">
	<img alt="006MissedData.png" class="ipsImage ipsImage_thumbnailed" data-fileid="81107" data-unique="jarlok2dn" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2021_10/006MissedData.png.6bc2cb4e473048187e44b93c97f6696e.png">
</p>

<p>
	يجب توخي الحذر عند حذف عمود يحوي نسبةً كبيرةً من القيم الناقصة إذ قد يكون مفيدًا لنموذج التعلّم المطلوب. تعتمد العتبة والتي من فوقها نحذف العمود على المسألة المطروحة (تجد في هذا <a href="https://discuss.analyticsvidhya.com/t/what-should-be-the-allowed-percentage-of-missing-values/2456" rel="external nofollow">الرابط</a> مناقشة لمسألة العتبة) وفي مشروعنا سنحذف أي عمود يحوي أكثر من 50% قيمًا ناقصةً.
</p>

<p>
	نحذف القيم المتطرفة أيضًا في هذه المرحلة والتي يُمكن أن تظهر في البيانات نتيجة أخطاء طباعية أو أخطاء في الوحدات units المستخدمة، لكن يجب الملاحظة أنها في بعض الأحيان قد تكون صحيحةً إلا أنها بعيدةً كثيرًا عن باقي القيم. سنحذف القيم بالاعتماد على <a href="https://www.itl.nist.gov/div898/handbook/prc/section1/prc16.htm" rel="external nofollow">تعريف القيم المتطرفة البعيدة</a> التالي:
</p>

<ul>
	<li>
		أقل من الربع الأول – 3 * <a href="https://ar.wikipedia.org/wiki/%D8%A7%D9%86%D8%AD%D8%B1%D8%A7%D9%81_%D8%B1%D8%A8%D9%8A%D8%B9%D9%8A" rel="external nofollow">الانحراف الربيعي</a>.
	</li>
	<li>
		فوق الربع الثالث + 3 * الانحراف الربيعي.
	</li>
</ul>

<p>
	يُمكن العودة <a href="https://github.com/WillKoehrsen/machine-learning-project-walkthrough/blob/master/Machine%20Learning%20Project%20Part%201.ipynb" rel="external nofollow">للمشروع </a>للاطلاع على شيفرة حذف الأعمدة والقيم المتطرفة.
</p>

<p>
	في نهاية هذه المرحلة، بقي لدينا أكثر من 11000 مبنىً مع 49 ميزةً.
</p>

<h2>
	تحليل البيانات الاستكشافي
</h2>

<p>
	بعد الانتهاء من المرحلة السابقة الضرورية جدًا رغم صعوبتها بعض الشيء، يُمكن لنا الانتقال إلى مرحلة تحليل البيانات الاستكشافي، والذي نعني به تطبيق بعض الحسابات الاحصائية ورسم بعض المخططات بهدف إيجاد الاتجاهات العامة trends والمتطرفات anomalies والأنماط patterns والعلاقات relationships الموجودة ضمن البيانات. وباختصار يُعدّ الهدف من هذه المرحلة هو استكشاف المعلومات المُضمّنة في البيانات والتي يُمكن لها لعب دورًا مهمًا في توجيه خياراتنا عند بناء نماذج التعلّم، مثلًا: من هي الميزات الأكثر ارتباطًا مع الهدف؟
</p>

<p>
	نعمل عادةً هذه الخطوة بشكل تدريجي، أي نبدأ من نظرة عامة كلية قد تقودنا في بعض الأحيان إلى التركيز على بيانات محدّدة معينة.
</p>

<h3>
	رسم متغير وحيد
</h3>

<p>
	هدفنا التنبؤ بمعامل نجمة الطاقة (ندعوه 'score' في بياناتنا)، لذلك من الطبيعي البدء باستكشاف توزع هذا المعامل، وبالطبع فأسهل شيء يُمكن اللجوء له هو رسم <a href="https://ar.wikipedia.org/wiki/%D9%85%D8%AF%D8%B1%D8%AC_%D8%AA%D9%83%D8%B1%D8%A7%D8%B1%D9%8A" rel="external nofollow">المدرج التكراري</a> Histogram، والذي يسمح بمعاينة توزع متغير لاسيما أنه يُمكن إنجاز ذلك بسهولة باستخدام المكتبة <code>matplotlib</code> كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3963_18" style=""><span class="kwd">import</span><span class="pln"> matplotlib</span><span class="pun">.</span><span class="pln">pyplot </span><span class="kwd">as</span><span class="pln"> plt

</span><span class="com"># المدرج التكراري لمعامل نجمة الطاقة</span><span class="pln">
plt</span><span class="pun">.</span><span class="pln">style</span><span class="pun">.</span><span class="pln">use</span><span class="pun">(</span><span class="str">'fivethirtyeight'</span><span class="pun">)</span><span class="pln">
plt</span><span class="pun">.</span><span class="pln">hist</span><span class="pun">(</span><span class="pln">data</span><span class="pun">[</span><span class="str">'score'</span><span class="pun">].</span><span class="pln">dropna</span><span class="pun">(),</span><span class="pln"> bins </span><span class="pun">=</span><span class="pln"> </span><span class="lit">100</span><span class="pun">,</span><span class="pln"> edgecolor </span><span class="pun">=</span><span class="pln"> </span><span class="str">'k'</span><span class="pun">)</span><span class="pln">
plt</span><span class="pun">.</span><span class="pln">xlabel</span><span class="pun">(</span><span class="str">'Score'</span><span class="pun">);</span><span class="pln"> plt</span><span class="pun">.</span><span class="pln">ylabel</span><span class="pun">(</span><span class="str">'Number of Buildings'</span><span class="pun">)</span><span class="pln">
plt</span><span class="pun">.</span><span class="pln">title</span><span class="pun">(</span><span class="str">'Energy Star Score Distribution'</span><span class="pun">)</span></pre>

<p>
	ويكون الناتج ما يلي:
</p>

<p style="text-align: center;">
	<img alt="005EnergyDistribution.png" class="ipsImage ipsImage_thumbnailed" data-fileid="110178" data-unique="3n87h974p" src="https://academy.hsoub.com/uploads/monthly_2022_10/005EnergyDistribution.png.c3132c798487680b59fe5212e34cea66.png">
</p>

<p>
	يُظهِر هذا المدرج التكراري الملاحظة التالية المثيرة للانتباه: بالرغم من أن مُعامل نجمة الطاقة هو نسبة مئوية، أي يُفترض تشكيل توزيعًا منتظمًا تقريبًا، إذ يوجد اختلاف كبير بين عدد الأبنية ذات معامل يساوي 100 وعدد الأبنية ذات معامل يساوي 1، أي أنه كلما كان معامل نجمة الطاقة كبيرًا كانت كفاءة الطاقة أفضل.
</p>

<p>
	إذا عُدنا إلى تعريف معامل نجمة الطاقة فسنجد أنه تقدير نسبي يُعطيه الأشخاص مما يُفسّر الظاهرة السابقة، لربما كان الطلب من سكان الأبنية تقدير استهلاكهم من الطاقة يشابه الطلب من طلاب صف تقويم أنفسهم في امتحان ما، وبالنتيجة فإننا نعتقد أن هذا المعيار غير موضوعي لقياس كفاءة الطاقة في الأبنية.
</p>

<p>
	يُمكن التحري عن السبب في اختلاف قيم المعيار بين الأبنية عن طريق إيجاد الميزات المشتركة بين الأبنية التي لها تقريبًا نفس قيم المعيار؛ إلا أننا لن نفعل ذلك لأن مهمتنا هي التنبؤ بقيم هذا المعيار وليس إيجاد طرق أفضل لتقويم طاقة الأبنية. سنضع في تقريرنا النهائي ملاحظاتنا عن التوزيع غير المنتظم إلا أننا سنركز على مسألة التنبؤ.
</p>

<h3>
	إيجاد العلاقات
</h3>

<p>
	تهدف مرحلة تحليل البيانات الاستكشافية أساسًا إلى إيجاد العلاقات الكامنة بين الميزات وبين المعامل الهدف، حيث تكون الميزات المترابطة مع الهدف مفيدةً جدًا لنموذج التعلّم، لأنه يُمكن استخدامها في عملية التنبؤ بالهدف.
</p>

<p>
	يُمكن رسم مخطط الكثافة لاستكشاف تأثير متغير فئوي (يأخذ مجموعةً مُحدّدةً من القيم) على الهدف وذلك باستخدام المكتبة seaborn، ويُمكن النظر لمخطط الكثافة مثل <a href="https://towardsdatascience.com/histograms-and-density-plots-in-python-f6bda88f5ac0" rel="external nofollow">تنعيم للمدرج التكراري</a> لأنه يُظهر توزع متغير وحيد أيضًا.
</p>

<p>
	يُمكن تلوين مخطط الكثافة حسب الفئة لنرى كيف يؤثر المتغير الفئوي على التوزيع، حيث ترسم الشيفرة التالية مخططات الكثافة لمعامل الطاقة ملون حسب نوع المبنى (يقتصر على أنواع المباني التي تحتوي على أكثر من 100 سطر بيانات):
</p>

<pre class="ipsCode"># إنشاء قائمة من الأبنية التي لها أكثر من 10 قياس
types = data.dropna(subset=['score'])
types = types['Largest Property Use Type'].value_counts()
types = list(types[types.values &gt; 100].index)

# رسم توزيع المعامل وفق فئة البناء
figsize(12, 10)

# رسم كل بناء
for b_type in types:
    # اختيار فئة البناء
    subset = data[data['Largest Property Use Type'] == b_type]

    # رسم مخطط الكثافة لمعامل الطاقة
    sns.kdeplot(subset['score'].dropna(),
               label = b_type, shade = False, alpha = 0.8);

# عنونة المخطط
plt.xlabel('Energy Star Score', size = 20); plt.ylabel('Density', size = 20); 
plt.title('Density Plot of Energy Star Scores by Building Type', size = 28);
</pre>

<p>
	ويكون الناتج مخططات الكثافة حسب نوع البناء (الأزرق للمنازل السكنية، والأحمر للمكاتب، أما الأصفر فللفنادق، بينما الأخضر فالمستودعات غير المبردّة):
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="81108" href="https://academy.hsoub.com/uploads/monthly_2021_10/007DensityByBuilding.png.77a3bc1df6ba319e9241f86599de3eb4.png" rel=""><img alt="007DensityByBuilding.png" class="ipsImage ipsImage_thumbnailed" data-fileid="81108" data-unique="ec0ak1dg9" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2021_10/007DensityByBuilding.thumb.png.b85c5fea98146cf7a945874304ed5eb3.png"></a>
</p>

<p>
	تُبرهن المخططات أعلاه على أن نوع المبنى يؤثر كثيرًا في معامل نجمة الطاقة، إذ يكون لمباني المكاتب معاملات عالية بينما تأخذ الفنادق القيم الأدنى، مما يستلزم تضمين نوع المبنى في نموذج التعلّم لأنه يؤثر بوضوح على الهدف بصفة متغير فئوي، وسيتوجب علينا استخدام ترميز ساخن واحد <a href="https://hackernoon.com/what-is-one-hot-encoding-why-and-when-do-you-have-to-use-it-e3c6186d008f" rel="external nofollow">one-hot</a>.
</p>

<p>
	يُمكن تكرار العمل لدراسة العلاقة بين حي السكن ومعامل الطاقة حيث ينتج لدينا:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="81110" href="https://academy.hsoub.com/uploads/monthly_2021_10/008DensityByBorough.png.dd99c95092fba08fe27a891eace826c3.png" rel=""><img alt="008DensityByBorough.png" class="ipsImage ipsImage_thumbnailed" data-fileid="81110" data-unique="l4hqi8git" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2021_10/008DensityByBorough.thumb.png.0f9b0085a48d92c5349d78d7b878684a.png"></a>
</p>

<p>
	تُبرهن المخططات أعلاه عدم وجود تأثير كبير للحي على معامل نجمة الطاقة، ومع ذلك سنضمن الحي في نموذجنا نظرًا لوجود بعض الاختلافات الطفيفة بين الأحياء.
</p>

<p>
	يُمكن استخدام <a href="https://ar.wikipedia.org/wiki/%D9%85%D8%B9%D8%A7%D9%85%D9%84_%D8%A7%D9%84%D8%A7%D8%B1%D8%AA%D8%A8%D8%A7%D8%B7_%D9%84%D8%A8%D9%8A%D8%B1%D8%B3%D9%88%D9%86" rel="external nofollow">معامل الارتباط لبيرسون</a> Pearson لتحديد نوع العلاقات بين المتغيرات:
</p>

<ul>
	<li>
		القيمة 1 تعني علاقة تناسب طردي.
	</li>
	<li>
		القيمة -1 تعني تناسب عكسي.
	</li>
	<li>
		أما القيمة 0 تعني عدم وجود أي علاقة.
	</li>
</ul>

<p>
	يُبين الشكل التالي بعض قيم معامل الارتباط لبيرسون:
</p>

<p style="text-align: center;">
	<img alt="009PearsonCorrelation.png" class="ipsImage ipsImage_thumbnailed" data-fileid="81112" data-unique="qaz03yjyt" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2021_10/009PearsonCorrelation.png.48a67bc3a55c87c85567ae5583a5d44a.png">
</p>

<p>
	لا يكشف معامل الارتباط العلاقات غير الخطية وعلى الرغم من ذلك، فهو يبقى في البداية طريقةً جيدةً لاستكشاف ترابط المتغيرات مع بعضها البعض، يُمكن بسهولة إيجاد معاملات الارتباط باستخدام المكتبة Pandas:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3963_26" style=""><span class="com"># إيجاد قيم جميع الارتباطات وترتيبها تصاعديًا</span><span class="pln">
correlations_data </span><span class="pun">=</span><span class="pln"> data</span><span class="pun">.</span><span class="pln">corr</span><span class="pun">()[</span><span class="str">'score'</span><span class="pun">].</span><span class="pln">sort_values</span><span class="pun">()</span></pre>

<p>
	يُبين الشكل التالي علاقات الارتباط الناتجة السلبية (على اليسار، تناسب عكسي) والإيجابية (على اليمين، تناسب طردي):
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="81113" href="https://academy.hsoub.com/uploads/monthly_2021_10/010Correlations.png.287d0c3c6f7b170d03f1c39d10f84961.png" rel=""><img alt="010Correlations.png" class="ipsImage ipsImage_thumbnailed" data-fileid="81113" data-unique="iz2kmh6df" style="width: 700px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2021_10/010Correlations.thumb.png.402a558fa1e39b235c1d5cb225082100.png"></a>
</p>

<p>
	نلاحظ وجود العديد من الارتباطات السلبية (العكسية) بين الميزات ومعامل نجمة الطاقة الهدف. لنأخذ مثلًا الميزة EUI والتي هي كثافة استخدام الطاقة في المبنى أي الطاقة المستهلكة للمبنى مقسومًا على مساحة المبنى، بالطبع كلما كان هذا المقدار أصغر كانت الكفاءة أكبر (والتي يُعبّر عنها مقياس نجمة الطاقة).
</p>

<h3>
	رسم مخطط متغيرين
</h3>

<p>
	لمعاينة العلاقة بين متغيرين مستمرين (قيم رقمية حقيقية) يُمكن اللجوء إلى المخططات من النمط المبعثر scatterplots، كما يُمكن إضافة معلومات أخرى مثل المتغيرات الفئوية لتلوين نقاط المخطط، حيث يُبين المخطط التالي العلاقة بين كثافة استخدام الطاقة EUI ومعامل نجمة الطاقة ملونة حسب نوع البناء:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="81114" href="https://academy.hsoub.com/uploads/monthly_2021_10/011EnergyVsEUI.png.d0dbffd81408176964b7b497e574b7d3.png" rel=""><img alt="011EnergyVsEUI.png" class="ipsImage ipsImage_thumbnailed" data-fileid="81114" data-unique="41gyazey0" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2021_10/011EnergyVsEUI.thumb.png.f926d158fc723c7e020d72f03a6f4089.png"></a>
</p>

<p>
	يُظهر هذا المخطط علاقةً عكسيةً بين كثافة استخدام الطاقة ومعامل نجمة الطاقة، فكلما انخفضت الكثافة ارتفع معامل نجمة الطاقة (يكون معامل الترابط حوالي -0.7).
</p>

<p>
	أخيرًا، لنرسم مخطط باريس <a href="https://towardsdatascience.com/visualizing-data-with-pair-plots-in-python-f228cf529166" rel="external nofollow">Paris Plot</a>، والذي يوفر أداةً ممتازةً لاستكشاف البيانات، إذ يُمكّننا من معاينة العلاقات بين عدة أزواج من المتغيرات إضافًة إلى توزيعات متغيرات وحيدة. سنستخدم مكتبة المعاينة seaborn والتابع <code>PairGrid</code> لرسم مخطط باريس وحيث نضع في المثلث العلوي المخططات المتناثرة وعلى القطر المدرجات التكرارية، بينما نضع مخططات كثافة النواة ثنائية الأبعاد 2D kernel density مع معاملات الترابط في المثلث السفلي.
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3963_31" style=""><span class="com"># تحديد أعمدة المخطط</span><span class="pln">
plot_data </span><span class="pun">=</span><span class="pln"> features</span><span class="pun">[[</span><span class="str">'score'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'Site EUI (kBtu/ft²)'</span><span class="pun">,</span><span class="pln">
                      </span><span class="str">'Weather Normalized Source EUI (kBtu/ft²)'</span><span class="pun">,</span><span class="pln">
                      </span><span class="str">'log_Total GHG Emissions (Metric Tons CO2e)'</span><span class="pun">]]</span><span class="pln">

</span><span class="com"># استبدال اللانهاية بليس رقمًا</span><span class="pln">
plot_data </span><span class="pun">=</span><span class="pln"> plot_data</span><span class="pun">.</span><span class="pln">replace</span><span class="pun">({</span><span class="pln">np</span><span class="pun">.</span><span class="pln">inf</span><span class="pun">:</span><span class="pln"> np</span><span class="pun">.</span><span class="pln">nan</span><span class="pun">,</span><span class="pln"> </span><span class="pun">-</span><span class="pln">np</span><span class="pun">.</span><span class="pln">inf</span><span class="pun">:</span><span class="pln"> np</span><span class="pun">.</span><span class="pln">nan</span><span class="pun">})</span><span class="pln">
</span><span class="com"># إعادة تسمية الأعمدة</span><span class="pln">
plot_data </span><span class="pun">=</span><span class="pln"> plot_data</span><span class="pun">.</span><span class="pln">rename</span><span class="pun">(</span><span class="pln">columns </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="str">'Site EUI (kBtu/ft²)'</span><span class="pun">:</span><span class="pln"> </span><span class="str">'Site EUI'</span><span class="pun">,</span><span class="pln">
                                        </span><span class="str">'Weather Normalized Source EUI (kBtu/ft²)'</span><span class="pun">:</span><span class="pln"> </span><span class="str">'Weather Norm EUI'</span><span class="pun">,</span><span class="pln">

                                        </span><span class="str">'log_Total GHG Emissions (Metric Tons CO2e)'</span><span class="pun">:</span><span class="pln"> </span><span class="str">'log GHG Emissions'</span><span class="pun">})</span><span class="pln">

</span><span class="com"># حذف القيم غير الرقمية</span><span class="pln">
plot_data </span><span class="pun">=</span><span class="pln"> plot_data</span><span class="pun">.</span><span class="pln">dropna</span><span class="pun">()</span><span class="pln">

</span><span class="com"># تابع حساب معامل الارتباط بين عمودين</span><span class="pln">
</span><span class="kwd">def</span><span class="pln"> corr_func</span><span class="pun">(</span><span class="pln">x</span><span class="pun">,</span><span class="pln"> y</span><span class="pun">,</span><span class="pln"> </span><span class="pun">**</span><span class="pln">kwargs</span><span class="pun">):</span><span class="pln">
    r </span><span class="pun">=</span><span class="pln"> np</span><span class="pun">.</span><span class="pln">corrcoef</span><span class="pun">(</span><span class="pln">x</span><span class="pun">,</span><span class="pln"> y</span><span class="pun">)[</span><span class="lit">0</span><span class="pun">][</span><span class="lit">1</span><span class="pun">]</span><span class="pln">
    ax </span><span class="pun">=</span><span class="pln"> plt</span><span class="pun">.</span><span class="pln">gca</span><span class="pun">()</span><span class="pln">
    ax</span><span class="pun">.</span><span class="pln">annotate</span><span class="pun">(</span><span class="str">"r = {:.2f}"</span><span class="pun">.</span><span class="pln">format</span><span class="pun">(</span><span class="pln">r</span><span class="pun">),</span><span class="pln">
                xy</span><span class="pun">=(.</span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="pun">.</span><span class="lit">8</span><span class="pun">),</span><span class="pln"> xycoords</span><span class="pun">=</span><span class="pln">ax</span><span class="pun">.</span><span class="pln">transAxes</span><span class="pun">,</span><span class="pln">
                size </span><span class="pun">=</span><span class="pln"> </span><span class="lit">20</span><span class="pun">)</span><span class="pln">

</span><span class="com"># إنشاء كائن الشبكة</span><span class="pln">
grid </span><span class="pun">=</span><span class="pln"> sns</span><span class="pun">.</span><span class="typ">PairGrid</span><span class="pun">(</span><span class="pln">data </span><span class="pun">=</span><span class="pln"> plot_data</span><span class="pun">,</span><span class="pln"> size </span><span class="pun">=</span><span class="pln"> </span><span class="lit">3</span><span class="pun">)</span><span class="pln">

</span><span class="com"># الأعلى هو المخطط المبعثر</span><span class="pln">
grid</span><span class="pun">.</span><span class="pln">map_upper</span><span class="pun">(</span><span class="pln">plt</span><span class="pun">.</span><span class="pln">scatter</span><span class="pun">,</span><span class="pln"> color </span><span class="pun">=</span><span class="pln"> </span><span class="str">'red'</span><span class="pun">,</span><span class="pln"> alpha </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.6</span><span class="pun">)</span><span class="pln">

</span><span class="com"># القطر هو المدرج التكراري</span><span class="pln">
grid</span><span class="pun">.</span><span class="pln">map_diag</span><span class="pun">(</span><span class="pln">plt</span><span class="pun">.</span><span class="pln">hist</span><span class="pun">,</span><span class="pln"> color </span><span class="pun">=</span><span class="pln"> </span><span class="str">'red'</span><span class="pun">,</span><span class="pln"> edgecolor </span><span class="pun">=</span><span class="pln"> </span><span class="str">'black'</span><span class="pun">)</span><span class="pln">

</span><span class="com"># الأسفل هو مخطط الارتباط والكثافة</span><span class="pln">
grid</span><span class="pun">.</span><span class="pln">map_lower</span><span class="pun">(</span><span class="pln">corr_func</span><span class="pun">)</span><span class="pln">
grid</span><span class="pun">.</span><span class="pln">map_lower</span><span class="pun">(</span><span class="pln">sns</span><span class="pun">.</span><span class="pln">kdeplot</span><span class="pun">,</span><span class="pln"> cmap </span><span class="pun">=</span><span class="pln"> plt</span><span class="pun">.</span><span class="pln">cm</span><span class="pun">.</span><span class="typ">Reds</span><span class="pun">)</span><span class="pln">

</span><span class="com"># العنوان الكلي للمخطط</span><span class="pln">
plt</span><span class="pun">.</span><span class="pln">suptitle</span><span class="pun">(</span><span class="str">'Pairs Plot of Energy Data'</span><span class="pun">,</span><span class="pln"> size </span><span class="pun">=</span><span class="pln"> </span><span class="lit">36</span><span class="pun">,</span><span class="pln"> y </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1.02</span><span class="pun">)</span></pre>

<p>
	فنحصل على المخططات التالية:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="81116" href="https://academy.hsoub.com/uploads/monthly_2021_10/012ParisEnergy.png.06daf3db6339f01f23646104cc7291ad.png" rel=""><img alt="012ParisEnergy.png" class="ipsImage ipsImage_thumbnailed" data-fileid="81116" data-unique="4rjt9c7os" style="" src="https://academy.hsoub.com/uploads/monthly_2021_10/012ParisEnergy.thumb.png.047e0e4371454a9ae0e70ddb748d2820.png"></a>
</p>

<p>
	ننظر لتقاطع سطر المتغير الأول مع عمود المتغير الثاني لمعاينة التفاعل بين متغيرين، مثلًا: لمعاينة الارتباط بين كثافة الكهرباء وفق الطقس <code>Weather Norm EUI</code> والمعامل الهدف <code>score</code>، ننظر إلى تقاطع سطر <code>Weather Norm EUI</code> مع عمود <code>score</code> لنجد معامل ارتباط قيمته -0.67 أي أن العلاقة بينهما عكسيةً.
</p>

<p>
	يُمكن أن يُساعد هذا المخطط إضافًة لمظهر المخطط السابق الرائع، في تحديد الميزات المفيدة في عملية النمذجة.
</p>

<h2>
	هندسة الميزات والاختيار
</h2>

<p>
	تختصر عملية هندسة الميزات وحسن اختيار المناسب منها الوقت اللازم لمعالجة مسائل تعلّم الآلة. لنبدأ أولًا بتعريف هاتين المهمتين:
</p>

<ul>
	<li>
		هندسة الميزات Feature engineering: وهي عملية استخراج أو إنشاء ميزات جديدة من البيانات الأساسية المتاحة، قد يستلزم ذلك إجراء بعض التحويلات على المتغيرات طبعًا، مثل إيجاد مربع القيمة أو اللوغاريتم الطبيعي لها، أو ترميز المتغيرات الفئوية لتُصبح قابلةً للاستخدام في النموذج. يُمكن النظر لهندسة الميزات عمومًا على أنها عملية إنشاء ميزات جديدة.
	</li>
	<li>
		اختيار الميزات Feature selection: وهو عملية اختيار الميزات الأنسب للنموذج، حيث نحذف عادةً الميزات غير المرتبطة مع الهدف كي نُساعد النموذج على التعميم الأفضل للبيانات الجديدة وللحصول على نموذج قابل للشرح والفهم. يُمكن النظر لاختيار الميزات بشكل عام على أنها عملية حذف الميزات غير المرتبطة مع الهدف والإبقاء على الميزات المهمة فقط.
	</li>
</ul>

<p>
	يتعلّم نموذج تعلّم الآلة فقط من البيانات التي نُقدّمها له، لذا يُعدّ التأكد من أن البيانات تتضمن جميع الميزات الهامة أمرًا أساسيًا، وإذا لم نغذي النموذج بالبيانات الصحيحة، فإننا نعدّه ليفشل ولا يجب أن نتوقع منه أن يتعلّم عمليًا.
</p>

<p>
	ننجز بمشروعنا في مرحلة هندسة الميزات بما يلي:
</p>

<ul>
	<li>
		ترميز المتغيرات الفئوية باستخدام ترميز ساخن واحد (ميزة الحي السكني وميزة نوع استخدام الملكية).
	</li>
	<li>
		إضافة اللوغاريتم الطبيعي للمتغيرات الرقمية.
	</li>
</ul>

<p>
	يلزم استخدام هذا الترميز <a href="https://hackernoon.com/what-is-one-hot-encoding-why-and-when-do-you-have-to-use-it-e3c6186d008f" rel="external nofollow">one-hot</a> لتضمين متغير فئوي categorical variables في النموذج، إذ لا تفهم خوارزمية تعلّم الآلة بأن نوع البناء مكتبًا مثلًا، إذ يجب استخدام 1 إذا كان نوع البناء مكتبًا وإلا 0.
</p>

<p>
	يُمكن أن تساهم إضافة ميزات جديدة ناتجة عن تطبيق بعض التوابع الرياضية على الميزات الرقمية في مساعدة النموذج على تعلّم العلاقات غير الخطية الموجودة ضمن البيانات، ومن الممارسات الشائعة حساب الجذر التربيعي أو القوة من مرتبة معينة أو اللوغاريتم الطبيعي، والتي تعتمد عادةً على التجربة أو المعرفة بمجال المسألة، ونضيف في مشروعنا اللوغاريتم الطبيعي لجميع الميزات الرقمية.
</p>

<p>
	تختار الشيفرة التالية الميزات الرقمية ومن ثم يوجد اللوغاريتم الطبيعي لها ثم يختار الميزتين الفئويتين ويرمزهما ثم يدمج الكل، قد يبدو أن هذا يتطلب الكثير من الجهد لكن استخدام المكتبة Pandas يُسهّل العمل:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3963_34" style=""><span class="com"># نسخ البيانات الأولية</span><span class="pln">
features </span><span class="pun">=</span><span class="pln"> data</span><span class="pun">.</span><span class="pln">copy</span><span class="pun">()</span><span class="pln">

</span><span class="com"># اختيار الأعمدة الرقمية</span><span class="pln">
numeric_subset </span><span class="pun">=</span><span class="pln"> data</span><span class="pun">.</span><span class="pln">select_dtypes</span><span class="pun">(</span><span class="str">'number'</span><span class="pun">)</span><span class="pln">

</span><span class="com"># إنشاء أعمدة جديدة للوغاريتم الطبيعي للأعمدة الرقمية</span><span class="pln">
</span><span class="kwd">for</span><span class="pln"> col </span><span class="kwd">in</span><span class="pln"> numeric_subset</span><span class="pun">.</span><span class="pln">columns</span><span class="pun">:</span><span class="pln">
    </span><span class="com"># تجاوز عمود معامل الطاقة</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> col </span><span class="pun">==</span><span class="pln"> </span><span class="str">'score'</span><span class="pun">:</span><span class="pln">
        next
    </span><span class="kwd">else</span><span class="pun">:</span><span class="pln">
        numeric_subset</span><span class="pun">[</span><span class="str">'log_'</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> col</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> np</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">numeric_subset</span><span class="pun">[</span><span class="pln">col</span><span class="pun">])</span><span class="pln">

</span><span class="com"># اختيار الأعمدة الفئوية</span><span class="pln">
categorical_subset </span><span class="pun">=</span><span class="pln"> data</span><span class="pun">[[</span><span class="str">'Borough'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'Largest Property Use Type'</span><span class="pun">]]</span><span class="pln">

</span><span class="com"># ترميز واحد ساخن</span><span class="pln">
categorical_subset </span><span class="pun">=</span><span class="pln"> pd</span><span class="pun">.</span><span class="pln">get_dummies</span><span class="pun">(</span><span class="pln">categorical_subset</span><span class="pun">)</span><span class="pln">

</span><span class="com"># وصل إطاري العمل الناتجين</span><span class="pln">
</span><span class="com"># اضبط قيمة العمود على 1 لإنشاء عمود ربط</span><span class="pln">
features </span><span class="pun">=</span><span class="pln"> pd</span><span class="pun">.</span><span class="pln">concat</span><span class="pun">([</span><span class="pln">numeric_subset</span><span class="pun">,</span><span class="pln"> categorical_subset</span><span class="pun">],</span><span class="pln"> axis </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">)</span></pre>

<p>
	بعد هذه المعالجة سيكون لدينا أكثر من 11000 مبنى مع 110 عمود (ميزة)، حيث لن تكون كل هذه الميزات مفيدةً في عملية التنبؤ بمعامل الطاقة لذا نحذف بعضها.
</p>

<h3>
	اختيار الميزات
</h3>

<p>
	ترتبط العديد من الميزات مع بعضها البعض بصورة وثيقة مما يعني حصول تكرار عمليًا، إذ يُبين المخطط التالي مثلًا ترابط ميزة كثافة الطاقة Site EUI مع ميزة كثافة الكهرباء Weather Normalized Site EUI، وبقيمة ترابط عالية جدًا 0.997.
</p>

<p style="text-align: center;">
	<img alt="013WeatherVsSite.png" class="ipsImage ipsImage_thumbnailed" data-fileid="81118" data-unique="g8nhzrsf5" style="" src="https://academy.hsoub.com/uploads/monthly_2021_10/013WeatherVsSite.png.79f0a3de3264956fe5b15adf1c2e91cc.png">
</p>

<p>
	نحذف عادةً الميزات المترابطة مع بعضها كثيرًا تُدعى <a href="https://ar.wikipedia.org/wiki/%D8%AA%D8%AF%D8%A7%D8%AE%D9%84_%D8%AE%D8%B7%D9%8A_(%D8%A5%D8%AD%D8%B5%D8%A7%D8%A1)" rel="external nofollow">علاقة خطية متداخلة</a> collinear، مما يُساعد على <a href="https://www.quora.com/Why-is-multicollinearity-bad-in-laymans-terms-In-feature-selection-for-a-regression-model-intended-for-use-in-prediction-why-is-it-a-bad-thing-to-have-multicollinearity-or-highly-correlated-independent-variables" rel="external nofollow">الحصول على نموذج تعلّم عام قابل للتفسير</a>. حيث نشير هنا إلى الارتباط بين الميزات مع بعضها البعض وليس إلى ارتباط الميزات مع الهدف.
</p>

<p>
	توجد العديد من الطرق لحساب علاقات التداخل الخطية بين الميزات، حيث يُمكن استخدام <a href="https://ar.wikipedia.org/wiki/%D8%AA%D8%AF%D8%A7%D8%AE%D9%84_%D8%AE%D8%B7%D9%8A_(%D8%A5%D8%AD%D8%B5%D8%A7%D8%A1)" rel="external nofollow">عامل تضخم التباين</a> variance inflation factor. سنستخدم في هذا المشروع معامل الارتباط لإيجاد الميزات المترابطة ونحذف ميزةً من أجل كل ميزتين إذا كان معدل الارتباط بينهما أكبر من 0.6، حيث يمكنك الحصول على <a href="https://stackoverflow.com/questions/29294983/how-to-calculate-correlation-between-all-columns-and-remove-highly-correlated-on/43104383#43104383" rel="external nofollow">الشيفرة</a> أيضًا.
</p>

<p>
	لاحظ أن القيمة المعتمدة 0.6 هي قيمة تجريبية اختيرت بعد العديد من التجارب، لنتذكر أن تعلّم الآلة هو حقل تجريبي وغالبًا ما نجرب عدة تجارب ومحاولات لاختيار الأفضل.
</p>

<p>
	أخيرًا وبعد مرحلة اختيار الميزات تبقى لدينا 64 عمودًا وهدفًا وحيدًا.
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3963_37" style=""><span class="com"># حذف الأعمدة ذات القيم غير الرقمية</span><span class="pln">
features  </span><span class="pun">=</span><span class="pln"> features</span><span class="pun">.</span><span class="pln">dropna</span><span class="pun">(</span><span class="pln">axis</span><span class="pun">=</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> how </span><span class="pun">=</span><span class="pln"> </span><span class="str">'all'</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">features</span><span class="pun">.</span><span class="pln">shape</span><span class="pun">)</span><span class="pln">

</span><span class="pun">(</span><span class="lit">11319</span><span class="pun">,</span><span class="pln"> </span><span class="lit">65</span><span class="pun">)</span></pre>

<h2>
	إنشاء خط الأساس
</h2>

<p>
	بعد أن أنهينا مرحلة تنظيف البيانات وتحليل البيانات الاستكشافي وهندسة الميزات، الآن يجب تحديد خط الأساس المبدئي Baseline قبل البدء بعملية بناء النموذج، وهو عبارة عن تخمين يُستخدم للحكم فيما إذا كانت نتائج نموذج التعلّم مقبولةً أم لا.
</p>

<p>
	يُمكن في مسائل الانحدار اعتماد القيمة الأوسط median للهدف والمحسوبة لبيانات اختبار الخط الذي يجب لنموذج التعلّم تجاوزه وهو عمليًا هدف سهل الوصول.
</p>

<p>
	نستخدم متوسط الخطأ المطلق <a href="https://ar.wikinew.wiki/wiki/Mean_absolute_error" rel="external nofollow">MAE</a> mean absolute error، والذي يقيس متوسط الفروقات بالقيمة المطلقة بين تنبؤ النموذج والقيم الحقيقية. توجد العديد من المقاييس في الواقع إلا أنه يُمكن اتباع <a href="https://www.coursera.org/learn/machine-learning-projects/lecture/wIKkC/single-number-evaluation-metric" rel="external nofollow">نصيحة</a> اعتماد مقياس واحد دومًا إضافةً إلى أن حساب متوسط الخطأ المطلق سهل وقابل للشرح والتفسير.
</p>

<p>
	قبل حساب خط الأساس يجب تقسيم البيانات إلى مجموعتين هما مجموعة التدريب ومجموعة الاختبار:
</p>

<ul>
	<li>
		مجموعة التدريب: وهي مجموعة البيانات التي نُقدّمها للنموذج ليتعلّم منها، حيث تتألف من مجموعة الميزات إضافةً إلى القيمة الهدف (معامل الطاقة في حالتنا).
	</li>
	<li>
		مجموعة الاختبار: تُستخدم هذه المجموعة لتقويم كفاءة نموذج التعلّم حيث نختبر النموذج المدرب مع هذه البيانات، ومن ثم نوازن جواب النموذج مع الجواب المعروف لدينا في هذه البيانات، مما يسمح لنا بحساب قيمة متوسط الخطأ المطلق.
	</li>
</ul>

<p>
	نقسم البيانات إلى 70% للتدريب و30% للاختبار:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3963_39" style=""><span class="com"># تقسيم البيانات إلى 70% للتدريب و30% للاختبار</span><span class="pln">
X</span><span class="pun">,</span><span class="pln"> X_test</span><span class="pun">,</span><span class="pln"> y</span><span class="pun">,</span><span class="pln"> y_test </span><span class="pun">=</span><span class="pln"> train_test_split</span><span class="pun">(</span><span class="pln">features</span><span class="pun">,</span><span class="pln"> targets</span><span class="pun">,</span><span class="pln">
                                        test_size </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.3</span><span class="pun">,</span><span class="pln">
                                        random_state </span><span class="pun">=</span><span class="pln"> </span><span class="lit">42</span><span class="pun">)</span></pre>

<p>
	يُمكن لنا الآن حساب خط الأساس:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3963_41" style=""><span class="com"># تابع حساب متوسط الخطأ المطلق</span><span class="pln">
</span><span class="kwd">def</span><span class="pln"> mae</span><span class="pun">(</span><span class="pln">y_true</span><span class="pun">,</span><span class="pln"> y_pred</span><span class="pun">):</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> np</span><span class="pun">.</span><span class="pln">mean</span><span class="pun">(</span><span class="pln">abs</span><span class="pun">(</span><span class="pln">y_true </span><span class="pun">-</span><span class="pln"> y_pred</span><span class="pun">))</span><span class="pln">

baseline_guess </span><span class="pun">=</span><span class="pln"> np</span><span class="pun">.</span><span class="pln">median</span><span class="pun">(</span><span class="pln">y</span><span class="pun">)</span><span class="pln">

</span><span class="kwd">print</span><span class="pun">(</span><span class="str">'The baseline guess is a score of %0.2f'</span><span class="pln"> </span><span class="pun">%</span><span class="pln"> baseline_guess</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"Baseline Performance on the test set: MAE = %0.4f"</span><span class="pln"> </span><span class="pun">%</span><span class="pln"> mae</span><span class="pun">(</span><span class="pln">y_test</span><span class="pun">,</span><span class="pln"> baseline_guess</span><span class="pun">))</span></pre>

<p>
	والذي يُعطي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3963_43" style=""><span class="typ">The</span><span class="pln"> baseline guess </span><span class="kwd">is</span><span class="pln"> a score of </span><span class="lit">66.00</span><span class="pln">
</span><span class="typ">Baseline</span><span class="pln"> </span><span class="typ">Performance</span><span class="pln"> on the test set</span><span class="pun">:</span><span class="pln"> MAE </span><span class="pun">=</span><span class="pln"> </span><span class="lit">24.5164</span></pre>

<p>
	مما يعني أن الخطأ من مرتبة 25% وهي عتبة سهلة التجاوز.
</p>
<div class="banner-container ipsBox ipsPadding">
	<div class="inner-banner-container">
		<p class="banner-heading">
			دورة الذكاء الاصطناعي
		</p>

		<p class="banner-subtitle">
			احترف برمجة الذكاء الاصطناعي AI وتحليل البيانات وتعلم كافة المعلومات التي تحتاجها لبناء نماذج ذكاء اصطناعي متخصصة.
		</p>

		<div>
			<a class="ipsButton ipsButton_large ipsButton_primary ipsButton_important" href="https://academy.hsoub.com/learn/artificial-intelligence" rel="">اشترك الآن</a>
		</div>
	</div>

	<div class="banner-img">
		<a href="https://academy.hsoub.com/learn/artificial-intelligence" rel=""><img alt="دورة الذكاء الاصطناعي AI" src="https://academy.hsoub.com/learn/assets/images/courses/artificial-intelligence.png"></a>
	</div>
</div>
<h2>
	النتائج
</h2>

<p>
	استعرضنا في هذه المقالة الخطوات الثلاث الأولى لمعالجة مسألة تعلّم الآلة، بعد تحديد المشكلة نفعل ما يلي:
</p>

<ol>
	<li>
		تنظيف وتنسيق البيانات الخام المتاحة.
	</li>
	<li>
		تحليل استكشافي للبيانات بهدف التعرّف على البيانات.
	</li>
	<li>
		تطوير مجموعةً من الميزات للاستخدام في نموذج التعلّم.
	</li>
</ol>

<p>
	وفي النهاية، أجرينا عملية تحديد خط الأساس الذي سيسمح لنا بقبول نموذج التعلّم أو رفضه.
</p>

<p>
	نعرض في <a href="https://academy.hsoub.com/programming/python/%D8%AE%D8%B7%D9%88%D8%A7%D8%AA-%D8%AA%D9%86%D9%81%D9%8A%D8%B0-%D9%85%D8%B4%D8%B1%D9%88%D8%B9-%D8%B9%D9%86-%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9-%D9%81%D9%8A-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-%D8%A7%D9%84%D8%AC%D8%B2%D8%A1-%D8%A7%D9%84%D8%AB%D8%A7%D9%86%D9%8A-r1358/" rel="">المقالة الثانية</a> كيفية استخدام <a href="https://scikit-learn.org/stable/" rel="external nofollow"> </a><a href="https://scikit-learn.org/stable/" rel="external nofollow">Scikit-Learn</a> لتقييم نماذج التعلّم واختيار الأفضل منها، إضافةً إلى آليات معايرة المعاملات الفائقة للنموذج للوصول إلى نموذج أمثلي، وتعرض <a href="https://academy.hsoub.com/programming/python/%D8%AE%D8%B7%D9%88%D8%A7%D8%AA-%D8%AA%D9%86%D9%81%D9%8A%D8%B0-%D9%85%D8%B4%D8%B1%D9%88%D8%B9-%D8%B9%D9%86-%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9-%D9%81%D9%8A-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-%D8%A7%D9%84%D8%AC%D8%B2%D8%A1-%D8%A7%D9%84%D8%AB%D8%A7%D9%84%D8%AB-r1359/" rel="">المقالة الثالثة</a> كيفية تفسير النموذج وعرض النتائج.
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://towardsdatascience.com/a-complete-machine-learning-walk-through-in-python-part-one-c62152f39420" rel="external nofollow">A Complete Machine Learning Project Walk-Through in Python: Part One</a> لكاتبه Will Koehrsen.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/programming/python/%D8%AF%D9%88%D8%A7%D9%84-%D8%A7%D9%84%D9%83%D8%AB%D8%A7%D9%81%D8%A9-%D8%A7%D9%84%D8%A7%D8%AD%D8%AA%D9%85%D8%A7%D9%84%D9%8A%D8%A9-%D9%81%D9%8A-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-r1335/" rel="">دوال الكثافة الاحتمالية في بايثون</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/python/%D8%A7%D9%84%D9%85%D8%B1%D8%AC%D8%B9-%D8%A7%D9%84%D8%B4%D8%A7%D9%85%D9%84-%D8%A5%D9%84%D9%89-%D8%AA%D8%B9%D9%84%D9%85-%D9%84%D8%BA%D8%A9-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-r735/" rel="">المرجع الشامل إلى تعلم لغة بايثون</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1357</guid><pubDate>Thu, 07 Oct 2021 15:00:00 +0000</pubDate></item><item><title>&#x628;&#x646;&#x627;&#x621; &#x631;&#x648;&#x628;&#x648;&#x62A;&#x627;&#x62A; &#x644;&#x644;&#x639;&#x628; &#x627;&#x644;&#x623;&#x644;&#x639;&#x627;&#x628; &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x637;&#x631;&#x64A;&#x642;&#x629; &#x627;&#x644;&#x62A;&#x639;&#x644;&#x645; &#x627;&#x644;&#x645;&#x639;&#x632;&#x632; &#x648;&#x645;&#x634;&#x62A;&#x642;&#x627;&#x62A;&#x647;&#x627; &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x645;&#x643;&#x62A;&#x628;&#x629; TensorFlow</title><link>https://academy.hsoub.com/programming/artificial-intelligence/%D8%A8%D9%86%D8%A7%D8%A1-%D8%B1%D9%88%D8%A8%D9%88%D8%AA%D8%A7%D8%AA-%D9%84%D9%84%D8%B9%D8%A8-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%B7%D8%B1%D9%8A%D9%82%D8%A9-%D8%A7%D9%84%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D9%85%D8%B9%D8%B2%D8%B2-%D9%88%D9%85%D8%B4%D8%AA%D9%82%D8%A7%D8%AA%D9%87%D8%A7-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%85%D9%83%D8%AA%D8%A8%D8%A9-tensorflow-r1268/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2021_07/60ed65fa79b9b_--------.png.c05f9f385d48063c6e934fde8165d352.png" /></p>
<p>
	يُعَدّ التعلم المُعزز مجالًا فرعيًا من فروع <a href="https://ar.wikipedia.org/wiki/%D9%86%D8%B8%D8%B1%D9%8A%D8%A9_%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85" rel="external nofollow">نظرية التحكم</a>، والتي تُعنى بالتحكم في الأنظمة التي تتغير بمرور الوقت؛ وتشمل عِدّة تطبيقاتٍ من بينها: السيارات ذاتية القيادة، وبعض أنواع الروبوتات مثل الروبوتات المُخصصة للألعاب. وسنستخدم في هذا المقال التعلم المعزز لبناء روبوتٍ لألعاب الفيديو المُخصصة لأجهزة <a href="https://ar.wikipedia.org/wiki/%D8%A2%D8%AA%D8%A7%D8%B1%D9%8A" rel="external nofollow">آتاري</a> Atari، حيث لن يُمنح هذا الروبوت إمكانية الوصول إلى المعلومات الداخلية للعبة، وإنما سُيمنح إمكانية الوصول لنتائج اللعبة المعروضة على الشاشة، وكذا المكافآت الناتجة عن هذه اللعبة فقط؛ أي أنه سيرى ما يراه أي شخصٍ سيلعبُ هذه اللعبة.
</p>

<p>
	في مجال <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D9%84%D9%85%D9%81%D8%A7%D9%87%D9%8A%D9%85-%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A9-%D9%84%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9-r1009/" rel="">تعلّم الآلة</a>، يُعرَّف الروبوت Bot بأنه الوكيل Agent، وسيكون الوكيل بمثابة لاعبٍ في النظام، بحيث يعمل وفقًا لدالة اتخاذ القرار، وهدفنا الأساسي هو تطوير روبوتاتٍ ذكيةٍ من خلال تعليمهم وإمدادهم بقدراتٍ قويةٍ تقدر على اتخاذ القرار.
</p>

<p>
	نعرض، في هذا الدرس، كيفية تدريب روبوت باستخدام التعلم المعزز العميق وفق النموذج الحُر Deep Q-learning للعبة غزاة الفضاء Space Invaders، وهي لعبةٌ مخصصةٌ لجهاز أتاري أركايد <a href="https://en.wikipedia.org/wiki/Atari_Games" rel="external nofollow">Atari Arcade</a> الكلاسيكي.
</p>

<h2>
	فهم التعلم المعزز
</h2>

<p>
	يكون هدف اللاعب في أي لعبة هو زيادة درجاته، وسنشير في هذا الدرس لنتيجة اللاعب على أنها مكافأته، ولتعظيم المكافأة يجب على اللاعب أن يكون قادرًا على تحسين قدراته في اتخاذ القرارات، وبصيغةٍ أخرى فلسفية، القرار هو عملية النظر إلى اللعبة، أو مراقبة حالة اللعبة، واختيار فعلٍ معينٍ مناسبٍ لهذه الحالة.
</p>

<p>
	يُمكن بشكل عام نمذجة روبوت لاعب في بيئة لعب بسلسلة من الحالات State(ح S) والأفعال Actions (أ A) والمكافآت Rewards (م R): ح.أ.م.ح.أ.م.ح.أ.م… أو بالانكليزية: S,A,R,S,A,R,…
</p>

<p>
	يهدف التعلم إلى اختيار الفعل الأنسب من مجموعة من الأفعال المُمكنة في حالة ما والذي يُمكن أن يؤدي إلى مكافأة كبيرة في النهاية. ليس من الضروري الحصول على مكافأة جيدة في الحالة التالية، بمعنى أن لا يكون الهدف محلي (مكافأة جيدة فورًا) بل أن يكون الهدف استراتيجي (ربح اللعبة مع مكافأة كبيرة في نهاية اللعبة.
</p>

<p>
	أي أننا سنضع في حُسباننا ما يلي:
</p>

<ol>
	<li>
		عند مشاهدة العديد من الملاحظات حول حالات الروبوت وأفعاله ومكافآته، يمكن للمرء تقدير المكافأة المناسبة لكلّ حالةٍ وفعل معينٍ وذلك حسب النهاية التي آلت إليها اللعبة (أو مرحلة متقدمة منها).
	</li>
	<li>
		تُعَد لعبة غزاة الفضاء Space Invaders من الألعاب ذات المكافأة المتأخرة؛ أي أن اللاعب يكافَأ عندما يفجّر أحد الأعداء وليس بمجرد إطلاقه للنار فقط، ومع ذلك فإن قرار اللاعب بإطلاق النار هو الدافع الصحيح للحصول على المكافأة، لذا بطريقةٍ أو بأخرى، يجب أن نتعلم منح الحالة المرتبطة بفعل الإطلاق مكافأةً إيجابيةً.
	</li>
</ol>

<h2>
	المتطلبات الرئيسية
</h2>

<p>
	لإكمال هذا الدرس بنجاحٍ، ستحتاج إلى تجهيز بيئة العمل المكونة من:
</p>

<ul>
	<li>
		حاسوب يعمل بنظام أوبونتو 18.04، وبذاكرة وصولٍ عشوائيٍ RAM لا تقِل عن 1 غيغابايت، ويجب أن يحتوي الخادم على مستخدمٍ غير مسؤولٍ non-root user وبصلاحيات sudo المُهيّأة مسبقًا، وجدار حمايةٍ مهيئٍ باستخدام UFW. وللمزيد، يمكنك الاطلاع على كيفية <a href="https://academy.hsoub.com/devops/linux/%D8%A7%D9%84%D8%AA%D9%87%D9%8A%D8%A6%D8%A9-%D8%A7%D9%84%D8%A3%D9%88%D9%84%D9%8A%D8%A9-%D9%84%D8%AE%D8%A7%D8%AF%D9%85-%D8%A3%D9%88%D8%A8%D9%88%D9%86%D8%AA%D9%88-1804-r431/" rel="">التهيئة الأولية لخادم أوبونتو 18.04</a> أو حاسوب يعمل بنظام ويندوز 10 .
	</li>
	<li>
		تثبيت بايثون 3 وإعداد بيئته البرمجية، وبإمكانك معرفة <a href="https://academy.hsoub.com/programming/python/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-3-%D9%88%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A8%D9%8A%D8%A6%D8%AA%D9%87-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-%D8%B9%D9%84%D9%89-%D8%AE%D8%A7%D8%AF%D9%85-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-1804-r709/" rel="">كيفية تثبيت بايثون 3 وإعداد بيئة برمجية على أوبنتو 18.04</a>.
	</li>
</ul>

<p>
	وإذا كنت تستخدم جهازًا محليًا، فيمكنك تثبيت بايثون 3 محليًا خطوةً بخطوة، باطلاعك على <a href="https://academy.hsoub.com/programming/python/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-3-%D9%88%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A8%D9%8A%D8%A6%D8%AA%D9%87-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-%D8%B9%D9%84%D9%89-%D9%88%D9%8A%D9%86%D8%AF%D9%88%D8%B2-10-r710/" rel="">كيفية تثبيت بايثون 3 وإعداد بيئته البرمجية على ويندوز 10</a>.
</p>

<p>
	سنحتاج في هذا المشروع إلى المكتبات الأساسية التالية:
</p>

<ul>
	<li>
		<a href="https://gym.openai.com/" rel="external nofollow">Gym</a>: وهي مكتبة بايثون تجعل الألعاب المختلفة متاحةً للأبحاث، وكذا جميع التبعيات الخاصة بالألعاب المخصصة لأجهزة أتاري، والتي طورتها شركة <a href="https://openai.com/" rel="external nofollow">OpenAI</a>. حيث تقدم مكتبة Gym معاييرًا عامة لكلّ لعبةٍ، وذلك لتمكننا من تقييم أداء الروبوتات و<a href="https://academy.hsoub.com/programming/advanced/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A7%D9%84%D8%AE%D9%88%D8%A7%D8%B1%D8%B2%D9%85%D9%8A%D8%A7%D8%AA-r1282/" rel="">الخوارزميات</a> المختلفة بطريقةٍ موحدةٍ.
	</li>
	<li>
		<a href="https://www.tensorflow.org/" rel="external nofollow">Tensorflow</a>: وهي مكتبة <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D9%85%D8%A8%D8%AA%D8%AF%D8%A6%D9%8A%D9%86-%D9%84%D9%81%D9%87%D9%85-%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%B9%D9%85%D9%8A%D9%82-r1422/" rel="">التعلم العميق</a> المقدمة من غوغل، تتيح لنا إجراء العمليات الحسابية بطريقةٍ أكثر كفاءةً عن ذي قبل، حيث تؤدي ذلك من خلال بناء دوال رياضيةً باستخدام التجريدات الخاصة بمكتبة Tensorflow تحديدًا ، كما تعمل حصريًا على وِحدة المعالجة الرسومية GPU الخاصة بك.
	</li>
	<li>
		<a href="http://www.numpy.org/" rel="external nofollow">NumPy</a>: وهي مكتبة الجبر الخطي.
	</li>
</ul>

<p>
	لإكمال هذا الدرس ستحتاج بيئةً برمجيةً للغة بايثون الإصدار 3.8 سواءً كان محليًا أو بعيدًا. ويجب أن تتضمن هذه البيئة البرمجية مدير الحِزم <a href="https://pypi.org/project/pip/" rel="external nofollow">pip</a> لتثبيت الحِزم، ومُنشئ البيئات الافتراضية <a href="https://docs.python.org/3/library/venv.html" rel="external nofollow">venv</a> لإنشاء بيئاتٍ افتراضيةٍ.
</p>

<p>
	قبل البدء بهذا المقال لا بد من تجهيز البيئة المناسبة، وسنستخدم محرر الشيفرات البرمجية <a href="https://academy.hsoub.com/devops/linux/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D9%87%D9%8A%D8%A6%D8%A9-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82-%D8%A7%D9%84%D9%85%D9%81%D9%83%D8%B1%D8%A9-jupyter-notebook-%D9%84%D9%84%D8%B9%D9%85%D9%84-%D9%85%D8%B9-%D9%84%D8%BA%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-python-3-r388/" rel="">Jupyter Notebooks</a>، وهو مفيد جدًا لتجربة وتشغيل الأمثلة الخاصة بتَعَلّم الآلة بطريقةٍ تفاعليةٍ، حيث تستطيع من خلاله تشغيل كتلًا صغيرةً من الشيفرات البرمجية ورؤية النتائج بسرعة، مما سيسهل علينا اختبار الشيفرات البرمجية وتصحيحها.
</p>

<p>
	يُمكنك فتح متصفح الويب والذهاب لموقع المحرر الرسمي <a href="https://jupyter.org/try" rel="external nofollow">jupyter</a> على الوِيب لبدء العمل بسرعة، ومن ثمّ انقر فوق "جرّب المحرر التقليدي Try Classic Notebook"، وستنتقل بعدها لملفٍ جديدٍ بداخل محرر Jupyter Notebooks التفاعلي، وبذلك تجهّز نفسك لكتابة الشيفرة البرمجية <a href="https://wiki.hsoub.com/Python" rel="external">بلغة البايثون</a>.
</p>

<p>
	إذا رغبت بمزيدٍ من المعلومات حول محرر الشيفرات البرمجية Jupyter Notebooks وكيفيّة إعداد بيئته الخاصة لكتابة شيفرة بايثون، فيمكنك الاطلاع على: <a href="https://academy.hsoub.com/devops/linux/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D9%87%D9%8A%D8%A6%D8%A9-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82-%D8%A7%D9%84%D9%85%D9%81%D9%83%D8%B1%D8%A9-jupyter-notebook-%D9%84%D9%84%D8%B9%D9%85%D9%84-%D9%85%D8%B9-%D9%84%D8%BA%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-python-3-r388/" rel="">كيفية تهيئة تطبيق المفكرة jupyter notebook للعمل مع لغة البرمجة python</a>.
</p>
<div class="banner-container ipsBox ipsPadding">
    <div class="inner-banner-container">
            <p class="banner-heading">
                    دورة الذكاء الاصطناعي
            </p>



            <p class="banner-subtitle">
        احترف برمجة الذكاء الاصطناعي AI وتحليل البيانات وتعلم كافة المعلومات التي تحتاجها لبناء نماذج ذكاء اصطناعي متخصصة.
            </p>

            <div>
                    <a class="ipsButton ipsButton_large ipsButton_primary ipsButton_important" href="https://academy.hsoub.com/learn/artificial-intelligence" rel="">اشترك الآن</a>
            </div>
    </div>
<div class="banner-img"> <a href="https://academy.hsoub.com/learn/artificial-intelligence" rel=""><img alt="دورة الذكاء الاصطناعي AI" src="https://academy.hsoub.com/learn/assets/images/courses/artificial-intelligence.png"></a></div>
</div>
<h2>
	إعداد المشروع
</h2>

<p>
	ستحتاج أولًا لتثبيت بعض التبعيات، وذلك لإنشاء مساحة عملٍ للاحتفاظ بملفاتنا قبل أن نتمكن من تطوير برنامج التعرف على الصور، وسنستخدم بيئة بايثون 3.8 الافتراضية لإدارة التبعيات الخاصة بمشروعنا.
</p>

<p>
	سَنُنشئ مجلدًا جديدًا خاصًا بمشروعنا وسندخل إليه هكذا:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9066_10" style=""><span class="pln">mkdir qlearning</span><span class="pun">-</span><span class="pln">demo
cd qlearning</span><span class="pun">-</span><span class="pln">demo</span></pre>

<p>
	سننفذّ الأمر التالي لإنشاء البيئة الافتراضية:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9066_12" style=""><span class="pln">python </span><span class="pun">-</span><span class="pln">m venv qlearning</span><span class="pun">-</span><span class="pln">demo</span></pre>

<p>
	ومن ثم الأمر التالي في Linux لتنشيط البيئة الافتراضية:
</p>

<pre class="ipsCode">source qlearning-demo/bin/activate
</pre>

<p>
	أما في Windows، فيكون أمر التنشيط:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9066_14" style=""><span class="str">"qlearning-demo/Scripts/activate.bat"</span></pre>

<p>
	سنستخدم إصداراتٍ محددةٍ من هذه المكتبات، من خلال إنشاء ملف <code>requirements.txt</code> في مجلد المشروع، وسيُحدِّد هذا الملف المتطلبات والإصدارات التي سنحتاج إليها.
</p>

<p>
	نفتح الملف <code>requirements.txt</code> في محرر النصوص، ونُضيف الأسطر التالية، وذلك لتحديد المكتبات التي نريدها وإصداراتها:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9066_16" style=""><span class="pln">tensorflow</span><span class="pun">==</span><span class="lit">2.6</span><span class="pun">.</span><span class="lit">0</span><span class="pln">
numpy</span><span class="pun">==</span><span class="lit">1.19</span><span class="pun">.</span><span class="lit">5</span><span class="pln">
cmake</span><span class="pun">==</span><span class="lit">3.21</span><span class="pun">.</span><span class="lit">4</span><span class="pln">
tf</span><span class="pun">-</span><span class="pln">slim</span><span class="pun">==</span><span class="lit">1.1</span><span class="pun">.</span><span class="lit">0</span><span class="pln">
atari</span><span class="pun">-</span><span class="pln">py</span><span class="pun">==</span><span class="lit">0.2</span><span class="pun">.</span><span class="lit">6</span><span class="pln">
gym</span><span class="pun">==</span><span class="lit">0.19</span><span class="pun">.</span><span class="lit">0</span><span class="pln">
matplotlib</span><span class="pun">==</span><span class="lit">3.5</span><span class="pun">.</span><span class="lit">0</span><span class="pln">
</span><span class="typ">PyVirtualDisplay</span><span class="pun">==</span><span class="lit">2.2</span><span class="pln">
jupyter
keras</span><span class="pun">==</span><span class="lit">2.6</span><span class="pun">.*</span><span class="pln">
gym</span><span class="pun">[</span><span class="pln">all</span><span class="pun">]</span><span class="pln">
</span><span class="typ">PyVirtualDisplay</span></pre>

<p>
	سنحفظ التغييرات التي طرأت على الملف وسنخرج من محرر النصوص، ثم سنُثَبت هذه المكتبات بالأمر التالي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9066_18" style=""><span class="pun">(</span><span class="pln">qlearning</span><span class="pun">-</span><span class="pln">demo</span><span class="pun">)</span><span class="pln"> $ pip install </span><span class="pun">-</span><span class="pln">r requirements</span><span class="pun">.</span><span class="pln">txt</span></pre>

<p>
	بعد تثبيتنا لهذه التبعيات، سنُصبح جاهزين لبدء العمل على مشروعنا.
</p>

<h2>
	كتابة الشيفرة البرمجية
</h2>

<p>
	شغّل محرر الشيفرات البرمجية Jupyter Notebook بمجرد اكتمال عملية التثبيت. هكذا:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9066_20" style=""><span class="pun">(</span><span class="pln">qlearning</span><span class="pun">-</span><span class="pln">demo</span><span class="pun">)</span><span class="pln"> $ jupyter notebook</span></pre>

<p>
	أنشئ ملفًا جديدًا في داخل المحرر بالضغط على الزر new واختيار python 3 (ipykernal)‎ وسمه باسم main مثلًا، حيث ستكون في الخلية الأولى للملف عملية استيراد الوِحدات (أو المكتبات) البرمجية اللازمة. (لمزيد من المعلومات حول طريقة استيراد وحدة برمجية في لغة بايثون يمكنك الاطلاع على <a href="https://academy.hsoub.com/programming/python/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A7%D8%B3%D8%AA%D9%8A%D8%B1%D8%A7%D8%AF-%D8%A7%D9%84%D9%88%D8%AD%D8%AF%D8%A7%D8%AA-%D9%81%D9%8A-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-3-r744/" rel="">كيفية استيراد الوحدات في بايثون 3 </a> سبق وأن ناقشنا فيه هذه الفكرة بالتفصيل).
</p>

<p>
	نقوم أولًا بتثبيت مكتبة مساعدة في نمذجة الحركات الفيزيائية:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9066_22" style=""><span class="pun">تثبيت</span><span class="pln"> </span><span class="pun">محرك</span><span class="pln"> </span><span class="pun">المحاكاة</span><span class="pln"> </span><span class="pun">الفيزيائية</span><span class="pln"> </span><span class="com">#</span><span class="pln">
</span><span class="pun">!</span><span class="pln">curl https</span><span class="pun">://</span><span class="pln">mujoco</span><span class="pun">.</span><span class="pln">org</span><span class="pun">/</span><span class="pln">download</span><span class="pun">/</span><span class="pln">mujoco210</span><span class="pun">-</span><span class="pln">linux</span><span class="pun">-</span><span class="pln">x86_64</span><span class="pun">.</span><span class="pln">tar</span><span class="pun">.</span><span class="pln">gz </span><span class="pun">--</span><span class="pln">output mujoco210</span><span class="pun">-</span><span class="pln">linux</span><span class="pun">-</span><span class="pln">x86_64</span><span class="pun">.</span><span class="pln">tar</span><span class="pun">.</span><span class="pln">gz
</span><span class="pun">!</span><span class="pln">tar </span><span class="pun">-</span><span class="pln">xf mujoco210</span><span class="pun">-</span><span class="pln">linux</span><span class="pun">-</span><span class="pln">x86_64</span><span class="pun">.</span><span class="pln">tar</span><span class="pun">.</span><span class="pln">gz
</span><span class="kwd">import</span><span class="pln"> os
</span><span class="pun">إضافة</span><span class="pln"> </span><span class="pun">متغير</span><span class="pln"> </span><span class="pun">يدل</span><span class="pln"> </span><span class="pun">على</span><span class="pln"> </span><span class="pun">مسار</span><span class="pln"> </span><span class="pun">المحرك#</span><span class="pln"> 
os</span><span class="pun">.</span><span class="pln">environ</span><span class="pun">[</span><span class="str">'MUJOCO_PY_MUJOCO_PATH'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"/content/mujoco210"</span></pre>

<p>
	ثم نقوم باستيراد جميع المكتبات اللازمة:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9066_24" style=""><span class="com"># مكتبة العمليات الرياضية</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> numpy </span><span class="kwd">as</span><span class="pln"> np
</span><span class="com"># مكتبات الألعاب</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> gym
</span><span class="kwd">from</span><span class="pln"> gym </span><span class="kwd">import</span><span class="pln"> logger </span><span class="kwd">as</span><span class="pln"> gymlogger
</span><span class="kwd">from</span><span class="pln"> gym</span><span class="pun">.</span><span class="pln">wrappers </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">Monitor</span><span class="pln">
</span><span class="com"># مكتبات التعلم العميق</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> tensorflow </span><span class="kwd">as</span><span class="pln"> tf
</span><span class="kwd">import</span><span class="pln"> tf_slim
</span><span class="com"># مكتبة للرسوميات</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> matplotlib</span><span class="pun">.</span><span class="pln">pyplot </span><span class="kwd">as</span><span class="pln"> plt
</span><span class="pun">%</span><span class="pln">matplotlib inline
</span><span class="com"># تفعيل توافقية نسخ مكتبة التعلم العميق</span><span class="pln">
tf</span><span class="pun">.</span><span class="pln">compat</span><span class="pun">.</span><span class="pln">v1</span><span class="pun">.</span><span class="pln">disable_eager_execution</span><span class="pun">()</span><span class="pln">
</span><span class="com"># مكتبة لاستخدام القائمة مفتوحة الطرفين</span><span class="pln">
</span><span class="kwd">from</span><span class="pln"> collections </span><span class="kwd">import</span><span class="pln"> deque</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Counter</span><span class="pln">
</span><span class="com"># مكتبة للمسارات</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> glob
</span><span class="com"># مكتبة دخل-خرج</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> io
</span><span class="com"># مكتبة ترميز 64</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> base64
</span><span class="com"># مكتبة عرض HTML</span><span class="pln">
</span><span class="kwd">from</span><span class="pln"> </span><span class="typ">IPython</span><span class="pun">.</span><span class="pln">display </span><span class="kwd">import</span><span class="pln"> HTML</span></pre>

<p>
	نُنشئ بيئة لعبة غزاة الفضاء <code>SpaceInvaders-v0</code> باستخدام الدالة <code>gym.make</code>. نستخدم الخاصية <code>action_space.n</code> لبيئة اللعبة لمعرفة عدد الأفعال الممكنة في اللعبة، ونستخدم الدالة <code>get_action_meanings</code> للحصول على أسماء هذه الأفعال الممكنة:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9066_26" style=""><span class="com"># تهيئة بيئة عمل اللعبة</span><span class="pln">
env </span><span class="pun">=</span><span class="pln"> gym</span><span class="pun">.</span><span class="pln">make</span><span class="pun">(</span><span class="str">"SpaceInvaders-v0"</span><span class="pun">)</span><span class="pln">
</span><span class="com"># معاينة عدد الأفعال الممكنة</span><span class="pln">
n_outputs </span><span class="pun">=</span><span class="pln"> env</span><span class="pun">.</span><span class="pln">action_space</span><span class="pun">.</span><span class="pln">n
</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">n_outputs</span><span class="pun">)</span><span class="pln">
</span><span class="com"># معاينة أسماء الأفعال الممكنة</span><span class="pln">
</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">env</span><span class="pun">.</span><span class="pln">get_action_meanings</span><span class="pun">())</span></pre>

<p>
	يُبين ناتج التنفيذ عدد الأفعال الممكنة في اللعبة وأسمائها:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9066_28" style=""><span class="lit">6</span><span class="pln">
</span><span class="pun">[</span><span class="str">'NOOP'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'FIRE'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'RIGHT'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'LEFT'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'RIGHTFIRE'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'LEFTFIRE'</span><span class="pun">]</span></pre>

<p>
	يُمكن طباعة شاشة اللعبة الأولية وذلك بعد استدعاء دالة التهيئة الأولية لبيئة اللعبة <code>reset</code>:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9066_30" style=""><span class="com"># التهيئة الأولية</span><span class="pln">
state </span><span class="pun">=</span><span class="pln"> env</span><span class="pun">.</span><span class="pln">reset</span><span class="pun">()</span><span class="pln">
</span><span class="com"># معاينة الوضع الأولي للعبة</span><span class="pln">
plt</span><span class="pun">.</span><span class="pln">imshow</span><span class="pun">(</span><span class="pln">state</span><span class="pun">)</span></pre>

<p>
	مما يُعطي صورة شاشة اللعبة التالية:
</p>

<p style="text-align: center;">
	<img alt="001.png" class="ipsImage ipsImage_thumbnailed" data-fileid="110300" data-unique="51tg4dd72" src="https://academy.hsoub.com/uploads/monthly_2022_10/001.png.9ffa423549a97a3c3e56f81ac27704ad.png">
</p>

<p>
	نستخدم فيما يلي الدالة الأساسية <code>env.step</code>، والتي تُعيد القيم التالية:
</p>

<ul>
	<li>
		الحالة state: وهي الحالة الجديدة للعبة بعد تطبيق فعلٍ معينٍ.
	</li>
	<li>
		المكافأة reward: وهي الزيادة في الدرجة المترتبة عن فعلٍ معينٍ. وفي نمط الألعاب المعتمدة على النقاط، يكون هدف اللاعب هو تعظيم المكافأة الإجمالية، بزيادة مجموع النقاط لأقصى درجةٍ ممكنةٍ.
	</li>
	<li>
		حالة انتهاء اللعبة done: تأخذ القيمة <code>true</code> عندما يخسر اللاعب ويفقد جميع الفرص المتاحة له.
	</li>
	<li>
		المعلومات info: وهي المعلومات الجانبية، وسنتجاوز شرحها حاليًا.
	</li>
</ul>

<p>
	نشرح مبدأ اللعبة عبر الشيفرة التالية والتي تدخل في حلقة تُبقي اللعبة مستمرة إلى أن يخسر اللاعب بموته. تختار الدالة <code>sample</code> أحد الأفعال الستة الممكنة بشكل عشوائي. يؤدي تنفيذ الفعل (باستخدام الدالة <code>step</code>) إلى الانتقال إلى حالة جديدة مع مكافأة ممكنة في بعض الحالات. تنتهي اللعبة بموت اللاعب (done=true).
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9066_40" style=""><span class="pln">env</span><span class="pun">.</span><span class="pln">reset</span><span class="pun">()</span><span class="pln">
</span><span class="com"># المكافأة الإجمالية</span><span class="pln">
episode_reward </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> 
</span><span class="kwd">while</span><span class="pln"> </span><span class="kwd">True</span><span class="pun">:</span><span class="pln">
    </span><span class="com"># اختيار فعل بشكل عشوائي</span><span class="pln">
    action </span><span class="pun">=</span><span class="pln"> env</span><span class="pun">.</span><span class="pln">action_space</span><span class="pun">.</span><span class="pln">sample</span><span class="pun">()</span><span class="pln">
    </span><span class="com"># تنفيذ الفعل</span><span class="pln">
    </span><span class="com"># الانتقال لحالة جديدة</span><span class="pln">
    state</span><span class="pun">,</span><span class="pln"> reward</span><span class="pun">,</span><span class="pln"> done</span><span class="pun">,</span><span class="pln"> info </span><span class="pun">=</span><span class="pln"> env</span><span class="pun">.</span><span class="pln">step</span><span class="pun">(</span><span class="pln">action</span><span class="pun">)</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">reward</span><span class="pun">&gt;</span><span class="lit">0</span><span class="pun">):</span><span class="pln">
        </span><span class="com"># طباعة القيم في حال مكافأة أكبر من الصفر</span><span class="pln">
        </span><span class="kwd">print</span><span class="pun">(</span><span class="pln">env</span><span class="pun">.</span><span class="pln">get_action_meanings</span><span class="pun">()[</span><span class="pln">action</span><span class="pun">],</span><span class="str">" ==&gt; "</span><span class="pun">,</span><span class="pln">  reward</span><span class="pun">,</span><span class="pln"> </span><span class="str">" ,("</span><span class="pun">,</span><span class="pln">episode_reward</span><span class="pun">,</span><span class="str">")"</span><span class="pln"> </span><span class="pun">)</span><span class="pln">
    </span><span class="com"># إضافة مكافأة الفعل للمكافأة الإجمالية</span><span class="pln">
    episode_reward </span><span class="pun">+=</span><span class="pln"> reward
    </span><span class="com"># اختبار نهاية اللعبة</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> done</span><span class="pun">:</span><span class="pln">
        </span><span class="com"># طباعة المكافأة النهائية</span><span class="pln">
        </span><span class="kwd">print</span><span class="pun">(</span><span class="str">'Reward: %s'</span><span class="pln"> </span><span class="pun">%</span><span class="pln"> episode_reward</span><span class="pun">)</span><span class="pln">
        </span><span class="kwd">break</span><span class="pln">
</span><span class="com"># معاينة الوضع النهائي للعبة</span><span class="pln">
plt</span><span class="pun">.</span><span class="pln">imshow</span><span class="pun">(</span><span class="pln">state</span><span class="pun">)</span><span class="pln">
plt</span><span class="pun">.</span><span class="pln">show</span><span class="pun">()</span></pre>

<p>
	يكون الخرج مثلًا:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9066_42" style=""><span class="pln">FIRE  </span><span class="pun">==&gt;</span><span class="pln">  </span><span class="lit">5.0</span><span class="pln">  </span><span class="pun">,(</span><span class="pln"> </span><span class="lit">0.0</span><span class="pln"> </span><span class="pun">)</span><span class="pln">
NOOP  </span><span class="pun">==&gt;</span><span class="pln">  </span><span class="lit">5.0</span><span class="pln">  </span><span class="pun">,(</span><span class="pln"> </span><span class="lit">5.0</span><span class="pln"> </span><span class="pun">)</span><span class="pln">
RIGHTFIRE  </span><span class="pun">==&gt;</span><span class="pln">  </span><span class="lit">10.0</span><span class="pln">  </span><span class="pun">,(</span><span class="pln"> </span><span class="lit">10.0</span><span class="pln"> </span><span class="pun">)</span><span class="pln">
RIGHT  </span><span class="pun">==&gt;</span><span class="pln">  </span><span class="lit">15.0</span><span class="pln">  </span><span class="pun">,(</span><span class="pln"> </span><span class="lit">20.0</span><span class="pln"> </span><span class="pun">)</span><span class="pln">
RIGHT  </span><span class="pun">==&gt;</span><span class="pln">  </span><span class="lit">20.0</span><span class="pln">  </span><span class="pun">,(</span><span class="pln"> </span><span class="lit">35.0</span><span class="pln"> </span><span class="pun">)</span><span class="pln">
FIRE  </span><span class="pun">==&gt;</span><span class="pln">  </span><span class="lit">25.0</span><span class="pln">  </span><span class="pun">,(</span><span class="pln"> </span><span class="lit">55.0</span><span class="pln"> </span><span class="pun">)</span><span class="pln">
RIGHT  </span><span class="pun">==&gt;</span><span class="pln">  </span><span class="lit">10.0</span><span class="pln">  </span><span class="pun">,(</span><span class="pln"> </span><span class="lit">80.0</span><span class="pln"> </span><span class="pun">)</span><span class="pln">
RIGHTFIRE  </span><span class="pun">==&gt;</span><span class="pln">  </span><span class="lit">15.0</span><span class="pln">  </span><span class="pun">,(</span><span class="pln"> </span><span class="lit">90.0</span><span class="pln"> </span><span class="pun">)</span><span class="pln">
</span><span class="typ">Reward</span><span class="pun">:</span><span class="pln"> </span><span class="lit">105.0</span></pre>

<p>
	كما تُبين واجهة اللعبة:
</p>

<p style="text-align: center;">
	<img alt="002.png" class="ipsImage ipsImage_thumbnailed" data-fileid="110301" data-unique="mou07xmsq" src="https://academy.hsoub.com/uploads/monthly_2022_10/002.png.144bf86caf69a7e01e546b8dfd1a0e0e.png">
</p>

<p>
	نحتاج إلى إجراء معالجة أولية لصور اللعبة (والتي ستكون لاحقًا دخلًا لشبكات التعلم العصبية)، ولذا نُعرّف الدالة التالية والتي تقتطع الجزء الهام من صورة اللعبة وتُنفّذ بعض عمليات المعالجة عليها:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9066_44" style=""><span class="kwd">def</span><span class="pln"> preprocess_state</span><span class="pun">(</span><span class="pln">state</span><span class="pun">):</span><span class="pln">
    </span><span class="com"># تحجيم الصورة واقتطاع الجزء الهام منها</span><span class="pln">
    img </span><span class="pun">=</span><span class="pln"> state</span><span class="pun">[</span><span class="lit">25</span><span class="pun">:</span><span class="lit">201</span><span class="pun">:</span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="pun">::</span><span class="lit">2</span><span class="pun">]</span><span class="pln">
    </span><span class="com"># تحويل الصورة إلى درجات الرمادي</span><span class="pln">
    img </span><span class="pun">=</span><span class="pln"> img</span><span class="pun">.</span><span class="pln">mean</span><span class="pun">(</span><span class="pln">axis</span><span class="pun">=</span><span class="lit">2</span><span class="pun">)</span><span class="pln">
    color </span><span class="pun">=</span><span class="pln"> np</span><span class="pun">.</span><span class="pln">array</span><span class="pun">([</span><span class="lit">210</span><span class="pun">,</span><span class="pln"> </span><span class="lit">164</span><span class="pun">,</span><span class="pln"> </span><span class="lit">74</span><span class="pun">]).</span><span class="pln">mean</span><span class="pun">()</span><span class="pln">
    </span><span class="com"># تحسين التباين في الصورة</span><span class="pln">
    img</span><span class="pun">[</span><span class="pln">img</span><span class="pun">==</span><span class="pln">color</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pln">
    </span><span class="com"># تطبيع القيم من -1 إلى +1</span><span class="pln">
    img </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="pln">img </span><span class="pun">-</span><span class="pln"> </span><span class="lit">128</span><span class="pun">)</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="lit">128</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> </span><span class="lit">1</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> img</span><span class="pun">.</span><span class="pln">reshape</span><span class="pun">(</span><span class="lit">88</span><span class="pun">,</span><span class="lit">80</span><span class="pun">)</span></pre>

<p>
	نستدعي الدالة السابقة مثلًا على صورة بداية اللعبة لنعاين ناتج المعالجة:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9066_47" style=""><span class="com"># التهيئة الأولية</span><span class="pln">
state </span><span class="pun">=</span><span class="pln"> env</span><span class="pun">.</span><span class="pln">reset</span><span class="pun">()</span><span class="pln">
</span><span class="com"># معاينة الصورة بعد عمليات التهيئة</span><span class="pln">
state_preprocessed </span><span class="pun">=</span><span class="pln"> preprocess_state</span><span class="pun">(</span><span class="pln">state</span><span class="pun">).</span><span class="pln">reshape</span><span class="pun">(</span><span class="lit">88</span><span class="pun">,</span><span class="lit">80</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">state</span><span class="pun">.</span><span class="pln">shape</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">state_preprocessed</span><span class="pun">.</span><span class="pln">shape</span><span class="pun">)</span><span class="pln">
plt</span><span class="pun">.</span><span class="pln">imshow</span><span class="pun">(</span><span class="pln">state_preprocessed</span><span class="pun">)</span><span class="pln">
plt</span><span class="pun">.</span><span class="pln">show</span><span class="pun">()</span></pre>

<p>
	يكون الخرج:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9066_49" style=""><span class="pun">(</span><span class="lit">210</span><span class="pun">,</span><span class="pln"> </span><span class="lit">160</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">)</span><span class="pln">
</span><span class="pun">(</span><span class="lit">88</span><span class="pun">,</span><span class="pln"> </span><span class="lit">80</span><span class="pun">)</span></pre>

<p>
	والصورة المُعالجة:
</p>

<p style="text-align: center;">
	<img alt="003.png" class="ipsImage ipsImage_thumbnailed" data-fileid="110302" data-unique="5b1dgx3hx" src="https://academy.hsoub.com/uploads/monthly_2022_10/003.png.a4fe36196e70f81b3e84fbe5131547b0.png">
</p>

<p>
	نُعرّف فيما يلي الدالة <code>stack_frames</code> والتي تُجهز قائمة من الصور عددها (4 مثلًا)، نخزن العدد ضمن المتغير <code>stack_size</code>. تحوي القائمة نفس صورة البداية مكررة العدد نفسه <code>stack_size</code> مرة عند بداية كل حلقة episode لعب.
</p>

<p>
	لاحظ أننا نستخدم البنية الخاصة في بايثون المدعوة deque (قائمة مفتوحة الطرفين) والتي يُمكن لنا الإضافة عليها والحذف منها وذلك من طرفيها.
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9066_51" style=""><span class="com"># نستخدم 4 صور متعاقبة لملاحقة الحركة</span><span class="pln">
stack_size </span><span class="pun">=</span><span class="pln"> </span><span class="lit">4</span><span class="pln"> 
</span><span class="com"># تهيئة قائمة مفتوحة الطرفين</span><span class="pln">
</span><span class="com"># تحوي أربعة صور ذات قيم 0</span><span class="pln">
stacked_frames  </span><span class="pun">=</span><span class="pln">  deque</span><span class="pun">([</span><span class="pln">np</span><span class="pun">.</span><span class="pln">zeros</span><span class="pun">((</span><span class="lit">88</span><span class="pun">,</span><span class="lit">80</span><span class="pun">),</span><span class="pln"> dtype</span><span class="pun">=</span><span class="pln">np</span><span class="pun">.</span><span class="pln">int</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">for</span><span class="pln"> i </span><span class="kwd">in</span><span class="pln"> range</span><span class="pun">(</span><span class="pln">stack_size</span><span class="pun">)],</span><span class="pln"> maxlen</span><span class="pun">=</span><span class="pln">stack_size</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">def</span><span class="pln"> stack_frames</span><span class="pun">(</span><span class="pln">stacked_frames</span><span class="pun">,</span><span class="pln"> state</span><span class="pun">,</span><span class="pln"> is_new_episode</span><span class="pun">):</span><span class="pln">
    </span><span class="com"># المعالجة الأولية للصورة</span><span class="pln">
    frame </span><span class="pun">=</span><span class="pln"> preprocess_state</span><span class="pun">(</span><span class="pln">state</span><span class="pun">)</span><span class="pln">
    </span><span class="com"># حلقة جديدة</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> is_new_episode</span><span class="pun">:</span><span class="pln">
        </span><span class="com"># مسح الصور السابقة المكدّسة</span><span class="pln">
        stacked_frames </span><span class="pun">=</span><span class="pln"> deque</span><span class="pun">([</span><span class="pln">np</span><span class="pun">.</span><span class="pln">zeros</span><span class="pun">((</span><span class="lit">88</span><span class="pun">,</span><span class="lit">80</span><span class="pun">),</span><span class="pln"> dtype</span><span class="pun">=</span><span class="pln">np</span><span class="pun">.</span><span class="pln">int</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">for</span><span class="pln"> i </span><span class="kwd">in</span><span class="pln"> range</span><span class="pun">(</span><span class="pln">stack_size</span><span class="pun">)],</span><span class="pln"> maxlen</span><span class="pun">=</span><span class="pln">stack_size</span><span class="pun">)</span><span class="pln">
        </span><span class="com"># تكرار الصورة المعالجة في كل حلقة جديدة من اللعبة</span><span class="pln">
        </span><span class="kwd">for</span><span class="pln"> i </span><span class="kwd">in</span><span class="pln"> range</span><span class="pun">(</span><span class="pln">stack_size</span><span class="pun">):</span><span class="pln">
            stacked_frames</span><span class="pun">.</span><span class="pln">append</span><span class="pun">(</span><span class="pln">frame</span><span class="pun">)</span><span class="pln">
        </span><span class="com"># تكديس الصور</span><span class="pln">
        stacked_state </span><span class="pun">=</span><span class="pln"> np</span><span class="pun">.</span><span class="pln">stack</span><span class="pun">(</span><span class="pln">stacked_frames</span><span class="pun">,</span><span class="pln"> axis</span><span class="pun">=</span><span class="lit">2</span><span class="pun">)</span><span class="pln">     
    </span><span class="kwd">else</span><span class="pun">:</span><span class="pln">
        </span><span class="com"># بما أن القائمة مفتوحة الطرفين تضيف من أقصى اليمين</span><span class="pln">
        </span><span class="com"># نُحضر الصورة أقصى اليمين</span><span class="pln">
        frame</span><span class="pun">=</span><span class="pln">stacked_frames</span><span class="pun">[-</span><span class="lit">1</span><span class="pun">]</span><span class="pln">
        </span><span class="com"># إضافة الصورة </span><span class="pln">
        stacked_frames</span><span class="pun">.</span><span class="pln">append</span><span class="pun">(</span><span class="pln">frame</span><span class="pun">)</span><span class="pln">
        </span><span class="com"># إنشاء الحالة</span><span class="pln">
        stacked_state </span><span class="pun">=</span><span class="pln"> np</span><span class="pun">.</span><span class="pln">stack</span><span class="pun">(</span><span class="pln">stacked_frames</span><span class="pun">,</span><span class="pln"> axis</span><span class="pun">=</span><span class="lit">2</span><span class="pun">)</span><span class="pln"> 
    </span><span class="kwd">return</span><span class="pln"> stacked_state</span><span class="pun">,</span><span class="pln"> stacked_frames</span></pre>

<p>
	نُعرّف شبكة عصبية مؤلفة من ست طبقات: ثلاثة طبقات تلافيفية، تليها طبقة مسطحة flatten، ومن ثم طبقة موصولة بشكل كامل fully connected، تليها طبقة الخرج.
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9066_53" style=""><span class="kwd">def</span><span class="pln"> q_network</span><span class="pun">(</span><span class="pln">X</span><span class="pun">,</span><span class="pln"> name_scope</span><span class="pun">):</span><span class="pln">
    </span><span class="com"># تهيئة الطبقات</span><span class="pln">
    initializer </span><span class="pun">=</span><span class="pln"> tf</span><span class="pun">.</span><span class="pln">compat</span><span class="pun">.</span><span class="pln">v1</span><span class="pun">.</span><span class="pln">keras</span><span class="pun">.</span><span class="pln">initializers</span><span class="pun">.</span><span class="typ">VarianceScaling</span><span class="pun">(</span><span class="pln">scale</span><span class="pun">=</span><span class="lit">2.0</span><span class="pun">)</span><span class="pln">
    </span><span class="kwd">with</span><span class="pln"> tf</span><span class="pun">.</span><span class="pln">compat</span><span class="pun">.</span><span class="pln">v1</span><span class="pun">.</span><span class="pln">variable_scope</span><span class="pun">(</span><span class="pln">name_scope</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">as</span><span class="pln"> scope</span><span class="pun">:</span><span class="pln"> 
        </span><span class="com"># تهيئة الطبقات التلافيفية</span><span class="pln">
        layer_1 </span><span class="pun">=</span><span class="pln"> tf_slim</span><span class="pun">.</span><span class="pln">conv2d</span><span class="pun">(</span><span class="pln">X</span><span class="pun">,</span><span class="pln"> num_outputs</span><span class="pun">=</span><span class="lit">32</span><span class="pun">,</span><span class="pln"> kernel_size</span><span class="pun">=(</span><span class="lit">8</span><span class="pun">,</span><span class="lit">8</span><span class="pun">),</span><span class="pln"> stride</span><span class="pun">=</span><span class="lit">4</span><span class="pun">,</span><span class="pln"> padding</span><span class="pun">=</span><span class="str">'SAME'</span><span class="pun">,</span><span class="pln"> weights_initializer</span><span class="pun">=</span><span class="pln">initializer</span><span class="pun">)</span><span class="pln"> 
        tf</span><span class="pun">.</span><span class="pln">compat</span><span class="pun">.</span><span class="pln">v1</span><span class="pun">.</span><span class="pln">summary</span><span class="pun">.</span><span class="pln">histogram</span><span class="pun">(</span><span class="str">'layer_1'</span><span class="pun">,</span><span class="pln">layer_1</span><span class="pun">)</span><span class="pln">
        layer_2 </span><span class="pun">=</span><span class="pln"> tf_slim</span><span class="pun">.</span><span class="pln">conv2d</span><span class="pun">(</span><span class="pln">layer_1</span><span class="pun">,</span><span class="pln"> num_outputs</span><span class="pun">=</span><span class="lit">64</span><span class="pun">,</span><span class="pln"> kernel_size</span><span class="pun">=(</span><span class="lit">4</span><span class="pun">,</span><span class="lit">4</span><span class="pun">),</span><span class="pln"> stride</span><span class="pun">=</span><span class="lit">2</span><span class="pun">,</span><span class="pln"> padding</span><span class="pun">=</span><span class="str">'SAME'</span><span class="pun">,</span><span class="pln"> weights_initializer</span><span class="pun">=</span><span class="pln">initializer</span><span class="pun">)</span><span class="pln">
        tf</span><span class="pun">.</span><span class="pln">compat</span><span class="pun">.</span><span class="pln">v1</span><span class="pun">.</span><span class="pln">summary</span><span class="pun">.</span><span class="pln">histogram</span><span class="pun">(</span><span class="str">'layer_2'</span><span class="pun">,</span><span class="pln">layer_2</span><span class="pun">)</span><span class="pln">
        layer_3 </span><span class="pun">=</span><span class="pln"> tf_slim</span><span class="pun">.</span><span class="pln">conv2d</span><span class="pun">(</span><span class="pln">layer_2</span><span class="pun">,</span><span class="pln"> num_outputs</span><span class="pun">=</span><span class="lit">64</span><span class="pun">,</span><span class="pln"> kernel_size</span><span class="pun">=(</span><span class="lit">3</span><span class="pun">,</span><span class="lit">3</span><span class="pun">),</span><span class="pln"> stride</span><span class="pun">=</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> padding</span><span class="pun">=</span><span class="str">'SAME'</span><span class="pun">,</span><span class="pln"> weights_initializer</span><span class="pun">=</span><span class="pln">initializer</span><span class="pun">)</span><span class="pln">
        tf</span><span class="pun">.</span><span class="pln">compat</span><span class="pun">.</span><span class="pln">v1</span><span class="pun">.</span><span class="pln">summary</span><span class="pun">.</span><span class="pln">histogram</span><span class="pun">(</span><span class="str">'layer_3'</span><span class="pun">,</span><span class="pln">layer_3</span><span class="pun">)</span><span class="pln">
        </span><span class="com"># تسطيح نتيجة الطبقة الثالثة قبل تمريرها إلى الطبقة</span><span class="pln">
        </span><span class="com"># التالية الموصولة بشكل كامل</span><span class="pln">
        flat </span><span class="pun">=</span><span class="pln"> tf_slim</span><span class="pun">.</span><span class="pln">flatten</span><span class="pun">(</span><span class="pln">layer_3</span><span class="pun">)</span><span class="pln">
        </span><span class="com"># إدراج الطبقة الموصولة بشكل كامل</span><span class="pln">
        fc </span><span class="pun">=</span><span class="pln"> tf_slim</span><span class="pun">.</span><span class="pln">fully_connected</span><span class="pun">(</span><span class="pln">flat</span><span class="pun">,</span><span class="pln"> num_outputs</span><span class="pun">=</span><span class="lit">128</span><span class="pun">,</span><span class="pln"> weights_initializer</span><span class="pun">=</span><span class="pln">initializer</span><span class="pun">)</span><span class="pln">
        tf</span><span class="pun">.</span><span class="pln">compat</span><span class="pun">.</span><span class="pln">v1</span><span class="pun">.</span><span class="pln">summary</span><span class="pun">.</span><span class="pln">histogram</span><span class="pun">(</span><span class="str">'fc'</span><span class="pun">,</span><span class="pln">fc</span><span class="pun">)</span><span class="pln">
        </span><span class="com"># إضافة طبقة الخرج النهائية</span><span class="pln">
        output </span><span class="pun">=</span><span class="pln"> tf_slim</span><span class="pun">.</span><span class="pln">fully_connected</span><span class="pun">(</span><span class="pln">fc</span><span class="pun">,</span><span class="pln"> num_outputs</span><span class="pun">=</span><span class="pln">n_outputs</span><span class="pun">,</span><span class="pln"> activation_fn</span><span class="pun">=</span><span class="kwd">None</span><span class="pun">,</span><span class="pln"> weights_initializer</span><span class="pun">=</span><span class="pln">initializer</span><span class="pun">)</span><span class="pln">
        tf</span><span class="pun">.</span><span class="pln">compat</span><span class="pun">.</span><span class="pln">v1</span><span class="pun">.</span><span class="pln">summary</span><span class="pun">.</span><span class="pln">histogram</span><span class="pun">(</span><span class="str">'output'</span><span class="pun">,</span><span class="pln">output</span><span class="pun">)</span><span class="pln">
        </span><span class="com"># تخزين معاملات الشبكة كأوزان</span><span class="pln">
        vars </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">v</span><span class="pun">.</span><span class="pln">name</span><span class="pun">[</span><span class="pln">len</span><span class="pun">(</span><span class="pln">scope</span><span class="pun">.</span><span class="pln">name</span><span class="pun">):]:</span><span class="pln"> v </span><span class="kwd">for</span><span class="pln"> v </span><span class="kwd">in</span><span class="pln"> tf</span><span class="pun">.</span><span class="pln">compat</span><span class="pun">.</span><span class="pln">v1</span><span class="pun">.</span><span class="pln">get_collection</span><span class="pun">(</span><span class="pln">key</span><span class="pun">=</span><span class="pln">tf</span><span class="pun">.</span><span class="pln">compat</span><span class="pun">.</span><span class="pln">v1</span><span class="pun">.</span><span class="typ">GraphKeys</span><span class="pun">.</span><span class="pln">TRAINABLE_VARIABLES</span><span class="pun">,</span><span class="pln"> scope</span><span class="pun">=</span><span class="pln">scope</span><span class="pun">.</span><span class="pln">name</span><span class="pun">)}</span><span class="pln"> 
        </span><span class="com"># إرجاع كل من المتغيرات والخرج</span><span class="pln">
        </span><span class="com">#Return both variables and outputs together</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> vars</span><span class="pun">,</span><span class="pln"> output</span></pre>

<p>
	نُعرّف الدالة epsilon_greedy لتنفيذ السياسة المدعوة بسياسة إبسلون الشرهة epsilon greedy policy والتي تختار أفضل فعل باحتمال "1 - إبسلون" أو أي فعل آخر عشوائي باحتمال إبسلون.
</p>

<p>
	لاحظ أننا نُخفّض قيمة إبسلون مع مرور الوقت (زيادة عدد الخطوات) كي تستخدم هذه السياسة الأفعال الجيدة فقط.
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9066_55" style=""><span class="pln">epsilon </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.5</span><span class="pln">
eps_min </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.05</span><span class="pln">
eps_max </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1.0</span><span class="pln">
eps_decay_steps </span><span class="pun">=</span><span class="pln"> </span><span class="lit">500000</span><span class="pln">
</span><span class="kwd">def</span><span class="pln"> epsilon_greedy</span><span class="pun">(</span><span class="pln">action</span><span class="pun">,</span><span class="pln"> step</span><span class="pun">):</span><span class="pln">
    p </span><span class="pun">=</span><span class="pln"> np</span><span class="pun">.</span><span class="pln">random</span><span class="pun">.</span><span class="pln">random</span><span class="pun">(</span><span class="lit">1</span><span class="pun">).</span><span class="pln">squeeze</span><span class="pun">()</span><span class="pln"> </span><span class="com"># متحهة أحادية</span><span class="pln">
    epsilon </span><span class="pun">=</span><span class="pln"> max</span><span class="pun">(</span><span class="pln">eps_min</span><span class="pun">,</span><span class="pln"> eps_max </span><span class="pun">-</span><span class="pln"> </span><span class="pun">(</span><span class="pln">eps_max</span><span class="pun">-</span><span class="pln">eps_min</span><span class="pun">)</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> step</span><span class="pun">/</span><span class="pln">eps_decay_steps</span><span class="pun">)</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> p </span><span class="pun">&lt;</span><span class="pln"> epsilon</span><span class="pun">:</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> np</span><span class="pun">.</span><span class="pln">random</span><span class="pun">.</span><span class="pln">randint</span><span class="pun">(</span><span class="pln">n_outputs</span><span class="pun">)</span><span class="pln">
    </span><span class="kwd">else</span><span class="pun">:</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> action</span></pre>

<p>
	نهيئ فيما يلي ذاكرة تخزين مؤقت من النمط قائمة مفتوحة الطرفين deque لنضع فيها معلومات اللعب من الشكل SARSA.
</p>

<p>
	نُخزّن كل خبرة الروبوت أي (الحالة، الفعل، المكافأة) state, action, rewards في الذاكرة المؤقتة وهي الخبرة المكتسبة المفيدة عند إعادة اللعب experience replay buffer ونقوم لاحقًا بأخذ عينات منها y-values لتوليد القيم التي سنُدرب الشبكة عليها:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9066_57" style=""><span class="pln">buffer_len </span><span class="pun">=</span><span class="pln"> </span><span class="lit">20000</span><span class="pln">
</span><span class="com"># نستخدم لذاكرة التخزين المؤقت قائمة مفتوحة الطرفين</span><span class="pln">
exp_buffer </span><span class="pun">=</span><span class="pln"> deque</span><span class="pun">(</span><span class="pln">maxlen</span><span class="pun">=</span><span class="pln">buffer_len</span><span class="pun">)</span></pre>

<p>
	نُعرّف الدالة <code>sample_memories</code> التي تنتقي مجموعة عشوائية من تجارب التدريب:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9066_59" style=""><span class="com"># اختيار مجموعة عشوائية من تجارب التدريب</span><span class="pln">
</span><span class="com"># بطول حجم دفعة التدريب </span><span class="pln">
</span><span class="kwd">def</span><span class="pln"> sample_memories</span><span class="pun">(</span><span class="pln">batch_size</span><span class="pun">):</span><span class="pln">
    perm_batch </span><span class="pun">=</span><span class="pln"> np</span><span class="pun">.</span><span class="pln">random</span><span class="pun">.</span><span class="pln">permutation</span><span class="pun">(</span><span class="pln">len</span><span class="pun">(</span><span class="pln">exp_buffer</span><span class="pun">))[:</span><span class="pln">batch_size</span><span class="pun">]</span><span class="pln">
    mem </span><span class="pun">=</span><span class="pln"> np</span><span class="pun">.</span><span class="pln">array</span><span class="pun">(</span><span class="pln">exp_buffer</span><span class="pun">)[</span><span class="pln">perm_batch</span><span class="pun">]</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> mem</span><span class="pun">[:,</span><span class="lit">0</span><span class="pun">],</span><span class="pln"> mem</span><span class="pun">[:,</span><span class="lit">1</span><span class="pun">],</span><span class="pln"> mem</span><span class="pun">[:,</span><span class="lit">2</span><span class="pun">],</span><span class="pln"> mem</span><span class="pun">[:,</span><span class="lit">3</span><span class="pun">],</span><span class="pln"> mem</span><span class="pun">[:,</span><span class="lit">4</span><span class="pun">]</span></pre>

<p>
	نُعرّف فيما يلي جميع المعاملات المُترفعة hyperparameters للشبكة مع قيمها. اخترنا هذه القيم بعد بناًء على الخبرة في الشبكات العصبية وبعد العديد من التجارب.
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9066_61" style=""><span class="pln">num_episodes </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2000</span><span class="pln">
batch_size </span><span class="pun">=</span><span class="pln"> </span><span class="lit">48</span><span class="pln">
input_shape </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">None</span><span class="pun">,</span><span class="pln"> </span><span class="lit">88</span><span class="pun">,</span><span class="pln"> </span><span class="lit">80</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">)</span><span class="pln">
learning_rate </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.001</span><span class="pln">
</span><span class="com"># التعديل لملائمة الصور المكدّسة</span><span class="pln">
X_shape </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">None</span><span class="pun">,</span><span class="pln"> </span><span class="lit">88</span><span class="pun">,</span><span class="pln"> </span><span class="lit">80</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4</span><span class="pun">)</span><span class="pln">
discount_factor </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.97</span><span class="pln">
global_step </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pln">
copy_steps </span><span class="pun">=</span><span class="pln"> </span><span class="lit">100</span><span class="pln">
steps_train </span><span class="pun">=</span><span class="pln"> </span><span class="lit">4</span><span class="pln">
start_steps </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2000</span></pre>

<p>
	نُعرّف حاوية الدخل X:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9066_63" style=""><span class="pln">tf</span><span class="pun">.</span><span class="pln">compat</span><span class="pun">.</span><span class="pln">v1</span><span class="pun">.</span><span class="pln">reset_default_graph</span><span class="pun">()</span><span class="pln">
</span><span class="com"># تعريف حاوية دخل الشبكة العصبية أي حالة اللعبة</span><span class="pln">
X </span><span class="pun">=</span><span class="pln"> tf</span><span class="pun">.</span><span class="pln">compat</span><span class="pun">.</span><span class="pln">v1</span><span class="pun">.</span><span class="pln">placeholder</span><span class="pun">(</span><span class="pln">tf</span><span class="pun">.</span><span class="pln">float32</span><span class="pun">,</span><span class="pln"> shape</span><span class="pun">=</span><span class="pln">X_shape</span><span class="pun">)</span><span class="pln">
</span><span class="com"># تعريف متغير بولياني لقلب حالة التدريب </span><span class="pln">
in_training_mode </span><span class="pun">=</span><span class="pln"> tf</span><span class="pun">.</span><span class="pln">compat</span><span class="pun">.</span><span class="pln">v1</span><span class="pun">.</span><span class="pln">placeholder</span><span class="pun">(</span><span class="pln">tf</span><span class="pun">.</span><span class="pln">bool</span><span class="pun">)</span></pre>

<p>
	نبني فيما يلي شبكتين: الشبكة الأولية والشبكة الهدف مما يسمح بتوليد البيانات والتدريب بشكل متزامن:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9066_65" style=""><span class="com"># بناء الشبكة التي تولد جميع قيم التعلم لجميع الأفعال في الحالة</span><span class="pln">
mainQ</span><span class="pun">,</span><span class="pln"> mainQ_outputs </span><span class="pun">=</span><span class="pln"> q_network</span><span class="pun">(</span><span class="pln">X</span><span class="pun">,</span><span class="pln"> </span><span class="str">'mainQ'</span><span class="pun">)</span><span class="pln">

</span><span class="com"># بشكل مشابهة نبني الشبكة الهدف لقيم التعلم</span><span class="pln">
targetQ</span><span class="pun">,</span><span class="pln"> targetQ_outputs </span><span class="pun">=</span><span class="pln"> q_network</span><span class="pun">(</span><span class="pln">X</span><span class="pun">,</span><span class="pln"> </span><span class="str">'targetQ'</span><span class="pun">)</span><span class="pln">

</span><span class="com"># تعريف حاوية قيم الأفعال</span><span class="pln">
X_action </span><span class="pun">=</span><span class="pln"> tf</span><span class="pun">.</span><span class="pln">compat</span><span class="pun">.</span><span class="pln">v1</span><span class="pun">.</span><span class="pln">placeholder</span><span class="pun">(</span><span class="pln">tf</span><span class="pun">.</span><span class="pln">int32</span><span class="pun">,</span><span class="pln"> shape</span><span class="pun">=(</span><span class="kwd">None</span><span class="pun">,))</span><span class="pln">
Q_action </span><span class="pun">=</span><span class="pln"> tf</span><span class="pun">.</span><span class="pln">reduce_sum</span><span class="pun">(</span><span class="pln">input_tensor</span><span class="pun">=</span><span class="pln">targetQ_outputs </span><span class="pun">*</span><span class="pln"> tf</span><span class="pun">.</span><span class="pln">one_hot</span><span class="pun">(</span><span class="pln">X_action</span><span class="pun">,</span><span class="pln"> n_outputs</span><span class="pun">),</span><span class="pln"> axis</span><span class="pun">=-</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> keepdims</span><span class="pun">=</span><span class="kwd">True</span><span class="pun">)</span><span class="pln">

</span><span class="com"># نسخ قيم معاملات الشبكة إلى الشبكة الهدف</span><span class="pln">
copy_op </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">tf</span><span class="pun">.</span><span class="pln">compat</span><span class="pun">.</span><span class="pln">v1</span><span class="pun">.</span><span class="pln">assign</span><span class="pun">(</span><span class="pln">main_name</span><span class="pun">,</span><span class="pln"> targetQ</span><span class="pun">[</span><span class="pln">var_name</span><span class="pun">])</span><span class="pln"> </span><span class="kwd">for</span><span class="pln"> var_name</span><span class="pun">,</span><span class="pln"> main_name </span><span class="kwd">in</span><span class="pln"> mainQ</span><span class="pun">.</span><span class="pln">items</span><span class="pun">()]</span><span class="pln">
copy_target_to_main </span><span class="pun">=</span><span class="pln"> tf</span><span class="pun">.</span><span class="pln">group</span><span class="pun">(*</span><span class="pln">copy_op</span><span class="pun">)</span></pre>

<p>
	نُعرّف فيما يلي الخرج ونقوم بحساب الخسارة:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9066_67" style=""><span class="com"># تعريف حاوبة الخرج</span><span class="pln">
y </span><span class="pun">=</span><span class="pln"> tf</span><span class="pun">.</span><span class="pln">compat</span><span class="pun">.</span><span class="pln">v1</span><span class="pun">.</span><span class="pln">placeholder</span><span class="pun">(</span><span class="pln">tf</span><span class="pun">.</span><span class="pln">float32</span><span class="pun">,</span><span class="pln"> shape</span><span class="pun">=(</span><span class="kwd">None</span><span class="pun">,</span><span class="lit">1</span><span class="pun">))</span><span class="pln">
</span><span class="com"># حساب الخسارة والتي هي الفرق بين القيمة الحقيقية والقيمة المتوقعة</span><span class="pln">
loss </span><span class="pun">=</span><span class="pln"> tf</span><span class="pun">.</span><span class="pln">reduce_mean</span><span class="pun">(</span><span class="pln">input_tensor</span><span class="pun">=</span><span class="pln">tf</span><span class="pun">.</span><span class="pln">square</span><span class="pun">(</span><span class="pln">y </span><span class="pun">-</span><span class="pln"> Q_action</span><span class="pun">))</span><span class="pln">
</span><span class="com"># تحسين الخسارة</span><span class="pln">
optimizer </span><span class="pun">=</span><span class="pln"> tf</span><span class="pun">.</span><span class="pln">compat</span><span class="pun">.</span><span class="pln">v1</span><span class="pun">.</span><span class="pln">train</span><span class="pun">.</span><span class="typ">AdamOptimizer</span><span class="pun">(</span><span class="pln">learning_rate</span><span class="pun">)</span><span class="pln">
training_op </span><span class="pun">=</span><span class="pln"> optimizer</span><span class="pun">.</span><span class="pln">minimize</span><span class="pun">(</span><span class="pln">loss</span><span class="pun">)</span></pre>

<p>
	نبدأ الآن جلسة Tensorflow ونُشغّل النموذج model:
</p>

<ol>
	<li>
		نُجري أولًا المعالجة الأولية لصورة شاشة اللعب ومن ثم نُمرر الناتج (الحالة s) إلى الشبكة العصبية DQN والتي تُعيد جميع قيم التعلم Q-values.
	</li>
	<li>
		نختار أحد الأفعال a باستخدام سياسة إبسلون الجشعة.
	</li>
	<li>
		نُنفذ الفعل a على الحالة s وننتقل إلى حالة جديدة snew مع حصولنا على مكافأة (تكون الحالة الجديدة هي الصورة المعالجة لشاشة اللعب التالية)
	</li>
	<li>
		نُخزّن هذا الانتقال في الذاكرة المؤقتة على الشكل ,a,r,snew&gt;
	</li>
	<li>
		ننتقي بعض الانتقالات من الذاكرة العشوائية ونحسب الخسارة.
	</li>
	<li>
		نُعدّل معاملات الشبكة لتخفيض الخسارة.
	</li>
	<li>
		ننسخ أوزان شبكة التدريب إلى الشبكة الفعلية.
	</li>
	<li>
		نكرر الخطوات السابقة عددًا من المرات (num_episodes).
	</li>
</ol>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9066_69" style=""><span class="kwd">with</span><span class="pln"> tf</span><span class="pun">.</span><span class="pln">compat</span><span class="pun">.</span><span class="pln">v1</span><span class="pun">.</span><span class="typ">Session</span><span class="pun">()</span><span class="pln"> </span><span class="kwd">as</span><span class="pln"> sess</span><span class="pun">:</span><span class="pln">
    init </span><span class="pun">=</span><span class="pln"> tf</span><span class="pun">.</span><span class="pln">compat</span><span class="pun">.</span><span class="pln">v1</span><span class="pun">.</span><span class="pln">global_variables_initializer</span><span class="pun">()</span><span class="pln">
    init</span><span class="pun">.</span><span class="pln">run</span><span class="pun">()</span><span class="pln">

    </span><span class="com"># من أجل كل دورة</span><span class="pln">
    history </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[]</span><span class="pln">
    </span><span class="kwd">for</span><span class="pln"> i </span><span class="kwd">in</span><span class="pln"> range</span><span class="pun">(</span><span class="pln">num_episodes</span><span class="pun">):</span><span class="pln">
        done </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">False</span><span class="pln">
        obs </span><span class="pun">=</span><span class="pln"> env</span><span class="pun">.</span><span class="pln">reset</span><span class="pun">()</span><span class="pln">
        epoch </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pln">
        episodic_reward </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pln">
        actions_counter </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Counter</span><span class="pun">()</span><span class="pln"> 
        episodic_loss </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[]</span><span class="pln">

        </span><span class="com"># تكديس الصور في الخطوة الأولى</span><span class="pln">
        obs</span><span class="pun">,</span><span class="pln">stacked_frames</span><span class="pun">=</span><span class="pln"> stack_frames</span><span class="pun">(</span><span class="pln">stacked_frames</span><span class="pun">,</span><span class="pln">obs</span><span class="pun">,</span><span class="kwd">True</span><span class="pun">)</span><span class="pln">

        </span><span class="com"># الدوران طالما لم نصل للحالة النهائية</span><span class="pln">
        </span><span class="kwd">while</span><span class="pln"> </span><span class="kwd">not</span><span class="pln"> done</span><span class="pun">:</span><span class="pln">
            </span><span class="com"># توليد البيانات باستخدام الشبكة غير المدربة</span><span class="pln">
            </span><span class="com"># إدخال صورة اللعبة والحصول على قيم التعلم</span><span class="pln">
            </span><span class="com"># من أجل كل فعل</span><span class="pln">
            actions </span><span class="pun">=</span><span class="pln"> mainQ_outputs</span><span class="pun">.</span><span class="pln">eval</span><span class="pun">(</span><span class="pln">feed_dict</span><span class="pun">={</span><span class="pln">X</span><span class="pun">:[</span><span class="pln">obs</span><span class="pun">],</span><span class="pln"> in_training_mode</span><span class="pun">:</span><span class="kwd">False</span><span class="pun">})</span><span class="pln">

            </span><span class="com"># اختيار  الفعل</span><span class="pln">
            action </span><span class="pun">=</span><span class="pln"> np</span><span class="pun">.</span><span class="pln">argmax</span><span class="pun">(</span><span class="pln">actions</span><span class="pun">,</span><span class="pln"> axis</span><span class="pun">=-</span><span class="lit">1</span><span class="pun">)</span><span class="pln">
            actions_counter</span><span class="pun">[</span><span class="pln">str</span><span class="pun">(</span><span class="pln">action</span><span class="pun">)]</span><span class="pln"> </span><span class="pun">+=</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> 

            </span><span class="com"># استخدام سياسة ابسلون الشرهة لاختيار الفعل</span><span class="pln">
            action </span><span class="pun">=</span><span class="pln"> epsilon_greedy</span><span class="pun">(</span><span class="pln">action</span><span class="pun">,</span><span class="pln"> global_step</span><span class="pun">)</span><span class="pln">

            </span><span class="com"># تنفيذ الفعل</span><span class="pln">
            </span><span class="com"># والانتقال للحالة التالية وحساب المكافأة</span><span class="pln">
            next_obs</span><span class="pun">,</span><span class="pln"> reward</span><span class="pun">,</span><span class="pln"> done</span><span class="pun">,</span><span class="pln"> _ </span><span class="pun">=</span><span class="pln"> env</span><span class="pun">.</span><span class="pln">step</span><span class="pun">(</span><span class="pln">action</span><span class="pun">)</span><span class="pln">
            </span><span class="com"># تكديس مابين الدورات</span><span class="pln">
            next_obs</span><span class="pun">,</span><span class="pln"> stacked_frames </span><span class="pun">=</span><span class="pln"> stack_frames</span><span class="pun">(</span><span class="pln">stacked_frames</span><span class="pun">,</span><span class="pln"> next_obs</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">False</span><span class="pun">)</span><span class="pln">

            </span><span class="com"># تخزين الانتقال كتجربة في</span><span class="pln">
            </span><span class="com"># الذاكرة المؤقتة لإعادة اللعب</span><span class="pln">
            exp_buffer</span><span class="pun">.</span><span class="pln">append</span><span class="pun">([</span><span class="pln">obs</span><span class="pun">,</span><span class="pln"> action</span><span class="pun">,</span><span class="pln"> next_obs</span><span class="pun">,</span><span class="pln"> reward</span><span class="pun">,</span><span class="pln"> done</span><span class="pun">])</span><span class="pln">

            </span><span class="com"># تدريب الشبكة من الذاكرة المؤقتة لإعادة اللعب بعد عدة خطوات معينة</span><span class="pln">
            </span><span class="kwd">if</span><span class="pln"> global_step </span><span class="pun">%</span><span class="pln"> steps_train </span><span class="pun">==</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="kwd">and</span><span class="pln"> global_step </span><span class="pun">&gt;</span><span class="pln"> start_steps</span><span class="pun">:</span><span class="pln">
                </span><span class="com"># تحوي الذاكرة المؤقتة لإعادة اللعب</span><span class="pln">
                </span><span class="com"># كل ما تمت معالجته وتكديسه</span><span class="pln">
                </span><span class="com"># mem[:,0], mem[:,1], mem[:,2], mem[:,3], mem[:,4]</span><span class="pln">
                o_obs</span><span class="pun">,</span><span class="pln"> o_act</span><span class="pun">,</span><span class="pln"> o_next_obs</span><span class="pun">,</span><span class="pln"> o_rew</span><span class="pun">,</span><span class="pln"> o_done </span><span class="pun">=</span><span class="pln"> sample_memories</span><span class="pun">(</span><span class="pln">batch_size</span><span class="pun">)</span><span class="pln">

                </span><span class="com"># الحالات</span><span class="pln">
                o_obs </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">x </span><span class="kwd">for</span><span class="pln"> x </span><span class="kwd">in</span><span class="pln"> o_obs</span><span class="pun">]</span><span class="pln">

                </span><span class="com"># الحالات التالية</span><span class="pln">
                o_next_obs </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">x </span><span class="kwd">for</span><span class="pln"> x </span><span class="kwd">in</span><span class="pln"> o_next_obs</span><span class="pun">]</span><span class="pln">

                </span><span class="com"># الأفعال التالية</span><span class="pln">
                next_act </span><span class="pun">=</span><span class="pln"> mainQ_outputs</span><span class="pun">.</span><span class="pln">eval</span><span class="pun">(</span><span class="pln">feed_dict</span><span class="pun">={</span><span class="pln">X</span><span class="pun">:</span><span class="pln">o_next_obs</span><span class="pun">,</span><span class="pln"> in_training_mode</span><span class="pun">:</span><span class="kwd">False</span><span class="pun">})</span><span class="pln">

                </span><span class="com"># المكافآت</span><span class="pln">
                y_batch </span><span class="pun">=</span><span class="pln"> o_rew </span><span class="pun">+</span><span class="pln"> discount_factor </span><span class="pun">*</span><span class="pln"> np</span><span class="pun">.</span><span class="pln">max</span><span class="pun">(</span><span class="pln">next_act</span><span class="pun">,</span><span class="pln"> axis</span><span class="pun">=-</span><span class="lit">1</span><span class="pun">)</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="pun">(</span><span class="lit">1</span><span class="pun">-</span><span class="pln">o_done</span><span class="pun">)</span><span class="pln"> 

                train_loss</span><span class="pun">,</span><span class="pln"> _ </span><span class="pun">=</span><span class="pln"> sess</span><span class="pun">.</span><span class="pln">run</span><span class="pun">([</span><span class="pln">loss</span><span class="pun">,</span><span class="pln"> training_op</span><span class="pun">],</span><span class="pln"> feed_dict</span><span class="pun">={</span><span class="pln">X</span><span class="pun">:</span><span class="pln">o_obs</span><span class="pun">,</span><span class="pln"> y</span><span class="pun">:</span><span class="pln">np</span><span class="pun">.</span><span class="pln">expand_dims</span><span class="pun">(</span><span class="pln">y_batch</span><span class="pun">,</span><span class="pln"> axis</span><span class="pun">=-</span><span class="lit">1</span><span class="pun">),</span><span class="pln"> X_action</span><span class="pun">:</span><span class="pln">o_act</span><span class="pun">,</span><span class="pln"> in_training_mode</span><span class="pun">:</span><span class="kwd">True</span><span class="pun">})</span><span class="pln">
                episodic_loss</span><span class="pun">.</span><span class="pln">append</span><span class="pun">(</span><span class="pln">train_loss</span><span class="pun">)</span><span class="pln">

            </span><span class="com"># نسخ أوزان الشبكة الرئيسية إلى الشبكة الهدف</span><span class="pln">
            </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">global_step</span><span class="pun">+</span><span class="lit">1</span><span class="pun">)</span><span class="pln"> </span><span class="pun">%</span><span class="pln"> copy_steps </span><span class="pun">==</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="kwd">and</span><span class="pln"> global_step </span><span class="pun">&gt;</span><span class="pln"> start_steps</span><span class="pun">:</span><span class="pln">
                copy_target_to_main</span><span class="pun">.</span><span class="pln">run</span><span class="pun">()</span><span class="pln">

            obs </span><span class="pun">=</span><span class="pln"> next_obs
            epoch </span><span class="pun">+=</span><span class="pln"> </span><span class="lit">1</span><span class="pln">
            global_step </span><span class="pun">+=</span><span class="pln"> </span><span class="lit">1</span><span class="pln">
            episodic_reward </span><span class="pun">+=</span><span class="pln"> reward
        next_obs</span><span class="pun">=</span><span class="pln">np</span><span class="pun">.</span><span class="pln">zeros</span><span class="pun">(</span><span class="pln">obs</span><span class="pun">.</span><span class="pln">shape</span><span class="pun">)</span><span class="pln">
        exp_buffer</span><span class="pun">.</span><span class="pln">append</span><span class="pun">([</span><span class="pln">obs</span><span class="pun">,</span><span class="pln"> action</span><span class="pun">,</span><span class="pln"> next_obs</span><span class="pun">,</span><span class="pln"> reward</span><span class="pun">,</span><span class="pln"> done</span><span class="pun">])</span><span class="pln">
        obs</span><span class="pun">=</span><span class="pln"> env</span><span class="pun">.</span><span class="pln">reset</span><span class="pun">()</span><span class="pln">
        obs</span><span class="pun">,</span><span class="pln">stacked_frames</span><span class="pun">=</span><span class="pln"> stack_frames</span><span class="pun">(</span><span class="pln">stacked_frames</span><span class="pun">,</span><span class="pln">obs</span><span class="pun">,</span><span class="kwd">True</span><span class="pun">)</span><span class="pln">  
        history</span><span class="pun">.</span><span class="pln">append</span><span class="pun">(</span><span class="pln">episodic_reward</span><span class="pun">)</span><span class="pln">
        </span><span class="kwd">print</span><span class="pun">(</span><span class="str">'Epochs per episode:'</span><span class="pun">,</span><span class="pln"> epoch</span><span class="pun">,</span><span class="pln"> </span><span class="str">'Episode Reward:'</span><span class="pun">,</span><span class="pln"> episodic_reward</span><span class="pun">,</span><span class="str">"Episode number:"</span><span class="pun">,</span><span class="pln"> len</span><span class="pun">(</span><span class="pln">history</span><span class="pun">))</span></pre>

<p>
	نرسم المكافآت وفق الحلقات:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9066_71" style=""><span class="pln">plt</span><span class="pun">.</span><span class="pln">plot</span><span class="pun">(</span><span class="pln">history</span><span class="pun">)</span><span class="pln">
plt</span><span class="pun">.</span><span class="pln">show</span><span class="pun">()</span></pre>

<p>
	مما يُعطي مثلًا:
</p>

<p style="text-align: center;">
	<img alt="004.png" class="ipsImage ipsImage_thumbnailed" data-fileid="110303" data-unique="sr1ah8pod" style="width: 400px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2022_10/004.png.eac375a9cc12b3094490a0f2c3f4a42a.png">
</p>

<p>
	يُمكن في النهاية معاينة أداء الروبوت وتسجيل فيديو للعبة:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9066_74" style=""><span class="com"># تسجيل فيديو بهدف التقييم</span><span class="pln">
gymlogger</span><span class="pun">.</span><span class="pln">set_level</span><span class="pun">(</span><span class="lit">40</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">def</span><span class="pln"> show_video</span><span class="pun">():</span><span class="pln">
  </span><span class="com"># مسار ملف الفيديو</span><span class="pln">
  mp4list </span><span class="pun">=</span><span class="pln"> glob</span><span class="pun">.</span><span class="pln">glob</span><span class="pun">(</span><span class="str">'video/*.mp4'</span><span class="pun">)</span><span class="pln">
  </span><span class="com"># التأكد من وجود الفيديو</span><span class="pln">
  </span><span class="kwd">if</span><span class="pln"> len</span><span class="pun">(</span><span class="pln">mp4list</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">0</span><span class="pun">:</span><span class="pln">
    mp4 </span><span class="pun">=</span><span class="pln"> mp4list</span><span class="pun">[</span><span class="lit">0</span><span class="pun">]</span><span class="pln">
    </span><span class="com"># فتح ملف الفيديو</span><span class="pln">
    video </span><span class="pun">=</span><span class="pln"> io</span><span class="pun">.</span><span class="pln">open</span><span class="pun">(</span><span class="pln">mp4</span><span class="pun">,</span><span class="pln"> </span><span class="str">'r+b'</span><span class="pun">).</span><span class="pln">read</span><span class="pun">()</span><span class="pln">
    </span><span class="com"># التحويل لكود 64</span><span class="pln">
    encoded </span><span class="pun">=</span><span class="pln"> base64</span><span class="pun">.</span><span class="pln">b64encode</span><span class="pun">(</span><span class="pln">video</span><span class="pun">)</span><span class="pln">
    </span><span class="com"># عرض الفيديو في حالة حاسوب محلي</span><span class="pln">
    </span><span class="com"># HTML بتوليد</span><span class="pln">
    ipythondisplay</span><span class="pun">.</span><span class="pln">display</span><span class="pun">(</span><span class="pln">HTML</span><span class="pun">(</span><span class="pln">data</span><span class="pun">=</span><span class="str">'''&lt;video alt="test" autoplay 
                loop controls style="height: 400px;"&gt;
                &lt;source src="data:video/mp4;base64,{0}" type="video/mp4" /&gt;
             &lt;/video&gt;'''</span><span class="pun">.</span><span class="pln">format</span><span class="pun">(</span><span class="pln">encoded</span><span class="pun">.</span><span class="pln">decode</span><span class="pun">(</span><span class="str">'ascii'</span><span class="pun">))))</span><span class="pln">
  </span><span class="kwd">else</span><span class="pun">:</span><span class="pln"> 
    </span><span class="kwd">print</span><span class="pun">(</span><span class="str">"Could not find video"</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">def</span><span class="pln"> wrap_env</span><span class="pun">(</span><span class="pln">env</span><span class="pun">):</span><span class="pln">
  env </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Monitor</span><span class="pun">(</span><span class="pln">env</span><span class="pun">,</span><span class="pln"> </span><span class="str">'./video'</span><span class="pun">,</span><span class="pln"> force</span><span class="pun">=</span><span class="kwd">True</span><span class="pun">)</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> env

</span><span class="com"># تقييم النموذج</span><span class="pln">
environment </span><span class="pun">=</span><span class="pln"> wrap_env</span><span class="pun">(</span><span class="pln">gym</span><span class="pun">.</span><span class="pln">make</span><span class="pun">(</span><span class="str">'SpaceInvaders-v0'</span><span class="pun">))</span><span class="pln">
done </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">False</span><span class="pln">
observation </span><span class="pun">=</span><span class="pln"> environment</span><span class="pun">.</span><span class="pln">reset</span><span class="pun">()</span><span class="pln">
new_observation </span><span class="pun">=</span><span class="pln"> observation
prev_input </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">None</span><span class="pln">
</span><span class="kwd">with</span><span class="pln"> tf</span><span class="pun">.</span><span class="pln">compat</span><span class="pun">.</span><span class="pln">v1</span><span class="pun">.</span><span class="typ">Session</span><span class="pun">()</span><span class="pln"> </span><span class="kwd">as</span><span class="pln"> sess</span><span class="pun">:</span><span class="pln">
    init</span><span class="pun">.</span><span class="pln">run</span><span class="pun">()</span><span class="pln">
    observation</span><span class="pun">,</span><span class="pln"> stacked_frames </span><span class="pun">=</span><span class="pln"> stack_frames</span><span class="pun">(</span><span class="pln">stacked_frames</span><span class="pun">,</span><span class="pln"> observation</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">True</span><span class="pun">)</span><span class="pln">
    </span><span class="kwd">while</span><span class="pln"> </span><span class="kwd">True</span><span class="pun">:</span><span class="pln">
        </span><span class="com"># الحصول على قيم التعلم</span><span class="pln">
        actions </span><span class="pun">=</span><span class="pln"> mainQ_outputs</span><span class="pun">.</span><span class="pln">eval</span><span class="pun">(</span><span class="pln">feed_dict</span><span class="pun">={</span><span class="pln">X</span><span class="pun">:[</span><span class="pln">observation</span><span class="pun">],</span><span class="pln"> in_training_mode</span><span class="pun">:</span><span class="kwd">False</span><span class="pun">})</span><span class="pln">

        </span><span class="com"># الحصول على الفعل</span><span class="pln">
        action </span><span class="pun">=</span><span class="pln"> np</span><span class="pun">.</span><span class="pln">argmax</span><span class="pun">(</span><span class="pln">actions</span><span class="pun">,</span><span class="pln"> axis</span><span class="pun">=-</span><span class="lit">1</span><span class="pun">)</span><span class="pln">
        actions_counter</span><span class="pun">[</span><span class="pln">str</span><span class="pun">(</span><span class="pln">action</span><span class="pun">)]</span><span class="pln"> </span><span class="pun">+=</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> 

        </span><span class="com"># اختيار الفعل باستخدام سياسة إبسلون الشرهة</span><span class="pln">
        action </span><span class="pun">=</span><span class="pln"> epsilon_greedy</span><span class="pun">(</span><span class="pln">action</span><span class="pun">,</span><span class="pln"> global_step</span><span class="pun">)</span><span class="pln">
        </span><span class="com"># يجب إضافة التعليمة التالية على حاسوب محلي</span><span class="pln">
        </span><span class="com"># environment.render()</span><span class="pln">
        new_observation</span><span class="pun">,</span><span class="pln"> stacked_frames </span><span class="pun">=</span><span class="pln"> stack_frames</span><span class="pun">(</span><span class="pln">stacked_frames</span><span class="pun">,</span><span class="pln"> new_observation</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">False</span><span class="pun">)</span><span class="pln">   
        observation </span><span class="pun">=</span><span class="pln"> new_observation
        </span><span class="com"># تنفيذ الفعل و الانتقال للخطوة التالية</span><span class="pln">
        new_observation</span><span class="pun">,</span><span class="pln"> reward</span><span class="pun">,</span><span class="pln"> done</span><span class="pun">,</span><span class="pln"> _ </span><span class="pun">=</span><span class="pln"> environment</span><span class="pun">.</span><span class="pln">step</span><span class="pun">(</span><span class="pln">action</span><span class="pun">)</span><span class="pln">
        </span><span class="kwd">if</span><span class="pln"> done</span><span class="pun">:</span><span class="pln"> 
          </span><span class="kwd">break</span><span class="pln">
    environment</span><span class="pun">.</span><span class="pln">close</span><span class="pun">()</span></pre>

<p>
	يُمكن أن يكون الفيديو مثلًا:
</p>

<p style="text-align: center;">
	<img alt="005.gif" class="ipsImage ipsImage_thumbnailed" data-fileid="110304" data-unique="tzt6lyrp9" src="https://academy.hsoub.com/uploads/monthly_2022_10/005.gif.f9b636d807533ed93a8939ff4a8b1daf.gif">
</p>

<h2>
	الخلاصة
</h2>

<p>
	بنينا في هذا الدرس روبوتًا يلعب لعبة غزو الفضاء وذلك باستخدام التعلم المعزز العميق وفق النموذج الحُر Deep Q-learnin.
</p>

<p>
	السؤال الطبيعي الذي سيخطر ببالنا هو، هل يمكننا بناء روبوتاتٍ لألعابٍ أكثر تعقيدًا مثل لعبة StarCraft 2؟ فكما اتضح لنا، إن هذا سؤالٌ بحثيٌ معلقٌ ومدعومٌ بأدواتٍ <a href="https://academy.hsoub.com/programming/general/%D9%85%D8%A7-%D8%A7%D9%84%D9%85%D9%82%D8%B5%D9%88%D8%AF-%D8%A8%D9%85%D8%B5%D8%B7%D9%84%D8%AD-%D9%85%D9%81%D8%AA%D9%88%D8%AD-%D8%A7%D9%84%D9%85%D8%B5%D8%AF%D8%B1-open-source%D8%9F-r885/" rel="">مفتوحة المصدر</a> من شركاتٍ كبيرةٍ مثل غوغل Google وديب مايند DeepMind وشركة بليزارد Blizzard. فإذا كانت هذه المشاكل تهمك فعلًا، فيمكنك الاطلاع على <a href="https://openai.com/requests-for-research/" rel="external nofollow">المشاكل الحالية التي يواجهونها</a>.
</p>

<p>
	يُمكن تجربة المثال كاملًا من موقع Google Colab من <a href="https://colab.research.google.com/drive/1E31j7snKTI_rkZm6g1WSy9kerGOB7cTx#scrollTo=_ZS6Fg0XN-Jc" rel="external nofollow">الرابط</a>.
</p>

<h2>
	المصادر
</h2>

<ul>
	<li>
		<a href="https://towardsdatascience.com/optimized-deep-q-learning-for-automated-atari-space-invaders-an-implementation-in-tensorflow-2-0-80352c744fdc" rel="external nofollow">Optimized Space Invaders using Deep Q-learning: An Implementation in Tensorflow 2.0</a>
	</li>
	<li>
		<a href="https://gym.openai.com/docs/" rel="external nofollow">Getting Started with Gym</a>
	</li>
	<li>
		<a href="https://gym.openai.com/envs/SpaceInvaders-v0/" rel="external nofollow">https://gym.openai.com/envs/SpaceInvaders-v0/</a>
	</li>
	<li>
		<a href="https://www.digitalocean.com/community/books/python-machine-learning-projects-a-digitalocean-ebook" rel="external nofollow">Python Machine Learning Projects</a>.
	</li>
</ul>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A8%D9%86%D8%A7%D8%A1-%D8%B4%D8%A8%D9%83%D8%A9-%D8%B9%D8%B5%D8%A8%D9%8A%D8%A9-%D9%84%D9%84%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D8%A3%D8%B1%D9%82%D8%A7%D9%85-%D8%A7%D9%84%D9%85%D9%83%D8%AA%D9%88%D8%A8%D8%A9-%D8%A8%D8%AE%D8%B7-%D8%A7%D9%84%D9%8A%D8%AF-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%85%D9%83%D8%AA%D8%A8%D8%A9-tensorflow-r1267/" rel="">بناء شبكة عصبية للتعرف على الأرقام المكتوبة بخط اليد باستخدام مكتبة TensorFlow </a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/python/%D8%A8%D9%86%D8%A7%D8%A1-%D9%85%D8%B5%D9%86%D9%81-%D8%A8%D8%A7%D9%84%D8%A7%D8%B9%D8%AA%D9%85%D8%A7%D8%AF-%D8%B9%D9%84%D9%89-%D8%B7%D8%B1%D9%82-%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9-%D8%A8%D9%84%D8%BA%D8%A9-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%85%D9%83%D8%AA%D8%A8%D8%A9-scikit-learn-r1266/" rel="">بناء مصنف بالاعتماد على طرق تعلم الآلة بلغة بايثون باستخدام مكتبة Scikit-Learn</a>
	</li>
	<li>
		النسخة الكاملة من كتاب <a href="https://academy.hsoub.com/files/17-%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A7%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A-%D9%88%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9/" rel="">مدخل إلى الذكاء الاصطناعي وتعلم الآلة</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1268</guid><pubDate>Sun, 18 Jul 2021 16:00:00 +0000</pubDate></item><item><title>&#x628;&#x646;&#x627;&#x621; &#x634;&#x628;&#x643;&#x629; &#x639;&#x635;&#x628;&#x64A;&#x629; &#x644;&#x644;&#x62A;&#x639;&#x631;&#x641; &#x639;&#x644;&#x649; &#x627;&#x644;&#x623;&#x631;&#x642;&#x627;&#x645; &#x627;&#x644;&#x645;&#x643;&#x62A;&#x648;&#x628;&#x629; &#x628;&#x62E;&#x637; &#x627;&#x644;&#x64A;&#x62F; &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x645;&#x643;&#x62A;&#x628;&#x629; TensorFlow</title><link>https://academy.hsoub.com/programming/artificial-intelligence/%D8%A8%D9%86%D8%A7%D8%A1-%D8%B4%D8%A8%D9%83%D8%A9-%D8%B9%D8%B5%D8%A8%D9%8A%D8%A9-%D9%84%D9%84%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D8%A3%D8%B1%D9%82%D8%A7%D9%85-%D8%A7%D9%84%D9%85%D9%83%D8%AA%D9%88%D8%A8%D8%A9-%D8%A8%D8%AE%D8%B7-%D8%A7%D9%84%D9%8A%D8%AF-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%85%D9%83%D8%AA%D8%A8%D8%A9-tensorflow-r1267/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2021_07/60ed610e435e3_-----------TensorFlow.png.26f451d19f14a4b04e72d2123be4caaa.png" /></p>
<p>
	تُستخدم الشبكات العصبية كوسيلةٍ <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D9%85%D8%A8%D8%AA%D8%AF%D8%A6%D9%8A%D9%86-%D9%84%D9%81%D9%87%D9%85-%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%B9%D9%85%D9%8A%D9%82-r1422/" rel="">للتعلم العميق</a>، فهي واحدةٌ من المجالات الفرعية العديدة لطُرق تطبيق <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A/" rel="">الذكاء الصناعي</a>. وقد اقْتُرحت لأول مرةٍ منذ حوالي 70 عامًا في محاولةٍ لمحاكاة طريقة عمل دماغ الإنسان، إلا أنها أبسط بكثيرٍ من الخلايا العصبية الحقيقة، إذ أن كلّ خليةٍ اصطناعيةٍ مرتبطةٌ بعِدة طبقاتٍ، ولكلّ واحدةٍ منها وزنٌ مُعينٌ يُعبر عن أهمية هذه الطبقة، وذلك لتحديد كيفية استجابة الخلية العصبية عند نشْر البيانات عبرها، وبينما كانت الشبكات العصبية سابقًا محدودةً في عدد الخلايا العصبية التي تستطيع محاكاتها في ذلك الوقت -وهو الأمر الذي انعكس بدوره على تعقيد عملية التعلم التي يمكننا تحقيقها-، إلا أنه في السنوات الأخيرة، ونظرًا للتقدم الكبير في تطوّر الأجهزة، استطعنا أخيرًا بناء شبكاتٍ عصبيةٍ عميقةٍ جدًا، وتدريبها على مجموعات بياناتٍ هائلةٍ وضخمة كذلك، مما أدّى إلى تحقيق قفزاتٍ نوعية في <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A-%D9%85%D8%B1%D8%A7%D8%AD%D9%84-%D8%A7%D9%84%D8%A8%D8%AF%D8%A1-%D9%88%D8%A7%D9%84%D8%AA%D8%B7%D9%88%D8%B1-%D9%88%D8%A7%D9%84%D8%A3%D8%B3%D8%B3-%D8%A7%D9%84%D8%AA%D9%8A-%D9%86%D8%B4%D8%A3-%D8%B9%D9%84%D9%8A%D9%87%D8%A7-r988/" rel="">تطور الذكاء الاصطناعي</a> وتحديدًا تعلم الآلة.
</p>

<p>
	سمحت تلك القفزات النوعية للآلات بمُقاربة قدرات البشر، بل وتجاوزتها في أداء بعض المهام المحدودة. ومن بين هذه المهام، قدرتها على التعرف على الكائنات، فعلى الرغم من أن الآلات كانت غير قادرة تاريخيًا على منافسة قوة الرؤية البشرية، إلا أنّ التطورات الحديثة في التعلم العميق جعلت من الممكن بناء شبكاتٍ عصبيةٍ باستطاعتها التعرف على الكائنات والوجوه والنصوص، بل وحتى العواطف!
</p>

<p>
	سنُطبق في هذا المقال قِسمًا فرعيًا صغيرًا من طُرق التعرف على الكائنات، وتحديدًا التعرف على الأرقام المكتوبة بخط اليد، وذلك باستخدام مكتبة <a href="https://www.tensorflow.org" rel="external nofollow">TensorFlow</a>، وهي مكتبة بايثون <a href="https://academy.hsoub.com/programming/general/%D9%85%D8%A7-%D8%A7%D9%84%D9%85%D9%82%D8%B5%D9%88%D8%AF-%D8%A8%D9%85%D8%B5%D8%B7%D9%84%D8%AD-%D9%85%D9%81%D8%AA%D9%88%D8%AD-%D8%A7%D9%84%D9%85%D8%B5%D8%AF%D8%B1-open-source%D8%9F-r885/" rel="">مفتوحة المصدر</a> التي طُوّرت في مختبرات غوغل <a href="https://research.google/teams/brain/" rel="external nofollow">Google Brain</a> لأبحاث التعلم العميق، كما أنها من أشهر المكتبات الحالية في التعلم العميق، وسنأخذ صورًا مكتوبٌ عليها الأرقام بخط اليد من الرقم 0 وحتى الرقم 9، وسنبني شبكةً عصبيةً وندربها لكي تتعرف على التصنيف المناسب لكل رقمٍ معروضٍ في الصورة وتتنبأ به، ثم تَنسْبه لصنفٍ من أصناف الأرقام الموجودة.
</p>

<p>
	سنفترض إلمامك بمصطلحات ومفاهيم تعلم الآلة، مثل التدريب والاختبار والميزات والأصناف والتحسين والتقييم. لهذا لن تحتاج لخبرةٍ سابقةٍ في مجال التعلم العميق التطبيقي أو بمكتبة TensorFlow، ولمتابعة وفَهم هذا المقال جيدًا ننصحك أولًا بالاطلاع على: <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D9%84%D9%85%D9%81%D8%A7%D9%87%D9%8A%D9%85-%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A9-%D9%84%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9-r1009/" rel="">المفاهيم الأساسية لتعلم الآلة</a>.
</p>

<h2>
	المتطلبات الرئيسية
</h2>

<p>
	لإكمال هذا المقال ستحتاج بيئةً برمجيةً للغة بايثون الإصدار 3.8 سواءً كان محليًا أو بعيدًا. ويجب أن تتضمن هذه البيئة البرمجية مدير الحِزم <a href="https://pypi.org/project/pip/" rel="external nofollow">pip</a> لتثبيت الحِزم، ومُنشئ البيئات الافتراضية <a href="https://docs.python.org/3/library/venv.html" rel="external nofollow">venv</a> لإنشاء بيئاتٍ افتراضيةٍ.
</p>

<h2>
	1. إعداد المشروع
</h2>

<p>
	ستحتاج أولًا لتثبيت بعض التبعيات، وذلك لإنشاء مساحة عملٍ للاحتفاظ بملفاتنا قبل أن نتمكن من تطوير برنامج التعرف على الصور، وسنستخدم بيئة بايثون 3.8 الافتراضية لإدارة التبعيات الخاصة بمشروعنا.
</p>

<p>
	سَنُنشئ مجلدًا جديدًا خاصًا بمشروعنا وسندخل إليه هكذا:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_977_11" style=""><span class="pln">mkdir tensorflow</span><span class="pun">-</span><span class="pln">demo
cd tensorflow</span><span class="pun">-</span><span class="pln">demo</span></pre>

<p>
	سننفذّ الأوامر التالية لإنشاء البيئة الافتراضية:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_977_13" style=""><span class="pln">python </span><span class="pun">-</span><span class="pln">m venv tensorflow</span><span class="pun">-</span><span class="pln">demo</span></pre>

<p>
	ومن ثم الامر التالي في <a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%A7-%D9%87%D9%88-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%84%D9%8A%D9%86%D9%83%D8%B3%D8%9F-r451/" rel="">Linux</a> لتنشيط البيئة الافتراضية:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_977_20" style=""><span class="pln">source tensorflow</span><span class="pun">-</span><span class="pln">demo</span><span class="pun">/</span><span class="pln">bin</span><span class="pun">/</span><span class="pln">activate</span></pre>

<p>
	أما في Windows، فيكون أمر التنشيط:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_977_16" style=""><span class="str">"tensorflow-demo/Scripts/activate.bat"</span></pre>

<p>
	بعد ذلك، سنُثبتّ المكتبات التي سنستخدمها.
</p>

<p>
	سنستخدم إصداراتٍ محددةٍ من هذه المكتبات، من خلال إنشاء ملف <code>requirements.txt</code> في مجلد المشروع، وسيُحدِّد هذا الملف المتطلبات والإصدارات التي سنحتاج إليها.
</p>

<p>
	نفتح الملف <code>requirements.txt</code> في محرر النصوص، ونُضيف الأسطر التالية، وذلك لتحديد المكتبات التي نريدها وإصداراتها:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_977_22" style=""><span class="pln">keras</span><span class="pun">==</span><span class="lit">2.6</span><span class="pun">.</span><span class="lit">0</span><span class="pln">
numpy</span><span class="pun">==</span><span class="lit">1.19</span><span class="pun">.</span><span class="lit">5</span><span class="pln">
</span><span class="typ">Pillow</span><span class="pun">==</span><span class="lit">8.4</span><span class="pun">.</span><span class="lit">0</span><span class="pln">
scikit</span><span class="pun">-</span><span class="pln">learn</span><span class="pun">==</span><span class="lit">1.0</span><span class="pln">
scipy</span><span class="pun">==</span><span class="lit">1.7</span><span class="pun">.</span><span class="lit">1</span><span class="pln">
sklearn</span><span class="pun">==</span><span class="lit">0.0</span><span class="pln">
tensorflow</span><span class="pun">==</span><span class="lit">2.6</span><span class="pun">.</span><span class="lit">0</span></pre>

<p>
	سنحفظ التغييرات التي طرأت على الملف وسنخرج من محرر النصوص، ثم سنُثَبت هذه المكتبات بالأمر التالي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_977_24" style=""><span class="pun">(</span><span class="pln">tensorflow</span><span class="pun">-</span><span class="pln">demo</span><span class="pun">)</span><span class="pln"> $ pip install </span><span class="pun">-</span><span class="pln">r requirements</span><span class="pun">.</span><span class="pln">txt</span></pre>

<p>
	بعد تثبيتنا لهذه التبعيات، سنُصبح جاهزين لبدء العمل على مشروعنا.
</p>

<h2>
	2. استيراد مجموعة بيانات MNIST
</h2>

<p>
	تُسمى مجموعة البيانات التي سنستخدمها، بمجموعة بيانات <a href="http://yann.lecun.com/exdb/mnist/" rel="external nofollow">MNIST</a>، وهي مجموعةٌ كلاسيكيةٌ في مجتمع مُطوري تعلم الآلة، وتتكون من صورٍ لأرقامٍ مكتوبةٍ بخط اليد، بحجم 28×28 بكسل. ونستعرض فيما يلي بعض الأمثلة للأرقام المُتضمنة فيها:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="110307" href="https://academy.hsoub.com/uploads/monthly_2022_10/1.png.35e6411577e1f39dde9449c4c44995fb.png" rel="" data-fileext="png"><img alt="استيراد مجموعة بيانات MNIST في مكتبة TensorFlow" class="ipsImage ipsImage_thumbnailed" data-fileid="110307" data-unique="0i2l4plo3" style="width: 400px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2022_10/1.png.35e6411577e1f39dde9449c4c44995fb.png"></a>
</p>

<p>
	لاحظ أنه ينبغي أن نستخدم ملفًا واحدًا لجميع أعمالنا في هذا المقال، ولنُنشئ برنامج بايثون يتعامل مع مجموعة البيانات هذه، سننشئ ملفًا جديدًا باسم <code>main.py</code>، وسنفتح هذا الملف بأي محرر شيفرات لدينا -مثل VS code- وسنُضيف هذه الأسطر البرمجية لاستيراد المكتبات اللازمة:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_977_30" style=""><span class="kwd">import</span><span class="pln"> tensorflow </span><span class="kwd">as</span><span class="pln"> tf
</span><span class="kwd">import</span><span class="pln"> numpy </span><span class="kwd">as</span><span class="pln"> np
</span><span class="kwd">from</span><span class="pln"> sklearn</span><span class="pun">.</span><span class="pln">preprocessing </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">OneHotEncoder</span><span class="pln">
</span><span class="com">#مكتبة معالجة الصور</span><span class="pln">
</span><span class="kwd">from</span><span class="pln"> PIL </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">Image</span><span class="pln">
</span><span class="com">#التوافقية مع إصدار سابق</span><span class="pln">
tf</span><span class="pun">.</span><span class="pln">compat</span><span class="pun">.</span><span class="pln">v1</span><span class="pun">.</span><span class="pln">disable_v2_behavior</span><span class="pun">()</span><span class="pln"> </span></pre>

<p>
	وسنضيف أيضًا هذه الأسطر من الشيفرات البرمجية لملفك لاستيراد مجموعة بيانات MNIST وذلك باختيار صور التدريب المتاحة من Tensorflow ومن ثم نُنزلها ونقسمها إلى جزئين: الأول للتدريب والثاني للاختبار:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_977_32" style=""><span class="com">#اختيار بيانات التدريب</span><span class="pln">
mnist </span><span class="pun">=</span><span class="pln"> tf</span><span class="pun">.</span><span class="pln">keras</span><span class="pun">.</span><span class="pln">datasets</span><span class="pun">.</span><span class="pln">mnist
</span><span class="com">#تنزيل بيانات التدريب والاختبار</span><span class="pln">
</span><span class="pun">(</span><span class="pln">x_train</span><span class="pun">,</span><span class="pln"> y_train</span><span class="pun">),</span><span class="pln"> </span><span class="pun">(</span><span class="pln">x_test</span><span class="pun">,</span><span class="pln"> y_test</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> mnist</span><span class="pun">.</span><span class="pln">load_data</span><span class="pun">()</span><span class="pln">
</span><span class="com">#طباعة عدد بيانات التدريب والاختبار</span><span class="pln">
</span><span class="kwd">print</span><span class="pln"> </span><span class="pun">(</span><span class="pln">len</span><span class="pun">(</span><span class="pln">x_train</span><span class="pun">))</span><span class="pln">
</span><span class="kwd">print</span><span class="pln"> </span><span class="pun">(</span><span class="pln">len</span><span class="pun">(</span><span class="pln">x_test</span><span class="pun">))</span><span class="pln">
</span><span class="com">#تحجيم البيانات بين 0 و 1</span><span class="pln">
x_train</span><span class="pun">,</span><span class="pln"> x_test </span><span class="pun">=</span><span class="pln"> x_train </span><span class="pun">/</span><span class="pln"> </span><span class="lit">255.0</span><span class="pun">,</span><span class="pln"> x_test </span><span class="pun">/</span><span class="pln"> </span><span class="lit">255.0</span><span class="pln">
</span><span class="com">#الترميز الأحادي النشط</span><span class="pln">
y_train </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[[</span><span class="pln">i</span><span class="pun">]</span><span class="pln"> </span><span class="kwd">for</span><span class="pln"> i </span><span class="kwd">in</span><span class="pln"> y_train</span><span class="pun">]</span><span class="pln">
y_test </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[[</span><span class="pln">i</span><span class="pun">]</span><span class="pln"> </span><span class="kwd">for</span><span class="pln"> i </span><span class="kwd">in</span><span class="pln"> y_test</span><span class="pun">]</span><span class="pln">
enc </span><span class="pun">=</span><span class="pln"> </span><span class="typ">OneHotEncoder</span><span class="pun">(</span><span class="pln">sparse</span><span class="pun">=</span><span class="kwd">True</span><span class="pun">)</span><span class="pln">
enc</span><span class="pun">.</span><span class="pln">fit</span><span class="pun">(</span><span class="pln">y_train</span><span class="pun">)</span><span class="pln">
y_train </span><span class="pun">=</span><span class="pln">  enc</span><span class="pun">.</span><span class="pln">transform</span><span class="pun">(</span><span class="pln">y_train</span><span class="pun">)</span><span class="pln">
y_test </span><span class="pun">=</span><span class="pln"> enc</span><span class="pun">.</span><span class="pln">transform</span><span class="pun">(</span><span class="pln">y_test</span><span class="pun">)</span></pre>

<p>
	تقوم الدالة 'mnist.load_data' بتنزيل البيانات وتقسيمها إلى مجموعتين واحدة للتدريب (60000 صورة) والمجموعة الثانية للاختبار (10000 صورة).
</p>

<p>
	وعند قراءة البيانات سنستخدم الترميز الأحادي النشط <a href="https://machinelearningmastery.com/why-one-hot-encode-data-in-machine-learning/" rel="external nofollow">One-Hot Encoding</a> لتمثيل التصنيفات للصور. حيث يَستَخدم الترميز الأحادي النشط One-Hot Encoding متجهًا vector مُكونٌ من قيمٍ ثنائيةٍ لتمثيل القيم الرقمية أو الصنفية. ونظرًا لأن أصنافنا مخصصةٌ لتمثيل الأرقام من 0 إلى 9، فإن المتجه سيحتوي على 10 قيمٍ، واحدةٌ لكلّ رقمٍ ممكنٍ. وتُسنَد إحدى هذه القيم بوضع القيمة 1، وذلك لتمثيل الرقم في هذا المؤشر للمتجه، كما ستُسنَد القيم الباقية بالقيمة 0. فمثلًا، سيُمثلُ الرقم 3 من خلال المتجه هكذا: [‎0 ،0 ،0 ،1 ،0 ،0 ،0 ،0 ،0 ،0]. وسنلاحظ وجود القيمة 1 في الفهرس 3، لذلك فإن المتجه سيُمثِلُ الرقم 3.
</p>

<p>
	ولتمثيل الصور الفعلية والتي تكون بحجم 28x28 بكسل، يتوجب علينا تسويتها في المتجه 1D بحجم 784 بكسل، وهو ناتج ضرب 28×28. وسنخزن هذه البكسلات والتي ستُشكل الصورة لاحقًا، وذلك في قيمٍ تتراوح بين 0 و255، حيث ستحدّد هذه القيم تدرج اللون الرمادي للبكسل، وستُعرَض صورنا باللونين الأبيض والأسود فقط. لذلك سيُمثلُ البكسل الأسود بالقيمة 255، والبكسل الأبيض بالقيمة 0، وذلك مع التدرجات المختلفة للون الرمادي بينهم.
</p>

<p>
	والآن بعد استيرادنا للبيانات، حان الوقت للتفكير في كيفية بناء الشبكة العصبية.
</p>

<h2>
	3. تحديد بنية الشبكة العصبية
</h2>

<p>
	يُشير مصطلح بنية الشبكة العصبية لعناصرٍ متنوعةٍ، مثل عدد الطبقات في الشبكة وعدد الوِحدات في كلّ طبقةٍ، كما يشير إلى كيفية توصيل هذه الوِحدات بين الطبقات المختلفة. ونظرًا لأن الشبكات العصبية مستوحاةٌ من كيفية عمل الدماغ البشري، فسنستخدم مصطلح الوِحدة ليُمثّل ما يُمكن تسميته بيولوجيًا بالخلايا العصبية.
</p>

<p>
	تأخذ الوِحدات بعض القيم من الوِحدات السابقة مثل مُدخلاتٍ لها، حيث تتشابه مع الخلايا العصبية التي تُمرر إشاراتها حول الدماغ، ثمّ تُجري عمليةً حسابيةً، وتُمرر القيمة الجديدة مثل مُخرجاتٍ إلى وِحداتٍ أخرى، وهكذا. تُوضع هذه الوِحدات على شكل طبقاتٍ متراكبةٍ فوق بعضها البعض مشكّلةً الشبكة العصبية، بحيث يمكن للشبكة أن تتألف كحدٍ أدنى من طبقتين، طبقةٌ لإدخال القيم، وطبقةٌ أخرى لإخراج القيم. يُستخدم مصطلح الطبقة المخفية لجميع الطبقات الموجودة بين طبقات المُدخلات وطبقات المُخرجات الخارجية، أي أن تلك الطبقات تكون مخفيةً عن العالم الحقيقي.
</p>

<p>
	تحقق البُنى المختلفة للشبكة نتائجًا مختلفةً عن بعضها البعض، ويمكن اتخاذ الأداء مثل معيارٍ للحكم على هذه البُنى المختلفة، كما يمكن اتخاذ عناصر أخرى معيارًا للحكم، مثل الوسطاء والبيانات ومدة التدريب.
</p>

<p>
	سنضيف هذه الأسطر البرمجية التالية لملفك، وذلك لتخزين عدد الوِحدات المُخصصة لكلّ طبقةٍ ووضعها في متغيّراتٍ عامةٍ. وهذه الطريقة ستسمح لنا بتغيير بِنية الشبكة بمكانٍ واحدٍ، وفي نهاية هذا المقال يمكنك اختبار مدى تأثير الأعداد المختلفة من الطبقات والوِحدات على نتائج نموذجنا:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_977_34" style=""><span class="pln">n_input </span><span class="pun">=</span><span class="pln"> </span><span class="lit">784</span><span class="pln"> </span><span class="com"># input layer (28x28 pixels)</span><span class="pln">
n_hidden1 </span><span class="pun">=</span><span class="pln"> </span><span class="lit">512</span><span class="pln"> </span><span class="com"># 1st hidden layer</span><span class="pln">
n_hidden2 </span><span class="pun">=</span><span class="pln"> </span><span class="lit">256</span><span class="pln"> </span><span class="com"># 2nd hidden layer</span><span class="pln">
n_hidden3 </span><span class="pun">=</span><span class="pln"> </span><span class="lit">128</span><span class="pln"> </span><span class="com"># 3rd hidden layer</span><span class="pln">
n_output </span><span class="pun">=</span><span class="pln"> </span><span class="lit">10</span><span class="pln"> </span><span class="com"># output layer (0-9 digits)</span></pre>

<p>
	يُوضح الرسم البياني التالي تصورًا للبِنية التي صمّمناها، مع توصيل كلّ طبقةٍ بالطبقات المحيطة بها توصيلًا كاملًا:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="110309" href="https://academy.hsoub.com/uploads/monthly_2022_10/3.png.c2fb04af9be312897775584d0fc0e251.png" rel="" data-fileext="png"><img alt="تصور شبكة البِنية المصممة بطبقاتها في مكتبة TensorFlow" class="ipsImage ipsImage_thumbnailed" data-fileid="110309" data-unique="2vkqbyp5d" style="width: 650px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2022_10/3.png.c2fb04af9be312897775584d0fc0e251.png"></a>
</p>

<p>
	ويرتبط مصطلح الشبكة العصبية العميقة Deep Neural Network بعدد الطبقات المخفية، وعادةً ما تُشير كلمة السطحية في مصطلح الشبكة العصبية السطحية إلى وجود طبقةٍ مخفيةٍ واحدةٍ، بينما تُشير كلمة العميقة إلى وجود طبقاتٍ مخفيةٍ متعددةٍ. ونظريًا إذا أُعطِيت الشبكة العصبية السطحية ما يكفي من بياناتٍ للتدريب، فيجب أن تَقدِر على تمثيل أي وظيفةٍ يمكن للشبكة العصبية العميقة أن تؤدّيها. ولكن من ناحية الفعالية الحسابية، فغالبًا ما يكون نتائج استخدام شبكةٍ عصبيةٍ عميقةٍ ذات حجمٍ صغيرٍ أفضل من النتائج التي تُعطيها الشبكة العصبية السطحية ذات العدد الكبير من الوِحدات المخفية، وذلك عند تأديتهم لنفس المَهمة.
</p>

<p>
	كما أن الشبكات العصبية السطحية غالبًا ما تواجه مشكلة فَرط التخصيص Overfitting، إذ يكون هدف الشبكة الأساسي هو حفظ بيانات التدريب التي شاهدتها، ولكنها لن تستطيع تعميم المعرفة التي اكتسبتها على البيانات الجديدة، وهذا هو السبب في كون استخدام الشبكات العصبية العميقة أكثر شيوعًا، إذ أنها تسمح للطبقات المتعددة الموجودة بين البيانات المُدخلة الأولية والبيانات المُصنفة الناتجة، بتعلم الميزات على مستوياتٍ متنوعةٍ، مما يُعزز قدرة الشبكة على التعلم وتعميم الفكرة.
</p>

<p>
	ومن العناصر الأخرى للشبكة العصبية التي يجب تعريفها هنا هي الوسطاء الفائقة Hyperparameters، فعلى عكس الوسطاء العادية التي تُحدث قيمها أثناء عملية التدريب، سنُسند قيم الوسطاء الفائقة في البداية وسنثبتها طوال العملية.
</p>

<p>
	أسنِد المتغيّرات بالقيم التالية في ملفك:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_977_38" style=""><span class="pln">learning_rate </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1e-4</span><span class="pln">
n_iterations </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1000</span><span class="pln">
batch_size </span><span class="pun">=</span><span class="pln"> </span><span class="lit">128</span><span class="pln">
dropout </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.5</span></pre>

<p>
	يمثل معدل التعلم Learning Rate مدى تعديل الوسطاء في كلّ خطوةٍ من عملية التعلّم، إذ تُعَد هذه التعديلات مكونًا رئيسيًا للتدريب، فبعد كلّ عملية مرور ٍعبر الشبكة، سنضبط أوزان الطبقات قليلًا لأهمية ذلك في محاولةٍ لتقليل الخسارة، حيث يمكن لمعدل التعلم المرتفع أن يتحقق بسرعة، ولكن يمكن كذلك أن تتجاوز القيم المثلى عند تحديثها في كلّ مرة.
</p>

<p>
	يشير مصطلح عدد التكرارات Number Of Iterations إلى عدد مرات مرورنا على خطوة التدريب، ويشير حجم الدفعة Batch Size لعدد أمثلة التدريب التي نستخدمها في كل خطوة، كما ويمثل المتغير <code>dropout</code> الموضع الذي نحذف عنده بعضًا من الوِحدات عشوائيًا. وسنستخدم المتغير <code>dropout</code> في الطبقة النهائية المخفية لإعطاء كلّ وِحدة من الوحدات احتمالًا بنسبة 50٪ للتخلص منها في كلّ خطوة تدريبٍ، وهذا سيساعد على منع ظهور مشكلة فرط التخصيص Overfitting.
</p>

<p>
	حددنا الآن بِنية شبكتنا العصبية والوسطاء الفائقة التي ستُؤثر على عملية التعلّم، والخطوة التالية هي بناء الشبكة مثل مخططٍ بيانيٍ من خلال مكتبة TensorFlow.
</p>

<h2>
	4. بناء مخطط بياني من خلال مكتبة TensorFlow
</h2>

<p>
	لبناء شبكتنا، لابد لنا من إعداد الشبكة مثل مخططٍ بيانيٍ حسابي من خلال مكتبة TensorFlow لتنفيذه. والمفهوم الأساسي لمكتبة TensorFlow هو <code>tensor</code>، وهو بنية بياناتٍ مشابهةٍ لبِنية المصفوفة Array، أو القائمة List. وهذا المتغير سيهيَأ ويُعالَج عند مروره عبر المخطط البياني للشبكة عبر عملية التعلّم.
</p>

<p>
	وسنبدأ بتحديد ثلاثة متغيراتٍ <code>tensors</code> من نوع <code>placeholders</code>، وهو نوع <code>tensor</code> تُسندُ قيمته لاحقًا. والآن سنضيف الشيفرة البرمجية التالية إلى الملف الذي نعمل عليه:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_977_40" style=""><span class="pln">X </span><span class="pun">=</span><span class="pln"> tf</span><span class="pun">.</span><span class="pln">compat</span><span class="pun">.</span><span class="pln">v1</span><span class="pun">.</span><span class="pln">placeholder</span><span class="pun">(</span><span class="str">"float"</span><span class="pun">,</span><span class="pln"> </span><span class="pun">[</span><span class="kwd">None</span><span class="pun">,</span><span class="pln"> n_input</span><span class="pun">])</span><span class="pln">
Y </span><span class="pun">=</span><span class="pln"> tf</span><span class="pun">.</span><span class="pln">compat</span><span class="pun">.</span><span class="pln">v1</span><span class="pun">.</span><span class="pln">placeholder</span><span class="pun">(</span><span class="str">"float"</span><span class="pun">,</span><span class="pln"> </span><span class="pun">[</span><span class="kwd">None</span><span class="pun">,</span><span class="pln"> n_output</span><span class="pun">])</span><span class="pln">
keep_prob </span><span class="pun">=</span><span class="pln"> tf</span><span class="pun">.</span><span class="pln">compat</span><span class="pun">.</span><span class="pln">v1</span><span class="pun">.</span><span class="pln">placeholder</span><span class="pun">(</span><span class="pln">tf</span><span class="pun">.</span><span class="pln">float32</span><span class="pun">)</span></pre>

<p>
	إنّ الوسيط الوحيد الذي يتوجب علينا تحديده عند التعريف هو حجم البيانات التي سنُسندها لاحقًا، وبالنسبة للمتغير <code>X</code> سنستخدم شكل <code>[None، 784]</code>، إذ ستمثل القيمة <code>None</code> كميةً غير محددةٍ، وسنُسند كميةً غير محددةٍ من الصور ذات حجم 784 بكسل. بحيث يصبح شكل المتغير <code>Y</code> هو <code>[None، 10]</code>، وستمثل <code>None</code> عددًا غير محددٍ من التصنيفات الناتجة، مع وجود 10 أصنافٍ محتملةٍ. وسنستخدم في المتغير <code>keep_prob</code> <code>tensor</code> من نوع <code>placeholders</code> للتحكم في معدل <code>dropout</code>، وسنجعله من نوع <code>placeholders</code> وذلك لجعله متغيرًا من نوعٍ قابلٍ للتعديل، بدلًا من كونه متغيرًا من نوعٍ غير قابلٍ للتعديل immutable variable، وذلك لأننا نريد استخدام نفس <code>tensor</code> التدريب عند إسناد <code>dropout</code> بالقيمة 0.5، ونفس <code>tensor</code> الاختبار عند إسناد <code>dropout</code> بالقيمة 1.0.
</p>

<p>
	والوسطاء التي ستُحدث قيمها الشبكة العصبية في عملية التدريب هي القيم الخاصة بوزن كلّ طبقةٍ، والتي تُعبر عن الأهمية وقيم التحيز bias values، لذلك سنحتاج لإسنادهم بقيمٍ إبتدائيةٍ بدلًا من قيمٍ فارغةٍ. وهذه القيم هي الأساس الذي ستبدأ الشبكة رحلة التعلم انطلاقًا منها، إذ ستُستخدم في تفعيل دوال الشبكة العصبية، والتي تُمثِلُ قوة الاتصالات بين الوِحدات.
</p>

<p>
	ونظرًا لاستمرار تحسين القيم أثناء عملية التدريب، يمكننا ضبطها حاليًا بالقيمة 0. لاحظ أن القيمة الأولية في الواقع لها تأثيرٌ كبيرٌ على الدقة النهائية للنموذج. وسنستخدم التوزيع الاحتمالي الطبيعي المنقطع Truncated normal distribution لتوليد قيمٍ عشوائيةٍ لأوزان الطبقات، بحيث يكونون قريبين من الصفر حتى يتمكنوا من التعديل إما باتجاهٍ إيجابيٍ أو سلبيٍ، كما يكونون مختلفين قليلًا، وذلك ليُنتِجوا أخطاءً مختلفةً، وبهذه الطريقة سنضمن بأن يتعلم النموذج شيئًا مفيدًا.
</p>

<p>
	والآن سنضيف هذه الأسطر البرمجية التالية لملفنا الذي نعمل عليه:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_977_42" style=""><span class="pln">weights </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="str">'w1'</span><span class="pun">:</span><span class="pln"> tf</span><span class="pun">.</span><span class="typ">Variable</span><span class="pun">(</span><span class="pln">tf</span><span class="pun">.</span><span class="pln">random</span><span class="pun">.</span><span class="pln">truncated_normal</span><span class="pun">([</span><span class="pln">n_input</span><span class="pun">,</span><span class="pln"> n_hidden1</span><span class="pun">],</span><span class="pln">
                                                 stddev</span><span class="pun">=</span><span class="lit">0.1</span><span class="pun">)),</span><span class="pln">
    </span><span class="str">'w2'</span><span class="pun">:</span><span class="pln"> tf</span><span class="pun">.</span><span class="typ">Variable</span><span class="pun">(</span><span class="pln">tf</span><span class="pun">.</span><span class="pln">random</span><span class="pun">.</span><span class="pln">truncated_normal</span><span class="pun">([</span><span class="pln">n_hidden1</span><span class="pun">,</span><span class="pln"> n_hidden2</span><span class="pun">],</span><span class="pln">
                                                 stddev</span><span class="pun">=</span><span class="lit">0.1</span><span class="pun">)),</span><span class="pln">
    </span><span class="str">'w3'</span><span class="pun">:</span><span class="pln"> tf</span><span class="pun">.</span><span class="typ">Variable</span><span class="pun">(</span><span class="pln">tf</span><span class="pun">.</span><span class="pln">random</span><span class="pun">.</span><span class="pln">truncated_normal</span><span class="pun">([</span><span class="pln">n_hidden2</span><span class="pun">,</span><span class="pln"> n_hidden3</span><span class="pun">],</span><span class="pln">
                                                 stddev</span><span class="pun">=</span><span class="lit">0.1</span><span class="pun">)),</span><span class="pln">
    </span><span class="str">'out'</span><span class="pun">:</span><span class="pln"> tf</span><span class="pun">.</span><span class="typ">Variable</span><span class="pun">(</span><span class="pln">tf</span><span class="pun">.</span><span class="pln">random</span><span class="pun">.</span><span class="pln">truncated_normal</span><span class="pun">([</span><span class="pln">n_hidden3</span><span class="pun">,</span><span class="pln"> n_output</span><span class="pun">],</span><span class="pln">
                                                  stddev</span><span class="pun">=</span><span class="lit">0.1</span><span class="pun">)),</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	بالنسبة للتحيز Bais، سنستخدم قيمةً ثابتةً صغيرةً لضمان تنشيط جميع <code>tensors</code> المراحل الأولية، وبالتالي المساهمة في الانتشار. وستُخزن الأوزان وجميع <code>tensors</code> التحيزات في <code>objects</code> قواميس Dictionary لسهولة الوصول إليها.
</p>

<p>
	أضف هذه الشيفرة البرمجية للملف الذي نعمل عليه وذلك لتعريف التحيز وقِيَمه:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_977_44" style=""><span class="pln">biases </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="str">'b1'</span><span class="pun">:</span><span class="pln"> tf</span><span class="pun">.</span><span class="typ">Variable</span><span class="pun">(</span><span class="pln">tf</span><span class="pun">.</span><span class="pln">constant</span><span class="pun">(</span><span class="lit">0.1</span><span class="pun">,</span><span class="pln"> shape</span><span class="pun">=[</span><span class="pln">n_hidden1</span><span class="pun">])),</span><span class="pln">
    </span><span class="str">'b2'</span><span class="pun">:</span><span class="pln"> tf</span><span class="pun">.</span><span class="typ">Variable</span><span class="pun">(</span><span class="pln">tf</span><span class="pun">.</span><span class="pln">constant</span><span class="pun">(</span><span class="lit">0.1</span><span class="pun">,</span><span class="pln"> shape</span><span class="pun">=[</span><span class="pln">n_hidden2</span><span class="pun">])),</span><span class="pln">
    </span><span class="str">'b3'</span><span class="pun">:</span><span class="pln"> tf</span><span class="pun">.</span><span class="typ">Variable</span><span class="pun">(</span><span class="pln">tf</span><span class="pun">.</span><span class="pln">constant</span><span class="pun">(</span><span class="lit">0.1</span><span class="pun">,</span><span class="pln"> shape</span><span class="pun">=[</span><span class="pln">n_hidden3</span><span class="pun">])),</span><span class="pln">
    </span><span class="str">'out'</span><span class="pun">:</span><span class="pln"> tf</span><span class="pun">.</span><span class="typ">Variable</span><span class="pun">(</span><span class="pln">tf</span><span class="pun">.</span><span class="pln">constant</span><span class="pun">(</span><span class="lit">0.1</span><span class="pun">,</span><span class="pln"> shape</span><span class="pun">=[</span><span class="pln">n_output</span><span class="pun">]))</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	والآن جهّز طبقات الشبكة العصبية من خلال تعريف العمليات التي ستتعامل مع <code>tensors</code> المرحلة الحالية. وأضف هذه الشيفرة البرمجية للملف الذي نعمل عليه:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_977_46" style=""><span class="pln">layer_1 </span><span class="pun">=</span><span class="pln"> tf</span><span class="pun">.</span><span class="pln">add</span><span class="pun">(</span><span class="pln">tf</span><span class="pun">.</span><span class="pln">matmul</span><span class="pun">(</span><span class="pln">X</span><span class="pun">,</span><span class="pln"> weights</span><span class="pun">[</span><span class="str">'w1'</span><span class="pun">]),</span><span class="pln"> biases</span><span class="pun">[</span><span class="str">'b1'</span><span class="pun">])</span><span class="pln">
layer_2 </span><span class="pun">=</span><span class="pln"> tf</span><span class="pun">.</span><span class="pln">add</span><span class="pun">(</span><span class="pln">tf</span><span class="pun">.</span><span class="pln">matmul</span><span class="pun">(</span><span class="pln">layer_1</span><span class="pun">,</span><span class="pln"> weights</span><span class="pun">[</span><span class="str">'w2'</span><span class="pun">]),</span><span class="pln"> biases</span><span class="pun">[</span><span class="str">'b2'</span><span class="pun">])</span><span class="pln">
layer_3 </span><span class="pun">=</span><span class="pln"> tf</span><span class="pun">.</span><span class="pln">add</span><span class="pun">(</span><span class="pln">tf</span><span class="pun">.</span><span class="pln">matmul</span><span class="pun">(</span><span class="pln">layer_2</span><span class="pun">,</span><span class="pln"> weights</span><span class="pun">[</span><span class="str">'w3'</span><span class="pun">]),</span><span class="pln"> biases</span><span class="pun">[</span><span class="str">'b3'</span><span class="pun">])</span><span class="pln">
layer_drop </span><span class="pun">=</span><span class="pln"> tf</span><span class="pun">.</span><span class="pln">nn</span><span class="pun">.</span><span class="pln">dropout</span><span class="pun">(</span><span class="pln">layer_3</span><span class="pun">,</span><span class="pln"> keep_prob</span><span class="pun">)</span><span class="pln">
output_layer </span><span class="pun">=</span><span class="pln"> tf</span><span class="pun">.</span><span class="pln">matmul</span><span class="pun">(</span><span class="pln">layer_3</span><span class="pun">,</span><span class="pln"> weights</span><span class="pun">[</span><span class="str">'out'</span><span class="pun">])</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> biases</span><span class="pun">[</span><span class="str">'out'</span><span class="pun">]</span></pre>

<p>
	ستنفذ كلّ طبقةٍ مخفيةٍ عملية ضربٍ للمصفوفة على نتائج الطبقة التي سبقتها وعلى أوزان الطبقة الحالية، وسيُضاف التحيز لهذه القيم. في الطبقة المخفية الأخيرة، سنُطبِّق عملية التسرب dropout بالقيمة 0.5 للمتغير <code>Keep_prob</code> الخاص بنا.
</p>

<p>
	الخطوة الأخيرة في بناء المخطط البياني، هي تحديد دالة الخسارة التي نريد تحسينها. والاختيار الشائع لدالة الخسارة في المكتبة البرمجية TensorFlow هو <a href="https://ar.wikipedia.org/wiki/%D8%A5%D9%86%D8%AA%D8%B1%D9%88%D8%A8%D9%8A_%D9%85%D8%B4%D8%AA%D8%B1%D9%83" rel="external nofollow">الانتروبي المشترك</a> Joint Antropy، والمعروف كذلك باسم فقدان السجل log-loss، وهو الذي يُحدد الفرق بين التوزيعين الاحتماليين لكلً من التنبؤات والتصنيف. ويمكن أن تكون قيمة الانتروبي المشترك 0، وذلك في أفضل الأحوال عند التصنيف المثالي، وذلك مع انعدام الخسارة تمامًا.
</p>

<p>
	سنحتاج كذلك إلى اختيار <a href="https://academy.hsoub.com/programming/advanced/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A7%D9%84%D8%AE%D9%88%D8%A7%D8%B1%D8%B2%D9%85%D9%8A%D8%A7%D8%AA-r1282/" rel="">خوارزمية</a> التحسين المناسبة، والتي سنستخدمها لتقليل الناتج من دالة الخسارة. وتُسمى هذه العملية بعملية تحسين الانحدار التدريجي، وهي طريقةٌ شائعةٌ للعثور على الحد الأدنى للدالة، من خلال اتخاذ خطواتٍ تكراريةٍ على طول التدرج في الاتجاه السلبي التنازلي. وهناك العديد من الخيارات لخوارزميات تحسين الانحدار التدريجي المُطبقة في المكتبة البرمجية TensorFlow، إلا أننا سنستخدم في هذا المقال خوارزمية المُحسِّن أدم <a href="https://www.tensorflow.org/api_docs/python/tf/train/AdamOptimizer" rel="external nofollow">Adam optimizer</a>، الذي يعمتد على عملية تحسين الانحدار التدريجي باستخدام الزخم أو كمية الحركة Momentum، وذلك بتسريع عملية التنعيم من خلال حساب متوسط ٍمُرجَّحٍ بكثرة للتدرجات، واستخدام ذلك في التعديلات مما يؤدي لتقاربٍ أسرع. وسنضيف هذه الشيفرة للملف الذي نعمل عليه:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_977_49" style=""><span class="pln">cross_entropy </span><span class="pun">=</span><span class="pln"> tf</span><span class="pun">.</span><span class="pln">reduce_mean</span><span class="pun">(</span><span class="pln">
    tf</span><span class="pun">.</span><span class="pln">nn</span><span class="pun">.</span><span class="pln">softmax_cross_entropy_with_logits</span><span class="pun">(</span><span class="pln">
        labels</span><span class="pun">=</span><span class="pln">Y</span><span class="pun">,</span><span class="pln"> logits</span><span class="pun">=</span><span class="pln">output_layer
    </span><span class="pun">))</span><span class="pln">
train_step </span><span class="pun">=</span><span class="pln"> tf</span><span class="pun">.</span><span class="pln">compat</span><span class="pun">.</span><span class="pln">v1</span><span class="pun">.</span><span class="pln">train</span><span class="pun">.</span><span class="typ">AdamOptimizer</span><span class="pun">(</span><span class="lit">1e-4</span><span class="pun">).</span><span class="pln">minimize</span><span class="pun">(</span><span class="pln">cross_entropy</span><span class="pun">)</span></pre>

<p>
	عرّفنا حتى الآن الشبكة وبنيناها باستخدام المكتبة البرمجية TensorFlow، والخطوة التالية هي إرسال البيانات عبر المخطط البياني لتدريبها، ومن ثَمّ اختبارها للتحقق فيما إن كانت تعلمت شيئًا بالفعل أم لا.
</p>

<h2>
	5. التدريب والاختبار
</h2>

<p>
	تتضمن عملية التدريب تغذية المخطط البياني للشبكة بمجموعة بيانات التدريب، وتحسين نتيجة دالة الخسارة، إذ أن في كلّ مرةٍ تمر فيها الشبكة عبر مجموعةٍ إضافيةٍ من صور التدريب، فستُحدثُ الوسطاء لتقليل الخسارة، وذلك بهدف تحسين دقة التنبؤ للأرقامٍ؛ أما عملية الاختبار، فتتضمن تشغيل مجموعة بيانات الاختبار الخاصة بنا عبر المخطط البياني المدرّب، كما ستتتبع عدد الصور التي صح التنبؤ بها، حتى نحسب الدقة جيدًا.
</p>

<p>
	قبل البدء في عملية التدريب، سوف نحدد دالة تقييم الدقة لكي نتمكن من طباعتها على مجموعاتٍ صغيرةٍ من البيانات أثناء التدريب. هذه البيانات المطبوعة ستسمح لنا بالتحقق من انخفاض الخسارة وزيادة الدقة، وذلك بدءًا من المرور الأول عبر المخطط البياني، وحتى المرور الأخير؛ كما ستسمح لنا بتتبّع ما إذا نفذنا عمليات مرور ٍكافيةً عبر المخطط البياني للوصول لنتيجةٍ مناسبةٍ ومثاليةٍ أم لا:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_977_51" style=""><span class="pln">correct_pred </span><span class="pun">=</span><span class="pln"> tf</span><span class="pun">.</span><span class="pln">equal</span><span class="pun">(</span><span class="pln">tf</span><span class="pun">.</span><span class="pln">argmax</span><span class="pun">(</span><span class="pln">output_layer</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">),</span><span class="pln"> tf</span><span class="pun">.</span><span class="pln">argmax</span><span class="pun">(</span><span class="pln">Y</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">))</span><span class="pln">
accuracy </span><span class="pun">=</span><span class="pln"> tf</span><span class="pun">.</span><span class="pln">reduce_mean</span><span class="pun">(</span><span class="pln">tf</span><span class="pun">.</span><span class="pln">cast</span><span class="pun">(</span><span class="pln">correct_pred</span><span class="pun">,</span><span class="pln"> tf</span><span class="pun">.</span><span class="pln">float32</span><span class="pun">))</span></pre>

<p>
	سنستخدم الدالة <code>arg_max</code> في المتغيّر <code>right_pred</code> للموازنة بين الصور التي صَحَ توقُّعها، وذلك بالنظر لقيمة التنبؤات <code>output_layer</code> والتصنيفات Y، وسنستخدم الدالة <code>equal</code> لإعادة هذه النتائج مثل قائمةٍ مؤلفةٍ من قيمٍ بوليانيةٍ. ويمكننا بعد ذلك تحويل هذه القائمة للنوع <code>float</code>، وذلك لحساب المتوسط للحصول على درجة الدقة الإجمالية.
</p>

<p>
	الآن نحن جاهزون لتهيئة الجلسة لتشغيل المخطط البياني، إذ سنرسل للشبكة أمثلة التدريب الخاصة بنا، وبمجرد انتهاء التدريب، سنرسل أمثلة اختبارٍ جديدةٍ عبر المخطط البياني نفسه لتحديد دقة النموذج.
</p>

<p>
	أضف هذه الشيفرة للملف الذي نعمل عليه:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_977_53" style=""><span class="pln">init </span><span class="pun">=</span><span class="pln"> tf</span><span class="pun">.</span><span class="pln">compat</span><span class="pun">.</span><span class="pln">v1</span><span class="pun">.</span><span class="pln">global_variables_initializer</span><span class="pun">()</span><span class="pln">
sess </span><span class="pun">=</span><span class="pln"> tf</span><span class="pun">.</span><span class="pln">compat</span><span class="pun">.</span><span class="pln">v1</span><span class="pun">.</span><span class="typ">Session</span><span class="pun">()</span><span class="pln">
sess</span><span class="pun">.</span><span class="pln">run</span><span class="pun">(</span><span class="pln">init</span><span class="pun">)</span></pre>

<p>
	إن جوهر عملية التدريب في التعلم العميق هو تحسين ناتج دالة الخسارة. ونحن هنا سنهدف إلى تقليل الفرق بين التصنيفات المُتوقعة للصور والتصنيفات الحقيقية لها. وستتضمن هذه العملية أربع خطواتٍ تتكرر لعددٍ محددٍ من مرات المرور عبر المخطط البياني، وهي:
</p>

<ul>
	<li>
		دفع القيم إلى الأمام عبر الشبكة.
	</li>
	<li>
		حساب الخسارة.
	</li>
	<li>
		دفع القيم للخلف عبر الشبكة.
	</li>
	<li>
		تحديث الوسطاء.
	</li>
</ul>

<p>
	ففي كلّ خطوة تدريب، سنعدِّل الوسطاء قليلًا في محاولةٍ لتقليل نتائج دالة الخسارة. وفي الخطوة التالية مع تَقدُّم عملية التعلّم، يجب أن نشاهد انخفاضًا في الخسارة، حيث سنوقِف التدريب في النهاية، وسنستخدم الشبكة مثل نموذجٍ لاختبار بياناتنا الجديدة.
</p>

<p>
	سنضيف هذه الشيفرة البرمجية للملف الذي نعمل عليه:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_977_55" style=""><span class="com"># التدريب على دفعات صغيرة</span><span class="pln">
</span><span class="kwd">for</span><span class="pln"> i </span><span class="kwd">in</span><span class="pln"> range</span><span class="pun">(</span><span class="pln">n_iterations</span><span class="pun">):</span><span class="pln">
    startbatch </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="pln">i</span><span class="pun">*</span><span class="pln">batch_size</span><span class="pun">)</span><span class="pln"> </span><span class="pun">%</span><span class="pln"> len</span><span class="pun">(</span><span class="pln">x_train</span><span class="pun">)</span><span class="pln">
    endbatch </span><span class="pun">=</span><span class="pln"> </span><span class="pun">((</span><span class="pln">i</span><span class="pun">+</span><span class="lit">1</span><span class="pun">)*</span><span class="pln">batch_size</span><span class="pun">)</span><span class="pln"> </span><span class="pun">%</span><span class="pln"> len</span><span class="pun">(</span><span class="pln">x_train</span><span class="pun">)</span><span class="pln">
    batch_x </span><span class="pun">=</span><span class="pln"> np</span><span class="pun">.</span><span class="pln">array</span><span class="pun">(</span><span class="pln">x_train</span><span class="pun">[</span><span class="pln">startbatch</span><span class="pun">:</span><span class="pln">endbatch</span><span class="pun">])</span><span class="pln">
    batch_x </span><span class="pun">=</span><span class="pln"> batch_x</span><span class="pun">.</span><span class="pln">reshape</span><span class="pun">(</span><span class="pln">batch_size</span><span class="pun">,</span><span class="pln"> </span><span class="pun">-</span><span class="lit">1</span><span class="pun">)</span><span class="pln">
    batch_y </span><span class="pun">=</span><span class="pln"> y_train</span><span class="pun">[</span><span class="pln">startbatch</span><span class="pun">:</span><span class="pln">endbatch</span><span class="pun">].</span><span class="pln">toarray</span><span class="pun">()</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> batch_x</span><span class="pun">.</span><span class="pln">shape </span><span class="pun">!=</span><span class="pln"> </span><span class="pun">(</span><span class="lit">128</span><span class="pun">,</span><span class="pln"> </span><span class="lit">784</span><span class="pun">):</span><span class="pln">
        </span><span class="kwd">continue</span><span class="pln">
    sess</span><span class="pun">.</span><span class="pln">run</span><span class="pun">(</span><span class="pln">train_step</span><span class="pun">,</span><span class="pln"> feed_dict</span><span class="pun">={</span><span class="pln">
        X</span><span class="pun">:</span><span class="pln"> batch_x</span><span class="pun">,</span><span class="pln"> Y</span><span class="pun">:</span><span class="pln"> </span><span class="pun">(</span><span class="pln">batch_y</span><span class="pun">),</span><span class="pln"> keep_prob</span><span class="pun">:</span><span class="pln"> dropout
    </span><span class="pun">})</span><span class="pln">
</span><span class="com"># طباعة الخسارة والدقة لكل دفعة صغيرة</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> i </span><span class="pun">%</span><span class="pln"> </span><span class="lit">100</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="lit">0</span><span class="pun">:</span><span class="pln">
        minibatch_loss</span><span class="pun">,</span><span class="pln"> minibatch_accuracy </span><span class="pun">=</span><span class="pln"> sess</span><span class="pun">.</span><span class="pln">run</span><span class="pun">(</span><span class="pln">
            </span><span class="pun">[</span><span class="pln">cross_entropy</span><span class="pun">,</span><span class="pln"> accuracy</span><span class="pun">],</span><span class="pln">
            feed_dict</span><span class="pun">={</span><span class="pln">X</span><span class="pun">:</span><span class="pln"> batch_x</span><span class="pun">,</span><span class="pln"> Y</span><span class="pun">:</span><span class="pln"> batch_y</span><span class="pun">,</span><span class="pln"> keep_prob</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1.0</span><span class="pun">}</span><span class="pln">
        </span><span class="pun">)</span><span class="pln">
        </span><span class="kwd">print</span><span class="pun">(</span><span class="pln">
            </span><span class="str">"Iteration"</span><span class="pun">,</span><span class="pln">
            str</span><span class="pun">(</span><span class="pln">i</span><span class="pun">),</span><span class="pln">
            </span><span class="str">"\t| Loss ="</span><span class="pun">,</span><span class="pln">
            str</span><span class="pun">(</span><span class="pln">minibatch_loss</span><span class="pun">),</span><span class="pln">
            </span><span class="str">"\t| Accuracy ="</span><span class="pun">,</span><span class="pln">
            str</span><span class="pun">(</span><span class="pln">minibatch_accuracy</span><span class="pun">)</span><span class="pln">
        </span><span class="pun">)</span></pre>

<p>
	بعد 100 عملية مرورٍ لكلّ خطوة تدريبٍ والتي أرسلنا فيها مجموعةً صغيرةً من الصور عبر الشبكة، سنطبع نتائج دالة الخسارة والدقة لتلك الدفعة. وينبغي ألّا نتوقع هنا انخفاض معدل الخسارة وزيادة الدقة، لأن القيم لكل دفعةٍ صغيرةٍ. إذ أن النتائج ليست للنموذج بأكمله. فنحن نستخدم مجموعاتٍ صغيرةٍ من الصور بدلًا من إرسال كلّ صورةٍ بمفردها، وذلك لتسريع عملية التدريب والسماح للشبكة برؤية عددٍ من الأمثلة المختلفة قبل تحديث الوسطاء.
</p>

<p>
	وبمجرد اكتمال التدريب، يمكننا تشغيل الجلسة على الصور المخصصة للاختبار. وهذه المرة سنستخدم القيمة 1.0 مثل مُعدلِ تَسرّب dropout للمتغيّر <code>Keep_prob</code>، وذلك للتأكد من أن جميع الوِحدات نشطةٌ في عملية الاختبار.
</p>

<p>
	أضف هذه الشيفرة البرمجية للملف الذي نعمل عليه:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_977_57" style=""><span class="pun">إعداد</span><span class="pln"> </span><span class="pun">صور</span><span class="pln"> </span><span class="pun">الاختبار</span><span class="pln"> </span><span class="pun">كمتجهات</span><span class="pln"> </span><span class="pun">أحادية</span><span class="pln"> </span><span class="pun">طول</span><span class="pln"> </span><span class="pun">كل</span><span class="pln"> </span><span class="pun">منها</span><span class="pln"> </span><span class="lit">28</span><span class="pun">*</span><span class="lit">28</span><span class="pln"> </span><span class="com">#</span><span class="pln">
x_test </span><span class="pun">=</span><span class="pln"> x_test</span><span class="pun">.</span><span class="pln">reshape</span><span class="pun">(-</span><span class="lit">1</span><span class="pun">,</span><span class="lit">784</span><span class="pun">)</span><span class="pln">
test_accuracy </span><span class="pun">=</span><span class="pln"> sess</span><span class="pun">.</span><span class="pln">run</span><span class="pun">(</span><span class="pln">accuracy</span><span class="pun">,</span><span class="pln"> feed_dict</span><span class="pun">={</span><span class="pln">X</span><span class="pun">:</span><span class="pln"> x_test</span><span class="pun">,</span><span class="pln"> Y</span><span class="pun">:</span><span class="pln"> y_test</span><span class="pun">.</span><span class="pln">toarray</span><span class="pun">(),</span><span class="pln"> keep_prob</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1.0</span><span class="pun">})</span><span class="pln">
</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"\nAccuracy on test set:"</span><span class="pun">,</span><span class="pln"> test_accuracy</span><span class="pun">)</span></pre>

<p>
	والآن سنشغّل برنامجنا، لنعرف مدى دقة شبكتنا العصبية في التعرف على الأرقام المكتوبة بخط اليد. وسنحفظ التغييرات في الملف main.py الذي نعمل عليه.
</p>

<p>
	نَفِّذ الأمر التالي في الوِحدة الطرفية لتنفيذ الشيفرة البرمجية:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_977_59" style=""><span class="pun">(</span><span class="pln">tensorflow</span><span class="pun">-</span><span class="pln">demo</span><span class="pun">)</span><span class="pln"> $ python main</span><span class="pun">.</span><span class="pln">py</span></pre>

<p>
	سترى نتيجةً مشابهةً لما يلي، ويمكن أن تختلف قليلًا نتائج الخسارة والدقة الفردية:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_977_61" style=""><span class="typ">Iteration</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="pun">|</span><span class="pln"> </span><span class="typ">Loss</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">3.67079</span><span class="pln"> </span><span class="pun">|</span><span class="pln"> </span><span class="typ">Accuracy</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.140625</span><span class="pln">
</span><span class="typ">Iteration</span><span class="pln"> </span><span class="lit">100</span><span class="pln"> </span><span class="pun">|</span><span class="pln"> </span><span class="typ">Loss</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.492122</span><span class="pln"> </span><span class="pun">|</span><span class="pln"> </span><span class="typ">Accuracy</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.84375</span><span class="pln">
</span><span class="typ">Iteration</span><span class="pln"> </span><span class="lit">200</span><span class="pln"> </span><span class="pun">|</span><span class="pln"> </span><span class="typ">Loss</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.421595</span><span class="pln"> </span><span class="pun">|</span><span class="pln"> </span><span class="typ">Accuracy</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.882812</span><span class="pln">
</span><span class="typ">Iteration</span><span class="pln"> </span><span class="lit">300</span><span class="pln"> </span><span class="pun">|</span><span class="pln"> </span><span class="typ">Loss</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.307726</span><span class="pln"> </span><span class="pun">|</span><span class="pln"> </span><span class="typ">Accuracy</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.921875</span><span class="pln">
</span><span class="typ">Iteration</span><span class="pln"> </span><span class="lit">400</span><span class="pln"> </span><span class="pun">|</span><span class="pln"> </span><span class="typ">Loss</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.392948</span><span class="pln"> </span><span class="pun">|</span><span class="pln"> </span><span class="typ">Accuracy</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.882812</span><span class="pln">
</span><span class="typ">Iteration</span><span class="pln"> </span><span class="lit">500</span><span class="pln"> </span><span class="pun">|</span><span class="pln"> </span><span class="typ">Loss</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.371461</span><span class="pln"> </span><span class="pun">|</span><span class="pln"> </span><span class="typ">Accuracy</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.90625</span><span class="pln">
</span><span class="typ">Iteration</span><span class="pln"> </span><span class="lit">600</span><span class="pln"> </span><span class="pun">|</span><span class="pln"> </span><span class="typ">Loss</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.378425</span><span class="pln"> </span><span class="pun">|</span><span class="pln"> </span><span class="typ">Accuracy</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.882812</span><span class="pln">
</span><span class="typ">Iteration</span><span class="pln"> </span><span class="lit">700</span><span class="pln"> </span><span class="pun">|</span><span class="pln"> </span><span class="typ">Loss</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.338605</span><span class="pln"> </span><span class="pun">|</span><span class="pln"> </span><span class="typ">Accuracy</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.914062</span><span class="pln">
</span><span class="typ">Iteration</span><span class="pln"> </span><span class="lit">800</span><span class="pln"> </span><span class="pun">|</span><span class="pln"> </span><span class="typ">Loss</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.379697</span><span class="pln"> </span><span class="pun">|</span><span class="pln"> </span><span class="typ">Accuracy</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.875</span><span class="pln">
</span><span class="typ">Iteration</span><span class="pln"> </span><span class="lit">900</span><span class="pln"> </span><span class="pun">|</span><span class="pln"> </span><span class="typ">Loss</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.444303</span><span class="pln"> </span><span class="pun">|</span><span class="pln"> </span><span class="typ">Accuracy</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.90625</span><span class="pln">

</span><span class="typ">Accuracy</span><span class="pln"> on test set</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0.9206</span></pre>

<p>
	ولمحاولة تحسين دقة نموذجنا، أو لمعرفة المزيد حول تأثير ضبط الوسطاء الفائقة hyperparameters، يمكننا تغييرها لاختبار تأثيرها المنعكس على معدّل التعلم وعتبة التسرب Dropout Threshold، وكذا حجم الدفعة من الصور في كمية الأمثلة وعدد مرات المرور عبر المخطط، كما يمكننا كذلك تغيير عدد الوِحدات في طبقاتنا المخفية وتغيير عدد الطبقات المخفية نفسها، وذلك لنرى كيف ستؤثر بنية الشبكة العصبية على النموذج سواءً بزيادة دقته أو بتخفيضها.
</p>

<p>
	وللتأكد من أن الشبكة تتعرف جيدًا على الصور المكتوبة بخط اليد، فسنختبرها على صورةٍ خاصةٍ بنا، فإذا كنت تعمل على جهازك المحلي وترغب في استخدام صورٍ من جهازك، يمكنك استخدام أي محرر رسوماتٍ لإنشاء صورة بأبعاد 28x28 بكسل لأي رقمٍ تريده. مثلًا:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="110306" href="https://academy.hsoub.com/uploads/monthly_2022_10/test_image.png.9bb7035b998f168fc9c9495ee356c4ef.png" rel="" data-fileext="png"><img alt="test_image.png" class="ipsImage ipsImage_thumbnailed" data-fileid="110306" data-unique="6547f2dne" src="https://academy.hsoub.com/uploads/monthly_2022_10/test_image.png.9bb7035b998f168fc9c9495ee356c4ef.png"></a>
</p>

<p>
	نزل الصورة وانقلها إلى مجلد المشروع (تأكد أنها باسم test_image.png أو غير اسمها في الشيفرة) ثم أضف في نهاية الملف main.py هذا السطر البرمجي التالي لتحميل صورة الاختبار للرقم المكتوب بخط اليد:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_977_63" style=""><span class="pln">img </span><span class="pun">=</span><span class="pln"> np</span><span class="pun">.</span><span class="pln">array</span><span class="pun">(</span><span class="typ">Image</span><span class="pun">.</span><span class="pln">open</span><span class="pun">(</span><span class="str">"test_image.png"</span><span class="pun">).</span><span class="pln">convert</span><span class="pun">(</span><span class="str">'L'</span><span class="pun">)).</span><span class="pln">ravel</span><span class="pun">()</span></pre>

<p>
	إن الدالة <code>open</code> من مكتبة الصور <code>Image</code> تحمّل صورة الاختبار مثل مصفوفةٍ رباعية الأبعاد 4D، حيث تحتوي على قنوات الألوان الثلاث الرئيسية RGB بالإضافة إلى الشفافية، ولكن هذا ليس نفس التمثيل الذي استخدمناه سابقًا عند القراءة من مجموعة البيانات باستخدام المكتبة البرمجية TensorFlow، لذلك سنحتاج للقيام ببعض المهام الإضافية ليتناسب تنسيق هذه الصور مع التنسيق الذي سبق واعتمدناه في الخوارزمية.
</p>

<p>
	سنستخدم الدالة <code>convert</code> مع الوسيط <code>L</code> لتقليل تمثيل 4D RGBA إلى قناة لونٍ رماديةٍ واحدةٍ، وسنُخزنها على هيئة مصفوفة <code>numpy</code>. وسنستدعي <code>ravel</code> لتسوية المصفوفة.
</p>

<p>
	الآن بعد أن صححّنا بنية معلومات الصورة، يمكننا تشغيل الجلسة بنفس الطريقة السابقة، ولكن هذه المرة سنُرسل صورةً واحدةً فقط للاختبار. وسنضيف الشيفرة التالية للملف لاختبار الصورة وطباعة التصنيف الناتج، هكذا:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_977_65" style=""><span class="pln">prediction </span><span class="pun">=</span><span class="pln"> sess</span><span class="pun">.</span><span class="pln">run</span><span class="pun">(</span><span class="pln">tf</span><span class="pun">.</span><span class="pln">argmax</span><span class="pun">(</span><span class="pln">output_layer</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">),</span><span class="pln"> feed_dict</span><span class="pun">={</span><span class="pln">X</span><span class="pun">:</span><span class="pln"> </span><span class="pun">[</span><span class="pln">img</span><span class="pun">]})</span><span class="pln">
</span><span class="kwd">print</span><span class="pln"> </span><span class="pun">(</span><span class="str">"Prediction for test image:"</span><span class="pun">,</span><span class="pln"> np</span><span class="pun">.</span><span class="pln">squeeze</span><span class="pun">(</span><span class="pln">prediction</span><span class="pun">))</span></pre>

<p>
	وتُستدعى الدالة <code>np.squeeze</code> على المتغير <code>prediction</code> ليُعِيد عددًا صحيحًا وفريدًا إلى المصفوفة. وسيتضح من الناتج أن الشبكة العصبية قد تعرفت على الصورة كرقم 4، هكذا:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_977_67" style=""><span class="typ">Prediction</span><span class="pln"> </span><span class="kwd">for</span><span class="pln"> test image</span><span class="pun">:</span><span class="pln"> </span><span class="lit">4</span></pre>

<p>
	يمكنك الآن تجربة عملية اختبار الشبكة باستخدام صورٍ أكثر تعقيدًا مثل الأرقام المتشابهة مع الأرقام الأخرى، أو أرقامٍ مكتوبةٍ بخطٍ سيئٍ أو حتى خاطئةٍ، وذلك لمعرفة وقياس مدى نجاحها.
</p>

<h2>
	الخلاصة
</h2>

<p>
	في هذا المقال، نجحنا في تدريب شبكةٍ عصبيةٍ لتصنيف مجموعة بياناتٍ MNIST بدقةٍ تصل إلى 92٪، واختبارها على صورةٍ خاصةٍ بنا، مع العلم بأنه قد تحققت نسبة أعلى في الأبحاث العلمية الحديثة وكانت حوالي 99٪ لنفس الفكرة، وذلك باستخدام بُنىً مختلفةً لشبكةٍ عصبيةٍ ذات تعقيدٍ أكبر، بحيث تتضمن طبقات تلافيفية. وتستخدم تلك الشبكات بِنيةً ثنائية الأبعاد للصورة لتمثيل المحتويات تمثيلًا أفضل من تمثيل نموذجنا السابق، إذ أن نموذجنا يُسوّي كلّ البكسلات في متجهٍ واحدٍ مكوّنٍ من 784 وِحدة. ويمكنك قراءة المزيد على الموقع الرسمي للمكتبة <a href="https://www.tensorflow.org/api_docs/python/tf/nn/convolution" rel="external nofollow">TensorFlow</a>، والاطلاع على الأوراق البحثية التي تُفصِّل أدق النتائج على موقع <a href="http://yann.lecun.com/exdb/mnist/" rel="external nofollow">MNIST</a>.
</p>

<p>
	والآن بعد أن تعرفنا على كيفية بناء شبكةٍ عصبيةٍ وتدريبها، يمكنك تجربة هذا التطبيق واستخدامه على بياناتك الخاصة، أو اختبارها على مجموعات بياناتٍ شائعةٍ مختلفةٍ عن تلك التي استخدمناها مثل: <a href="http://ufldl.stanford.edu/housenumbers/" rel="external nofollow">مجموعة البيانات</a> من غوغل أو <a href="http://www.cs.utoronto.ca/%7Ekriz/cifar.html" rel="external nofollow">مجموعة البيانات</a> من CIFAR-10، وذلك للتعرف على صورٍ أكثر عموميةٍ وشموليةٍ.
</p>

<p>
	ترجمة -وبتصرف- للفصل How To Build a Neural Network to Recognize Handwritten Digits with TensorFlow من كتاب <a href="https://www.digitalocean.com/community/books/python-machine-learning-projects-a-digitalocean-ebook" rel="external nofollow">Python Machine Learning Projects</a> لكاتبته Ellie Birbeck
</p>

<p>
	يُمكن تنزيل الكود كاملًا من <a class="ipsAttachLink" data-fileid="81957" href="https://academy.hsoub.com/applications/core/interface/file/attachment.php?id=81957" rel="" data-fileext="zip">Recognize-Handwritten-Numbers-MNIST-master</a>.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%B4%D8%A8%D9%83%D8%A9-%D8%B9%D8%B5%D8%A8%D9%8A%D8%A9-%D8%B5%D9%86%D8%B9%D9%8A%D8%A9-%D9%88%D8%AA%D8%AF%D8%B1%D9%8A%D8%A8%D9%87%D8%A7-%D9%84%D9%84%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D9%88%D8%AC%D9%88%D9%87-r1198/" rel="">إعداد شبكة عصبية صنعية وتدريبها للتعرف على الوجوه</a>
	</li>
	<li>
		النسخة الكاملة من كتاب <a href="https://academy.hsoub.com/files/17-%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A7%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A-%D9%88%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9/" rel="">مدخل إلى الذكاء الاصطناعي وتعلم الآلة</a>
	</li>
	<li>
		النسخة العربية الكاملة من كتاب <a href="https://academy.hsoub.com/files/15-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A8%D9%84%D8%BA%D8%A9-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86/" rel="">البرمجة بلغة بايثون</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1267</guid><pubDate>Tue, 13 Jul 2021 16:00:00 +0000</pubDate></item><item><title>&#x628;&#x646;&#x627;&#x621; &#x645;&#x635;&#x646;&#x641; &#x628;&#x627;&#x644;&#x627;&#x639;&#x62A;&#x645;&#x627;&#x62F; &#x639;&#x644;&#x649; &#x637;&#x631;&#x642; &#x62A;&#x639;&#x644;&#x645; &#x627;&#x644;&#x622;&#x644;&#x629; &#x628;&#x644;&#x63A;&#x629; &#x627;&#x644;&#x628;&#x627;&#x64A;&#x62B;&#x648;&#x646; &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x645;&#x643;&#x62A;&#x628;&#x629; Scikit-Learn</title><link>https://academy.hsoub.com/programming/artificial-intelligence/%D8%A8%D9%86%D8%A7%D8%A1-%D9%85%D8%B5%D9%86%D9%81-%D8%A8%D8%A7%D9%84%D8%A7%D8%B9%D8%AA%D9%85%D8%A7%D8%AF-%D8%B9%D9%84%D9%89-%D8%B7%D8%B1%D9%82-%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9-%D8%A8%D9%84%D8%BA%D8%A9-%D8%A7%D9%84%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%85%D9%83%D8%AA%D8%A8%D8%A9-scikit-learn-r1266/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2021_07/60ed59bec9010_-----------Scikit-Learn.png.81d5bf603635d5de0f0b3f0c678187b6.png" /></p>
<p>
	سننفذ في هذا المقال خوارزميةً بسيطةً لتعلم الآلة <a href="https://wiki.hsoub.com/Python" rel="external">بلغة بايثون</a> Python باستخدام مكتبة <a href="http://scikit-learn.org/stable/" rel="external nofollow">Scikit-learn</a>، وهذه المكتبة ما هي إلا أداةٌ لتطبيق تعلّم الآلة بلغة البايثون، كما سنستخدم المُصنّف <a href="http://scikit-learn.org/stable/modules/naive_bayes.html" rel="external nofollow">Naive Bayes (NB)</a> مع قاعدة بياناتٍ حقيقية لمعلومات ورم سرطان الثدي، والذي سيتنبأ إذا ما كان الورم خبيثًا أم حميدًا. وفي نهاية هذا المقال ستعرف خطوات وكيفية إنشاء نموذج تنبؤي خاص بك لتَعَلّم الآلة بلغة بايثون.
</p>

<h2>
	المتطلبات الرئيسية
</h2>

<p>
	قبل البدء بهذا المقال لا بد من تجهيز البيئة المناسبة، وسنستخدم محرر الشيفرات البرمجية <a href="https://academy.hsoub.com/devops/linux/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D9%87%D9%8A%D8%A6%D8%A9-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82-%D8%A7%D9%84%D9%85%D9%81%D9%83%D8%B1%D8%A9-jupyter-notebook-%D9%84%D9%84%D8%B9%D9%85%D9%84-%D9%85%D8%B9-%D9%84%D8%BA%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-python-3-r388/" rel="">Jupyter Notebooks</a>، وهو مفيد جدًا لتجربة وتشغيل الأمثلة الخاصة بتَعَلّم الآلة بطريقةٍ تفاعليةٍ، حيث تستطيع من خلاله تشغيل كتلًا صغيرةً من الشيفرات البرمجية ورؤية النتائج بسرعة، مما سيسهل علينا اختبار الشيفرات البرمجية وتصحيحها.
</p>

<p>
	يُمكنك فتح متصفح الويب والذهاب لموقع المحرر الرسمي <a href="https://jupyter.org/try" rel="external nofollow">jupyter</a> على الوِيب لبدء العمل بسرعة، ومن ثمّ انقر فوق "جرّب المحرر التقليدي Try Classic Notebook"، وستنتقل بعدها لملفٍ جديدٍ بداخل محرر Jupyter Notebooks التفاعلي، وبذلك تجهّز نفسك لكتابة الشيفرة البرمجية <a href="https://academy.hsoub.com/programming/python/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D9%84%D8%BA%D8%A9-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-r211/" rel="">بلغة البايثون</a>.
</p>

<p>
	إذا رغبت بمزيدٍ من المعلومات حول محرر الشيفرات البرمجية Jupyter Notebooks وكيفيّة إعداد بيئته الخاصة لكتابة شيفرة بايثون، فيمكنك الاطلاع على: <a href="https://academy.hsoub.com/devops/linux/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D9%87%D9%8A%D8%A6%D8%A9-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82-%D8%A7%D9%84%D9%85%D9%81%D9%83%D8%B1%D8%A9-jupyter-notebook-%D9%84%D9%84%D8%B9%D9%85%D9%84-%D9%85%D8%B9-%D9%84%D8%BA%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-python-3-r388/" rel="">كيفية تهيئة تطبيق المفكرة jupyter notebook للعمل مع لغة البرمجة python</a>.
</p>

<h2>
	1. إعداد المشروع
</h2>

<p>
	ستحتاج أولًا لتثبيت بعض التبعيات، وذلك لإنشاء مساحة عملٍ للاحتفاظ بملفاتنا قبل أن نتمكن من تطوير برنامج التعرف على الصور، وسنستخدم بيئة بايثون 3.8 الافتراضية لإدارة التبعيات الخاصة بمشروعنا.
</p>

<p>
	سَنُنشئ مجلدًا جديدًا خاصًا بمشروعنا وسندخل إليه هكذا:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_675_7" style=""><span class="pln">mkdir cancer</span><span class="pun">-</span><span class="pln">demo
cd cancer</span><span class="pun">-</span><span class="pln">demo</span></pre>

<p>
	سننفذّ الأمر التالي لإعداد البيئة الافتراضية:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_675_9" style=""><span class="pln">python </span><span class="pun">-</span><span class="pln">m venv cancer</span><span class="pun">-</span><span class="pln">demo</span></pre>

<p>
	سننفذّ الأمر التالي لتشغيل البيئة الافتراضية في <a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%A7-%D9%87%D9%88-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%84%D9%8A%D9%86%D9%83%D8%B3%D8%9F-r451/" rel="">Linux</a>:
</p>

<pre class="ipsCode">source cancer-demo/bin/activate
</pre>

<p>
	أما في Windows:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_675_11" style=""><span class="str">"cancer-demo/Scripts/activate.bat"</span></pre>

<p>
	سنستخدم إصداراتٍ محددةٍ من هذه المكتبات، من خلال إنشاء ملف <code>requirements.txt</code> في مجلد المشروع، وسيُحدِّد هذا الملف المتطلبات والإصدارات التي سنحتاج إليها.
</p>

<p>
	سنفتح الملف <code>requirements.txt</code> في محرر النصوص، وسنُضيف الأسطر البرمجية التالية، وذلك لتحديد المكتبات التي نريدها وإصداراتها:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_675_14" style=""><span class="pln">jupyter</span><span class="pun">==</span><span class="lit">1.0</span><span class="pun">.</span><span class="lit">0</span><span class="pln">
scikit</span><span class="pun">-</span><span class="pln">learn</span><span class="pun">==</span><span class="lit">1.0</span></pre>

<p>
	سنحفظ التغييرات التي طرأت على الملف وسنخرج من محرر النصوص، ثم سنُثَبت هذه المكتبات بالأمر التالي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_675_16" style=""><span class="pun">(</span><span class="pln">cancer</span><span class="pun">-</span><span class="pln">demo</span><span class="pun">)</span><span class="pln"> $ pip install </span><span class="pun">-</span><span class="pln">r requirements</span><span class="pun">.</span><span class="pln">txt</span></pre>

<p>
	بعد تثبيتنا لهذه التبعيات، سنُصبح جاهزين لبدء العمل على مشروعنا.
</p>

<p>
	شغّل محرر الشيفرات البرمجية Jupyter Notebook بمجرد اكتمال عملية التثبيت. هكذا:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_675_19" style=""><span class="pun">(</span><span class="pln">cancer</span><span class="pun">-</span><span class="pln">demo</span><span class="pun">)</span><span class="pln"> $ jupyter notebook</span></pre>

<p>
	أنشئ ملفًا جديدًا في داخل المحرر بالضغط على الزر new واختيار python 3 (ipykernal)‎ وسمه باسم ML Tutorial مثلًا، حيث ستكون في الخلية الأولى للملف عملية استيراد الوِحدة (أو المكتبة) البرمجية <code>scikit-learn</code> (لمزيد من المعلومات حول طريقة استيراد وحدة برمجية في لغة بايثون يمكنك الاطلاع على <a href="https://academy.hsoub.com/programming/python/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A7%D8%B3%D8%AA%D9%8A%D8%B1%D8%A7%D8%AF-%D8%A7%D9%84%D9%88%D8%AD%D8%AF%D8%A7%D8%AA-%D9%81%D9%8A-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-3-r744/" rel="">كيفية استيراد الوحدات في بايثون 3 </a> سبق وأن ناقشنا فيه هذه الفكرة بالتفصيل):
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_675_21" style=""><span class="kwd">import</span><span class="pln"> sklearn </span></pre>

<p>
	يجب أن يبدو الملف الخاص بك شبيهًا بالملف التالي:
</p>

<p style="text-align: center;">
	<img alt="ظهور الملفات المنشأة في مكتبة Scikit-Learn" class="ipsImage ipsImage_thumbnailed" data-fileid="71770" data-unique="4o5q4p58y" style="width: 740px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2021_07/1.png.43181e8a7bfc11d13f915dae98e8fbed.png">
</p>

<p>
	والآن بعد استيرادنا للمكتبة بنجاح، سنبدأ العمل مع مجموعة البيانات لبناء نموذج تعلّم الآلة الخاص بنا.
</p>

<h2>
	2. استيراد مجموعة بيانات Scikit-Learn’s
</h2>

<p>
	مجموعة البيانات التي سنتعامل معها في هذا المقال هي <a href="http://scikit-learn.org/stable/datasets/index.html#breast-cancer-wisconsin-diagnostic-database" rel="external nofollow">قاعدة بيانات</a> الخاصة بتشخيص مرض سرطان الثدي في ولاية ويسكونسن الأمريكية. تتضمن هذه المجموعة من البيانات معلوماتٍ مختلفةٍ حول أورام سرطان الثدي، بالإضافة إلى تصنيفات الأورام سواءً كانت خبيثةً أم حميدةً. كما تحتوي على 569 حالة (أو للدقة بيانات 569 ورمًا)، كما تتضمن معلومات عن 30 ميزة لكلّ ورم، مثل: نصف قطر الورم ونسيجه ونعومته ومساحته.
</p>

<p>
	سنبني نموذجًا لتعلّم الآلة من مجموعة البيانات السابقة باستخدام معلومات الورم فقط للتنبؤ فيما إذا كان الورم خبيثًا أم حميدًا.
</p>

<p>
	يُثَبت مع مكتبة <code>Scikit-learn</code> مجموعات بياناتٍ مختلفةٍ افتراضيًا، ويُمكننا استيرادها لتُصبح متاحةً للاستخدام في بيئتنا مباشرةً، لنفعل ذلك:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_675_23" style=""><span class="kwd">from</span><span class="pln"> sklearn</span><span class="pun">.</span><span class="pln">datasets </span><span class="kwd">import</span><span class="pln"> load_breast_cancer
</span><span class="com"># Load dataset</span><span class="pln">
data </span><span class="pun">=</span><span class="pln"> load_breast_cancer</span><span class="pun">()</span></pre>

<p>
	سيُمثَل <a href="https://academy.hsoub.com/programming/python/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D9%85%D8%AA%D8%BA%D9%8A%D8%B1%D8%A7%D8%AA-%D9%81%D9%8A-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-3-r729/" rel="">المتغير</a> <code>data</code> ككائنٍ في البايثون، والذي سيعمل مثل عمل <a href="https://academy.hsoub.com/programming/python/%D9%81%D9%87%D9%85-%D8%A7%D9%84%D9%82%D9%88%D8%A7%D9%85%D9%8A%D8%B3-%D9%81%D9%8A-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-3-r743/" rel="">القاموس</a> الذي هو نوعٌ مُضمَّنٌ في بايثون، بحيث يربط مفاتيحًا بقيمٍ على هيئة أزواجٍ، وستُؤخذ بالحسبان مفاتيح القاموس، وهي أسماء الحقول المُصنّفة <code>target_names</code>، والقيم الفعلية لها <code>target</code>، وأسماء الميّزات <code>feature_names</code>، والقيم الفعلية لهذه الميزات <code>data</code>.
</p>

<p>
	تُعَد الميّزات جزءًا مهمًا من أي مصنّف، إذ تُمثّل هذه الميزات خصائص مهمةً تصف طبيعة البيانات، كما ستساعدنا في عملية التنبؤ بحالة الورم (ورم الخبيث malignant tumor أو ورم حميد benign tumor)، ومن الميّزات المُفيدة المحتملة في مجموعة بياناتنا هذه، هي حجم الورم ونصف قطره ونسيجه.
</p>

<p>
	أنشئ في الملف نفسه بعد ذلك متغيرات جديدةً لكلّ مجموعةٍ مهمةٍ من هذه المعلومات وأسند لها البيانات:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_675_25" style=""><span class="com"># تنظيم بياناتنا</span><span class="pln">
label_names </span><span class="pun">=</span><span class="pln"> data</span><span class="pun">[</span><span class="str">'target_names'</span><span class="pun">]</span><span class="pln">
labels </span><span class="pun">=</span><span class="pln"> data</span><span class="pun">[</span><span class="str">'target'</span><span class="pun">]</span><span class="pln">
feature_names </span><span class="pun">=</span><span class="pln"> data</span><span class="pun">[</span><span class="str">'feature_names'</span><span class="pun">]</span><span class="pln">
features </span><span class="pun">=</span><span class="pln"> data</span><span class="pun">[</span><span class="str">'data'</span><span class="pun">]</span></pre>

<p>
	والآن أصبحت لدينا <a href="https://academy.hsoub.com/programming/python/%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9-%D8%A7%D9%84%D9%82%D9%88%D8%A7%D8%A6%D9%85-%D9%88%D8%A7%D9%84%D8%B3%D9%84%D8%A7%D8%B3%D9%84-%D8%A7%D9%84%D9%86%D8%B5%D9%8A%D8%A9-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-r223/" rel="">قوائم</a> لكلّ مجموعةٍ من المعلومات، ولفَهم مجموعة البيانات الخاصة بنا فهمًا صحيحًا ودقيقًا، سنُلقي نظرةً عليها من خلال طباعة حقول الصنف مثل طباعة أول عينةٍ من البيانات، وأسماء ميّزاتها، وقيمها هكذا:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_675_27" style=""><span class="com"># الاطلاع على بياناتنا</span><span class="pln">
</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">label_names</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">labels</span><span class="pun">[</span><span class="lit">0</span><span class="pun">])</span><span class="pln">
</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">feature_names</span><span class="pun">[</span><span class="lit">0</span><span class="pun">])</span><span class="pln">
</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">features</span><span class="pun">[</span><span class="lit">0</span><span class="pun">])</span></pre>

<p>
	إن نفذّت هذه الشيفرة بطريقةٍ صحيحةٍ فسترى النتائج التالية:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="71771" href="https://academy.hsoub.com/uploads/monthly_2021_07/2.png.0183cb140f6aa0920261ebdfc42db161.png" rel="" data-fileext="png"><img alt="نتائج نقل الشيفرة في مكتبة Scikit-Learn" class="ipsImage ipsImage_thumbnailed" data-fileid="71771" data-unique="7rdqzg41h" style="width: 648px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2021_07/2.thumb.png.f8d72651a3b514f93059082426801b1d.png"></a>
</p>

<p>
	نُلاحظ من الصورة أن أسماء الأصناف الخاصة بنا ستكون خبيث malignant وحميد benign (أي أن الورم سيكون إما خبيثًا أو حميدًا)، والمرتبطة بقيم ثنائية وهي إما 0 أو 1، إذ يُمثّل الرقم 0 أورامًا خبيثة ويُمثّل الرقم 1 أورامًا حميدة، لذا فإن أول مثالٍ للبيانات الموجودة لدينا هو ورمٌ خبيثٌ نصف قطره 1.79900000e+01.
</p>

<p>
	والآن بعد تأكدنا من تحميل بياناتنا تحميلًا صحيحًا في بيئة التنفيذ، سنبدأ العمل مع بياناتنا لبناء مصنّف باستخدام طُرق تعلّم الآلة.
</p>
<div class="banner-container ipsBox ipsPadding">
	<div class="inner-banner-container">
		<p class="banner-heading">
			دورة الذكاء الاصطناعي
		</p>

		<p class="banner-subtitle">
			احترف برمجة الذكاء الاصطناعي AI وتحليل البيانات وتعلم كافة المعلومات التي تحتاجها لبناء نماذج ذكاء اصطناعي متخصصة.
		</p>

		<div>
			<a class="ipsButton ipsButton_large ipsButton_primary ipsButton_important" href="https://academy.hsoub.com/learn/artificial-intelligence" rel="">اشترك الآن</a>
		</div>
	</div>

	<div class="banner-img">
		<a href="https://academy.hsoub.com/learn/artificial-intelligence" rel=""><img alt="دورة الذكاء الاصطناعي AI" src="https://academy.hsoub.com/learn/assets/images/courses/artificial-intelligence.png"></a>
	</div>
</div>
<h2>
	3. تنظيم البيانات في مجموعات
</h2>

<p>
	ينبغي عليك دائمًا اختبار النموذج على البيانات غير المرئية، وذلك لتقييم مدى جودة أداء المُصنّف، لهذا قسّم البيانات الخاصة بك إلى جزئين قبل بناء النموذج، بحيث تكون هناك مجموعةٌ للتدريب ومجموعةٌ للاختبار.
</p>

<p>
	تستطيع استخدام المجموعة المخصصة للتدريب من أجل تدريب وتقييم النموذج أثناء مرحلة التطوير. حيث ستمنحك منهجية تنبؤات هذا النموذج المُدرّب على المجموعة المخصصة للاختبار غير المرئية، فكرةً دقيقةً عن أداء النموذج وقوته.
</p>

<p>
	لحسن الحظ، لدى المكتبة <code>Scikit-learn</code> دالة تُدعى <code>train_test_split()‎</code>، والتي ستقسمُ بياناتك لهذه المجموعات. ولكن يجب أن تستورد هذه الدالة أولًا ومن ثَمّ تستخدمها لتقسيم البيانات:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_675_32" style=""><span class="kwd">from</span><span class="pln"> sklearn</span><span class="pun">.</span><span class="pln">model_selection </span><span class="kwd">import</span><span class="pln"> train_test_split
</span><span class="com"># تقسيم بياناتنا</span><span class="pln">
train</span><span class="pun">,</span><span class="pln"> test</span><span class="pun">,</span><span class="pln"> train_labels</span><span class="pun">,</span><span class="pln"> test_labels </span><span class="pun">=</span><span class="pln"> train_test_split</span><span class="pun">(</span><span class="pln">features</span><span class="pun">,</span><span class="pln"> labels</span><span class="pun">,</span><span class="pln"> test_size</span><span class="pun">=</span><span class="lit">0.33</span><span class="pun">,</span><span class="pln"> random_state</span><span class="pun">=</span><span class="lit">42</span><span class="pun">)</span></pre>

<p>
	ستُقسّمُ هذه الدّالة البيانات بطريقةٍ عشوائيةٍ باستخدام الوسيط <code>test_size</code>. في مثالنا لدينا الآن مجموعةً مخصصةً للاختبار test تُمثّل 33٪ من مجموعة البيانات الأصلية، وسيُشكّل الجزء المتبقي من البيانات المجموعة المخصصة للتدريب train. كما لدينا حقولٌ مخصصةٌ لكلٍ من المتغيرات، سواء أكانت مُخصّصةً للاختبار أو للتدريب، أي <code>train_labels</code> و<code>test_labels</code>. لنُدرّب الآن نموذجنا الأول.
</p>

<h2>
	4. بناء النموذج وتقييمه
</h2>

<p>
	هناك العديد من النماذج المُخَصصة <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D9%84%D9%85%D9%81%D8%A7%D9%87%D9%8A%D9%85-%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A9-%D9%84%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9-r1009/" rel="">لتعلّم الآلة</a>، ولكلّ نموذجٍ منها نقاط قوةٍ وضعفٍ. في هذا المقال، سنُركّز على خوارزمية بسيطةٍ تؤدي عادةً أداءً جيدًا في مهام التصنيف الثنائية، وهي خوارزمية بايز <a href="http://scikit-learn.org/stable/modules/naive_bayes.html" rel="external nofollow">Naive Bayes (NB)</a>.
</p>

<p>
	أولًا، سنستورد الوِحدة البرمجية <code>GaussianNB</code> ثم نُهَيّئ النموذج باستخدام الدالة <code>GaussianNB()‎</code>، بعدها سنُدرّب النموذج من خلال مُلاءمته مع البيانات باستخدام الدالة <code>gnb.fit()‎</code>:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_675_37" style=""><span class="kwd">from</span><span class="pln"> sklearn</span><span class="pun">.</span><span class="pln">naive_bayes </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">GaussianNB</span><span class="pln">
</span><span class="com"># تهيئة المصنّف خاصتنا</span><span class="pln">
gnb </span><span class="pun">=</span><span class="pln"> </span><span class="typ">GaussianNB</span><span class="pun">()</span><span class="pln">
</span><span class="com"># تدريب المصنّف</span><span class="pln">
model </span><span class="pun">=</span><span class="pln"> gnb</span><span class="pun">.</span><span class="pln">fit</span><span class="pun">(</span><span class="pln">train</span><span class="pun">,</span><span class="pln"> train_labels</span><span class="pun">)</span></pre>

<p>
	بعد أن نُدّرب النموذج سنستخدمه للتنبؤ على المجموعة المخصصة للاختبار، وسننفذ ذلك من خلال الدّالة <code>predict()‎</code>، والتي ستُعيد مجموعةً من التنبؤات لكلّ نسخة بياناتٍ في المجموعة المخصصة للاختبار، ثم نطبع تنبؤاتنا لِفَهم ما حدده هذا النموذج.
</p>

<p>
	استخدِم الدالة <code>predict()‎</code> مع مجموعة البيانات المخصصة للاختبار <code>test</code> واطبع النتائج:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_675_39" style=""><span class="com"># بناء التوقعات</span><span class="pln">
preds </span><span class="pun">=</span><span class="pln"> gnb</span><span class="pun">.</span><span class="pln">predict</span><span class="pun">(</span><span class="pln">test</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">preds</span><span class="pun">)</span></pre>

<p>
	عند تنفيذك للشيفرة البرمجية تنفيذًا صحيحًا سترى النتائج التالية:
</p>

<p style="text-align: center;">
	<img alt="نتائج التنفيذ الصحيح للشيفرة في مكتبة Scikit-Learn" class="ipsImage ipsImage_thumbnailed" data-fileid="71772" data-unique="jq6zuksue" style="width: 699px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2021_07/3.png.51a2ce60121c43ec1606e46a5387b940.png">
</p>

<p>
	فكما ترى، أعادت الدالة <code>predict()‎</code> مصفوفةً ثُنائية القيم إما 0 أو 1، حيث تُمثل القيم المتوقعة لصنف الورم (خبيث أم حميد).
</p>

<p>
	والآن بعد أن حصلنا على توقعاتنا، لِنُقيِّم مدى جودة أداء هذا المُصنّف.
</p>

<h2>
	5. تقييم دقة النموذج
</h2>

<p>
	نُقّيم دقة القيم المتوقَّعة لنموذجنا باستخدام مصفوفة التصنيفات الناتجة للأصناف الحقيقية التي لدينا، وذلك من خلال موازنة المصفوفتين <code>test_labels</code> و<code>preds</code> باستخدام الدالة <code>accuracy_score()‎</code> التابعة للمكتبة <code>Scikit-learn</code>، وذلك لتحديد دِقة المُصنّف.
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_675_44" style=""><span class="kwd">from</span><span class="pln"> sklearn</span><span class="pun">.</span><span class="pln">metrics </span><span class="kwd">import</span><span class="pln"> accuracy_score
</span><span class="com"># تقييم الدقة</span><span class="pln">
</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">accuracy_score</span><span class="pun">(</span><span class="pln">test_labels</span><span class="pun">,</span><span class="pln"> preds</span><span class="pun">))</span></pre>

<p>
	سترى النتائج التالية:
</p>

<p style="text-align: center;">
	<img alt="تقييم دقة النموذج في مكتبة Scikit-Learn" class="ipsImage ipsImage_thumbnailed" data-fileid="71773" data-unique="mqe2mxhx7" style="width: 699px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2021_07/4.png.c1d51be9c3aa0e2921b71e4b2bbdd499.png">
</p>

<p>
	كما ترى في النتيجة، فإن المُصنّف NB دقيقٌ بنسبة 94.15٪. وهذا يعني أن المُصنِّف قادرٌ على التنبؤ الصحيح فيما إذا كان الورم خبيثًا أو حميدًا بنسبة 94.15٪ من الحالات الكُليّة. كما تُشير هذه النتائج إلى أن مجموعة الميّزات المُكونة من 30 ميزة هي مؤشراتٍ جيدةٍ لصنف الورم.
</p>

<p>
	بهذا تكون قد نجحت في إنشاء مصنِّفك الأول الذي يعتمد في عمله على طرق تعلّم الآلة، والآن لنعد تنظيم الشيفرة البرمجية بوضع جميع عمليات الاستيراد في أعلى الملف، إذ يجب أن تبدو النسخة النهائية من الشيفرة البرمجية خاصتك شبيةً بهذه الشيفرة:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_675_49" style=""><span class="kwd">from</span><span class="pln"> sklearn</span><span class="pun">.</span><span class="pln">datasets </span><span class="kwd">import</span><span class="pln"> load_breast_cancer
</span><span class="kwd">from</span><span class="pln"> sklearn</span><span class="pun">.</span><span class="pln">model_selection </span><span class="kwd">import</span><span class="pln"> train_test_split
</span><span class="kwd">from</span><span class="pln"> sklearn</span><span class="pun">.</span><span class="pln">naive_bayes </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">GaussianNB</span><span class="pln">
</span><span class="kwd">from</span><span class="pln"> sklearn</span><span class="pun">.</span><span class="pln">metrics </span><span class="kwd">import</span><span class="pln"> accuracy_score

</span><span class="com"># تحميل البيانات</span><span class="pln">
data </span><span class="pun">=</span><span class="pln"> load_breast_cancer</span><span class="pun">()</span><span class="pln">

</span><span class="com"># تنظيم البيانات</span><span class="pln">
label_names </span><span class="pun">=</span><span class="pln"> data</span><span class="pun">[</span><span class="str">'target_names'</span><span class="pun">]</span><span class="pln">
labels </span><span class="pun">=</span><span class="pln"> data</span><span class="pun">[</span><span class="str">'target'</span><span class="pun">]</span><span class="pln">
feature_names </span><span class="pun">=</span><span class="pln"> data</span><span class="pun">[</span><span class="str">'feature_names'</span><span class="pun">]</span><span class="pln">
features </span><span class="pun">=</span><span class="pln"> data</span><span class="pun">[</span><span class="str">'data'</span><span class="pun">]</span><span class="pln">

</span><span class="com"># الاطلاع على البيانات</span><span class="pln">
</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">label_names</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">print</span><span class="pun">(</span><span class="str">'Class label = '</span><span class="pun">,</span><span class="pln"> labels</span><span class="pun">[</span><span class="lit">0</span><span class="pun">])</span><span class="pln">
</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">feature_names</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">features</span><span class="pun">[</span><span class="lit">0</span><span class="pun">])</span><span class="pln">

</span><span class="com"># تقسيم البيانات</span><span class="pln">
train</span><span class="pun">,</span><span class="pln"> test</span><span class="pun">,</span><span class="pln"> train_labels</span><span class="pun">,</span><span class="pln"> test_labels </span><span class="pun">=</span><span class="pln"> train_test_split</span><span class="pun">(</span><span class="pln">features</span><span class="pun">,</span><span class="pln"> labels</span><span class="pun">,</span><span class="pln"> test_size</span><span class="pun">=</span><span class="lit">0.33</span><span class="pun">,</span><span class="pln"> random_state</span><span class="pun">=</span><span class="lit">42</span><span class="pun">)</span><span class="pln">

</span><span class="com"># تهيئة المصنّف</span><span class="pln">
gnb </span><span class="pun">=</span><span class="pln"> </span><span class="typ">GaussianNB</span><span class="pun">()</span><span class="pln">

</span><span class="com"># تدريب المصنّف</span><span class="pln">
model </span><span class="pun">=</span><span class="pln"> gnb</span><span class="pun">.</span><span class="pln">fit</span><span class="pun">(</span><span class="pln">train</span><span class="pun">,</span><span class="pln"> train_labels</span><span class="pun">)</span><span class="pln">

</span><span class="com"># بناء التوقعات</span><span class="pln">
preds </span><span class="pun">=</span><span class="pln"> gnb</span><span class="pun">.</span><span class="pln">predict</span><span class="pun">(</span><span class="pln">test</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">preds</span><span class="pun">)</span><span class="pln">

</span><span class="com"># تقييم الدقة</span><span class="pln">
</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">accuracy_score</span><span class="pun">(</span><span class="pln">test_labels</span><span class="pun">,</span><span class="pln"> preds</span><span class="pun">))</span></pre>

<p>
	والآن بإمكانك إكمال العمل على الشيفرة البرمجية، وتحسين عمل المُصنّف وتوسيعه، وكذا تجربة هذا المصنّف مع مجموعاتٍ فرعيةٍ مختلفةٍ من الميزات، أو حتى تجربة <a href="https://academy.hsoub.com/programming/advanced/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A7%D9%84%D8%AE%D9%88%D8%A7%D8%B1%D8%B2%D9%85%D9%8A%D8%A7%D8%AA-r1282/" rel="">خوارزمياتٍ</a> مختلفةٍ تمامًا.
</p>

<p>
	تستطيع الاطلاع على الموقع الرسمي لمكتبة <a href="https://scikit-learn.org/stable/" rel="external nofollow">Scikit-Learn</a> لمزيدٍ من الأفكار حول تطبيق تعلّم الآلة مع البيانات لبناء شيءٍ مفيدٍ.
</p>

<h2>
	الخلاصة
</h2>

<p>
	لقد تعلمنا في هذا المقال كيفية إنشاء مُصنّف بالاعتماد على تعلّم الآلة بلغة بايثون باستخدام المكتبة Scikit-learn، والآن بإمكانك تحميل البيانات في بيئةٍ برمجيةٍ وتنظيمها وتدريبها، وكذا التنبؤ بأشياء بناءً عليها، وتقييم دِقّة المُصنّفات الناتجة.
</p>

<p>
	نتمنى أن تُساعدك هذه الخطوات في تسهيل طريقة العمل مع بياناتك الخاصة بلغة بايثون.
</p>

<p>
	ترجمة -وبتصرف- للفصل How To Build a Machine Learning Classifier in Python with Scikit-learn من كتاب <a href="https://www.digitalocean.com/community/books/python-machine-learning-projects-a-digitalocean-ebook" rel="external nofollow">Python Machine Learning Projects</a> لكاتبه Michelle Morales.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		النسخة الكاملة لكتاب <a href="https://academy.hsoub.com/files/17-%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A7%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A-%D9%88%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9/" rel="">مدخل إلى الذكاء الاصطناعي وتعلم الآلة</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/python/%D8%A7%D9%84%D9%85%D8%B1%D8%AC%D8%B9-%D8%A7%D9%84%D8%B4%D8%A7%D9%85%D9%84-%D8%A5%D9%84%D9%89-%D8%AA%D8%B9%D9%84%D9%85-%D9%84%D8%BA%D8%A9-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-r735/" rel="">المرجع الشامل إلى تعلم لغة بايثون</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D9%84%D9%85%D9%81%D8%A7%D9%87%D9%8A%D9%85-%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A9-%D9%84%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9-r1009/" rel="">المفاهيم الأساسية لتعلم الآلة</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A8%D9%86%D8%A7%D8%A1-%D8%B4%D8%A8%D9%83%D8%A9-%D8%B9%D8%B5%D8%A8%D9%8A%D8%A9-%D9%84%D9%84%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D8%A3%D8%B1%D9%82%D8%A7%D9%85-%D8%A7%D9%84%D9%85%D9%83%D8%AA%D9%88%D8%A8%D8%A9-%D8%A8%D8%AE%D8%B7-%D8%A7%D9%84%D9%8A%D8%AF-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%85%D9%83%D8%AA%D8%A8%D8%A9-tensorflow-r1267/" rel="">بناء شبكة عصبية للتعرف على الأرقام المكتوبة بخط اليد باستخدام مكتبة TensorFlow</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1266</guid><pubDate>Sat, 10 Jul 2021 16:00:00 +0000</pubDate></item><item><title>&#x625;&#x639;&#x62F;&#x627;&#x62F; &#x634;&#x628;&#x643;&#x629; &#x639;&#x635;&#x628;&#x64A;&#x629; &#x635;&#x646;&#x639;&#x64A;&#x629; &#x648;&#x62A;&#x62F;&#x631;&#x64A;&#x628;&#x647;&#x627; &#x644;&#x644;&#x62A;&#x639;&#x631;&#x641; &#x639;&#x644;&#x649; &#x627;&#x644;&#x648;&#x62C;&#x648;&#x647;</title><link>https://academy.hsoub.com/programming/artificial-intelligence/%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%B4%D8%A8%D9%83%D8%A9-%D8%B9%D8%B5%D8%A8%D9%8A%D8%A9-%D8%B5%D9%86%D8%B9%D9%8A%D8%A9-%D9%88%D8%AA%D8%AF%D8%B1%D9%8A%D8%A8%D9%87%D8%A7-%D9%84%D9%84%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D9%88%D8%AC%D9%88%D9%87-r1198/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2021_04/60755b032b174_-----.png.95760ef036f9941153449f8b8fbd2435.png" /></p>
<h2 id="-">
	بنية الشبكات العصبية الصنعية
</h2>

<p>
	تتكون الشبكات العصبية الصنعية من عناصر أولية بسيطة من حيث طريقتها في معالجة البيانات تدعى العصبونات، ويمكن تمثيل أي من تلك العصبونات رياضيا -وفق مفاهيم البرمجة غرضية التوجه- على شكل كائن برمجي Object يتضمن كل نسخة (Instance) منه على مصفوفة من أوزان الدخل يساوي حجمها عدد إشارات الدخل الواردة لهذا العصبون والتي قد تتراوح ما بين العشرات والآلاف تبعا لبنية الشبكة العصبية وهيكليتها. إن معالجة العصبون الواحد للإشارات الواردة بسيطة من الناحية الرياضية، حيث يتم ضرب كل إشارة دخل بقيمة الوزن المقابل لها ومن ثم تجمع كافة النواتج لنحصل على مقدار كلي يمثل درجة استثارة العصبون أو شحنته الإجمالية، ومن ثم يرسل هذا الرقم إلى تابع التفعيل، وهو ببساطة علاقة رياضية تحاكي إلى حد ما سلوك العصبونات الحقيقية فيما يخص قانون الكل أو لاشيء مع بعض التصرف لاعتبارات تتعلق بخوارزميات التعليم المستخدمة (إمكانية حساب المشتق الرياضي كما في حالة تابع Sigmoid) أو لاعتبارات براغماتية عملية (سهولة البرمجة وسرعة التنفيذ كما في حالة التابع ReLU) أو حتى لاعتبارات تتعلق بطبيعة البيانات المعالجة (كشيوع استخدام التابع TanH عند التعامل مع بيانات الفئات والأصناف). في نهاية المطاف تستخدم قيمة الاستثارة الإجمالية للعصبون كدخل لتابع التفعيل x هذا، وبتطبيق العلاقة الرياضية الخاصة بتابع التفعيل المحدد للعصبون نحسب قيمة y المقابلة والتي تمثل الآن خرج هذا العصبون.
</p>

<p style="text-align: center;">
	<img alt="neuron.png" class="ipsImage ipsImage_thumbnailed" data-fileid="62773" data-unique="hnb72tirk" style="" src="https://academy.hsoub.com/uploads/monthly_2021_04/neuron.png.283df524d8f218f045f1f2c2576ec77e.png">
</p>

<p>
	تتألف الشبكات العصبية من بضع عشرات أو مئات أو حتى الآلاف من تلك الوحدات البنائية الأساسية والتي تنتظم في معمارية على شكل طبقات، حيث يحدد لكل طبقة عدد العصبونات التي تتضمنها، ونوع تابع التفعيل المستخدم لعصبونات تلك الطبقة (أي أن تابع التفعيل قد يختلف من طبقة إلى أخرى لكنه عادة ما يكون ذاته لجميع عصبونات الطبقة الواحدة)، وطريقة ارتباطها بالطبقة التي تسبقها والتي تليها (هل هو ربط كامل كأن تصل إشارة دخل واردة من كل عصبون موجود في الطبقة السابقة، أم هو جزئي يأخذ دخله من عصبونات الطبقة السابقة المجاورة لموضعه الحيزي كما هو حال الشبكات العصبية الصنعية التي تحاكي الباحات البصرية في الدماغ بغية التعرف على الأنماط في الصور).
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="62804" data-ss1618324792="1" data-ss1618325694="1" href="https://academy.hsoub.com/uploads/monthly_2021_04/6075af2407a7b_nn-network(1).png.978cc054e0fd0071466beae1e86abaa8.png" rel="" data-fileext="png"><img alt="nn-network (1).png" class="ipsImage ipsImage_thumbnailed" data-fileid="62804" data-unique="xpyy8r43k" src="https://academy.hsoub.com/uploads/monthly_2021_04/6075af26124a0_nn-network(1).thumb.png.e9243c27595f9d1a1c1b36590cb9c488.png"></a>
</p>

<h2 id="-">
	الفرق ما بين تدريب واستخدام الشبكات العصبية الصنعية
</h2>

<p>
	إن تدريب الشبكات العصبية الصنعية يقصد به إيجاد القيم الأنسب لكافة أوزان الدخل لعصبونات الشبكة بحيث تكون قادرة على إعطاء الإجابات الصحيحة بأقل هامش خطأ في مخرجاتها وذلك للمدخلات المعروضة عليها، في حين يقع على عاتق المطور فن تحديد المعمارية الملائمة من حيث عدد الطبقات ونوع تابع تفعيل كل منها وعدد عصبوناته وطريقة ربطها مع بعضها البعض.
</p>

<p>
	قد تكون مهمة تدريب الشبكات العصبية الصنعية تحديا حسابيا هائلا تتطلب كما كبيرا من المعالجات الرياضية والتي قد تستغرق زمنا طويلا حتى لو أجريت على حواسيب فائقة، لكن بمجرد الوصول إلى الحل وإيجاد قيم الأوزان الملائمة التي تعطي نتائج مرضية عند معالجتها للبيانات، تصبح مسألة الاستخدام والتطبيق في منتهى البساطة، فكل ما عليك القيام به هو تمرير وحيد عبر طبقات الشبكة يتم خلاله إجراء بضع عمليات ضرب وجمع ومن ثم تطبيق تابع رياضي ما (تابع التفعيل)، وهكذا تمرر القيم من طبقة إلى أخرى وصولا إلى طبقة الخرج النهائية لتظهر من خلالها الإجابة.
</p>

<h2 id="-">
	كيفية حفظ وتصدير الشبكات العصبية الصنعية
</h2>

<p>
	بعد إتمام عملية تدريب الشبكة العصبية الصنعية والرضى عن نتائجها، كل ما نحتاج إليه هو حفظ بنيتها من حيث عدد الطبقات، وعدد العصبونات في كل طبقة، وطريقة ارتباط عصبونات الطبقات المختلفة بعضها ببعض، وكذلك تابع التفعيل المستخدم في كل طبقة، إضافة إلى قيم الأوزان لكل عصبون على حدة. هذا كل مافي الأمر! فإن حصلت على هذه الأرقام مجددا فأنت قادر على إعادة بناء واستخدام تلك الشبكة العصبية الصنعية بشكلها النهائي بعد أن اكتملت عملية تدريبها.
</p>

<p>
	عادة ما تقوم مكتبة TensorFlow بحفظ نموذج الشبكة العصبية الصنعية بكافة وسطائها وقيمها ضمن مجلد خاص بذلك خلال عملية التدريب والذي يمكن قراءته واستعادة بنية شبكته العصبية باستخدام لغة Python (ستجد ضمنه ملف بامتداد ‎*.pb إضافة إلى مجلدين فرعيين هما variables وassets)، لكن هذه الصيغة من الحفظ ملائمة فقط لبيئة التطوير ولا تصلح للتطبيق العملي. عوضا عن ذلك أتاحت Google مجموعة من الصيغ المعيارية المناسبة للتطبيقات المختلفة من أهمها صيغة ‎*.tfjs الموجهة للمبرمجين بلغة JavaScript ذائعة الصيت وواسعة الانتشار في عالم الويب سواء باستخدامها على طرف المستعرض أو حتى على طرف المخدم من خلال تقنية Node.js، كذلك لدينا صيغة ‎*.tflite والمصممة أصلا لتعمل بموارد محدودة من سرعة معالجة ومساحة ذاكرة وذلك بهدف استخدامها على أجهزة الجوال أو إنترنت الأشياء.
</p>

<p>
	لا يقتصر الأمر على ذلك فحسب، لكن حزم الشبكات العصبية الصنعية وإعدادها للاستخدام العملي قد يتضمن بعضا من المقايضة بهدف تصغير حجمها وزيادة سرعة عملها ولو كان ذلك على حساب انخفاض طفيف ومقبول في دقة نتائجها، إحدى تلك الخوارزميات على سبيل المثال تقوم بإزالة الروابط التي تقترب قيم أوزانها من الصفر باعتبارها لا تساهم بشكل كبير في مقدار الاستثارة الكلية للعصبون المرتبطة به، في المقابل نكون قد خفضنا عدد الأوزان التي نحن بحاجة إلى حفظها وكذلك قللنا الزمن الكلي اللازم للحساب كون عدد المدخلات أصبح أقل.
</p>

<h2 id="-face-api">
	مكتبة Face-<abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr>
</h2>

<p>
	كما هو واضح من المقدمة السابقة، فنحن لن نقوم هنا ببناء وتدريب شبكة عصبية صنعية من الصفر، لكننا في المقابل سوف نستعرض كيفية استخدام شبكة عصبية صنعية سبق وأن تم تدريبها وذلك ضمن تطبيقنا الخاص. لهذه الغاية أود تعريفكم بمكتبة face-api.js والتي تم بناؤها لأغراض التعرف على الوجوه وتمييزها ضمن بيئة المتصفح إنطلاقا من مكتبة TensorFlow.js، وهي بذلك تقدم مجموعة من نماذج الشبكات العصبية الصنعية المدربة والجاهزة لطيف متنوع من التطبيقات يمكنك الإطلاع عليها من خلال النقر على الرابط التالي لصفحة التوثيق الخاص بهذه المكتبة:
</p>

<p>
	<a data-ss1618324792="1" data-ss1618325694="1" href="https://justadudewhohacks.github.io/face-api.js/docs/" rel="external nofollow">https://justadudewhohacks.github.io/face-api.js/docs/</a>
</p>

<p>
	إن المثال الذي سوف نبنيه فيما يلي سيقوم باستخدام كاميرا حاسوبك أو جوالك من خلال صفحة ويب ستقوم ببرمجتها بنفسك لكي يأخذ صورة المستخدم ويقدّر منها عمره وجنسه. تخيل لو أننا نتحدث عن صفحة تسجيل مستخدم جديد في تطبيقك المستقبلي، سيكون من اللطيف والذكي في آن معا لو استطاع التطبيق تحديد القيم الافتراضية للعمر والجنس بناء على صورة المستخدم بحيث تكون قريبة إلى الواقع بطريقة تحسن من تجربة المستخدم.
</p>

<p>
	تم بناء نموذج التعرف على العمر والجنس باستخدام شبكة عصبية صنعية متعددة المهام توظف فيها طبقة استخلاص سمات الوجه لتقدير العمر وكذلك لتصنيف الجنس، يبلغ حجم حزمة النموذج بالإجمال قرابة 420kb، وقد تم تدريبها واختبارها باستخدام قواعد بيانات متعددة لصور الوجوه الموسومة بالعمر والجنس الحقيقيين (منها على سبيل المثال موسوعة Wikipedia وقاعدة IMDB للأفلام والممثلين)، وتبلغ دقتها 95% في تحديد الجنس، وهامش خطئها في تحديد العمر يقارب 4 سنوات ونصف.
</p>

<h2 id="-">
	استخدام الشبكات العصبية في نافذة متصفحك
</h2>

<p>
	لنقم بداية بإنشاء مجلد جديد وليكن اسمه face-api للمشروع الذي سنعمل عليه اليوم ضمن مخدم الويب المحلي الذي لديك لتجربة تطبيقات الويب التي تعمل عليها (أي ضمن المجلد C:\xampp\htdocs على سبيل المثال في حال كنت تستخدم مخدم XAMPP)، سنضيف داخل ذلك المجلد الرئيسي مجلدين فرعيين باسم js وكذلك models، ومن ثم نقوم بنسخ الملفات التي نحتاجها من مكتبة Face-<abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr> الأصلية على الشكل التالي:
</p>

<p>
	نُنزِّل الصيغة المصغرة/المضغوطة من المكتبة ذاتها (أي الملف "face-api.min.js") ونسخها إلى داخل المجلد الفرعي js في مشروعنا، يمكن الحصول على ذلك الملف من العنوان التالي: <a data-ss1618324792="1" data-ss1618325694="1" href="https://github.com/justadudewhohacks/face-api.js/tree/master/dist" rel="external nofollow">https://github.com/justadudewhohacks/face-api.js/tree/master/dist</a> نُنَزِّل نماذج الشبكات العصبية الصنعية التي سنستخدمها، حيث يوجد ملفين لكل نموذج شبكة عصبية أحدهما ينتهي إسمه بكلمة "shard1" تحفظ فيه قيم أوزان الشبكة، أما الآخر فهو ملف بصيغة json يصف بنية الشبكة حتى يتم قراءة وتحميل قيم الأوزان السابقة بشكل سليم. في مثالنا الحالي سنحتاج إلى استخدام شبكتين عصبيتين هما "age_gender_model" و "tiny_face_detector_model"، أي أننا بحاجة إلى تنزيل أربع ملفات ومن ثم نسخها إلى داخل مجلد models في مشروعنا. يمكنك الحصول على تلك الملفات من العنوان التالي:
</p>

<p>
	<a data-ss1618324792="1" data-ss1618325694="1" href="https://github.com/justadudewhohacks/face-api.js/tree/master/weights" rel="external nofollow">https://github.com/justadudewhohacks/face-api.js/tree/master/weights</a>
</p>

<p>
	بعد ذلك سنُنشِئ ملفين جديدين أحدهما سندعوه index.html سنضعه في المجلد الرئيسي للمشروع، أما الآخر فسندعوه main.js ونضعه ضمن المجلد الفرعي js المخصص لشيفرات لغة JavaScript البرمجية. سنقوم بداية بتنقيح محتوى صفحة HTML والتي سنجعلها بأبسط شكل ممكن بغرض التركيز على العناصر الأساسية التي نهتم بها:
</p>
<title>
</title>
<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1073_7" style=""><span class="tag">&lt;html&gt;</span><span class="pln">
  </span><span class="tag">&lt;head&gt;</span><span class="pln">
    </span><span class="tag">&lt;title&gt;</span><span class="pln">Face-<abbr title="Application Programming Interface | واجهة برمجية">API</abbr> Example</span><span class="tag">&lt;/title&gt;</span><span class="pln">
  </span><span class="tag">&lt;/head&gt;</span><span class="pln">
  </span><span class="tag">&lt;body&gt;</span><span class="pln">

  </span><span class="tag">&lt;/body&gt;</span><span class="pln">
</span><span class="tag">&lt;/html&gt;</span></pre>

<p>
	ضمن قسم body سنقوم بإضافة عنصر div فيه عنصر video لعرض الفيديو الذي تلتقطه كاميرا حاسوبك ندعوه webcam، ويتم ضبطها لتعمل تلقائيا ضمن النمط الصامت بمجرد تحميل الصفحة:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1073_9" style=""><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"container"</span><span class="tag">&gt;</span><span class="pln">
    </span><span class="tag">&lt;video</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"webcam"</span><span class="pln"> </span><span class="atn">height</span><span class="pun">=</span><span class="atv">"360"</span><span class="pln"> </span><span class="atn">width</span><span class="pun">=</span><span class="atv">"360"</span><span class="pln"> </span><span class="atn">autoplay</span><span class="pln"> </span><span class="atn">muted</span><span class="tag">&gt;&lt;/video&gt;</span><span class="pln">
</span><span class="tag">&lt;/div&gt;</span></pre>

<p>
	ثم نضيف حقل إدخال input مخصص للعمر ندعوه age:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8975_6" style=""><span class="pln">Age (years): </span><span class="tag">&lt;input</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"age"</span><span class="pln"> </span><span class="atn">size</span><span class="pun">=</span><span class="atv">"3"</span><span class="tag">&gt;&lt;br</span><span class="pln"> </span><span class="tag">/&gt;</span></pre>

<p>
	بعد ذلك نضيف مجموعة أزرار اختيار من نوع radio ندعوها gender فيها اختيارين اثنين هما male وfemale:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8975_8" style=""><span class="tag">&lt;input</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"male"</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"radio"</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"gender"</span><span class="pln"> </span><span class="atn">value</span><span class="pun">=</span><span class="atv">"male"</span><span class="tag">&gt;</span><span class="pln">Male</span><span class="tag">&lt;br</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">
</span><span class="tag">&lt;input</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"female"</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"radio"</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"gender"</span><span class="pln"> </span><span class="atn">value</span><span class="pun">=</span><span class="atv">"female"</span><span class="tag">&gt;</span><span class="pln">Female</span><span class="tag">&lt;br</span><span class="pln"> </span><span class="tag">/&gt;</span></pre>

<p>
	أخيرا وبعد اكتمال تحميل وعرض كافة عناصر الصفحة، نقوم بتضمين ملفات جافاسكريبت في نهاية محتويات الصفحة حتى نكون متأكدين من وصولها برمجيا لكافة العناصر ضمن تلك الصفحة:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8975_10" style=""><span class="tag">&lt;script</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"js/face-api.min.js"</span><span class="tag">&gt;&lt;/script&gt;</span><span class="pln">
</span><span class="tag">&lt;script</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"js/main.js"</span><span class="tag">&gt;&lt;/script&gt;</span></pre>

<p>
	<strong>ملاحظة هامة</strong>: بسبب إعدادات الأمان فإن معظم متصفحات الويب تعرض رسالة للمستخدم تبيّن رغبة الصفحة في الوصول إلى الكاميرا وتطلب الإذن للسماح لها بذلك.
</p>

<p>
	هذا كل ما هو مطلوب فعليا ضمن صفحة HTML الخاصة بهذا المثال، أما الآن فعلينا الانتقال إلى لكتابة شيفرات لغة جافاسكريبت التي ستقوم بتحميل نموذج الشبكة العصبية الصنعية، وتمرير صور الكاميرا إليه، ومن ثم قراءة الخرج الناتج عن الشبكة العصبية الصنعية وعرضه ضمن عناصر الإدخال المقابلة في صفحة HTML السابقة.
</p>

<p>
	لذلك سنبدأ بكتابة محتوى الملف main.js من الشيفرات البرمجية مع شرح مختصر لكل قسم منها، فالسطر الأول يقوم بتعيين اسم الثابت video للإشارة إلى العنصر المدعوة webcam ضمن صفحة HTML السابقة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8975_12" style=""><span class="kwd">const</span><span class="pln"> video </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">getElementById</span><span class="pun">(</span><span class="str">"webcam"</span><span class="pun">);</span></pre>

<p>
	بعد ذلك نقوم بتحميل نموذجي الشبكتين العصبيتين الخاصتين بالتعرف على الوجوه ضمن الصورة وتحديد الجنس وتقدير العمر من خلال سمات تلك الوجوه وذلك باستخدام آلية الوعود Promise.all، ومن بعد إتمام ذلك يتم استدعاء التابع startVideo الذي سنقوم بتعريفه لاحقا:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8975_14" style=""><span class="typ">Promise</span><span class="pun">.</span><span class="pln">all</span><span class="pun">([</span><span class="pln">
  faceapi</span><span class="pun">.</span><span class="pln">nets</span><span class="pun">.</span><span class="pln">tinyFaceDetector</span><span class="pun">.</span><span class="pln">loadFromUri</span><span class="pun">(</span><span class="str">"models"</span><span class="pun">),</span><span class="pln">
  faceapi</span><span class="pun">.</span><span class="pln">nets</span><span class="pun">.</span><span class="pln">ageGenderNet</span><span class="pun">.</span><span class="pln">loadFromUri</span><span class="pun">(</span><span class="str">"models"</span><span class="pun">)</span><span class="pln">
</span><span class="pun">]).</span><span class="pln">then</span><span class="pun">(</span><span class="pln">startVideo</span><span class="pun">);</span></pre>

<p>
	يقوم هذا التابع بقراءة دفق إشارة الفيديو من الكاميرا وعرضها ضمن الكائن video، فإن حدث خطأ يتم كتابة رسالة الخطأ ضمن console.error في المستعرض:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8975_16" style=""><span class="kwd">function</span><span class="pln"> startVideo</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  navigator</span><span class="pun">.</span><span class="pln">getUserMedia</span><span class="pun">(</span><span class="pln">
    </span><span class="pun">{</span><span class="pln"> video</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{}</span><span class="pln"> </span><span class="pun">},</span><span class="pln">
    stream </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">(</span><span class="pln">video</span><span class="pun">.</span><span class="pln">srcObject </span><span class="pun">=</span><span class="pln"> stream</span><span class="pun">),</span><span class="pln">
    err </span><span class="pun">=&gt;</span><span class="pln"> console</span><span class="pun">.</span><span class="pln">error</span><span class="pun">(</span><span class="pln">err</span><span class="pun">)</span><span class="pln">
  </span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	ومن ثم نضيف حدث يقوم بالإنصات لما يتم عرضه ضمن عنصر video بحيث يستدعي بشكل غير متزامن async (أي دون الحاجة لانتظار الإجابة حتى يتابع عرض الفيديو) وذلك كل ثانية (حيث تم ضبط الفترة الزمنية setInterval لتكون قيمتها 1000 ميلي ثانية). يقوم هذا الاستدعاء الدوري المتكرر بتعيين قيمة الكائن detection بواسطة مكتبة faceapi حيث تحدد جميع الوجوه الموجودة ضمن كائن video بالاستعانة بنموذج TinyFaceDetector مستخدمين الإعدادات الافتراضية، ومن ثم يمرر الناتج (أي الوجوه التي تم التعرف عليها في الصورة)، إلى الشبكة العصبية الأخرى التي تتعرف على العمر والجنس:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8975_18" style=""><span class="pln">video</span><span class="pun">.</span><span class="pln">addEventListener</span><span class="pun">(</span><span class="str">"playing"</span><span class="pun">,</span><span class="pln"> </span><span class="pun">()</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
   setInterval</span><span class="pun">(</span><span class="pln">async </span><span class="pun">()</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">const</span><span class="pln"> detections </span><span class="pun">=</span><span class="pln"> await faceapi
      </span><span class="pun">.</span><span class="pln">detectAllFaces</span><span class="pun">(</span><span class="pln">video</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> faceapi</span><span class="pun">.</span><span class="typ">TinyFaceDetectorOptions</span><span class="pun">())</span><span class="pln">
      </span><span class="pun">.</span><span class="pln">withAgeAndGender</span><span class="pun">();</span></pre>

<p>
	إن العبارة الشرطية التالية تتأكد إن كان الكائن detections موجودا أصلا (تذكر أن تعيين قيمة هذا الكائن تتم من خلال استدعاء غير متزامن وبالتالي يمكن أن تكون القيمة غير موجودة في البداية ريثما تصل إجابة ذلك الاستدعاء). ليس هذا فحسب، بل يجب أن يتضمن على الأقل وجه واحد على الأقل. فإن تحقق هذين الشرطين يتم قراءة الجنس المتوقع للوجه الأول detections[0].gender وتعيينه لعنصر الإدخال المقابل له، وكذلك قراءة العمر المتوقع لذات الوجه الأول detections[0].age وتقريبه إلى أقرب عدد صحيح باستخدام التابع Math.round ومن ثم إسناده كقيمة لعنصر الإدخال المدعو age ضمن صفحة HTML السابقة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8975_20" style=""><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">detections </span><span class="pun">&amp;&amp;</span><span class="pln"> </span><span class="typ">Object</span><span class="pun">.</span><span class="pln">keys</span><span class="pun">(</span><span class="pln">detections</span><span class="pun">).</span><span class="pln">length </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      document</span><span class="pun">.</span><span class="pln">getElementById</span><span class="pun">(</span><span class="pln">detections</span><span class="pun">[</span><span class="lit">0</span><span class="pun">].</span><span class="pln">gender</span><span class="pun">).</span><span class="pln">checked </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln">
      document</span><span class="pun">.</span><span class="pln">getElementById</span><span class="pun">(</span><span class="str">"age"</span><span class="pun">).</span><span class="pln">value </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Math</span><span class="pun">.</span><span class="pln">round</span><span class="pun">(</span><span class="pln">detections</span><span class="pun">[</span><span class="lit">0</span><span class="pun">].</span><span class="pln">age</span><span class="pun">);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
  </span><span class="pun">},</span><span class="pln"> </span><span class="lit">1000</span><span class="pun">);</span><span class="pln">
</span><span class="pun">});</span></pre>

<p>
	هذا كل شيء! تستطيع الآن تجربة هذا التطبيق البسيط من خلال عرض الصفحة على نافذة المستعرض مستخدمين عنوانها على مخدم الويب المحلي وليكن على سبيل المثال: <a data-ss1618324792="1" data-ss1618325694="1" href="http://localhost/face-api" rel="external nofollow">http://localhost/face-api</a>
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="62778" data-ss1618324792="1" data-ss1618325694="1" href="https://academy.hsoub.com/uploads/monthly_2021_04/screenshot.png.798710b648fe9a187253390df3d59399.png" rel="" data-fileext="png"><img alt="screenshot.png" class="ipsImage ipsImage_thumbnailed" data-fileid="62778" data-unique="j2u64ucdv" style="" src="https://academy.hsoub.com/uploads/monthly_2021_04/screenshot.thumb.png.2a07834228b45916d0c47fcc87299feb.png"></a>
</p>

<h2 id="-">
	نقاط تستحق التأمل
</h2>

<p>
	من منا لا تغريه كم الإسقاطات التي تطرحها تقنية الشبكات العصبية الصنعية على مفهوم البرمجة ككل؟ إنها بذور جيل جديد مختلف جذريا عن كل ما سبق وأن اعتدنا عليه، فرغم أنها تعتمد على وحدات بسيطة في صميمها هي العصبونات، والتي قمنا بوصف آلية عملها بطريقة خوارزمية محددة تماما وواضحة، إلا أننا مع نمو شبكاتنا في الحجم والتعقيد استبدلنا الثقة بالأمل، والتحليل بالتجريب.
</p>

<p>
	لنأخذ على سبيل المثال نموذج اللغة العربية، فحتى نستطيع تشكيل أي جملة نستخدم علم النحو والإعراب الذي تعلمناه في مدارسنا، ومن خلال قواعده نحدد بناء الجملة وعناصرها كالفعل والفاعل أو المبتدأ والخبر وسواها من القواعد التي تساعدنا على ضبط أواخر الكلمات. هذه هي تماما الطريقة التي نبرمج بها حواسيبنا حاليا (منذ أيام تشارلز بابيج وحاسوبه الميكانيكي قبل مئتي عام)، فنحن نضع القواعد الصارمة لتدفق البيانات ونترجمها إلى عبارات شرطية وحلقات وسواها من بنى التحكم في عدد منتهي من الخطوات ندعوها بالخوارزمية.
</p>

<p>
	لكن لحظة، هل هذه هي الطريقة الصحيحة فعلا التي تجري بها الأمور؟ هل هذا ما نفعله حقيقة عندما يلتبس علينا تشكيل كلمة ما في نص نقرأه أو جملة نتحدثها؟ أغلب الظن ستكون إجابتك هي النفي! فمعظمنا لا يعرب الجملة في رأسه ليضبط أواخر الكلمات، بل نجرب الاحتمالات المختلفة ونرى أيها يملك الوقع الأكثر تجانسا وانسجاما في نفسنا (على سبيل المثال: هل أباك/أبوك/أبيك موجود؟). إنها ببساطة ما ندعوه بالسليقة اللغوية، وهي التي تفسر قدرة الطفل الصغير على التكلم بلغة صحيحة حتى قبل معرفته بوجود علم النحو والإعراب أصلا، فهو يتعلم مما يسمع وينسج على منواله، فكلما كانت الأمثلة كثيرة وصحيحة ازداد اتقانه للغة (ولهذا السبب كان العرب يرسلون أبنائهم إلى البادية لسلامة اللغة من اللحن الأعجمي هناك).
</p>

<p>
	إن التعلم من خلال الأمثلة هو ما تقوم به تماما الشبكات العصبية الصنعية التي نقوم بتطويرها، إنها تقوم ببناء خبرتها وسليقتها وفراستها الخاصة، في نهاية المطاف يمتلك كل من المبتدئ والخبير القواعد ذاتها، لكن عين الخبير رأت الكثير من الأمثلة التي صقلت بها خبرتها، حتى وصلت من التعقيد إلى درجة قد يصعب معها التفسير رغم قوة الإحساس ووضوحه في ذهنه. وهكذا ينتقل دور المبرمج رويدا رويدا من وضع القواعد وبنى التحكم لبرمجياته إلى ما بات يدعى اليوم بعلم البيانات وهندسة عملية استخلاص المزايا والخصائص المؤثرة في عملية التعلم من تلك البيانات، حيث أن دقة وجودة النموذج الناتج تعتمد بشكل حاسم على تكامل أمثلة التعليم وشمولها وصحتها، وأصبح امتلاك مثل هكذا مكانز رقمية موصّفة بشكل دقيق ومبنية بطريقة هيكلية سهلة الولوج والاستعلام يعادل قطع ما يتجاوز نصف الطريق إلى الوصول لعالم الذكاء الصنعي التطبيقي وقطف ثماره.
</p>

<div class="banner-container ipsBox ipsPadding">
	<div class="inner-banner-container">
		<p class="banner-heading">
			دورة الذكاء الاصطناعي
		</p>

		<p class="banner-subtitle">
			احترف برمجة الذكاء الاصطناعي AI وتحليل البيانات وتعلم كافة المعلومات التي تحتاجها لبناء نماذج ذكاء اصطناعي متخصصة.
		</p>

		<div>
			<a class="ipsButton ipsButton_large ipsButton_primary ipsButton_important" href="https://academy.hsoub.com/learn/artificial-intelligence" rel="">اشترك الآن</a>
		</div>
	</div>

	<div class="banner-img">
		<a href="https://academy.hsoub.com/learn/artificial-intelligence" rel=""><img alt="دورة الذكاء الاصطناعي AI" src="https://academy.hsoub.com/learn/assets/images/courses/artificial-intelligence.png"></a>
	</div>
</div>

<h2 id="-">
	مراجع للاستزادة
</h2>

<ol>
	<li>
		<a data-ss1618324792="1" data-ss1618325694="1" href="https://www.tensorflow.org/js" rel="external nofollow">مكتبة TensorFlow</a>
	</li>
	<li>
		<a data-ss1618324792="1" data-ss1618325694="1" href="https://github.com/justadudewhohacks/face-api.js/#models-age-and-gender-recognition" rel="external nofollow">مكتبة face-api.js</a>
	</li>
	<li>
		<a data-ss1618324792="1" data-ss1618325694="1" href="https://www.tensorflow.org/lite/performance/model_optimization" rel="external nofollow">Model optimization</a>
	</li>
</ol>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال السابق: <a data-ss1618324792="1" data-ss1618325694="1" href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B5%D9%86%D9%8A%D9%81-%D8%A7%D9%84%D8%B5%D9%88%D8%B1-%D9%88%D8%A7%D9%84%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D9%88%D8%AC%D9%87-%D9%81%D9%8A-%D9%85%D8%AC%D8%A7%D9%84-%D8%A7%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A-r1197/" rel="">تصنيف الصور والتعرف على الوجه في مجال الذكاء الاصطناعي</a>
	</li>
	<li>
		<a data-ss1618324792="1" data-ss1618325694="1" href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D9%84%D9%85%D9%81%D8%A7%D9%87%D9%8A%D9%85-%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A9-%D9%84%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9-r1009/" rel="">المفاهيم الأساسية لتعلم الآلة</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1198</guid><pubDate>Sun, 18 Apr 2021 08:56:00 +0000</pubDate></item><item><title>&#x62A;&#x635;&#x646;&#x64A;&#x641; &#x627;&#x644;&#x635;&#x648;&#x631; &#x648;&#x627;&#x644;&#x62A;&#x639;&#x631;&#x641; &#x639;&#x644;&#x649; &#x627;&#x644;&#x648;&#x62C;&#x647; &#x641;&#x64A; &#x645;&#x62C;&#x627;&#x644; &#x627;&#x644;&#x630;&#x643;&#x627;&#x621; &#x627;&#x644;&#x627;&#x635;&#x637;&#x646;&#x627;&#x639;&#x64A;</title><link>https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B5%D9%86%D9%8A%D9%81-%D8%A7%D9%84%D8%B5%D9%88%D8%B1-%D9%88%D8%A7%D9%84%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D9%88%D8%AC%D9%87-%D9%81%D9%8A-%D9%85%D8%AC%D8%A7%D9%84-%D8%A7%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A-r1197/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2021_04/60754f9a5d807_-----AI-ML(1).png.9227ffba6d1b4c43cb84450d5abda59c.png" /></p>
<h2 id="-ai-ml">
	الذكاء الصنعي وخوارزميات تعلم الآلة AI/ML
</h2>

<p>
	تتفق جميع التقنيات والخوارزميات التي تندرج تحت مسمى الذكاء الصنعي Artificial Intelligence وتعلم الآلة Machine Learning باختلاف أطيافها على البدء بتحليل البيانات الخام والبحث فيها (بطرق خوارزمية ممنهجة) لاستكشاف ما تحتويه من أنماط وعلاقات في داخلها وبين كياناتها. إن معرفة مثل تلك الأنماط والعلاقات ستساعدنا على بناء نماذج قادرة على استقراء الجوهر العام المشترك الذي يجمع ويصنف تلك الكتل من البيانات على الرغم من الاختلافات في التفاصيل الهامشية والتي قد تكون كبيرة ظاهريا ومربكة في عين من لا يتمتع بالخبرة في مجال الدراسة.
</p>

<p>
	لقد أثبتت مثل هذه النظم فعاليتها في حوسبة العديد من المهام التي كان يعتقد حتى وقت قريب أنها عصية على عالم البرمجيات، ساعد على ذلك الطفرة التي شهدتها عتاديات الحواسيب في العقد الأخير والتقدم الهائل في إمكانيات الحوسبة المتوازية لوحدات المعالجة الرسومية GPU، وكذلك توافر حلول الحوسبة السحابية لشريحة أكبر من فرق التطوير البرمجية التي كان يصعب عليها في الماضي الحصول على حواسيب فائقة بسهولة.
</p>

<p>
	إننا نشهد في الفترة الحالية انتقالا وتحولا جذريا في مفاهيم علم البرمجة مقارنة بما سبق وبما تعلمناه أو استخدمناه خلال القرن الماضي (كالبرمجة الوظيفية ومخططات سير العمل، أو حتى البرمجة الغرضية التوجه بكائناتها وطرائقها)، فالمبرمج هو من كان يضع منطق العمل وخوارزميته ليحدد أسلوب معالجة المدخلات وتوليد المخرجات، وقد امتازت فترة ثمانينيات وتسعينيات القرن الماضي بوفرة القدرة الحاسوبية مقارنة بكمية البيانات المتوافرة للمعالجة أصلا، لكن ما نشهده الآن في القرن الحادي والعشرين قد قلب هذه المعادلة رأسا على عقب، فقد أصبح لدينا فائض كبير من البيانات التي تجمع من كل حدب وصوب على مدار الساعة بدءا من جوالاتنا (التي ما عادت وسيلة للاتصال فقط) وصولا إلى الأقمار الاصطناعية في مداراتها حول الأرض.
</p>

<p>
	إن هذا المستوى العالي من الأتمتة في حياتنا ومجتمعاتنا نتج عنه كم هائل من البيانات التي تجاوزت بمراحل القدرة على تحليلها واستخلاص المعلومات منها بالطرق التقليدية، وهو ما أعاد فتح الأبواب مجددا لتقنيات الذكاء الصنعي التي كان لها مجد سابق منتصف القرن الماضي لكنه زال بعد أن عجزت القدرات العتادية في ذلك الحين عن مواكبة شطحات المتنورين من رواد هذا الحقل من العلوم، لكننا اليوم وبتضافر جهود الباحثين في مجالات شتى مثل <a href="https://academy.hsoub.com/programming/general/%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA/" rel="">علم البيانات</a> والإحصاء والحواسيب بلا شك، أصبحنا قادرين على تنفيذ ما كانوا يتحدثون عنه ضمن طيف واسع من التطبيقات ربما بات يتجاوز أقصى طموحاتهم.
</p>

<h2 id="-neural-networks">
	الشبكات العصبية Neural Networks
</h2>

<p>
	في جزء من لوحة رافائييل الجصيّة "مدرسة أثينا" تم رسم أفلاطون وأرسطو بشكل يعبّر عن نظريّة كل منهما في المعرفة، فأرسطو يومئ نحو الأرض فيما يشير أفلاطون بإصبعه نحو السماء، حيث كان ينظر أرسطو إلى الطبيعة بحثا عن إجابات في حين أن أفلاطون يبحث عن المثالي. وها نحن ننتقل في عالم البرمجة من فلسفة أفلاطون التي كنا نتّبعها في أدوات بناء تطبيقاتنا من لغات برمجة وما تحويه من متغيرات وتوابع وعبارات شرطية وحلقات وسواها، إلى فلسفة أرسطو حيث نبحث في كيفية عمل أدمغتنا ونحاول محاكاتها في بنيتها وطريقة عملها، وهكذا تماما ولد مجال الشبكات العصبية ضمن علوم الذكاء الصنعي.
</p>

<p style="text-align: center;">
	<img alt="The_School_of_Athens_small.png" class="ipsImage ipsImage_thumbnailed" data-fileid="62767" data-unique="ksrma1g7n" style="" src="https://academy.hsoub.com/uploads/monthly_2021_04/The_School_of_Athens_small.png.72022a2b681f1be78b38ce2b31801c80.png">
</p>

<p>
	حيث ابتدأت المحاكاة على مستوى الخلية العصبية (العصبون)، فالعصبونات هي خلايا تتألف من جسم مركزي يتضمن نواة الخلية ويمتد منه استطالة وحيدة تكوّن ليف عصبي طويل يقوم مقام السلك الناقل للإشارة الخارجة من الخلية عند نهايته تفرعات كثيرة تنتهي بعقد مشبكية صغيرة، أما في الطرف الآخر من جسم الخلية العصبية فتبرز تفرّعات تخرج في كافة الاتجاهات والتي عن طريقها ترد إلى جسم الخلية البيانات الداخلة، ولابد للإشارات لكي تمر من عصبون إلى آخر أن تجتاز الفجوة الضيقة ما بين عقدة المشبك والجسم أو التفرّع للعصبون التالي.
</p>

<p>
	<img alt="[image2.png].png" class="ipsImage ipsImage_thumbnailed" data-fileid="62768" data-unique="vjxk188mt" src="https://academy.hsoub.com/uploads/monthly_2021_04/607552989e744_image2.png.png.f8b7804ea7bf2b7df4b64fd46662d6ef.png">
</p>

<p>
	تتلقى الخلية العصبية عدة تنبيهات من الخلايا المجاورة تؤدي إلى شحنها، فإذا وصلت تلك الشحنة إلى عتبة معينة ينبثق كمون كهربائي عند قاعدة المحور وينتشر دفعة واحدة على طوله. لا تستجيب العصبونات لمختلف التنبيهات بشكل متشابه، فلكل منبه درجة أهمية تزيد أو تنقص، كما أن خرج العصبون لا يمتاز بالتدرج، فإما أن تكون هناك نبضة عصبية تنتشر عبر المحور إلى الخلايا المجاورة أو لن يكون هنالك شيء على الإطلاق. طبعا هذا الوصف لبنية العصبون وطريقة عمله فيه تبسيط شديد لحقيقة الأمر، لكن هذا المستوى من الشرح يفي بالغرض.
</p>

<p>
	على الرغم من أننا عندما نحاكي عمل العصبون (بفرض أننا نعلم طريقة عمله تماما) لن نحصل على عصبون حقيقي، لكننا سنحصل على معالجة حقيقية للمعلومات كما لو كان العصبون هو من قام بها، وهذا هو بيت القصيد. إن التمثيل الرياضي للعصبون يفترض أن لدينا n إشارة دخل سنرمز إليها بالمقادير X1, X2, …, Xn يرتبط كل منها بوزن أو تثقيل للتعبير عن دور المشابك العصبية كون العصبونات لا تستجيب بشكل متشابه لمختلف التنبيهات كما اتفقنا سابقا. سنرمز إلى تلك الأوزان بالمقادير W1, W2, …, Wn والتي قد تكون قيما موجبة أو حتى سالبة تكبر أو تصغر بحسب طبيعة ودور إشارة الدخل المرتبطة بها سواء كانت محفّزة أم مثبّطة وإلى أي قدر هي كذلك. وهكذا يمكننا التعبير عن مجمل الدخل الآتي إلى العصبون المفرد بالشكل الرياضي التالي:
</p>

<p style="text-align: center;">
	<img alt="معادلة مجمل دخل العصبون.png" class="ipsImage ipsImage_thumbnailed" data-fileid="62803" data-unique="hg6z5er80" src="https://academy.hsoub.com/uploads/monthly_2021_04/6075ac79941fd_.png.ba26132c4e984802e491e6fc9f5ff66f.png">
</p>

<p>
	من جهة أخرى، لتمثيل إشارة خرج العصبون نحتاج إلى دالة رياضية تستطيع توصيف عمل قانون الكل أو لا شيء تبعا لعتبة معيّنة، وهناك عدّة خيارات رياضية شائعة قد يتم تفضيل إحداها على الأخرى بحسب طبيعة البيانات التي نتعامل معها نذكر منها على سبيل المثال لا الحصر: Sigmoid (للقيم الثنائية 0/1 أو نعم/لا أو حتى ذكر/أنثى)، TanH (للفئات أو التصنيفات المتقطعة مثل الأعراق: عربي، أوروبي، أفريقي، آسيوي، هندي، الخ.)، وكذلك ReLU (للقيم المتصلة كالعمر مثلا). يوضح الشكل التالي الصيغة الرياضية والتمثيل البياني الذي يظهر العلاقة فيما بين الدخل والخرج لكل منها:
</p>

<p style="text-align: center;">
	<img alt="ReLU.png" class="ipsImage ipsImage_thumbnailed" data-fileid="62770" data-unique="j03o06q7e" style="" src="https://academy.hsoub.com/uploads/monthly_2021_04/ReLU.png.80d7915a5e0d1e3e369407e7c509bef3.png"><img alt="TanH.png" class="ipsImage ipsImage_thumbnailed" data-fileid="62771" data-unique="y4ke94y3x" style="" src="https://academy.hsoub.com/uploads/monthly_2021_04/TanH.png.c6d2bb040dba105f9251b81065fec5cc.png"><img alt="Sigmoid.png" class="ipsImage ipsImage_thumbnailed" data-fileid="62769" data-unique="msa7c5fkv" style="" src="https://academy.hsoub.com/uploads/monthly_2021_04/Sigmoid.png.9508053f7052415ba628d4d1dd564e47.png">
</p>

<p>
	بعد أن قمنا بتوصيف العصبون بشكل رياضي مبسّط، علينا الانتقال للحديث عن بنية الشبكات التي تنتظم بها تلك العصبونات وطرق ارتباطها بعضها ببعض، سنتناول بالشرح شكلا واحدا من أشكال بناء الشبكات العصبية، لكن ذلك لا يعني عدم وجود معماريات أخرى لبناء تلك الشبكات. سنفترض أن العصبونات تنتظم في طبقات ولكل طبقة عدد من العصبونات بحيث أن خرج أي عصبون من هذه الطبقة يتم إيصاله إلى كل عصبونات الطبقة التالية.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="62772" data-ss1618324191="1" data-ss1618326424="1" data-ss1625936573="1" href="https://academy.hsoub.com/uploads/monthly_2021_04/layers.png.d2472af96f30cca533994da19d845bd3.png" rel=""><img alt="layers.png" class="ipsImage ipsImage_thumbnailed" data-fileid="62772" data-unique="g1uwub4gy" style="" src="https://academy.hsoub.com/uploads/monthly_2021_04/layers.thumb.png.67e133d1dcb3f060d671e21261bc8f53.png"></a>
</p>

<p>
	يمكن تمييز الطبقة الأولى على أنـها طبقة الإدخال والتي تتلقى بياناتها من الوسط الخارجي للشبكة العصبية، كذلك نعرّف طبقة الإخراج على أنـها الطبقة الأخيرة والتي ترسل ناتج معالجة البيانات ثانية إلى الوسط الخارجي، في حين يسمّى كل ما عدى ذلك من طبقات بين هاتين الطبقتين بالطبقات الخفية. كما نلاحظ فإن عدد العصبونات في كل من طبقتي الإدخال والإخراج محدد بحسب طبيعة الوظيفة المناطة بالشبكة العصبية (مثلا عدد العنصورات Pixels الإجمالي في الصورة لكل قناة لونية RGB في الدخل، وعدد الفئات المراد تصنيفها في الخرج)، أمّا عدد الطبقات الخفية وعدد العصبونات في كل منها فلا توجد قواعد ضابطة وواضحة لذلك.
</p>

<h2 id="-tensorflow-google">
	مكتبة TensorFlow من Google
</h2>

<p>
	مكتبة TensorFlow هي منصة متكاملة لتدريب وبناء تطبيقات <a data-ss1618324191="1" data-ss1618326424="1" data-ss1625936573="1" href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A-%D8%A3%D9%87%D9%85-%D8%A7%D9%84%D8%A5%D9%86%D8%AC%D8%A7%D8%B2%D8%A7%D8%AA-%D9%88%D8%A7%D9%84%D8%A7%D8%AE%D8%AA%D8%B1%D8%A7%D8%B9%D8%A7%D8%AA-%D9%88%D9%83%D9%8A%D9%81-%D8%A3%D8%AB%D8%B1%D8%AA-%D9%81%D9%8A-%D8%AD%D9%8A%D8%A7%D8%AA%D9%86%D8%A7-%D8%A7%D9%84%D9%8A%D9%88%D9%85%D9%8A%D8%A9-r975/" rel="">الذكاء الصنعي وتعلم الآلة</a> بالاعتماد على تقنية الشبكات العصبية طورتها شركة Google باستخدام لغة <a data-ss1618324191="1" data-ss1618326424="1" data-ss1625936573="1" href="https://academy.hsoub.com/programming/python/" rel="">Python</a> ونشرتها تحت ترخيص البرمجيات الحرة والمفتوحة المصدر، وهي تعد في الوقت الراهن واحدة من أكثر المكتبات شهرة واستخداما في هذا المجال (رغم أنها ليست الوحيدة قطعا)، وذلك نظرا لغزارة وتنوع المصادر والأدوات المتوافرة لها والتي تتيح للباحثين القدرة على بناء واستخدام تطبيقات الذكاء الصنعي في أعمالهم. للمزيد حول TensorFlow يمكنكم الإطلاع على الموقع الرسمي لها على الرابط التالي: <a data-ss1618324191="1" data-ss1618326424="1" data-ss1625936573="1" href="https://www.tensorflow.org" rel="external nofollow">https://www.tensorflow.org</a>
</p>
<div class="banner-container ipsBox ipsPadding">
    <div class="inner-banner-container">
            <p class="banner-heading">
                    دورة الذكاء الاصطناعي
            </p>



            <p class="banner-subtitle">
        احترف برمجة الذكاء الاصطناعي AI وتحليل البيانات وتعلم كافة المعلومات التي تحتاجها لبناء نماذج ذكاء اصطناعي متخصصة.
            </p>

            <div>
                    <a class="ipsButton ipsButton_large ipsButton_primary ipsButton_important" href="https://academy.hsoub.com/learn/artificial-intelligence" rel="">اشترك الآن</a>
            </div>
    </div>
<div class="banner-img"> <a href="https://academy.hsoub.com/learn/artificial-intelligence" rel=""><img alt="دورة الذكاء الاصطناعي AI" src="https://academy.hsoub.com/learn/assets/images/courses/artificial-intelligence.png"></a></div>
</div>
<h2 id="-tensorflow-hub-">
	مكنز TensorFlow Hub للنماذج
</h2>

<p>
	إحدى أهم التحديات في عالم الذكاء الصنعي بشكل خاص، وعلوم البيانات بشكل عام، هي القدرة على إعادة استخدام ما سبق وما توصل إليه فريق تطوير آخر سابقًا، لذا قدمت Google هذا المكنز لوضع طريقة معيارية في مشاركة نماذج الشبكات العصبية بحيث تتضمن كافة المعلومات المطلوبة لإعادة استخدامها سواء كانت بنية الشبكة العصبية ذاتها (من حيث عدد الطبقات، ونوعها، وعدد العصبونات في كل منها، ونوع الروابط فيما بينها، الخ.)، إضافة إلى قيم الوسطاء والأوزان المختلفة في تلك الشبكة العصبية بعد إتمام عملية تدريبها. يمكن أخذ هذه النماذج وإعادة استخدامها في مهام مختلفة أو حتى إعادة تدريبها بسهولة مستخدمين تقنية تدعى نقل التعلم والتي سنتحدث عنها لاحقا في هذا الدرس. لمزيد من المعلومات حول هذا المكنز يمكنكم زيارة الموقع الرسمي له على الرابط التالي: <a data-ss1618324191="1" data-ss1618326424="1" data-ss1625936573="1" href="https://www.tensorflow.org/hub" rel="external nofollow">https://www.tensorflow.org/hub</a>.
</p>

<h2 id="-mobilenet-v2-">
	نموذج MobileNet V2 للرؤية الحاسوبية
</h2>

<p>
	تم تصميم هذه العائلة من نماذج الشبكات العصبية المخصصة لمهام الرؤية الحاسوبية عامة الأغراض مثل التصنيف وتحديد الأجزاء والعناصر في الصورة وسواها من الوظائف مع مراعاة المصادر المحدودة التي قد تكون متوافرة على الأجهزة المحمولة. إن القدرة على تشغيل تطبيقات التعلم العميق على أجهزة الجوال الشخصية ستحسن من تجربة المستخدم نظرا لأنها ستكون متاحة في أي زمان ومكان بغض النظر عن الحاجة إلى الاتصال بمصادر خارجية على الإنترنت، وهو ما سيترافق مع فوائد إضافية لجهة الأمان والخصوصية والاقتصاد في استهلاك الطاقة. لمزيد من المعلومات يمكنك الإطلاع على الرابط المدرج ضمن قسم المراجع1.
</p>

<h2 id="-transfer-learning">
	تقنية نقل التعلم Transfer Learning
</h2>

<p>
	إن النماذج الحديثة للتعرف على الصور تحتوي على الملايين من الوسطاء (من أوزان للروابط ما بين الآلاف من العصبونات المرصوفة في العشرات من الطبقات الخفية) والتي يتطلب تدريبها من الصفر كما كبيرا من بيانات التدريب من جهة، والكثير من الطاقة الحاسوبية من جهة أخرى (تقدّر بالمئات من ساعات الحساب على وحدات المعالجة الرسومية GPU أو حتى أكثر بكثير). إن تقنية نقل التعلم تعتمد على حيلة ذكية لاختصار كم المصادر الكبير الذي نحتاجه لتطوير نموذج رؤية حاسوبية جديد تخصص مهاراته في التعرف على نمط مختلف من الصور (مثلا صور الأشعة السينية لتشخيص وجود أورام سرطانية محتملة عوض التعرف على الأنواع المختلفة من الأزهار البرية).
</p>

<p>
	تقوم الفكرة على استبدال الطبقة الأخيرة فقط من شبكة عصبية سبق وأن تم تدريبها بشكل جيد على تصنيف الصور ولو لغايات مختلفة، مستفيدين بذلك من كم المهارات التي اكتسبتها بنية الطبقات الخفية في ذلك النموذج، ابتداء من التعرف على أنماط النسج والأشكال وترابط الأجزاء وعلاقات الألوان وغيرها مما هو مشترك بالعموم بين كافة نظم الرؤية الحاسوبية، والتي يمكن إعادة استخدامها ومشاركتها بين النماذج المختلفة. وحدها الطبقة الأخيرة فقط الخاصة بالأصناف تتغير بتغير الغاية والهدف من النموذج الذي يجري تطويره وتخصيصه، لذا هي وحدها التي سيتم تدريبها فعليا عند استخدام تقنية نقل التعلم هذه. لمزيد من المعلومات حول هذه التقنية في التعليم يمكنكم الإطلاع على رابط ورقة البحث العلمي المدرجة ضمن قسم المراجع أدناه2.
</p>

<h2 id="-">
	تجهيز بيئة العمل
</h2>

<p>
	سنستخدم منصة Docker المخصصة لتطوير ونشر وإدارة التطبيقات باستخدام فكرة الحاويات وذلك لتسهيل بناء بيئة العمل لدينا من أجل تنفيذ التطبيق العملي في هذه الجلسة، حيث أن الحاويات هي عبارة عن حزم تنفيذية خفيفة وقائمة بذاتها لتطبيق ما، تحوي كل المكتبات وملفات الإمداد والاعتماديات والأجزاء الأخرى الضرورية ليعمل التطبيق ضمن بيئة معزولة، هذا عدى عن أنها خفيفة لأنها لا تتطلب حملا إضافيا كالأجهزة الافتراضية كونها تعمل ضمن نواة النظام المضيف مباشرة دون الحاجة إلى نظام ضيف، وبذلك نزيل عن كاهلنا في هذه المرحلة أي تعقيدات تختص بالتنصيب والربط والإعداد لمختلف مكونات بيئة التطوير الخاصة بمكتبة TensorFlow وهي مهمة ليست باليسيرة على المبتدئ، لذا عليك القيام بتثبيت Docker على حاسوبك الشخصي من الموقع الرسمي <a data-ss1618324191="1" data-ss1618326424="1" data-ss1625936573="1" href="https://www.docker.com/" rel="external nofollow">https://www.docker.com/</a> قبل الانتقال إلى الخطوة التالية. اطلع على مقال «<a data-ss1618324191="1" data-ss1618326424="1" data-ss1625936573="1" href="https://academy.hsoub.com/devops/cloud-computing/docker/%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9-%D8%AD%D8%A7%D9%88%D9%8A%D8%A7%D8%AA-docker-r310/" rel="">التعامل مع حاويات Docker</a>» في <a data-ss1618324191="1" data-ss1618326424="1" data-ss1625936573="1" href="https://academy.hsoub.com/devops/cloud-computing/docker/" rel="">قسم دوكر</a> في أكاديمية حسوب.
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<div class="ipsQuote_contents ipsClearfix" data-gramm="false">
		<p>
			ملاحظة هامة: على الرغم من كون الحاوية المخصصة لمكتبة TensorFlow والتي سوف نستخدمها في مثالنا التالي تعمل بنظام تشغيل لينكس، إلا أنها تعمل دون مشاكل تذكر على أجهزة مضيفة تعمل بنظام تشغيل Windows 10.
		</p>
	</div>
</blockquote>

<h2 id="-">
	تطبيق عملي يقوم بتحديد جنس الشخص من صورة وجهه
</h2>

<p>
	بداية نقوم بتنصيب TensorFlow على Docker ضمن حاوية تحت تسمية hsoub-ft، قد تتطلب هذه الخطوة بعض الوقت نظرا لكون حجم صورة الحاوية التي سيتم سحبها وتنزيلها عبر الإنترنت يتجاوز 1GB:
</p>

<pre class="ipsCode">docker pull tensorflow/tensorflow docker run --name hsoub-tf -it -d tensorflow/tensorflow:latest
</pre>

<p>
	بعد ذلك نقوم بالدخول إلى سطر الأوامر ضمن الحاوية ونقوم بتنصيب الإصدار 2.0 على الأقل من مكتبة TensorFlow وكذلك الإصدار 0.6 على الأقل من نموذج تصنيف الصور3 الذي سنستخدمه والمستضاف في مكنز TensorFlow Hub، و بعد إتمام هذه الخطوات نخرج باستخدام الأمر exit في سطر الأوامر للعودة إلى الجهاز المضيف:
</p>

<pre class="ipsCode" id="ips_uid_6209_7">docker exec -it hsoub-tf bash pip install "tensorflow~=2.0" pip install "tensorflow-hub[make_image_classifier]~=0.6" exit
</pre>

<p>
	الخطوة التالية هي تحضير بيانات التدريب وذلك من خلال الحصول على الصور التي سيتم تدريب الشبكة عليها، في مثالنا هذا استخدمنا مجموعة جزئية تتكون من حوالي 2000 صورة مقسمة إلى فئتين ذكور وإناث وهي مقتطعة من مجموعة بيانات أكبر تدعى UTKFace4 المتاحة للاستخدامات غير التجارية والتي تتضمن بالأساس ما يزيد عن 20 ألف صورة وجه. تم اختيار الصور التي سوف نستخدمها في عملية التدريب بحيث تكون متوازنة من حيث الجنس (أي أن عدد الصور الخاصة بالذكور يساوي تقريبا عددها للإناث) والعرقيات (أي تقارب عدد الأشخاص من ذوي الأصول الأوروبية والأفريقية والهندية الخ.) وذلك لضمان عدم التحيز، إضافة إلى أن الصور تخص أشخاصا تتراوح أعمارهم ما بين 20 إلى 40 سنة.
</p>

<p>
	للمتابعة عليك تحميل الملف المضغوط المرفق مع هذا المحتوى، ثم قم بفك ضغطه على حاسوبك وستحصل على مجلد باسم training داخله ثلاث مجلدات هي images و output وكذلك test. ستلاحظ ضمن مجلد images أن هنالك مجلد فرعي لك تصنيف تريد من شبكتك العصبية أن تتعرف عليه (في حالتنا هذه هناك مجلدان فقط بتسمية Male و Female) داخل كل منهما مجموعة الصور التي تنتمي إلى ذلك التصنيف. من جهة أخرى فإن مجلد output هو فارغ حاليا لكنه المكان الذي سيتم فيه حفظ الشبكة العصبية بعد إتمام عملية تدريبها (أي حيث سنخزن النموذج الناتج)، أخيرا ستجد في المجلد الثالث test شيفرة برمجية بسيطة لاختبار النموذج الناتج وبعض الصور التي لم يسبق له أن رآها من قبل (أي أنها لم تكن موجودة أصلا ضمن صور وبيانات التدريب).
</p>

<p>
	نحن بحاجة إلى نقل كل هذه المجلدات وما فيها من ملفات إلى داخل الحاوية hsoub-tf وذلك باستخدام الأمر التالي على الجهاز المضيف:
</p>

<pre class="ipsCode" id="ips_uid_6209_9">docker cp .\training hsoub-tf:/training
</pre>

<p>
	الآن نستطيع الانتقال مجددا إلى سطر الأوامر ضمن الحاوية باستخدام الأمر التالي:
</p>

<pre class="ipsCode" id="ips_uid_6209_11">docker exec -it hsoub-tf bash
</pre>

<p>
	وبعد ذلك يمكننا بدء عملية التدريب باستخدام الأمر التالي:
</p>

<pre class="ipsCode" id="ips_uid_6209_13">make_image_classifier \ --image_dir training/images dir \ --tfhub_module https://tfhub.dev/google/tf2-preview/mobilenet_v2/feature_vector/4 \ --image_size 224 \ --saved_model_dir training/output/model \ --labels_output_file training/output/class_labels.txt \ --tflite_output_file training/output/mobile_model.tflite</pre>

<p>
	إن وسطاء الأمر التنفيذي السابق تحدد المسار الذي يحتوي على مجلدات الصور التي سيتم استخدامها في عملية التدريب (أي مسار المجلد ضمن الحاوية وليس على الجهاز المضيف)، وكذلك مصدر النموذج الأصلي الذي ستطبق عليه تقنية نقل التعلم باستبدال طبقته الأخيرة، بعد ذلك نحدد الأبعاد المطلوبة للصور ليتم تحجيمها تلقائيا لتلائم هذه الأبعاد (فهذا محدد ومرتبط بطبقة الإدخال في نموذج الشبكة العصبية المستخدمة)، في حالتنا نحن نستخدم نموذج MobileNet V2 والذي يفترض أبعاد الصورة هي 224 عنصورة/بيكسل للطول والعرض، بعد ذلك نحدد المكان الذي سيتم فيه حفظ النموذج المدرّب الناتج، وكذلك أين سيتم حفظ التسميات المرافقة لعصبونات الخرج من شبكتنا العصبية بالترتيب، وأخيرا أين سيتم تصدير هذا النموذج بصيغة tflite المحزومة والموضبة لتطبيقات الجوال.
</p>

<p>
	في نهاية عملية التدريب (والتي قد تطول تبعا لعدد الصور من جهة، ولسرعة الحاسوب الذي تتم عليه عملية التدريب من جهة أخرى)، سنجد أننا حصلنا على نموذج شبكة عصبية يستطيع تمييز جنس الشخص من صورته بدقة تتعدى 80% وذلك بمجهود بسيط جدا دون الحاجة إلى عمليات ضبط ومعايرة فائقة التخصص لوسطاء بناء وتدريب الشبكة العصبية، ودون الحاجة كذلك إلى ساعات وساعات من التدريب ولا إلى آلاف وآلاف من الصورة للتدرب عليها! إنها بحق نتيجة مرضية لأوائل مغامراتك مع الشبكات العصبية، لكنها مجرد البداية.
</p>

<p>
	ها قد حان الوقت لتجربة النموذج الذي قمنا بتدريبه على صور لم يسبق له أن رآها من قبل، للقيام بذلك سوف نستخدم برنامج معد مسبقا لهذه الغاية5 وهو مكتوب بلغة Python وموجود داخل المجلد training/test صحبة بضعة صور كأمثلة للتجريب (ويمكن أن تستخدم صورك الخاصة في هذه المرحلة)، حيث ستتم عملية الاختبار لكل صورة من خلال الأمر التالي (وفيه نشير إلى مسار الشبكة العصبية التي سيتم تحميلها واستخدامها، والملف النصي الذي يتضمن اسم التصنيف الخاص بكل عصبون خرج ضمن هذه الشبكة بالترتيب، وأخيرا مسار الصورة المراد تصنيفها):
</p>

<pre class="ipsCode" id="ips_uid_6209_15">python training/test/label_image.py \ --input_mean 0 --input_std 255 \ --model_file training/output/mobile_model.tflite \ --label_file training/output/class_labels.txt \ --image training/test/Ahmed_Zewail.jpg
</pre>

<p>
	بعد إتمام تدريبنا واختبارنا للشبكة العصبية حان الوقت للخروج من بيئة التدريب هذه باستخدام الأمر exit للعودة إلى سطر الأوامر على الجهاز المضيف، ومن ثم سنرغب طبعا باستخراج النموذج الذي قمنا بتعليمه خلال هذه الجلسة من داخل حاوية Docker وهو ما نستطيع القيام به باستخدام الأمر التالي:
</p>

<pre class="ipsCode" id="ips_uid_6787_13">docker cp hsoub-tf:/training/output .\training</pre>

<h2>
	نقاط تستحق التأمل
</h2>

<p>
	قد يرى البعض في تقنيات الذكاء الصنعي حلا لجميع المشكلات، لكنها في حقيقة الأمر لا تأتي خالية من المخاطر التي قد ترقى إلى حد اعتبارها نقاط ضعف أو عيوب يجب أن تؤخذ بعين الاعتبار، نذكر منها:
</p>

<ul>
	<li>
		باعتبار أن النماذج في الشبكات العصبية تبنى انطلاقا من بيانات التدريب، لذا فإنها غير قادرة على حل أي مشاكل كانت موجودة أصلا في تلك البيانات كالأخطاء أو الانحياز أو عدم التكامل والشمول لمختلف الحالات المراد التعامل معها.
	</li>
	<li>
		يصعب في الشبكات العصبية تفسير المنطق الذي استخدمه النموذج لإعطاء إجابته، فالتعامل معه أقرب ما يكون للصندوق الأسود الذي لا نعلم كمستخدمين آلية عمله الدقيقة في الداخل، بل نؤمن بأن ما نحصل عليه من إجابات هو أفضل المتاح، ولهذه الفكرة تداعياتها الفلسفية والاجتماعية التي تصعّب من استخدام هكذا أدوات في الحالات التي تتطلب تقديم تبرير (مثلا عند تطبيق عقوبة أو حرمان من مكافأة).
	</li>
	<li>
		تطوير نماذج الشبكات العصبية يتطلب قدرا كبيرا من بيانات التدريب المشروحة والمجهزة بشكل جيد وملائم، وهو ما قد يعني الكثير من الجهد لتوفير مثل هكذا مصادر للتدريب.
	</li>
	<li>
		عملية تدريب الشبكات العصبية هي عملية متطلّبة من ناحية قدرات المعالجة الحسابية المتوفّرة للعتاد المستخدم، وذلك على عكس عملية استخدامها في التطبيقات عقب إتمام التدريب، لذا قد يجد المطور في الحوسبة السحابية فرصا متاحة بميزانيات في المتناول.
	</li>
	<li>
		إن بناء النماذج باستخدام خوارزميات تعلم الآلة يتطلب مطورين أذكياء وموهوبين، فعلى الرغم من أن تطبيق المثال الذي قمنا بعرضه يبدو سهلا ويسيرا، إلا أن نظرة أكثر تعمقا ستكشف لك الكثير من التفاصيل التي بحاجة إلى معايرة وضبط، منها على سبيل المثال لا الحصر: معمارية الشبكة، وطريقة توصيف تابع تفعيل العصبونات فيها، وعدد طبقاتها الخفية، وعدد العصبونات في كل منها، وطريقة ربطها بعضها ببعض، وكيفية حساب الخطأ ما بين النتيجة المحسوبة والمطلوبة، ومعدل سرعة التعلم، وعدد مرات تكرار عرض الأمثلة على الشبكة العصبية أثناء التدريب، وغيرها الكثير. إن انتقاء التوليفة الأكثر ملائمة لجملة معايير الضبط هذه يؤثر بشكل حاسم على جودة ودقة النموذج الناتج.
	</li>
</ul>

<h2>
	مراجع أجنبية للاستزادة
</h2>

<ul>
	<li>
		<a data-ss1618324191="1" data-ss1618326424="1" data-ss1625936573="1" href="https://ai.googleblog.com/2018/04/mobilenetv2-next-generation-of-on.html" rel="external nofollow">MobileNetV2: The Next Generation of On-Device Computer Vision Networks</a>
	</li>
	<li>
		<a data-ss1618324191="1" data-ss1618326424="1" data-ss1625936573="1" href="https://arxiv.org/abs/1310.1531" rel="external nofollow">DeCAF: A Deep Convolutional Activation Feature for Generic Visual Recognition</a>
	</li>
	<li>
		<a data-ss1618324191="1" data-ss1618326424="1" data-ss1625936573="1" href="https://github.com/tensorflow/hub/tree/master/tensorflow_hub/tools/make_image_classifier" rel="external nofollow">Making your own TensorFlow model for image classification</a>
	</li>
	<li>
		<a data-ss1618324191="1" data-ss1618326424="1" data-ss1625936573="1" href="https://susanqq.github.io/UTKFace" rel="external nofollow">UTKFace: Large Scale Face Dataset</a>
	</li>
	<li>
		<a data-ss1618324191="1" data-ss1618326424="1" data-ss1625936573="1" href="https://github.com/tensorflow/tensorflow/tree/master/tensorflow/lite/examples/python" rel="external nofollow">TensorFlow Lite Python image classification demo</a>
	</li>
</ul>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A/" rel="">تعلم الذكاء الاصطناعي</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A/" rel="">الذكاء الاصطناعي: دليلك الشامل</a>
	</li>
	<li>
		المقال التالي: <a data-ss1618324191="1" data-ss1618326424="1" data-ss1625936573="1" href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%B4%D8%A8%D9%83%D8%A9-%D8%B9%D8%B5%D8%A8%D9%8A%D8%A9-%D8%B5%D9%86%D8%B9%D9%8A%D8%A9-%D9%88%D8%AA%D8%AF%D8%B1%D9%8A%D8%A8%D9%87%D8%A7-%D9%84%D9%84%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D9%88%D8%AC%D9%88%D9%87-r1198/" rel="">إعداد شبكة عصبية صنعية وتدريبها للتعرف على الوجوه</a>
	</li>
	<li>
		<a data-ss1618324191="1" data-ss1618326424="1" data-ss1625936573="1" href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A-%D9%85%D8%B1%D8%A7%D8%AD%D9%84-%D8%A7%D9%84%D8%A8%D8%AF%D8%A1-%D9%88%D8%A7%D9%84%D8%AA%D8%B7%D9%88%D8%B1-%D9%88%D8%A7%D9%84%D8%A3%D8%B3%D8%B3-%D8%A7%D9%84%D8%AA%D9%8A-%D9%86%D8%B4%D8%A3-%D8%B9%D9%84%D9%8A%D9%87%D8%A7-r988/" rel="">الذكاء الاصطناعي: مراحل البدء والتطور والأسس التي نشأ عليها</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1197</guid><pubDate>Sun, 11 Apr 2021 08:16:00 +0000</pubDate></item><item><title>&#x645;&#x62F;&#x62E;&#x644; &#x625;&#x644;&#x649; &#x62A;&#x639;&#x644;&#x645; &#x627;&#x644;&#x622;&#x644;&#x629; (Machine learning) &#x641;&#x64A; PHP</title><link>https://academy.hsoub.com/programming/artificial-intelligence/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9-machine-learning-%D9%81%D9%8A-php-r1179/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2021_03/7.png.d681ba3d95bfcb241658841a807de133.png" /></p>
<h2>
	التصنيف باستخدام مكتبة PHP-ML
</h2>

<p>
	التصنيف في تعلم الآلة هو المشكلة التي تحدد مجموعة الفئات التي تنتمي إليها الملاحظة الجديدة، يندرج التصنيف تحت فئة تعلم الآلة المُشرَف عليه (Supervised Machine Learning)، تُعرَف أي خوارزمية تنفذ التصنيف بأنها مصنِّفة (classifier).
</p>

<p>
	المصنِّفات المدعومة في PHP-ML هي:
</p>

<ul>
	<li>
		SVC تصنيف دعم الشعاع (Support Vector Classification).
	</li>
	<li>
		أقرب k جار (k-Nearest Neighbors).
	</li>
	<li>
		مصنِّف بايز البسيط (Naive Bayes).
	</li>
</ul>

<p>
	إنّ التوابع <code>train</code> و<code>predict</code> هي نفسها لكل المصنِّفات (classifiers)، الفرق الوحيد في الخوارزمية الأساسية المستخدمة.
</p>

<h3>
	SVC تصنيف دعم الشعاع (Support Vector Classification)
</h3>

<p>
	نحتاج إلى تدريب المصنِّف قبل أن نبدأ بالتنبؤ بملاحظة جديدة، بفرض لدينا الشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7458_6" style=""><span class="com">// استيراد المكتبة</span><span class="pln">
</span><span class="kwd">use</span><span class="pln"> </span><span class="typ">Phpml</span><span class="pln">\Classification\SVC</span><span class="pun">;</span><span class="pln"> 
</span><span class="kwd">use</span><span class="pln"> </span><span class="typ">Phpml</span><span class="pln">\SupportVectorMachine\Kernel</span><span class="pun">;</span><span class="pln">

</span><span class="com">// بيانات تدريب المصنِّف</span><span class="pln">
</span><span class="com">// عينات التدريب</span><span class="pln">
$samples </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[[</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">],</span><span class="pln"> </span><span class="pun">[</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4</span><span class="pun">],</span><span class="pln"> </span><span class="pun">[</span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4</span><span class="pun">],</span><span class="pln"> </span><span class="pun">[</span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">],</span><span class="pln"> </span><span class="pun">[</span><span class="lit">4</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">],</span><span class="pln"> </span><span class="pun">[</span><span class="lit">4</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">]];</span><span class="pln">
$labels </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">'a'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'a'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'a'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'b'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'b'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'b'</span><span class="pun">];</span><span class="pln"> 

</span><span class="com">// تهيئة المصنِّف</span><span class="pln">
$classifier </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> SVC</span><span class="pun">(</span><span class="typ">Kernel</span><span class="pun">::</span><span class="pln">LINEAR</span><span class="pun">,</span><span class="pln"> $cost </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1000</span><span class="pun">);</span><span class="pln">

</span><span class="com">// تدريب المصنِّف</span><span class="pln">
$classifier</span><span class="pun">-&gt;</span><span class="pln">train</span><span class="pun">(</span><span class="pln">$samples</span><span class="pun">,</span><span class="pln"> $labels</span><span class="pun">);</span></pre>

<p>
	المتغير <code>‎$cost</code> المُستخدم في الشيفرة السابقة هو مقياس لمقدار التصنيف الخاطئ الذي نريد تجنبه في كل مثال تدريبي، قد تحصل على أمثلة ذات تصنيف خاطئ من أجل قيم أقل للمتغير <code>‎$cost</code>، يُضبَط افتراضيًا للقيمة 1.0.
</p>

<p>
	يمكننا الآن البدء في بعض التنبؤات الحقيقية بعد أن أصبح لدينا المصنِّف مدرّبًا، بفرض لدينا الشيفرات التالية للتنبؤات:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7458_8" style=""><span class="pln">$classifier</span><span class="pun">-&gt;</span><span class="pln">predict</span><span class="pun">([</span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">]);</span><span class="pln">
</span><span class="com">// 'b'</span><span class="pln">

$classifier</span><span class="pun">-&gt;</span><span class="pln">predict</span><span class="pun">([[</span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">],</span><span class="pln"> </span><span class="pun">[</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">]]);</span><span class="pln">
</span><span class="com">// ['b', 'a']</span></pre>

<p>
	يمكن أن يأخذ المصنِّف في هذه الحالة عينات غير مصنّفة ويتنبأ بتسمياتها، يمكن أن يأخذ التابع <code>predict</code> عينة مفردة أو مصفوفة من العينات.
</p>
<div class="banner-container ipsBox ipsPadding">
    <div class="inner-banner-container">
            <p class="banner-heading">
                    دورة الذكاء الاصطناعي
            </p>



            <p class="banner-subtitle">
        احترف برمجة الذكاء الاصطناعي AI وتحليل البيانات وتعلم كافة المعلومات التي تحتاجها لبناء نماذج ذكاء اصطناعي متخصصة.
            </p>

            <div>
                    <a class="ipsButton ipsButton_large ipsButton_primary ipsButton_important" href="https://academy.hsoub.com/learn/artificial-intelligence" rel="">اشترك الآن</a>
            </div>
    </div>
<div class="banner-img"> <a href="https://academy.hsoub.com/learn/artificial-intelligence" rel=""><img alt="دورة الذكاء الاصطناعي AI" src="https://academy.hsoub.com/learn/assets/images/courses/artificial-intelligence.png"></a></div>
</div>
<h3>
	أقرب k جار (k-Nearest Neighbors)
</h3>

<p>
	يأخذ المصنِّف في هذه الخوارزمية معاملَين ويمكن تهيئتهما كالتالي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7458_10" style=""><span class="pln">$classifier </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">KNearestNeighbors</span><span class="pun">(</span><span class="pln">$neighbor_num</span><span class="pun">=</span><span class="lit">4</span><span class="pun">);</span><span class="pln"> 
$classifier </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">KNearestNeighbors</span><span class="pun">(</span><span class="pln">$neighbor_num</span><span class="pun">=</span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Minkowski</span><span class="pun">(</span><span class="pln">$lambda</span><span class="pun">=</span><span class="lit">4</span><span class="pun">));</span></pre>

<p>
	المتغير <code>‎$neighbor_num</code> هو عدد الجيران الأقرب للفحص بخوارزمية ⁩<a data-ss1616976147="1" data-ss1616976497="1" data-ss1616976539="1" data-ss1616976599="1" href="%E2%80%8Fhttps://en.wikipedia.org/wiki/K-nearest_neighbors_algorithm" rel="">knn</a>، أما المعامل الثاني فهو مقياس المسافة والذي يكون افتراضيًا <code>Euclidean</code> في الحالة الأولى.
</p>

<p>
	إليك مثال قصير عن كيفية استخدام المصنِّف:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7458_12" style=""><span class="com">// بيانات التدريب</span><span class="pln">
$samples </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[[</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">],</span><span class="pln"> </span><span class="pun">[</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4</span><span class="pun">],</span><span class="pln"> </span><span class="pun">[</span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4</span><span class="pun">],</span><span class="pln"> </span><span class="pun">[</span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">],</span><span class="pln"> </span><span class="pun">[</span><span class="lit">4</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">],</span><span class="pln"> </span><span class="pun">[</span><span class="lit">4</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">]];</span><span class="pln"> 
$labels </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">'a'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'a'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'a'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'b'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'b'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'b'</span><span class="pun">];</span><span class="pln"> 

</span><span class="com">// تهيئة المصنِّف</span><span class="pln">
$classifier </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">KNearestNeighbors</span><span class="pun">();</span><span class="pln">

</span><span class="com">// تدريب المصنِّف</span><span class="pln">
$classifier</span><span class="pun">-&gt;</span><span class="pln">train</span><span class="pun">(</span><span class="pln">$samples</span><span class="pun">,</span><span class="pln"> $labels</span><span class="pun">);</span><span class="pln">

</span><span class="com">// التنبؤات</span><span class="pln">
$classifier</span><span class="pun">-&gt;</span><span class="pln">predict</span><span class="pun">([</span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">]);</span><span class="pln">
</span><span class="com">// 'b'</span><span class="pln">

$classifier</span><span class="pun">-&gt;</span><span class="pln">predict</span><span class="pun">([[</span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">],</span><span class="pln"> </span><span class="pun">[</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">]]);</span><span class="pln">
</span><span class="com">// ['b', 'a']</span></pre>

<h3>
	مصنِّف بايز البسيط (Naive Bayes)
</h3>

<p>
	يعتمد مصنِّف بايز البسيط على نظرية بايز ولا يحتاج أي معاملات في الباني، توضّح الشيفرة التالية تنفيذًا لتنبؤ بسيط:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7458_14" style=""><span class="com">// بيانات التدريب</span><span class="pln">
$samples </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[[</span><span class="lit">5</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">],</span><span class="pln"> </span><span class="pun">[</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">],</span><span class="pln"> </span><span class="pun">[</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">]];</span><span class="pln">
$labels </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">'a'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'b'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'c'</span><span class="pun">];</span><span class="pln">

</span><span class="com">// تهيئة المصنِّف</span><span class="pln">
$classifier </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">NaiveBayes</span><span class="pun">();</span><span class="pln">

</span><span class="com">// تدريب المصنِّف</span><span class="pln">
$classifier</span><span class="pun">-&gt;</span><span class="pln">train</span><span class="pun">(</span><span class="pln">$samples</span><span class="pun">,</span><span class="pln"> $labels</span><span class="pun">);</span><span class="pln">

</span><span class="com">// التنبؤات</span><span class="pln">
$classifier</span><span class="pun">-&gt;</span><span class="pln">predict</span><span class="pun">([</span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">]);</span><span class="pln">
</span><span class="com">// 'a'</span><span class="pln">

$classifier</span><span class="pun">-&gt;</span><span class="pln">predict</span><span class="pun">([[</span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">],</span><span class="pln"> </span><span class="pun">[</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">]);</span><span class="pln"> 
</span><span class="com">// ['a', 'b']</span></pre>

<h3>
	حالة عمليّة
</h3>

<p>
	استخدمنا حتى الآن مصفوفات من الأعداد الصحيحة في كل الحالات ولكن هذه الحالة غير موجودة في حياتنا الواقعية، لذا سنحاول وصف حل عملي لكيفية استخدام المصنِّفات⁡.
</p>

<p>
	بفرض لدينا تطبيق يخزّن خاصيّات الأزهار في الطبيعة، يمكننا أن نفرض للتبسيط لون الزهرة وطول البتلات ونستخدم هاتين الخاصيتين لتدريب البيانات، اللون هو الخاصيّة الأبسط إذ يمكننا إسناد قيمة صحيحة لكل لون ويمكن أن يكون عندك مجال للطول مثل <code>‎(0 mm,10 mm)=1‎، ‏‎(10 mm,20 mm)=2</code>. درّب المصنِّف مع بيانات التهيئة، الآن إذا احتاج مستخدم ما لتحديد نوع الزهرة التي تنمو في حديقته الخلفية، عندها يختار لون الزهرة ويضيف طول البتلات ويُنفَّذ المصنِّف ويكشف نوع الزهرة.
</p>

<h2>
	الانحدار (Regression)
</h2>

<p>
	أسندنا باستخدام التصنيف مع مكتبة PHP-ML تسميات للملاحظة الجديدة، الانحدار هو نفسه تقريبًا إلا أنّ قيمة الخرج ليست اسم صنف بل قيمة مستمرة، يُستخدم بشكلٍ كبير للتنبؤات والتوقعات، تدعم مكتبة PHP-ML خوارزميات الانحدار التالية:
</p>

<ul>
	<li>
		انحدار دعم المتجه (Support Vector Regression).
	</li>
	<li>
		الانحدار الخطي ذو المربعات الأقل (Least Squares Linear Regression). يستخدم الانحدار نفس التوابع <code>train</code> و<code>predict</code> المستخدمة في التصنيف.
	</li>
</ul>

<h3>
	انحدار دعم المتجه (Support Vector Regression)
</h3>

<p>
	هذه نسخة الانحدار من آلة دعم المتجه (‏SVM) (‏Support Vector Machine)، الخطوة الأولى مثل التصنيف هي تدريب النموذج:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7458_16" style=""><span class="com">// استيراد المكتبة</span><span class="pln">
</span><span class="kwd">use</span><span class="pln"> </span><span class="typ">Phpml</span><span class="pln">\Regression\SVR</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">use</span><span class="pln"> </span><span class="typ">Phpml</span><span class="pln">\SupportVectorMachine\Kernel</span><span class="pun">;</span><span class="pln">

</span><span class="com">// بيانات التدريب</span><span class="pln">
$samples </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[[</span><span class="lit">60</span><span class="pun">],</span><span class="pln"> </span><span class="pun">[</span><span class="lit">61</span><span class="pun">],</span><span class="pln"> </span><span class="pun">[</span><span class="lit">62</span><span class="pun">],</span><span class="pln"> </span><span class="pun">[</span><span class="lit">63</span><span class="pun">],</span><span class="pln"> </span><span class="pun">[</span><span class="lit">65</span><span class="pun">]];</span><span class="pln">
$targets </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">3.1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3.6</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3.8</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4.1</span><span class="pun">];</span><span class="pln">

</span><span class="com">// تهيئة محرك الانحدار</span><span class="pln">
$regression </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> SVR</span><span class="pun">(</span><span class="typ">Kernel</span><span class="pun">::</span><span class="pln">LINEAR</span><span class="pun">);</span><span class="pln">

</span><span class="com">// تدريب محرك الانحدار</span><span class="pln">
$regression</span><span class="pun">-&gt;</span><span class="pln">train</span><span class="pun">(</span><span class="pln">$samples</span><span class="pun">,</span><span class="pln"> $targets</span><span class="pun">);</span><span class="pln"> </span></pre>

<p>
	المتغير <code>‎$target</code> في الانحدار ليس أسماء أصناف كما في التصنيف، هذا عامل للتفريق بين النوعين، يمكننا أن نبدأ بالتنبؤات الفعلية بعد تدريب نموذجنا.
</p>

<pre class="ipsCode">$regression-&gt;predict([64])
// 4.03
</pre>

<p>
	لاحظ أنّ التنبؤات ترجع قيمة من خارج مجال الهدف.
</p>

<h3>
	الانحدار الخطي ذو المربعات الأقل (Least Squares Linear Regression)
</h3>

<p>
	تستخدم هذه الخوارزمية طريقة المربعات الأقل للوصول إلى حل تقريبي، إليك شيفرة بسيطة للتدريب والتنبؤ:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7458_18" style=""><span class="com">// بيانات التدريب</span><span class="pln">
$samples </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[[</span><span class="lit">60</span><span class="pun">],</span><span class="pln"> </span><span class="pun">[</span><span class="lit">61</span><span class="pun">],</span><span class="pln"> </span><span class="pun">[</span><span class="lit">62</span><span class="pun">],</span><span class="pln"> </span><span class="pun">[</span><span class="lit">63</span><span class="pun">],</span><span class="pln"> </span><span class="pun">[</span><span class="lit">65</span><span class="pun">]];</span><span class="pln">
$targets </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">3.1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3.6</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3.8</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4.1</span><span class="pun">];</span><span class="pln">

</span><span class="com">// تهيئة محرك الانحدار</span><span class="pln">
$regression </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">LeastSquares</span><span class="pun">();</span><span class="pln">

</span><span class="com">// تدريب محرك الانحدار</span><span class="pln">
$regression</span><span class="pun">-&gt;</span><span class="pln">train</span><span class="pun">(</span><span class="pln">$samples</span><span class="pun">,</span><span class="pln"> $targets</span><span class="pun">);</span><span class="pln">

</span><span class="com">// التنبؤ باستخدام المحرك المدرَّب</span><span class="pln">
$regression</span><span class="pun">-&gt;</span><span class="pln">predict</span><span class="pun">([</span><span class="lit">64</span><span class="pun">]);</span><span class="pln"> 
</span><span class="com">// 4.06</span></pre>

<p>
	توفر أيضًا مكتبة PHP-ML خيار <code>Multiple Linear Regression</code>، إليك الشيفرة التالية كمثال:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7458_20" style=""><span class="pln">$samples </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[[</span><span class="lit">73676</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1996</span><span class="pun">],</span><span class="pln"> </span><span class="pun">[</span><span class="lit">77006</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1998</span><span class="pun">],</span><span class="pln"> </span><span class="pun">[</span><span class="lit">10565</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2000</span><span class="pun">],</span><span class="pln"> </span><span class="pun">[</span><span class="lit">146088</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1995</span><span class="pun">],</span><span class="pln"> </span><span class="pun">[</span><span class="lit">15000</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2001</span><span class="pun">],</span><span class="pln"> </span><span class="pun">[</span><span class="lit">65940</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2000</span><span class="pun">],</span><span class="pln"> </span><span class="pun">[</span><span class="lit">9300</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2000</span><span class="pun">],</span><span class="pln"> </span><span class="pun">[</span><span class="lit">93739</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1996</span><span class="pun">],</span><span class="pln"> </span><span class="pun">[</span><span class="lit">153260</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1994</span><span class="pun">],</span><span class="pln"> </span><span class="pun">[</span><span class="lit">17764</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2002</span><span class="pun">],</span><span class="pln"> </span><span class="pun">[</span><span class="lit">57000</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1998</span><span class="pun">],</span><span class="pln"> </span><span class="pun">[</span><span class="lit">15000</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2000</span><span class="pun">]];</span><span class="pln"> $targets </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">2000</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2750</span><span class="pun">,</span><span class="pln"> </span><span class="lit">15500</span><span class="pun">,</span><span class="pln"> </span><span class="lit">960</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4400</span><span class="pun">,</span><span class="pln"> </span><span class="lit">8800</span><span class="pun">,</span><span class="pln"> </span><span class="lit">7100</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2550</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1025</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5900</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4600</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4400</span><span class="pun">];</span><span class="pln">

$regression </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">LeastSquares</span><span class="pun">();</span><span class="pln"> 
$regression</span><span class="pun">-&gt;</span><span class="pln">train</span><span class="pun">(</span><span class="pln">$samples</span><span class="pun">,</span><span class="pln"> $targets</span><span class="pun">);</span><span class="pln"> 
$regression</span><span class="pun">-&gt;</span><span class="pln">predict</span><span class="pun">([</span><span class="lit">60000</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1996</span><span class="pun">])</span><span class="pln">
</span><span class="com">// 4094.82</span></pre>

<p>
	يعدّ الخيار <code>Multiple Linear Regression</code> مفيدًا بشكلٍ خاص عندما يوجد عدة عوامل أو سمات لتحديد الخرج.
</p>

<h3>
	حالة عمليّة
</h3>

<p>
	إليك مثالًا لتطبيق عملي للانحدار في الحياة الواقعية. بفرض لديك موقع إلكتروني مشهور حركة المرور فيه متغيرة باستمرار وتريد حلًا للتنبؤ بعدد الخوادم التي تحتاج إلى نشرها في وقت من الأوقات، وبفرض أن مزود الاستضافة يمنحك واجهة برمجة تطبيقات (api) لتعمل الخوادم وكل خادم يستغرق 15 دقيقة للتشغيل، بالاعتماد على حركة المرور السابقة والانحدار يمكنك توقع حركة المرور في تطبيقك في وقت ما. يمكنك باستخدام هذه المعرفة بدء خادم قبل 15 دقيقة من بدء تدفق حركة المرور مما يمنع تعطيل تطبيقك.
</p>

<h2>
	العنقدة (Clustering)
</h2>

<p>
	العنقدة هي تجميع الكائنات المتشابهة معًا، وتستخدم بشكل واسع للتعرف على الأنماط، تعد العنقدة من نوع تعلم الآلة غير المُشرف عليه لذا لا توجد حاجة للتدريب، تدعم مكتبة PHP-ML خوارزميات العنقدة التالية:
</p>

<ul>
	<li>
		k-Means
	</li>
	<li>
		dbscan
	</li>
</ul>

<h3>
	خوارزمية k-Means
</h3>

<p>
	تفصل هذه الخوارزمية البيانات إلى n مجموعة بتباين متساوٍ، أي أننا نحتاج إلى تمرير الرقم n الذي هو عدد العناقيد التي نحتاجها في الحل، إليك الشيفرة التالية للتوضيح:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7458_22" style=""><span class="com">// مجموعة البيانات</span><span class="pln">
$samples </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[[</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">],</span><span class="pln"> </span><span class="pun">[</span><span class="lit">8</span><span class="pun">,</span><span class="pln"> </span><span class="lit">7</span><span class="pun">],</span><span class="pln"> </span><span class="pun">[</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">],</span><span class="pln"> </span><span class="pun">[</span><span class="lit">7</span><span class="pun">,</span><span class="pln"> </span><span class="lit">8</span><span class="pun">],</span><span class="pln"> </span><span class="pun">[</span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">],</span><span class="pln"> </span><span class="pun">[</span><span class="lit">8</span><span class="pun">,</span><span class="pln"> </span><span class="lit">9</span><span class="pun">]];</span><span class="pln">

</span><span class="com">// ‫تهيئة العنقدة بالمعامل `n`</span><span class="pln">
$kmeans </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">KMeans</span><span class="pun">(</span><span class="lit">3</span><span class="pun">);</span><span class="pln">
$kmeans</span><span class="pun">-&gt;</span><span class="pln">cluster</span><span class="pun">(</span><span class="pln">$samples</span><span class="pun">);</span><span class="pln">
</span><span class="com">// [0=&gt;[[7, 8]], 1=&gt;[[8, 7]], 2=&gt;[[1,1]]]</span></pre>

<p>
	لاحظ أنّ الخرج يحتوي 3 مصفوفات لأنّ هذه قيمة n في باني <code>KMeans</code>، يمكن أن يوجد معامل اختياري ثاني في الباني يصف طريقة التهيئة، مثال:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7458_24" style=""><span class="pln">$kmeans </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">KMeans</span><span class="pun">(</span><span class="lit">4</span><span class="pun">,</span><span class="pln"> </span><span class="typ">KMeans</span><span class="pun">::</span><span class="pln">INIT_RANDOM</span><span class="pun">);</span></pre>

<p>
	تحدد الطريقة <code>INIT_RANDOM</code> نقطة مركزية عشوائية أثناء محاولة تحديد العناقيد، تكون هذه النقطة محدودة بحدود فضاء البيانات لتجنب أن تكون هذه النقطة المركزية بعيدة جدًا عن البيانات. طريقة التهيئة الافتراضية للباني هي <a data-ss1616976147="1" data-ss1616976497="1" data-ss1616976539="1" data-ss1616976599="1" href="%E2%80%8Fhttps://en.wikipedia.org/wiki/K-means%2B%2B%E2%80%8F" rel="">kmeans++‎</a> والتي تختار النقطة المركزية بطريقة ذكية لتسريع العملية.
</p>

<h3>
	خوارزمية DBSCAN
</h3>

<p>
	هي خوارزمية عنقدة تعتمد على الكثافة أي أننا لن نحتاج إلى تمرير n لتحديد عدد العناقيد التي نريدها في نتائجنا على عكس خوارزمية k-Means، إنما نحتاج إلى معاملين لتعمل:
</p>

<ul>
	<li>
		<code>‎$minSamples</code>: أقل عدد كائنات يجب أن تكون موجودة في العنقود.
	</li>
	<li>
		<code>‎$epsilon</code>: أقصى مسافة بين عينتين لنعدهما في نفس العنقود.
	</li>
</ul>

<p>
	مثال:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7458_26" style=""><span class="com">// مجموعة بيانات العينة</span><span class="pln">
$samples </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[[</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">],</span><span class="pln"> </span><span class="pun">[</span><span class="lit">8</span><span class="pun">,</span><span class="pln"> </span><span class="lit">7</span><span class="pun">],</span><span class="pln"> </span><span class="pun">[</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">],</span><span class="pln"> </span><span class="pun">[</span><span class="lit">7</span><span class="pun">,</span><span class="pln"> </span><span class="lit">8</span><span class="pun">],</span><span class="pln"> </span><span class="pun">[</span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">],</span><span class="pln"> </span><span class="pun">[</span><span class="lit">8</span><span class="pun">,</span><span class="pln"> </span><span class="lit">9</span><span class="pun">]];</span><span class="pln">

$dbscan </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> DBSCAN</span><span class="pun">(</span><span class="pln">$epsilon </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> $minSamples </span><span class="pun">=</span><span class="pln"> </span><span class="lit">3</span><span class="pun">);</span><span class="pln">
$dbscan</span><span class="pun">-&gt;</span><span class="pln">cluster</span><span class="pun">(</span><span class="pln">$samples</span><span class="pun">);</span><span class="pln">
</span><span class="com">// [0=&gt;[[1, 1]], 1=&gt;[[8, 7]]]</span></pre>

<p>
	لا توجد طريقة هنا لمعرفة عدد عناصر الخرج كما في خوارزمية k-Means.
</p>

<h3>
	حالة عمليّة
</h3>

<p>
	لنأخذ مثالًا عن تطبيق عملي في الحياة الواقعية، تستخدم العنقدة بشكلٍ كبير في التعرف على الأنماط والتنقيب عن البيانات، بفرض لديك تطبيق نشر محتوى، لتحافظ على المستخدمين يجب أن يظهر لديهم المحتوى الذي يحبونه، لنفرض للتبسيط أنهم إذا كانوا في صفحة ويب معينة لأكثر من دقيقة ونزلوا فيها إلى الأسفل أي أنهم أحبوا هذا المحتوى. الآن سيكون لكل محتوى معرف فريد وكذلك لكل مستخدم، ونجعل عنقودًا يعتمد على هذه الخصائص وستتعرف على شريحة المستخدمين التي تحب محتوى مشابه لهذا المحتوى، يمكن استخدام هذا في نظام التوصيات ⁢حيث يمكنك فرض أنّه إذا كان لدينا بعض المستخدمين في نفس العنقود أحبوا مقالة ما عندها فإنّ هذه المقالة ستظهر عند المستخدمين الباقيين في التوصيات.
</p>

<p>
	ترجمة -وبتصرف- للفصل [Machine learning] من كتاب <a data-ss1616976147="1" data-ss1616976497="1" data-ss1616976539="1" data-ss1616976599="1" href="https://goalkicker.com/PHPBook/" rel="external nofollow">PHP Notes for Professionals book</a>
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال التالي: <a href="https://academy.hsoub.com/programming/php/%D8%A7%D9%84%D8%AA%D8%AE%D8%B2%D9%8A%D9%86-%D8%A7%D9%84%D9%85%D8%A4%D9%82%D8%AA-cache-%D9%88%D9%85%D9%82%D8%A7%D8%A8%D8%B3-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-webscockets-%D9%81%D9%8A-php-r1180/" rel="">التخزين المؤقت (Cache) ومقابس الويب (Webscockets) في PHP</a>
	</li>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/php/%D9%85%D8%B9%D8%A7%D9%84%D8%AC%D8%A9-%D8%A7%D9%84%D8%B5%D9%88%D8%B1-%D9%85%D8%B9-%D9%85%D9%83%D8%AA%D8%A8%D8%A9-gd-%D9%88%D9%85%D9%83%D8%AA%D8%A8%D8%A9-imagick-%D9%81%D9%8A-php-r1178/" rel="">معالجة الصور مع مكتبة GD ومكتبة Imagick في PHP</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1179</guid><pubDate>Sat, 03 Apr 2021 13:01:00 +0000</pubDate></item><item><title>&#x62A;&#x639;&#x644;&#x645; &#x627;&#x644;&#x622;&#x644;&#x629;: &#x627;&#x644;&#x62A;&#x62D;&#x62F;&#x64A;&#x627;&#x62A; &#x627;&#x644;&#x631;&#x626;&#x64A;&#x633;&#x64A;&#x629; &#x648;&#x643;&#x64A;&#x641;&#x64A;&#x629; &#x627;&#x644;&#x62A;&#x648;&#x633;&#x639; &#x641;&#x64A; &#x627;&#x644;&#x645;&#x62C;&#x627;&#x644;</title><link>https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9-%D8%A7%D9%84%D8%AA%D8%AD%D8%AF%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%B1%D8%A6%D9%8A%D8%B3%D9%8A%D8%A9-%D9%88%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A7%D9%84%D8%AA%D9%88%D8%B3%D8%B9-%D9%81%D9%8A-%D8%A7%D9%84%D9%85%D8%AC%D8%A7%D9%84-r1010/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2020_09/4.png.ea4bbffbd314d5e9d55e4e53cc37bbd4.png" /></p>
<p>
	هذا المقال جزء من سلسلة «مدخل إلى الذكاء الاصطناعي»:
</p>

<ul>
	<li>
		<a data-ss1621157872="1" href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A-%D8%A3%D9%87%D9%85-%D8%A7%D9%84%D8%A5%D9%86%D8%AC%D8%A7%D8%B2%D8%A7%D8%AA-%D9%88%D8%A7%D9%84%D8%A7%D8%AE%D8%AA%D8%B1%D8%A7%D8%B9%D8%A7%D8%AA-%D9%88%D9%83%D9%8A%D9%81-%D8%A3%D8%AB%D8%B1%D8%AA-%D9%81%D9%8A-%D8%AD%D9%8A%D8%A7%D8%AA%D9%86%D8%A7-%D8%A7%D9%84%D9%8A%D9%88%D9%85%D9%8A%D8%A9-r975/" rel="">الذكاء الاصطناعي: أهم الإنجازات والاختراعات وكيف أثرت في حياتنا اليومية</a>
	</li>
	<li>
		<a data-ss1621157872="1" href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A-%D9%85%D8%B1%D8%A7%D8%AD%D9%84-%D8%A7%D9%84%D8%A8%D8%AF%D8%A1-%D9%88%D8%A7%D9%84%D8%AA%D8%B7%D9%88%D8%B1-%D9%88%D8%A7%D9%84%D8%A3%D8%B3%D8%B3-%D8%A7%D9%84%D8%AA%D9%8A-%D9%86%D8%B4%D8%A3-%D8%B9%D9%84%D9%8A%D9%87%D8%A7-r988/" rel="">الذكاء الاصطناعي: مراحل البدء والتطور والأسس التي نشأ عليها</a>
	</li>
	<li>
		<a data-ss1621157872="1" href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D9%84%D9%85%D9%81%D8%A7%D9%87%D9%8A%D9%85-%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A9-%D9%84%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9-r1009/" rel="">المفاهيم الأساسية لتعلم الآلة</a>
	</li>
	<li>
		تعلم الآلة: التحديات الرئيسية وكيفية التوسع في المجال
	</li>
	<li>
		يمكنك قراءة السلسلة على شكل كتاب إلكتروني بالانتقال إلى صفحة الكتاب، <a data-ss1621157872="1" href="https://academy.hsoub.com/files/17-%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A7%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A-%D9%88%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9/" rel="">مدخل إلى الذكاء الاصطناعي وتعلم الآلة</a>.
	</li>
</ul>

<p>
	كما هو الحال مع جميع المجالات العلمية لا بدّ من وجود بعض المشاكل والعقبات في رحلة الوصول إلى المعلومة الصحيحة والكاملة، ومجال تعلّم الآلة ليس استثناءً وانطلاقًا من كون أن مهمتنا الرئيسية عند مواجهتنا أي مسألة تنحصر بين شيئين أساسيين وهما:
</p>

<ol>
	<li>
		اختيار البيانات المناسبة.
	</li>
	<li>
		اختيار الخوارزمية (الطريقة) المناسبة.
	</li>
</ol>

<p>
	نجد أن أغلب المشاكل الّتي تواجه هذا المجال إما أن تكون بسبب <strong>الخوارزمية السيئة</strong> أو <strong>البيانات السيئة</strong>، في البداية لنبدأ باستعراض أهم التحديات الّتي تواجهنا مع البيانات.
</p>

<h2>
	كمية غير كافية من بيانات التدريب
</h2>

<p>
	تتجلى إحدى إمكانيات قوة العقل البشري على قدرته على التعلّم من خلال بيانات قليلة جدًا، فمثلًا لكي يتعلم الطفل الصغير معنى التفاح، كلّ ما عليك فعله هو تحضر أمامه تفاحة، وأن تشير إلى تفاحة وتقول "هذه تفاحة" (وربما تكرر هذه العملية أكثر من مرة حتى يتعلم الطفل). إلا أنه من المفاجئ -من وجهة نظر الآلة- أن الطفل سيكون قادرًا على التعرف على جميع أنواع وألوان وأشكال التفاح من خلال تعلمه شكل تفاحة واحدة فقط، وفي بعض الأحيان من زاوية رؤية واحدة (مثلما يحدث عندما تعرض صورة ما على طفلك وتعلمه ما يوجد بها). طفلٌ عبقري! هذا حتمًا ما ستقوله الآلة عن طفلك.
</p>

<p>
	إن الميزات التلقائية الموجودة في طفلك (وفي كلّ أطفال العالم)، والقادرة على تعميم التعلّم، واستنباط النموذج الخاص بأي كائن (مثل استنباط شكل التفاح في مثالنا السابق)، والعديد من الميزات الأخرى الّتي لم يسبق لنا تعلمها وإنما وجدناها مثبتة تلقائيًا في عقولنا للأسف لا تكون موجودة تلقائيًا في تعلّم الآلة. بل إن معظم خوارزميات تعلّم الآلة تحتاج للكثير من البيانات حتى تستطيع العمل بصورة صحيحة. وحتى بالنسبة لأبسط المشكلات على العقل، ستحتاج <a href="https://academy.hsoub.com/programming/advanced/%D8%A7%D9%84%D8%AE%D9%88%D8%A7%D8%B1%D8%B2%D9%85%D9%8A%D8%A7%D8%AA/" rel="">خوارزميات </a>تعلّم الآلة عادةً لآلاف الأمثلة الصحيحة كي تتعلّم، أما بالنسبة للمشكلات المعقدة مثل التعرف على الصور أو الكلام المنطوق، فغالبًا ما ستحتاج لملايين الأمثلة الصحيحة (باستثناء الحالات الّتي نستطيع فيها إعادة استخدام أجزاء من نموذج موجود).
</p>

<p>
	من الجدير بالذكر أنه للقاعدة السابقة بعض الاستثناءات إذ في بعض الحالات تكون كمية بيانات صغيرة نوعًا ما ولكن فعاليتها قوية وهذا يعود إلى عدة ميزات لهذه البيانات مثل:
</p>

<ol>
	<li>
		شمولية البيانات لكافة الحالات الممكنة للشيئ المدروس.
	</li>
	<li>
		عدم وجود ضجيج أو قيم فارغة أو شاذة.
	</li>
</ol>

<p>
	في الحقيقة إن هذه البيانات هي حلم لكل مهندسي تعلّم آلة. في <a data-ss1621157872="1" href="https://dl.acm.org/doi/epdf/10.3115/1073012.1073017" rel="external nofollow">بحث</a> مشهور نشر في عام 2001، أظهر باحثا مايكروسوفت ميشيل بانكو وإريك بريل أن خوارزميات تعلّم الآلة المختلفة جدًا ببنيتها وصعوبتها وطريقة تعاملها مع البيانات، ووحتى الخوارزميات البسيطة إلى حد ما، كان أداؤها متطابقًا تقريبًا عند حلها لمشكلة معقدة تنتدرج تحت مسائل معالجة اللغة الطبيعية (المحكية) وتوضيحها، وذلك بمجرد إعطاء هذه الخوارزميات البيانات الكافية فقط.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="51336" data-ss1621157872="1" href="https://academy.hsoub.com/uploads/monthly_2020_09/1.png.db669c6489b009afa789501172236b6e.png" rel=""><img alt="1.png" class="ipsImage ipsImage_thumbnailed" data-fileid="51336" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_09/1.png.db669c6489b009afa789501172236b6e.png"></a>
</p>

<p>
	نلاحظ من خلال الشكل السابق أهمية البيانات مقابل الخوارزميات. على حد تعبير المؤلفين: "تشير هذه النتائج إلى أننا قد نرغب في إعادة النظر في هذه المفاضلة بين إنفاق الوقت والمال على تطوير الخوارزمية مقابل إنفاقها على طريقة تطوير وتحسين البيانات".
</p>

<h2>
	بيانات التدريب المتحيزة
</h2>

<p>
	من الأهمية بمكان استخدام مجموعة تدريب تمثل جميع الحالات الّتي تريد التعميم عليها. غالبًا ما يكون هذا أصعب مما يبدو: وخصيصًا إذا كانت العينة صغيرة جدًا، فسيكون لديك ضوضاء في أخذ العينات (أي البيانات متحيّزة نتيجة للصدفة البحتة)، ولكن حتى العينات الكبيرة جدًا يمكن أن تكون متحيزة أيضًا إذا كانت المشكلة في طريقة تجميع البيانات (أخذ العينات). هذا يسمى <strong>تحيز آخذ العينات</strong>.
</p>

<p>
	من أحد <a data-ss1621157872="1" href="https://www.math.upenn.edu/~deturck/m170/wk4/lecture/case1.html" rel="external nofollow">الأمثلة</a> المشهورة في تحيز البيانات (العينات) وهو ما حدث أثناء الانتخابات الرئاسية الأمريكية عام 1936، والّتي تنافس فيها لاندون مقابل روزفلت: إذ أجرت مجلة The Literary Digest استطلاعًا كبيرًا جدًا، إذ أرسلت بريدًا لحوالي 10 ملايين شخص. تطلب منهم رأيهم في المرشح المناسب للرئاسة حصل هذا الاستطلاع على 2.4 مليون إجابة، وتوقع بثقة عالية أن لاندون سيحصل على 57٪ من الأصوات. ولكن كانت المفارقة عندما فاز روزفلت بنسبة 62٪ من الأصوات. <strong>ولكن كيف حدث ذلك؟</strong>
</p>

<p>
	في الحقيقة وبعد التدقيق في حيثيات الموضوع تبين أن العيب كان في طريقة تجميع البيانات (وتسمى أحيانًا طريقة أخذ العينات) وكانت المشاكل على الشكل التالي:
</p>

<ol>
	<li>
		<strong>البيانات (أو العينات) محصورة بفئة محددة من الشعب</strong>: حصلت المجلة على العناوين الأشخاص الّذين سترسل لهم الاستطلاع من خلال أدلة الهاتف، وقوائم المشتركين في المجلات، وقوائم عضوية الأندية، وما شابه من ذلك. ولكن من المُلاحظ أن جميع الأشخاص يندرجون تحت الطبقة الغنية من المجتمع، والّذين هم أكثر عُرضة للتصويت على المرشح الجمهوري (ومن هنا لاندون كان المرشح المثالي).
	</li>
	<li>
		<strong>نسبة عدد المشاركين</strong>: في الحصيلة الكلية للاستطلاع أجاب أقل من 25٪ من الناس الذين أرسل لهم الاستطلاع. وهذا تحيز في طريقة جمع البيانات، من خلال استبعاد الأشخاص الّذين لا يهتمون كثيرًا بالسياسة، والأشخاص الّذين لا يحبون الاشتراك في المجلة وما إلى ذلك. هذا هو نوع خاص من التحيز لأخذ العينات يسمى <strong>تحيز عدم الاستجابة</strong>.
	</li>
</ol>

<p>
	ولكن من ناحية أخرى، كيف يمكننا الحصول على مجموعة بيانات تدريب كبيرة وصحيحة وشاملة لكلّ الحالات؟ لا بد أن ذلك سيكلفنا الكثير من الوقت والجهد والمال!
</p>

<h2>
	البيانات ذات جودة ضعيفة
</h2>

<p>
	في حال كانت بيانات التدريب الخاصة بك مليئة بالأخطاء، والقيم المتطرفة، والضوضاء (التي يمكن أن تحدث بسبب القياسات ذات الجودة الضعيفة والمنخفضة)، فسيصعب على النظام اكتشاف الأنماط الأساسية، لذلك من غير المرجح أن يعمل نظامك بصورة جيدة. غالبًا ما يستثمر مهندسي وعلماء البيانات جهدهم ووقتهم في تنظيف بيانات التدريب في محاولة منهم للحصول على بيانات نستطيع من خلال تعليم الآلة. فمثلًا:
</p>

<ul>
	<li>
		إذا كانت بعض الأمثلة واضحة بأنها شاذة، فقد يكون من الأفضل تجاهلها أو محاولة إصلاح الأخطاء الموجودة بها يدويًا.
	</li>
	<li>
		إذا كانت بعض الحالات تفتقد بعض الميزات (على سبيل المثال، لم يحدد 5٪ من عملائك أعمارهم)، فيجب عليك أن تقرر ما إذا كنت تريد تجاهل هذه السمة تمامًا، أو تجاهل هذه الحالات بالمجمل، أو تريد ملء القيم المفقودة (بقيم مثل: متوسط أعمار العملاء، أو بأي طريقة أخرى تراها مناسبة لاستبدال القيم الفارغة)، أو يمكنك أيضًا تدريب نموذج واحد مع هذه الميزة ونموذج آخر بدونها والموازنة بين النتائج، وهكذا.
	</li>
</ul>

<h2>
	الميزات التي لا علاقة لها بالموضوع
</h2>

<p>
	يشاع قول في مجتمع العلمي لتعلم الآلة وهو: <strong>"المدخلات الخاطئة تؤدي حتمًا لمخرجات خاطئة"</strong> وهذه نقطة دقيقة جدًا. في الحقيقة إن الميزات الّتي لا علاقة لها بموضوع المسألة أو المشكلة لن توصلنا إلى النتائج المرجوة أبدًا، ولن يكون نظامك قادرًا على التعلّم إلا إذا كانت بيانات التدريب تحتوي على ميزات كافية وذات صِلة، وليس الكثير من الميزات الّتي لا علاقة لها بالموضوع. هذه الجزئية مهمة جدًا في نجاح مشروع التعلّم الآلة. ومن كثرة أهميتها أوجد بعض الباحثين مسمى خاص يتضمن كافة العمليات الّتي تندرج في هذا السياق وهي <strong><a data-ss1621157872="1" href="https://en.wikipedia.org/wiki/Feature_engineering#:~:text=Feature%20engineering%20is%20the%20process,as%20applied%20machine%20learning%20itself." rel="external nofollow">هندسة الميزات</a></strong>، وغالبًا ما تتضمن عمليات هذه الهندسة على ما يلي:
</p>

<ul>
	<li>
		<strong>اختيار الميزة</strong>: اختيار أكثر الميزات المفيدة والتي لها علاقة بالموضوع لتدريب الخوارزمية عليها من بين جميع الميزات الأخرى الموجودة.
	</li>
	<li>
		<strong>استخراج الميزات</strong>: دمج بعض الميزات الموجودة لإنتاج ميزة أكثر فائدة.
	</li>
	<li>
		<strong>إنشاء ميزات جديدة</strong>: إنشاء ميزات جديدة من خلال جلب بيانات جديدة.
	</li>
</ul>

<p>
	والآن بعد أن اطلعنا على العديد من الأمثلة على التحديات الّتي تواجهنا في طريقة التعامل مع البيانات، لنلقِ نظرة على بعض التحديات الّتي تواجهنا في طريقة تعاملنا مع الخوارزميات.
</p>

<h2>
	فرط تخصيص بيانات التدريب
</h2>

<p>
	لنفترض أنك تزور بلدًا أجنبيًا، واقدم سائق سيارة الأجرة على سرقتك. فغالبًا ما ستميل للقول بأن جميع سائقي سيارات الأجرة في ذلك البلد لصوص. في الواقع إن التعميم المفرط هو شيئ نقوم به نحن معشر البشر في كثير من الأحيان، وللأسف يمكن أن تقع الآلات في نفس الفخ إذا لم نكن حذرين. في تعلّم الآلة، يُطلق على هذه المشكلة اسم <strong>فرط التخصيص</strong> (Overfitting): وتشير هذه المشكلة إلى أن النموذج يؤدي عملًا جيدًا مع بيانات التدريب، ولكنه لا يستطيع أن يعمّم التعلّم على البيانات الجديدة.
</p>

<p>
	يحدث فرط التخصيص عندما يكون النموذج معقدًا جدًا بالنسبة لكمية بيانات التدريب وضجيجها. بعض الحلول الممكنة في هذه الحالة هي:
</p>

<ul>
	<li>
		تبسيط النموذج عن طريق تحديد نموذج بمعلمات أقل (فمثلًا، نختار نموذج خطي بدلًا من نموذج متعدد الحدود عالي الدرجة)، عن طريق تقليل عدد السمات في بيانات التدريب أو عن طريق تقييد النموذج.
	</li>
	<li>
		جمع المزيد من بيانات التدريب.
	</li>
	<li>
		تقليل الضوضاء في بيانات التدريب (مثل إجراء عملية إصلاح أخطاء البيانات وإزالة القيم المتطرفة وما إلى ذلك).
	</li>
</ul>

<h2>
	قلة تخصيص بيانات التدريب
</h2>

<p>
	إن <strong>قلة التخصيص</strong> (Underfitting) هو عكس فرط التخصيص: ويحدث ذلك عندما يكون نموذجك بسيطًا جدًا في طريقة تعرفه على البنية المخفية في البيانات. وإليك بعض الطرق الّتي تساعدنا على إصلاح هذه المشكلة هي:
</p>

<ul>
	<li>
		اختيار نموذج أكثر قوة، مع المزيد من الوسطاء (Parameters).
	</li>
	<li>
		تغذية النموذج بميزات أفضل لخوارزمية التعلّم (الاستعانة بمختص هندسة الميزات).
	</li>
	<li>
		تقليل القيود على النموذج.
	</li>
</ul>

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

<h2>
	عملية الاختبار والتحقق
</h2>

<p>
	إحدى الطرق المستخدمة لمعرفة مدى تعميم نموذج على الحالات الجديدة هي بتجربته مباشرة على الحالات الجديدة. وذلك بنشر النموذج للمستخدمين ومراقبة مدى جودة أدائه. يمكن أن يكون هذا الخيار جيدًا، ولكن تعسفيًا جدًا لأنه إذا كان النموذج الخاص بك سيئًا للغاية، فحتمًا سيشتكي المستخدمون منه - لذا فهذا الخيار مستبعد.
</p>

<p>
	الخيار الأفضل هو تقسيم بياناتك إلى مجموعتين: <strong>مجموعة للتدريب</strong> و<strong>مجموعة للاختبار</strong>. كما تلاحظ من الأسماء، يتدرب النموذج الخاص بك من خلال مجموعة التدريب، ويختبر ما تعلمه على مجموعة الاختبار. يسمى معدل الخطأ في الحالات الجديدة <strong>خطأ التعميم</strong>، ومن خلال تقييم نموذجك في مجموعة الاختبار، تحصل على تقدير لهذا الخطأ. تخبرك هذه القيمة بمدى جودة أداء نموذجك في الحالات الّتي لم يراها من قبل.
</p>

<p>
	من الشائع استخدام 80٪ من البيانات لمجموعة بيانات التدريب (Training) و20٪ لمجموعة بيانات الاختبار (Testing). كما أنه يوجد العديد من الطرق الأخرى للتقسيم مثل طريقة تقسيم البيانات إلى ثلاث مجموعات: <strong>مجموعة للتدريب</strong>، <strong>مجموعة للاختبار</strong>، ومجموعة للتحقق (Validation) والّتي تستخدم لاختيار أفضل الإعدادات لخوارزميات تعلّم الآلة. (مثلًا لاختيار hyper-parameters). ولكي لا يخرج الكتاب عن عنوانه الرئيسي سنكتفي بهذه الطرق مبدأيًا وسنحاول التطرق لها لاحقًا بالتفاصيل الكاملة عند ورودها.
</p>

<h2>
	المفاهيم الضرورية للتوسع بمجال تعلم الآلة
</h2>

<p>
	إلى الآن لا نزال في طور الحديث عن مدخل بسيط لمجال تعلّم الآلة ولا بدّ أنك تسأل نفسك ماذا لو أردت أن أحترف هذا المجال؟ <strong>ما الّذي يتوجب علي تعلمه من المجالات الأخرى مثل الإحصاء والرياضيات؟</strong> <strong>هل فعلًا يمكنني إكمال طريقي في هذا المجال بدون أن أتعلم المفاهيم الأساسية في الإحصاء والرياضيات؟</strong>
</p>

<p>
	في الحقيقة لا يوجد إجابة موحدة لهذا السؤال لنستطيع فيها تعميم الأمر على كلّ المتعلمين، وذلك لأن الأمر مرهون بمدى سرعتك في التعلم وخلفيتك العلمية السابقة، فبعض المتعلمين يستطيعون الدخول في هذا المجال إذا كانوا قادمين من هندسة علوم الحاسب بسهولة نسبية وبدون أن يطلعوا على المفاهيم الرياضية والإحصائية؛ لأنهم غالبًا تعلموها أثناء دراستهم للهندسة، والبعض الأخر من المتعلمين لديهم سرعة بديهة عالية وشغف قوي لهذا المجال فيتعلمون الفكرة الإحصائية أو الرياضية بمجرد تطبيقهم لها في مثال ما. لذا فإن الأمر يعتمد اعتمادًا كليًا عليك، ولكن ولكي لا نبقِ للكسول أية حجة سنستعرض أهم الأفكار الرئيسية الّتي يتوجب عليك معرفتها قبل إكمال رحلتك التعليمية.
</p>

<p>
	سنعتمد على نفس <a data-ss1621157872="1" href="https://developers.google.com/machine-learning/crash-course/prereqs-and-prework#prerequisites" rel="external nofollow">الركائز</a> الّتي تتبناها شركة غوغل أثناء عند تعليمها للمبتدئين في هذا المجال.
</p>

<p>
	<strong>ملاحظة</strong>: أغلب المراجع باللغة الإنكليزية.
</p>

<h3>
	المتطلبات المعرفية الأساسية
</h3>

<p>
	عمومًا يفضل أن يكون لديك معرفة جيدة للمتغيرات والمعادلات الخطية والرسوم البيانية (Graphs) للدوال والتوابع والمخططات أو المُدجات البيانية (Histograms) والوسائل الإحصائية. بالإضافة إلى ذلك من الناحية المثالية يجب أن تكون إمكانياتك البرمجية جيدة إلى حد ما. كما يفضل أن تكون لك معرفة بلغات البرمجة الخاصة بتعلم الآلة (مثل لغة البايثون ولغة R). إلا أنه إذا لم يكن لديك معرفة بها فلا بأس بذلك إذ يمكنك تعلم الأساسيات فقط وإكمال طريقك في تعلّم الآلة.
</p>

<h3>
	الجبر
</h3>

<ul>
	<li>
		<a data-ss1621157872="1" href="https://www.khanacademy.org/math/algebra/introduction-to-algebra/alg1-intro-to-variables/v/what-is-a-variable" rel="external nofollow">المتغيرات الرياضية</a>، <a data-ss1621157872="1" href="https://www.khanacademy.org/math/cc-sixth-grade-math/cc-6th-equivalent-exp/cc-6th-parts-of-expressions/v/expression-terms-factors-and-coefficients" rel="external nofollow">المعاملات الرياضية</a> و<a data-ss1621157872="1" href="https://www.khanacademy.org/math/algebra/algebra-functions" rel="external nofollow">الدوال الرياضية</a>.
	</li>
	<li>
		<a data-ss1621157872="1" href="https://wikipedia.org/wiki/Linear_equation" rel="external nofollow">المعادلات الخطية</a>.
	</li>
	<li>
		<a data-ss1621157872="1" href="https://wikipedia.org/wiki/Logarithm" rel="external nofollow">اللوغاريتمات</a>، والمُعادلات اللوغاريتمية.
	</li>
	<li>
		<a data-ss1621157872="1" href="https://wikipedia.org/wiki/Sigmoid_function" rel="external nofollow">الدالة السينية</a>.
	</li>
</ul>

<h3>
	الجبر الخطي
</h3>

<ul>
	<li>
		<a data-ss1621157872="1" href="https://ar.wikipedia.org/wiki/%D9%85%D9%88%D8%AA%D8%B1" rel="external nofollow">الموتر</a> (tensor)، و<a data-ss1621157872="1" href="https://www.tensorflow.org/programmers_guide/tensors" rel="external nofollow">رتبة الموتر</a>.
	</li>
	<li>
		<a data-ss1621157872="1" href="https://wikipedia.org/wiki/Matrix_multiplication" rel="external nofollow">ضرب المصفوفات</a>.
	</li>
</ul>

<h3>
	علم المثلثات
</h3>

<ul>
	<li>
		دالة الظل الزائدية tanh، نتعرف عليها باعتبارها دالة التنشيط ولا حاجة لمعرفة متعمقة بها.
	</li>
</ul>

<h3>
	الإحصاء
</h3>

<ul>
	<li>
		<a data-ss1621157872="1" href="https://www.khanacademy.org/math/probability/data-distributions-a1/summarizing-center-distributions/v/mean-median-and-mode" rel="external nofollow">المتوسط، والوسيط، والقيم المتطرفة أو الشاذة</a>، والانحراف المعياري.
	</li>
	<li>
		القدرة على قراءة المخططات والتدرجات البيانية.
	</li>
</ul>

<h3>
	أساسيات البرمجة ولتكن بلغة بايثون
</h3>

<p>
	عمومًا يجب أن نتعلم المفاهيم الأساسية لأي لغة برمجة وسنضرب مثلًا عن لغة البايثون:
</p>

<ul>
	<li>
		<p>
			كتاب <a data-ss1621157872="1" href="https://academy.hsoub.com/files/15-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A8%D9%84%D8%BA%D8%A9-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86/" rel="">البرمجة بلغة بايثون</a>.
		</p>
	</li>
	<li>
		<p>
			توثيق <a data-ss1621157872="1" href="https://wiki.hsoub.com/Python" rel="external">لغة بايثون</a>.
		</p>
	</li>
</ul>

<p>
	فالمواضيع الأساسية التي يجب أن تتقنها (والمشمولة بالمرجعين السابقين) هي:
</p>

<ul>
	<li>
		<p>
			تعريف التوابع وكيفية استدعائها، وكيفية استخدام الطرق المختلفة للمعاملات.
		</p>
	</li>
	<li>
		<p>
			أنواع البيانات وأهمها القواميس Dictionaries، القوائم Lists، المجموعات Sets، وطرق (إنشائها والوصول إليها وكيفية المرور عليها).
		</p>
	</li>
	<li>
		<p>
			الحلقات التكرارية بأنواعها.
		</p>
	</li>
	<li>
		<p>
			الكتل الشرطية، والتعابير الشرطية.
		</p>
	</li>
	<li>
		<p>
			تنسيق السلاسل النصية.
		</p>
	</li>
	<li>
		<p>
			المتغيرات، وطرق الإسناد، وأنواع البيانات الأساسية.
		</p>
	</li>
	<li>
		<p>
			فهم كيفية استعمال list comprehensions (متقدم واختياري).
		</p>
	</li>
</ul>

<h3>
	التعامل مع الطرفية المحلية والسحابية
</h3>

<p>
	لتشغيل تمارين البرمجة على جهازك المحلي أو في وحدة تحكم سحابية، يجب أن تتعلم كيفية العمل مع كلّ طرفية:
</p>

<ul>
	<li>
		<a data-ss1621157872="1" href="https://wiki.hsoub.com/Bash" rel="external">توثيق الطرفية Bash</a>.
	</li>
	<li>
		<a data-ss1621157872="1" href="https://academy.hsoub.com/devops/linux/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%B7%D8%B1%D9%81%D9%8A%D9%91%D8%A9-%D9%84%D9%8A%D9%86%D9%83%D8%B3-linux-terminal-r18/" rel="">مدخل إلى طرفية لينكس</a>.
	</li>
	<li>
		<a data-ss1621157872="1" href="https://academy.hsoub.com/tags/%D9%85%D8%AF%D8%AE%D9%84%20%D8%A5%D9%84%D9%89%20%D9%83%D8%AA%D8%A7%D8%A8%D8%A9%20%D8%B3%D9%83%D8%B1%D8%A8%D8%AA%D8%A7%D8%AA%20%D8%A7%D9%84%D8%B5%D8%AF%D9%81%D8%A9/" rel="">سلسلة مدخل إلى كتابة سكربتات الصدفة</a>.
	</li>
</ul>

<h3>
	حساب التفاضل والتكامل (اختياري) للمواضيع المتقدمة
</h3>

<ul>
	<li>
		مفهوم الاشتقاق (لن تضطر إلى حسابه وإنما لفكرته).
	</li>
	<li>
		<a data-ss1621157872="1" href="https://www.khanacademy.org/math/multivariable-calculus/multivariable-derivatives/gradient-and-directional-derivatives/v/gradient" rel="external nofollow">التدرج</a> أو الانحدار.
	</li>
	<li>
		<a data-ss1621157872="1" href="https://wikipedia.org/wiki/Partial_derivative" rel="external nofollow">الاشتقاق الجزئي</a> (التي ترتبط ارتباطًا وثيقًا بالتدرجات أو الإنحدار).
	</li>
	<li>
		<a data-ss1621157872="1" href="https://wikipedia.org/wiki/Chain_rule" rel="external nofollow">قاعدة السلسلة Chain rule</a> (من أجل فهم كامل وشامل لخوارزمية backpropagation المختصة بتدريب الشبكات العصبية).
	</li>
</ul>
<div class="banner-container ipsBox ipsPadding">
    <div class="inner-banner-container">
            <p class="banner-heading">
                    دورة الذكاء الاصطناعي
            </p>



            <p class="banner-subtitle">
        احترف برمجة الذكاء الاصطناعي AI وتحليل البيانات وتعلم كافة المعلومات التي تحتاجها لبناء نماذج ذكاء اصطناعي متخصصة.
            </p>

            <div>
                    <a class="ipsButton ipsButton_large ipsButton_primary ipsButton_important" href="https://academy.hsoub.com/learn/artificial-intelligence" rel="">اشترك الآن</a>
            </div>
    </div>
<div class="banner-img"> <a href="https://academy.hsoub.com/learn/artificial-intelligence" rel=""><img alt="دورة الذكاء الاصطناعي AI" src="https://academy.hsoub.com/learn/assets/images/courses/artificial-intelligence.png"></a></div>
</div>
<h2>
	الخلاصة
</h2>

<p>
	والآن بعد أن تعرفنا على الكثير من الأفكار حول تعلّم الآلة. قد يراودك شعور بأنك مشوشٌ بعض الشيء وهذا أمر طبيعي جدًا يفضل أن تراجع الفقرات الّتي تعتقد بأنك لم تركز عليها كثيرًا أو يمكنك ببساطة التركيز على ما يهمك من هذا الكتاب فقط، وعمومًا لنراجع أبرز ما تحدثنا عنه، ونلقي نظرة على الصورة الكاملة للأمر، عمومًا تكون خطوات بناء أي نظام يعتمد على تعلّم الآلة على الشكل التالي:
</p>

<ol>
	<li>
		<strong>جمع البيانات وإعدادها</strong>: كلّ شيء بدءًا من اختيار مكان الحصول على البيانات، مع التركيز على مدى نظافتها وشموليتها.
	</li>
	<li>
		<strong>اختيار الميزات المناسبة</strong>: وتعرف أيضًا بهندسة الميزات وهي جميع التغييرات الّتي تطرأ على البيانات من لحظة تنظيفها وإعادة بنائها في بعض الحالات إلى حين إدخالها في نموذج تعلّم الآلة.
	</li>
	<li>
		<strong>اختيار خوارزمية تعلّم الآلة المناسبة وتدريب نموذجنا الأول</strong>.
	</li>
	<li>
		<strong>اختبار وتقييم نموذجنا</strong>: ويشمل ذلك اختيار المقاييس المناسبة إلى جانب التقييم الفعلي.
	</li>
	<li>
		<strong>التغيير والتبديل للنماذج وضبطها</strong>: تشمل عملية تحسين النموذج إلى أقصى حد ممكن.
	</li>
</ol>

<p>
	ولا ننسَ أيضًا بعض الملاحظات الأخرى المهمة:
</p>

<ul>
	<li>
		تعلّم الآلة يتعلق بجعل الآلات تتحسن بأداء بعض المهام من خلال تعلّمها من البيانات، بدلًا من الاضطرار إلى ترميز القواعد بشكل صريح.
	</li>
	<li>
		هناك العديد من الأنواع المختلفة لأنظمة تعلّم الآلة لا يمكننا أبدًا الإدعاء بأنه يوجد طريقة أفضل من جميع الطرق الأخرى في جميع الحالات، فهذا الإدعاء خاطئ تمامًا. إذ يعتمد الأمر كله على الحالة الّتي تواجهها فمثلًا يمكنك الأخذ بعين الاعتبار على البيانات أولًا، وعلى ما نريد من الآلة أن تتعلمه منها ثانيًا والسرعة المطلوبة للخوارزمية ثالثًا وما إلى ذلك من المحددات.
	</li>
	<li>
		من الأفضل دومًا أن تناقش كيفية التغلب على التحديات الموجودة في البيانات و<a data-ss1621157872="1" href="https://wiki.hsoub.com/Algorithms" rel="external">الخوارزميات</a> لأن ذلك سوف يختصر عليك الكثير من الوقت والجهد، والمال!
	</li>
</ul>

<p>
	إلى هنا نكون انتهينا من جميع الأفكار الأساسية لهذا المجال، <a data-ss1621157872="1" href="https://academy.hsoub.com/tags/%D9%85%D8%AF%D8%AE%D9%84%20%D9%84%D9%84%D8%B0%D9%83%D8%A7%D8%A1%20%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A/" rel="">الذكاء الاصطناعي وتعلم الآلة</a>، فأرجو أنك حظيت برحلة ممتعة وشيّقة، وأسأل الله أن أكون قد وفقت في نقل المعلومات الأساسية والكاملة لهذا المجال بطريقة سهلة ومبسطة، وأتمنى بأن تساعدك هذه السلسلة على تحديد وجهتك القادمة.
</p>

<p>
	وأخيرًا قد تكون هذه هي النهاية بالنسبة لهذه السلسلة، ولكنها حتمًا بداية الرحلة بالنسبة لك : )
</p>

<h2>
	المراجع
</h2>

<ul>
	<li>
		كتاب Hands on Machine Learning with Scikit Learn Keras and TensorFlow الطبعة الثانية.
	</li>
	<li>
		<a data-ss1621157872="1" href="https://developers.google.com/machine-learning/crash-course/prereqs-and-prework#prerequisites" rel="external nofollow">الدورة التدريبية لتعلم الآلة المقدمة من غوغل</a>
	</li>
</ul>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال السابق: <a data-ss1621157872="1" href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D9%84%D9%85%D9%81%D8%A7%D9%87%D9%8A%D9%85-%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A9-%D9%84%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9-r1009/" rel="">المفاهيم الأساسية لتعلم الآلة</a>
	</li>
	<li>
		النسخة الكاملة من كتاب <a data-ss1621157872="1" href="https://academy.hsoub.com/files/17-%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A7%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A-%D9%88%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9/" rel="">مدخل إلى الذكاء الاصطناعي وتعلم الآلة</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1010</guid><pubDate>Tue, 29 Sep 2020 18:03:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x645;&#x641;&#x627;&#x647;&#x64A;&#x645; &#x627;&#x644;&#x623;&#x633;&#x627;&#x633;&#x64A;&#x629; &#x644;&#x62A;&#x639;&#x644;&#x645; &#x627;&#x644;&#x622;&#x644;&#x629;</title><link>https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D9%84%D9%85%D9%81%D8%A7%D9%87%D9%8A%D9%85-%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A9-%D9%84%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9-r1009/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2020_09/3.png.2198920995da6b17d661b0d7476c92ed.png" /></p>
<p>
	هذا المقال جزء من سلسلة «مدخل إلى الذكاء الاصطناعي»:
</p>

<ul>
	<li>
		<a data-ss1621157876="1" data-ss1628757407="1" href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A-%D8%A3%D9%87%D9%85-%D8%A7%D9%84%D8%A5%D9%86%D8%AC%D8%A7%D8%B2%D8%A7%D8%AA-%D9%88%D8%A7%D9%84%D8%A7%D8%AE%D8%AA%D8%B1%D8%A7%D8%B9%D8%A7%D8%AA-%D9%88%D9%83%D9%8A%D9%81-%D8%A3%D8%AB%D8%B1%D8%AA-%D9%81%D9%8A-%D8%AD%D9%8A%D8%A7%D8%AA%D9%86%D8%A7-%D8%A7%D9%84%D9%8A%D9%88%D9%85%D9%8A%D8%A9-r975/" rel="">الذكاء الاصطناعي: أهم الإنجازات والاختراعات وكيف أثرت في حياتنا اليومية</a>
	</li>
	<li>
		<a data-ss1621157876="1" data-ss1628757407="1" href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A-%D9%85%D8%B1%D8%A7%D8%AD%D9%84-%D8%A7%D9%84%D8%A8%D8%AF%D8%A1-%D9%88%D8%A7%D9%84%D8%AA%D8%B7%D9%88%D8%B1-%D9%88%D8%A7%D9%84%D8%A3%D8%B3%D8%B3-%D8%A7%D9%84%D8%AA%D9%8A-%D9%86%D8%B4%D8%A3-%D8%B9%D9%84%D9%8A%D9%87%D8%A7-r988/" rel="">الذكاء الاصطناعي: مراحل البدء والتطور والأسس التي نشأ عليها</a>
	</li>
	<li>
		المفاهيم الأساسية لتعلم الآلة
	</li>
	<li>
		<a data-ss1621157876="1" data-ss1628757407="1" href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9-%D8%A7%D9%84%D8%AA%D8%AD%D8%AF%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%B1%D8%A6%D9%8A%D8%B3%D9%8A%D8%A9-%D9%88%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A7%D9%84%D8%AA%D9%88%D8%B3%D8%B9-%D9%81%D9%8A-%D8%A7%D9%84%D9%85%D8%AC%D8%A7%D9%84-r1010/" rel="">تعلم الآلة: التحديات الرئيسية وكيفية التوسع في المجال</a>
	</li>
	<li>
		يمكنك قراءة السلسلة على شكل كتاب إلكتروني بالانتقال إلى صفحة الكتاب، <a data-ss1621157876="1" data-ss1628757407="1" href="https://academy.hsoub.com/files/17-%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A7%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A-%D9%88%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9/" rel="">مدخل إلى الذكاء الاصطناعي وتعلم الآلة</a>.
	</li>
</ul>

<p>
	إن سبق وحاولت قراءة أي مقالٍ على الإنترنت يتحدث عن تعلّم الآلة، فلا بدّ من أنك عثرت على نوعين من المقالات؛ فإما أن تكون سميكة وأكاديمية ومليئة بالنظريات (عن نفسي لم أستطع حتى تجاوز نصف مقال)، أو عن القصص الخيالية المريبة حول سيطرة الذكاء الصنعي على البشر، أو منهم من يتحدث عن البيانات وتأثيرها الساحر على مجالات العلوم الأخرى أو البعض الآخر من المقالات يتحدث عن كيفية تغيّر وظائف المستقبل. لم يكن هنالك أي كتاب يضعني على بداية الطريق لكي أتعلم أبسط الأساسيات لأنتقل بعدها إلى المفاهيم المعقدة واثق الخطى.
</p>

<p>
	لذا كان لا بدّ لي من كتابة مقالٍ بسيط ومفهوم وواقعي لطالما تمنيت وجوده. سيكون هذا المقال مقدمة بسيطة لأولئك الّذين أرادوا دومًا فهم طريقة عمل مجال تعلّم الآلة. بتطبيق أفكاره على أمثلة من مشاكل العالم الحقيقي، والحلول العملية المطبقة، بلغة بسيطة ومفهومة، وتجنب النظريات الصعبة قدر الإمكان. ليستطيع الجميع فهم ماهيّة هذا العِلم سواءً أكانوا مبرمجين أو مدراء بل وحتى لأي شخص كان.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="51280" data-ss1621157876="1" data-ss1628757407="1" href="https://academy.hsoub.com/uploads/monthly_2020_09/1.png.451f8d47e2210d67a265477659bec513.png" rel=""><img alt="1.png" class="ipsImage ipsImage_thumbnailed" data-fileid="51280" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_09/1.thumb.png.4e9b24a662f2cbf8efae2cd450fff0dc.png"></a>
</p>

<h2>
	فهرس المحتويات
</h2>

<ul>
	<li>
		<a data-ss1621157876="1" data-ss1628757407="1" href="#%D9%84%D9%85%D8%A7%D8%B0%D8%A7-%D9%86%D8%B1%D9%8A%D8%AF-%D9%85%D9%86-%D8%A7%D9%84%D8%A2%D9%84%D8%A7%D8%AA-%D8%A3%D9%86-%D8%AA%D8%AA%D8%B9%D9%84%D9%85%D8%9F" rel="">لماذا نريد من الآلات أن تتعلم؟</a>
	</li>
	<li>
		<a data-ss1621157876="1" data-ss1628757407="1" href="#%D8%A7%D9%84%D9%85%D9%83%D9%88%D9%86%D8%A7%D8%AA-%D8%A7%D9%84%D8%B1%D8%A6%D9%8A%D8%B3%D9%8A%D8%A9-%D9%84%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9" rel="">المكونات الرئيسية لتعلم الآلة</a>
		<ul>
			<li>
				<a data-ss1621157876="1" data-ss1628757407="1" href="#%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA" rel="">1. البيانات (Data)</a>
			</li>
			<li>
				<a data-ss1621157876="1" data-ss1628757407="1" href="#%D8%A7%D9%84%D9%85%D9%8A%D8%B2%D8%A7%D8%AA" rel="">2. الميّزات (Features)</a>
			</li>
			<li>
				<a data-ss1621157876="1" data-ss1628757407="1" href="#%D8%A7%D9%84%D8%AE%D9%88%D8%A7%D8%B1%D8%B2%D9%85%D9%8A%D8%A7%D8%AA" rel="">3. الخوارزميات (Algorithms)</a>
			</li>
		</ul>
	</li>
	<li>
		<a data-ss1621157876="1" data-ss1628757407="1" href="#%D8%A7%D9%84%D9%81%D8%B1%D9%82-%D8%A8%D9%8A%D9%86-%D8%A7%D9%84%D8%AA%D8%B9%D9%84%D9%85-%D9%88%D8%A7%D9%84%D8%B0%D9%83%D8%A7%D8%A1" rel="">الفرق بين التعلم (Learning) والذكاء (Intelligence)</a>
	</li>
	<li>
		<a data-ss1621157876="1" data-ss1628757407="1" href="#%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9-%D8%A7%D9%84%D8%AA%D9%82%D9%84%D9%8A%D8%AF%D9%8A" rel="">تعلم الآلة التقليدي</a>
		<ul>
			<li>
				<a data-ss1621157876="1" data-ss1628757407="1" href="#%D8%A7%D9%84%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D9%85%D9%88%D8%AC%D9%87" rel="">التعلم الموجه (Supervised Learning)</a>
				<ul>
					<li>
						<a data-ss1621157876="1" data-ss1628757407="1" href="#%D8%A7%D9%84%D8%AA%D8%B5%D9%86%D9%8A%D9%81" rel="">التصنيف (Classification)</a>
					</li>
					<li>
						<a data-ss1621157876="1" data-ss1628757407="1" href="#%D8%A3%D8%B4%D8%AC%D8%A7%D8%B1-%D8%A7%D9%84%D9%82%D8%B1%D8%A7%D8%B1" rel="">أشجار القرار (Decision Trees)</a>
					</li>
					<li>
						<a data-ss1621157876="1" data-ss1628757407="1" href="#%D8%A7%D9%84%D8%A7%D9%86%D8%AD%D8%AF%D8%A7%D8%B1" rel="">الانحدار (Regression)</a>
					</li>
				</ul>
			</li>
			<li>
				<a data-ss1621157876="1" data-ss1628757407="1" href="#%D8%A7%D9%84%D8%AA%D8%B9%D9%84%D9%85-%D8%BA%D9%8A%D8%B1-%D8%A7%D9%84%D9%85%D9%88%D8%AC%D9%87" rel="">التعلم غير الموجه (Unsupervised learning)</a>
			</li>
		</ul>
	</li>
	<li>
		<a data-ss1621157876="1" data-ss1628757407="1" href="#%D8%A7%D9%84%D8%AA%D8%AC%D9%85%D9%8A%D8%B9" rel="">التجميع (Clustering)</a>
		<ul>
			<li>
				<a data-ss1621157876="1" data-ss1628757407="1" href="#%D8%AE%D9%88%D8%A7%D8%B1%D8%B2%D9%85%D9%8A%D8%A9-K-mean" rel="">خوارزمية K-mean</a>
			</li>
			<li>
				<a data-ss1621157876="1" data-ss1628757407="1" href="#%D8%AE%D9%88%D8%A7%D8%B1%D8%B2%D9%85%D9%8A%D8%A9-DBSCAN" rel="">خوارزمية DBSCAN</a>
			</li>
			<li>
				<a data-ss1621157876="1" data-ss1628757407="1" href="#%D8%AA%D9%82%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D8%A3%D8%A8%D8%B9%D8%A7%D8%AF" rel="">تقليل الأبعاد (Dimensionality Reduction)</a>
			</li>
			<li>
				<a data-ss1621157876="1" data-ss1628757407="1" href="#%D8%AA%D8%B9%D9%84%D9%85-%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%D8%A7%D9%84%D8%B1%D8%A8%D8%B7" rel="">تعلم قواعد الربط (Association Rule Learning)</a>
			</li>
		</ul>
	</li>
	<li>
		<a data-ss1621157876="1" data-ss1628757407="1" href="#%D8%A7%D9%84%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D9%85%D8%B9%D8%B2%D8%B2" rel="">التعلم المعزز (Reinforcement Learning)</a>
		<ul>
			<li>
				<a data-ss1621157876="1" data-ss1628757407="1" href="#%D8%B7%D8%B1%D9%8A%D9%82%D8%A9-%D8%A7%D9%84%D9%85%D8%AC%D9%85%D9%88%D8%B9%D8%A7%D8%AA" rel="">طريقة المجموعات</a>
				<ul>
					<li>
						<a data-ss1621157876="1" data-ss1628757407="1" href="#%D8%B7%D8%B1%D9%8A%D9%82%D8%A9-%D8%A7%D9%84%D8%AA%D9%83%D8%AF%D9%8A%D8%B3" rel="">1. طريقة التكديس (Stacking)</a>
					</li>
					<li>
						<a data-ss1621157876="1" data-ss1628757407="1" href="#%D8%B7%D8%B1%D9%8A%D9%82%D8%A9-%D8%A7%D9%84%D8%AA%D8%B9%D8%A8%D8%A6%D8%A9" rel="">2. طريقة التعبئة (Bagging)</a>
					</li>
					<li>
						<a data-ss1621157876="1" data-ss1628757407="1" href="#%D8%B7%D8%B1%D9%8A%D9%82%D8%A9-%D8%A7%D9%84%D8%AA%D8%B9%D8%B2%D9%8A%D8%B2" rel="">3. طريقة التعزيز (Boosting)</a>
					</li>
				</ul>
			</li>
		</ul>
	</li>
	<li>
		<a data-ss1621157876="1" data-ss1628757407="1" href="#%D8%A7%D9%84%D8%B4%D8%A8%D9%83%D8%A7%D8%AA-%D8%A7%D9%84%D8%B9%D8%B5%D8%A8%D9%8A%D8%A9-%D9%88%D8%A7%D9%84%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%B9%D9%85%D9%8A%D9%82" rel="">الشبكات العصبية (Neural Networks) والتعلم العميق (Deep Leaning)</a>
		<ul>
			<li>
				<a data-ss1621157876="1" data-ss1628757407="1" href="#%D8%A7%D9%84%D8%B4%D8%A8%D9%83%D8%A7%D8%AA-%D8%A7%D9%84%D8%B9%D8%B5%D8%A8%D9%8A%D8%A9" rel="">الشبكات العصبية (Neural Networks)</a>
				<ul>
					<li>
						<a data-ss1621157876="1" data-ss1628757407="1" href="#%D8%A7%D9%84%D8%B4%D8%A8%D9%83%D8%A7%D8%AA-%D8%A7%D9%84%D8%B9%D8%B5%D8%A8%D9%8A%D8%A9-%D8%A7%D9%84%D8%AA%D9%84%D8%A7%D9%81%D9%8A%D9%81%D9%8A%D8%A9" rel="">الشبكات العصبية التلافيفية (Convolutional Neural Networks)</a>
					</li>
					<li>
						<a data-ss1621157876="1" data-ss1628757407="1" href="#%D8%A7%D9%84%D8%B4%D8%A8%D9%83%D8%A7%D8%AA-%D8%A7%D9%84%D8%B9%D8%B5%D8%A8%D9%8A%D8%A9-%D8%A7%D9%84%D9%85%D8%AA%D9%83%D8%B1%D8%B1%D8%A9" rel="">الشبكات العصبية المتكررة (Recurrent Neural Networks)</a>
					</li>
				</ul>
			</li>
			<li>
				<a data-ss1621157876="1" data-ss1628757407="1" href="#%D8%A7%D9%84%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%B9%D9%85%D9%8A%D9%82" rel="">التعلم العميق (Deep Learning)</a>
			</li>
			<li>
				<a data-ss1621157876="1" data-ss1628757407="1" href="#%D8%A7%D9%84%D9%81%D8%B1%D9%82-%D8%A8%D9%8A%D9%86-%D8%A7%D9%84%D8%B4%D8%A8%D9%83%D8%A7%D8%AA-%D8%A7%D9%84%D8%B9%D8%B5%D8%A8%D9%8A%D8%A9-%D9%88%D8%A7%D9%84%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%B9%D9%85%D9%8A%D9%82" rel="">الفرق بين الشبكات العصبية والتعلم العميق</a>
			</li>
		</ul>
	</li>
	<li>
		<a data-ss1621157876="1" data-ss1628757407="1" href="#%D8%A7%D9%84%D8%AE%D9%84%D8%A7%D8%B5%D8%A9" rel="">الخلاصة</a>
	</li>
	<li>
		<a data-ss1621157876="1" data-ss1628757407="1" href="#%D8%A7%D9%84%D9%85%D8%B1%D8%A7%D8%AC%D8%B9" rel="">المراجع</a>
	</li>
</ul>

<p>
	وإليك المخطط الرئيسي للمواضيع التي سنتناولها في هذه المقالة ملخصة بالصورة التالية:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="51287" data-ss1621157876="1" data-ss1628757407="1" href="https://academy.hsoub.com/uploads/monthly_2020_09/6.png.d96f3226db2acb414236ff6e128609a9.png" rel=""><img alt="6.png" class="ipsImage ipsImage_thumbnailed" data-fileid="51287" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_09/6.thumb.png.6a4fe34ee6523bc86dd869743727a863.png"></a>
</p>

<h2 id="لماذا-نريد-من-الآلات-أن-تتعلم؟">
	لماذا نريد من الآلات أن تتعلم؟
</h2>

<p>
	هذا صديقنا أحمد يريد شراء سيارة ويحاول حساب مقدار مبلغ المال الّذي سيحتاجُ لتوفيره شهريًا. واستعرض عشرات الإعلانات على الإنترنت وعلم بأن السيارات الجديدة يبلغ سعرها حوالي 20000 دولار، والسيارات المستعملة لعام واحد يبلغ سعرها 19000 دولار، والمستعملة لعامين يبلغ سعرها 18000 دولار وهكذا دواليك.
</p>

<p>
	يبدأ أحمد -محللنا الرائع- بملاحظة نمط معين لسعر السيارات؛ إذ يعتمد سعر السيارة على مدة استخدامها، وينخفض سعرها بمقدار 1000 دولار مقابل كلّ عام من عمرها، لكن سعرها لن ينخفض أقل من 10000 دولار.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="51281" data-ss1621157876="1" data-ss1628757407="1" href="https://academy.hsoub.com/uploads/monthly_2020_09/2.png.a45834df266196ddef221a9eb7c8f3c0.png" rel=""><img alt="2.png" class="ipsImage ipsImage_thumbnailed" data-fileid="51281" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_09/2.png.a45834df266196ddef221a9eb7c8f3c0.png"></a>
</p>

<p>
	في هذه الحالة وطبقًا لمصطلحات <strong>تعلّم الآلة</strong> يكون أحمد قد ابتكر ما يُعرفُ <strong>بالانحدار</strong> (Regression): وهي طريقة لتوقع قيمة (أو سعر) معيّن على أساس بيانات قديمة معروفة. أغلب الناس تؤدي هذا الأمر طوال الوقت دون أن تشعر به، فمثلًا عند محاولتنا لتقدير السعر المعقول لجهاز أيفون مستعمل على موقع eBay، أو أثناء محاولتنا معرفة وزن اللحوم المناسب والكافي لبلوغ حدّ الشبع لكلّ شخص من المدعوين على عزومة الغداء. فعندها سنبدأ بتقدير الأمر ونسأل أنفسنا، هل 200 غرام كافي للشخص؟ أم 500 غرام أفضل؟ سواءً اعترفنا بذلك أم لا، أغلبنا يؤدي هذه المهمة لا شعوريًا.
</p>

<div class="banner-container ipsBox ipsPadding">
	<div class="inner-banner-container">
		<p class="banner-heading">
			دورة الذكاء الاصطناعي
		</p>

		<p class="banner-subtitle">
			احترف برمجة الذكاء الاصطناعي AI وتحليل البيانات وتعلم كافة المعلومات التي تحتاجها لبناء نماذج ذكاء اصطناعي متخصصة.
		</p>

		<div>
			<a class="ipsButton ipsButton_large ipsButton_primary ipsButton_important" href="https://academy.hsoub.com/learn/artificial-intelligence" rel="">اشترك الآن</a>
		</div>
	</div>

	<div class="banner-img">
		<a href="https://academy.hsoub.com/learn/artificial-intelligence" rel=""><img alt="دورة الذكاء الاصطناعي AI" src="https://academy.hsoub.com/learn/assets/images/courses/artificial-intelligence.png"></a>
	</div>
</div>

<p>
	سيكون من الجميل أن يكون لدينا صيغة بسيطة مثل هذه لحلّ كلّ مشكلة في العالم. وخاصة بالنسبة لعزومة الغداء. ولكن لسوء الحظ هذا مستحيل.
</p>

<p>
	لنعود إلى مثال السيارات. المشكلة الحقيقية في هذا المثال هو وجود تواريخ تصنيع مختلفة، وعشرات الأنواع من السيارات، والحالة الفنية للسيارة، بالإضافة لارتفاع الطلب الموسمي على سيارة معينة، والكثير من العوامل المخفية الأخرى الّتي تؤثر بسعر السيارة. وبالتأكيد لن يستطيع صديقنا أحمد الاحتفاظ بكلّ هذه البيانات في رأسه أثناء حسابه للسعر.
</p>

<p>
	معظم الناس كسالى بطبعهم ولذلك سنحتاج حتمًا لآلات لتأدية العمليات الرياضية. لذا لنجاري الوضع الحاصل ولِنتجه باتجاه توفير آلة تؤدي هذه المهمة الحسابية الّتي واجهناها. ولنُوفر لها بعض البيانات اللازمة وسنطلبُ منها العثور على جميع الأنماط المخفية المتعلقة بالسعر.
</p>

<p>
	الجميل في الأمر أن هذه الآلة ستُؤدي هذه المهمة بطريقة أفضل بكثير مما سيُؤديه بعض الناس عند تحليلهم بعناية لجميع التبعيات المتعلقة بالسعر في أذهانهم. في الحقيقة كان هذا النوع من المشاكل المحفز الأساسي لولادة تعلّم الآلة.
</p>

<h2 id="المكونات-الرئيسية-لتعلم-الآلة">
	المكونات الرئيسية لتعلم الآلة
</h2>

<p>
	لو أردنا اختصار جميع الأهداف الكامنة وراء مجال تعلّم الآلة فسيكون الهدف الوحيد هو توقع النتائج معينة بناءً على البيانات المدخلة (أي التعلّم من البيانات المدخلة). وهذا خلاصة الأمر. إذ يمكن تمثيل جميع مهام تعلّم الآلة بهذه الطريقة.
</p>

<p>
	كلّما زاد تنوع البيانات (تسمى في بعض الأحيان <strong>بالعينات</strong>) المجمعة لديك، كلّما كان مهمة العثور على الأنماط ذات الصلة والتنبؤ بالنتيجة أسهل نسبيًا. لذلك، فإن أي نظام يستخدم تعلّم الآلة سيحتاجُ لثلاثة مكونات رئيسية وهي:
</p>

<h3 id="البيانات">
	1. البيانات (Data)
</h3>

<p>
	هل تريد الكشف عن رسائل البريد الإلكتروني المزعجة؟ احصل على عينات من الرسائل هذه الرسائل المزعجة. هل تريد التنبؤ بالتغيرات الّتي تطرأ على أسعار الأسهم؟ ابحث عن سجلات أسعار الأسهم. هل تريد معرفة ما هي تفضيلات المستخدم؟ حللّ أنشطته على الفيسبوك، واعتقد بأن مارك زوكربيرج ماهرٌ جدًا في ذلك. كلما كانت البيانات أكثر تنوعًا، كانت النتيجة أفضل. في بعض الأحيان تكون عشرات الآلاف من سجلات البيانات هي الحد الأدنى لاستنتاج معلومة معينة. وفي البعض الآخر نحتاج إلى ملايين العينات.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="51282" data-ss1621157876="1" data-ss1628757407="1" href="https://academy.hsoub.com/uploads/monthly_2020_09/3.png.5fb1bc3e16038329d12acd920c3f33f6.png" rel=""><img alt="3.png" class="ipsImage ipsImage_thumbnailed" data-fileid="51282" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_09/3.thumb.png.8f1c330efac2af664589081b3dd986fa.png"></a>
</p>

<p>
	هناك طريقتين رئيسيتين للحصول على البيانات:
</p>

<ul>
	<li>
		الطريقة اليدوية.
	</li>
	<li>
		الطريقة الآلية.
	</li>
</ul>

<p>
	تتميز البيانات المجمّعة يدويًا باحتوائها على أخطاء أقل بكثير بالموازنة مع نظيرتها الآلية، ولكنها بالمقابل تستغرق وقتًا أطول في التجميع مما يجعلها أكثر تكلفة عمومًا. أما الطريقة الآلية فتكون أرخص إذ كلّ ما سنفعله هو جمع كلّ ما يمكننا العثور عليه على أمل أن تكون جودة هذه البيانات مقبولة.
</p>

<p>
	تستخدم بعض الشركات مثل غوغل عملائها لتصنيف البيانات لهم مجانًا. هل تعلم لماذا طريقة التحقق البشري ReCaptcha (المستخدمة في أغلب المواقع) تجبرك على "تحديد جميع لافتات الشوارع الموجودة في صورة معينة"؟ في الحقيقة إن هذه الطريقة ما هي إلا وسيلة لتصنيف البيانات وتعظيم الاستفاد منها. إذ يستغلون حاجتك للتسجيل في الموقع معين ويسخّرونك مجبرًا للعمل لديهم وبالمجان. مدعين بأنهم بهذه الطريقة يختبرونك بأنك بشري! نعم هذا بالضبط ما يفعلونه! تبًا لهم الأشرار! أراهن لو أنك بمكانهم فستُظهر رمز التحقق البشري أكثر منهم بكثير. أليس كذلك؟
</p>

<p>
	بيد أن من الصعوبة بمكان الحصول على مجموعة جيدة من البيانات -والتي تسمى عادةً <strong>مجموعة بيانات</strong> (Dataset). وهذه المجموعات مُهمّة للغاية بل إن مجموعة البيانات ذات الجودة العالية هي في الواقع كنز حقيقي لصاحبها لدرجة أن الشركات يمكن أن تكشف أحيانًا عن خوارزمياتها، إلا أنها نادرًا ما تكشف مجموعات البيانات الخاصة بها.
</p>

<h3 id="الميزات">
	2. الميزات (Features)
</h3>

<p>
	تُعرف أيضًا باسم <strong>المعاملات</strong> (Parameters) أو <strong>المتغيّرات</strong> (Variables). والتي يمكن أن تعبر عن المسافة المقطوعة بالسيارات، أو جنس المستخدم، أو سعر السهم، أو تكرار كلمة معينة في النص. بعبارة أخرى، هذه هي الميزات الّتي يجب أن تنظرَ لها الآلة.
</p>

<p>
	عندما تكون البيانات مخزنة في الجداول، يكون الأمر بسيطًا - فالميّزات هي أسماء الأعمدة. ولكن ماذا لو كان لديك 100 غيفابايت من صور القطط؟ بكلّ تأكيد لا يمكننا اعتبار كلّ بكسل ميزّة. هذا هو السبب بكون اختيار الميّزات الصحيحة يستغرق عادة وقتًا أطول من أي خطوة أخرى في بناء نظام يعتمد على تعلّم الآلة. وهذا أيضًا هو المصدر الرئيسي للأخطاء. ولذلك دائمًا ما تكون الاختيارات البشرية غير موضوعية. إذ يختارون فقط الميّزات الّتي يحبونها أو تلك الّتي يجدونها "أكثر أهمية". ولذا من فضلك تجنب أن تكون بشريًا!
</p>

<h3 id="الخوارزميات">
	3. الخوارزميات (Algorithms)
</h3>

<p>
	وهو الجزء الأسهل والأكثر وضوحًا. إذ يمكن حلّ أي مشكلة بطرق مختلفة. بيد أن الطريقة الّتي تختارها ستُؤثر على دقة <strong>النموذج</strong> النهائي وأدائه وحجمه. هناك فارق بسيط واحد مهم: إذا كانت البيانات سيئة فلن تساعدك حتى أفضل خوارزمية موجودة. في بعض الأحيان يشار إليها بمصطلح "الدخل السيئ سيؤدي إلى نتائج سيئة". لذلك لا تهتم كثيرًا لنسبة الدقة، وحاول الحصول على المزيد من البيانات كبداية.
</p>

<p>
	من الجدير بالذكر أن مصطلح <strong>نموذج</strong> (Model) يشير إلى ما خلاصة ما تعلمته من البيانات، ويكمننا في بعض الأحيان استخدام نموذج جاهز وتمرير البيانات له أو تحسين نموذج حالي.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="51283" data-ss1621157876="1" data-ss1628757407="1" href="https://academy.hsoub.com/uploads/monthly_2020_09/4.png.07ad0491e878515434d9eb0787d60956.png" rel=""><img alt="4.png" class="ipsImage ipsImage_thumbnailed" data-fileid="51283" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_09/4.thumb.png.d0e2fb8d035cd9585e3049ea7792f11c.png"></a>
</p>

<h2 id="الفرق-بين-التعلم-والذكاء">
	الفرق بين التعلم (Learning) والذكاء (Intelligence)
</h2>

<p>
	إن سبق ورأيت مقالًا بعنوان <strong>"هل ستحلّ الشبكات العصبية محل تعلم الآلة؟"</strong> أو على شاكلته من العناوين الّتي تنشرها بعض المواقع التابعة لوسائل إعلامية على الإنترنت. دائمًا ما يسمي رجال الإعلام هؤلاء أي <strong>انحدار خطي</strong> (Linear Regression) على أنه ذكاء اصطناعي، بل إن بعض وسائل الإعلام تضخم الأمور لدرجة يصعب تصديقها حتى أصبحنا نخاف من الذكاء الصنعي كما خاف أبطال فيلم Terminator من الروبوت SkyNet. وإليك صورة توضح المفاهيم وتفض الالتباس الموجود:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="51285" data-ss1621157876="1" data-ss1628757407="1" href="https://academy.hsoub.com/uploads/monthly_2020_09/5.png.023d0a914c38bf10a7cdb11c7dbae63c.png" rel=""><img alt="5.png" class="ipsImage ipsImage_thumbnailed" data-fileid="51285" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_09/5.thumb.png.d6bad4921da8f8d8e5b6d4da8d75a673.png"></a>
</p>

<p>
	<strong><a href="https://academy.hsoub.com/programming/general/%D8%B9%D9%84%D9%88%D9%85-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8/" rel="">علوم الحاسب</a></strong> (Computer Science): عمومًا هو دراسة أجهزة الحاسب بما فيها من أسس نظرية و حسابية، كما تشتمل على دراسة <a href="https://academy.hsoub.com/programming/advanced/%D8%A7%D9%84%D8%AE%D9%88%D8%A7%D8%B1%D8%B2%D9%85%D9%8A%D8%A7%D8%AA/" rel="">الخوارزميات</a>، وبُنى المعطيات وأساسيات تصميم الشبكات ونمذجة البيانات ..وغيرها.
</p>

<p>
	<strong><a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A/" rel="">الذكاء الصناعي</a></strong> (Artificial Intelligence): وهو فرع من <a href="https://academy.hsoub.com/programming/general/%D8%B9%D9%84%D9%88%D9%85-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8/#%D8%AA%D8%AE%D8%B5%D8%B5%D8%A7%D8%AA-%D8%B9%D9%84%D9%88%D9%85-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8" rel="">فروع علوم الحاسب</a> يهدف إلى تعزيز قدرة الآلات والحواسيب على أداء مهام مُعينة تُحاكي وتُشابه تلك الّتي تقوم بها الكائنات الذكيّة؛ كالقدرة على التفكير، أو التعلُم من التجارب السابقة، أو غيرها من العمليات الأُخرى الّتي تتطلب عمليات ذهنية.
</p>

<p>
	<strong>تعلم الآلة</strong> (Machine Learning): وهو جزء مهم من الذكاء الاصطناعي، وهو أحد فروع الذكاء الاصطناعي الّذي يُعنى بجعل الحاسوب قادرًا على التعلُم من تلقاء نفسه من أيّ خبرات أو تجارب سابقة، مما يجعله قادرًا على التنبؤ واتخاذ القرار المُناسب بصورة أسرع، ولكن تعلم الآلة ليس الفرع الوحيد الّذي يؤدي هذه المهمة.
</p>

<p>
	<strong>الشبكات العصبية الاصطناعية</strong> (Artificial Neural Networks): وهي من أحد أشهر الطرق الشعبية في مجال تعلّم الآلة، ولكن هناك طرق أخرى جيدة أيضًا.
</p>

<p>
	<strong>التعلم العميق</strong> (Deep Learning): هو طريقة حديثة لبناء وتدريب واستخدام الشبكات العصبية. وهي بالأساس هيكلية جديدة للشبكات العصبية. وحاليًا لا أحد يفصل التعلم العميق عن "الشبكات العصبية العادية". حتى أننا نستخدم نفس المكتبات لهم. من الأفضل دومًا تسمية نوع الشبكة وتجنب استخدام الكلمات الرنانة.
</p>

<p>
	من المهم دائمًا تذكر بأنه لا توجد طريقة واحدة أبدًا لحل مشكلة معينة في مجال تعلّم الآلة. بل هناك دائمًا العديد من الخوارزميات الّتي يمكنها حل نفس المشكلة، وتبقى مهمة اختيار الطريقة أو الخوارزمية الأنسب عائدة إليك. إذ يمكنك حلّ أيّ شيء باستخدام شبكة عصبية اصطناعية، ولكن من الّذي سيدفع لك ثمن استئجار (أو حتى شراء) بطاقة معالجة الرسوميات (GPU) من نوع GeForces؟
</p>

<p>
	لنبدأ بنظرة عامة أساسية على الاتجاهات الأربعة السائدة حاليًا في مجال تعلّم الآلة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="51289" data-ss1621157876="1" data-ss1628757407="1" href="https://academy.hsoub.com/uploads/monthly_2020_09/7.png.973328ab8b1388740553c06f86656c3e.png" rel=""><img alt="7.png" class="ipsImage ipsImage_thumbnailed" data-fileid="51289" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_09/7.thumb.png.bdedf73388c568a9590b63c7e34ed71c.png"></a>
</p>

<h2 id="تعلم-الآلة-التقليدي">
	تعلم الآلة التقليدي
</h2>

<p>
	جاءت الطرق الأولى لتعلّم الآلة من مجال الإحصاء البحت في خمسينات القرن الماضي. إذ اعتمد العلماء على حلّ معظم المهام الرياضية الرسمية من خلال البحث عن الأنماط في الأرقام، وتقييم قرب نقاط البيانات، وحساب اتجاه المتجهات.
</p>

<p>
	يعمل حاليًا نصف الإنترنت على هذه الخوارزميات. فعندما ترى قائمة بالمقالات المرشحة لك قراءتها في أحد المواقع، أو عندما يحظر البنك الّذي تتعامل معه بطاقتك عند تمريرك إياها على الآلة في محطة وقود عشوائية في مكان مجهول بعيدة عن سكنك، فعلى الأرجح هذه الأفعال ناتجة عن خوارزميات تعلّم الآلة.
</p>

<p>
	تعد الشركات التكنولوجيا الكبرى من أكبر المعجبين بالشبكات العصبية، إذ أنها تستطيع الاستفادة منها بقدر أكبر من الشركات الناشئة. فمثلًا يمكن لدقة صغيرة ولتكن 2٪ لإحدى خوارزمياتها الحساسة أن تعود بالنفع على إيرادات الشركة بمبلغ مالي ضخم يبلغ 2 مليار دولار. ولكن عندما تكون شركتك صغيرة وناشئة، فهذه النسبة ليست ذات فائدة كبيرة.
</p>

<p>
	فإذا أمضى المهندسين في فريقك البرمجي سنة كاملة يعملون على تطوير خوارزمية توصية جديدة لموقع التجارة الإلكترونية الخاص بك، مع معرفتهم بأن 99٪ من الزيارات تأتي من محركات البحث. عندها ستكون فائدة الخوارزمية قليل جدًا إذ لم عديمة الفائدة تمامًا وخصيصًا أن معظم المستخدمين لم يفتحوا الصفحة الرئيسية. فهذا سيكون أكبر هدر لطاقة فريقك البرمجي وبذلك سيكون أسوء استثمار لهذه العقول خلال هذه السنة.
</p>

<p>
	بصرف النظر عن ما يقال عن هذه الطرق إلا أنها سهلة سهولة كبيرة. بل إنها مثل أساسيات الرياضيات وأغلبنا يستخدمها يوميًا بدون أن يفكر بها.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="51291" data-ss1621157876="1" data-ss1628757407="1" href="https://academy.hsoub.com/uploads/monthly_2020_09/8.png.ede04beb47bc7cccd13e6f935ef02d1c.png" rel=""><img alt="8.png" class="ipsImage ipsImage_thumbnailed" data-fileid="51291" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_09/8.thumb.png.e95e5c996b1a67957cd3c107340c72b6.png"></a>
</p>

<p>
	ينقسم تعلّم الآلة الكلاسيكي إلى فئتين وهما <strong>التعلّم الموجّه</strong> (ويسمى أيضًا التعلّم الخاضع للإشراف) و <strong>التعلّم غير الموجّه</strong> (ويسمى أيضًا التعلّم غير الخاضع للإشراف).
</p>

<h3 id="التعلم-الموجه">
	التعلم الموجه (Supervised Learning)
</h3>

<p>
	تحتوي الآلة على "مشرف" أو "مُعلّم" يزود الآلة بجميع الإجابات الصحيحة والدقيقة، مثل تحديد فيما إذا كان الشكل في الصورة لقطة أو كلب. قسّم (أو صنّف) المعلم بهذا الطريقة فعليًا البيانات إلى قطط وكلاب، ويستخدم الجهاز هذه الأمثلة الصحيحة للتعلم منها. واحدًا تلو الآخر.
</p>

<p>
	أما التعلم غير الموجّه فأن سيترك الآلة بمفردها مع كومة كبيرة من صور الحيوانات ومهمتها ستكون تصنيف هذه الصور. وذلك لأن البيانات غير مصنفة، ولا يوجد معلّم يحدد لنا ما الشكل الموجود في هذه الصور، ولذلك ستحاول الآلة بمفردها العثور على أي أنماط في الصور لتحديد الفوارق ومعرفة ما الموجود في الصور. سنتحدث عن هذه الطرق في التعرف على الأنماط لاحقًا.
</p>

<p>
	من الواضح أن الآلة ستتعلم أسرع بكثير مع معلّم، لذلك فالتعلّم الموجّه مستخدمٌ بكثرة في المهام الواقعية. هناك نوعين رئيسيين لطريقة التعلم الموجّه وهما:
</p>

<ol>
	<li>
		<strong>التصنيف</strong> (Classification): التنبؤ بصنف كائن معين.
	</li>
	<li>
		<strong>الانحدار</strong> (Regression): التنبؤ بنقطة معينة على محور رقمي.
	</li>
</ol>

<h4 id="التصنيف">
	التصنيف (Classification)
</h4>

<p>
	تقسيم الكائنات أو العناصر بناءً على إحدى السمات المعروفة مسبقًا. افصل الجوارب بحسب اللون، والمستندات بحسب اللغة، والموسيقى بحسب الأسلوب. وعمومًا يستخدم التصنيف من أجل:
</p>

<ul>
	<li>
		تصفية البريد الإلكتروني من الرسائل المزعجة.
	</li>
	<li>
		كشف عن اللغة المستخدمة.
	</li>
	<li>
		البحث عن وثائق مماثلة.
	</li>
	<li>
		تحليل المشاعر.
	</li>
	<li>
		التعرف على الحروف والأرقام المكتوبة بخط اليد.
	</li>
	<li>
		الكشف عن الغش.
	</li>
</ul>

<p>
	ومن بعض الخوارزميات الشائعة المستخدمة للتصنيف:
</p>

<ul>
	<li>
		خوارزمية بايز أو المصنّف المعتمد على قانون بايز في الاحتمالات Naive Bayes.
	</li>
	<li>
		خوارزمية شجرة القرار Decision Tree.
	</li>
	<li>
		خوارزمية الانحدار اللوجستي Logistic Regression.
	</li>
	<li>
		خوارزمية الجار الأقرب K-Nearest Neighbours.
	</li>
	<li>
		خوارزمية الدعم الآلي للمتجه Support Vector Machine.
	</li>
	<li>
		ويوجد أيضًا العديد من الخوارزميات الأخرى.
	</li>
</ul>

<p>
	غالبًا ما يعتمد مجال تعلّم الآلة على تصنيف الأشياء. إذ تكون الآلة في هذه الحالة مثل طفل يتعلم كيفية فرز الألعاب: فها هي الدمية، وهذه هي السيارة، وهذه هي الشاحنة …إلخ ولكن مهلًا. هل هذا الأمر صحيح؟ هل سيعرف الطفل المعنى الحقيقي للدمية أو للسيارة؟ ليستطيع بعدها تمييز أي دمية مهما اختلف شكلها ولونها وطريقة صنعها؟ أي بعبارة أخرى، هل سيستطيع أن يعمم ما تعلمه؟
</p>

<p>
	في التصنيف سنحتاج دائمًا لمعلّم. ويجب تصنيف البيانات بميّزات (Features) حتى تتمكن الآلة من تعيين الأصناف المناسبة بناءً على هذه الميّزات. في الحقيقة يمكننا تصنيف كلّ شيئ تقريبًا ابتداءً من تصنيف المستخدمين بناءً على اهتماماتهم (كما تفعل خوارزمية فيسبوك)، والمقالات المستندة إلى اللغة أو الموضوع (وهذا أمر مهم لمحركات البحث)، والموسيقى المبنية على الأسلوب سواءً أكانت موسيقى جاز أو هيب هوب …إلخ (هذا الأمر نشاهده في قوائم تشغيل الخاصة بتطبيق Spotify)، وحتى تصنيف رسائل البريد الإلكتروني الخاصة بك.
</p>

<p>
	في تصفية الرسائل المزعجة وغير المرغوب بها، تستخدم خوارزمية بايز <a data-ss1621157876="1" data-ss1628757407="1" href="https://en.wikipedia.org/wiki/Naive_Bayes_classifier" rel="external nofollow">Naive Bayes</a> على نطاق واسع. إذ تحسبُ الآلة عدد الكلمات الجيدة في الرسالة وعدد الكلمات الاحتيالية أيضًا بناءً على تصنيف سابق للكلمات موجود في قاعدة بيانات أو مجموعة بيانات (Dataset)، ومن ثمّ تضرب الاحتمالات باستخدام معادلة بايز، وتجمعُ النتائج النهائية وبهذه البساطة أصبح لدينا جهاز يستفيد من طرق تعلّم الآلة من أجل أن يزيد ذكائه ومعرفته.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="51292" data-ss1621157876="1" data-ss1628757407="1" href="https://academy.hsoub.com/uploads/monthly_2020_09/10.png.1c9ce1f297a1c6350e30120ba665f9bb.png" rel=""><img alt="10.png" class="ipsImage ipsImage_thumbnailed" data-fileid="51292" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_09/10.thumb.png.e4a406e0d452037122b1b6fd5d128df3.png"></a>
</p>

<p>
	بعدها بفترة وجيزة تعلم مرسلو البريد العشوائي كيفية التعامل مع هذه المرشحات -إن صح التعبير- والّتي تعتمد على خوارزمية بايز فعكفوا على إضافة الكثير من الكلمات المصنّفة على أنها <strong>"جيدة"</strong> في نهاية البريد الإلكتروني لتُتضاف هذه الكلمات إلى العملية الحسابية الخاصة بحساب احتمالات كون الرسالة مزعجة أم لا. ومن المفارقة أن هذه الثغرة سمّيت لاحقًا <a data-ss1621157876="1" data-ss1628757407="1" href="https://en.wikipedia.org/wiki/Bayesian_poisoning" rel="external nofollow">بتسمم بايز</a>. دخلت خوارزمية بايز التاريخ باعتبارها من أوائل الخوارزميات الأنيقة والمفيدة عمليًا في ترشيح رسائل البريد الإلكتروني، ولكن في وقتنا الحالي لا تستخدم هذه الخوارزمية وإنما تستخدم خوارزميات أكثر قوة وذكاءً معتمدًا على الشبكات العصبية الاصطناعية لتصفية رسائل البريد العشوائي المزعج.
</p>

<p>
	إليك مثال عملي آخر على تطبيقات خوارزميات التصنيف. لنفترض أنك بحاجة لاقتراض بعض المال عن طريق بطاقتك الائتمانية. كيف سيعرف البنك إذا كنت تريد فعلًا أن تسدد هذا القرض أم لا؟ وبالتأكيد لا توجد طريقة مباشرة لمعرفة ذلك، مثل أن يسألك مثلًا. ولكن لدى البنك الكثير من الملفات الشخصية لأشخاص اقترضوا مالًا في الماضي. في الواقع لدى البنك جميع البيانات المهمة حول أعمار الأشخاص المقترضين ومستوى تعليمهم ومهنهم ورواتبهم -والأهم من ذلك- حقيقة أن هل هؤلاء المقترضين سددوا القرض أم لا.
</p>

<p>
	وهذه البيانات مهمة جدًا إذ يمكننا تمريرها للنظام الداخلي للبنك الّذي يعتمد على تعلّم الآلة للعثور على الأنماط المحددة الموجودة في الأشخاص الّذين يسددون القروض، وبذلك يمكننا الحصول على الإجابة المبنية على هذه البيانات السابقة. في الواقع لا توجد مشكلة حقيقية في الحصول على إجابة من هذه البيانات. وإنما تكمن المشكلة في أنه لا يستطيع البنك أن يثق في إجابة الآلة ثقةً عمياء. فماذا لو حدث فشل في النظام أو في جزء منه مثل تعطل أحد الاقراص الصلبة المخزن عليها قواعد البيانات المطلوبة، أو أن أحد قراصنة الإنترنت هجم على الخادم وتلاعب بالخوارزميات أو البيانات. فما الّذي سيحدث في هذه الحالة؟
</p>

<p>
	للتعامل مع هذه الحالة لدينا خوارزمية <a data-ss1621157876="1" data-ss1628757407="1" href="https://www.youtube.com/watch%D8%9Fv=eKD5gxPPeY0" rel="external nofollow">شجرة القرار</a>. والتي ستقسّم جميع البيانات تلقائيًا إلى أسئلة أجوبتها نعم أو لا. قد يبدو الأمر غريبًا بعض الشيئ من منظور بشري، فمثلًا ما المشكلة إذا كان الدائن يكسب أكثر من 128.12 دولارًا أمريكيًا؟ بالرغم من ذلك تضع الآلة مثل هذه الأسئلة لتقسيم البيانات بشكل أفضل في كلّ خطوة.
</p>

<p>
	وهكذا تُصنعُ شجرة القرار. كلما كان الفرع أعلى كلما كان السؤال أعم. يمكن لأي محلل أن يأخذ ناتج الخوارزمية ويعلّم تمامًا ما هو القرار المناسب. يمكن ألا يشعر بأن كلّ تفاصيلها منطقية إلا أنه يستطيع أن يبني عليها قراره.
</p>

<h4 id="أشجار-القرار">
	أشجار القرار (Decision Trees)
</h4>

<p>
	تستخدم خوارزمية شجرة القرار على نطاق واسع في المجالات ذات المسؤولية العالية مثل: التشخيص والطب وفي الأمور المالية.
</p>

<p>
	من أكثر الخوارزمات شيوعًا لتشكيل الأشجار هما خوارزمية <a data-ss1621157876="1" data-ss1628757407="1" href="https://en.wikipedia.org/wiki/Predictive_analytics#Classification_and_regression_trees_.28CART.29" rel="external nofollow">CART</a> وخوارزمية <a data-ss1621157876="1" data-ss1628757407="1" href="https://en.wikipedia.org/wiki/C4.5_algorithm" rel="external nofollow">C4.5</a>.
</p>

<p>
	ونادرًا ما تستخدم طريقة بناء أشجار القرار الأساسية الصرفة في وقتنا الحالي. إلا أنها غالبًا ما تضع حجر الأساس للأنظمة الكبيرة، بل إن المُجمّعات (Ensembles) المعتمدة على أشجار القرار تعمل بطريقة أفضل من المجمعات المعتمدة على الشبكات العصبية الاصطناعية (سنتحدث لاحقًا في هذا المقال عن كلّ جزء منهم بالتفصيل).
</p>

<p>
	عندما تبحث عن شيء ما في غوغل، فما يحدث بالضبط هو أن مجموعة من الأشجار ستبحث عن إجابة أو مجموعة من الإجابات المناسبة لك. وهذه الأشجار سريعة جدًا، ولذلك تحبها محركات البحث.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="51294" data-ss1621157876="1" data-ss1628757407="1" href="https://academy.hsoub.com/uploads/monthly_2020_09/11.png.db0e114b45bbda5431e1bbda755679ea.png" rel=""><img alt="11.png" class="ipsImage ipsImage_thumbnailed" data-fileid="51294" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_09/11.thumb.png.66520a97d0d71cb6526a8c74b9d135e1.png"></a>
</p>

<p>
	تعدّ خوارزمية الدعم الآلي للمتجه (Support Vector Machines) والتي يشار إليها اختصارًا (SVM) هي الطريقة الأكثر شيوعًا للتصنيف الكلاسيكي. والمستخدمة لتصنيف كلّ شيئ موجود تقربيًا مثل: النباتات حسب مظهرها في الصور، والوثائق بحسب الفئات …إلخ. الفكرة وراء خوارزمية الدعم الآلي للمتجه بسيطة جدًا إذ تحاول رسم خطين بين نقاط البيانات الخاصة بك مع أكبر هامش بينهما.
</p>

<p>
	هناك جانب مفيد جدًا من خوارزميات التصنيف وهو الكشف عن البيانات الشاذة. فعندما لا تتناسب الميزة مع أيّ من الفئات، فإننا نبرزها. وتستخدم هذه الطريقة حاليًا في الطب وتحديدًا في أجهزة التصوير بالرنين المغناطيسي، تبرز الحواسيب جميع المناطق المشبوهة أو انحرافات الاختبار. كما تستخدم أيضًا في أسواق الأسهم للكشف عن السلوك غير الطبيعي للتجار لمعرفة ما يحدث وراء الكواليس. الجميل في الأمر أنه عندما نعلّم الحاسب الأشياء الصحيحة فنكون علمناه تلقائيًا ما هي الأشياء الخاطئة.
</p>

<p>
	<strong>القاعدة الأساسية هي كلّما زاد تعقيد البيانات، زاد تعقيد الخوارزمية.</strong> بالنسبة للنصوص والأرقام والجداول سنختار النهج الكلاسيكي. إذ النماذج الناتجة ستكون أصغر، وتتعلم أسرع وتعمل بوضوح أكبر. أما بالنسبة للصور ومقاطع الفيديو وجميع أنواع البيانات المعقدة الأخرى، سنتجه بالتأكيد نحو الشبكات العصبية.
</p>

<p>
	منذ خمس سنوات فقط كان بإمكانك العثور على مصنف للوجه مبني على خوارزمية الدعم الآلي للمتجه (SVM). حاليًا أصبح من السهل الاختيار من بين مئات الخوارزميات المعتمدة على الشبكات العصبية المدربة مسبقًا. أما بالنسبة لمرشحات البريد العشوائي فلم يتغير شيئ. فلا تزال بعض الأنظمة مكتوبة بخوارزمية الدعم الآلي للمتجه (SVM).
</p>

<h4 id="الانحدار">
	الانحدار (Regression)
</h4>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="51297" data-ss1621157876="1" data-ss1628757407="1" href="https://academy.hsoub.com/uploads/monthly_2020_09/13.png.3ef11ad0414664e00d84d6f68caea833.png" rel=""><img alt="13.png" class="ipsImage ipsImage_thumbnailed" data-fileid="51297" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_09/13.png.3ef11ad0414664e00d84d6f68caea833.png"></a>
</p>

<p>
	وهو طريقة لرسم خط بين مجموعة نقاط. نعم، هذا هو التعلّم الآلة!
</p>

<p>
	يستخدم الانحدار حاليًا في تطبيقات متعددة، مثل:
</p>

<ul>
	<li>
		توقعات أسعار الأسهم.
	</li>
	<li>
		تحليل حجم الطلب والمبيعات.
	</li>
	<li>
		التشخيص الطبي.
	</li>
	<li>
		أي ارتباطات عددية.
	</li>
</ul>

<p>
	ومن الخوارزميات الشائعة نذكر:
</p>

<ul>
	<li>
		خوارزمية الانحدار الخطي <a data-ss1621157876="1" data-ss1628757407="1" href="https://en.wikipedia.org/wiki/Linear_regression" rel="external nofollow">Linear</a>.
	</li>
	<li>
		خوارزمية االانحدار متعدد الحواف <a data-ss1621157876="1" data-ss1628757407="1" href="https://en.wikipedia.org/wiki/Polynomial_regression" rel="external nofollow">Polynomial</a>.
	</li>
</ul>

<p>
	الانحدار هو في الأساس آلية للتصنيف ولكن هنا نتوقع رقمًا بدلًا من فئة. ومن الأمثلة على ذلك توقع سعر السيارة من خلال المسافة المقطوعة، وتوقع حركة المرور بحسب وقت محدد من اليوم، وتوقع حجم الطلب من خلال نمو الشركة، وما إلى ذلك. ويكون من الواجب استخدام الانحدار عندما تعتمد مشكلة معينة على الوقت.
</p>

<p>
	كلّ من يعمل في مجالات التمويل والتحليل المالي يحب خوارزميات الانحدار. حتى أن معظمها مدمج في برنامج مايكروسوفت إكسل (Excel). وطريقة استخدامها سلسة جدًا من الداخل إذ تحاول الآلة ببساطة رسم خط يشير إلى متوسط الارتباط (Average Correlation). على عكس الشخص الّذي يحاول رسم شكل الانحدار يدويًا على السبورة، فإن الآلة ترسم الشكل بدقة رياضية عالية جدًا، بحساب متوسط الفاصل الزمني لكل نقطة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="51298" data-ss1621157876="1" data-ss1628757407="1" href="https://academy.hsoub.com/uploads/monthly_2020_09/14.png.2239682decfeecaccc38bc3ff09173c6.png" rel=""><img alt="14.png" class="ipsImage ipsImage_thumbnailed" data-fileid="51298" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_09/14.thumb.png.32200c1fde533d269d1bc46de2f1a681.png"></a>
</p>

<p>
	عندما يكون خط الانحدار مستقيمًا فيكون هذا الانحدار خطيًا، أما عندما يكون خط الانحدار منحنيًا فيكون الانحدار متعدد الحواف (Polynomial). وهذه الأنواع الرئيسية من الانحدار. والبعض الآخر أكثر غرابة مثل الانحدار اللوجستي (Logistic Regression) وسيكون شكله مميز كتميز الخروف الأسود في قطيع غنم. ولكن لا تدعه يخدعك، لأنه مجرد طريقة تصنيف وليس انحدارًا.
</p>

<p>
	لا بأس في الخلط بين الانحدار والتصنيف. إذ يتحول العديد من المصنّفات لتنفيذ عملية انحدار بقليل من الضبط والإعداد. وعمومًا تستخدم طرق الانحدار عندما لا يمكننا تحديد فئة الكائن، وإنما يمكننا تحديد ومعرفة مدى قربه من هذه الفئة، وهنا بالضبط تأتي مهمته.
</p>

<p>
	في حال أردت التعمق أكثر في التعلم الموجّه، فراجع هذه السلسلة: <a data-ss1621157876="1" data-ss1628757407="1" href="https://medium.com/machine-learning-for-humans/supervised-learning-740383a2feab" rel="external nofollow">Machine Learning for Humans</a>.
</p>

<h3 id="التعلم-غير-الموجه">
	التعلم غير الموجه (Unsupervised learning)
</h3>

<p>
	ظهر التعلّم غير الموجّه بعد ظهور التعلّم الموجّه بقليل، وتحديدًا في التسعينيات. ويستخدم أقل من التعلّم الموجّه، ولكن في بعض الأحيان لن يكون لدينا خيار آخر سوى استخدامه.
</p>

<p>
	تعدّ البيانات المصنّفة نوع فاخر من البيانات. ولكن ماذا لو كنت رغبت في إنشاء تصنيف مخصص للحافلات (الباصات)؟ هل يجب عليك التقاط صور يدويًا لمليون حافلة في الشوارع وتصنيف كلّ واحدةٍ منها؟ مستحيل، سيستغرق هذا الأمر عمرًا بأكمله.
</p>

<p>
	في هذا النوع من التعلم من منظورنا نحن نعطيها أومر معينة للتجميع أو تقليل الأبعاد وهي تؤدي هذه المهمة من خلال تحليلها لقيم الميّزات (Features) ومحاولة الربط بينها ومعرفة العلاقات أو الارتباط بين هذه البيانات. كما يمكن أن تكون البيانات معقدة للغاية، ولذلك لا يمكن لهذه الخوارزميات التكهن بالنتيجة المطلوبة بصورة صحيحة. في تلك الحالات نحاول تنظيم بياناتنا أو إعادة هيكلتها في صيغة منطقية أكثر من السابق من أجل معرفة فيّما إذا استطاعت هذه الخوارزميات استنتاج شيئ ما، وبذلك الأمر له عدة جوانب للحلّ ومتعلّق بنوعية البيانات وطريقة تنظيمها وجودتها.
</p>

<p>
	ولكن هناك بعض الأمل إذ لدينا الملايين من المنصات الّتي توفر خدمات رخيصة نسبيًا تبدأ من 5 دولار أمريكي، وغالبًا نعتمد عليها لمساعدتنا في تصنيف البيانات وهذه الطريقة المعتمدة الّتي تجري وفقها أمور تطوير البيانات في هذا المجال.
</p>

<p>
	بعض الأنواع للتعلّم غير الموجّه:
</p>

<ol>
	<li>
		التجميع (Clustering).
	</li>
	<li>
		تقليل الأبعاد أو التعميم (Dimensionality Reduction).
	</li>
	<li>
		تعلم قواعد الربط (Association rule learning).
	</li>
</ol>

<h2 id="التجميع">
	التجميع (Clustering)
</h2>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="51299" data-ss1621157876="1" data-ss1628757407="1" href="https://academy.hsoub.com/uploads/monthly_2020_09/15.png.22c95f6b5c4d62b4bf0037644a1ffaec.png" rel=""><img alt="15.png" class="ipsImage ipsImage_thumbnailed" data-fileid="51299" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_09/15.png.22c95f6b5c4d62b4bf0037644a1ffaec.png"></a>
</p>

<p>
	تُقسّم عملية التجميع الكائنات على أساس ميّزات غير معروفة. إذ تختار الآلة أفضل طريقة لفرز الميّزات الّتي تراها مناسبة.
</p>

<p>
	هذه بعض التطبيقات لعملية التجميع في وقتنا الحالي:
</p>

<ul>
	<li>
		تقسيم السوق (أو تقسيم أنواع العملاء، أو طريقة ولائهم للعلامة التجارية).
	</li>
	<li>
		دمج نقاط قريبة على الخريطة.
	</li>
	<li>
		ضغط الصورة.
	</li>
	<li>
		تحليل وتسمية البيانات الجديدة.
	</li>
	<li>
		الكشف عن السلوك غير الطبيعي.
	</li>
</ul>

<p>
	ومن بعض خوارزميات الشائعة للتجميع:
</p>

<ul>
	<li>
		خوارزمية K-mean_clustering.
	</li>
	<li>
		خوارزمية Mean-Shift.
	</li>
	<li>
		خوارزمية DBSCAN.
	</li>
</ul>

<p>
	تعدّ عملية التجميع فعليًا عملية تصنيف ولكن المفارقة هنا أنها لا تحتوي على فئات محددة مسبقًا. مشابهة جدًا لعملية تقسيم الجوارب في الدرج بحسب ألوانهم، وذلك عندما لا تتذكر كلّ الألوان الّتي لديك فعندها ستجلب الجورب الأول ذو اللون الأسود وتضعه جانبًا وتأخذ الجورب الثاني ..وهكذا. تحاول خوارزميات التجميع العثور على كائنات متشابهة (بحسب بعض الميزات) ودمجها في مجموعة. تُجمّع الكائنات الّتي لديها الكثير من الميزات المماثلة في فئة واحدة. وتسمح لنا بعض الخوارزميات حتى تحديد العدد الدقيق للمجموعات الّتي نريدها.
</p>

<p>
	من أحد أشهر الأمثلة على التجميع هي تجميع العلامات (أو المؤشرات) على خرائط الوِب. فمثلًا عندما تبحث عن جميع المطاعم النباتية المحيطة بك، سيجمّعُ محرك البحث الخاص بالخريطة جميع المطاعم على شكل أرقام. ولو أنه لم يجمّعها لك فحتمًا سيتجمد متصفحك بعد عملية البحث لأنه سيحاول رسم جميع المطاعم النباتية الموجودة على سطح الكرة الأرضية وعددهم سيكون كبير بكلّ تأكيد.
</p>

<p>
	ومن بعض الاستخدامات الأخرى لخوارزميات التجميع تطبيقات الهواتف المحمولة مثل: Apple Photos وGoogle Photos إذ كِلاهما يستخدمان خوارزميات تجميع معقدة أكثر من المثال السابق، وذلك لإنهم يبحثان عن الوجوه المميزة في الصور بهدف إنشاء ألبومات خاصة لأصدقائك. لا يعرف التطبيق عدد أصدقاؤك ولا حتى كيف تبدوا أشكالهم، ولكنه مع ذلك يحاول العثور على ميزات صريحة في وجوههم، والموازنة بينها لمعرفة عددهم، وعرض الألبومات وفقًا لذلك.
</p>

<p>
	ومن بعض الاستخدامات الأخرى هي ضغط الصورة فعند حفظ الصورة بلاحقة PNG، يمكنك ضبط مجموعة الألوان وليكن عددها 32 لونًا. هذا يعني أن آلية التجميع ستأخذ جميع البكسلات "المحمرة" وتحسب قيمة "المتوسط الأحمر" وتضبطه على جميع البكسلات الحمراء. وبذلك يكون لدينا ألوان أقل، مما يؤدي في نهاية المطاف إلى حجم ملف أقل، وبذلك تنخفضُ مصاريف التخزين المحلي أو السحابي.
</p>

<p>
	ومع ذلك يمكن أن نواجه بعض مشاكل في الألوان مثل الألوان القريبة من لونين بنفس الوقت مثل لون الأزرق السمائي (Cyan). إذ لا يمكننا تصنيفه فيما إذا كان أخضرًا أم أزرق؟ هنا يأتي دور خوارزمية K-Means.
</p>

<h3 id="خوارزمية-K-mean">
	خوارزمية K-mean
</h3>

<p>
	إذ تعيّن خوارزمية K-Means مجموعة من النقاط اللونية والبالغ عددها 32 نقطة لونية بطريقة عشوائية في مجموعة الألوان. وتسمى هذه النقاط (أو الألوان) بالنقاط المركزية (Centroids). وتُحدد النقاط المتبقية على أنها مخصصة لأقرب نقطة (لون) مركزي. وبعدها سنُلاحظ أننا حصلنا نوعًا ما على ما يشبه المجرات حول هذه الألوان 32. ثم ننقل النقطة المركزية إلى وسط مجرتنا، ونكرر ذلك حتى تتوقف النقطة المركزية عن التحرك.
</p>

<p>
	نفذنا جميع المهام بنجاح. ولدينا 32 مجموعة محددة ومستقرة. وإليك شرحًا كرتونيًا وتفصيليًا لما جرى:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="51300" data-ss1621157876="1" data-ss1628757407="1" href="https://academy.hsoub.com/uploads/monthly_2020_09/16.png.4df8865acbbc15790e1e14ff1df263cc.png" rel=""><img alt="16.png" class="ipsImage ipsImage_thumbnailed" data-fileid="51300" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_09/16.thumb.png.c29ab87ff7c6ba3be68598b68a71f003.png"></a>
</p>

<p>
	البحث عن الألوان المركزية مريح. إلا أن التجميعات في الحياة الواقعية ليست دائمًا على شكل دوائر. لنفترض أنك عالم جيولوجيا. وتحتاج للعثور على بعض المعادن المتماثلة على الخريطة. في هذه الحالة، يمكن تشكيل تجميعات بطريقة غريبة وحتى متشعبة. ولا يمكنك أيضًا أن تعرف عددهم فهل هم 10؟ أم 100؟ بكل تأكيد أن خوارزمية K-means لن تتناسب مع هذه الحالة، وإنما ستكون خوارزمية <a data-ss1621157876="1" data-ss1628757407="1" href="https://towardsdatascience.com/how-dbscan-works-and-why-should-i-use-it-443b4a191c80" rel="external nofollow">DBSCAN</a> مفيدةً أكثر.
</p>

<h3 id="خوارزمية-DBSCAN">
	خوارزمية DBSCAN
</h3>

<p>
	لنفترض أن النقاط لدينا هم أناس في ساحة البلدة. اَبحث عن أي ثلاثة أشخاص يقفون بالقرب من بعضهم البعض واطلب منهم أن يمسكوا أيديهم. ثم اطلب منهم البدء في الإمساك بأولئك الجيران الّذين يمكنهم الوصول إليهم. وهكذا دواليك. إلى أن نصل لشخص لا يستطيع الامساك بأي شخص آخر. هذه هي مجموعتنا الأولى. كرر هذه العملية ليُجمعُ كلّ الناس بمجموعات.
</p>

<p>
	<strong>ملاحظة</strong>: الشخص الّذي ليس لديه من يمسك يده - هو فعليًا مجرد بيانات شاذة.
</p>

<p>
	إليك رسم توضيحي يبين لك كيف سيبدو الحل:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="gif" data-fileid="51301" data-ss1621157876="1" data-ss1628757407="1" href="https://academy.hsoub.com/uploads/monthly_2020_09/17.gif.1e35e3989b978cd726793789fe8e5342.gif" rel=""><img alt="17.gif" class="ipsImage ipsImage_thumbnailed" data-fileid="51301" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_09/17.gif.1e35e3989b978cd726793789fe8e5342.gif"></a>
</p>

<p>
	وإن كنت مهتم بخوارزميات التجميع؟ يمكنك الاطلاع على هذه المقالة <a data-ss1621157876="1" data-ss1628757407="1" href="https://towardsdatascience.com/the-5-clustering-algorithms-data-scientists-need-to-know-a36d136ef68" rel="external nofollow">The 5 Clustering Algorithms Data Scientists Need to Know</a>.
</p>

<p>
	نلاحظ أن التجميع مشابه تمامًا للتصنيف، إذ يمكن استخدام المجموعات للكشف عن الحالات الشاذة. هل لاحظت بأن المستخدم يتصرف بطريقة غير طبيعية بعد اشتراكه بموقعكK أو بخدمتك؟ دع الآلة تحجبه مؤقتًا، وتنشئ تذكرة للدعم الفني لفحص هذا النشاط المريب لاتخاذ القرار المناسب. فربما يكون روبوت آلي يحاول إشغال الخادم الّذي تحجزه لموقعك. في الحقيقة لن نحتاج حتى لمعرفة ماهيّة "السلوك الطبيعي" للمُستخدم وإنما سنأخذ جميع أفعال ونشاطات المستخدم ونحملها إلى نموذجنا ونترك الآلة تقرر ما إذا كان هذا المستخدم "نموذجيًا" أم لا.
</p>

<p>
	يمكن أن لا يعمل هذا النهج بطريقة جيد بالموازنة مع التصنيف، ولكن القرار النهائي سيُبنى على المحاولة والتجربة.
</p>

<h3 id="تقليل-الأبعاد">
	تقليل الأبعاد (Dimensionality Reduction)
</h3>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="51302" data-ss1621157876="1" data-ss1628757407="1" href="https://academy.hsoub.com/uploads/monthly_2020_09/18.png.b752fc33d420e869ec61e8a8698bca56.png" rel=""><img alt="18.png" class="ipsImage ipsImage_thumbnailed" data-fileid="51302" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_09/18.png.b752fc33d420e869ec61e8a8698bca56.png"></a>
</p>

<p>
	وتعرف أيضًا بالتعميم (Generalization) وهي عملية تجميع ميّزات محددة بداخل ميّزات ذات مستوى أعم وأعلى.
</p>

<p>
	ومن بعض التطبيقات العملية لهذه الطريقة نجد:
</p>

<ul>
	<li>
		أنظمة التوصية.
	</li>
	<li>
		التصورات (المحاكاة) الجميلة.
	</li>
	<li>
		نمذجة الموضوعات والبحث عن وثائق مماثلة.
	</li>
	<li>
		تحليل الصور المزيفة.
	</li>
	<li>
		إدارة المخاطر.
	</li>
</ul>

<p>
	ومن بعض الخوارزميات الشائعة لتطبيقها:
</p>

<ul>
	<li>
		خوارزمية تحليل المكونات الرئيسية Principal Component Analysis ويشار لها اختصارًا (PCA).
	</li>
	<li>
		خوارزمية تحليل القيمة المفردة Singular Value Decomposition ويشار لها اختصارًا (SVD).
	</li>
	<li>
		خوارزمية Latent Dirichlet allocation.
	</li>
	<li>
		خوارزمية التحليل الدلالي الكامن Latent Semantic Analysis ويشار إليها اختصارًا (LSA أو pLSA أو GLSA).
	</li>
	<li>
		خوارزمية t-SNE (التي تستخدم في مجال الرؤية الحاسوبية).
	</li>
</ul>

<p>
	استخدم علماء البيانات المتعصبون سابقًا هذه الأساليب، وكان عليهم العثور على "شيئ مثير للاهتمام" في أكوام ضخمة من الأرقام. وعندما لم تساعدهم مخططات إكسل بهذه المهمة أجبروا الآلات على العثور على الأنماط. حتى حصلوا على طريقة تقليل الأبعاد أو ميّزة تعلّم كيفية تقليل البعد.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="gif" data-fileid="51303" data-ss1621157876="1" data-ss1628757407="1" href="https://academy.hsoub.com/uploads/monthly_2020_09/19.gif.d7bb78bef62d4a7ace69a4d47b3f0344.gif" rel=""><img alt="19.gif" class="ipsImage ipsImage_thumbnailed" data-fileid="51303" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_09/19.thumb.gif.7f31313cd98a28e389de677fcbdb195c.gif"></a>
</p>

<p>
	من الأفضل دائمًا استخدام <strong>التلخيص</strong> أو <strong>التجريد</strong> (Abstractions)، عوضًا عن مجموعة من الميزات المجزأة. فمثلًا، يمكننا دمج كلّ الكلاب ذات الآذان مثلثية الشكل والأنوف الطويلة والذيل الكبير ليصبح لدينا تلخيص لشكل كلب لطيف وهو كلب "شبيرد". نعم فقدنا بعض المعلومات حول الصفات المميزة الخاصة بالكلب شبيرد، إلا أن التلخيص الجديد يعدّ أكثر فائدة لتسمية الأغراض وتوضيحها. بالإضافة إلى ذلك، إن النماذج المُلخAصة تتعلّم بطريقة أسرع، ولا تظهر لديها مشكلة <strong>"فرض التخصيص"</strong> (Overfitting) -الّتي سنتحدث عنها بالتفصيل لاحقًا- بكثرة وهي تستخدم عددًا أقل من الميّزات.
</p>

<p>
	أصبحت هذه الخوارزميات أداة مذهلة "لنمذجة المواضيع". إذ يمكننا تلخيص مواضيع من كلمات محددة لمعانيها. هذا ما تفعله <strong>خوارزمية التحليل الدلالي الكامن</strong>. تعتمد على عدد مرات تكرار كلمة معينة في موضوع محدد. مثل: استخدام كلمة "تقنية" بكثرة في المقالات التقنية، وبالتأكيد سنعثر على أسماء الأشخاص السياسيين بكثرة في الأخبار السياسية وهكذا.
</p>

<p>
	كما يمكننا بكل تأكيد إنشاء مجموعات من جميع الكلمات في المقالات، ولكننا سنفقد جميع الروابط المهمة بين معاني الكلمات خصيصًا العلاقة بين الكلمات ذات المعنى نفسه مثل البطارية (Battery) والبطارية المقصود بها المدخرات الكهربائية - (Accumulator) الموجودة في مستندات مختلفة. إلا أن خوارزمية التحليل الدلالي الكامن ستتعامل معها بالطريقة الصحيحة، ولهذا السبب تحديدًا سمّيت "بخوارزمية التحليل الدلالي الكامن".
</p>

<p>
	لذلك نحن بحاجة إلى ربط الكلمات والمستندات في ميزة واحدة للحفاظ على هذه الاتصالات الكامنة واتضح لنا بأن خوارزمية التفكيك المفرد (<a data-ss1621157876="1" data-ss1628757407="1" href="https://en.wikipedia.org/wiki/Singular_value_decomposition" rel="external nofollow">Singular decomposition</a>) تؤدي هذه المهمة بقوة، مما يشفُ عن فائدة المجموعات المجمعة بحسب الموضوع الّتي تحدثنا عنها سابقًا.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="51304" data-ss1621157876="1" data-ss1628757407="1" href="https://academy.hsoub.com/uploads/monthly_2020_09/20.png.563ed710b3116bf171f542b1ef47977d.png" rel=""><img alt="20.png" class="ipsImage ipsImage_thumbnailed" data-fileid="51304" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_09/20.thumb.png.27bc573dae15c5f638b9fd6e4ae8948c.png"></a>
</p>

<p>
	من الاستخدامات الشائعة الأخرى هي <strong>أنظمة التوصية</strong> (Recommender Systems) و<strong>التصفية التعاونية</strong> (Collaborative Filtering) من أجل تقليل الأبعاد. مما يبدو أنه إذا كنت تستخدمه في تلخيص تقييمات المستخدمين، فستحصل على نظام رائع للتوصية بالأفلام والموسيقى والألعاب بل وحتى أي شيئ تريده.
</p>

<p>
	للمزيد من المعلومات حول هذا الموضوع نوصيك بالكتاب الرائع "برمجة الذكاء الجمعي" <a data-ss1621157876="1" data-ss1628757407="1" href="http://shop.oreilly.com/product/9780596529321.do" rel="external nofollow">Programming Collective Intelligence</a>.
</p>

<p>
	بالكاد سنتمكن من فهم فهمًا كاملًا لفكرة <strong>التلخيص</strong> (أو التجريد) الآلي، ولكن من الممكن رؤية بعض الارتباطات عن قرب. إذ يرتبط بعضها بعمر المستخدم فمثلًا يلعب الأطفال لعبة ماين كرافت (Minecraft) ويشاهدون معها الرسوم المتحركة بكثرة، ويرتبط بعض المستخدمين الآخرين بنوعية فيلم معينة أو بهوايات مخصصة وهكذا.
</p>

<p>
	تستطيع الآلات الحصول على هذه المفاهيم التجريدية عالية المستوى من دون حتى فهم ماهيتها، بناءً فقط على معرفة تقييمات المستخدم.
</p>

<h3 id="تعلم-قواعد-الربط">
	تعلم قواعد الربط (Association Rule Learning)
</h3>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="51306" data-ss1621157876="1" data-ss1628757407="1" href="https://academy.hsoub.com/uploads/monthly_2020_09/21.png.213e8d45e0ac41086bbff6fdef8024c9.png" rel=""><img alt="21.png" class="ipsImage ipsImage_thumbnailed" data-fileid="51306" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_09/21.png.213e8d45e0ac41086bbff6fdef8024c9.png"></a>
</p>

<p>
	وهي طريقة للبحث عن الأنماط في تدفق الطلبات.
</p>

<p>
	حاليا تستخدم في عدد من المجالات مثل:
</p>

<ul>
	<li>
		التنبؤ بالمبيعات والخصومات.
	</li>
	<li>
		تحليل البضائع المشتراة معًا.
	</li>
	<li>
		معرفة كيفية وضع المنتجات على الرفوف.
	</li>
	<li>
		تحليل أنماط تصفح الإنترنت.
	</li>
</ul>

<p>
	الخوارزميات الشائعة لها هي:
</p>

<ul>
	<li>
		خوارزمية Apriori.
	</li>
	<li>
		خوارزمية Eclat.
	</li>
	<li>
		خوارزمية FP-growth.
	</li>
</ul>

<p>
	وتستخدم هذه الطريقة لتحليل عربات (سلّات) التسوق الإلكترونية أو الواقعية، كما تستخدم أيضًا لأتمتة استراتيجية التسويق، والمهام الأخرى المتعلقة بمثل هذه الأحداث. وتحديدًا عندما يكون لديك تسلسل لشيئ معين وترغب في إيجاد أنماط فيه - جرب هذه الأشياء.
</p>

<p>
	لنفترض أن العميل سيأخذ ستة عبوات من العصائر ويذهب إلى طاولة المحاسبة ثم إلى باب الخروج. هل يجب أن نضع الفول السوداني بجانب الطريق المؤدي إلى طاولة المحاسبة؟ وفي حال وضعناها، كم مرة سيشتريها الناس بالمجمل؟ لربما تتماشى العصائر مع الفول السوداني، ولكن ما هي التسلسلات الأخرى الّتي يمكننا التنبؤ بها اعتمادًا على البيانات؟ هل يمكن لتغييرات بسيطة في ترتيب البضائع أن تؤدي إلى زيادة كبيرة في الأرباح؟
</p>

<p>
	وينطبق نفس الشيء على التجارة الإلكترونية. إذ المهمة هنا أكثر حماسية وإثارة للاهتمام، فما الّذي سيشتريه العميل في المرة القادمة؟ هل سيشتري المنتجات النباتية؟ أم الحيوانية؟
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="51307" data-ss1621157876="1" data-ss1628757407="1" href="https://academy.hsoub.com/uploads/monthly_2020_09/22.png.8e709181e16655cda8ca41216a7d4893.png" rel=""><img alt="22.png" class="ipsImage ipsImage_thumbnailed" data-fileid="51307" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_09/22.thumb.png.a8fdae79f3c08c210000490dcf74c9ef.png"></a>
</p>

<p>
	تعتمد الأساليب الكلاسيكية لتعلم الآلة على نظرة مباشرة على جميع السلع المشتراة باستخدام الأشجار أو المجموعات. يمكن للخوارزميات البحث عن الأنماط فقط، ولكن لا يمكنها تعميمها أو إعادة إنتاجها بما يتوافق مع الأمثلة الجديدة.
</p>

<p>
	أما في العالم الحقيقي فإن كلّ متجر تجزئة كبير يبني حلًا خاصًا ومناسبًا له، لذلك لا نرى تطورات كبيرة في هذا المجال. وعلى المستوى التقني فإن أعلى مستوى من التقنيات المستخدمة هي أنظمة التوصية (أو تسمى أحيانًا الأنظمة الناصحة).
</p>

<h2 id="التعلم-المعزز">
	التعلم المعزز (Reinforcement Learning)
</h2>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="51309" data-ss1621157876="1" data-ss1628757407="1" href="https://academy.hsoub.com/uploads/monthly_2020_09/23.png.d93205901c4d5e2eb5a22a871937dd79.png" rel=""><img alt="23.png" class="ipsImage ipsImage_thumbnailed" data-fileid="51309" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_09/23.png.d93205901c4d5e2eb5a22a871937dd79.png"></a>
</p>

<p>
	وهو عملية رمي روبوت في متاهة وتركه بمفرده ليجد طريق الخروج بنفسه.
</p>

<p>
	من بعض التطبيقات العملية المستخدمة حاليًا:
</p>

<ul>
	<li>
		السيارات ذاتية القيادة.
	</li>
	<li>
		روبوت تنظيف الأرضية.
	</li>
	<li>
		الألعاب.
	</li>
	<li>
		أتمتة التداول.
	</li>
	<li>
		إدارة موارد المؤسسة.
	</li>
</ul>

<p>
	من أبرز الخوارزميات الشائعة لها:
</p>

<ul>
	<li>
		خوارزمية التعلم المعزز وفق النموذج الحر Q-Learning.
	</li>
	<li>
		خوارزمية خطة ماركوف للتعلّم المعزز لاتخاذ القرار SARSA.
	</li>
	<li>
		خوارزمية التعلم المعزز العميق وفق النموذج الحر DQN.
	</li>
	<li>
		خوارزمية الناقد المميز غير المتزامن A3C.
	</li>
	<li>
		الخوارزمية الجينية Genetic algorithm.
	</li>
</ul>

<p>
	أخيرًا وليس آخرًا، نصل إلى شيئ يشبه الذكاء الحقيقي. في كثير من المقالات نرى خطأ شائعًا بأن يصنف التعلّم المعزز تحت قسم التعلّم الموجّه أو أحيانًا في قسم التعلّم غير الموجّه. لذا وجب التنويه إلى كونه طريقة تعلّم منفصلة.
</p>

<p>
	يستخدم التعلّم المعزز في الحالات الّتي لا تتعلق فيها مشكلتك بالبيانات على الإطلاق، وإنما لديك بيئة افتراضية تتعامل معها. مثل عالم ألعاب الفيديو أو مدينة افتراضية للسيارات ذاتية القيادة.
</p>

<p>
	إن معرفة جميع قواعد الطرقات الجوية في العالم لن تعلّم الطيار الآلي كيفية القيادة على بأحد الطرق الجوية. بغض النظر عن مقدار البيانات الّتي نجمعها، لا يزال يتعذر علينا توقع جميع المواقف المحتملة. وهذا هو السبب الأساسي لهدف التعلم المعزز وهو ** تقليل الخطأ، وليس التنبؤ بجميع التحركات المحتملة**.
</p>

<p>
	إن البقاء على قيد الحياة في البيئة الافتراضية هي الفكرة الأساسية للتعلم المعزز. إذ سنعتمد على ترك الروبوت الصغير الفقير يتجول في الحياة الافتراضية ونُعاقبه على الأخطاء ونُكافؤه على الأفعال الصحيحة. بنفس الطريقة الّتي نعلم بها أطفالنا، أليس كذلك؟
</p>

<p>
	الطريقة أكثر فعالية لتدريب الروبوت هي بناء مدينة افتراضية والسماح للسيارة ذاتية القيادة بتعلم كلّ طرق القيادة وحيلها فيها أولًا. في الحقيقة هذه هي الطريقة المعتمدة في تدريب الروبوت الموجودة في السيارات ذاتية القيادة. إذ ننشئ في البداية مدينة افتراضية استنادًا لخريطة المدينة الحقيقية، ونضيف إليها أناس افتراضيين يمشون في الشوارع (لمحاكاة الواقع) ونترك السيارة تتعلم بمفردها وذلك بوضع هدف نصب أعيننا وهو "تقليل العدد الّذي تقتله من الناس بأقل ما يمكن" وهكذا يستمر الروبوت في التدرب إلى أن يصل لمرحلة لا يقتل بها أحد. عندما يؤدي الروبوت أداءً جيدًا في لعبة GTA عندها سنُحرره ونختبره في الشوارع الحقيقية.
</p>

<p>
	قد يكون هناك نهجان مختلفان للتعلم المعزز وهما:
</p>

<ul>
	<li>
		نهج قائم على نموذج (Model-Based).
	</li>
	<li>
		نهج غير قائم على نموذج أو النهج الحر (Model-Free).
	</li>
</ul>

<p>
	إن النهج القائم على نموذج يعني أن السيارة بحاجة لحفظ كامل الخريطة أو أجزائها. هذا نهج قديم جدًا لأنه من المستحيل بالنسبة للسيارة الفقيرة ذاتية القيادة أن تحفظ الكوكب بأكمله.
</p>

<p>
	أما في النهج غير القائم على نموذج فلا تحفظ السيارة كلّ حركة ولكنها تحاول تعميم المواقف، ومحاولة التصرف بعقلانية إلى جانب محاولتها الحصول على أقصى مكافأة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="51310" data-ss1621157876="1" data-ss1628757407="1" href="https://academy.hsoub.com/uploads/monthly_2020_09/24.png.b1f5ddf8e133d9e515bb638ff3524625.png" rel=""><img alt="24.png" class="ipsImage ipsImage_thumbnailed" data-fileid="51310" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_09/24.thumb.png.2e7f99104b7e750fe7dcaac012281686.png"></a>
</p>

<p>
	هل تذكر <a data-ss1621157876="1" data-ss1628757407="1" href="https://www.wired.com/2016/01/in-a-huge-breakthrough-googles-ai-beats-a-top-player-at-the-game-of-go/" rel="external nofollow">الأخبار</a> المتداولة حول خسار بطل العالم بلعبة Go أمام الذكاء الصنعي؟ هل تعلم بأن عدد التركيبات القانونية المحتملة للعبِ بهذه اللعبة أكبر من عدد الذرات الموجودة في الكون كلّه؟ حتى أن العلماء <a data-ss1621157876="1" data-ss1628757407="1" href="https://motherboard.vice.com/en_us/article/vv7ejx/after-2500-years-a-chinese-gaming-mystery-is-solved" rel="external nofollow">أثبتوا</a> ذلك لاحقًا. ولكن هل سنطلب من هذا الروبوت المسكين حفظ كلّ ذلك؟
</p>

<p>
	في الواقع أن الآلة لم تتذكر جميع التركيبات المحتملة للعب ومع ذلك فازت بلعبة Go، إذ حاولت تطبيق أفضل حركة في كلّ دور على حدة (تمامًا كما فعلت في لعبة الشطرنج عندما هزمت غاري كاسباروف في <a data-ss1621157876="1" data-ss1628757407="1" href="https://arabicedition.nature.com/journal/2017/06/544413a/%D9%85%D8%A8%D8%A7%D8%B1%D8%A7%D8%A9-%D8%A7%D9%84%D9%82%D8%B1%D9%86-%D9%81%D9%8A-%D8%A7%D9%84%D8%B4%D8%B7%D8%B1%D9%86%D8%AC" rel="external nofollow">المباراة</a> الشهيرة سنة 1997 والّتي سميت بمباراة القرن). هي فعليًا اختارت ببساطة أفضل حركة (من ناحية المكسب) لكلّ حالة، وقد فعلت ما يكفي للتغلب على البشر.
</p>

<p>
	يعد هذا النهج مفهومًا أساسيًا أدى لظهور <strong>التعلّم المعزز وفق النموذج الحرّ</strong> (Q-learning) وهو فرع من فروع <strong>التعلّم المعزز</strong> بل وظهور الخوارزميات مثل <strong>خوارزمية خطة ماركوف للتعلّم المعزز لاتخاذ القرار</strong> (SARSA) و<strong>خوارزمية التعلّم المعزز العميق وفق النموذج الحرّ</strong> (DQN). ومن الجدير بالذكر أن حرف "Q" يشير إلى "الجودة" (Quality) إذ يتعلم الروبوت أداء الفعل الأكثر "نوعية" في كلّ حالة ويحفظ جميع المواقف على أنها <a data-ss1621157876="1" data-ss1628757407="1" href="https://en.wikipedia.org/wiki/Markov_process" rel="external nofollow">سلسلة ماركوفية</a> بسيطة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="51311" data-ss1621157876="1" data-ss1628757407="1" href="https://academy.hsoub.com/uploads/monthly_2020_09/25.png.38815a7e736a5993824177e849bebf9b.png" rel=""><img alt="25.png" class="ipsImage ipsImage_thumbnailed" data-fileid="51311" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_09/25.thumb.png.11ec98ec46a454820fc27d1f09524f36.png"></a>
</p>

<p>
	يمكن للآلة اختبار مليارات المواقف والحالات في البيئة افتراضية، ويمكنها تذكر جميع الحلول الّتي أدت لمكافأة أكبر. ولكن كيف يمكنها أن تميز المواقف الّتي رأتها مسبقًا عن المواقف الجديدة كليًا؟ فمثلًا إذا كانت السيارة ذاتية القيادة في إحدى التقاطعات بين الشوارع وكانت إشارة المرور حمراء وتحولت فجأة الإشارة الخضراء فهل هذا يعني أنها يمكن أن تسير مباشرة؟ ماذا لو كانت هناك سيارة إسعاف تسير في شارع قريب وتطلب من السيارات الأخرى إفساح الطريق لها؟
</p>

<p>
	الإجابة الحالية على هذا السؤال وفق المعطيات المتاحة إلى يومنا هذا هو "لا أحد يعرف ما الّذي ستفعله هذه السيارة ذاتية القيادة". فعليًا لا توجد إجابة سهلة. لطالما استمر الباحثون في المحاولة للعثور على إجابة، ولكن في الوقت نفسه لا يجدون سوى الحلول المؤقتة لبعض الحالات. إذ يعتمد البعض على محاكاة جميع المواقف يدويًا الّتي تنتج حلًا للحالات الاستثنائية، مثل: <a data-ss1621157876="1" data-ss1628757407="1" href="https://en.wikipedia.org/wiki/Trolley_problem" rel="external nofollow">مشكلة العربة</a>. والبعض الآخر يتعمق أكثر من ذلك ويترك للشبكات العصبية مهمة اكتشافها. وهذا قادنا لتطور التعلم المعزز وفق النموذج الحر (Q-learning) إلى <strong>شبكات التعلم المعزز العميق</strong> (Deep Q-Network). لكنها ليست بالحل المثالي أيضًا.
</p>

<h3 id="طريقة-المجموعات">
	طريقة المجموعات
</h3>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="51313" data-ss1621157876="1" data-ss1628757407="1" href="https://academy.hsoub.com/uploads/monthly_2020_09/26.png.119bbf7a265e6e6960f51ebaa2571d6f.png" rel=""><img alt="26.png" class="ipsImage ipsImage_thumbnailed" data-fileid="51313" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_09/26.png.119bbf7a265e6e6960f51ebaa2571d6f.png"></a>
</p>

<p>
	وهو مجموعة أشجار غبية تتعلّم تصحيح أخطاء بعضها البعض.
</p>

<p>
	من بعض تطبيقاتها العملية في وقتنا الحالي:
</p>

<ul>
	<li>
		جميع التطبيقات الّتي تعمل على الخوارزميات الكلاسيكية (الفارق هنا أنها تقدم أداء أفضل).
	</li>
	<li>
		أنظمة البحث.
	</li>
	<li>
		الرؤية الحاسوبية.
	</li>
	<li>
		الكشف عن الأغراض.
	</li>
</ul>

<p>
	من أبرز الخوارزميات الشائعة لها:
</p>

<ul>
	<li>
		خوارزمية الغابات العشوائية (Random Forest).
	</li>
	<li>
		خوارزمية التدرج المعزز (Gradient Boosting).
	</li>
</ul>

<p>
	حان الوقت للأساليب الحديثة والكبيرة. تعدّ المجمعات والشبكات العصبية مقاتلان رئيسيان يمهدان طريقنا نحو التفرد في عملية التعلّم. واليوم ينتجون أكثر النتائج دقة ويستخدمون على نطاق واسع في جميع الأحداث.
</p>

<p>
	على الرغم من فعاليتها العالية إلا أن الفكرة الكامنة وراءها بسيطة للغاية. إذ تعتمد على أخذ مجموعة من الخوارزميات ذات الفعالية العادية، وتجبرها على تصحيح أخطاء بعضها بعضًا، فستكون الجودة الإجمالية للنظام أفضل من أفضل خوارزميات تعمل بطريقة منفردة.
</p>

<p>
	ستحصل على نتائج أفضل إذا أخذت أكثر الخوارزميات تقلبًا في النتائج، والّتي تتوقع نتائج مختلفة تمامًا في حالة حدوث ضوضاء صغيرة على بيانات الدخل. مثل خوارزميات أشجار القرار وأشجار الانحدار. هذه الخوارزميات حساسة للغاية، حتى أنه يمكن لقيمة شاذة واحدة خارجية مطبقة على بيانات الدخل أن تجعل النماذج يجن جنونها. في الحقيقة هذا بالضبط ما نحتاجه.
</p>

<p>
	هنالك ثلاث طرق لبناء المجمعات:
</p>

<ol>
	<li>
		طريقة التكديس (Stacking).
	</li>
	<li>
		طريقة التعبئة (Bagging).
	</li>
	<li>
		طريقة التعزيز (Boosting).
	</li>
</ol>

<p>
	سنشرح كلّ واحدٍ منهم على حدة:
</p>

<h4 id="طريقة-التكديس">
	1. طريقة التكديس (Stacking)
</h4>

<p>
	تُمرر مجموعة من النماذج المتوازية كمدخلات للنموذج الأخير والّذي سيتخذ القرار النهائي.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="51314" data-ss1621157876="1" data-ss1628757407="1" href="https://academy.hsoub.com/uploads/monthly_2020_09/27.png.2a7191873e9fbc9f454a19fc0862f283.png" rel=""><img alt="27.png" class="ipsImage ipsImage_thumbnailed" data-fileid="51314" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_09/27.thumb.png.c289517df69d34f4d462cd940de94c93.png"></a>
</p>

<p>
	تَنتجُ هذه النماذج من تطبيق خوارزميات مختلفة وكلمة "مختلفة" تعني أي أن خلط تكديس نفس الخوارزميات على نفس البيانات لن يكون له أي معنى أو أهمية. وإن عملية اختيار الخوارزميات أمر متروك لك مطلق الحرية في اختباره. إلا أنه بالنسبة للنموذج المعني باتخاذ القرار النهائي، عادة ما يكون الانحدار خيارًا جيدًا لخوارزميته.
</p>

<h4 id="طريقة-التعبئة">
	2. طريقة التعبئة (Bagging)
</h4>

<p>
	وهي معروفة أيضًا باسم Bootstrap Aggregating. في هذه الطريقة نستخدم نفس الخوارزمية، ولكن ندربها على مجموعات فرعية مختلفة من البيانات الأصلية. في النهاية نحسب متوسط الإجابات فقط.
</p>

<p>
	يمكن أن تتكرر البيانات في مجموعات فرعية عشوائية. فمثلًا، يمكننا الحصول على مجموعات فرعية من المجموعة "1-2-3" مثل: "2-2-3" و"1-2-2" و"3-1-2" وما إلى ذلك. نستخدم مجموعات البيانات الجديدة هذه لتعليم الخوارزمية نفسها عدة مرات، ثمّ نتوقع الإجابة النهائية عن طريق خوارزمية البسيطة التصويت بالأغلبية.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="51315" data-ss1621157876="1" data-ss1628757407="1" href="https://academy.hsoub.com/uploads/monthly_2020_09/28.png.b51877fa5b9356c0f7275cc6ebea795b.png" rel=""><img alt="28.png" class="ipsImage ipsImage_thumbnailed" data-fileid="51315" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_09/28.thumb.png.17919dcd35ea1d71ecbe26f376082415.png"></a>
</p>

<p>
	أشهر مثال على استخدام طريقة التعبئة هي خوارزمية الغابات العشوائية (<a data-ss1621157876="1" data-ss1628757407="1" href="https://www.youtube.com/watch?v=J4Wdy0Wc_xQ" rel="external nofollow">Random Forest</a>) والتي ببساطة تعبأ باستخدام أشجار القرار (الّتي سبق وأن وتحدثنا عنها في الفقرات السابقة). فمثلًا عند فتحك لتطبيق الكاميرا الخاص بهاتفك ورؤيتك لمربعات مرسومة حول وجوه الأشخاص فيجب أن تسأل نفسك، كيف حدث ذلك؟
</p>

<p>
	في الحقيقة من المحتمل أن تكون هذه النتيجة بفضل خوارزمية الغابات العشوائية. وذلك لأن الشبكات العصبية بطيئة جدًا عند تشغيلها في الزمن الحقيقي (Real-time)، وبالمقابل تكون طريقة التعبئة مثالية بهذه الحالات لأنه يمكنها أن تبني أشجار القرار على جميع البطاقات الرسومية الضعيفة والقوية بل وحتى على المعالجات الجديدة الفاخرة الخاصة بتعلّم الآلة!
</p>

<p>
	في بعض المهام، تكون الاستراتيجية المتبعة هي التركيز على قدرة الغابة العشوائية على العمل بالتوازي مثلما يحدث عند استخدام الشبكات العصبية الاصطناعية أما طريقة التجميع لا تستطيع العمل بالتوازي، والبعض الآخر من التطبيقات تتطلب السرعة الّتي تستطيع تحققها طرق المجموعات بغض النظر عن أسلوب تطبيقها وتحديدًا في المهام الّتي تتطلب معالجة بالزمن الحقيقي. ولكنها في النهاية مسألة مفاضلة بين خياري الدقة أو السرعة وذلك بحسب كلّ مهمة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="51316" data-ss1621157876="1" data-ss1628757407="1" href="https://academy.hsoub.com/uploads/monthly_2020_09/29.png.b8a255adcd210a22e2e84662600e1e74.png" rel=""><img alt="29.png" class="ipsImage ipsImage_thumbnailed" data-fileid="51316" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_09/29.thumb.png.add2af18540d4065c9d87fd3cb0a4810.png"></a>
</p>

<h4 id="طريقة-التعزيز">
	3. طريقة التعزيز (Boosting)
</h4>

<p>
	وهي الطريقة الّتي تعتمد على تدريب الخوارزميات واحدةً تلو الآخرى. وكلّ خوارزمية لاحقة تولي معظم اهتمامها لنقاط البيانات الّتي أخطأت الخوارزمية السابقة في تفسيرها. وتكرر هذه العملية إلى أن تصبح النتيجة مرضية.
</p>

<p>
	كما هو الحال في طريقة التعبئة، تستخدم الخوارزمية مجموعات فرعية متنوعة من بياناتنا ولكن هذه المرة لن نُنشئها بطريقة عشوائية. وإنما في كلّ عينة فرعية، نأخذ جزءًا من البيانات الّتي فشلت الخوارزمية السابقة في معالجتها. وبذلك نُنشئ خوارزمية جديدة لتتعلم كيفية إصلاح الأخطاء الموجودة في الخوارزمية السابقة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="51318" data-ss1621157876="1" data-ss1628757407="1" href="https://academy.hsoub.com/uploads/monthly_2020_09/30.png.60f06f635471009b0f5857bf7f3fe401.png" rel=""><img alt="30.png" class="ipsImage ipsImage_thumbnailed" data-fileid="51318" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_09/30.thumb.png.ef934fe6c9389b951f5826457027937b.png"></a>
</p>

<p>
	الميزة الرئيسية في طرق التجميع هي الدقة الممتازة بالموازنة مع الوقت المأخوذ، وتعد أسرع بكثير من الشبكات العصبية. تقريبًا الأمر أشبه ما يمكن بسباق بين سيارة وشاحنة على المضمار. يمكن للشاحنة أن تؤدي المزيد من الأفعال، ولكن في حال أردت أن تسير بسرعة فحتمًا ستأخذ السيارة. لالقاء نظرة على مثال حقيقي لاستخدام طرق التجميع (وتحديدًا طريقة التعزيز) افتح موقع فيسبوك أو موقع غوغل واكتب أي استعلام في مربع البحث. هل يمكنك سماع جيوش من الأشجار تزأر وتتحطم معًا لفرز النتائج حسب الصلة؟ ذلك بسبب أن هذه الشركات <a data-ss1621157876="1" data-ss1628757407="1" href="https://code.fb.com/ml-applications/evaluating-boosted-decision-trees-for-billions-of-users/" rel="external nofollow">يستخدمون طريقة التجميع باستخدام التعزيز</a>. حاليًا هناك ثلاث أدوات شائعة لتطبيق طريقة التعزيز، يمكنك قراءة هذا التقرير المفصل الّذي يوازن بينها <a data-ss1621157876="1" data-ss1628757407="1" href="https://towardsdatascience.com/catboost-vs-light-gbm-vs-xgboost-5f93620723db" rel="external nofollow">CatBoost مقابل LightGBM مقابل XGBoost</a>.
</p>

<h2 id="الشبكات-العصبية-والتعلم-العميق">
	الشبكات العصبية (Neural Networks) والتعلم العميق (Deep Leaning)
</h2>

<h3 id="الشبكات-العصبية">
	الشبكات العصبية (Neural Networks)
</h3>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="51319" data-ss1621157876="1" data-ss1628757407="1" href="https://academy.hsoub.com/uploads/monthly_2020_09/31.png.ca8cc68d2be7bc57a0e9ff1a03e1b5a8.png" rel=""><img alt="31.png" class="ipsImage ipsImage_thumbnailed" data-fileid="51319" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_09/31.png.ca8cc68d2be7bc57a0e9ff1a03e1b5a8.png"></a>
</p>

<p>
	الشبكات العصبية: وهي عبارة عن مجموعة من الخلايا العصبية الاصطناعية الموجودة في طبقاتٍ متوضعةٍ فوق بعضها بعضًا، ولها طبقة أولية، وطبقة النهائية، تتلقى الطبقة الأولية المعلومات الخام، وتعالجها لتُمررها لاحقًا للطبقة الّتي تليها وهكذا إلى أن نحصل على الخرج من الطبقة النهائية.
</p>

<p>
	بعض أشهر تطبيقاتها العملية المستخدمة في وقتنا الحالي:
</p>

<ul>
	<li>
		تحديد الكائن في الصور ومقاطع الفيديو.
	</li>
	<li>
		التعرف على الكلام والتراكيب اللغوية.
	</li>
	<li>
		معالجة الصور وتحويل التنسيق.
	</li>
	<li>
		الترجمة الآلية.
	</li>
	<li>
		بالإضافة إلى أنه يمكنها أن تعمل عوضًا عن جميع تطبيقات طرق تعلّم الآلة السابقة.
	</li>
</ul>

<p>
	من بعض الهيكليات الشائعة للشبكات العصبية:
</p>

<ul>
	<li>
		الشبكات العصبية بيرسيبترون (Perceptron).
	</li>
	<li>
		الشبكات العصبية التلافيفية (CNN).
	</li>
	<li>
		الشبكات العصبية المتكررة (RNN).
	</li>
	<li>
		الشبكات العصبية ذات الترميز التلقائي (Autoencoders).
	</li>
</ul>

<p>
	إن أي شبكة عصبية اصطناعية هي في الأساس مجموعة من <strong>الخلايا العصبية الاصطناعية</strong> (Neurons) و <strong>الاتصالات</strong> (Connections) الّتي بينهم. وإن <strong>الخلية العصبية الاصطناعية</strong>: هي مجرد تابع لديه مجموعة من المدخلات وخرج وحيد. وتتمثل مهمة الخلية العصبية الاصطناعية في أخذ جميع الأرقام من مدخلاتها، وأداء الوظيفة المنوطة إليها وإرسال النتيجة للخرج.
</p>

<p>
	<strong>الاتصالات</strong> تشبه إلى حدٍ ما القنوات بين الخلايا العصبية الحقيقية. إذ تربط مخرجات خلية عصبية معينة لمدخل خلية عصبية أخرى حتى يتمكنوا من إرسال الأرقام والنتائج لبعضهم بعضًا. وكلّ اتصال له وسيط واحد فقط وهو الوزن (Weight). وهو مشابه لقوة الاتصال للإشارة. فعندما يمر الرقم 10 من خلال اتصال بوزن 0.5 يتحول إلى 5.
</p>

<p>
	هذه الأوزان تطلب من الخلية العصبية الاصطناعية أن تستجيب أكثر للدخل ذو الوزن الأكبر، وأقل للدخل ذو الوزن الأقل. تُعدل هذه الأوزان عند التدريب وهكذا تتعلّم الشبكة العصبية الاصطناعية.
</p>

<p>
	فيما يلي مثال لخلايا عصبية اصطناعية بسيطة ولكنها مفيدة في الحياة الواقعية: ستجمع جميع الأرقام من مدخلاتها وإذا كان هذا العدد أكبر من N فستُعطي النتيجة 1 وإلا ستعطي النتيجة 0.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="51320" data-ss1621157876="1" data-ss1628757407="1" href="https://academy.hsoub.com/uploads/monthly_2020_09/32.png.6bc9d9f15d5328c8fdf843fab4017897.png" rel=""><img alt="32.png" class="ipsImage ipsImage_thumbnailed" data-fileid="51320" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_09/32.thumb.png.bd33b2e17b9c6048ca6ffb8826d604b5.png"></a>
</p>

<p>
	لمنع حدوث فوضى في الشبكة، ترتبط الخلايا العصبية بطبقات، وليس بطريقة عشوائية. لا ترتبط الخلايا العصبية داخل الطبقة الواحدة، وإنما تتصل بالخلايا العصبية للطبقات التالية والسابقة (الأعلى والأسفل). تتحرك البيانات في الشبكة العصبية الاصطناعية تحركًا صارمًا باتجاه واحد من مدخلات الطبقة الأولى إلى مخرجات الطبقة الأخيرة.
</p>

<p>
	إذا وضعت عددًا كافيًا من الطبقات ووضعت الأوزان بطريقة صحيحة، فستحصل على النتيجة المرجوة وإليك مثلًا يوضح الأمر، تريد أن تكتشف ما هو الرقم المكتوب بخط اليد في الصورة الممررة، ستمرر الصورة إلى الشبكة عن طريق مدخلات الطبقة الأولى، وبعدها فإن البكسلات السوداء ستُنشّط الخلايا العصبية المرتبطة بها، وهي بدورها ستُنشّط الطبقات التالية المرتبطة بها، وهكذا حتى يضيء أخيرًا المخرج المسؤول عن الرقم أربعة. إذا هكذا وصلنا للنتيجة المرجوة (سنأخذ هذا المثال بوضوح أكبر وبكلّ تفاصيله الدقيقة في الجزء الثاني من هذه السلسلة).
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="51321" data-ss1621157876="1" data-ss1628757407="1" href="https://academy.hsoub.com/uploads/monthly_2020_09/33.png.591198a6a7dd87303c66a263ce417a87.png" rel=""><img alt="33.png" class="ipsImage ipsImage_thumbnailed" data-fileid="51321" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_09/33.thumb.png.bad88bb4fc14adccce3591e0fb658f43.png"></a>
</p>

<p>
	في الواقع عند برمجة الخلايا العصبية على الحاسب لا نكتب عمليًا الخلايا العصبية والوصلات المرتبطة بها. وإنما يمثل كلّ شيء كمصفوفات وتحسب النتيجة بناءً على ضرب المصفوفات ببعضها بعضًا للحصول على أداء أفضل. يبسط هذا <a data-ss1621157876="1" data-ss1628757407="1" href="https://www.youtube.com/watch?v=aircAruvnKk" rel="external nofollow">الفيديو</a> كيف تحدث عملية التعلّم في الخلايا العصبية الاصطناعية، وكيف تحدد عملية الضرب دقة الشبكة العصبية الّتي لدي (لا تنس أن تغعّل خيار التعليقات التوضيحية لأن الفيديو مترجم إلى اللغة العربية).
</p>

<p>
	تحتوي الشبكة على طبقات متعددة لها روابط بين كلّ خلية عصبية تسمى الشبكات العصبية بيرسيبترون المتعددة (Multilayer Perceptron) وتسمى اختصارًا (MLP) وتعد أبسط بنية مناسبة للمبتدئين.
</p>

<p>
	بعد إنشاء الشبكة، ستكون مهمتنا هي تعيين الطرق المناسبة لتتفاعل الخلايا العصبية مع الإشارات الواردة بطريقة صحيحة. وسنُعطي الشبكة بيانات الدخل أو "مدخلات الشبكة العصبية" صورة الرقم المكتوب بخط اليد وبيانات الخرج أو "مخرجات الشبكة العصبية" ستكون الرقم الموافق للصورة المُمررة عبر مدخلات الشبكة. أي سنقول للشبكة <strong>"عدلي أوزانك بالطريقة الصحيحة حتى تستطيعين معرفة الصورة الممررة لك على أنها صورة للرقم 4"</strong>.
</p>

<p>
	في البداية تُسند جميع الأوزان بطريقة عشوائية. بعد أن نعرض لها رقمًا معينًا، إذ تنبعث منها إجابة عشوائية لأن الأوزان ليست صحيحة حتى الآن، ونوازن مدى اختلاف هذه النتيجة عن النتيجة الصحيحة. ثم نبدأ في بالرجوع للخلف عبر الشبكة من المخرجات إلى المدخلات ونخبر كلّ خلية عصبية، لقد تنشطت هنا وأديت عملًا رهيبًا وهكذا.
</p>

<p>
	بعد مئات الآلاف من هذه الدورات "الاستدلال ثمّ التحقق ثمّ التغيير" المتتالية هناك أمل في أن تُصحح الشبكة العصبية أوزانها وتجعلها تعمل على النحو المنشود. الاسم العلمي لهذه المنهجية هي "منهجية الانتشار العكسي" (Backpropagation).
</p>

<p>
	يبسط هذا <a data-ss1621157876="1" data-ss1628757407="1" href="https://www.youtube.com/watch?v=aircAruvnKk" rel="external nofollow">الفيديو</a> كيف تَحدثُ عملية التعلّم بالتفاصيل الدقيقة في الطبقات المخفية وكيف تتعلم من أخطائها (مرة أخرى لا تنسَ أن تغعّل خيار التعليقات التوضيحية لأن الفيديو مترجم إلى اللغة العربية).
</p>

<p>
	يمكن للشبكة العصبية المدربة تدريبًا جيدًا أن تنوب عن عمل أي من الخوارزميات الموضحة في هذا الفصل (بل وغالبًا ما يمكنها أن تعمل بدقة أكثر منهم). وهذا ما جعلها شائعة الاستخدام على نطاق واسع.
</p>

<p>
	اتضح لاحقًا أن الشبكات الّتي تحتوي على عدد كبير من الطبقات تتطلب قوة حسابية لا يمكن تصورها آنذاك (عند بداية ظهور الشبكات العصبية). أما حاليًا فأي حاسوب مُخصص للألعاب يتفوق بالأداء على أداء مراكز البيانات الضخمة آنذاك. لذلك لم يكُ لدى الناس أي أمل في أن تصبح هذه القدرة الحسابية متوفرة ذلك الحين، وكانت فكرة الشبكات العصبية مزعجة بضخامتها.
</p>

<p>
	سنتاول في شرحنا أهم الهياكل المشهورة للشبكات العصبية في الوقت الحاضر.
</p>

<h4 id="الشبكات-العصبية-التلافيفية">
	الشبكات العصبية التلافيفية (Convolutional Neural Networks)
</h4>

<p>
	أحدثت بنية الشبكات العصبية التلافيفية والتي تدعى اختصارًا (CNN) ثورة في عالم الشبكات العصبية حاليًا. إذ تستخدم للبحث عن الكائنات في الصور وفي مقاطع الفيديو، كما تستخدم أيضًا للتعرف على الوجوه، وتحويل التنسيق، وتوليد وتحسين الصور، وإنشاء تأثيرات مثل التصوير البطيء وتحسين جودة الصورة. باختصار تستخدم بنية الشبكات العصبية التلافيفية في جميع الحالات الّتي تتضمن صورًا ومقاطع فيديو.
</p>

<p>
	يمكنك ملاحظة كيف استطاعت تقنيات تعلم الآلة الّتي <a data-ss1621157876="1" data-ss1628757407="1" href="https://github.com/facebookresearch/Detectron" rel="external nofollow">طورتها</a> شركة فيسبوك من تحديد الكائنات الموجودة في الصورة بدقة ممتازة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="51323" data-ss1621157876="1" data-ss1628757407="1" href="https://academy.hsoub.com/uploads/monthly_2020_09/34.png.c9a0c8aa43b70fc3d54a3872f6e2aab8.png" rel=""><img alt="34.png" class="ipsImage ipsImage_thumbnailed" data-fileid="51323" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_09/34.thumb.png.d9949dfebfe36072f9780229f1a2ec1c.png"></a>
</p>

<p>
	من أبرز المشاكل الرئيسية الّتي تواجهنا عند التعامل مع الصور هي صعوبة استخراج الميزات منها. على عكس سهولة الّتي نجدها عند التعامل مع النصوص، إذ في النصوص يمكنك ببساطة تقسيم النص بحسب الجمل، والبحث عن الكلمات ذات سمات معينة، وما إلى ذلك. ولكن في الصور الأمر أعقد من ذلك بكثير إذ يجب تصنيف الصور تصنيفًا يدويًا لكي تتمكن برامج تعلّم الآلة من معرفة مكان آذان القطط أو ذيولها في هذه الصورة المحددة والمنصفة. سميت هذه المنهجية لاحقًا باسم "صناعة الميزات يدويًا" وكان يستخدمها الجميع تقريبًا.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="51324" data-ss1621157876="1" data-ss1628757407="1" href="https://academy.hsoub.com/uploads/monthly_2020_09/35.png.079fb01b6edec85d7ef349356b597279.png" rel=""><img alt="35.png" class="ipsImage ipsImage_thumbnailed" data-fileid="51324" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_09/35.thumb.png.95704f2215049a4c14cecdddd0d4e664.png"></a>
</p>

<p>
	ولكن الأمر لم يتوقف إلى هذا الحد فحسب وإنما ظهرت العديد من المشاكل مع منهجية صناعة الميزات يدويًا.فمثلًا في البداية إذا كانت تعرفت الشبكة العصبية على أذني القطة وأبعدت هذه القطة عن الكاميرا فنحن في مشكلة لأن الشبكة لن ترى شيئًا (بسبب تغيّر حجم أذن القطة).
</p>

<p>
	ثانيًا لنحاول تسمية 10 ميزات مختلفة تميّز القطط عن بقية الحيوانات الأخرى (في الحقيقة أنا أول من فشل في هذه المهمة)، ولكن مع ذلك عندما أرى نقطة سوداء تُسرعُ من جانبي أثناء تجولي في الشارع عند منتصف الليل - حتى لو لمحتها فقط في زاوية عيني - سأستطيع أن أحدد بأنها قطة وليست فأر. والسبب بسيط جدًا إذ لا شعوريًا يصنف دماغنا العديد من الميزات الخاصة بالقطط ولا ينظر إلى شكل الأذن أو عدد الأرجل فقط وذلك بدون أي جهد مني ولا حتى تفكير. وبناءً على ذلك سيصعب الأمر جدًا عند محاولتي لنقل هذه المعرفة إلى الآلة.
</p>

<p>
	لذا فهذا يعني أن الآلة ستحتاج إلى تعلّم هذه الميزات بمفردها، وإنشاء هذه الميزات اعتمادًا على الخطوط الأساسية للصورة. سننفذ ما يلي:
</p>

<ol>
	<li>
		سنقسم الصورة بأكملها إلى كتل ذات حجم 8×8 بكسل.
	</li>
	<li>
		سنخصص لكل نوع من أنواع الخطوط على الصورة رمزًا معينًا - سواء أكان الخط أفقيًا سيكون الرمز [-] أو رأسيًا سيكون الرمز [|] أو قطريًا سيكون الرمز [/]. يمكن أيضًا أن يكون العديد منها مرئيًا للغاية - وهذا يحدث ولذلك لسنا دائمًا على ثقة تامة.
	</li>
</ol>

<p>
	سيكون الناتج عدة جداول من الخطوط الّتي هي في الواقع أبسط الميزات الّتي تمثل حواف الكائنات على الصورة. إنها صور بمفردها ولكنها مبنية من الخطوط. وهكذا نستمر في أخذ كتلة ذات حجم 8×8 ونرى كيف تتطابق معًا. ونعيدها مرارًا وتكرارًا.
</p>

<p>
	تسمى هذه العملية بعملية الإلتفاف أو الطيّ (Convolution)، مستمدة هذا الاسم من تابع الطيّ المطبق فيها. يمكن تمثيل عملية الطيّ كطبقة من الشبكة العصبية، لأنه في نهاية الأمر يمكن لكلّ خلية عصبية أن تكون بمثابة تابع يؤدي أي وظيفة أريدها.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="51325" data-ss1621157876="1" data-ss1628757407="1" href="https://academy.hsoub.com/uploads/monthly_2020_09/36.png.ab8111d03711dfe1764bd9127886fcdd.png" rel=""><img alt="36.png" class="ipsImage ipsImage_thumbnailed" data-fileid="51325" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_09/36.thumb.png.0255fbfd6edc5909b31c1c226721e4eb.png"></a>
</p>

<p>
	عندما نغذي ونزود شبكتنا العصبية بالكثير من صور القطط، فإنها ستعيّن تلقائيًا أوزانًا أكبر لمجموعات الخطوط الّتي تتكرر كثيرًا في هذه النوع من الصور. لا تهتم الآلة ما إذا كان ظهر القطة خطًا مستقيمًا أو جسمًا هندسيًا معقدًا مثل وجه القطة، وبالمجمل ستكون بعض مجموعات الخطوط ستكون نشطة دائمًا.
</p>

<p>
	كمخرجات ستنظر هذه الشبكة العصبية الاصطناعية ذات البنية التلافيفية لأكثر المجموعات نشاطًا في هذه الصور وستبني عليها قرارها فيما إذا كانت الصور لقطة أو لكلب.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="51326" data-ss1621157876="1" data-ss1628757407="1" href="https://academy.hsoub.com/uploads/monthly_2020_09/37.png.47452f9ce6d93451ff7e808203a2334b.png" rel=""><img alt="37.png" class="ipsImage ipsImage_thumbnailed" data-fileid="51326" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_09/37.png.47452f9ce6d93451ff7e808203a2334b.png"></a>
</p>

<p>
	يكمن جمال هذه الفكرة في أن الشبكة العصبية ستبحث عن الميزات الأكثر تميزًا للكائنات بمفردها. لسنا بحاجة لاختيارها يدويًا. يمكننا تزويد الشبكة بكمية كبيرة من الصور لأي كائن فقط من خلال البحث في غوغل عن مليارات من الصور المشابهة وهكذا سوف تنشئ شبكتنا خرائط مميزة من الخطوط وتتعلم كيفية تمييز أي كائن بمفردها.
</p>

<h4 id="الشبكات-العصبية-المتكررة">
	الشبكات العصبية المتكررة (Recurrent Neural Networks)
</h4>

<p>
	تعدّ الشبكات العصبية المتكررة والتي يشار لها اختصارًا (RNN) من أكثر البُنى الهيكلية للشبكات العصبية الاصطناعية شيوعًا في وقتنا الحاضر. وذلك لفوائدها الجمّة إذ أعطتنا الكثير من الأشياء المفيدة مثل: الترجمة الآلية، والتعرف على الكلام، وتركيب صوت مميز للمساعد الشخصي مثل المساعد سيري (Siri). وعمومًا تعدّ هذه البنية من أفضل الخيارات الموجودة للبيانات التسلسلية مثل: الصوت أو النص أو الموسيقى.
</p>

<p>
	هل تذكر القارئ الصوتي الخاص الموجود في نظام التشغيل ويندوز إكس بي (Windows XP)؟ هذا الرجل المضحك يبني الكلمات حرفًا بحرف، محاولًا لصقها معًا. الآن وازن بين صوته وصوت المساعد الشخصي أليكسا الخاص بشركة أمازون، أو المساعد الشخصي الخاص بغوغل، فرق كبير بينهم، أليس كذلك؟ إنهم لا ينطقون الكلمات بوضوح فقط وإنما يضيفون لكنة خاصة مناسبة لهم! إليك هذا <a data-ss1621157876="1" data-ss1628757407="1" href="https://www.youtube.com/watch?v=NG-LATBZNBs" rel="external nofollow">الفيديو</a> اللطيف لشبكة عصبية تحاول أن تتحدث.
</p>

<p>
	كلّ ذلك لأن المساعدين الصوتيين الحديثين مدربون على التحدث على عبارات كاملة دفعة واحدة وليس حرفًا بحرف، يمكننا أخذ مجموعة من النصوص الصوتية وتدريب شبكة عصبية لإنشاء تسلسل صوتي أقرب إلى الكلام الأصلي. بمعنى آخر، سنستخدم النص كمدخل للشبكة العصبية الاصطناعية وصوت الشخص المجرّد كخرج لهذه الشبكة. نطلب من الشبكة العصبية إنشاء بعض الأصوات لنص محدد، ثم موازنته بالصوت الأصلي ومحاولة تصحيح الأخطاء للاقتراب قدر الإمكان من الصوت الأصلي المثالي.
</p>

<p>
	تبدو عملية التعلم بسيطة وكلاسيكية أليس كذلك؟ حتى الشبكات العصبية ذات التغذية المُسبقة تستطيع فعل ذلك. ولكن كيف يجب تعريف مخرجات هذه الشبكة؟ هل سيكون بلفظ كلّ عبارة ممكنة موجودة في اللغة الإنكليزية؟ بالتأكيد هذا ليس خيارًا جيدًا.
</p>

<p>
	هنا ستساعدنا حقيقة أن النص أو الكلام أو حتى الموسيقى؛ ما هي إلا تسلسلات من المعلومات. تتكون من وحدات متتالية (مثل المقاطع اللفظية للكلمات الإنكليزية). تبدو جميعها فريدة من نوعها ولكنها تعتمد على مقاطع سابقة. ألغِ هذا الاتصال بين هذه المقاطع وستحصل على مقطع موسيقي من نوع دبستيب (<a data-ss1621157876="1" data-ss1628757407="1" href="https://ar.wikipedia.org/wiki/%D8%AF%D8%A8%D8%B3%D8%AA%D9%8A%D8%A8" rel="external nofollow">Dubstep</a>).
</p>

<p>
	يمكننا تدريب الشبكة العصبية بيرسيبترون لتوليد هذه الأصوات الفريدة، ولكن كيف ستتذكر الإجابات السابقة؟ لذا تكمن الفكرة في إضافة ذاكرة خاصة لكلّ خلية عصبية اصطناعية، واستخدامها كمدخل إضافي عند تشغيل المقطع التالي. يمكن للخلايا العصبية أن تدون ملاحظات لنفسها مثل اكتشافها لحرفٍ متحرك، ولذلك يتوجب عليها أن تُظهر المقطع الصوتي التالي بنبرة أعلى (في الحقيقة إنها مجرد مقاربة بسطية للغاية). بهذه الطريقة ظهرت الشبكات المتكررة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="51327" data-ss1621157876="1" data-ss1628757407="1" href="https://academy.hsoub.com/uploads/monthly_2020_09/38.png.768fb922d3d6e02b51129f6b3495c535.png" rel=""><img alt="38.png" class="ipsImage ipsImage_thumbnailed" data-fileid="51327" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_09/38.thumb.png.e3fad49565bbf01a1cbf76fc2dd72c5b.png"></a>
</p>

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

<p>
	لذلك عندما لا تستطع الشبكة العصبية نسيان بعض الأشياء غير الهامّة فلن تتمكن من تعلّم الأشياء الجديدة (حتى نحن البشر لدينا نفس المشكلة <strong>نسيان بعض المعلومات غير الهامة</strong>، أو لعلّها ميزة؟ وخصيصًا إذا كانت هذه الأشياء هي ذكريات مؤلمة!).
</p>

<p>
	كان التحسين الأول بسيطًا جدًا وذلك بتحديد حجم معين لذاكرة الخلية العصبية الاصطناعية. لنقل بأن الشبكة ستحفظ آخر 5 نتائج فقط. ولكن أليست هذه الفكرة مناقضة للفكرة الأساسية الّتي انطلقنا منها (وهي تذكر ما تعلمته الشبكة بالكامل)؟
</p>

<p>
	بعد تحديثاتٍ وتطويرات كثيرة جاء لاحقًا نهج أفضل بكثير، والّذي سيستخدم خلايا خاصة، تشبه إلى حدٍ ما ذاكرة الحاسوب. يمكن لكلّ خلية إمكانية تسجيل رقم معين أو قراءته أو إعادة تعيينه. وسميت هذه الخلايا بخلايا الذاكرة طويلة وقصيرة الأجل (LSTM).
</p>

<p>
	والآن عندما تحتاج الخلية العصبية إلى تعيين منبه لتذكر هذا المقطع، فإنها ستضع راية (Flag) في تلك الخلية. مثل "كان الحرف ساكنًا في الكلمة، استخدم المرة التالية قواعد نطق مختلفة". عندما لا تستدعي الحاجة لاستخدام الرايات، سيُعاد ضبط الخلية تاركة فقط الاتصالات "طويلة الأجل" للشبكة العصبية. وبعبارة أخرى، ستُتدربُ الشبكة العصبية ليس فقط لكي تتعلّم كيفية ضبط الأوزان وإنما لتتعلّم أيضًا كيفية ضبط الرايات (وهي أشبه ما يمكن بالمنبهات) في الخلايا العصبية.
</p>

<p>
	قد يبدو الحل بسيط جدًا ومع ذلك يعمل بكفاءة عالية. لكن ماذا لو دمجنا إمكانية تعديل مقاطع الفيديو باستخدام الشبكات العصبية التلافيفية (CNN) مع إمكانية تعديل الصوت باستخدام الشبكات العصبية المتكررة (RNN) على ماذا سنحصل؟ هل حقًا سنحصل على الرئيس السابق للولايات المتحدة الأمريكية؟ إليك هذا <a data-ss1621157876="1" data-ss1628757407="1" href="https://www.youtube.com/watch?v=cQ54GDm1eL0" rel="external nofollow">الفيديو</a> لتكتشف الأمر.
</p>

<h3 id="التعلم-العميق">
	التعلم العميق (Deep Learning)
</h3>

<p>
	إذا أردنا أن نختصر التعلم العميق بجملة واحدة وواحدة فقط ستكون حتمًا: <strong>"التعلّم العميق هو شبكة عصبية اصطناعية كبيرة"</strong>.
</p>

<p>
	من بعض التطبيقات العملية للتعلم العميق:
</p>

<ul>
	<li>
		التعرف على الصور والأصوات.
	</li>
	<li>
		تحليل بيانات الأرصاد الجوية.
	</li>
	<li>
		تحليل بيانات الأبحاث البيولوجية.
	</li>
	<li>
		مجال التسويق واختيار الجمهور المستهدف من الإعلانات.
	</li>
</ul>

<p>
	من بعض الهيكليات الشبكة العصبية الاصطناعية المستخدمة بكثرة في التعلّم العميق نجد:
</p>

<ul>
	<li>
		شبكات بيرسيبترون متعددة الطبقات (Multilayer Perceptron Networks).
	</li>
	<li>
		الشبكات العصبية التلافيفية (Convolutional Neural Networks).
	</li>
	<li>
		الشبكات العصبية المتكررة ذات الذاكرة قصيرة وطويلة الأمد (Long Short-Term Memory Recurrent Neural Networks).
	</li>
	<li>
		والعديد من البنى الأخرى للشبكة.
	</li>
</ul>

<p>
	بعد بناء العلماء والباحثين للعديد من البُنى (المعماريات) الخاصة بالشبكات العصبية في محاولة منهم للعثور على البنية الأنسب لاكتشاف الأنماط في البيانات، ومن بين أبرز هذه البُنى (المعماريات) كانت البنية الخاصة بالشبكة التعلم العميق، ويذكر أن أول مرة ظهر فيها مفهوم التعلم العميق كان في عام 2006، وعرفت في ذلك الوقت على أنها مجال فرعي من مجالات تعلّم الآلة (مع أنها تندرج تحت نفس فئة الشبكات العصبية)، إلا أنها لاقت الاهتمام الواسع عندما طبق جيفري هينتون وزملائه بنية الشبكة الخاصة بالتعلّم العميق في <a data-ss1621157876="1" data-ss1628757407="1" href="https://www.wired.com/2012/06/google-x-neural-network/" rel="external nofollow">مسابقة</a> ImgNet وحققوا آنذاك نتائج مبهرة، إذ استطاعوا تحقيق دقة أفضل بـ10% من البُنى القديمة في التعرف على الصور.
</p>

<p>
	بعد هذا النجاح المدوّي استطاعت بجدارة لفت الأنظار حولها وبدأت بالظهور العديد من التطبيقات والأبحاث الجديدة الخاصة بالتعلم العميق، مما أدى إلى تطورها تطورًا كبيرًا، كما أنها أثببت جودتها بتحقيقها نتائج مذهلة في العديد من التطبيقات، وبذلك أوجدت لنفسها مكانة لا يستهان بها في مجال الذكاء الصنعي عمومًا ومجال تعلم الآلة خصوصًا.
</p>

<p>
	يعتمدُ مفهوم التعلم العميق في أساسه على طريقة تعلّم مؤلفة من عدّة طبقات من التمثيلات المقابلة لبنيةٍ هرمية من السمات، ويتم تعريفُ السِّمات والمفاهيم عالية المستوى نزولًا إلى المفاهيم ذات المستوى الأدنى، وهي تعمل أيضًا نمط التعلم الموجه وغير الموجه إلا أنها تعمل عملًا ممتازً مع البيانات المصنفة (أي مع التعلّم الموجّه).
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="51328" data-ss1621157876="1" data-ss1628757407="1" href="https://academy.hsoub.com/uploads/monthly_2020_09/5f69c9b771298_Deep-Learninganddata.png.6b0ad9ee4b779fafd8bdfc050734656b.png" rel=""><img alt="Deep-Learning and data.png" class="ipsImage ipsImage_thumbnailed" data-fileid="51328" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_09/5f69c9b98ce4c_Deep-Learninganddata.thumb.png.17dfc6502671b3d43d3c0493de69a37f.png"></a>
</p>

<p>
	إن للتعلم العميق علاقة وطيدة مع البيانات إذ لا بدّ من الحصول على كميات كبيرة من البيانات إذا أردنا استخدام هذا النوع من التعلّم. ومع ازدياد البيانات سوف تتحسن الدقة تحسنًا كبيرًا مما سيؤدي لنتائج أفضل في نهاية المطاف.
</p>

<h3 id="الفرق-بين-الشبكات-العصبية-والتعلم-العميق">
	الفرق بين الشبكات العصبية والتعلم العميق
</h3>

<p>
	في الحقيقة إن التعلم العميق ما هو إلا بنية مخصصة من الشبكات العصبية، ولكنها سميت بالتعلم العميق نسبة إلى عدد الطبقات الّتي تحتويها هذه البنية الشبكية، وبما أنها أكبر من عدد الطبقات الخاصة بالشبكات العادية آنذاك فلذلك سُميت بهذا الإسم.
</p>

<p>
	تكمن قوة التعلم العميق في إمكانيته في تعلّم الميزات (Features) بطريقة هرمية، أي تتعلّم التسلسل الهرمي للميزات انطلاقًا من ميزات من مستوى عالٍ مرورًا بميزات بمستوى أخفض وهكذا إلى أن نصل لآخر الميزات ذات المستوى الأدنى، مما يعطي لأسلوب التعلم هذا مستوًى جديدًا من التجريد للنظام وخصوصًا مع الوظائف والمفاهيم المعقدة من خلال بنائها من المفاهيم الأبسط فالأبسط.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="51330" data-ss1621157876="1" data-ss1628757407="1" href="https://academy.hsoub.com/uploads/monthly_2020_09/Deep-Learning-Learning-Hierarchical-Representations.png.da3a48618537c534373d3cb0110bed36.png" rel=""><img alt="Deep-Learning-Learning-Hierarchical-Representations.png" class="ipsImage ipsImage_thumbnailed" data-fileid="51330" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_09/Deep-Learning-Learning-Hierarchical-Representations.thumb.png.846e2c63afc12b8b3036a26050b7a438.png"></a>
</p>

<p>
	من الشكل السابق نلاحظ كيف أن التعلم العميق يستطيع تعلم التمثيلات الهرمية للبيانات. الّتي تربط المدخلات مع المخرجات مباشرة من البيانات دون الاعتماد على الميزات الّتي حددها الإنسان. أي تستطيع استنتاج كميات كبيرة من الميزات ومحاولة تحليلها وبطها بالصورة الكاملة للمشكلة. يطلق على هذا النوع من طريقة تعلّم الميزات الخاصة بالبيانات <strong>بتعلم الميزات</strong> (<a data-ss1621157876="1" data-ss1628757407="1" href="https://en.wikipedia.org/wiki/Feature_learning" rel="external nofollow">Feature learning</a>).
</p>

<p>
	ومن بين أبرز الطفرات العلمية الّتي شهدها التعلم العميق كان على يد شركة ديب مايند (والتي استحوذت عليها شركة ألفابت)، إذ استطاعت شركة ديب مايند أن تدمج بين التعلم العميق مع التعلم المعزز من أجل حلّ المشاكل المعقدة مثل لعب الألعاب.
</p>

<p>
	أطلقوا لاحقًا على طريقتهم هذه اسم شبكات التعلم المعزز العميق (Deep Q-Network)، بعدها اصبح التعلّم العميق في أغلب البنى الخاصة بالشبكات العصبية. ومن الملاحظ مما سبق أن طريقة التعلم العميق تتطلب أجهزة حاسب قوية جدًا، وذلك لأنها تتعامل مع كميات كبيرة من البيانات.
</p>

<p>
	هنالك العديد من البنى الخاصة بالشبكات العصبية لدرجة أننا نحتاج لكتاب كامل لتغطية كافة أنواعها ومميزاتها وسلبياتها وطرق عملها ..إلخ، إلا أنه وبما أنك استطعت تعلم الأساسيات فحتمًا ستستطيع تعلم أصعب البنى الشبكية، ولإعطاء نظرة دقيقة للأمر إليك الصورة التالية:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="51332" data-ss1621157876="1" data-ss1628757407="1" href="https://academy.hsoub.com/uploads/monthly_2020_09/n-zoo.png.935fc94f4f214a84b0b2775ac3b54ce3.png" rel=""><img alt="n-zoo.png" class="ipsImage ipsImage_thumbnailed" data-fileid="51332" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_09/n-zoo.thumb.png.28a2c8ca7db66766339be947e016bad6.png"></a>
</p>

<p>
	كما يمكنك ايضًا الرجوع إلى هذا <a data-ss1621157876="1" data-ss1628757407="1" href="http://www.asimovinstitute.org/neural-network-zoo/" rel="external nofollow">المقال</a> لمزيد من المعلومات.
</p>

<div class="banner-container ipsBox ipsPadding">
	<div class="inner-banner-container">
		<p class="banner-heading">
			دورة تطوير التطبيقات باستخدام لغة Python
		</p>

		<p class="banner-subtitle">
			احترف تطوير التطبيقات مع أكاديمية حسوب والتحق بسوق العمل فور انتهائك من الدورة
		</p>

		<div>
			<a class="ipsButton ipsButton_large ipsButton_primary ipsButton_important" href="https://academy.hsoub.com/learn/python-application-development" rel="">اشترك الآن</a>
		</div>
	</div>

	<div class="banner-img">
		<img alt="دورة تطوير التطبيقات باستخدام لغة Python" src="https://academy.hsoub.com/learn/assets/images/courses/python-application-development.png">
	</div>
</div>

<h2 id="الخلاصة">
	الخلاصة
</h2>

<p>
	بعد تعرفنا على أهم الأساسيات الخاصة بتعلّم الآلة، وكيف تختلف عن بعضها بعضًا، وما هي النقاط الّتي يجب علينا التركيز عليها عند اختيارنا لطريقة ما على حساب الأخرى، وتعرفنا أخيرًا على الشبكات العصبية والتعلم العميق، لا بدّ لنا من أن نسأل أنفسنا، ما هي المشاكل الّتي يُواجهنا هذا المجال؟ ما نوع هذه المشاكل؟ وكيف نستطيع تجاوزها؟
</p>

<p>
	في مقالنا القادم سنحاول الإجابة على هذه الأسئلة ونتعلم أيضًا بعض الأمور المهمة والّتي ستساعدنا في المضي قدمًا في هذا المجال.
</p>

<h2 id="المراجع">
	المراجع
</h2>

<ul>
	<li>
		مقال <a data-ss1621157876="1" data-ss1628757407="1" href="https://vas3k.com/blog/machine_learning/" rel="external nofollow">Machine Learning for Everyone</a>.
	</li>
	<li>
		كتاب Hands on Machine Learning with Scikit Learn Keras and TensorFlow الطبعة الثانية.
	</li>
	<li>
		مقال <a data-ss1621157876="1" data-ss1628757407="1" href="https://machinelearningmastery.com/what-is-deep-learning/" rel="external nofollow">What is Deep Learning?</a>.
	</li>
</ul>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال التالي: <a data-ss1621157876="1" data-ss1628757407="1" href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9-%D8%A7%D9%84%D8%AA%D8%AD%D8%AF%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%B1%D8%A6%D9%8A%D8%B3%D9%8A%D8%A9-%D9%88%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A7%D9%84%D8%AA%D9%88%D8%B3%D8%B9-%D9%81%D9%8A-%D8%A7%D9%84%D9%85%D8%AC%D8%A7%D9%84-r1010/" rel="">تعلم الآلة: التحديات الرئيسية وكيفية التوسع في المجال</a>
	</li>
	<li>
		المقال السابق: <a data-ss1621157876="1" data-ss1628757407="1" href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A-%D9%85%D8%B1%D8%A7%D8%AD%D9%84-%D8%A7%D9%84%D8%A8%D8%AF%D8%A1-%D9%88%D8%A7%D9%84%D8%AA%D8%B7%D9%88%D8%B1-%D9%88%D8%A7%D9%84%D8%A3%D8%B3%D8%B3-%D8%A7%D9%84%D8%AA%D9%8A-%D9%86%D8%B4%D8%A3-%D8%B9%D9%84%D9%8A%D9%87%D8%A7-r988/" rel="">الذكاء الاصطناعي: مراحل البدء والتطور والأسس التي نشأ عليها</a>
	</li>
	<li>
		النسخة الكاملة من كتاب <a data-ss1621157876="1" data-ss1628757407="1" href="https://academy.hsoub.com/files/17-%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A7%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A-%D9%88%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9/" rel="">مدخل إلى الذكاء الاصطناعي وتعلم الآلة</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1009</guid><pubDate>Tue, 22 Sep 2020 18:06:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x630;&#x643;&#x627;&#x621; &#x627;&#x644;&#x627;&#x635;&#x637;&#x646;&#x627;&#x639;&#x64A;: &#x645;&#x631;&#x627;&#x62D;&#x644; &#x627;&#x644;&#x628;&#x62F;&#x621; &#x648;&#x627;&#x644;&#x62A;&#x637;&#x648;&#x631; &#x648;&#x627;&#x644;&#x623;&#x633;&#x633; &#x627;&#x644;&#x62A;&#x64A; &#x646;&#x634;&#x623; &#x639;&#x644;&#x64A;&#x647;&#x627;</title><link>https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A-%D9%85%D8%B1%D8%A7%D8%AD%D9%84-%D8%A7%D9%84%D8%A8%D8%AF%D8%A1-%D9%88%D8%A7%D9%84%D8%AA%D8%B7%D9%88%D8%B1-%D9%88%D8%A7%D9%84%D8%A3%D8%B3%D8%B3-%D8%A7%D9%84%D8%AA%D9%8A-%D9%86%D8%B4%D8%A3-%D8%B9%D9%84%D9%8A%D9%87%D8%A7-r988/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2020_09/2.png.4c5cc075bbec1820b6035b3a32ee1d4e.png" /></p>
<p>
	هذا المقال جزء من سلسلة «مدخل إلى الذكاء الاصطناعي»:
</p>

<ul>
	<li>
		<a data-ss1621157665="1" href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A-%D8%A3%D9%87%D9%85-%D8%A7%D9%84%D8%A5%D9%86%D8%AC%D8%A7%D8%B2%D8%A7%D8%AA-%D9%88%D8%A7%D9%84%D8%A7%D8%AE%D8%AA%D8%B1%D8%A7%D8%B9%D8%A7%D8%AA-%D9%88%D9%83%D9%8A%D9%81-%D8%A3%D8%AB%D8%B1%D8%AA-%D9%81%D9%8A-%D8%AD%D9%8A%D8%A7%D8%AA%D9%86%D8%A7-%D8%A7%D9%84%D9%8A%D9%88%D9%85%D9%8A%D8%A9-r975/" rel="">الذكاء الاصطناعي: أهم الإنجازات والاختراعات وكيف أثرت في حياتنا اليومية</a>
	</li>
	<li>
		الذكاء الاصطناعي: مراحل البدء والتطور والأسس التي نشأ عليها
	</li>
	<li>
		<a data-ss1621157665="1" href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D9%84%D9%85%D9%81%D8%A7%D9%87%D9%8A%D9%85-%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A9-%D9%84%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9-r1009/" rel="">المفاهيم الأساسية لتعلم الآلة</a>
	</li>
	<li>
		<a data-ss1621157665="1" href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9-%D8%A7%D9%84%D8%AA%D8%AD%D8%AF%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%B1%D8%A6%D9%8A%D8%B3%D9%8A%D8%A9-%D9%88%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A7%D9%84%D8%AA%D9%88%D8%B3%D8%B9-%D9%81%D9%8A-%D8%A7%D9%84%D9%85%D8%AC%D8%A7%D9%84-r1010/" rel="">تعلم الآلة: التحديات الرئيسية وكيفية التوسع في المجال</a>
	</li>
	<li>
		يمكنك قراءة السلسلة على شكل كتاب إلكتروني بالانتقال إلى صفحة الكتاب، <a data-ss1621157665="1" href="https://academy.hsoub.com/files/17-%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A7%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A-%D9%88%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9/" rel="">مدخل إلى الذكاء الاصطناعي وتعلم الآلة</a>.
	</li>
</ul>

<p>
	بعد كلّ ما تعرفنا عليه من إنجازات <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A/" rel="">الذكاء الاصطناعي</a> وإمكانياته منقطعة النظير في جميع جوانب حياتنا اليومية، لا بدّ لسائل أن يسأل؛ كيف بدأ الأمر كله؟ كيف وصلنا إلى ما وصلنا إليه؟ كيف استطاع الذكاء الاصطناعي التفوق على مُعلمه (الإنسان) في بعض المجالات (مثل الألعاب وغيرها)؟ كيف اكتسب هذه القوة الرياضية الهائلة؟
</p>

<p>
	لفهم واضح وكامل لهذا المجال لا بدّ لنا من الغوص عميقًا في جحر الذكاء الاصطناعي ونبش تاريخه وأسراره لفهمه جيدًا، ومعرفة الأسس الّتي وضعَ عليها إلى أن تكتمل الصورة في أذهاننا ولنستطيعَ بعدها التعرف على تفاصيلٍ أعمق تمكننا من الدخول في هذا المجال الشيّق.
</p>

<p>
	في البداية من الضرورة بمكان المرور على تاريخ مجال الرياضيات المرتبط بالذكاء الاصطناعي، والّذي جعل من الذكاء الاصطناعي قابلًا للوجود، بالإضافة إلى ذلك تأتي أهمية الرياضيات من كونها العلم الّذي سيساعدنا في بناء ذكاء البرنامج. وما طرق الاستنتاج والاستنباط المستخدمة في معظم الخوارزميات إلا خير مثال على ذلك. لذا فإن أي تقدم علمي في الرياضيات سيُساعد في تقدم الذكاء الاصطناعي بطريقة أو بأخرى، وبالطبع الرياضيات ليس العلم الوحيد الّذي شارك في تقدم الذكاء الاصطناعي بل شاركت علوم أخرى مثل الفلسفة الّتي حاولت وصف عملية التفكير البشري على أنها معالجة ميكانيكية للرموز، وغيرها من العلوم مثل علم الإحصاء والاحتمالات.
</p>

<p>
	سنركز على أهم النقلات النوعية الّتي ترتبط ارتباطًا مباشرًا مع الذكاء الاصطناعي وسنحاول تجنب أي تفاصيل أخرى ليس تقليلًا من شأنها ولكن في نهاية المطاف هدفنا التركيز على تاريخ الذكاء الاصطناعي وليس تاريخ الرياضيات ككلّ.
</p>

<h2>
	القرن التاسع عشر والبدايات
</h2>

<p>
	شهد الربع الثاني من القرن التاسع عشر بداية ظهور بذور الذكاء الاصطناعي على الرغم من أن الحواسيب لم تكُ موجودة بعد، إلا أن الذكاء الاصطناعي -كمنطق رياضي- أوجد لنفسه المكان المناسب وشقّ طريقه في الوسط العلمي فعندما قدم لنا العالم <a data-ss1621157665="1" href="https://ar.wikipedia.org/wiki/%D8%AC%D9%88%D8%B1%D8%AC_%D8%A8%D9%88%D9%84" rel="external nofollow">جورج بول</a> نظريته الخاصة في المنطق الجبري والّتي سميت لاحقًا <a data-ss1621157665="1" href="https://www.marefa.org/%D8%A7%D9%84%D8%AC%D8%A8%D8%B1_%D8%A7%D9%84%D8%A8%D9%88%D9%84%D9%8A%D8%A7%D9%86%D9%8A" rel="external nofollow">بالجبر البولياني</a> وهي نظرية تعتمد في أساسها على تمثيل أي متغيرات في أي عملية رياضية على قيمتين فقط وهما 1 و0، وتشكل مجموعة متغيرات عبارات منطقية. ويمكن كتابة هذه العبارات وإثبات صحتها بطريقة مماثلة تمامًا للطرق المستخدمة في الجبر العادي. وكانت هذه النظرية الأساس الّذي نشأت عليها <a href="https://academy.hsoub.com/programming/general/%D8%B9%D9%84%D9%88%D9%85-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8/" rel="">علوم الحاسب</a> أيضًا.
</p>

<h2>
	التحديات الجديدة للرياضيات والآفاق المستقبلية
</h2>

<p>
	في هذه الأثناء كانت الرياضيات غير واضحة المعالم وكانت هنالك جهود كبيرة في تنظيم الطرق الرياضية ومن بين هذه الجهود كان هنالك المؤتمر الدولي للرياضيات والّذي ساعد في توحيد الجهود المبذولة وفي النسخة الثانية من هذا المؤتمر وتحديدًا في عام 1900 عرض عالم الرياضيات الألماني <a data-ss1621157665="1" href="https://ar.wikipedia.org/wiki/%D8%AF%D9%8A%D9%81%D9%8A%D8%AF_%D9%87%D9%8A%D9%84%D8%A8%D8%B1%D8%AA" rel="external nofollow">ديفيد هيلبرت</a> في ذلك المؤتمر الذي أقيم في باريس 23 <a data-ss1621157665="1" href="https://ar.wikipedia.org/wiki/%D9%85%D8%B3%D8%A7%D8%A6%D9%84_%D9%87%D9%8A%D9%84%D8%A8%D8%B1%D8%AA" rel="external nofollow">مسألة رياضية</a> عصية على الحلّ (والتي تسمى أيضًا معضلات هيلبرت).
</p>

<p>
	وقال هيلبرت إن هذه المسائل ستُحدد شكل الرياضيات في الـ100 سنة المقبلة، لأنه اختار مسائل ذات صلات وجذور بفروع متعددة في الرياضيات، بحيث أن السعي لحلها سوف يولد نظريات ونتائج جديدة. <a data-ss1621157665="1" href="https://arabic.rt.com/technology/912260-%D8%B9%D8%A7%D9%84%D9%85-%D8%B1%D9%88%D8%B3%D9%8A-%D9%8A%D8%AD%D9%84-%D8%A7%D8%AB%D9%86%D8%AA%D9%8A%D9%86-%D9%85%D8%B3%D8%A7%D8%A6%D9%84-%D8%A7%D9%84%D8%A3%D9%84%D9%81%D9%8A%D8%A9-%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D8%B9%D8%B5%D9%8A%D8%A9/" rel="external nofollow">حُلّت</a> حتى يومنا الحالي 16 مسألة. وأدى ذلك إلى بروز فروع رياضية جديدة. ويرى المتمعن في طريقة تطور رياضيات القرن العشرين أن سببها الرئيسي هو حلّ تلك المسائل مما أدى إلى حدوث ثورة عارمة في هذا العلم طيلة القرن الـ 20 وأعطته دفعة قوية ترتب عليها إنتاج غزير في جميع الاختصاصات الرياضية.
</p>

<p>
	الدرس الّذي يمكن أن نتعلمه من مسائل هيلبرت أو من العقلية الكامنة بطريقة تفكيره هو أنه قد يكون من الصعب جدًا تحديد جميع الافتراضات الّتي تستخدم في أي فرع من الرياضيات. ولكن هذا الأمر لم يرق إلى عالمين من علماء الرياضيات وهما برتراند راسل وألفريد نورث وايتهيد وإنما حثهم على اعتناق هذا التحدي ومحاولة تجميع كلّ الفرضيات والمسلمات الرياضية بناءً على المنطق الجبري <a data-ss1621157665="1" href="https://ar.wikipedia.org/wiki/%D8%AC%D9%88%D8%AA%D9%84%D9%88%D8%A8_%D9%81%D8%B1%D9%8A%D8%AC%D9%87" rel="external nofollow">لجوتلوب فريجه</a> الّذي كان حاضرًا بشدة آنذاك، وذلك في ثلاثة مجلدات تحت اسم "مبادئ الرياضيات" (Principia Mathematica) نُشرت عام 1910-1912-1913 على التتالي جاءت محاولة هاذين العالمين لتمثيل مجموعة من البديهيات وقواعد الاستنتاج في منطق الرموز، لنستطيع من خلالها -من حيث المبدأ على الأقل- إثبات جميع الحقائق الرياضية، كما حاولا من خلال هذا الكتاب تحديد الأسس الرياضية بدقة ليكون بذلك أول كتاب يناقش المبادئ الرياضية بتلك الطريقة آنذاك.
</p>

<p>
	أحدث هذا الكتاب جلَبة كبيرة في الوسط العلمي لذا بدأت تظهر مجموعة من الأسئلة والتحليلات. وإحدى الأسئلة الّتي طرحت عمومًا في هذا الصدد وبعيدًا عن وضع البديهيات كحقائق منطقية عن أي منظومة رياضية، مثل مبادئ الرياضيات (Principia Mathematica):
</p>

<ul>
	<li>
		<strong>ماذا لو كان بإمكاننا استنتاج تناقض من البديهيات؟</strong> (وهذا هو السؤال الّذي حفز العلماء على إيجاد مسألة عدم الاتساق).
	</li>
	<li>
		<strong>وماذا لو كان هناك بيان رياضي لا يمكن إثباته من خلال هذه المنظومة؟</strong> (وهذا هو السؤال الّذي حفز العلماء على إيجاد مبرهنة عدم الاكتمال).
	</li>
</ul>

<p>
	وفي عام 1931، نشر عالم رياضيات نمساوي شاب يدعى <a data-ss1621157665="1" href="https://ar.wikipedia.org/wiki/%D9%83%D9%88%D8%B1%D8%AA_%D8%BA%D9%88%D8%AF%D9%84" rel="external nofollow">كورت غودل</a> ورقة بحثية أحدثت صدمة ترددت أصداؤها في أنحاء مجتمع الرياضيين وأجبرتهم على إعادة النظر في علمهم. كانت هذه الورقة تحتوي على مبرهنة عدم الاكتمال. والّتي تحثُّ على التشكيك في معنى افتراض أن أمرًا ما صحيح في الرياضيات. كان التغير الناتج في فهمنا للرياضيات مثيرًا بقدر التغيير الّذي حدث في إدراكنا للهندسة، عند اكتشاف الهندسة غير الإقليدية في القرن التاسع عشر. اشتمل هذان الاكتشافان الكبيران على نظمٍ بديهية، ولا يمكن فهم كليهما على نحو صحيح دون تقدير ما يعنيه الرياضيون بكلمة «بديهي» والدور الّذي تلعبه المسلمات في الرياضيات.
</p>

<p>
	أحدثت نظرية عدم الاكتمال ثورة في الرياضيات وألهمت أشخاص مثل جون فون نيومان، الّذي ابتكر نظرية الألعاب، و<a data-ss1621157665="1" href="https://ar.wikipedia.org/wiki/%D8%A2%D9%84%D8%A7%D9%86_%D8%AA%D9%88%D8%B1%D9%86%D8%BA" rel="external nofollow">آلان تورنغ</a>، الّذي يعد الأب الروحي <a href="https://academy.hsoub.com/programming/general/%D8%B9%D9%84%D9%88%D9%85-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8/#%D8%AA%D8%AE%D8%B5%D8%B5%D8%A7%D8%AA-%D8%B9%D9%84%D9%88%D9%85-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8" rel="">للذكاء الاصطناعي وعلوم الحاسوب</a>.
</p>

<p>
	في وقت لاحق، أصبحت نظريات غودل لا تقدر بثمن فيما يتعلق بمجال <a href="https://academy.hsoub.com/programming/general/%D8%B9%D9%84%D9%88%D9%85-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8/" rel="">علوم الحاسوب</a>، لأن الاعتراف بأن هناك أشياء لا يمكن إثباتها يضع حدًا لما يمكن للحواسيب حله، وتجنب ضياع الوقت في محاولة عمل المستحيل.
</p>

<h2>
	الأخطاء في نص أحد المسائل يفتح آفاقًا جديدة
</h2>

<p>
	بالعودة لعام 1928 أعاد العالم ديفيد هيلبرت عرض المسائل مرة أخرى، وكان من بين هذه المسائل <a data-ss1621157665="1" href="https://en.m.wikipedia.org/wiki/Entscheidungsproblem" rel="external nofollow">مسألة</a> إثبات أنه هل يمكن الحصول على منهج أو مجموعة إجراءات يمكننا من خلالها الحكم على عبارة رياضية بأنها صحيحة أو خاطئة (أطروحة التقرير أو الحكم). لفتت هذه المسألة نظر الشاب آلان تورنغ وقرر أن يعتنق هذا التحدي ويبدأ بحل هذه المسألة وفي إطار حله لهذه المسألة احتاج آلان لآلة ذكية تستطيع أن تقرأ وتتعامل مع مخرجاتها. كان هذا يعني أن تتعامل الآلة مع رموز وحركات محددة تمكنها من القيام بعملها آليًا. آلة كاملة قادرة على فهم لغة مكونة من الأرقام 1 و 0 للقيام بهذه المهمة.
</p>

<p>
	من خلال استعانته بعمل <a data-ss1621157665="1" href="https://ar.wikipedia.org/wiki/%D8%AC%D9%88%D8%B1%D8%AC_%D9%83%D8%A7%D9%86%D8%AA%D9%88%D8%B1" rel="external nofollow">جورج كانتور</a> (وهو العالم الّذي حاول حلّ هذه المسألة قبل تورنغ). توصل تورنغ إلى أن الآلة الّتي يفكر فيها والمطلوبة لإنجاز مسألة هيلبرت تحتاج لخطوات لا منتهية، وبالتالي فهي عاجزة عن إنتاج أي جواب. وإن وصول الآلة لجواب يعني أنها تتحرك في حلقة مغلقة بدايتها السؤال ونهايتها الجواب، وهذا يعني عدد منتهِ من الخطوات. آلة تيورينغ متورطة في خطوات لا منتهية وبالتالي فلا أمل من وصولها إلى جواب. واستنتج لاحقًا خطأ مسألة (معضلة) هيلبرت.
</p>

<p>
	وعندما عَمِلَ في محطة بليتشلي بارك (وهي حديقة خصصت في الحرب العالمية الثانية لتكون المقر الرئيسي لعمليات فك الشيفرة الألمانية)، تمكن من تحقيق خمسة إنجازات مهمة في مجال تحليل الشفرات، وأثناء الحرب العالمية الثانية استطاع بناء جهاز كهروميكانيكي للمساعدة في فك شفرة الإشارات الخاصة بجهاز إنجما الألماني (<a data-ss1621157665="1" href="https://ar.wikipedia.org/wiki/%D8%A2%D9%84%D8%A9_%D8%A5%D9%86%D8%AC%D9%85%D8%A7" rel="external nofollow">Enigma Machine</a>).سمي هذا الجهاز لاحقًا بآلة تورينغ وساعدت هذه الآلة على اختصار مدة الحرب بمدة 2-4 سنوات على الأقل. حاول آلان تورنغ بهذه الآلة إيجاد حلّ لمعضلة هيلبرت. وكان لآلة تورنغ الإثبات الحقيقي لقدرة الآلة على العمل بالمنطق الرياضي بدون تدخل البشر وفقًا لمدخلات وأوامر مسبقة. على الرغم من أن تورنغ برهن بآلته خطأ مسألة هيلبرت وذلك بإثباته عدم قدرة الرياضيات على حلّ جميع المشاكل عدا المشاكل القابلة للحلّ بحد ذاتها، إلا أنه استطاع أن يركز فقط على ما يستطيع تحقيقه باستخدام آلته الفكرية، ووصلوا بذلك لاستنتاج بأن أي مسألة تخضع للمنطق الرياضي يمكن تمثيلها بالقيمتين 0 و1.
</p>

<h2>
	أول شبكة عصبية اصطناعية
</h2>

<p>
	لم يكن آلان تورينغ الوحيد في المضمار (مضمار تطور الذكاء الاصطناعي) وإنما انضم لمرافقته بعض العلماء الأخرين مثل: عالم الفيزيولوجيا العصبية وارن ماكولوتش وعالم الرياضيات الشاب والتر بيتس عندما نشرا <a data-ss1621157665="1" href="http://www2.psych.utoronto.ca/users/reingold/courses/ai/cache/neural4.html" rel="external nofollow">ورقة علمية</a> في عام 1943 تتحدث عن كيفية عمل الخلايا العصبية ونمذجوا للمرة الأولى شبكة عصبية بسيطة باستخدام دوائر كهربائية ولهما تنسب الفكرة الأساسية للخلايا العصبية الإصطناعية الّتي نستخدمها في أيامنا الحالية. وفي الخمسينيات بدأ علماء الحواسيب بتطبيق هذه الفكرة في عملهم. وكان من بينهم العالم الأمريكي أرثر سامويل عندما أنشأ برنامج يُعلّم نفسه بنفسه لعبة الداما (<a data-ss1621157665="1" href="https://ar.wikipedia.org/wiki/%D8%A7%D9%84%D8%AF%D8%A7%D9%85%D8%A7" rel="external nofollow">checkers</a>)، كما أنه أول من أبتكر مصطلح <strong>تعلّم الآلة</strong> وكان ذلك في عام 1952.
</p>

<h2>
	تكاتف الجهود ومحاولة توحيد المصطلحات
</h2>

<p>
	في <a data-ss1621157665="1" href="http://cogprints.org/499/1/turing.html" rel="external nofollow">ورقة بحثية</a> نشرها تورنغ عام 1950 أثناء عمله بقسم الحاسوب بجامعة مانشستر، عبّر تورنج عن تساؤلاته حول قدرة أي آلة أو برنامج أو حاسوب على القيام بأفعال وتصرفات تدل على وجود ذكاء حقيقي ووعي خاص بها. ولكن كان لا بدّ في البداية الإجابة على بعض الأسئلة مثل: ما هو الوعي؟ هل يمكن لآلة اصطناعية التفكير حقًا؟ هل يتألف العقل من خلايا عصبية في الدماغ فقط؟ أم أن هناك شرارة غير ملموسة في جوهره؟
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p data-gramm="false">
		أقترح أن نتفكر في هذا السؤال: هل تفكر الآلات؟ يجب أن نبدأ أولًا بتحديد معنى واضح لمصطلحي «تفكير» و «آلة» - آلان تورنغ بتصرف
	</p>
</blockquote>

<p>
	كانت هذه الأسئلة أساسية للكثير من الناس من أجل تحديد ماهيّة الوعي والذكاء ولكن ألان تورنغ قرر التغاضي عن جميع الأسئلة واستبدالها بسؤال واحدٍ أبسط بكثير من تلك الأسئلة: وهو <strong>هل يمكن للحاسوب التحدث مثل البشر؟</strong> ولمعرفة ذلك اقترح تورنج لعبة تجمع فردين أحدهما حاسوب ذكي، والآخر محقق أو حكم، وكلّ منهم في غرفة منفصلة ويتواصلون سويًا عبر شاشة حاسوب ولوحة مفاتيح بدون معرفتهم بالشخص المقابل الّذي يحدثونه. وتهدف اللعبة لأن يميز الحكم بين الإنسان والحاسوب وعرفت لاحقًا <strong>باختبار الذكاء</strong>، طوّر هذا الاختبار لاحقًا وقُصر على حكمٍ واحدٍ وحاسوبٍ واحد، ومن خلال توجيه أسئلة مباشرة لكلّ منهما وتحليل الإجابة سيُحاول الحكم استنتاج إن كان شخصًا حقيقيًا أم مجرد حاسب. أي بعبارة أخرى، <strong>سيُعدُّ الحاسوب ذكيًا إن كان يصعب تمييز محادثته عن محادثة الإنسان</strong>.
</p>

<p>
	ظهرت العديد من الاختبارات الأخرى لاحقًا، ومن الجدير بالذكر أنه لم يستطع أي حاسب <a data-ss1621157665="1" href="https://aitnews.com/2014/06/09/%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D8%AC-%D8%AD%D8%A7%D8%B3%D9%88%D8%A8%D9%8A-%D9%8A%D8%AC%D8%AA%D8%A7%D8%B2-%D8%A7%D8%AE%D8%AA%D8%A8%D8%A7%D8%B1-%D8%AA%D9%88%D8%B1%D9%8A%D9%86%D8%AC-%D9%84%D8%A3%D9%88/" rel="external nofollow">اجتياز</a> اختبار تورنغ حتى عام 2014 عن طريق حاسب يُدعى يوجين جوستمان (Eugene Goostman) إذ استطاع اقناع 33% من الحكام بأنه طفل روسي عمره 13 سنة.
</p>

<p>
	بالعودة إلى وقت طرح اختبار تورنغ لم يكن في ذلك الوقت حديث عن إعطاء المصطلحات المناسبة للمفاهيم الموجودة. في الحقيقة إن البداية الرسمية لظهور مصطلح الذكاء الاصطناعي (Artificial Intelligence) كانت في عام 1956 وتحديدًا في كلية دارتموث في ولاية هانوفر في الولايات المتحدة الأمريكية، وذلك بفضل ورشة عقدت حرم الكلية ناقش فيها مجموعة من العلماء معظمهم من شركة IBM -نتيجة ازدهار الشركة آنذاك- البرمجيات الذكية والبرمجيات القادرة على التفكير حتى أطلقوا في نفس الورشة المصطلح الرسمي وهو <strong>الذكاء الاصطناعي</strong> لهذا المجال العلمي الصاعد.
</p>

<p>
	بعدها توالى الاهتمام في هذا المجال وضخت الولايات المتحدة أموالًا طائلة لدعم المشاريع المتعلقة بهذا المجال، وبدى هناك تفائل كبير جدًا في هذا العلم الجديد، إذ في عام 1959 <a data-ss1621157665="1" href="https://cs.stanford.edu/people/eroberts/courses/soco/projects/neural-networks/History/history1.html" rel="external nofollow">اطلق</a> برنارد ويدرو ومارسيان هوف من جامعة ستانفورد نموذجًا لشبكة عصبية قادرة على إزالة صدى الصوت من المكالمات عبر خطوط الهاتف التقليدية لتكون بذلك أول شبكة عصبية تحلّ مشكلة في عالمنا الحقيقي، وأطلقوا عليها اسم مادلين (MADALINE) ولا تزال هذه الشبكة مستخدمة حتى يومنا الحالي.
</p>

<h2>
	التطور السريع لأشباه الموصلات
</h2>

<p>
	في هذه الأثناء كان العمل متواصلًا على تطوير تقنية أشباه الموصلات، وتحسين إمكانياتها التطبيقية مما جذب العديد من وسائل الإعلام على تغطية أخبار هذا المجال، ومن بين وسائل الإعلام كانت «مجلة إلكترونيكس» تجهز عددها 35 وعندما طلبت المجلة من الدكتور غوردون مور كتابة مقال مفصل يتناول فيه الحديث عن توقعاته حول ما سيحدث في صناعة مكونات أشباه الموصلات في الأعوام الـ10 القادمة.
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p data-gramm="false">
		انتهزت تلك الفرصة لمراجعة ما شهده هذا المجال من تطورات حتى ذلك الوقت. وكان ذلك في عام 1964، على ما أعتقد، وحينها نظرت إلى الأنواع القليلة من الرقاقات الّتي صنعناها، ولاحظت أننا انتقلنا من «ترانزستور» واحد على كلّ رقاقة إلى نحو ثمانية عناصر (ترانزستورات ومقاومات) على الرقاقة الواحدة. ثم أصبحت الرقاقات الجديدة حينها تحمل ضعف عدد العناصر، أي نحو 16 عنصرًا. أمّا في المختبر، فكنا نعمل على إنتاج رقاقات تتضمن نحو 30 عنصرًا، ونبحث إمكانية صنع رقاقات تحمل ضعف هذا العدد، أي نحو 60 عنصرًا للرقاقة الواحدة. وعندما وضعت تلك المعلومات على شكل رسم بياني، ابتداء من «الترانزستور» الوحيد على رقاقة في عام 1959، لاحظت أن عدد العناصر كان يتضاعف كلّ عام تقريبًا. وهكذا أجريت عملية استقراء، وتوقعت أننا سنواصل مضاعفة عدد العناصر على الرقاقة الواحدة كلّ عام، لنقفز من 60 عنصرًا في ذلك الوقت إلى نحو 60 ألف عنصر في غضون 10 أعوام. - غوردون مور بتصرف
	</p>
</blockquote>

<p>
	أحدثت هذه المقالة نقلة نوعية في طريقة تعامل العاملين في هذا القطاع مع آلية تطوير أشباه الموصلات مع العلم بأن هدف الدكتور غوردون من المقال لم يكن بناء الأساسات العلمية والمثبتة لطريقة تطوير هذه التقنية، وإنما فقط لقياس واستنباط طريقة تطورها في الماضي، وجعلها أوضح للعيان، ولكن اتخذت الأمور منعطفًا حادًا آخر بعد هذا المقال وأصبحت المقالة خارطة الطريق المستقبلية لهذا المجال.
</p>

<h2>
	بدء حدوث شتاء الذكاء الاصطناعي
</h2>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="50787" data-ss1621157665="1" href="https://academy.hsoub.com/uploads/monthly_2020_09/5f533c0181d12_1----.png.386b8fa5c75c091bcfbcf77ece383fb0.png" rel=""><img alt="1-الشتاء-الأول-للذكاء-الصنعي.png" class="ipsImage ipsImage_thumbnailed" data-fileid="50787" data-unique="qvqu4elbr" src="https://academy.hsoub.com/uploads/monthly_2020_09/5f533c01dc149_1----.thumb.png.2a81daaee4774900ba0603c422e99f5d.png"></a>
</p>

<p>
	ومن جانب آخر لم يكن على الصعيد الإعلامي العالمي سمعة قوية لمجال الذكاء الاصطناعي، إذ كان هذا المجال جديدًا وغير واضح المعالم إلى حد ما، ولكن تغيرت الأمور كثيرًا بعد أن <a data-ss1621157665="1" href="https://thetech.com/2016/01/28/minsky-v135-n38" rel="external nofollow">زار</a> المخرج السينمائي ستانلي كوبريك العالم <a data-ss1621157665="1" href="https://www.syr-res.com/article/9064.html" rel="external nofollow">مارفن مينسكي</a> في مختبر الذكاء الاصطناعي التابع لمعهد ماساتشوستس للتكنولوجيا (MIT) وذلك للسؤال عما إذا كان الحاسب الذكي الّذي كان يتخيله سيكون موجودًا فعلًا بحلول عام 2001. أكد له مينسكي بتفاؤل أنه سيكون موجودًا. أدى ذلك ذلك لولادة فيلم جديد أطلق عليه اسم A Space Odyssey ناقش هذا الفيلم الذكاء ااصطناعي بطريقة مختلفة ممّا جعل من مجال الذكاء الاصطناعي موضوعًا عالميًا وحديث الساعة.
</p>

<p>
	في ذلك الوقت لم تكثر الأقاويل والمبالغات والشائعات من وسائل الإعلام فقط، وإنما تعدى ذلك إلى العلماء ليبالغوا في تفاؤلهم ونظرتهم المستقبلية. حتى أن أحد العلماء وهو هيربرت سايمون صرّح علانية بعام 1965 متحدثًا عن مستقبل الذكاء الاصطناعي فقال:
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p data-gramm="false">
		ستكون الآلات قادرة، في غضون عشرين عامًا، على القيام بأي عمل يمكن للإنسان القيام به - هيربرت سايمون
	</p>
</blockquote>

<p>
	لم يقتصر الأمر عليه فقط وإنما انضم إليه العالم مارفن مينسكي الّذي أدلى عام 1967 بالتصريح التالي:
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p data-gramm="false">
		في غضون جيل واحد… ستُحلّ مشكلة خلق 'الذكاء الاصطناعي' بشكل كبير - مارفن مينسكي
	</p>
</blockquote>

<p>
	أضف إلى ذلك أنه في ذلك الوقت كانت الولايات المتحدة في خضم الحرب الباردة، وكانت سياسة أعضاء الكونجرس أن يستثمروا مبالغ كبيرة في الذكاء الاصطناعي بصفته جزءًا من إستراتيجية أمنية شاملة، وتركزت الاستثمارات في تلك الفترة على الترجمة، خصوصًا الترجمة بين اللغتين الروسية والإنجليزية، وكان ذلك في السنوات ما بين 1954 و1966، واعتقد الكثير من العلماء البارزين بحتمية تحقيق إنجازات هامة، كما فاض مجال الذكاء الاصطناعي بالتبرعات من المموِّلين الأثرياء غير أن الإنجازات لم تتحقق بسرعة كما كان يعتقدون. وفي عام 1966 نشر سبعة علماء من اللجنة الاستشارية حول المعالجة الآلية للغة تقريرًا بطلب من الحكومة، وخلُص هذا التقرير إلى أن الترجمة الآلية كانت أبطأ وأكثر تكلفة وأقل دقة من الترجمة البشرية، وبعدها فرض الكونجرس على وكالة المشاريع والأبحاث الدفاعية المتقدمة (داربا) أن تقتصر في تمويلها على المشاريع ذات التأثير المباشر على المجهود العسكري؛ مما أدى إلى انتهاء العمل على الكثير من المشاريع العلمية الاستكشافية والأساسية، بما في ذلك أبحاث الذكاء الاصطناعي، والّتي كانت داربا تمولها بسخاء.
</p>

<p>
	تنوعت العوائق الّتي تراكمت في طريق تطور الذكاء الاصطناعي ومع الأخذ بعين الاعتبار بأن الحواسيب كانت في ذلك الوقت غالية جدًا وبطيئة وغير قادرة على تحقيق ما يصبوا إليه أولئك العلماء. اتضح لاحقًا أن العلماء فشلوا في إدراك مدى صعوبة بعض المشاكل الّتي واجهتهم. وفي عام 1974، وردًا على انتقادات <a data-ss1621157665="1" href="https://en.wikipedia.org/wiki/James_Lighthill" rel="external nofollow">جيمس لايتهيل</a> على تمويل أبحاث الذكاء الاصطناعي والضغط المستمر من الكونغرس لتمويل مشاريع أكثر إنتاجية، قطعت الحكومتين الأمريكية والبريطانية تمويلهما لمعظم الأبحاث الاستكشافية المتعلقة بمجال الذكاء الاصطناعي، وكانت تلك أول انتكاسة كبيرة تشهدها أبحاث الذكاء الاصطناعي.
</p>

<h2>
	الشتاء الأول للذكاء الاصطناعي 1974-1980
</h2>

<p>
	شكّل هذا الزخم الإعلامي الهائل في ظل الإنجازات المتواضعة الّتي حققها العلماء في تقدم الذكاء الاصطناعي إلى إحباط كبير للمجتمع الداعم لهذا المجال، وأدى ذلك لانخفاض تمويل مشاريع الذكاء الاصطناعي ليدخل مجال الذكاء الاصطناعي في مرحلة رقود كبيرة امتدت بين العام 1974-1980 وكان ذلك أول شتاء يواجهه الذكاء الاصطناعي منذ بدايته. ومن بين المشاكل الّتي واجهها آنذاك هي:
</p>

<ul>
	<li>
		<strong>ضعف سرعة المعالجة الحاسوبية</strong>: نتيجة التقنيات القديمة المستخدمة في تركيب المعالجات.
	</li>
	<li>
		<strong>ذاكرة التخزين المحدودة</strong>: والّتي كانت عنصرًا أساسيًا في تخزين المعلومات الّتي ستتدربُ عليها خوارزميات الذكاء الاصطناعي.
	</li>
	<li>
		<strong>عدم وجود كمية بيانات كافية</strong>: نتيجة عدم وجود ذاكرة تخزين كافية.
	</li>
	<li>
		<strong>الخوارزميات الرياضية</strong>: كان هناك صعوبات عديدة في إيجاد حلول مناسبة للعمليات الرياضية الّتي تقود إلى إيجاد الحل الأمثل في خوارزمية معينة، وتم إيجاد العديد من هذه الحلول لاحقًا ومن بينها Stochastic Gradient Descent.
	</li>
</ul>

<p>
	أدت هذه المشاكل الرئيسية والكثير من المشاكل الأخرى إلى إعادة هيكلة مجالات متعددة متعلقة بمجال <a href="https://academy.hsoub.com/programming/general/%D8%B9%D9%84%D9%88%D9%85-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8/" rel="">علم الحاسب</a> والعمل على تطوير جوانب كثيرة مهمة رسمت لنا تاريخ تطور الحواسيب والذكاء الاصطناعي في آن واحد.
</p>

<h2>
	فترة الإزدهار
</h2>

<p>
	بعد الشتاء الأول الّذي مرّ به مجالة الذكاء الاصطناعي، وفقدِ الاهتمام من جميع الباحثين في هذا المجال تحولت الانظار إلى الأنظمة الخبيرة عندما أعادت الأمل في هذا المجال وكان بعض تطبيقاتها مثل أنظمة <a data-ss1621157665="1" href="https://en.wikipedia.org/wiki/Xcon" rel="external nofollow">Xcon</a>، والّتي حظت بشعبية كبيرة باعتبارها أنظمة متخصصة تحاكي عملية إتخاذ القرار مثل الخبراء المختصين، وقادرة على حلّ مشاكل محددة دقيقة مثل تشخيص الأمراض المعدية، أو تحديد المركبات الكيميائية، وذلك لأن المنطق الّتي تعتمد عليه هذه الأنظمة آنذاك هو الحلقات الشرطية "if-else" والّتي تخالف الفكرة الأساسية للذكاء الاصطناعي، ألا وهي القدرة على اتخاذ قرار من تلقاء نفسها <strong>أي بدون برمجة هذا القرار</strong>. ومع ذلك قفزت استثمارات المرتبطة بالذكاء الاصطناعي من بضعة ملايين من الدولارات في عام 1980 إلى مليارات الدولارات في عام 1987،
</p>

<p>
	ظهرت في تلك الفترة قفزة معتبرة عندما <a data-ss1621157665="1" href="https://www.nytimes.com/1988/08/16/science/learning-then-talking.html" rel="external nofollow">أعلن</a> تيري سيجنوسكي وتشارلز روزنبرغ من جامعة هوبكنز عن تطويرهما لشبكة عصبية اصطناعية قادرة على تعليم نفسها نطق الكلمات الجديدة والّتي أسموها شبكة NetTalk، تتألف هذه الشبكة من ثلاثة طبقات، واستطاعت تعلّم كيفية نطق 20000 كلمة بطريقة صحيحة في أسبوع واحد. ومع استمرار تدريبها أصبحت طريقتها في نطق الكلمات أكثر وضوحًا، وكان ذلك انجازًا متميزًا في ذلك الوقت.
</p>

<p>
	ولكن الأجهزة المختصة بالذكاء الاصطناعي آنذاك لم تكن عملية إذ كانت مكلفة جدًا ومعقدة ومع ظهور الحواسيب المكتبية من تطوير شركة IBM وشركة آبل Apple، والّتي تفوقت بمراحل على <a data-ss1621157665="1" href="https://en.wikipedia.org/wiki/Lisp_Machines" rel="external nofollow">جهاز ليسب</a> (Lisp) الخصص للذكاء الاصطناعي والّذي صممه ريتشارد جرينبلات أحد أعضاء الفريق البحثي في الذكاء الاصطناعي الخاص بمعهد (MIT)، ونظرًا لتراكم المشاكل الخاصة بأجهزة الذكاء الاصطناعي بدءًا من تكلفتها العالية، وانتهاءً بصعوبة تحديثها، ولأن المستهلكين لم يعودوا بحاجة إلى شراء آلالات باهظة الثمن متخصصة فقط في تشغيل أجهزة الذكاء الاصطناعي أدى ذلك إلى انهيار في سوق هذه الأجهزة عام 1987 وبذلك انهار خط تصنيع كامل لتبدأ بذلك مرة أخرى فترة ركود ثانية يواجهها هذا المجال.
</p>
<div class="banner-container ipsBox ipsPadding">
    <div class="inner-banner-container">
            <p class="banner-heading">
                    دورة الذكاء الاصطناعي
            </p>



            <p class="banner-subtitle">
        احترف برمجة الذكاء الاصطناعي AI وتحليل البيانات وتعلم كافة المعلومات التي تحتاجها لبناء نماذج ذكاء اصطناعي متخصصة.
            </p>

            <div>
                    <a class="ipsButton ipsButton_large ipsButton_primary ipsButton_important" href="https://academy.hsoub.com/learn/artificial-intelligence" rel="">اشترك الآن</a>
            </div>
    </div>
<div class="banner-img"> <a href="https://academy.hsoub.com/learn/artificial-intelligence" rel=""><img alt="دورة الذكاء الاصطناعي AI" src="https://academy.hsoub.com/learn/assets/images/courses/artificial-intelligence.png"></a></div>
</div>
<h2>
	الشتاء الثاني للذكاء الاصطناعي 1987-1993
</h2>

<p>
	امتدت الفترة الثانية من شتاء الذكاء الاصطناعي بين عامي 1987-1993 كما أن معظم الناس فقدت اهتمامها بهذا المجال، وكان ذلك جليًا من خلال انخفاض عدد الحاضرين في مؤتمر <a data-ss1621157665="1" href="https://www.aaai.org/Conferences/conferences.php" rel="external nofollow">AAAI</a> الخاص بالذكاء الاصطناعي إلى 2000 زائر في عام 1991 بينما بلغت نسبة الحضور للمؤتمر في عام 1986 حوالي 6000 زائر، وبالمثل يمكن ملاحظة الزيادة في المقالات المتعلقة بالذكاء الاصطناعي منذ عام 1987 والوصول إلى أدنى نقطة لها في عام 1995 في صحيفة نيويورك تايمز.
</p>

<p>
	وبالنظر إلى المخطط السابق الّذي يستعرض عدد تكرار الكلمات الدلالية الخاصة بالذكاء الاصطناعي والمتواجدة في 16625 ورقة بحثية علمية متعلقة بخوارزميات وتقنيات الذكاء الاصطناعي الموجودة آنذاك، نلاحظ أنه ظهرت العديد من الأوراق البحثية والخوارزميات الواعدة في تلك الفترة إلا أن الاهتمام الحقيقي ما زال منخفضًا بالموازنة مع السنوات الماضية وبهذا استمرت فترة الركود العلمي في مجال الذكاء الاصطناعي.
</p>

<h2>
	عودة الذكاء الاصطناعي إلى الساحة
</h2>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="50788" data-ss1621157665="1" href="https://academy.hsoub.com/uploads/monthly_2020_09/5f533c0535869_2------.png.7cea2761cbddd9cb073a4a79025c825b.png" rel=""><img alt="2-عودة-الذكاء-الصنعي-إلى-الواجهة-وازدهاره.png" class="ipsImage ipsImage_thumbnailed" data-fileid="50788" data-unique="1wmxxk0ez" src="https://academy.hsoub.com/uploads/monthly_2020_09/5f533c059d177_2------.thumb.png.874d0ad33897640c13a6c8797f1bf8b0.png"></a>
</p>

<p>
	في عام 1997 ولأول مرة في تاريخ البشرية تمكن جهاز حاسوب من التغلب على أقوى لاعب شطرنج في العالم وهو غاري كاسباروف في مباراته المشهورة مع حاسوب ديب بلو (Deep Blue)، كان هذا الحدث ما أشعل فتيل الاهتمام مرة أخرى ليتصدر الذكاء الاصطناعي في ذلك الوقت جميع عناوين الصحف والمجالات وليكون الحدث الأبرز في نشرات الأخبار.
</p>

<p>
	وبعد هذا الحدث <a data-ss1621157665="1" href="https://en.wikipedia.org/wiki/Dragon_NaturallySpeaking" rel="external nofollow">ظهر</a> في نفس العام قفزة جديدة أخرى تحسب للذكاء الاصطناعي، وهي ظهور أول نظام للتعرف على الكلام (Speech Recognition) وسمّي Dragon NaturallySpeaking ويستطيع هذا النظام أداء ثلاث مهام رئيسية وهي:
</p>

<ol>
	<li>
		التعرف على الكلام.
	</li>
	<li>
		تحويل النص إلى كلام (Text-To-Speech).
	</li>
	<li>
		التعرف على الأوامر المنطوقة.
	</li>
</ol>

<p>
	طورت هذا النظام شركة (Dragon Systems) والّذي أصبح لاحقًا جزءًا من نظام الويندوز Windows 95. كان هذا النظام حجر الأساس ومن الخطوات الكبيرة في مجال تفسير اللغة المنطوقة.
</p>

<p>
	وفي عام 1999 <a data-ss1621157665="1" href="https://www.cancernetwork.com/view/computer-technology-helps-radiologists-spot-overlooked-small-breast-cancers" rel="external nofollow">استطاع</a> مجموعة من العلماء في جامعة شيكاغو في تطوير آلية للتشخيص بمساعدة الحاسب (Computer-Aided Diagnosis) والّتي تعرف اختصارًا (CAD)، استعرضت هذه الآلية 22000 صورة شعاعية لسرطان الثدي، واستطاعت الكشف عن السرطان بدقة بلغت نسبتها 52٪، وعبر الدكتور كيونو دوي أستاذ الأشعة في جامعة شيكاغو أنه يمكن اعتبار هذه الآلية كرأي ثانٍ لفحص الصور الشعاعية للثدي، وبهذا يمكننا التغلب على الأخطاء البشرية الناتجة عن قلة خبرة الأطباء، أو عندما يكونوا مرهقين جدًا وتستطيع مساعدتهم من خلال إظهار نتائج بيانية للصور.
</p>

<p>
	وآنذاك، بدأت العناصر الأساسية لتطوّر الذكاء الاصطناعي بالاكتمال وهي:
</p>

<h3>
	التأثير النفسي لقانون مور
</h3>

<p>
	تتمتَّع قلة قليلة من ظواهر الكون الرقمي بتأثيرٍ عميق على تكنولوجيا المعلومات والاتصالات مثلما يعادل تأثيرَ قانونِ مور. ويمكن صياغة هذا القانون بإيجازٍ: "يتضاعف عددُ الترانزستور على الدوائر المدمجة كلَّ عامين تقريبًا".
</p>

<p>
	يتناول د. ييل بات -عالِم حاسوب بجامعة تكساس في أوستن- قانونَ مور في محاضراته بطرحه السؤال التالي على الحضور: <strong>ما هو موضوع قانون مور؟</strong>
</p>

<ul>
	<li>
		(أ) الفيزياء؟
	</li>
	<li>
		(ب) تكنولوجيا معالجة الحاسوب؟
	</li>
	<li>
		(جـ) المعمارية الدقيقة للحاسوب؟
	</li>
	<li>
		(د) علم النفس؟
	</li>
</ul>

<p>
	الإجابة الصحيحة بحسب د. بات هي <strong>(د) علم النفس</strong>. يستند رأي الدكتور بات على أن قانون مور أصبح نبوءة تتحقَّق من تلقاء نفسها (أيِ اعتقادًا يعتقده الكثيرون وينتظرون تحقُّقَه وينسبون إليه ما يحدث). فمصمِّمو الدوائر المدمجة (ومديروهم) بشركات إنتل وهيتاشي وإيه إم دي وغيرها من مصنِّعي الشرائح تأقلموا نفسيًّا مع توقُّع أنه سيوجد جيلٌ جديد من الشرائح كلّ ١٨–٢٤ شهرًا، يتمتع بضِعْف سعة الإصدارات السابقة. وإنْ لم تطرح شركةُ إنتل رقاقاتٍ جديدةً بسعة محسَّنة؛ فإن مسئوليها التنفيذيين يُدرِكون أن شركة إيه إم دي أو غيرها من المنافسين سيطرحون رقاقاتٍ جديدةً.
</p>

<h3>
	المعالجات السريعة وظهور المعالجات المتخصّصة
</h3>

<p>
	انعكس تطور في صناعة أشباه الموصلات على طريقة تصنيع المعالجات فأصبح لدينا معالجات سريعة جدًا، وكلّ سنة تتضاعف هذه السرعة بفضل قانون مور، بالإضافة إلى ذلك أدى ظهور وحدات معالجة الرسوميات (GPU) إلى تعظيم عمل البرامج على المعالجة المتوازية مما أعطى سرعة أكبر على تنفيذ خوارزميات الذكاء الاصطناعي، وكان التنافس بين شركتي نيفيديا (Nvidia) وشركة ATi المختصين في بناء بطاقات المعالجة الرسومية محتدًا جدًا في هذه الفترة، بل وازدادت كثيرًا في مطلع القرن الواحد والعشرين، وكان جهد كِلا الشركتين منصبًا على زيادة مميزات البطاقات الرسومية خاصتها من خلال زيادة قدرتها على المعالجة المتوازية، وإضافة مختلف المزايا الأخرى، وكان لهذه المنافسة فضل كبير على تسريع عجلة تطور الذكاء الاصطناعي.
</p>

<p>
	وشهد عام 2007 ظهور أول بطاقة معالجة رسوميات مخصصة للأغراض العامة والّتي استخدمت من أجل عمل أبحاث على البيانات الضخمة وفي مجال الذكاء الاصطناعي وتعلّم الآلة والتنقيب في البيانات، بالإضافة إلى ذلك تستخدم هذه البطاقات في يومنا الحالي في تعدين البتكوين. هل سبق وأن سمعت عن <a data-ss1621157665="1" href="https://www.youtube.com/watch?v=hdUow2igzlA" rel="external nofollow">مزارع البتكوين</a>؟.
</p>

<h3>
	تطور طرق التخزين وظهور حلول التخزين السحابي
</h3>

<p>
	لم يكن التطور الحاصل على مستوى رفع قوة المعالجة فقط، وإنما رافقه أيضًا تطورًا في طرق التخزين الموجودة ففي عام 1990 ظهر نوع جديد من الأقراص الصلبة بسعة تصل إلى 1.5 غيغابايت، ولم يكن هذا القرص الأول الّذي خرج إلى الساحة بل إن الأقراص الصلبة ظهرت منذ عام 1953، و<a data-ss1621157665="1" href="https://ntrs.nasa.gov/search.jsp?R=19940029305" rel="external nofollow">طورت</a> شركة ناسا في عام 1993 مكتبة تخزين كبيرة معتمدة على الأشرطة فقط تبلغ سعتها الإجمالية 1.2 تيرابايت، واستمر تطوّر السعات التخزينة بوَتيرة منخفضة إلى أن شهدنا انتشار شبكة الوِب الأمر الّذي دفع عجلة التطور للتقدم بسرعة كبيرة وبدأت تظهر آنذاك الحلول المتقدمة مثل الحلّ الّذي طرحته شركة أمازون للتخزين السحابي EC2، وخدمة التخزين البسيطة لأمازون (Amazon Simple Storage Service) وتدعى S3، وبذلك لم تعد سعة التخزين تشكل مشكلة كبيرة.
</p>

<h3>
	انتشار شبكة الوِب عالميًا والبيانات الضخمة
</h3>

<p>
	تزامنت بدايات القرن الواحد والعشرين مع انتشار شبكة الوِب (World Wide Web) انتشارًا عالميًا كبيرًا مما نتج عنه ظهور شركات ساعدت على تطويعه وتنظيمه (مثل: شركة أمازون وشركة غوغل) والّتي فتحت أفاقًا جديدة في طريقة تعامل الناس مع هذه الشبكة فأصبحت المعلومة بعيدة عنك بمقدار ضغطة زر واحدة كما احدثت تجارة جديدة سميت بالتجارة الإلكترونية.
</p>

<p>
	من الجدير بالذكر أنه عادة ما تختلط المفاهيم بالنسبة لعامة الناس بين مصطلحي <strong>الإنترنت</strong> و<strong>الوِب</strong> لذا من الواجب علينا توضيح الفرق بينهم إذ أن الوب ما هو إلا طريقة للوصول وتبادل المعلومات عبر استخدام الإنترنت ومحركات البحث. و"الوِب" هو في الواقع تطبيق من تطبيقات الإنترنت مثل تطبيقات الدردشة الآنية والبريد الإلكتروني تمامًا. أي أنه مجرد خدمة من خدمات الإنترنت.
</p>

<p>
	ساعد هذا الانتشار الكبير على توليد بيانات كبيرة إذ قدرت كمية البيانات الّتي أُنشأت عام 2002 حوالي 5 إكسابايت (<a data-ss1621157665="1" href="https://ar.wikipedia.org/wiki/%D8%A5%D9%83%D8%B3%D8%A7%D8%A8%D8%A7%D9%8A%D8%AA#:~:text=%D8%B9%D9%84%D9%85%D9%8A%D8%A7%D9%8B%20:%201%20%D8%A5%D9%83%D8%B3%D8%A7%D8%A8%D8%A7%D9%8A%D8%AA%20=%201018,=%201000000000000000000%20%D8%A8%D8%A7%D9%8A%D8%AA%20=%201000%20%D8%A8%D9%8A%D8%AA%D8%A7%D8%A8%D8%A7%D9%8A%D8%AA." rel="external nofollow">إكسابايت</a>) وتقدر كمية البيانات المنشأة في وقتنا الحالي ب 33 زيتابايت (<a data-ss1621157665="1" href="https://ar.wikipedia.org/wiki/%D8%B2%D9%8A%D8%AA%D8%A7%D8%A8%D8%A7%D9%8A%D8%AA#:~:text=%D8%B9%D9%84%D9%85%D9%8A%D8%A7%D9%8B%20:%201%20%D8%B2%D9%8A%D8%AA%D8%A7%D8%A8%D8%A7%D9%8A%D8%AA%20=%201021,=%201,180,591,620,717,411,303,424%20%D8%A8%D8%A7%D9%8A%D8%AA%20=%201024%20%D8%A5%D9%83%D8%B3%D8%A7%D8%A8%D8%A7%D9%8A%D8%AA." rel="external nofollow">زيتابايت</a>)، ويتوقع أن تنمو كمية البيانات المنشأة في عام 2025 إلى 175 زيتابايت.
</p>

<h3>
	عودة اهتمام الباحثين في مجال الذكاء الاصطناعي والمجتمع ككُلّ
</h3>

<p>
	من خلال المخطط الّذي استعرضنا فيه عدد تكرارات الكلمات الدلالية الخاصة بالذكاء الاصطناعي نلاحظ أن الزيادة الملحوظة في الاهتمام عادت من عام 2000 وليشهد المجال البحثي في هذا المجال أوج الاهتمام في عام 2005 الأمر الّذي ترافق مع تطور كبير في الخوارزميات فنلاحظ ظهور <a data-ss1621157665="1" href="https://www.syr-res.com/article/7664.html" rel="external nofollow">الخوارزمية التطورية</a> وتطبيقاتها الكثيرة في مجالات عديدة والشبكات العصبية الاصطناعية وشبكات بايز وخوارزمية الدعم الآلي للمتجه.
</p>

<p>
	هل تذكر المشاكل الّتي عانى منها تطور الذكاء الاصطناعي؟ باختصار كانت أبرز المشاكل الأساسية هي:
</p>

<ul>
	<li>
		ضعف سرعة المعالجة الحاسوبية.
	</li>
	<li>
		ذاكرة التخزين المحدودة.
	</li>
	<li>
		عدم وجود كمية بيانات كافية.
	</li>
	<li>
		الخوارزميات الرياضية.
	</li>
</ul>

<p>
	لاحظ أن جميع المشاكل حُلّت بالفعل مع ذلك ظهرت العديد من المشاكل الأخرى، ولكن بالطبع ليست بضراوة المشاكل الأولى، ليشهد بذلك مجال الذكاء الاصطناعي صفحة جديدة في تاريخه وليعود بذلك إلى دائرة الضوء مرة أخرى، ولكن هذه المرة ستستمر طويلًا.
</p>

<p>
	ظهرت بعدها العديد من التطبيقات العملية مدعومة من تقنيات الذكاء الاصطناعي وتعلّم الآلة في المجالات الصناعية وتوالت الإنجازات والتطبيقات العملية تباعًا والتي ذكرنا بعضها في <a data-ss1621157665="1" href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A-%D8%A3%D9%87%D9%85-%D8%A7%D9%84%D8%A5%D9%86%D8%AC%D8%A7%D8%B2%D8%A7%D8%AA-%D9%88%D8%A7%D9%84%D8%A7%D8%AE%D8%AA%D8%B1%D8%A7%D8%B9%D8%A7%D8%AA-%D9%88%D9%83%D9%8A%D9%81-%D8%A3%D8%AB%D8%B1%D8%AA-%D9%81%D9%8A-%D8%AD%D9%8A%D8%A7%D8%AA%D9%86%D8%A7-%D8%A7%D9%84%D9%8A%D9%88%D9%85%D9%8A%D8%A9-r975/" rel="">المقال السابق</a> ومن بين أبرز الأحداث الّتي أحدثت ضجة آنذاك هو <a data-ss1621157665="1" href="https://www.wired.com/2009/09/bellkors-pragmatic-chaos-wins-1-million-netflix-prize/" rel="external nofollow">إعلان</a> شركة نتفليكس (Netflix) في عام 2006 عن جائزة تبلغ قيمتها مليون دولار لكل من يستطيع أن يأتي بخوارزمية توصية لأقتراح الأفلام المناسبة على المشتركين بشرط أن تكون أفضل وأسرع من الخوارزمية الّتي لديهم. لم يكن إيجاد خوارزمية بهذه المواصفات مهمة سهلة أبدًا ولكن فريق صغير من علماء الحاسب في شركة AT&amp;T اعتنق التحدي وعكف على إيجاد الخوارزمية المناسبة وتكللت محاولتهم بالنجاح ولكن تطلب الأمر منهم ثلاث سنوات كاملة!
</p>

<p>
	وبعدها انضمت جميع الشركات العملاقة مثل غوغل وفيسبوك إلى هذا المجال رسميًا الأمر الّذي شجع جميع الشركات الصغيرة الكبيرة الأخرى إلى التفكير جديًا في الأنضمام أيضًا ليصبح بذلك مجال الذكاء الاصطناعي مجالًا مزدهرًا وأساسيًا في أغلب شركات وادي السيليكون (Silicon Valley).
</p>

<h2>
	الخلاصة
</h2>

<p>
	بالطبع هنالك العديد من الأحداث الأخرى الّتي شاركت في تأسيس هذا المجال ولكننا حاولنا تسليط الضوء على أبرز المحطات الّتي شهدها مجال الذكاء الاصطناعي ومشتقاته مثل تعلم الآلة على مرّ السنوات، والآن بعد فهمنا إمكانياته وتطبيقاته وتاريخه الكامل نستطيع الآن الدخول فيه بخطوات واثقة وثابتة لمعرفته عن قرب وسبر أغواره بالمقالات الموالية.
</p>

<h2>
	المراجع
</h2>

<ul>
	<li>
		<a data-ss1621157665="1" href="https://www.researchgate.net/publication/333039347_Analyzing_the_Prospect_of_an_Approaching_AI_Winter#pfd" rel="external nofollow">Analyzing the Prospect of an Approaching AI Winter</a>
	</li>
	<li>
		<a data-ss1621157665="1" href="https://cloud.withgoogle.com/build/data-analytics/explore-history-machine-learning/" rel="external nofollow">A history of machine learning</a>
	</li>
	<li>
		<a data-ss1621157665="1" href="https://www.computerhistory.org/timeline/memory-storage/" rel="external nofollow">Timeline of Computer History</a>
	</li>
	<li>
		<a data-ss1621157665="1" href="https://www.hindawi.org/books/83063951/2/" rel="external nofollow">كتاب الكون الرقمي: الثورة العالمية في الاتصالات - الفصل الثاني نظرة تأمُّلية لقانون مور</a>
	</li>
</ul>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A/" rel="">تعلم الذكاء الاصطناعي</a>
	</li>
	<li>
		المقال التالي: <a data-ss1621157665="1" href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D9%84%D9%85%D9%81%D8%A7%D9%87%D9%8A%D9%85-%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A9-%D9%84%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9-r1009/" rel="">المفاهيم الأساسية لتعلم الآلة</a>
	</li>
	<li>
		المقال السابق: <a data-ss1621157665="1" href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A-%D8%A3%D9%87%D9%85-%D8%A7%D9%84%D8%A5%D9%86%D8%AC%D8%A7%D8%B2%D8%A7%D8%AA-%D9%88%D8%A7%D9%84%D8%A7%D8%AE%D8%AA%D8%B1%D8%A7%D8%B9%D8%A7%D8%AA-%D9%88%D9%83%D9%8A%D9%81-%D8%A3%D8%AB%D8%B1%D8%AA-%D9%81%D9%8A-%D8%AD%D9%8A%D8%A7%D8%AA%D9%86%D8%A7-%D8%A7%D9%84%D9%8A%D9%88%D9%85%D9%8A%D8%A9-r975/" rel="">الذكاء الاصطناعي: أهم الإنجازات والاختراعات وكيف أثرت في حياتنا اليومية</a>
	</li>
	<li>
		<a data-ss1621157665="1" href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%B4%D8%A8%D9%83%D8%A9-%D8%B9%D8%B5%D8%A8%D9%8A%D8%A9-%D8%B5%D9%86%D8%B9%D9%8A%D8%A9-%D9%88%D8%AA%D8%AF%D8%B1%D9%8A%D8%A8%D9%87%D8%A7-%D9%84%D9%84%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D9%88%D8%AC%D9%88%D9%87-r1198/" rel="">إعداد شبكة عصبية صنعية وتدريبها للتعرف على الوجوه</a>
	</li>
	<li>
		النسخة الكاملة لكتاب <a data-ss1621157665="1" href="https://academy.hsoub.com/files/17-%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A7%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A-%D9%88%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9/" rel="">مدخل إلى الذكاء الاصطناعي وتعلم الآلة</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">988</guid><pubDate>Mon, 07 Sep 2020 18:00:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x630;&#x643;&#x627;&#x621; &#x627;&#x644;&#x627;&#x635;&#x637;&#x646;&#x627;&#x639;&#x64A;: &#x623;&#x647;&#x645; &#x627;&#x644;&#x625;&#x646;&#x62C;&#x627;&#x632;&#x627;&#x62A; &#x648;&#x627;&#x644;&#x627;&#x62E;&#x62A;&#x631;&#x627;&#x639;&#x627;&#x62A; &#x648;&#x643;&#x64A;&#x641; &#x623;&#x62B;&#x631;&#x62A; &#x641;&#x64A; &#x62D;&#x64A;&#x627;&#x62A;&#x646;&#x627; &#x627;&#x644;&#x64A;&#x648;&#x645;&#x64A;&#x629;</title><link>https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A-%D8%A3%D9%87%D9%85-%D8%A7%D9%84%D8%A5%D9%86%D8%AC%D8%A7%D8%B2%D8%A7%D8%AA-%D9%88%D8%A7%D9%84%D8%A7%D8%AE%D8%AA%D8%B1%D8%A7%D8%B9%D8%A7%D8%AA-%D9%88%D9%83%D9%8A%D9%81-%D8%A3%D8%AB%D8%B1%D8%AA-%D9%81%D9%8A-%D8%AD%D9%8A%D8%A7%D8%AA%D9%86%D8%A7-%D8%A7%D9%84%D9%8A%D9%88%D9%85%D9%8A%D8%A9-r975/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2020_08/1.png.d4fb744a2e1086475c09194064d3882a.png" /></p>
<p>
	هذا المقال جزء من سلسلة «مدخل إلى الذكاء الاصطناعي»:
</p>

<ul>
	<li>
		الذكاء الاصطناعي: أهم الإنجازات والاختراعات وكيف أثرت في حياتنا اليومية
	</li>
	<li>
		<a data-ss1621157650="1" data-ss1621158006="1" href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A-%D9%85%D8%B1%D8%A7%D8%AD%D9%84-%D8%A7%D9%84%D8%A8%D8%AF%D8%A1-%D9%88%D8%A7%D9%84%D8%AA%D8%B7%D9%88%D8%B1-%D9%88%D8%A7%D9%84%D8%A3%D8%B3%D8%B3-%D8%A7%D9%84%D8%AA%D9%8A-%D9%86%D8%B4%D8%A3-%D8%B9%D9%84%D9%8A%D9%87%D8%A7-r988/" rel="">الذكاء الاصطناعي: مراحل البدء والتطور والأسس التي نشأ عليها</a>
	</li>
	<li>
		<a data-ss1621157650="1" data-ss1621158006="1" href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D9%84%D9%85%D9%81%D8%A7%D9%87%D9%8A%D9%85-%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A9-%D9%84%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9-r1009/" rel="">المفاهيم الأساسية لتعلم الآلة</a>
	</li>
	<li>
		<a data-ss1621157650="1" data-ss1621158006="1" href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9-%D8%A7%D9%84%D8%AA%D8%AD%D8%AF%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%B1%D8%A6%D9%8A%D8%B3%D9%8A%D8%A9-%D9%88%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A7%D9%84%D8%AA%D9%88%D8%B3%D8%B9-%D9%81%D9%8A-%D8%A7%D9%84%D9%85%D8%AC%D8%A7%D9%84-r1010/" rel="">تعلم الآلة: التحديات الرئيسية وكيفية التوسع في المجال</a>
	</li>
	<li>
		يمكنك قراءة السلسلة على شكل كتاب إلكتروني بالانتقال إلى صفحة الكتاب، <a data-ss1621157650="1" data-ss1621158006="1" href="https://academy.hsoub.com/files/17-%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A7%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A-%D9%88%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9/" rel="">مدخل إلى الذكاء الاصطناعي وتعلم الآلة</a>.
	</li>
</ul>

<p>
	لا يكاد يمضي يوم إلا ونسمع فيه ظهور اختراع جديد من هنا، وقفزة علمية من هناك، أمسى عالم الذكاء الاصطناعي والآلات المتثِّملة بالتكنولوجيا عنصرًا أساسيًا في حياتنا تُشاركنا يومياتنا وتساعدنا في معظم أعمالنا ومهامنا سواء السهلة منها أو الصعبة بل أصبحت جزءًا لا يتجزّأ من شخصيتنا وذواتنا إلى درجة أنه يصعب علينا تخيل الحياة من دونها. لم يقتصر الأمر على ذلك فقط، وإنما تعدى الأمر لأبعد من ذلك بكثير إذ أضحت هذه التكنولوجيا تعرِفُ عنا أضعاف ما نعرفهُ عنها. وفي حضرة هذا الإنغماس التقني تتلاشى حدود الخصوصية، وتتكسر جدارن التفرّد الإنساني بقوة أمواج التطفل التكنولوجي، مُمثّلة بتطبيقات مثل فيسبوك وغوغل -وما شابهها- تراها من وجهها المُعلن مفيدة ولطيفة إلا أن لها وجهًا مخفيًا آخر يصعب تصديقه. لتتحول بذلك جميع معلوماتنا وصورنا واهتماماتنا وقائمة أصدقائنا لمجرد قيم رقمية محصورة بين الصفر أو الواحد!
</p>

<p>
	ولكن دعونا لا نركز على الجوانب السلبية فقط ولنأخذ نصف الكأس الممتلئة، فمن المعيب أن نحسب كل تقنية علينا هي عدوٌ محتمل أو براثن احتلال فكري أو اقتصادي وما إلى ذلك. وهنا ستطفوا أسئلة لا يمكننا التغاضي عنها أو تجاوزها. من بين هذه الأسئلة، هل استطعنا حقًا الاستفادة من كلّ هذه التكنولوجيا؟ هل طغت الجوانب السلبية للتكنولوجيا على جوانبها الإيجابية؟ وإلى أي مدى استطاعت هذه التكنولوجيا أن تساعدنا؟ وهل يمكن للآلة أن تزيد من ذكائها بما يُعرفٌ بتقنيات الذكاء الاصطناعي وتعلّم الآلة وما إلى ذلك من هذه المصطلحات الرنانة؟ بل السؤال الأهم هنا هل حقًا يمكننا بناء الثقة في قراراتها واستنتاجاتها؟ أم أن الآلة هي الأخر تخطئ مثلما يخطئ أي إنسان؟ وأخيرًا هل نحن نشهد حاليًا إتحاد قوة الآلات مع الإنسان في أبهى حلّة لتشكيل ما يُعرفُ في بعض الأفلام <a data-ss1621157650="1" data-ss1621158006="1" href="https://ar.wikipedia.org/wiki/%D8%B3%D8%A7%D9%8A%D8%A8%D9%88%D8%B1%D8%BA" rel="external nofollow">سايبورغ</a>؟ أم أننا نشهد تجريد الإنسان من خصوصيته وبعضًا من حقوقه الأساسية وتخميد أفكاره وتهميشها وجعلها مجرد منشور عابر تتحكم فيه خوارزميةٌ ماديةٌ بحتة تُعلي من قيمة الإعجاب أو التعليق أكثر من قيمة المنشور بحد ذاته أو الفكرة الكامنة وراءه؟
</p>

<p>
	في الحقيقة وعلى الرغم من كثرة الأخطار المترتبة على خصوصية الفرد بكلّ تقنية جديدة، إلا أنه لا بدّ لنا بأن نعترف أن لهذه التكنولوجيا فضلًا كبيرًا في تطور الكثير من المجالات والعلوم المادية والنظرية وأثرها الّذي سيمتدُ لأجيال وأجيال وتحقيقها لأشياءً كثيرة لم نكن لنحلم بها أو نتخيّلها من قبل. ومع هذه المميزات الرائعة لا بد أن يكون لها وجه آخر وجهٌ سيء تتشارك به هذه التكنولوجيا مع كل الاختراعات القديمة كانت أو الحديثة وجهٌ نابع من الشرّ الإنساني الموجود فينا لبسطِ سيطرتنا ونفوذنا على أقراننا من البشر، وما هذه التكنولوجيا أو التقنيات الحديثة إلا مجرد أدوات جديدة بإمكانيات مذهلة نستطيع من خلالها خدمة البشرية أو تدميرها، وأما هي بحد ذاتها فليس لها أي نية خبيثة للنيل منا أو للسيطرة علينا ففي نهاية المطاف نحن من برمجناها!
</p>

<p>
	وفي إطار سعينا للاستفادة بأكبر قدرٍ من الإمكان من أي تقنيةٍ أو اختراعٍ جديد سنتجاهلُ الجانب السلبي وسنحاول التركيز فقط على الجانب الإيجابي. ولذلك سنسلطُ الضوء في هذه السلسلة على فرع جديد -نسبيًا-من العلوم الحديثة ألا وهو <strong>الذكاء الاصطناعي</strong> وتحديدًا <strong>تعلّم الآلة</strong> لما له من فوائد كبيرة وإمكانيات هائلة ومذهلة، والّتي شهِدناها في السنوات السابقة وسنشهدُ حتمًا أكثر منها في السنوات اللاحقة. ولكي لا نُطيل في المقدمات إليكم أهم التطبيقات الإنجازات العلمية والعملية للذكاء الاصطناعي وتعلّم الآلة وكيف لهذه التقنيات أن تساعدنا في مجالات حياتنا اليومية.
</p>

<h2>
	جدول المحتويات
</h2>

<ul>
	<li>
		<a data-ss1621157650="1" data-ss1621158006="1" href="#sec1" rel="">إنجازات الذكاء الاصطناعي في مجال مهام الحياة اليومية</a>

		<ul>
			<li>
				<a data-ss1621157650="1" data-ss1621158006="1" href="#sec1-1" rel="">اكتشاف الكائنات في الصور</a>
			</li>
			<li>
				<a data-ss1621157650="1" data-ss1621158006="1" href="#sec1-2" rel="">الترجمة بين اللغات باستخدام الذكاء الاصطناعي</a>
			</li>
			<li>
				<a data-ss1621157650="1" data-ss1621158006="1" href="#sec1-3" rel="">التحدث بصوت خام وحقيقي</a>
			</li>
			<li>
				<a data-ss1621157650="1" data-ss1621158006="1" href="#sec1-4" rel="">التعرف على المشاعر من خلال الصوت</a>
			</li>
			<li>
				<a data-ss1621157650="1" data-ss1621158006="1" href="#sec1-5" rel="">التعرف على المشاعر من خلال الصور</a>
			</li>
			<li>
				<a data-ss1621157650="1" data-ss1621158006="1" href="#sec1-6" rel="">اختيار جزء من فقرة تجيب على سؤالك</a>
			</li>
		</ul>
	</li>
	<li>
		<a data-ss1621157650="1" data-ss1621158006="1" href="#sec2" rel="">إنجازات الذكاء الاصطناعي في مجال السفر والتجوال</a>
		<ul>
			<li>
				<a data-ss1621157650="1" data-ss1621158006="1" href="#sec2-1" rel="">تصفح خريطة مترو أنفاق لندن</a>
			</li>
			<li>
				<a data-ss1621157650="1" data-ss1621158006="1" href="#sec2-2" rel="">قدرة الآلة على قيادة سيارة بالاستعانة</a>
			</li>
			<li>
				<a data-ss1621157650="1" data-ss1621158006="1" href="#sec2-3" rel="">تطيير طائرات الدرون باستخدام الذكاء الاصطناعي</a>
			</li>
			<li>
				<a data-ss1621157650="1" data-ss1621158006="1" href="#sec2-4" rel="">توقع ازدحام مواقف السيارات بحسب المنطقة</a>
			</li>
		</ul>
	</li>
	<li>
		<a data-ss1621157650="1" data-ss1621158006="1" href="#sec3" rel="">إنجازات الذكاء الاصطناعي في المجال الطبي والخدمات الصحية</a>
		<ul>
			<li>
				<a data-ss1621157650="1" data-ss1621158006="1" href="#sec3-1" rel="">تقنية جديدة تمكن البكم من الكلام</a>
			</li>
			<li>
				<a data-ss1621157650="1" data-ss1621158006="1" href="#sec3-2" rel="">تزويد المكفوفين بأعين اصطناعية</a>
			</li>
			<li>
				<a data-ss1621157650="1" data-ss1621158006="1" href="#sec3-3" rel="">التعرف على اعتلال الشبكية السكري (سبب رئيسي للعمى) من صور الشبكية</a>
			</li>
			<li>
				<a data-ss1621157650="1" data-ss1621158006="1" href="#sec3-4" rel="">الكشف عن أمراض السرطان بالاستعانة بالذكاء الاصطناعي</a>
			</li>
			<li>
				<a data-ss1621157650="1" data-ss1621158006="1" href="#sec3-5" rel="">تصنيع أدوية جديدة بالكامل بالاعتماد فقط على الذكاء الاصطناعي</a>
			</li>
			<li>
				<a data-ss1621157650="1" data-ss1621158006="1" href="#sec3-6" rel="">تتبع حالتك الصحية وأنت في المنزل بتقنيات الذكاء الاصطناعي</a>
			</li>
		</ul>
	</li>
	<li>
		<a data-ss1621157650="1" data-ss1621158006="1" href="#sec4" rel="">لا حدود لإمكانيات الذكاء الاصطناعي</a>
	</li>
	<li>
		<a data-ss1621157650="1" data-ss1621158006="1" href="#sec5" rel="">الخلاصة</a>
	</li>
</ul>
<div class="banner-container ipsBox ipsPadding">
    <div class="inner-banner-container">
            <p class="banner-heading">
                    دورة الذكاء الاصطناعي
            </p>



            <p class="banner-subtitle">
        احترف برمجة الذكاء الاصطناعي AI وتحليل البيانات وتعلم كافة المعلومات التي تحتاجها لبناء نماذج ذكاء اصطناعي متخصصة.
            </p>

            <div>
                    <a class="ipsButton ipsButton_large ipsButton_primary ipsButton_important" href="https://academy.hsoub.com/learn/artificial-intelligence" rel="">اشترك الآن</a>
            </div>
    </div>
<div class="banner-img"> <a href="https://academy.hsoub.com/learn/artificial-intelligence" rel=""><img alt="دورة الذكاء الاصطناعي AI" src="https://academy.hsoub.com/learn/assets/images/courses/artificial-intelligence.png"></a></div>
</div>
<h2 id="sec1">
	إنجازات الذكاء الاصطناعي في مجال مهام الحياة اليومية
</h2>

<h3 id="sec1-1">
	اكتشاف الكائنات في الصور
</h3>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="50565" data-ss1621157650="1" data-ss1621158006="1" href="https://academy.hsoub.com/uploads/monthly_2020_08/5f4ccb3559737_1----.png.aab1493e80063141163f7031aa4e4b2e.png" rel=""><img alt="صورة توضح كيفية اكتشاف الكائنات في الصور" class="ipsImage ipsImage_thumbnailed" data-fileid="50565" data-unique="data-unique" style="width: 900px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2020_08/5f4ccb362b951_1----.thumb.png.1869655946ce7d3626d1ee7d4e0fc24d.png"></a>
</p>

<p>
	لطالما شاهدنا السباق المتسارع بين الشركات على أتمتة مهامها وخطوط انتاجها في سعي حثيث منها للاعتماد على الآلة بدلًا من البشر نظرًا للفوائد الكبيرة الّتي ستجنيها من هذا الاعتماد، إذ لا تتطلب الآلة زيادة أجر سنوية، ولا تتذمر من كثرة العمل الإضافي، بل مع كلّ ذلك تستمر بالحفاظ على جودة الإنتاج ودقته، وكلّ متطلبات هذه الآلات جرّاء ما تقدمه هو عملية صيانة دورية بسيطة لتستمر فيها بخدمة تلك الشركات. إنها حقًا الموظف المثالي الّذي يحلم به جميع اصحاب المشاريع. إلا أن الدور الّذي تقدمه هذه الآلات بسيط للغاية، ويعود السبب في ذلك لقصورها من عدة نواحي إذ لا يمكنها فهم أو تمييز ما تراه، ولا تستطيع أن تتخذ قرار من تلقاء نفسها بناءً على ما رأته، عدا عن الأسباب الأخرى التي لا حصر لها الّتي تساعد على تشكل الوعي لدى هذه الآلة، وقد لاحظ كثير من الباحثين أنه إذا أردنا أن نؤتمت مهامًا كثيرة لا بد لنا من تطوير النظام البصري الخاص بالآلات (والّذي يعرف حاليًا بالرؤية الحاسوبية).
</p>

<p>
	شهد مجال الرؤية الحاسوبية (computer vision) كثيرًا من التطورات النوعية كما أضاف الذكاء الاصطناعي المزيد على هذا التطور كان من أبرزها أمكانيته في أكتشاف الكائنات في الصور، أي أن تجعل الآلات قادرة على معرفة ماهيّةَ ما تشاهده. إنه في الحقيقة لشيئ رائع لأننا نستطيع بذلك معرفة تصرفات هذا الكائن، وهل يقوى هذا الكائن الّذي تراه الآلة على الحركة أم أنه مجرد شجرة؟ أم أنه إنسان يستطيع الحركة؟ أم أنه مجرد آلة آخرى؟ وهنا لا بدّ لنا من تغيير تسمية الآلة إلى روبوت -إنسان آلي- وذلك بسبب كمية الحواس البشرية الّتي استطعنا تزويده بها فلذلك استحق هذه التسمية عن جدارة. ولكن كيف سيستطيعُ هذا الروبوت أن يعرف أن أمامه إنسان وهو يراه مجرد بكسلات تحوي قيم لونية معينة؟ فأين يبدأ جسم الكائن بين كلّ هذه البكسلات وأين ينتهي؟ ولنفرض أننا استطعنا أن نجعل الروبوت يتعرف على هذا الكائن؟ ماذا لو غيرنا حجم الصورة المدروسة أو ألوانها أو درجة حتى درجة سطوعها هل يا تُرى سيستمرُ هذا الروبوت في تمييز هذا الكائن أم لا؟
</p>

<p>
	تعتمد معظم أنظمة اكتشاف الكائنات في الصور على الشبكات العصبية الاصطناعية والّتي تحتوي على الكثير من الطبقات الداخلية المخفية، وتختص كلّ طبقة من هذه الطبقات بمهمة معينة، فمثلًا تختص الطبقة الأولى بتحديد الحواف والهياكل الهندسية الخارجية للكائن، ومن ثمّ تُمرّرُ هذه الطبقة نتائجها إلى الطبقة التالية، والّتي تعمل على مستوى آخر من التفاصيل، مثل أن تكون مختصة بتحديد الألوان والتدرجات اللونية ومقارنتها بما تعلمته وما تدربت عليه سابقًا، ومن ثمّ تُمرّرُ هي الأخرى نتائجها إلى الطبقة التالية، وهكذا دواليك إلى أن تكتمل المعلومات الخاصة بالصورة، ويصل النظام إلى نتيجة نهائية مع الطبقة الأخيرة، وبذلك يستطيع تحديد ما هو الكائن الموجود في الصورة بدقة معينة.
</p>

<p>
	كانت شركة مايكوسوفت من أوائل الشركات الّتي دخلت هذا المجال وأنجزت فيه ولكن ما لبثت إلى أن لحقتها جميع الشركات، بل وبعض الشركات سبقتها بمراحل مثل شركة فيسبوك. في يومنا الحالي لا يكاد يخلو أي روبوت من منظومة الرؤية الحاسوبية بمختلف تطبيقاتها، من بينها نظام اكتشاف الكائنات، ولم يقتصر الأمر على ذلك فحسب بل وأصبحت نظامًا مدمجًا بالكاميرات الحديثة في الهواتف النّقالة لننتقل بذلك إلى خطوة جديدة متقدمة في عالم الرؤية الحاسوبية ومزيدًا من الإمكانيات للروبوتات والذي سيؤدي في نهاية المطاف إلى كثرة الاعتماد عليها مستقبلًا.
</p>

<h3 id="sec1-2">
	الترجمة بين اللغات باستخدام الذكاء الاصطناعي
</h3>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="50566" data-ss1621157650="1" data-ss1621158006="1" href="https://academy.hsoub.com/uploads/monthly_2020_08/5f4ccb36c68a5_2---.png.3def218fba3ae20011c86c7e8dc6cfbe.png" rel=""><img alt="الترجمة بين اللغات بمساعدة الذكاء الاصطناعي" class="ipsImage ipsImage_thumbnailed" data-fileid="50566" data-unique="data-unique" style="width: 900px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2020_08/5f4ccb371a841_2---.thumb.png.0eb6a57a8345b42bf2aba61d172d9504.png"></a>
</p>

<p>
	لطالما كان نقل المعرفة من لغة إلى أخرى عملية شاقة ومجهدة، وتحتاج إلى جيوش من المترجمين والمدققين والكتّاب أيضًا، ولطالما كان حاجز اللغة هو الحاجز الأساسي الموجود في جسر التواصل بين الشعوب، بل وغالبًا ما يرتبط عدد اللغات المحكية في دولةٍ ما بمستوى انغلاق ثقافة هذه الدولة أو انفتاحها. ولطالما حاولت بعض الشركات مثل غوغل وفيسبوك في تطوير أنظمة الترجمة في إطار سعيها لهدم هذا الحاجز، إلا أن معظم هذه المحاولات كانت خجولة ولا ترتقي إلى الترجمة البشرية. ولكن هذا الحال لم يدم طويلًا فمع تقدم الذكاء الاصطناعي وإمكانياته غير المحدودة فكان لا بد من هذه الشركات من إعادة النظر في الحلول أُتيحت من خلال الذكاء الاصطناعي ومحاولة تعظيم الاستفادة منها. وفعلًا كان ذلك، بفضل طريقة التعلّم العميق (Deep Learning) -وهي جزء من طرق تطبيق الذكاء الاصطناعي- إذ أحدثت هذه الطريقة نقلة نوعية في الترجمة.
</p>

<p>
	ساهم تطبيق طرق التعلّم العميق في الترجمة الّتي تقدمها عملاقة الانترنت شركة غوغل (التابعة للشركة الأم ألفابت) في خفض معدل الخطأ بمقدار 60% بحسب <a data-ss1621157650="1" data-ss1621158006="1" href="https://www.nature.com/news/deep-learning-boosts-google-translate-tool-1.20696" rel="external nofollow">تصريح الشركة</a>. كما أوضحت أنها ستعتمدُ على هذه التقنية بالكامل في ترجمتها. أطلقَ عليه لاحقًا اسم نظام الترجمة الآلية العصبية (Neural Machine Translation system) ويدعى اختصارًا NMTS وصرح كوك لي -عالم حاسوب وأحد مطوري نظام NMTS - أن عمليات الدخل والخرج للنظام بأكمله تكون عبر شبكة عصبية واحدة.
</p>

<p>
	يتعلم هذا النظام الترجمة من خلال تحليل الترجمات الموجودة في خطابات الأمم المتحدة والبرلمان الأوروبي، وعند تمريرها عبر الشبكة العصبية تتعدل الاتصالات الموجودة بين الخلايا العصبية الاصطناعية بهدف تحسين الترجمة النهائية. وهي تحلل الجمل عن طريق تقسيم كلّ كلمة فيها إلى أجزاء مقطعية (أجزاء الكلمة باللغة الإنكليزية)، وتتحد هذه الأجزاء بطريقة ما داخل الشبكة العصبية مشكلةً المعنى، وهي طريقة مستمدة من طريقة اكتشاف الكائنات في الصور من خلال تقسيم الصورة لبكسلات وتحليل هذه البكسلات بطريقة معقدة جدًا لاستخراج ميزات معقدة (complex features) مثل الحواف والأنماط الهندسية وما إلى ذلك.
</p>

<p>
	يسلط هذا النجاح الضوء على أهمية تقنيات التعلّم العميق ونجاحه في مساعدتنا في التغلب على مشاكل أنظمة الترجمة الّتي عانينا منها لسنوات. ويعتقد شميد هوبر -عالم حاسوب في جامعة لوغانو- أن الآلات ستستطيعُ محاكاة طريقة البشر في الترجمة أو حتى هزيمتهم في حال تمكنها من الجمع بين المدخلات الحسية المختلفة، فمثلًا في المستقبل لن يرى الحاسوب جملة "سقطت القطة من الشجرة" وإنما سيُشاهد فيديوهات لقططٍ تسقط من الأشجار، وسيتحكمُ في روبوتات آلية آخرى يمكنها رؤية القطط وسماعها والشعور بالألم من خلال أجهزة استشعار الألم، لتنقل هذه التجارب إلى النظام ويعالجها ويربطها جميعًا بالنصوص المترجمة.
</p>

<h3 id="sec1-3">
	التحدث بصوت خام وحقيقي
</h3>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="50567" data-ss1621157650="1" data-ss1621158006="1" href="https://academy.hsoub.com/uploads/monthly_2020_08/5f4ccb37690ef_3----.png.51be78136cfa704ce356080ec892bc2f.png" rel=""><img alt="التحدث بصوت خام وحقيقي بالاستعانة بالذكاء الاصطناعي" class="ipsImage ipsImage_thumbnailed" data-fileid="50567" data-unique="data-unique" style="width: 900px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2020_08/5f4ccb37b67e7_3----.thumb.png.1f20ae0f20657de5c3c975d7a3af4716.png"></a>
</p>

<p>
	إن السماح للأشخاص بالتحدث مع الآلات هو حلمٌ لطالما راودنا لكثير من الوقت حلمُ التفاعل بين الإنسان والحاسوب بالصوت. وعندما ظهرت قدرة الحواسيب على فهم الكلام الطبيعي من خلال استخدام الشبكات العصبية العميقة (مثل تقنية البحث من خلال الصوت في غوغل) أحدث ذلك ثورة في السنوات القليلة الماضية، إلا أن توليد الكلام من خلال الحاسوب (أو عملية تحويل النص إلى كلام والّتي يرمّز إليها عادةً TTS) لم يشهد تطورًا كبيرًا، وذلك بسبب ضعف قدرته على نقل المشاعر أثناء الكلام وهو من أجمل الميّزات التي يمكن للمرء أن يفكر بها عند سماعه لصوت طبيعي، وتكمن المشكلة في الاعتماد على توليد الكلام من خلال تقنية تحويل النص إلى كلام بطريقة تسلسلية، إذ تعتمد هذه التقنية على تسجيل قاعدة بيانات كبيرة جدًا من أجزاء الكلام القصيرة المكونة من وِحدة واحدة، وثمّ إعادة تركيبها لتكوين كلمات متكاملة مما سيُصعبُ مهمة تعديل الصوت بدون تسجيل قاعدة بيانات جديدة كاملة وهذا ما شكلّ مشكلة حقيقة في هذا التقنية.
</p>

<p>
	ولكن كان لشركة ديب مايند (المملوكة من قِبل شركة غوغل) رأي آخر، إذ استطاعت هذه الأخيرة من بناء <a data-ss1621157650="1" data-ss1621158006="1" href="https://deepmind.com/blog/article/wavenet-generative-model-raw-audio" rel="external nofollow">نظام</a> قادر على توليد صوت خام وحقيقي ليحاكي أي صوت بشري، وبذلك يكون الصوت الناتج عن هذا النظام أفضل من أفضل أنظمة تحويل النصوص إلى كلام (Text-to-Speech) الحالية. مما يقلل الفجوة بين أداء صوت الآلة والصوت الطبيعي بمقدار 50%. أن الطريقة التي اتبعتها شركة ديب مايند كانت أكثر تقدمًا من الطرق القديمة إذ اعتمدت على على نمذجة الصوت الخام، وهو أمر لطالما تجنبه الباحثون في هذا المجال بسبب سرعة تدفق الكلام (عادة 16000 عينة في الثانية أو أكثر).
</p>

<p>
	كما أنها اعتمد على الشبكات العصبية التلافيفية بالكامل (Fully Convolutional Neural Network). ومن أجل استخدام الصوت الذي يولده نظام WaveNet كان لا بد من تحويل النص إلى كلام، إذ تحول النصوص إلى سلسلة من الميّزات اللغوية والصوتية (الّتي تحتوي على معلومات حول الصوت الحالي، والمقطع اللفظي، والكلمة، وما إلى ذلك من مميزات الكلمات بحسب اللغة) وتدخلُ هذه المعلومات إلى نظام WaveNet. وبالتالي إن تنبؤات الشبكة ليست مشروطة فقط بالعينات الصوتية السابقة، وإنما بالنص الذي نريد أن تنطقه. كما أن هذا النظام استطاع توليد ميزات إضافية للصوت مثل: التنفس أثناء الحديث، ومحاكاة حركات الفم مما يعطي مرونة أكبر لنموذج الصوت الخام بل وحتى أيضًا يمكنه محاكاة اللهجات واللكنات والعواطف.
</p>

<p>
	يفتح نظام WaveNets الكثير من الفرص والأفكار حول طريقة استغلال هذه التقنية لتحقيق أقصى درجة من الأستفادة المالية للشركات الكبيرة وحتى للشركات الناشئة أيضًا، فمثلًا إن فكرة استبدال المعلقين الصوتيين (Voice Over) بنظرائهم الآليين ستكون فكرة رائعة ومستدامة ومستقرة أكثر من استئجار معلقيين بشريين، أو ميزة قراءة الأخبار لبعض الأشخاص الّذين يعانون من عسر القراءة أو للأشخاص المشغولين بقيادة السيارة أو للنساء المشغولات بالأعمال المنزلية، كما يمكننا استخدامها أيضًا لقراءة النصوص للأشخاص الّذين يتعلمون لغاتٍ جديدة ليحاكي طريقة النطق البشري مضيفًا بذلك سهولة ملحوظة برحلة التعلم ونقطة إضافية في رصيد هذا النظام. وبذلك سيفتحُ بابٌ جديدٌ للشركات بخفض تكاليفها، وزيادة شعبيتها، وتعظيم إيراداتها وهو الهدف الرئيسي والمشترك لكلّ الشركات.
</p>

<h3 id="sec1-4">
	التعرف على المشاعر من خلال الصوت
</h3>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="50568" data-ss1621157650="1" data-ss1621158006="1" href="https://academy.hsoub.com/uploads/monthly_2020_08/5f4ccb3819972_4-.png.297a83b789360ca03c404d1aef416a66.png" rel=""><img alt="صورة توضح كيفية التعرف على المشاعر من خلال الصوت باستخدام الذكاء الاصطناعي" class="ipsImage ipsImage_thumbnailed" data-fileid="50568" data-unique="data-unique" style="width: 900px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2020_08/5f4ccb388429e_4-.thumb.png.b6da8932be13a1e2b05ff61690013a8b.png"></a>
</p>

<p>
	مع تزايد الأجهزة القابلة للارتداء وانتشار <a data-ss1621157650="1" data-ss1621158006="1" href="https://academy.hsoub.com/questions/4089-%D9%85%D8%A7-%D8%A7%D9%84%D8%B0%D9%8A-%D9%8A%D9%82%D8%B5%D8%AF-%D8%A8%D9%87-%D9%85%D8%B5%D8%B7%D9%84%D8%AD-%D8%A5%D9%86%D8%AA%D8%B1%D9%86%D8%AA-%D8%A7%D9%84%D8%A3%D8%B4%D9%8A%D8%A7%D8%A1%D8%9F/#comment-9099" rel="">إنترنت الأشياء</a> (Internet of Things)، وحقيقة أن الهواتف المحمولة أصبحت من الأمور الأساسية لكلّ شخص، والانتشار المتزايد لمختلف الأجهزة الأخرى الّتي تستطيع التواصل مع البشر من خلال الصوت، كالمساعدين الشخصيين في الهواتف مثل: المساعد الشخصي سيري (Siri) الخاص بأجهزة أبل، والمساعد الشخصي أليكسا (Alexa) الخاص بأجهزة أمازون، والمساعد الشخصي كورتانا (Cortana) الخاص بأجهزة مايكروسوفت، فكان لا بدّ من جعل الأنظمة الصوتية أذكى ليس فقط على مستوى فهم الكلام المنطوق فحسب؛ وإنما لفهم المشاعر المترابطة مع هذا الكلام لكي تستطيع تحليل ردات فعل من تتحدث معه وقياسها ومعرفة ما هو التصرف الصحيح المناسب لكلّ ردة فعل وبناء أنظمة ذكية تستفيد من ذلك.
</p>

<p>
	تسابقت العديد من الشركات للدخول في هذا المجال وكان أبرزها شركة Empath اليابانية وشركة أمازون الأمريكية وشركة Affectiva الأمريكية المنبثقة من معهد ماساتشوستس للتكنولوجيا، واستطاعت هذه الأخيرة إطلاق شبكة عصبية قادرة على تحليل الغضب من البيانات الصوتية في أقل من 1.2 ثانية متجاوزة بذلك قدرة البشر على إدراك الغضب من الصوت وسمي هذا النظام لاحقًا SoundNet.
</p>

<p>
	يعتمد هذا النظام على الشبكات العصبية التلافيفية بالكامل (Fully Convolutional Neural Networks) لتصنيف الأصوات من خلال تحليل التغيرات في تماثل الكلام ونبرة الصوت وإيقاعه وجودته لتمييز حالات الكلام والمشاعر وجنس المتكلم. إن العناصر الأساسية والمعيارية المتبعة في هذا النظام هو القدرة على تمكين التطبيقات والأجهزة لإدراك مشاعر البشر في الزمن الحقيقي (Real-time) للحدث.
</p>

<p>
	إن التطبيقات العملية كثيرة لمثل هذه الأنظمة إذ يمكنها مساعدتنا في اكتشاف العلامات المبكرة للخرف أو النوبات القلبية، وإمكانية جعل المساعدين الشخصيين أكثر جاذبية واستجابة بمعرفتها مشاعر للمتحدث، ومن خلال تعلم هذه الأنظمة من أخطائها ستضيف بذلك ميزة جميلة أرى في رصيد هذه الأنظمة، كما يمكن لهذه الأنظمة مساعدة مندوبي خدمة العملاء في معرفة مشاعر الزبائن بل إن شركة Empath اختبرت ذلك إذ نشرت خدماتها في مراكز خدمة العملاء (call centers) وصرحت الشركة بأنها خفّضت بهذه التقنية وقت العمل الإضافي للعاملين في المركز بمقدار 20% مع تعزيز معدل تحويل المبيعات (Sales Conversion) -والّذي يشير إلى معدل تحول الزوار أو العملاء المحتملين إلى عملاء حقيقيين- بمقدار يقارب 400%، كما أن شركة Empath دخلت في شراكة مع شركة الألعاب بوكو (Bocco) لإنشاء رسائل متحركة تفاعلية للكشف عن مشاعر اللاعبين الأطفال، كما دخلت نفس الشركة أيضًا في شراكة أخرى مع شركة Utaka لإنتاج مصباح يتدرج ألوانه بطريقة تتوافق مع المشاعر الأشخاص.
</p>

<p>
	على الرغم من هذا التقدم الحاصل في هذا المجال إلا أنه ماتزال الآلات تواجه صعوبة في الكشف عن المشاعر الحقيقية بدقة عالية ولم يرقَ أيّ نظام آلي إلى مستوى أداء المتخصصين البشر في اكتشاف جميع المشاعر الإنسانية، إلا أنه وبكل الأحوال مهما تكن الخطوة التالية لهذه التقنية فحتمًا ستكون مثمرة فوفقًا <a data-ss1621157650="1" data-ss1621158006="1" href="https://www.alliedmarketresearch.com/press-release/emotion-detection-and-recognition-market.html" rel="external nofollow">لدراسة</a> نشرتها شركة الأبحاث Allied Market Research يمكن أن تصل قيمة هذا السوق إلى 33.9 مليار دولار على مستوى العالم في عام 2023 مدفوعًا بارتفاع شعبية الأجهزة المدارة بالصوت.
</p>

<h3 id="sec1-5">
	التعرف على المشاعر من خلال الصور
</h3>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="50569" data-ss1621157650="1" data-ss1621158006="1" href="https://academy.hsoub.com/uploads/monthly_2020_08/5f4ccb3907c2b_5------.png.67b4ce0f8911a96f1c4d5a7ce3bba5b1.png" rel=""><img alt="صورة لكيفية التعرف على المشاعر من خلال الصور" class="ipsImage ipsImage_thumbnailed" data-fileid="50569" data-unique="data-unique" style="width: 900px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2020_08/5f4ccb3960252_5------.thumb.png.198fa47216ebbd6539097f834e81fbbb.png"></a>
</p>

<p>
	كانت الكاميرات لسنوات عديدة جزءًا من حياتنا وساعدتنا كثيرًا في مجال الحماية والآمن، ولا زالت حتى الآن تساعدنا. إذ يمكننا من خلالها مراقبة الموظفين في الشركة، ومراقبة المصانع لحمايتها من السارقين، ورصد المخالفات المرورية في الطرقات، ومراقبة المنزل أثناء غياب أصحابه، ومراقبة المدارس، والعديد من الأستخدامات الأخرى المفيدة جدًا لهذه التقنية، ولكن بعد بزوغ عصر الذكاء الاصطناعي لوحظ أن هذا المنجم الذهبي من المعلومات القادم من هذه الكاميرات والمتاح منذ عشرات السنين لم يستثمر على النحو الصحيح من أجل تحقيق أقصى استفادة منه، وهنا تضافرت الجهود لتعزيز دور تقنيات الذكاء الصنعي وتحديدًا تعلّم الآلة ولسد هذه الفجوة من خلال تحليل ما تشاهده هذه الآلات بنفسها واستخلاص المعلومات المفيدة والهامة، والتي نستطيع من خلالها دعم عملية اتخاذ القرار بالاعتماد على الأدلة المناسبة.
</p>

<p>
	وبما إن قدرة تعلّم الآلة تعدت عن كونها قادرة على اكتشاف الكائنات في الصور بل تجاوزت الحدود واصبحت قادرة على رصد مشاعر الناس. على الرغم من أنها ليست قادرة على رصد المشاعر بدقة ممتازة، إلا أن دقتها معقولة ومنطقية إذا اعتبرنا أنها مجرد البداية في هذا المجال "مجال اكتشاف ورصد المشاعر من خلال الصور"، تعتمد معظم هذه النظم في عملها على خوارزميات تتعرف على تفاصيل الوجه من العينين والحاجبين إلى الشفاه والعضلات المرتبطة بها ثم تنشئ خوارزمية قادرة على التنبؤ بما تعنيه تعابير الوجه المختلفة وذلك بحسب تفاصيل الوجوه الخاصة بكلّ عِرق معين. إذ تستطيع هذه الخوارزميات تعلم شعور الإنسان بالفرح من خلال مشاهدة ملايين الأشخاص يضحكون بطرق مختلفة ومع تحليل كلّ صورة من هذه الصور على حدة تستطيع هذه الخوارزميات أن تصل لاستنتاج قريب جدًا من الحقيقة، بل وأحيانًا تصل إلى الحقيقة الكاملة لمشاعر الشخص.
</p>

<p>
	نظام اكتشاف المشاعر أقوى وأدق ولا يحلل الصور فقط، وإنما جميع هذه المعلومات استخلصت من خلال تحليل الصور فقط فما بالك إذا كان النظام يحلل الصوت والصورة ليصبح بذلك مشهدًا متكاملًا لدى الخوارزميات تترابط فيه كلّ التفاصيل لنصل في نهاية الأمر لاستنتاجات أكثر دقة وموثوقية بمشاعر الفرح أو الحزن، والّتي استطعنا تحقيقها بفضل خوارزميات التعلم العميق. ولكن هل حدث ذلك فعلًا؟ هل استطاعت إحدى الشركات أن تطبق هذا الأمر؟ في الحقيقة نعم استطاعت تطبيقها وأيّما تطبيق فها هي الدكتور رنا القليوبي -حاصلة على دكتوراه <a href="https://academy.hsoub.com/programming/general/%D8%B9%D9%84%D9%88%D9%85-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8/" rel="">علوم الحاسب</a> من جامعة كامبريدج- تطلُ علينا بتأسيسها مع مجموعة من الأشخاص من معهد ماساتشوستس للتكنولوجيا شركة ناشئة سمتها أفكتيفا (Affectiva) والّتي تقدم خدمات الكشف عن المشاعر من خلال الصوت والصورة وهي من أول من سوّقت لمُصطلح الذكاء العاطفي الاصطناعي.
</p>

<p>
	تقيس أنظمة هذه الشركة تعابير الوجه غير المفلترة وغير المنحازة باستخدام مستشعر ضوئي أو بمجرد كاميرات وبِ قياسية، إذ تحدد في البداية جنس هذا الوجه سواء في الصور أو الفيديو وتحدد الخوارزميات المعتمدة بصورة رئيسية على مجال الرؤية الحاسوبية معالم الوجه الرئيسية، مثل: زوايا الحواجب وأطراف الأنف وزوايا الفم، ومن ثم تحلل خوارزميات التعلّم العميق وِحدات البكسل في الصور عند تلك المناطق لتصنيف تعابير الوجه ومعرفة ما هو الشعور الأنسب لهذا التعبيرات. وتقيس 7 أنواع فريدة للمشاعر وهي: الغضب والازدراء والاشمئزاز والخوف والفرح والحزن والمفاجأة. وتتدرب هذه الخوارزميات على قاعدة بيانات كبيرة جدًا تصل إلى 6 ملايين صورة من 87 دولة مُقدمةً بذلك مقاييس دقةٍ تصل إلى 90% بحسب <a data-ss1621157650="1" data-ss1621158006="1" href="https://www.affectiva.com/emotion-ai-overview/" rel="external nofollow">التصريح</a> الرسمي للشركة.
</p>

<p>
	وصلت قيمة الاستثمارات الحالية في الشركة إلى 26 مليون دولار مع تسجيل أكثر من 7 براءات اختراع غير أن هذه الشركة ليست الوحيدة في هذا المضمار وإنما هنالك العديد من الشركات الأخرى مثل: شركة إيموتينت (Emotient) والتي استحوذت عليها لاحقًا شركة آبل وشركة إنرسكوب (Innerscope) وهي الأخرى استحوذ عليها أيضًا من قِبل شركة نيلسن (Nielsen)، ويبقى هذا المجال واعدًا للعديد من شركات التسويق والدعاية لما له من فوائد جمّة وتطبيقات تعزز من قيمة الاعلانات وإمكانيات وصولها إلى الجمهور بالطريقة المُخطط لها.
</p>

<p>
	يمكنك الاطلاع على تطبيق عملي بسيط حول كيفية التعرف على الوجوه وملامحها وبعض خصائصها مثل العمر والمشاعر من مقال <a data-ss1621158006="1" href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B5%D9%86%D9%8A%D9%81-%D8%A7%D9%84%D8%B5%D9%88%D8%B1-%D9%88%D8%A7%D9%84%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D9%88%D8%AC%D9%87-%D9%81%D9%8A-%D9%85%D8%AC%D8%A7%D9%84-%D8%A7%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A-r1197/" rel="">تصنيف الصور والتعرف على الوجه في مجال الذكاء الاصطناعي</a>. 
</p>

<h3 id="sec1-6">
	اختيار جزء من فقرة تجيب على سؤالك عبر الذكاء الاصطناعي
</h3>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="50570" data-ss1621157650="1" data-ss1621158006="1" href="https://academy.hsoub.com/uploads/monthly_2020_08/5f4ccb39cb779_6-------.png.41c1203d2f82287ad1bca9faa30b6bd1.png" rel=""><img alt="اختيار الآلة لجزء من فقرة تجيب على سؤالك" class="ipsImage ipsImage_thumbnailed" data-fileid="50570" data-unique="data-unique" style="width: 896px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2020_08/5f4ccb3a20f3b_6-------.thumb.png.19dcd7a5ee916d6f74de29c138494b5c.png"></a>
</p>

<p>
	في ظل الزخم الهائل والمتواصل من المعلومات المنتشرة في جميع الأنواع من المواقع الموجودة على الإنترنت سواءً المواقع التعليمية أو المدونات أو حتى في مواقع التواصل الاجتماعي. وفي كثير من الأوقات نجد أن عملية البحث على المعلومة الصحيحة والدقيقة والمناسبة أصبح كمن يبحث عن إبرة في كومة من القش، وفي ظل هذا الكم الهائل من المعلومات تتلاشى أي قيمة للوقت فتصبح رحلة البحث عن إجابة لسؤال معين رحلة مليئة بمعلومات -لن نقول أنها ضارة ولكنها غير مفيدة في الوقت الحالي- وغالبًا ما نشاهد جميع المواقع تحاول بشتى الطرق تشتيت تركيزك وتشدك للانغماس في منجم المعلومات بل وهي تفهم تمامًا ما تحبه وتكرهه أكثر من معظم الأشخاص الّذين تعرفت عليهم خلال حياتك وذلك فقط من خلال خوارزمياتها (كما تفعل شركة فيسبوك). كما أنها تعرف بالضبط كيف تُشد إنتباهك وتحرك مشاعرك في محاولة منها لإشباع فضولك الّذي لا يعرف الشبع.
</p>

<p>
	وفي حضرة هذه الأحداث تتنامى الحاجة الملحة للإجابة على الأسئلة بأقصر مدة زمنية وبدقة عالية أو مقبولة وبسهولة معقولة وهنا جاءت شركة غوغل <a data-ss1621157650="1" data-ss1621158006="1" href="https://www.wired.com/2016/11/googles-search-engine-can-now-answer-questions-human-help/" rel="external nofollow">لتقدم</a> لنا الحلول، ولتعطينا الإجابة المناسبة للسؤال على طبقٍ من ذهب. هل صدف وأن سألت محرك البحث غوغل عن أمر ما وجاءك بمقطع من مقالة معينة تجيبك عن هذا السؤال بالضبط؟ كيف حدث ذلك؟ هل وظفت شركة غوغل أحد الأشخاص ليُحدد ما هي الفقرة المناسبة التي تجيب سؤالك؟ بالتأكيد لا، إذًا كيف لها معرفة ذلك؟ ببساطة أنها من فِعلِ الشبكات العصبية الاصطناعية العميقة -وهي إحدى طرق تعلّم الآلة- إذ عمدت الشركة على عرض الإجابات المناسبة لك بدلًا من عرضها لنتائج ذاتُ صلة بالموضوع فقط. مختصرةً بذلك الوقت ومضيفة لها ميزة جديدة تزيد من إعجابك بها أكثر من ذي قبل.
</p>

<p>
	تعتمد هذه الطريقة على تدريب الشبكات العصبية الاصطناعية العميقة من خلال خوارزمية تدعى <strong>خوارزميات ضغط الجمل</strong> (<a data-ss1621157650="1" data-ss1621158006="1" href="https://research.google/pubs/pub44820/" rel="external nofollow">Sentence Compression Algorithms</a>). على الرغم من كون الإجابة عن الأسئلة المباشرة إجابة مباشرة ودقيقة من المهام السهلة -نسبيًا- على الإنسان إلا أن الأمر معقد جدًا من وجهة نظر الخوارزميات، إذ لا بدّ لها في البداية من فهم اللغة الطبيعية للسؤال فهمًا كاملًا بالإضافة إلى فهم الكلام الطبيعي العاميّ لإيجاد الرد المناسب مهما تغيّرت الصياغة.
</p>

<p>
	تتعلمُ الشبكات العصبية الاصطناعية من خلال <strong>التعلم الموجّه</strong>. إذ لا بدّ للبشر في البداية من تحديد كيف يمكن أن يُقتطع الجواب من مقال أو بحث معين، لتتشكل لاحقًا قاعدة بيانات لا بأس بها تعتمد عليها خوارزميات التعلّم الخاصة بالشبكات العصبية، لذا عمدت شركة غوغل على توظيف فريق من اللغويين (الّذين يسمونهم Pygmalion) قوامه أكثر من 100 لغوي من جميع أنحاء العالم يتحدثون أكثر من 30 لغة مختلفة، ويحاول هذا الفريق تصنيف أجزاء معينة من الكلام بطريقة دقيقة ليساعدوا الخوارزميات على فهم كيف تعمل اللغات البشرية من أجل أن تتمكن هذه الخوارزميات في نهاية المطاف من استخراج الأجوبة بمفردها، وهذا تمامًا ما تصبو إليه شركة غوغل وهو أن تجعل هذه الخوارزميات تعمل بمفردها أي بطريقة <strong>"التعلّم غير الموجّه"</strong>.
</p>

<p>
	ولكن السؤال المشروع هنا ماذا لو أضيف هذه الميزة إلى جميع حقول البحث الموجودة ببعض المواقع الّتي نثق حقًا بجودة محتواها؟ بكل تأكيد ذلك سيعزز من محبة الناس لهذه المواقع وهذا بدوره سيُعزز شعبيتها وإجمالي إيراداتها في نهاية المطاف وهذا من أبرز التطبيقات لهذه الأنظمة.
</p>

<h2 id="sec2">
	إنجازات الذكاء الاصطناعي في مجال السفر والتجوال
</h2>

<h3 id="sec2-1">
	تصفح خريطة مترو أنفاق لندن
</h3>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="50571" data-ss1621157650="1" data-ss1621158006="1" href="https://academy.hsoub.com/uploads/monthly_2020_08/5f4ccb3a8e255_7-----.png.5d8e3aa908d9b54addecae1f990da298.png" rel=""><img alt="تصفح خريطة مترو أنفاق لندن باستخدام الذكاء الاصطناعي" class="ipsImage ipsImage_thumbnailed" data-fileid="50571" data-unique="data-unique" style="width: 900px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2020_08/5f4ccb3adc398_7-----.thumb.png.0ea56d7315eb2986753cbbacdfe4def3.png"></a>
</p>

<p>
	رأينا قدرة الذكاء الاصطناعي على تنفيذ مهام رائعة مثل التعرف على الصور والترجمة بين اللغات والتعرف على المشاعر ولكن ماذا عن قدرة الذكاء الاصطناعي في تمثيل العلاقات المعقدة بين البيانات أو المتغيرات والتي تتطلب قدرًا جيدًا من التفكير المنطقي مثل تعلّم كيفية التنقل عبر الخريطة في مترو أنفاق لندن، فهل يستطيع الذكاء الاصطناعي النجاح في هذه المهمة؟
</p>

<p>
	كشفت شركة ديب مايند (DeepMind) المملوكة لشركة ألفابت (الشركة الأم لمحرك البحث لغوغل) في <a data-ss1621157650="1" data-ss1621158006="1" href="http://dx.doi.org/10.1038/nature20101" rel="external nofollow">ورقة بحثية</a> نشرتها أنها استطاعت التغلب على هذه العقبة من خلال بناء شبكة عصبية اصطناعية ذات ذاكرة خارجية، مستفيدةً بذلك من قدرة الشبكات العصبية على التعلم وتخزين هذا العلم الممثل بحقائق في الذاكرة لاستخدامه لاحقًا لتشكيل استنتاجات مثل خوارزميات البرمجة التقليدية تمامًا، وبذلك ستتمكن من التنقل في مترو أنفاق لندن باستخدام خريطة النفق وبدون أيّ معرفة مسبقة بها وبدون معرفة طريقة حلّ الألغاز المنطقية أيضًا. في الحقيقة إن حلّ هذه المشاكل سيكون مثيرًا للإعجاب لخوارزمية نظام هجين قادر على تحقيق ذلك وبدون أي قواعد محددة مسبقًا.
</p>

<p>
	يمكن لهذا النظام فهم خريطة لم ترها من قبل. إذ تتدرب هذه الشبكة العصبية على هياكل شبيهة بالخريطة بصورة عشوائية (والّتي يمكن أن تمثل محطات متصلة بخطوط وما شابه ذلك)، وذلك من أجل تعلّم كيفية تخزين أوصاف هذه العلاقات في ذاكرة الشبكة الخارجية، ومحاولة الإجابة على الأسئلة المتعلقة بها وفي حال عرض خريطة جديدة على النظام سيتمكن النظام من كتابة هذه العلاقات الجديدة (الاتصالات بين مترو الأنفاق) في الذاكرة واستدعائها لتخطيط الطريق.
</p>

<p>
	وصرح أليكس جريفز -عالم الحاسب والمؤلف المشارك في الورقة البحثية- أنه على الرغم من أن هذه التقنية أثبتت نفسها في حلّ المشاكل الاصطناعية فقط، إلا أنه يمكننا تطبيقها في المهام الواقعية الّتي تنطوي على عمليات استدلال من كميات هائلة من البيانات. كما يمكن أن يحلُّ هذا النظام الأسئلة الّتي لم تحدد إجاباتها بطريقة واضحة في مجموعة البيانات.
</p>

<p>
	إن هذه التقدم سيمنح قرارات أذكى بطريقة تنقلنا وذلك لأن الحاسب يستطيع ربط الكثير من المعلومات مع بعضها بعضًا وسيعرف تمامًا كيفية التنقل في المدن مع الحفاظ على توفير وقود أكثر في السيارة وهذا سيشكل ميزة من ميزات السيارات ذاتية القيادة والعديد من التطبيقات الأخرى المشابهة.
</p>

<h3 id="sec2-2">
	قدرة الآلة على قيادة سيارة بالاستعانة بالذكاء الاصطناعي
</h3>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="50572" data-ss1621157650="1" data-ss1621158006="1" href="https://academy.hsoub.com/uploads/monthly_2020_08/5f4ccb3b47c3c_8----.png.17796c2072c21697a7e92749e4fc7878.png" rel=""><img alt="صورة لسيارة آلية تسير باستخدام الذكاء الاصطناعي" class="ipsImage ipsImage_thumbnailed" data-fileid="50572" data-unique="data-unique" style="width: 900px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2020_08/5f4ccb3b948ff_8----.thumb.png.f8395289ddac817038d34571175f6e0b.png"></a>
</p>

<p>
	كم مرةً سمعنا عن حوادث سيارات سببها الرئيسي نوم السائق؟ أو سرعته؟ أو إنشغاله بالهاتف؟ هل تعلم بأن 1.24 مليون شخص حول العالم <a data-ss1621157650="1" data-ss1621158006="1" href="https://carsurance.net/blog/car-accident-statistics/" rel="external nofollow">يموتون</a> سنويًا بسبب أخطاء السائقين؟ ما ذنب هذا المواطن المسكين ليموت بسبب رعونة سائق؟ هل فعلًا يتسبب جهل السائقين بطرق المدينة وشوارعها بحدوث الازدحامات المرورية؟ هل تستطيع الآلة أن تقلل من نسبة الانبعاثات الكربونية الّتي تسببها المنظومة الحالية للمرور (أي الاعتماد على البشر في قيادة السيارات)؟ هل تعتقد بأن المبلغ الّذي تدفعه للتأمين على سيارتك كبيرًا جدًا؟ هل ستخفف السيارات ذاتية القيادة من استخدام الوقود الأحفوري؟ هل تعتقد بأن جميع هذه المشاكل التي ذكرناها يمكننا التغلب عليها باستخدام السيارات ذاتية القيادة؟ إذا كان جوابك لا على جميع الأسئلة السابقة فاسمح لي أن أخالفك الرأي وأبشّرك بأن هذا النظام المروري الواعد، والّذي سيعتمد في مجمله على السيارات ذاتية القيادة سيغير رأيك بالكامل حول كلّ مشاكل النظام الحالي.
</p>

<p>
	إن التطور السريع الّذي حدث لأنظمة الرؤية الحاسوبية، وزيادة قوة المعالجات على معالجة المعلومات في الصور بسرعات كبيرة كان له أثر كبير على مجالات حياتية عديدة، فها نحن نلاحظ كيف ساعد هذا التطور المجال الطبي سواءً في تشخيص الأمراض أو حتى في علاجها. والتطور الهائل الذي حصل في عالم الروبوتات كان أحد مسبباته هذا التطور، لم يتوقف الأمر إلى هذا الحد فحسب بل تعدى ليفتتح مجالات وأسواق جديدة مثل أسواق السيارات ذاتية القيادة. تسارعت معظم شركات السيارات إلى الدخول في تطوير هذا النوع من السيارات، من أبرزهم منهم شركة جنرال موتورز وتويوتا وآبل وغوغل وإنتل وأودي وبي أم دبليو وتسلا وأوبر وفورد، وغيرها الكثير من الشركات.
</p>

<p>
	تعتمد السيارات ذاتية القيادة على العديد من التقنيات مثل: خوارزميات رسم الخرائط والبيانات الّتي تحصل عليها من أجهزة الاستشعار الموصولة بها وأنظمة الرؤية المجسمة ونظام تحديد المواقع ونظام اكتشاف الكائنات في الصور. إن معظم هذه التقنيات -إن لم يكن جميعها- تعتمد على الذكاء الاصطناعي وتحديدًا تعلم الآلة، ونظرًا لاختلاف السيناريوهات الّتي تتدرب عليها السيارات ذاتية القيادة بين العالم الافتراضي والعالم الحقيقي تظهر حاجتنا إلى نظام يستطيع اتخاذ قرار عقلاني في اللحظة المناسبة اعتمادًا على خبراته القديمة، وهنا يتدخل الذكاء الاصطناعي ليكون همزة الوصل بين العالمين وليدفع عجلة تطوّر السيارات ذاتية القيادة إلى الأمام.
</p>

<p>
	من أبرز المتضررين من السيارات ذاتية القيادة هي شركات التأمين فمع قلة الحوادث المرورية لن تظهر الحاجة لتأمين السيارة، كما إن عدد سائقي الحافلات وسيارات الأجرة سينخفض كثيرًا بسبب هذا التغيّر في النظام المروري، بلغت الاستثمارات في هذا المجال خلال السنوات القليلة الماضية 16 مليار دولار كانت وراءها أكثر من 30 شركة عالمية، وإلى الآن مازالت تتزايد الاستثمارات في هذه التقنية، على الرغم من عدم وجود أي عوائد مالية مباشرة لهذه الاستثمارات، إلا أن هذه الشركات متفائلة جدًا من المستقبل. ومن يدري قد يأتي يوم وتثق بالسيارة ذاتية القيادة أكثر من ثقتك بسائق الحافلة لتوصيل ابنتك إلى المدرسة!
</p>

<h3 id="sec2-3">
	تطيير طائرات الدرون باستخدام الذكاء الاصطناعي
</h3>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="50573" data-ss1621157650="1" data-ss1621158006="1" href="https://academy.hsoub.com/uploads/monthly_2020_08/5f4ccb3c06138_9------.png.e7a9ab815f96c7df878872b6a75b058d.png" rel=""><img alt="صورة لطائرة درون توصل الطلبيات باستخدام الاصطناعي" class="ipsImage ipsImage_thumbnailed" data-fileid="50573" data-unique="data-unique" style="width: 900px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2020_08/5f4ccb3c5a442_9------.thumb.png.878ad047d51016cccc05c6419c94c5e2.png"></a>
</p>

<p>
	لطالما عانت عمليات البناء والتنقيب من أخطار كثيرة وفي كثير من الأحيان شكلت عملية التحقق من سير المشروع بنجاح تحديًا كبيرًا وخطيرًا بنفس الوقت إذ إن البناء ليس مكتملًا بعد، واحتمالية أن يظهر عيب ما في المشروع كبير جدًا، وبالتأكيد لا نريد أن نخاطر بأرواح المشرفين أو العمال القائمين على المشروع، كما إن عمليات التنقيب تحتوى هي الأخرى على نفس الكم من المخاطرة الشديدة بأرواح العاملين، وفي كِلا الحالتين لن نستطيع المراهنة على حياة المشرفين أو العمال بكلّ تأكيد، ونظرًا لكون المشروع جديد فليس لدينا خريطة ثلاثية الأبعاد نستطيع من خلالها تطييّر الطائرات بدون طيار مثل طائرات الدرون وإن مهمة التحكم المباشر فيها أثناء طيرانها -أي بالزمن الحقيقي- يحتاج لأناس ماهرين جدًا عدا عن صعوبة المترافقة عند اكتشاف أماكن فيها الإضاءة ضعيفة ومعتمة ولو توفر كلّ المقومات فلن تخلو هذه المهمة من الأخطاء البشرية، فما الّذي يجب علينا فعله في هذه النوع من الحالات؟ وماذا أيضًا عن الكوارث الطبيعية مثل الزلازل أو الأعاصير هل سنستطيع تطييّر طائرات الدرون يدويًا ومعرفة أماكن وجود الناجين وإنقاذ أرواحهم بأقصى سرعة؟
</p>

<p>
	<a data-ss1621157650="1" data-ss1621158006="1" href="https://techcrunch.com/2017/02/21/exyn-unveils-ai-to-help-drones-fly-autonomously-even-indoors-or-off-the-grid/" rel="external nofollow">كشفت</a> شركة Exyn عن برنامج جديد يعتمد على الذكاء الاصطناعي يستطيع تطييّر طائرات الدرون بمفردها في المناطق المظلمة وذات الطبيعة غير المستقرة وفي الأمكان الخارجة عن ميزة التعقب الجغرافي (GPS)، أي الطيران بمجال مجهول وبدون أي خريطة مساعدة سامحة بذلك للطائرات بخلق وعي خاص بها يُمكنُها من اتخاذ قرارات في الزمن الحقيقي، وصرح المؤسس الشركة فيجاي كومار -عالم الروبوتات المخضرم وعميد كلية الهندسة في جامعة بن- إن الذكاء الاصطناعي المستخدم لتطيير الطائرات بمفردها أكثر تعقيدًا من الذكاء المستخدم في السيارات ذاتية القيادة أو الروبوتات الأرضية وذلك عائدٌ على قدرة الطائرات على الطيران في جميع المسارات بالابعاد الثلاثة المتاحة على عكس السيارات، كما أن الطائرات لا تستطيع حمل بطاريات كبيرة لذا يجب أن تُعالجُ المعلومات بسرعة قبل نفاذ البطاريات ومعرفة الاتجاه الصحيح الواجب سلكه وبالطبع يمكننا أيضًا المعالجة باستخدام المعالجة السحابية لتجنب استهلاك البطارية.
</p>

<p>
	تعتمد هذه التقنية على بناء خريطة ثلاثية الأبعاد من خلال المعلومات الواردة من مستشعراتها في الزمن الحقيقي، وكلّما اكتشفت كائنًا جديدًا سواء حاجز اسمنتي أو أي كائن آخر، تُحدث خريطتها بما يتوافق مع ذلك لتحقيق هدف تحليقها الأساسي. مستفيدةً بذلك من مجال الذكاء الاصطناعي وتعلم الآلة في عمليات اتخاذ القرارات المناسبة بالاعتماد على الخبرات السابقة وبدون أي تدخل بشري، ويحاول الروبوت الإجابة على ثلاث أسئلة جوهرية قبل بدئها بأي عملية ملاحة جوية وهي:
</p>

<ol>
	<li>
		أين أنا في هذه البيئة المحيطة؟
	</li>
	<li>
		أين الموقع الذي أحاول الذهاب إليه؟
	</li>
	<li>
		كيف سأصل إلى هناك على النحو الأمثل؟
	</li>
</ol>

<p>
	بعد محاولة الآلة الإجابة على هذه الأسئلة سيتضح لها الخطوة الأولى وتتعلم بعدها من المستشعرات والكاميرات لكي تستطيع اتخاذ القرار المناسب بما يتوافق مع سلوك الكائن الّذي أمامها. وتوفر هذه الشركة أيضًا البنية الهندسية لهذه التقنية لتستطيع تركيبها على نوع محدد من الطائرات لتجنب زيادة الحمل عليك بجعلك تدفع ثمن الطائرة أيضًا لذا فهي تصنف نفسها بأنها شركة برمجيات معتمدة على الذكاء الاصطناعي لتمكين الطائرات من الطيران بدون تدخل بشري.
</p>

<p>
	إن التطبيقات العملية لهذه التقنية مفيدة جدًا وفريدة من نوعها ولا بدّ بأنها ستجعل من العمليات الخطرة والصعبة أكثر أمانًا ودقة وموثوقية وستُضيف إنجازًا جديدًا يحققه الذكاء الاصطناعي. في الحقيقة وصلت إجمالي <a data-ss1621157650="1" data-ss1621158006="1" href="https://www.therobotreport.com/exyn-technologies-closes-16m-series-a-for-aerial-autonomy-software/" rel="external nofollow">الاستثمارات الحالية</a> في شركة Exyn إلى 16 مليون دولار وتحاول الشركة تعزيز وجودها أكثر بدخولها إلى إدخال هذا النوع الروبوتات في المخازن مما يفتح أفاقًا جديدة وفرص رائعة أمام هذه الشركة.
</p>

<h3 id="sec2-4">
	توقع ازدحام مواقف السيارات بحسب المنطقة
</h3>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="50574" data-ss1621157650="1" data-ss1621158006="1" href="https://academy.hsoub.com/uploads/monthly_2020_08/5f4ccb3cb796d_10------.png.b4f365b5f319be111e64f2a0230899e4.png" rel=""><img alt="صورة لموقف تتوقف فيه سيارة تقودها آلة" class="ipsImage ipsImage_thumbnailed" data-fileid="50574" data-unique="data-unique" style="width: 900px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2020_08/5f4ccb3d16a3a_10------.thumb.png.ad719c2860428d64d653f7067a75e44a.png"></a>
</p>

<p>
	بعد أن أمضيت الكثير من الوقت في تجهيز نفسك للاجتماع المرتقب، وبعد أن حضرت جميع الأوراق والمستندات اللازمة أصبحت على تمام الاستعداد للذهاب للاجتماع، فتركب سيارتك الخاصة وتذهب لموقع الاجتماع وعندما تصل وتحاول ركن سيارتك في أقرب موقفٍ للسيارات تجده ممتلئ تمامًا، تحاول البحث عن موقف آخر، ولكنك لا تجد أي موقفٍ قريبٍ فارغ، فتمضي أكثر من ساعة كاملة في محاولتك للبحث عن موقف مناسب، ولكن تفشل جميع محاولاتك. هل هذا السيناريو مألوف بالنسبة لك؟ إن كنت من سكان المملكة المتحدة -أو أحد المدن ذات التعداد السكاني الكبير- فحتمًا أنك تواجه هذا السيناريو يوميًا، فوفقًا لموقع التلغراف <a data-ss1621157650="1" data-ss1621158006="1" href="https://www.telegraph.co.uk/motoring/news/10082461/Motorists-spend-106-days-looking-for-parking-spots.html" rel="external nofollow">يمضي</a> السائق في المملكة المتحدة ما مجموعه 2549 ساعة في محاولة منه لإيجاد موقف للسيارة أي 106 يوم من الوقت الضائع! إنه حقًا وقت طويل لمهمة ركن السيارة. لاحظت شركة غوغل هذا الأمر وسارعت بإطلاق ميزة جديدة في تطبيق الخرائط خاصتها (Google Maps) تساعدنا على معرفة أماكن ازدحام مواقف السيارات في خطوة منها لمساعدتنا على التخطيط الأنسب لرحلاتنا.
</p>

<p>
	إن المنهجية التي تعتمد عليها هذه الميزة هي المساهمات الجماعية من قبل المستخدمين (Crowdsourced) وبعض خوارزميات تعلم الآلة البسيطة للمساعدة في تحديد صعوبة وجود موقف للسيارة. كما توفر هذه المنهجية دقةً أعلى من طريقة السابقة وهي من معلومات المتوفرة من عدد السيارات المتواجدة في المواقف والتي تكون متاحة على الإنترنت، لأنه غالبًا ما تقدم هذه الطريقة معلومات غير كاملة أو خاطئة بسبب المتنزهين غير القانونيين أو الأشخاص الّذين غادروا مبكرًا من أماكنهم. هذا النوع من المشاكل تجاوزتها المنهجية الجديدة الّتي اعتمدت عليها غوغل كما راقبت شركة غوغل حركة السيارات قبل عثورها على موقف فإذا دارت السيارات حول مواقع مواقف للسيارات فهذا يدل على أن المواقف مزدحمة، كما اعتمدت على موازنة الوقت المتوقع للوصول مع وقت توقف السيارة واستخدمت غوغل نموذج الانحدار اللوجستي (Logistic Regression) البسيط لتدريب الخوارزمية في إشارة -غير مباشرة- منها بأنه لا داعي لاستخدام الشبكات العصبية الاصطناعية في كلّ حالة وإنما يمكن للخوارزميات البسيطة أن تفي بالغرض في بعض المهام.
</p>

<p>
	لاحظت شركة غوغل بأن هذه الميزة أدت لزيادة كبيرة في النقرات على وضع النقل العام (transit travel) مما يشير إلى أن المستخدمين الذين لديهم معلومات إضافية حول صعوبة إيجاد موقف للسيارة كانوا أكثر ميلًا للتفكير في الذهاب بالمواصلات العامة بدلًا من الذهاب بسياراتهم الشخصية، وهذا بدوره يمكن أن يخفف مشكلة من مشاكل المرور ويساعد الناس في حفظ أوقاتهم المهدرة سدى.
</p>

<h2 id="sec3">
	إنجازات الذكاء الاصطناعي في المجال الطبي والخدمات الصحية
</h2>

<h3 id="sec3-1">
	تقنية جديدة تمكن البكم من الكلام
</h3>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="50575" data-ss1621157650="1" data-ss1621158006="1" href="https://academy.hsoub.com/uploads/monthly_2020_08/5f4ccb3d73a3d_11------.png.816369f2a06b654afa12448ea1060382.png" rel=""><img alt="صورة تشير إلى إمكانية تحدث الأبكم بالاستعانة بالذكاء الاصطناعي" class="ipsImage ipsImage_thumbnailed" data-fileid="50575" data-unique="data-unique" style="width: 900px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2020_08/5f4ccb3db8142_11------.thumb.png.41b385e266eb921e58c7f3b33ba3a991.png"></a>
</p>

<p>
	عانى المجال الطبي في زمن من الأزمان على كثير من المشاكل والتحديات، ودائمًا ما كانت القفزات النوعية في هذا المجال من أصعب القفزات لأنها تحتوي على مراهنة بأرواح بشرية وهذا ما يشكل عبءً مضاعفًا على كاهل الباحثين والمختصين، وعلى الرغم من التقدم الملحوظ الّذي شهده المجال في القرن التاسع عشر والعشرين إلا أنه كان للذكاء الاصطناعي دور مميز في تسريع عجلة تقدمه العلمي واختصار العديد من سنوات البحث والتجريب، لنستطلع الآن ما هي أبرز هذه الإنجازات الرائعة.
</p>

<p>
	في <a data-ss1621157650="1" data-ss1621158006="1" href="https://www.ucsf.edu/news/2019/04/414296/synthetic-speech-generated-brain-recordings" rel="external nofollow">دراسة</a> جديدة نشرتها جامعة كاليفورنيا-سان فرانسيسكو حول إمكانية إعطاء صوت للأشخاص الذين فقدوا قدرتهم على الكلام سواءً أكان سبب هذا الفقد إصابات في الدماغ أو بسبب الاضطرابات العصبية مثل: الصرع أو الزهايمر أو التصلب المتعدد أو باركنسون …إلخ.
</p>

<p>
	تعتمد هذه التقنية على استخدام الأقطاب الكهربائية والذكاء الاصطناعي لإنشاء جهاز يمكنه ترجمة إشارات الدماغ إلى كلام وبحسب الباحثين فقد يتمكن هؤلاء الأشخاص ليس من استعادة قدرتهم على الكلام فحسب وإنما سيتمكنون من نقل المشاعر المترافقة مع الكلام والتي تعكس شخصية المتحدث. عندما يحاول أي شخص الكلام يرسل الدماغ إشارات من القشرة الحركية إلى عضلات الفك والشفاه والحنجرة لتنسيق حركتها وإصدار الصوت المخصص لكلّ حرف من الحروف. ومن خلال <a data-ss1621157650="1" data-ss1621158006="1" href="https://youtu.be/kbX9FLJ6WKw" rel="external nofollow">قراءة البيانات</a> المولّدة من الأقطاب الموصولة بهذه المراكز يمكن للخوارزميات المعتمدة على تعلّم الآلة من فهم الارتباط بين الإشارات العصبية والكلام المنطوق بطريقة تمكنها من الاستفادة من الإشارات وتحويلها لكلام منطوق.
</p>

<p>
	على الرغم من ذلك لا تزال هذه التقنية غير دقيقة بما يكفي لاستخدامها واعتمادها خارج المختبرات، كما أنها بطيئة أيضًا إذ أقصى سرعة للتحدث يمكن بلوغها هي 10 كلمات في الدقيقة بينما سرعة التكلم الطبيعية تكون 150 كلمة في الدقيقة في أقل تقدير. إلا أن المستقبل واعدٌ حتمًا لهذه التقينات ويمكن جدًا أن تصبح مشاكل عديدة من بينها مشكلة فقدان القدرة على الكلام شيئًا من الماضي.
</p>

<h3 id="sec3-2">
	تزويد المكفوفين بأعين اصطناعية
</h3>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="50576" data-ss1621157650="1" data-ss1621158006="1" href="https://academy.hsoub.com/uploads/monthly_2020_08/5f4ccb3e391d3_12----.png.4789235ce0a2af538ff3bbe2db81b89a.png" rel=""><img alt="صورة لعين اصطناعية لتزويدها للمكفوفين" class="ipsImage ipsImage_thumbnailed" data-fileid="50576" data-unique="data-unique" style="width: 900px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2020_08/5f4ccb3e9884a_12----.thumb.png.6f3c6386509a3618127e835463b4b1da.png"></a>
</p>

<p>
	في آخر <a data-ss1621157650="1" data-ss1621158006="1" href="https://www.who.int/blindness/publications/globaldata/en/" rel="external nofollow">إحصائية</a> أجرتها منظمة الصحة العالمية أعلنت فيها أن أعداد المكفوفين تقدر بأكثر من 39 ميلون شخص حول العالم، ومن بين أبرز المشاكل الّتي يعاني منها المكفوفين هي الصعوبة الكبيرة في التنقل والحركة بدون مرافق، ولكن الأمور تغيرت كثيرًا مع تطور أنظمة الرؤية الحاسوبية والذكاء الاصطناعي وبفضل إمكانية دمج أنظمة اكتشاف الكائنات في الصور والكثير من التقنيات الأخرى التي مكنت فريق بحثي من جامعة ميغيل هيرنانديز (University of Miguel Hernandez) من تطوير آلية جديدة للرؤية عبر إرسال إشارات الرؤية البصرية مباشرة إلى القشرة البصرية الموجودة في الدماغ.
</p>

<p>
	تعتمد هذه الطريقة على تسجيل الكاميرات ما تشاهده أمامها ومن ثم ترسله إلى الحاسب فيترجم الحاسب هذه المعلومات المرئية إلى نبضات كهربائية بالاعتماد على مجموعة معقدة من خوارزميات الذكاء الاصطناعي وتعلم الآلة لتُرسل أخيرًا إلى الدماغ عن طريق كابل متصل بمنفذ مباشر إلى الجمجمة ليحفز بدوره الغرسة الموجودة في القشرة البصرية في الدماغ. على الرغم من التعقيدات الموجودة في هذا النظام إلا أنه يعدّ قفزة نوعية، وتبلغ دقة الصورة التي تستطيع هذه التقنية تغذية الدماغ بها هي 10×10 بكسل. إلا أن أحد الباحثين في هذا المشروع وهو فيرنانديز يتصور إمكانية زرع 6 غرسات في الدماغ على كلّ جوانبه وبذلك سترتفع الدقة إلى 60×60 بكسل. من الجدير بالذكر أيضًا أن هذه التقنية لا تسمح للأشخاص المولودين بدون حاسة البصر باستعادة بصرهم وإنما فقط تسمح للناس الّذين فقدوا بصرهم بسبب مرض ما أو بسبب حادث معين.
</p>

<p>
	بالتأكيد إن هذا الحل لن يعوض الكفيف بصره بالمعنى الحرفي للكلمة، ولكن يعدّ هذا الحل خطوة كبيرة في تعزيز استقلالية المكفوفين وتمكينهم من استعادة جزء كبير مفقود من حياتهم. ولذلك يجب علينا أن نبقى متفأئلين من هذه الإمكانيات الجديدة للتكنولوجيا وأن نجهز أنفسنا ليس لشراء هذه التقنيات الجديدة فقط وإنما لنكون جزءًا من ماصطناعيها ومطوريها أيضًا.
</p>

<h3 id="sec3-3">
	التعرف على اعتلال الشبكية السكري (سبب رئيسي للعمى) من صور الشبكية
</h3>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="50577" data-ss1621157650="1" data-ss1621158006="1" href="https://academy.hsoub.com/uploads/monthly_2020_08/5f4ccb3f0768b_13------(--)---.png.16cd9e7d7b0d28514af357ae018082c2.png" rel=""><img alt="صورة توضح كيفية الكشف عن الأمراض المزمنة باستخدام الذكاء الاصطناعي" class="ipsImage ipsImage_thumbnailed" data-fileid="50577" data-unique="data-unique" style="width: 900px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2020_08/5f4ccb3f6d4ef_13------(--)---.thumb.png.5389c552c58a222a8d1bcc5d9a254057.png"></a>
</p>

<p>
	تعرفنا في الفقرة الماضية على طريقة جيدة لتعويض المكفوفين عن نظام الرؤية الخاص بهم، ولكن ماذا لو استطعنا أن نسبق المرض بخطوة، وأن نكتشفه ونعالجه قبل أن يتطور ويتسبب بفقدان المريض بصره بالكامل؟ ولكن مهلًا هل حقًا نستطيع فعل ذلك؟ نعم نستطيع <strong>فقط</strong> إذا كان سبب العمى هو مضاعفات مرض السكري أو التنكس (الضمور) البقعي المرتبط بالتقدم في العمر. وهذا الأخير يصيب أكثر من 25% من الأشخاص الذين تزيد أعمارهم عن 60 عامًا في أوروبا وما يصل إلى 11 مليون شخص في الولايات المتحدة الأمريكية.
</p>

<p>
	إذ أعلنت شركة ديب مايند عن تطويرها نظامًا يعتمد على الذكاء الاصطناعي قادر على التنبؤ <a data-ss1621157650="1" data-ss1621158006="1" href="https://thenextweb.com/neural/2020/05/19/new-ai-from-deepmind-and-google-can-detect-a-common-cause-of-blindness/" rel="external nofollow">بالتنكس البقعي</a> و<a data-ss1621157650="1" data-ss1621158006="1" href="https://www.wired.com/2016/11/googles-ai-reads-retinas-prevent-blindness-diabetics/#:~:text=Demonstrating%20this%20promise%2C%20Google%20researchers,leading%20cause%20blindness%20among%20adults." rel="external nofollow">الاعتلال في شبكية العين</a> وذلك لأن كِلا المرضين يمكن تشخيصهما من خلال رؤية صور المسح ثلاثية الأبعاد الخاصة بالعين المريضة، وبما أن الذكاء الاصطناعي وتحديدًا تعلم الآلة ماهر جدًا في التعامل مع الصور بطريقة رائعة وسلسلة فإن أداؤه سيكون مقبولًا جدًا في هذا تشخيص مثل هذا النوع من الأمراض.
</p>

<p>
	في البداية يتدرب النموذج على العديد من الصور المشخصة بأن لديها هذه الأمراض ومن ثم يحاول أن يحدد بعض <strong>الميزات</strong> (features) الّتي ترتبط مع هذه الأمراض ومن ثم تُعرضُ صور جديدة لهذا النظام ليطبق عليها ما تعلمه من الصور السابقة ويستنتج فيما إذا كان المريض سيتعرض للتنكس البقعي خلال الأشهر الستة القادمة أم لا.
</p>

<p>
	وبهذا الانجاز تثبت شركة ألفابت أنها قادرة على تطوير أنظمة لا تكشف الفرق بين صور القطط والكلاب فحسب وإنما قادرة على تطويع مجال الذكاء الاصطناعي ليخدم مجال الطبي والرعاية الصحية في جميع تطبيقاته، ويأمل الباحثون في مجال الذكاء الاصطناعي في أن يساعد هذا التقدم العلمي على تسهيل العمليات الطبية وأتمتتها بأفضل طريقة للنهوض في مستوى الرعاية الصحية لأقصى حدّ ممكن في جميع دول العالم.
</p>

<h3 id="sec3-4">
	الكشف عن أمراض السرطان بالاستعانة بالذكاء الاصطناعي
</h3>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="50578" data-ss1621157650="1" data-ss1621158006="1" href="https://academy.hsoub.com/uploads/monthly_2020_08/5f4ccb3fcccfd_14----.png.f995f563d7b9a86a2c7a2314866ad1b1.png" rel=""><img alt="صورة لمخبر توضح كيفية كشف الآلة عن أمراض السرطان" class="ipsImage ipsImage_thumbnailed" data-fileid="50578" data-unique="data-unique" style="width: 900px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2020_08/5f4ccb4020051_14----.thumb.png.2e065652f56a3e406cebc05fdfc415b8.png"></a>
</p>

<p>
	يعدّ مرض السرطان من أكثر الأمراض فتكًا بين سائر الأمراض التي عانتها البشرية لأن انتشاره واسع ونسب الشفاء منه قليلة نسبيًا فبحسب إحصائية <a data-ss1621157650="1" data-ss1621158006="1" href="https://www.cancerresearchuk.org/health-professional/cancer-statistics/worldwide-cancer" rel="external nofollow">صدرت</a> من مجلة أبحاث السرطان في المملكة المتحدة جاء فيها أن في عام 2018 شخصت أكثر من 17 مليون حالة في جميع أنحاء العالم توفي منهم حوالي 9.6 مليون حالة، وكما أشارت الإحصائية إلى أنه بحلول عام 2040 سيُكون كلّ عام حوالي 27.5 مليون حالة سرطان جديدة. تكمن خطورة هذا المرض في صعوبة التعرف عليه أو تشخيصه في مراحله الأولى، فهو لا يُظهرُ على جسم المريض أي أعراض في بدايته، ولا يُكتشفُ غالبًا إلا عندما تظهر أعراضٌ متقدمة أي في مراحل تطور المرض الأخيرة، وبعد فوات الأوان. كما أن الأعراض الخاصة بمرض السرطان بمختلف أنواعه تتشابه مع أعراض كثير من الأمراض الأخرى مما يضفي حاجزًا آخر يحول بيننا وبين الاكتشاف المبكر للسرطان.
</p>

<p>
	إلا أن هذه الأمور تغيرت كثيرًا بعد التقدم التكنولوجي، إذ يمكن للحواسيب تحليل كميات كبيرة من البيانات وبفضل الذكاء الاصطناعي استطعنا أن نستنتج الارتباطات والأنماط الخفية في البيانات ونحللها ونصنفها وهذا الأمر من المستحيل أن يحققه البشر مثلما تحققه خوارزميات تعلّم الآلة. كما يمكن اكتشاف الأنماط الخفية في صور الأشعة السينية أيضًا والّتي يمكن أن تكون غير مرئية للبشر نظرًا من إمكانية العين المتواضعة على تمييز الفروقات الصغيرة والدقيقة في الصور الشعاعية، كما أن خوارزميات تعلم الآلة قادرة أيضًا على معالجة العديد من هذه الأنماط، والأهم من ذلك قدرتها على تقليل نسبة الخطأ الّتي يمكن أن تحدث بسبب البشر.
</p>

<p>
	تعتمد هذه الطريقة في التشخيص على <strong>الشبكات العصبية الاصطناعية</strong>، إذ في البداية نزود هذه الشبكات بالصور لأشخاص مصابين بالسرطان وتبدأ الخوارزميات بتحليل وتصنيف الصور واكتشاف وتحديد <strong>الميّزات</strong> (features) فيها لمعرفة ماهيّة الصور الّتي يكون أصحابها مصابين بالمرض، وبما أن لدينا سجلات طبية هائلة تحتوي على الحالات المصابة وبكامل معلوماتها وتفاصيلها ستستطيعُ خوارزميات التعلّم العميق من التعلّم بدقة أكبر واستنتاج أنماط أعم وأشمل.
</p>

<p>
	فعلى سبيل المثال <a data-ss1621157650="1" data-ss1621158006="1" href="https://blogs.nvidia.com/blog/2016/09/19/deep-learning-breast-cancer-diagnosis/" rel="external nofollow">أظهر</a> فريق من الباحثين من مركز بيث الطبي في كلية الطب بجامعة هارفارد أن تحليل البيانات من خلال خوارزميات التعلّم العميق يمكن أن تقلل من معدل الخطأ في تشخيص سرطان الثدي بنسبة 85٪. وعلق الدكتور بيك -أحد الباحثين على هذا البحث قائلًا:
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p data-gramm="false">
		كان هدفنا هو بناء نظام حسابي للمساعدة في تحديد مناطق انتشار السرطان في الغدد الليمفاوية، وكانت النتائج مذهلة لأنها نجحت في تشخيص السرطان بدقة 92٪، ومع مزيد من التحسينات في الخوارزمية، حقق الباحثون دقة 97٪ في النتائج
	</p>
</blockquote>

<p>
	وحتى أن هذه الخوارزميات تستطيع تشخيص مختلف أنواع السرطان مثل: سرطان الثدي وسرطان الرئة وسرطان الجلد وسرطان القولون والمستقيم وسرطان الجينوم وسرطان البروستات وسرطان الرأس والعنق وسرطان الغدة الدرقية. غير أنه لا يمكننا بالتأكيد الاستغناء عن إشراف الدكاترة المختصين على هذه الخوارزميات بل سيقتصر دورها على كونها مساعد شخصي للدكاترة ذكي ومفيد جدًا يحسن دقة عملية التشخيص ويسرعها.
</p>

<h3 id="sec3-5">
	تصنيع أدوية جديدة بالكامل بالاعتماد فقط على الذكاء الاصطناعي
</h3>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="50579" data-ss1621157650="1" data-ss1621158006="1" href="https://academy.hsoub.com/uploads/monthly_2020_08/5f4ccb406cd32_15---------.png.26389db7dc6803bdf0f2af8f768448b2.png" rel=""><img alt="صورة توضح عملية تصنيع أدوية جديدة بالكامل بالاعتماد فقط على الذكاء الاصطناعي" class="ipsImage ipsImage_thumbnailed" data-fileid="50579" data-unique="data-unique" style="width: 900px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2020_08/5f4ccb40b5dea_15---------.thumb.png.8b6ecb875ad17b573d4f8fa685a4530d.png"></a>
</p>

<p>
	يعدّ مجال صناعة وتطوير الأدوية الجديدة من المجالات الصعبة وذات التكاليف المرتفعة، إذ في <a data-ss1621157650="1" data-ss1621158006="1" href="https://jamanetwork.com/journals/jama/article-abstract/2762311" rel="external nofollow">دراسة</a> نشرت على موقع جامانيتورك (jamanetwork) في الشهر مارس من عام 2020 جاء فيه أن تكلفة إدخال دواء جديد إلى السوق يبلغ 985 مليون دولار كما أن متوسط زمن وصول هذا الدواء لأيدي الناس سيكون من 10 إلى 12 سنة، ويعود ارتفاع هذه التكليف إلى المراحل الإجبارية الّتي يجب أن يمر بها أي دواء حتى يصل إلى السوق، فمثلًا يجب أن يُختبر على جميع الحالات الخاصة مثل: كبار السن والأطفال والحوامل والمرضعات وعلى مختلف الأعراق البشرية لمعرفة التأثيرات الجانبية المحتملة، ولذلك تجد الكثير من التحذيرات والتعليمات في نشرة التوصيف الخاصة بكلّ دواء تتحدث عن كافة التأثيرات المحتملة على المريض. ولطالما حاولت شركات الدواء تخفيض هذه التكاليف ولكنها لم تحقق نجاحات كبيرة إلا عندما تدخل الذكاء الصنعي في الأمر.
</p>

<p>
	في الحقيقة سبق وأن ساعدت خوارزميات الحاسب عملية تطوير الدواء بصورة كبيرة إلا إن آخر الطرق الّتي توصل إليها الباحثين من جامعة فليندرز في جنوب أستراليا كانت ملفتة للنظر إذ استطاعوا <a data-ss1621157650="1" data-ss1621158006="1" href="https://www.businessinsider.com.au/australian-researchers-just-released-the-worlds-first-ai-developed-vaccine-and-it-could-prevent-another-horror-flu-season-2019-7" rel="external nofollow">بناء</a> دواء مناعي يعالج الانفلونزا باستخدام برنامج يعتمد على الذكاء الاصطناعي فقط أي لوحده وبدون أي تدخل بشري، ليكون بذلك أول مساعدة يقدمها لنا الذكاء الاصطناعي من هذا النوع.
</p>

<p>
	يعتمد هذا البرنامج على خوارزمية تدعى "خوارزمية البحث عن روابط" (Search Algorithm for Ligands) وتدعى اختصارًا SAM، إذ تبحث هذه الخوارزمية عن جميع المركبات التي يمكن تصورها في الكون للعثور على دواء جديد. وعلّق أحد الباحثين قائلًا:
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p data-gramm="false">
		كان علينا أن نعلّم برنامج الذكاء الاصطناعي على مجموعة من المركبات المعروفة بتنشيط جهاز المناعة البشري، ومجموعة من المركبات الّتي لا تعمل. وثمّ كانت مهمة الذكاء الاصطناعي هي العمل على تمييز ما يميز الدواء، ومن ثمّ طورنا برنامجًا آخر، يسمى "الكيميائي الاصطناعي" (Synthetic Chemist) والّذي ينتج تريليونات من المركبات الكيميائية المختلفة، بعد ذلك زودنا الخوارزمية SAM بهذه المركبات حتى تتمكن من فحصها للعثور على مركبات مرشحة تعتقد الآلة بأنها يمكن أن تكون عقاقير مناعية مناسبة للبشر.
	</p>
</blockquote>

<p>
	وعلق بتروفسكي وهو أحد الباحثين في هذا البحث على الأمر "إن قدرات هذا البرنامج ليست محصورة فقط في قدرته على تحديد العقاقير الجيدة فحسب، بل إنه في الحقيقة توصل إلى أدوية مناعية بشرية أفضل من الموجودة حاليًا". وأردف أيضًا "لذا أخذنا هذه العقاقير الّتي ابتكرها البرنامج بغية تجربتها على الحيوانات للتأكد من فعاليتها، وتحديدًا اللقاح المخصص لعلاج الإنفلونزا". وختم كلامه قائلًا: "إن هذا من شأنه أن يقصر عملية اكتشاف العقاقير وتطويرها على مدار عقود ويخفض تكلفة إنتاجها بمئات الملايين من الدولارات".
</p>

<h3 id="sec3-6">
	تتبع حالتك الصحية وأنت في المنزل بتقنيات الذكاء الاصطناعي
</h3>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="50580" data-ss1621157650="1" data-ss1621158006="1" href="https://academy.hsoub.com/uploads/monthly_2020_08/5f4ccb4126ec2_16------.png.aeb99de43a4745dc30ca116a6da87f9b.png" rel=""><img alt="صورة لتتبع الآلة لحالتك الصحية وأنت في المنزل" class="ipsImage ipsImage_thumbnailed" data-fileid="50580" data-unique="data-unique" style="width: 900px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2020_08/5f4ccb417edf5_16------.thumb.png.b73b3d3ea73728030a559962d9a767c1.png"></a>
</p>

<p>
	تحدثنا عن طرق كثيرة التي تساعد الأطباء في تشخيص بعض الأمراض، ولكن مشكلة هذه الطرق أنها متواجدة فقط عند الأطباء، وبالنظر إلى حقيقة أن أغلبية المرضى في جميع أرجاء العالم لا يذهبون للطبيب من أجل التشخيص عن حالتهم إلا بعد ظهور علامات مؤكدة عن المرض. كانت معظم محاولاتنا مهدورة ولفئة قليلة من المجتمع (غالبًا ما تكون من المتعلمين). ولكن ماذا لو تمكنّا من الكشف عن الأمراض مبكرًا إنها حقًا ستؤدي إلى فرصة أكبر وأفضل للشفاء، لأن ذلك سيقطع طريق انتشار المرض قبل أن يتمكن من التفشي بكامل الجسم.
</p>

<p>
	إذا ما الحلّ المقترح؟ هل سنستأجرُ غرفة في المشفى ونعيش بها لنضمن حصولنا على الإشراف الطبي المناسب؟ أم نستأجر طبيبًا ونحضره معنا إلى البيت ليشرف على حالتنا الصحية؟ في الواقع وبغض النظر عن حقيقة قلة عدد الأطباء حول العالم فإن هذه الفكرة مكلفة جدًا وغير عملية. إذا ما الحلّ؟ ما رأيك بأن نحضر طبيبًا صغيرًا جدًا بالتأكيد لا أقصد هنا أن يكون صغيرٌ بالعمر وإنما صغير بالحجم ليكون مثلًا بحجم الراوتر اللاسلكي تقريبًا ونضعه في البيت ليراقب حالتنا الصحية؟ هل برأيك أنه يوجد لدينا حقًا طبيب بهذه المواصفات؟ إذا كان جوابك لا فلا مشكلة أنا مثلك ظننت بأنه لا يوجد طبيب بهذه المواصفات ولكن تفاجأت حقًا عند قراءتي أن هنالك فعلًا طبيب بهذه المواصفات ولكن نسيت أن أخبرك بأنه ليس بشريًا وإنما آلة.
</p>

<p>
	تستطيع هذه الآلة تتبع جميع أنواع الإشارات الفيزيولوجية الخاصة بك أثناء حركتك من غرفة إلى غرفة أخرى مثل: التنفس، ومعدل نبضات القلب، والنوم وطريقة المشي والكثير من الأمور الأخرى الّتي تحدد حالتك الصحية بدقة. هل فعلًا استطاع الإنسان اختراع مثل هذه الآلة؟ نعم استطاع، إذ تزعم البروفيسورة دينا قتابي -وﻫﻲ ﺑﺮوﻓﻴﺴﻮرة ﻣﺨﺘﺼﺔ في ﻋﻠﻮم اﻟﻬﻨﺪﺳﺔ اﻟﻜﻬرﺑﺎﺋﻴﺔ واﻟﺤﺎﺳﻮﺑﻴﺔ في جامعة إم آي تي- أنها استطاعت بناء هذه الآلة في مختبرها، وكما تعتقد بأن هذا الاختراع قد يحل محلَّ مجموعة كبيرة ومكلفة من المعدات الطبية والتي نستخدمها في المستشفيات للحصول على البيانات السريرية حول الجسم البشري.
</p>

<p>
	تعتمد هذا الآلة على مراقبة تغيّر الحقل الكهرطيسي المحيط بنا كلّما تحركنا مهما كانت الحركة صغيرة (مثل التنفس)، إذ تبث هذه الآلة إشارة لاسلكية منخفضة الاستطاعة تغطِّي مساحة شقة بغرفة نوم أو اثنتين، وتستطيع هذه الأمواج الانتشار في البيت إذ تنعكس الإشارة عن أجسام الأشخاص الموجودين ضمن نطاقها، ومن ثم تستخدم هذه الآلة تقنيات تعلّم الآلة في تحليل الإشارات المنعكسة، واستخلاص البيانات الفيزيولوجية. وقد رُكِّبت الآلة حتى الآن -وفقاً لقتابي- في أكثر من 200 منزل، وذلك لأشخاص أصحاء وآخرين يعانون من بعض الأمراض (مثل باركنسون، وألزهايمر والاكتئاب، والأمراض الرئوية). كما شاركت قتابي في تأسيس شركة ناشئة أسمتها إيميرالد إينوفيشنز من أجل استثمار هذه التقنية تجاريًا، وقدمت الآلة إلى شركات الأدوية والتقانة الحيوية من أجل دراستها واختبارها.
</p>

<p>
	وحتى تثبت قتابي فائدة هذه الآلة، استعرضت البيانات الّتي جُمعت على مدى ثمانية أسابيع في منزل مريض مصاب بداء باركنسون، مشيرةً إلى أن مِشيته كانت تتحسن ما بين الساعة الخامسة والسادسة من كلّ صباح، بشكل يتواقت مع أخذه للدواء، وتقول: "هذا الجهاز لا يساعدك على فهم حياة المريض فحسب، بل يساعدك على فهم تأثير الدواء أيضًا"، وهو ما قد يمكِّن الأطباء من تحديد السبب وراء إفادة بعض الأدوية لبعض المرضى دونًا عن البعض الآخر.
</p>

<p>
	ويستعين كثيرٌ منا بالعديد من أجهزة الرصد الشخصي، سواءً ما يتعلق بمحتوى ما نتناوله من سعرات غذائية أو ما نخطوه من خطوات يومية، وبإمكان الذكاء الصنعي تأدية دور مهم في ترجمة تلك البيانات بطريقة تنعكس بالإيجاب على صحتنا. وتتجلى أهمية رصد التغيرات المبكرة مع ازدياد أعداد المسنين حول العالم، إذ <a data-ss1621157650="1" data-ss1621158006="1" href="https://www.un.org/ar/events/olderpersonsday/background.shtml" rel="external nofollow">تقول</a> الأمم المتحدة أن عدد المسنين الذين تتجاوز أعمارهم 60 سنة يبلغ 13% من عدد سكان العالم أي ما يقارب المليار نسمة. وتقول قتابي إن الكثير من المسنين باتوا يعيشون بمفردهم، وهم يعانون من أمراض مزمنة تشكل تهديدًا حقيقيًا على حياتهم، وتعتقد أن ابتكارها سيُمكن الأطباء من التدخل المبكر بالمريض تفاديًا لمحاولة إسعاف المرضى بشكل طارئ لاحقًا وجعله ينتظر في طوابير المشافي.
</p>

<h2 id="sec4">
	لا حدود لإمكانيات الذكاء الاصطناعي
</h2>

<p>
	لم يقتصر دور الذكاء الاصطناعي على المجالات التي ذكرناها فقط بل لا يوجد حاليًا مجال إلا وقد دخل فيه الذكاء الاصطناعي وأصبح جزءًا أساسيًا من أجزائه بدءًا من <strong>مجال الزراعة</strong>، وحتى <strong>مجال الأمن والحماية</strong> و<strong>مجال المال والأعمال والألعاب والبرمجة وغيرها من مختلف مجالات الحياة</strong>. هل كثرة الإنجازات جعلته يتوقف ويستريح؟ بالطبع لا، وإنما واصل أيضًا سلسلة اقتحاماته لتشمل أيضًا <strong>المجال الفني والإبداعي</strong> ليستطيع في البداية <a data-ss1621157650="1" data-ss1621158006="1" href="http://uk.businessinsider.com/the-science-how-vincent-van-gogh-saw-the-world-2015-9?r=US&amp;IR=T" rel="external nofollow">تقليد طريقة رسم الفنان فان جوخ</a> للوحاته تقليدًا احترافيًا، كما استطاع <a data-ss1621157650="1" data-ss1621158006="1" href="https://motherboard.vice.com/en_us/article/the-poem-that-passed-the-turing-test" rel="external nofollow">كتابة قصائد</a> اجتازت مرحلة الاختبارات المؤهلة للنشر، كما تمكن أيضًا من <a data-ss1621157650="1" data-ss1621158006="1" href="https://www.indiehackers.com/businesses/logojoy" rel="external nofollow">تصميم الشعارات (Logo)</a> بنفسه، واستطاع أيضًا <a data-ss1621157650="1" data-ss1621158006="1" href="http://www.ibtimes.co.uk/associated-press-expand-its-sports-coverage-by-using-ai-write-minor-league-baseball-articles-1568804" rel="external nofollow"> كتابة مقالات وتقارير رياضية</a> لوكالة أسوشيتد برس، واستطاع <a data-ss1621157650="1" data-ss1621158006="1" href="https://www.theguardian.com/technology/2016/jun/10/artificial-intelligence-screenplay-sunspring-silicon-valley-thomas-middleditch-ai" rel="external nofollow">كتابة سيناريو فيلم</a> سينمائي.
</p>

<p>
	إن جميع هذه الانجازات الرائعة الواعدة والّتي استطعنا تغطيتها فقط وهنالك العديد من الإنجازات الأخرى والتي اعتقدنا في زمن من الأزمان أنها ضرب من الخيال ما هي سوى البداية فحسب، وما سنكتشفهُ لاحقًا سيكون أكثر دهشة وأكثر فائدة في عديد من جوانب حياتنا، وبالتأكيد كلّ انجاز جديد يرافقه ظهور تهديدات جديدة، وهذا الأمر لا يمكننا إيقافه ولكن يمكننا حتمًا جعل التهديدات أخف وذلك بتطبيق كافة التعليمات الأمنية المُوصى بها، وهذه المسؤولية تقع على عاتق كلّ فرد منا سواء استطعنا الاستفادة من هذه القنيات أم لا.
</p>

<p>
	والآن هل ما زلت مترددًا في دخول مجال الذكاء الاصطناعي وتحديدًا تعلّم الآلة؟ في <a data-ss1621157650="1" data-ss1621158006="1" href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A-%D9%85%D8%B1%D8%A7%D8%AD%D9%84-%D8%A7%D9%84%D8%A8%D8%AF%D8%A1-%D9%88%D8%A7%D9%84%D8%AA%D8%B7%D9%88%D8%B1-%D9%88%D8%A7%D9%84%D8%A3%D8%B3%D8%B3-%D8%A7%D9%84%D8%AA%D9%8A-%D9%86%D8%B4%D8%A3-%D8%B9%D9%84%D9%8A%D9%87%D8%A7-r988/" rel="">المقال التالي</a> من <a data-ss1621157650="1" data-ss1621158006="1" href="https://academy.hsoub.com/tags/%D9%85%D8%AF%D8%AE%D9%84%20%D9%84%D9%84%D8%B0%D9%83%D8%A7%D8%A1%20%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A/" rel="">هذه السلسلة</a> ستتعرف على معلومات جديدة عن تاريخ هذا المجال والّتي ستساعدك في اتخاذ هذا القرار حتمًا.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A/" rel="">تعلم الذكاء الاصطناعي</a>
	</li>
	<li>
		النسخة الكاملة من كتاب <a data-ss1621157650="1" data-ss1621158006="1" href="https://academy.hsoub.com/files/17-%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A7%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A-%D9%88%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9/" rel="">مدخل إلى الذكاء الاصطناعي وتعلم الآلة</a>
	</li>
	<li>
		<a data-ss1621157650="1" data-ss1621158006="1" href="https://academy.hsoub.com/programming/python/%D8%A7%D9%84%D9%85%D8%B1%D8%AC%D8%B9-%D8%A7%D9%84%D8%B4%D8%A7%D9%85%D9%84-%D8%A5%D9%84%D9%89-%D8%AA%D8%B9%D9%84%D9%85-%D9%84%D8%BA%D8%A9-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-r735/" rel="">المرجع الشامل إلى تعلم لغة بايثون</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">975</guid><pubDate>Sun, 30 Aug 2020 13:00:00 +0000</pubDate></item></channel></rss>
