شرح الشبكات العصبية للتعلم العميق بلغة إنجليزية بسيطة

التعلم الآلي ، وخاصة التعلم العميق ، هما تقنيتان تعملان على تغيير العالم.

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

هذا يعني أنه يتم أخيرًا استخدام نماذج التعلم العميق لعمل تنبؤات فعالة تحل مشكلات العالم الحقيقي.

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

تاريخ التعلم العميق

تم وضع مفهوم التعلم العميق من قبل جيفري هينتون في الثمانينيات. يعتبر على نطاق واسع الأب المؤسس لمجال التعلم العميق. عمل هينتون في Google منذ مارس 2013 عندما تم الاستحواذ على شركته DNNresearch Inc.

كانت مساهمة هينتون الرئيسية في مجال التعلم العميق هي مقارنة تقنيات التعلم الآلي بالدماغ البشري.

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

الهيكل الذي أنشأه هينتون كان يسمى شبكة عصبية اصطناعية (أو شبكة عصبية اصطناعية باختصار). فيما يلي وصف موجز لكيفية عملها:

  • تتكون الشبكات العصبية الاصطناعية من طبقات من العقدة
  • تم تصميم كل عقدة لتتصرف بشكل مشابه للخلايا العصبية في الدماغ
  • الطبقة الأولى من الشبكة العصبية تسمى inputالطبقة ، تليها hiddenالطبقات ، ثم outputالطبقة في النهاية
  • تقوم كل عقدة في الشبكة العصبية بنوع من الحسابات ، والتي يتم تمريرها إلى العقد الأخرى الأعمق في الشبكة العصبية

فيما يلي تصور مبسط لتوضيح كيفية عمل ذلك:

تصور لشبكة عصبية اصطناعية

تمثل الشبكات العصبية خطوة هائلة إلى الأمام في مجال التعلم العميق.

ومع ذلك ، فقد استغرق التعلم الآلي (وخاصة التعلم العميق) عقودًا لاكتساب الأهمية

سوف نستكشف السبب في القسم التالي.

لماذا لم يعمل التعلم العميق على الفور

إذا كان التعلم العميق قد نشأ منذ عقود ، فلماذا بدأ للتو في اكتساب الزخم اليوم؟

ذلك لأن أي نموذج تعلم عميق ناضج يتطلب وفرة من مصدرين:

  • البيانات
  • القدرة الحاسوبية

في وقت الولادة المفاهيمية للتعلم العميق ، لم يكن لدى الباحثين إمكانية الوصول إلى ما يكفي من البيانات أو القدرة الحاسوبية لبناء وتدريب نماذج التعلم العميق ذات المغزى. لقد تغير هذا بمرور الوقت ، مما أدى إلى بروز التعلم العميق اليوم.

فهم الخلايا العصبية في التعلم العميق

الخلايا العصبية هي عنصر حاسم في أي نموذج التعلم العميق.

في الواقع ، يمكن للمرء أن يجادل بأنه لا يمكنك فهم التعلم العميق بشكل كامل بوجود معرفة عميقة بكيفية عمل الخلايا العصبية.

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

ما هي الخلايا العصبية في علم الأحياء؟

كانت الخلايا العصبية في التعلم العميق مستوحاة من الخلايا العصبية في دماغ الإنسان. فيما يلي رسم تخطيطي لتشريح الخلايا العصبية في الدماغ:

تشريح الخلايا العصبية في الدماغ

كما ترون ، الخلايا العصبية لها بنية مثيرة للاهتمام. تعمل مجموعات الخلايا العصبية معًا داخل الدماغ البشري لأداء الوظائف التي نحتاجها في حياتنا اليومية.

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

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

وذلك لأن الخلايا العصبية تعمل عن طريق استقبال وإرسال الإشارات. وبشكل أكثر تحديدًا ، dendritesتستقبل الخلايا العصبية إشارات وتمرر هذه الإشارات عبر axon.

ترتبط dendritesإحدى الخلايا axonالعصبية بخلايا عصبية أخرى. تسمى هذه الروابط synapses، وهو مفهوم تم تعميمه في مجال التعلم العميق.

ما هي الخلايا العصبية في التعلم العميق؟

الخلايا العصبية في نماذج التعلم العميق عبارة عن عقد تتدفق من خلالها البيانات والحسابات.

