WEBVTT

00:00.150 --> 00:02.490
مرحبًا ومرحبًا بكم في برنامج Python التعليمي هذا.

00:02.610 --> 00:08.160
حسنًا ، سنقوم اليوم بوظيفة التحديث ، والتي ستعمل على تحديث كل شيء

00:08.160 --> 00:12.210
هناك للتحديث بمجرد وصول العين إلى حالة جديدة.

00:12.210 --> 00:15.940
لذلك عندما تصل إلى الحالة الجديدة ، كما تعلم ، نحتاج إلى تحديث الإجراء.

00:15.960 --> 00:21.780
يصبح الإجراء الأخير هو الإجراء الجديد الذي تم عرضه ، ولكنه أيضًا الحالة الأخيرة التي تصبح الحالة

00:21.780 --> 00:22.470
الجديدة.

00:22.470 --> 00:24.030
وأخيرًا ، المكافأة الأخيرة.

00:24.030 --> 00:27.180
تصبح هذه هي المكافأة الجديدة التي نحصل عليها عندما نلعب الإجراء.

00:27.180 --> 00:33.060
هذا هو المسار المنطقي الذي يحدث مباشرة بعد تحديد الإجراء ، نحتاج إلى تحديث

00:33.060 --> 00:37.230
جميع عناصر التحولات وبالطبع سنحصل على انتقال جديد.

00:37.230 --> 00:40.080
لذا سيتعين علينا إلحاق هذا الانتقال الجديد بالذاكرة.

00:40.080 --> 00:45.750
وأخيرًا ، سنقوم أيضًا بتحديث نافذة المكافآت الخاصة بنا ، كما تعلمون ، لمراقبة

00:45.750 --> 00:49.380
تطور كيفية سير التدريب وكيف يسير الاستكشاف.

00:49.380 --> 00:55.380
ولكن الشيء الأكثر أهمية بالنسبة لك هو أنه يمكننا أخيرًا إجراء اتصال بين الذكاء

00:55.380 --> 01:01.620
الاصطناعي الذي نطبقه الآن على خريطتنا ، لأننا إذا عدنا إلى خريطتنا ، تذكر أن هناك

01:01.620 --> 01:06.090
وظيفة التحديث الكبيرة هذه في اللعبة صف دراسي.

01:06.090 --> 01:11.460
هذا هو المكان الذي نصنع فيه اللعبة مع السيارة ونحدد كيف يجب معاقبة السيارة

01:11.460 --> 01:12.930
عندما ترتكب خطأ.

01:12.930 --> 01:19.230
لكن في فئة اللعبة هذه ، نلاحظ وظيفة التحديث هذه وفي وظيفة التحديث هذه ، نلاحظ

01:19.260 --> 01:24.600
أن هذا الخط يساوي تحديث نقطة الدماغ ، ومكافأة أقل ، وإشارة أقل.

01:24.600 --> 01:28.200
وفي الواقع هذا هو بالضبط ما كنا على وشك القيام به.

01:28.200 --> 01:36.030
نحن على وشك إجراء وظيفة التحديث هذه التي ستأخذ المكافأة الأخيرة والإشارة الأخيرة للحصول على الإجراء

01:36.030 --> 01:37.590
التالي للعب.

01:37.590 --> 01:44.340
لذلك لن نقوم فقط بتحديث جميع العناصر المختلفة للانتقال ، ولكن في الغالب سنلعب الإجراء الذي يجب

01:44.340 --> 01:48.990
أن نلعبه عند الحصول على المكافأة الأخيرة والإشارة الأخيرة.

01:49.140 --> 01:56.400
وبالتالي ، بالطبع ، في وظيفة التحديث هذه ، سنستخدم وظيفة إجراء التحديد التي قمنا بتنفيذها للتو

01:56.400 --> 01:56.970
من قبل.

01:56.970 --> 02:03.300
سنقوم بدمج وظيفة Select Action في وظيفة التحديث المستقبلي التي نحن بصدد القيام بها لتحديد

02:03.300 --> 02:07.650
الإجراء الصحيح للعب بالإضافة إلى إجراء جميع التحديثات.

