مرحبًا ومرحبًا بكم في برنامج Python التعليمي هذا.
في هذا البرنامج التعليمي ، سنقوم بالخطوة الأولى في تنفيذ نموذج التعلم العميق.
لذلك نحن في الأساس على وشك تنفيذ العملية الكاملة لخوارزمية التعلم العميق.
ولذا سنستخدم ما أنشأناه من قبل.
هذه هي بنية الشبكة العصبية لإعادة تشغيل الذاكرة ، لدمجها في عملية التعلم العميق
بأكملها.
وستندرج خوارزمية التعلم العميق هذه في فئة واحدة.
لذا فهذه هي آخر فئة نضعها في تطبيق الذكاء الاصطناعي.
وستحتوي هذه الفئة فقط على وظائف مختلفة.
لذلك سيكون لدينا وظائف init التي ستنشئ وتهيئ جميع المتغيرات المرتبطة بأشياء التعلم العميق
المستقبلية والتي ستمثل نموذج التعلم العميق نفسه والذي سيكون له بعض الوظائف
الأخرى.
سيكون أحدهم بالطبع هو تحديد الإجراء الصحيح في كل مرة.
سيكون لدينا أيضًا وظيفة تحديث ، وظيفة تسجيل للحصول على النتيجة ولدينا فكرة عن كيفية سير
التعلم.
إذا كان الأمر يسير على ما يرام ، وإذا كان الاستكشاف يسير على ما يرام ، وإذا كان بإمكانه الانتقال إلى الاستغلال
، وبعد ذلك سيكون لدينا وظيفة حفظ لحفظ النموذج ، وهذا يعني حفظ دماغ السيارة ثم وظيفة التحميل في النهاية
.
لذلك لدينا وظيفتان يجب القيام بهما.
سنقوم بعمل وظيفة واحدة لكل برنامج تعليمي واليوم سنبدأ بوظيفة init كالمعتاد عندما
نقوم بعمل فصل دراسي.
لكن أولاً ، دعونا لا ننسى تقديم الفئة ، لذلك سنسميها D ، Q ، N لشبكة Q العميقة ، ثم بعض الأقواس
، والنقطتين ، وهناك نذهب مع وظيفتنا الأولى.
لنفعل هذا الشرط السفلية المزدوجة ، والشرط السفلية المزدوجة مرة أخرى والأقواس.
كما فهمت في هذه الوظيفة ، سنقدم المتغيرات المرتبطة بأشياءنا.
لذلك سيكون لدينا سطرين نبدأ كل شيء من تلقاء نفسه وسنقوم بشكل أساسي بإنشاء وتهيئة
جميع المتغيرات اللازمة لتنفيذ شبكة Q عميقة.
لذلك سنقوم ، على سبيل المثال ، بإنشاء كائن لشبكتنا لأننا بالطبع بحاجة إلى شبكتنا العصبية
العميقة ، ثم سنحتاج إلى ذاكرتنا.
سنقوم بإنشاء متغير آخر للذاكرة.
لذلك سيكون لدينا متغير آخر ذاتي تلك الذاكرة.
ولكن هذا ليس كل ما يتعين علينا إنشاؤه أيضًا.
بعض المتغيرات للحالة الأخيرة والقسم الأخير والمكافأة الأخيرة.
هذا بالطبع ، كما تعلمون ، المتغيرات التي تراها في خوارزمية التعلم العميق.
ثم ماذا بعد؟
حسنًا ، سنحتاج أيضًا إلى مُحسِّن ، كما تعلم ، لإجراء هبوط متدرج عشوائي لتحديث
الأوزان وفقًا لمقدار مساهمتها في الخطأ عندما يرتكب الذكاء الاصطناعي خطأً.
وبعد ذلك أعتقد أن هذه هي المتغيرات التي نحتاجها الآن لإنشاء تهيئة.
لكن في هذه الدالة init سنقوم بإدخال اثنين من المعطيات.
أولاً ، كالعادة الذاتية ، وهي الحجة التي تشير إلى موضوعنا.
ثم بما أنك تعلم ، سنقوم بإنشاء كائن من فئة الشبكة.
حسنًا ، نظرًا لأن فئة الشبكة تأخذ كوسيطة في وظيفة init والمدخلات والحجم والإجراء النهائي.
حسنًا ، هذا هو نفسه هنا.
عند إنشاء كائن من فئة الشبكة ، سنحتاج إلى اختيار وسيطة حجم الإدخال في وسيطة
إجراء NB.
لذلك يمكننا فقط نسخها.
و.
نواجههم هنا.
وها قد بدأنا.
لذلك ستصبح هذه الحجج الآن أيضًا بعض الحجج للطبقة المختلفة.
عندما نقوم بإنشاء بعض الكائنات المستقبلية للفصل الحالي ، فهذه بعض نماذج التعلم العميق المستقبلية
حيث سنحتاج إلى تحديد حجم الإدخال ، والذي أذكره هو عدد الأبعاد في المتجهات التي تقوم بترميز
حالاتك وحالات الإدخال الخاصة بك و عدد من الإجراءات ، وهو عدد الإجراءات الممكنة التي يمكن
للسيارة القيام بها.
لذلك أذكر هذه إما أن تذهب يسارًا أو مستقيمًا أو يمينًا.
حسنًا ، رائع.
ثم كما تعلم ، سننشئ كائنًا من فئة ذاكرة إعادة التشغيل لإنشاء كائن ذاكرة للحصول
على ذاكرتنا عن التحولات.
وفي دالة init ، لدينا حجة السعة ، ولكن نظرًا لأننا سنستخدمها مرة واحدة فقط ، في الواقع
عندما نقوم بإنشاء الذاكرة وليس في أي مكان بعد ذلك ، حسنًا ، لن نحتاج إلى تحديد حجة السعة.
يمكننا القيام بذلك ، لكننا سنقوم بإدخال عدد الانتقالات التي نريد أن تكون لذاكرتنا بشكل مباشر.
ولكن بعد ذلك نحتاج إلى حجة أقل ، وهي معلمة جاما في نموذج التعلم العميق.
تذكر أن معامل جاما هذا هو معامل التأخير.
هذا هو معامل المعادلة.
وبالتالي سنضعها هنا لأننا سنستخدمها بعد ذلك عدة مرات.
لذلك دعونا نضعها هنا.
سنسميها جاما.
لذلك هذا هو مجرد اسم الوسيطة وهناك نذهب إلى أن جميع الحجج ستحتاج لوظيفة init
هذه.
وهذا يعني أنه كلما أنشأنا نموذج التعلم العميق الخاص بنا ، يكون ذلك عندما نقوم بإنشاء كائن جديد
للفصل الحالي.
حسنًا ، سنحتاج إلى تحديد حجم الإدخال وعدد الإجراءات ومعامل جاما كوسائط ، وسنقوم بإدخال
القيم الحقيقية لهم قريبًا.
حسنا.
لننتقل الآن إلى داخل دالة init.
تمام.
إذن الآن سيكون هذا سهلاً بشكل أساسي.
نحن على وشك إنشاء تهيئة ، كل المتغيرات التي سنحتاجها.
ولذا فلنبدأ بالأول.
لنبدأ بجاما في الواقع معامل التأخير.
بما أن هذا متغير ، فنحن نريد أن نلحق بموضوعنا ، نبدأ بالذات.
لذا ستكون جاما متغيرًا من نموذجنا الحالي.
لذا فإن self that gamma تساوي الحجج التي سيتم إدخالها عند إنشاء كائن من الفصل.
إذن جاما وهناك نذهب مع الوسيطة الثانية.
لذا فإن الحجة الثانية ستكون نافذة المكافأة.
إذن ما هي نافذة المكافأة هذه؟
حسنًا ، ستكون هذه هي النافذة المنزلقة لمتوسط آخر 100 مكافأة ، والتي سنستخدمها
فقط لتقييم تطور أداء الذكاء الاصطناعي.
كما تعلم ، سيكون لدينا متوسط المكافأة في نافذة المكافأة هذه التي ستنزلق بمرور الوقت.
وما نريد ملاحظته هو زيادة متوسط المكافآت المائة الأخيرة بمرور الوقت.
لذلك دعونا نهيئها بمكافأة نقطة ذاتية ، نافذة تسطير أسفل السطر.
وبما أن هذه ستكون نافذة منزلقة للمتوسط المتطور لآخر 100 مكافأة ، حسنًا ، سنقوم
بتهيئتها كقائمة فارغة ومن ثم سنلحق متوسط المكافآت بمرور الوقت.
حسنًا ، إذن ، أكثر إثارة.
لنقم بإنشاء شبكتنا العصبية.
لذلك سنسميه نموذج النقطة الذاتية ، لأنه أساسًا هو قلب النموذج.
لذلك أنا أسميه النموذج.
ولن يكون هذا النموذج سوى كائن من فئة الشبكة.
ولإنشاء مثل هذا الكائن ، نأخذ شبكة الفصل الخاصة بنا ، ثم الأقواس ، وهنا نقوم فقط بإدخال
وسيطات فئة الشبكة.
لكننا نضع هذه الحجج في حجج الدالة init وبالتالي نحتاج
فقط إلى نسخها هنا ولصقها في فئة الشبكة.
وها نحن ذا.
باستخدام هذا السطر من التعليمات البرمجية ، نقوم بإنشاء شبكة عصبية واحدة لنموذج التعلم العميق الخاص بنا.
في احسن الاحوال.
ثم دعونا ننشئ ذاكرة.
لذا مرة أخرى ، سننشئ متغيرًا جديدًا نسميه ذاكرة النقطة الذاتية.
ومرة أخرى ، سيكون هذا كائنًا من فئة ذاكرة إعادة التشغيل.
لنأخذ اسم الفصل فقط ، فلننسخه ، فلنلصقه هنا.
وفي بعض الأقواس ، نحتاج إلى إدخال السعة لأن السعة هي وسيطة للدالة init وهي الحجة الوحيدة
التي نحتاج إلى إدخالها هنا.
إذن ما هي السعة التي سنختارها؟
تذكر أن هذا يتوافق مع عدد التحولات ، وعدد الأحداث ، والحالة الأقل ، والحالة الجديدة ، والعمل
الأقل ، والمكافأة الأقل.
وكما ذكرنا في أحد الدروس السابقة ، سنأخذ 100،000 ، 100،000 انتقال إلى الذاكرة ، وبعد ذلك سنأخذ عينات
من هذه الذاكرة للحصول على عدد صغير من الانتقالات العشوائية ، وهذا ما
سيتعلمه النموذج.
تمام.
حتى الآن لدينا ذاكرتنا.
في احسن الاحوال.
الآن دعنا نحصل على المحسن الخاص بنا.
لذا ، مرة أخرى ، بنفسي ، أنشأنا متغيرًا جديدًا نسميه المُحسِّن.
لذا فإن Optimizer هو متغير آخر لـ GQ المستقبلي ، وهو كائن ذاتي للغاية.
والآن إذا عدنا للأعلى ، يمكنك أن ترى أننا استوردنا الشعلة تلك Optim ، وهي وحدة من الشعلة تحتوي على جميع
الأدوات لأداء نزول التدرج العشوائي.
لذلك بالطبع يحتوي على بعض المحسّنين وأعطيناه الاختصار الأمثل ، وبالتالي فإن
ما سنفعله هنا هو أن نأخذ النموذج Optim الذي يشعل ذلك Optim ومن هذه الوحدة سنأخذ
أحد المحسّنين.
لذا كما ترون ، كلهم مدرجون هنا.
كثير منهم ممتازون.
على سبيل المثال ، يُعد دعم الأسلحة مُحسِّنًا ممتازًا.
هذا ، على سبيل المثال ، موصى به بشدة للشبكات العصبية العادية أو التعلم العميق غير الخاضع للإشراف.
لكن الشيء الآخر الممتاز والذي سنختاره هو مُحسِّن الذرة.
هذا هو الذي سترى أنه مع هذا سيحصل على سيارة جيدة ذاتية القيادة.
ولكن مرة أخرى ، فنحن نرحب بك تمامًا لتجربة الآخرين.
يمكنك تجربة دعامة الذراعين ، لكن بالنسبة لطرازنا ، سنختار الذرة.
لذلك أنا أضغط على مفتاح الإدخال ، وفي الواقع لاحظت أن هناك حرف A كبير هنا.
هذا لأننا نصنع كائنًا من فئة الذرة.
هذه فئة ، لكن الكائن سيكون مُحسِّنًا للذرة بحد ذاته.
ولكن نظرًا لأن هذه فئة ، نحتاج إلى إدخال بعض الحجج.
إن وسيطات فئة الذرة والوسيطات هي جميع المعلمات التي يمكنها تخصيص مُحسِّن
الذرة.
على سبيل المثال ، عادةً ما يكون هذا هو معدل التعلم أو الانحلال أو بعض المعلمات الأخرى.
وإلى جانب أخذ جميع معلمات نموذجنا ، سنحدد معدل التعلم.
عند الحديث عن معلمات نموذجنا ، يمكننا الحصول عليها باستخدام نموذج النقطة الذاتية.
هذا هو النموذج الذي أنشأناه هنا ، نموذج التعلم الذاتي من فصل شبكتنا.
هكذا نموذج علم النفس.
ثم لتقييم معلمات النموذج ، نضيف نقطة أخرى ثم معاملات مع بعض الأقواس بكل
بساطة.
هذا فقط لتوصيل مُحسِّن الذرة بشبكتنا العصبية ، تلك التي أنشأناها هنا.
وبعد ذلك ، كما ذكرنا للتو ، سنضيف معدل تعلم والحجة لذلك هي
l r وسنضعه مساويًا لقيمة بحيث لا يحدث التعلم بسرعة كبيرة.
إذا حصلنا على معدل تعليمي كبير جدًا ، فلن يتعلم الذكاء الاصطناعي بشكل صحيح.
نريد أن نمنح الذكاء الاصطناعي الخاص بنا بعض الوقت للاستكشاف والتعلم من أخطائه.
كما تعلم ، عندما نعاقبها ، عندما ترتكب بعض الأخطاء ، مثل الذهاب إلى بعض الرمال أو الاقتراب
جدًا من الحائط ، حسنًا ، نريد منح الذكاء الاصطناعي بعض الوقت للتعلم.
نريد انتظار تحديث الشبكة العصبية بشكل صحيح.
وبالتالي فإن القيمة الجيدة لمعدل التعلم الذي انتهيت به بعد تجربة العديد منها هي 0. 01.
حسنا.
وهذا كل ما نحتاجه لإنشاء مُحسِّن.
لذلك نحن في الأساس نقوم بإنشاء كائن من فئة الذرة.
رائعة.
وبعد ذلك ، فإن المتغيرات الثلاثة الأخيرة التي نحتاجها هي المتغيرات التي تتكون منها أحداث الانتقال الخاصة بنا.
هذه هي الحالة الأخيرة ، القسم الأخير ، والمكافأة الأخيرة.
وهذا هو أساسًا ما سننشئه الآن وسنحتاج فقط إلى تهيئته.
فلنبدأ بالتاريخ الأخير.
التاريخ الأخير الذي سنطلق عليه اسم النقطة الذاتية ، وآخر حالة تسطير أسفل السطر ، ثم كيف سنقوم بتهيئته؟
حسنًا ، تذكر أن الحالة الأخيرة هي متجه من خمسة أبعاد ، متجه يقوم بترميز حالة واحدة
من البيئة.
وللتذكير ، هذه الأبعاد الخمسة هي الإشارات الثلاث للحساسات الثلاثة لليسار
والمستقيم واليمين والتوجيه والتوجيه الناقص.
إذن هذا متجه بالمعنى البديهي ، لكن بالنسبة لـ PyTorch يجب أن يكون أكثر من ناقل.
في الواقع يحتاج إلى أن يكون موترًا للشعلة.
ولكن ليس فقط يجب أن يكون موترًا للشعلة ، ولكن أيضًا يحتاج إلى بُعد آخر أحب أن أطلق
عليه بُعدًا مزيفًا يتوافق مع الدُفعة.
وذلك لأن الحالة الأخيرة ستكون مدخلات الشبكة العصبية.
ولكن عند العمل مع الشبكات العصبية بشكل عام ، سواء كان ذلك مع TensorFlow أو PyTorch ، حسنًا
، لا يمكن أن تكون متجهات الإدخال متجهًا بسيطًا في حد ذاته.
يجب أن تكون دفعة واحدة.
يمكن للشبكة فقط قبول مجموعة من ملاحظات الإدخال ، وبالتالي لن نقوم فقط بإنشاء موتر لمتجهات
حالة الإدخال ، ولكن أيضًا سننشئ هذا البعد المزيف المقابل للدُفعة.
لنفعل هذا ولنبدأ بتهيئة موتر الشعلة.
للقيام بذلك ، لا يوجد شيء أكثر بساطة.
نأخذ مكتبة torch الخاصة بنا ، ثم dot ، ثم سنستخدم فئة tensor لأنه كما قد تكون خمنت ، سيخلق
هذا كائنًا جديدًا من فئة tensor وهو كائن موتر.
وفي فئة الموتر هذه.
نحتاج إلى إدخال وسيطة واحدة تحدد حجم الموتر الخاص بك.
يمكنك تصوير موتر مثل مصفوفة لها نوع واحد.
لكن ما سيمثله هذا الآن هو بالطبع حالة الإدخال هذه ، والتي يمكنك رؤيتها كمتجه.
وبالتالي لتحديد عدد العناصر التي يجب أن يحتوي عليها هذا الموتر.
حسنًا ، نحتاج بالطبع إلى استخدام حجم الإدخال ، لأن حجم الإدخال هو بالضبط
عدد أبعاد متجهات حالة الإدخال.
الآن يجب أن أقول أجهزة الاستشعار.
وبالتالي ما نحتاجه ببساطة لإدخاله في فئة الموتر لدينا لإنشاء كائن موتر.
حسنًا ، هذا هو حجم الإدخال.
وبعد ذلك ، سيكون حجم الإدخال مساويًا لخمسة.
حسنًا ، هذا جيد.
هذا هو أول شيء يتم فعله.
لقد قمنا للتو بتهيئة الموتر ، كما ينبغي أن يكون.
لكن بعد ذلك ، تذكر ، علينا أن نفعل شيئًا آخر.
نحن بحاجة إلى إنشاء هذا البعد الزائف ، لأن هذا هو ما تتوقعه الشبكة لمدخلاتها
ولإنشاء هذا البعد التين ، والذي ، بالمناسبة ، يجب أن يكون البعد الأول.
كما تعلم ، سيكون البعد الزائف المقابل للدفعة هو البعد الأول لهذا المتغير الأخير.
حسنًا ، للقيام بذلك ، نحتاج ببساطة إلى إضافة نقطة ثم الضغط.
ثم في بعض الأقواس ، نحتاج إلى إدخال مؤشر هذا البعد الغامض.
وكما قلت للتو ، يجب أن يكون هذا البعد الزائف هو البعد الأول للدولة.
ونظرًا لأن الفهارس في بايثون تبدأ من الصفر ، فنحن بحاجة إلى إدخال الصفر حتى يصبح هذا البعد الجديد هو
البعد الأول.
لذلك لدينا البعد الأول المقابل للدفعة ثم البعد المقابل للموتر ، والذي سيحتوي
على العناصر الخمسة لحالات الإدخال الخاصة بك.
هناك ثلاث إشارات اتجاه واتجاه ناقص.
ثم نبدأ ، قمنا بتهيئة حالات الإدخال بشكل كامل بشكل صحيح.
ثم متغيرين للذهاب.
وسيكون ذلك أسهل بكثير لأن المتغير التالي هو الإجراء الأخير.
هذا متغير جديد كنا ننشئه لعمل الكائن الأخير.
وتذكر ، في الدرس الأول من هذا القسم ، أخبرتك أن الإجراءات ستكون إما صفرًا
واحدًا أو اثنين ، ثم باستخدام متجه الدوران الثاني ، سنقوم بتحويل فهارس هذه
الإجراءات إلى زوايا الدوران ، التي أذكرها بصفر 20 أو -20.
يمكننا بالفعل تحديث ذاكرتنا بذلك.
حسنًا ، إنه هنا بالضبط.
العمل من خلال التناوب.
إذا كان الإجراء صفرًا ، فسيكون هذا مطابقًا للفهرس الأول هنا.
إذن ، صفر ، إذا كان الإجراء واحدًا ، فسيكون هذا متوافقًا مع الفهرس ، أحد هذا المتجه.
إذن 20 درجة.
وإذا كان الإجراء اثنين ، فسنحصل على -20 درجة.
ستكون هذه هي زاوية دوران سيارتنا عندما نلعب الحركة.
حسنا.
وبالتالي ، نظرًا لأن الإجراء سيكون إما صفرًا واحدًا أو اثنين ، حسنًا ، فإن الإجراء سيكون
رقمًا بسيطًا.
وببساطة شديدة ، يمكننا تهيئته إلى الصفر.
لا نحتاج إلى إنشاء أي موتر هنا أو أي شيء آخر.
نحتاج فقط إلى تهيئته بصفر.
وأخيرًا ، حسنًا ، هذه هي المكافأة الأخيرة.
حتى نقطة المكافأة الأخيرة.
هناك نذهب.
ومرة أخرى ، المكافأة هي رقم عائم ، وأذكر أنه يقع بين ناقص واحد و زائد واحد.
هذا هو الرقم مرة أخرى.
وفيما يتعلق بالإجراء ، سنقوم بتهيئته إلى الصفر وها نحن ذا.
مبروك وظيفة الحرف الأول جاهزة.
لذلك نحن الآن على استعداد للانتقال إلى الأشياء المثيرة.
والواقع أن أهم شيء بالنسبة لي هو تحديد الإجراء الذي يجب أن ألعبه في كل مرة وفي كل مرة.
T وهذا هو بالضبط ما سنفعله في البرنامج التعليمي التالي عن طريق إنشاء Select Action Method.
لذلك دعونا نفعل هذا في البرنامج التعليمي التالي.
وحتى ذلك الحين ، استمتع بـ i.