تعمل الخلايا العصبية مثل هذا:

  • يتلقون إشارة إدخال واحدة أو أكثر. يمكن أن تأتي إشارات الإدخال هذه إما من مجموعة البيانات الأولية أو من الخلايا العصبية الموجودة في طبقة سابقة من الشبكة العصبية.
  • يقومون ببعض العمليات الحسابية.
  • يرسلون بعض إشارات الإخراج إلى الخلايا العصبية الأعمق في الشبكة العصبية من خلال a synapse.

فيما يلي رسم تخطيطي لوظيفة الخلايا العصبية في شبكة عصبية للتعلم العميق:

وظيفة الخلية العصبية في نموذج التعلم العميق

دعنا نتصفح هذا الرسم البياني خطوة بخطوة.

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

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

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

وظيفة تنشيط الخلايا العصبية

تحسب وظيفة التنشيط قيمة الإخراج للخلايا العصبية. ثم يتم تمرير هذه القيمة الناتجة إلى الطبقة التالية من الشبكة العصبية من خلال مشبك آخر.

هذا بمثابة نظرة عامة واسعة على الخلايا العصبية للتعلم العميق. لا تقلق إذا كان هناك الكثير لتستوعبه - سنتعلم المزيد عن الخلايا العصبية في بقية هذا البرنامج التعليمي. في الوقت الحالي ، يكفي أن يكون لديك فهم عالي المستوى لكيفية تنظيمها في نموذج التعلم العميق.

وظائف تنشيط التعلم العميق

وظائف التنشيط هي مفهوم أساسي يجب فهمه في التعلم العميق.

هم ما يسمح للخلايا العصبية في الشبكة العصبية بالتواصل مع بعضها البعض من خلال نقاط الاشتباك العصبي الخاصة بهم.

في هذا القسم ، ستتعلم فهم أهمية وظائف التنشيط ووظائفها في التعلم العميق.

ما هي وظائف التنشيط في التعلم العميق؟

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

هناك أربعة أنواع رئيسية من وظائف التنشيط سنناقشها في هذا البرنامج التعليمي:

  • وظائف العتبة
  • وظائف السيني
  • وظائف المعدل ، أو ReLUs
  • وظائف الظل الزائدية

دعونا نعمل من خلال وظائف التنشيط هذه واحدة تلو الأخرى.

وظائف العتبة

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

من الناحية الرياضية ، إليك التعريف الرسمي لوظيفة عتبة التعلم العميق:

وظائف العتبة

كما توحي الصورة أعلاه ، تسمى أحيانًا وظيفة العتبة أ unit step function.

تشبه وظائف العتبة المتغيرات المنطقية في برمجة الكمبيوتر. قيمتها المحسوبة هي إما 1(مشابهة لـ True) أو 0(مكافئة لـ False).

الوظيفة السينية

تُعرف وظيفة السيني بين مجتمع علوم البيانات بسبب استخدامها في الانحدار اللوجستي ، وهي إحدى تقنيات التعلم الآلي الأساسية المستخدمة لحل مشاكل التصنيف.

يمكن أن تقبل الدالة السيني أي قيمة ، ولكنها تحسب دائمًا قيمة بين 0و 1.

هنا هو التعريف الرياضي للدالة السينية:

وظائف السيني

إحدى فوائد الدالة السينية على دالة العتبة هي أن منحنىها سلس. هذا يعني أنه من الممكن حساب المشتقات عند أي نقطة على طول المنحنى.

وظيفة المعدل

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

يتم تعريف وظيفة المعدل على النحو التالي:

  • إذا كانت قيمة الإدخال أقل من 0، فإن مخرجات الوظيفة0
  • إذا لم يكن الأمر كذلك ، تقوم الوظيفة بإخراج قيمة الإدخال الخاصة بها

هنا شرح هذا المفهوم رياضيا:

وظائف المعدل

غالبًا ما تسمى وظائف المعدل وظائف Rectified Linear Unitالتنشيط ، أو ReLUsباختصار.

دالة الظل الزائدية

وظيفة الظل الزائدية هي وظيفة التنشيط الوحيدة المضمنة في هذا البرنامج التعليمي والتي تعتمد على الهوية المثلثية.

التعريف الرياضي أدناه:

دالة الظل الزائدية

تتشابه وظيفة الظل الزائدية في مظهرها مع الدالة السينية ، ولكن يتم إزاحة جميع قيمها الناتجة إلى أسفل.