02:07.650 --> 02:10.350
لذلك من المهم حقًا إجراء هذا الارتباط بالخريطة.

02:10.350 --> 02:17.880
في الوقت الحالي ، ما نحن بصدد تحقيقه هو في النهاية الصلة بين الذكاء الاصطناعي الخاص بنا واللعبة ، اللعبة التي

02:17.880 --> 02:19.470
نصنعها في هذا الفصل.

02:19.470 --> 02:26.400
وما يمكننا فعله الآن هو أن نأخذ هذا التحديث مباشرةً في آخر مرة كنا آخر إشارة لأن هذه هي بالضبط الوظيفة

02:26.400 --> 02:30.300
التي سنقوم بها باستخدام هاتين الوسيطتين هنا.

02:30.450 --> 02:34.320
وكتذكير سريع ، الدماغ هو هدف أعيننا.

02:34.320 --> 02:37.950
وهذا هو موضوع الفصل.

02:38.280 --> 02:45.480
إذن ما سنفعله الآن هو أننا سنقوم بنسخ هذا التحديث ، مكافأة أقل ، إشارة أقل ، وستكون هذه هي

02:45.480 --> 02:50.220
وظيفتنا التالية التي نقوم بها ، وبالتالي سألصقها هنا.

02:50.250 --> 02:56.010
ثم لمجرد توخي الحذر ، أود فقط أن أقدم بعض الأسماء المختلفة عن الأسماء التي لدينا هنا.

02:56.010 --> 02:57.390
كما تعلم ، لدينا مكافأة أقل هنا.

02:57.390 --> 03:00.660
وأنا لا أريد الخلط بين هذه المكافأة الأخيرة مع هذه.

03:00.660 --> 03:01.950
يمكن أن يكون ذلك خطيرًا.

03:01.950 --> 03:06.090
لذلك سأستبدل الكلمة الأخيرة هنا بالمكافأة.

03:06.090 --> 03:08.850
وبالمناسبة ، نفس الشيء مع إشارة أقل.

03:08.850 --> 03:15.930
دعنا فقط نضع إشارة أو حتى إشارة جديدة لتحديد أننا نريد إجراء التحديث عند الوصول إلى حالة جديدة

03:15.930 --> 03:18.690
وبالتالي الحصول على إشارة جديدة.

03:18.690 --> 03:26.480
ولكن بعد ذلك ، بالطبع ، هذه المكافأة هنا ستكون آخر مكافأة نحصل عليها هنا ، كما تعلم ، عندما نذهب إلى بعض الرمال

03:26.490 --> 03:31.320
أو ما هو أسوأ ، عندما نقترب كثيرًا من حافة واحدة من الخريطة.

03:31.320 --> 03:33.960
هذا هو المكان الذي نحدد فيه المكافأة الأخيرة.

03:33.960 --> 03:37.290
ستكون هذه المكافأة الأخيرة هي مدخلات وظيفة التحديث.

03:37.290 --> 03:39.330
لهذا السبب لدينا مكافأة أقل هنا.

03:39.330 --> 03:45.810
لكن هنا أعطي فقط اسمًا آخر لمكافأة الحجة حتى لا تخلط بينها.

03:45.810 --> 03:46.920
آخر كلمة هنا.

03:47.460 --> 03:47.850
حسنا.

03:47.850 --> 03:50.040
إذن هذه هي وظيفة التحديث.

03:50.040 --> 03:53.880
والآن دعنا نذهب بداخله ونفعل هذين الأمرين.

03:53.880 --> 03:58.770
هذا هو تحديث جميع عناصر انتقالنا وبالطبع حدد الإجراء.

03:59.130 --> 03:59.420
تمام.

03:59.490 --> 04:01.530
إذن ما الذي نحتاجه للتحديث أولاً؟

04:01.740 --> 04:06.600
حسنًا ، كما فهمت ، نريد إجراء التحديث عند الوصول إلى حالة جديدة.

04:06.600 --> 04:10.590
لذا فإن أول شيء سنقوم بتحديثه هو بوضوح هذه الحالة الجديدة.

04:10.590 --> 04:12.390
هذه هي الحالة الجديدة التي نصل إليها.

04:12.540 --> 04:17.160
لذلك سأسمي هذه الحالة الجديدة ، الدولة الجديدة ثم متساوية.

04:17.160 --> 04:19.770
فكيف نحصل على هذه الدولة الجديدة؟

04:19.800 --> 04:25.350
حسنًا ، بالطبع ، هذا يعتمد على الإشارة ، الإشارة الجديدة التي اكتشفتها المستشعرات للتو.

04:25.620 --> 04:32.700
وللتذكير ، فإن الحالة هي الإشارة نفسها المكونة من الإشارات الثلاث لأجهزة الاستشعار ، والإشارة الأولى ، والإشارة

04:32.700 --> 04:37.260
الثانية والإشارات الثلاثة ، بالإضافة إلى الاتجاه والتوجيه الناقص.

04:37.260 --> 04:38.400
هذه دولتنا.

04:38.400 --> 04:42.420
لذا تأكد من فهم أن الإشارة هي الحالة.

04:42.420 --> 04:45.990
لكنها الآن قائمة بسيطة من خمسة عناصر.

04:45.990 --> 04:51.060
وبما أن هذا سيكون مدخلات الشبكة العصبية ، تذكر أنه يتعين علينا تحويله

04:51.060 --> 04:52.170
إلى موتر شعلة.

04:52.200 --> 04:54.630
لذلك هذا بالضبط ما سنفعله الآن.

04:54.660 --> 04:59.640
سنأخذ مكتبة الشعلة الخاصة بنا ثم نأخذها.

04:59.930 --> 05:01.410
فئة Tensor.

05:01.430 --> 05:02.330
هناك نذهب.

05:02.330 --> 05:08.660
والذي سيحول إشارتنا الجديدة إلى موتر شعلة.

05:08.990 --> 05:13.970
ثم من الأفضل التأكد من أن جميع عناصر موتر الشعلة تطفو.

05:13.970 --> 05:21.350
لذلك سأقوم بتحويل نوع لتحويلهم إلى تعويم مثل هذا ثم أخيرًا أحاول الحصول على رد الفعل

05:21.350 --> 05:24.260
لما نحتاج إلى القيام به بعد ذلك.

05:24.260 --> 05:29.000
إنه ، بالطبع ، لإنشاء هذا البعد المزيف ، لإضافة بُعد يتوافق مع الدُفعة.

05:29.000 --> 05:36.650
ونقوم بذلك ، بالطبع ، باستخدام وظيفة الضغط التي يتعين علينا إدخال مؤشر هذا البعد الوهمي

05:36.710 --> 05:40.040
الذي نريده للدفعة ، وهو صفر.

05:40.610 --> 05:41.150
حسنا.

05:41.150 --> 05:47.030
والآن لدينا حالتنا الجديدة تتكون من ثلاث إشارات من أجهزة الاستشعار الثلاثة بالإضافة إلى الاتجاه

05:47.030 --> 05:47.960
ناقص الاتجاه.

05:48.110 --> 05:54.770
وبالطبع ، سيعتمد ذلك على الإشارة الجديدة التي نحصل عليها من خلال وظيفة التحديث هذه مباشرةً عند هذا

05:54.770 --> 05:55.400
الخط.

05:55.400 --> 05:59.570
الإشارة الأخيرة ، نحصل على الإشارات الثلاث بالإضافة إلى الاتجاه مطروحًا منه الاتجاه.

05:59.570 --> 06:05.870
وللتذكير ، هذه الإشارات الثلاث هي كثافة الرائحة المكتشفة حول المستشعرات.

06:06.290 --> 06:06.830
حسنا.

06:06.830 --> 06:12.860
لقد حصلنا للتو على حالتنا الجديدة ، وهذا يعني أننا وصلنا إلى الحالة الجديدة وعلينا الآن إجراء التحديث

06:12.860 --> 06:13.460
التالي.

06:13.460 --> 06:16.370
لذا وفقًا لك ، ما الذي نحتاجه للتحديث الآن؟

06:16.400 --> 06:22.160
ما هو الشيء المنطقي الذي يجب تحديثه الآن بعد الوصول إلى هذه الحالة الجديدة؟