كيف تعمل الشبكات العصبية حقًا؟

حتى الآن في هذا البرنامج التعليمي ، ناقشنا اثنين من اللبنات الأساسية لبناء الشبكات العصبية:

  • الخلايا العصبية
  • وظائف التنشيط

ومع ذلك ، ربما لا تزال مرتبكًا بعض الشيء بشأن كيفية عمل الشبكات العصبية حقًا.

سيجمع هذا البرنامج التعليمي الأجزاء التي ناقشناها بالفعل حتى تتمكن من فهم كيفية عمل الشبكات العصبية في الممارسة العملية.

المثال الذي سنستخدمه في هذا البرنامج التعليمي

سيعمل هذا البرنامج التعليمي من خلال مثال من العالم الحقيقي خطوة بخطوة حتى تتمكن من فهم كيفية قيام الشبكات العصبية بعمل تنبؤات.

وبشكل أكثر تحديدًا ، سوف نتعامل مع تقييمات العقارات.

ربما كنت تعرف أن هناك طن من العوامل التي تؤثر أسعار المنازل، بما في ذلك الاقتصاد وأسعار الفائدة ورقمه غرف النوم / الحمامات، وموقعه.

الأبعاد العالية لمجموعة البيانات هذه تجعلها مرشحًا مثيرًا للاهتمام لبناء شبكة عصبية والتدريب عليها.

أحد التحذيرات حول هذا القسم هو أن الشبكة العصبية التي سنستخدمها لعمل تنبؤات قد تم تدريبها بالفعل . سنستكشف عملية تدريب شبكة عصبية جديدة في القسم التالي من هذا البرنامج التعليمي.

المعلمات في مجموعة البيانات الخاصة بنا

لنبدأ بمناقشة المعلمات في مجموعة البيانات الخاصة بنا. بشكل أكثر تحديدًا ، دعنا نتخيل أن مجموعة البيانات تحتوي على المعلمات التالية:

  • لقطات مربعة
  • غرف نوم
  • المسافة إلى مركز المدينة
  • عمر المنزل

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

الشكل الأساسي للشبكة العصبية

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

على سبيل المثال ، إذا كنت ترغب في عمل تنبؤات باستخدام نموذج مجموع مرجح بسيط (يسمى أيضًا الانحدار الخطي) ، فستأخذ شبكتك العصبية الشكل التالي:

شبكة عصبية أساسية

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

  • طبقة الإدخال
  • ربما بعض الطبقات المخفية
  • طبقة ناتجة

إنها الطبقة المخفية من الخلايا العصبية التي تجعل الشبكات العصبية قوية جدًا لحساب التنبؤات.

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

الغرض من الخلايا العصبية في الطبقة المخفية للشبكة العصبية

ربما كنت أتساءل - ماذا يفعل بالضبط كل الخلايا العصبية في طبقة مخفية يعني ؟ وبعبارة أخرى ، كيف ينبغي لممارسي التعلم الآلي تفسير هذه القيم؟

بشكل عام ، يتم تنشيط الخلايا العصبية في الطبقات الخفية للشبكة العصبية (بمعنى أن وظيفة التنشيط تعود 1) لقيمة إدخال تفي بخصائص فرعية معينة.

بالنسبة لنموذج توقع أسعار المساكن ، قد يكون أحد الأمثلة هو المنازل المكونة من 5 غرف نوم بمسافات قصيرة من وسط المدينة.

في معظم الحالات الأخرى ، ليس من السهل وصف الخصائص التي قد تتسبب في تنشيط خلية عصبية في طبقة مخفية.

كيف تحدد الخلايا العصبية قيم المدخلات الخاصة بهم

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

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

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

تصور عملية التنبؤ بالشبكة العصبية

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

ستساعد الصورة التالية في تصور هذا:

شبكة عصبية مكتملة

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

كيف يتم تدريب الشبكات العصبية

لقد تعلمت حتى الآن ما يلي عن الشبكات العصبية:

  • أنها تتكون من الخلايا العصبية
  • أن كل خلية عصبية تستخدم وظيفة تنشيط مطبقة على المجموع المرجح للمخرجات من الطبقة السابقة للشبكة العصبية
  • نظرة عامة واسعة بدون رمز حول كيفية قيام الشبكات العصبية بالتنبؤات

لم نقم بعد بتغطية جزء مهم جدًا من عملية هندسة الشبكات العصبية: كيف يتم تدريب الشبكات العصبية.