06:22.370 --> 06:25.700
حسنًا ، ما نحتاج إلى تحديثه الآن هو الذاكرة.

06:25.700 --> 06:26.750
لماذا هذا؟

06:26.750 --> 06:34.130
ذلك لأنه في كل مرة يتألف الانتقال من الحالة الحالية حيث أن الحالة التالية هي t زائد

06:34.130 --> 06:37.550
واحد والمكافأة r t والإجراء a t.

06:37.550 --> 06:44.420
والآن لدينا t بالفعل ولدينا T بالفعل ولدينا بالفعل t وحصلنا للتو على العنصر الأخير

06:44.420 --> 06:47.150
في الانتقال مثل T زائد واحد.

06:47.330 --> 06:55.280
لذلك من خلال الحصول على هذه الحالة الجديدة مثل T زائد واحد ، نحصل على انتقال جديد تمامًا للذاكرة.

06:55.280 --> 07:00.680
وبالتالي يتعين علينا إلحاق هذا الانتقال الجديد تمامًا بالذاكرة لأن هذا مجرد انتقالنا

07:00.680 --> 07:01.490
التالي.

07:01.700 --> 07:03.890
لهذا السبب علينا تحديث الذاكرة الآن.

07:03.890 --> 07:10.910
وبالتالي ، ما سأفعله هو أخذ كائن ذاكرتي الذي تم إنشاؤه من فئة ذاكرة إعادة التشغيل ، وبالتالي

07:10.910 --> 07:13.040
سأقوم بأخذ الذات.

07:13.850 --> 07:16.880
تلك الذاكرة للإشارة إلى الكائن.

07:16.880 --> 07:22.220
ولكن بما أنني أستخدم self ، يجب أن أدرج الذات في وظيفة التحديث.

07:22.700 --> 07:25.270
حتى الآن يمكنك أن ترى حقًا ما هي الذات.

07:25.280 --> 07:30.830
عندما تستخدم متغيرًا واحدًا قمت بإنشائه وتهيئته في دالة init.

07:31.400 --> 07:33.890
إذاً الذاكرة النقطية الذاتية ونحن الآن بحاجة إلى تحديثها.

07:33.890 --> 07:36.830
ووفقًا لك ، كيف سنقوم بتحديث ذلك؟

07:36.920 --> 07:41.090
حسنًا ، الخبر السار هو أننا قمنا بالفعل بعمل وظيفة للقيام بذلك.

07:41.090 --> 07:46.940
إنها وظيفة الدفع التي تلحق حدثًا أو انتقالًا إلى الذاكرة.

07:46.940 --> 07:48.920
هذا هو بالضبط ما سنستخدمه الآن.

07:48.920 --> 07:54.470
سنستخدم وظيفة الدفع لإلحاق انتقالنا الجديد الذي قمنا به للتو بالذاكرة.

07:54.470 --> 08:01.010
وبالتالي ، أنا هنا لا أعتبر متساويًا لأننا سنستخدم طريقة وبالتالي يمكننا

08:01.010 --> 08:03.860
استخدام الدفع النقطي مباشرةً.

08:04.010 --> 08:09.770
وأولًا ، سأضيف الانتقال ، هذا الانتقال الجديد الذي حصلنا عليه للتو

08:09.770 --> 08:13.910
وهذا أولاً هو آخر حالة ذاتية حتى أقل حالة.

08:14.000 --> 08:18.410
إذن هذا هو S-T هذا بالضبط هو الموجود بالفعل.

08:18.410 --> 08:23.540
ثم العنصر التالي لهذا الانتقال هو بالطبع الحالة الجديدة التي وصلنا إليها للتو.

08:23.540 --> 08:29.150
وبالتالي ، نظرًا لأنه ليس متغيرًا للكائن الذي أنشأناه وأعدناه في دالة init

08:29.150 --> 08:31.340
هذه ، فإننا لا نضع الذات هنا.

08:31.340 --> 08:33.590
نضع الدولة الجديدة مباشرة.

08:35.190 --> 08:41.010
ثم العنصر التالي في الانتقال هو الإجراء والقول بأن لدينا بالفعل الإجراء الأخير

08:41.010 --> 08:43.580
، وهو الإجراء الذاتي الأخير هنا.

08:43.590 --> 08:49.950
لذلك بالطبع يساوي الصفر ، ولكن بعد ذلك بالطبع سيتم تحديثه بوظيفة التحديد.

08:49.950 --> 08:51.030
لكن هذا هو واحد.

08:51.030 --> 08:55.440
إذن ، فهذا هو الإجراء الذاتي للنقطة الأخيرة.

08:55.620 --> 08:56.970
لكن كن حذرا الآن.

08:57.000 --> 09:01.470
يجب أن تكون العناصر التي نقوم بتضمينها في هذا الانتقال هي راقصات الشعلة.

09:01.590 --> 09:03.720
كما ترى ، هذا هو الحال بالنسبة للتاريخ الأخير.

09:03.720 --> 09:05.100
إنها راقصة الشعلة.

09:05.130 --> 09:07.500
الدولة الجديدة هي أيضا راقصة الشعلة.

09:07.620 --> 09:10.440
ولذا يجب أن يكون هذا هو نفسه بالنسبة للإجراء.

09:10.440 --> 09:11.940
ثم المكافأة بالطبع.

09:11.940 --> 09:17.220
لكنك ستفكر الآن ، كيف يمكن أن تكون راقصة شعلة ، مع الأخذ في الاعتبار أنها مجرد رقم

09:17.220 --> 09:22.200
، كما تعلمون ، الإجراء إما صفر واحد أو اثنين ، لكن في الواقع ، هذه ليست مشكلة.

09:22.200 --> 09:28.410
لا يزال بإمكاننا تحويل هذا المتغير صفر أو متغيران إلى راقص شعلة.

09:28.440 --> 09:31.320
سيكون هذا ما نسميه موتر طويل.

09:31.320 --> 09:35.670
الطويل هو نوع ، وهذا هو الموتر الذي سيحتوي على عدد صحيح.

09:35.670 --> 09:39.240
لأن القسم الأخير عدد صحيح ، فهو صفر واحد أو اثنان.

09:39.420 --> 09:43.290
إذن ما سنأخذه الآن هو مصباح مكتبتنا.

09:43.950 --> 09:51.930
ثم سنستغرق وقتًا طويلاً هنا هو فئة الموتر الطويلة التي ستنشئ كائنًا جديدًا ، والذي سيكون الموتر

09:51.930 --> 09:53.460
الطويل نفسه.

09:53.460 --> 10:00.330
وباستخدام وظيفة الإجراء الذاتي الأخير كمدخل ، فإنها ستنشئ هذا الموضوع طويل المدى ، لكنها

10:00.330 --> 10:04.650
ستظل تحتوي على صفر واحد أو اثنين في كائن موتر طويل.

10:04.650 --> 10:08.640
وهذا فقط ليكون متسقًا مع الانتقال.

10:08.640 --> 10:13.980
يجب أن يحتوي ذلك فقط على أجهزة استشعار لأننا نعمل مع PyTorch ونعمل مع الشبكة العصبية.

10:13.980 --> 10:18.360
لذلك علينا أن نعمل مع أجهزة الاستشعار حتى نذهب بشعلة موتر طويل.

10:18.360 --> 10:25.560
وتحويل أخير يجب إجراؤه ، يجب أن نتأكد من أن ما بداخل هذه الإجابة الطويلة هو عدد صحيح وللتأكد من ذلك ،

10:25.560 --> 10:30.660
حتى لو كنا نعلم بالفعل أن القسم الأخير هو صفر واحد أو اثنان للتأكد من أننا

10:30.660 --> 10:38.760
ذاهبون إلى قم بإجراء هذا التحويل من النوع int مرة أخرى ، نقوم بتحويل الإجراء الذاتي الأخير إلى عدد صحيح.

10:39.060 --> 10:39.720
هناك نذهب.

10:39.720 --> 10:47.460
وبعد ذلك ، يجب علينا فقط وضع الإجراء الذاتي الأخير للعدد الصحيح بين قوسين هنا حتى نحصل الآن على موتر طويل لعنصر