الآن سوف تتعلم كيف يتم تدريب الشبكات العصبية. سنناقش مجموعات البيانات والخوارزميات والمبادئ العامة المستخدمة في تدريب الشبكات العصبية الحديثة التي تحل مشاكل العالم الحقيقي.

Hard-Coding مقابل Soft-Coding

هناك طريقتان رئيسيتان يمكنك من خلالهما تطوير تطبيقات الكمبيوتر. قبل حفر في كيفية الشبكات العصبية مدربون، من المهم للتأكد من أن لديك فهم الفرق بين hard-codingو soft-codingبرامج الكمبيوتر.

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

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

مثال محدد مفيد هنا. في ما يلي حالتان لكيفية التعرف على القطط ضمن مجموعة بيانات باستخدام تقنيات التشفير الناعم والتشفير الثابت.

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

كما قد تتخيل ، فإن تدريب الشبكات العصبية يندرج ضمن فئة التشفير الناعم. ضع ذلك في الاعتبار أثناء تقدمك في هذه الدورة التدريبية.

تدريب شبكة عصبية باستخدام دالة التكلفة

يتم تدريب الشبكات العصبية باستخدام a cost function، وهي معادلة تستخدم لقياس الخطأ الوارد في تنبؤ الشبكة.

الصيغة الخاصة بدالة تكلفة التعلم العميق (التي يوجد منها الكثير - وهذا مثال واحد فقط ) أدناه:

معادلة دالة التكلفة

ملاحظة: تسمى وظيفة التكلفة هذه mean squared error، وهذا هو سبب وجود MSE على الجانب الأيسر من علامة التساوي.

في حين أن هناك الكثير من الرياضيات المعادلة في هذه المعادلة ، فمن الأفضل تلخيصها كما يلي:

Take the difference between the predicted output value of an observation and the actual output value of that observation. Square that difference and divide it by 2.

للتكرار ، لاحظ أن هذا مجرد مثال واحد على دالة التكلفة التي يمكن استخدامها في التعلم الآلي (على الرغم من أنها الاختيار الأكثر شيوعًا). يعد اختيار وظيفة التكلفة المراد استخدامها موضوعًا معقدًا ومثيرًا للاهتمام في حد ذاته ، وخارج نطاق هذا البرنامج التعليمي.

كما ذكرنا ، الهدف من الشبكة العصبية الاصطناعية هو تقليل قيمة دالة التكلفة. يتم تقليل دالة التكلفة إلى أدنى حد عندما تكون القيمة المتوقعة للخوارزمية أقرب ما يمكن من القيمة الفعلية. وبعبارة أخرى ، فإن الهدف من الشبكة العصبية هو تقليل الخطأ الذي ترتكبه في تنبؤاتها!

تعديل الشبكة العصبية

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

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

تسمى الآلية التي يتم من خلالها تعديل الأوزان لنقل الشبكة العصبية إلى أوزان أقل خطأ gradient descent. في الوقت الحالي ، يكفي أن تفهم أن عملية تدريب الشبكات العصبية تبدو كما يلي:

  • يتم تعيين أوزان أولية لقيم الإدخال لكل خلية عصبية
  • يتم حساب التوقعات باستخدام هذه القيم الأولية
  • يتم إدخال التنبؤات في دالة التكلفة لقياس خطأ الشبكة العصبية
  • تقوم خوارزمية النسب المتدرج بتغيير أوزان قيم مدخلات كل خلية عصبية
  • تستمر هذه العملية حتى تتوقف الأوزان عن التغير (أو حتى ينخفض ​​مقدار التغيير عند كل تكرار إلى ما دون حد معين)

قد يبدو هذا مجردًا جدًا - ولا بأس بذلك! عادة ما يتم فهم هذه المفاهيم تمامًا فقط عندما تبدأ في تدريب نماذج التعلم الآلي الأولى.

افكار اخيرة

في هذا البرنامج التعليمي ، تعرفت على كيفية إجراء الشبكات العصبية للحسابات لعمل تنبؤات مفيدة.

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

يمكنك نشر الكود من الكتاب الإلكتروني على GitHub أو محفظتك الشخصية لإظهاره لأصحاب العمل المحتملين. سيصدر الكتاب في 3 أغسطس - اطلبه مسبقًا بخصم 50٪ الآن!