10:47.460 --> 10:52.560
واحد والذي سيكون هذا الإجراء الأخير صفرًا واحدًا أو اثنين بحد ذاته.

10:52.560 --> 10:59.160
لذا فإن النقطة الأساسية هي كيفية تحويل رقم بسيط ، صفر واحد أو اثنين إلى موتر بلمسة.

10:59.930 --> 11:00.290
حسنا.

11:00.290 --> 11:06.620
وأخيرًا ، العنصر الأخير في الانتقال ، وهذا بالطبع آخر مكافأة حصلنا عليها.

11:06.650 --> 11:12.890
هذا هو بالضبط متغير المكافأة الأخير الذي أنشأناه في دالة init التي تمت تهيئتها إلى

11:12.890 --> 11:19.640
الصفر ولكن بالطبع يتم تحديثها هنا في هذا الرمز إما عندما نتطرق إلى نوع من المكافأة السالبة

11:19.640 --> 11:23.960
أو إذا ابتعدنا عن الهدف ، هذا مرة أخرى مكافأة سلبية.

11:23.960 --> 11:26.870
إذا اقتربنا من الهدف ، فهذه مكافأة إيجابية.

11:26.870 --> 11:32.570
وأسوأ عقوبة إذا اقتربنا جدًا من إحدى حواف الخريطة ، حسنًا ، هذه مكافأة سلبية

11:32.570 --> 11:34.010
رهيبة ، ناقص واحد.

11:34.010 --> 11:34.970
و هذا كل شيء.

11:36.100 --> 11:40.690
لذلك دعونا نضيف هذا العنصر الأخير من نفسية الانتقال التي تكافئ.

11:40.810 --> 11:47.650
لذلك أقوم بنسخ هذا اللصق هنا والآن علينا إجراء تحويل آخر والذي سيكون بالطبع هو نفسه تمامًا

11:47.650 --> 11:49.510
مثل هذا التحويل.

11:49.540 --> 11:57.310
فقط نظرًا لأن المكافأة ليست عددًا صحيحًا بل رقمًا عائمًا ، فسنقوم ببساطة بعمل شعلة لتحويل الموتر.

11:57.310 --> 12:01.450
لكن بدون ints ، سنحتفظ بالأقواس هنا لأنه ، كما تعلم ، علينا أولاً

12:01.450 --> 12:06.790
أن نضع الرقم في قائمة ثم ستذهب هذه القائمة كمدخلات في فئة موتر الشعلة.

12:06.790 --> 12:11.250
لكن لا يتعين علينا إجراء ذلك في التحويل لأن المكافأة الأخيرة هي رقم عائم.

12:11.260 --> 12:21.310
إذن ما سنفعله هو ببساطة إضافة موتر نقطة الشعلة إلى هذا الموتر ، ثم الأقواس ، الأقواس.

12:21.400 --> 12:27.070
وسنغلق الأقواس هنا ونغلق الأقواس.

12:27.280 --> 12:28.150
هناك نذهب.

12:28.630 --> 12:35.290
للتلخيص مع الحالة الجديدة التي وصلنا إليها للتو والمكافأة ، نلاحظ حدثًا جديدًا من الانتقال

12:35.290 --> 12:37.060
نضيفه إلى الذاكرة.

12:37.330 --> 12:41.650
وهذا الانتقال يحتوي على الحالة الأخيرة فيما يتعلق بالدولة الجديدة.

12:41.650 --> 12:46.480
SD زائد واحد ، الإجراء الأخير لعب 80 والمكافأة الأخيرة.

12:46.480 --> 12:47.190
حسنًا.

12:47.830 --> 12:48.310
حسنا.

12:48.310 --> 12:51.130
والآن نحن جيدون في تحديث ذاكرتنا.

12:51.130 --> 12:55.570
لذلك دعونا نحصل على استراحة سريعة وسنتولى التحديث التالي في البرنامج التعليمي التالي.

12:55.810 --> 12:56.950
حتى ذلك الحين ، استمتع.

12:56.980 --> 12:57.300
أنا.
