آه! مدرسة إبتدائية! كان هذا هو الوقت الذي تعلمنا فيه مهارات قيمة، مثل معرفة القراءة والكتابة والحساب ولعب التيك تاك تو على النحو الأمثل.
إن لعب مباراة تيك تاك تو مع صديقك دون أن يقبض عليك المعلم هو فن. يجب عليك تمرير ورقة اللعبة بشكل منفصل تحت المكتب مع إعطاء الانطباع بأنك منتبه للموضوع. ربما كانت المتعة تتعلق بالعملية السرية أكثر من اللعبة نفسها.
لا يمكننا تعليم فن تجنب الوقوع في الفصل الدراسي إلى وكيل برمجيات، ولكن هل يمكننا تدريب الوكيل على إتقان اللعبة؟
في رسالتي السابقة، قمنا بدراسة وكيل يتعلم اللعبة المبلغ100 من خلال اللعب الذاتي. لقد كانت لعبة سهلة أتاحت لنا عرض قيمة الحالة، مما ساعدنا في بناء حدس حول كيفية تعلم الوكيل للعبة. مع تيك تاك تو، نحن نتعامل مع مساحة دولة أكبر بكثير.
يمكنك العثور على كود بايثون في هذا المستودع. البرنامج النصي الذي يقوم بالتدريب هو learn_tictactoe.sh:
#!/bin/bash
أعلن -i NUMBER_OF_GAMES=30000
أعلن -i NUMBER_OF_EPOCHS=5تصدير بايثونباث='./'
معالجة بايثون المسبقة/generate_positions_expectations.py \
--outputDirectory=./learn_tictactoe/output_tictactoe_generate_positions_expectations_level0 \
--game=tictactoe \
--numberOfGames=$NUMBER_OF_GAMES \
--غاما=0.95 \
--بذرة عشوائية=1 \
--agentArchitecture=لا شيء \
--agentFilepath=لا شيء \
--opponentArchitecture=لا شيء \
--opponentFilepath=لا شيء \
--epsilons = "[1.0]" \
--درجة الحرارة=0
dataset_filepath = "./learn_tictactoe/output_tictactoe_generate_positions_expectations_level0/dataset.csv"
قطار بايثون/train_agent.py \
$dataset_filepath \
--outputDirectory="./learn_tictactoe/output_tictactoe_train_agent_level1" \
--game=tictactoe \
--بذرة عشوائية=0 \
--نسبة التحقق = 0.2 \
--batchSize=64 \
--الهندسة المعمارية=SaintAndre_1024 \
--نسبة التسرب = 0.5 \
--معدل التعلم = 0.0001 \
--weightDecay=0.00001 \
--numberOfEpochs=$NUMBER_OF_EPOCHS \
--startingNeuralNetworkFilepath=لا شيء
للمستوى في {1..16}
يفعل
dataset_filepath = "./learn_tictactoe/output_tictactoe_generate_positions_expectations_level${level}/dataset.csv"
معالجة بايثون المسبقة/generate_positions_expectations.py \
--outputDirectory="./learn_tictactoe/output_tictactoe_generate_positions_expectations_level${level}" \
--game=tictactoe \
--numberOfGames=$NUMBER_OF_GAMES \
--غاما=0.95 \
--بذرة عشوائية=0 \
--agentArchitecture=SaintAndre_1024 \
--agentFilepath = "./learn_tictactoe/output_tictactoe_train_agent_level${level}/SaintAndre_1024.pth" \
--opponentArchitecture=SaintAndre_1024 \
--opponentFilepath = "./learn_tictactoe/output_tictactoe_train_agent_level${level}/SaintAndre_1024.pth" \
--epsilons = "[0.5، 0.5، 0.1]" \
--درجة الحرارة=0
أعلن -i next_level=$((المستوى + 1))
قطار بايثون/train_agent.py \
"./learn_tictactoe/output_tictactoe_generate_positions_expectations_level${level}/dataset.csv" \
--outputDirectory="./learn_tictactoe/output_tictactoe_train_agent_level${next_level}" \
--game=tictactoe \
--بذرة عشوائية=0 \
--نسبة التحقق = 0.2 \
--batchSize=64 \
--الهندسة المعمارية=SaintAndre_1024 \
--نسبة التسرب = 0.5 \
--معدل التعلم = 0.0001 \
--weightDecay=0.00001 \
--numberOfEpochs=$NUMBER_OF_EPOCHS \
--startingNeuralNetworkFilepath = "./learn_tictactoe/output_tictactoe_train_agent_level${level}/SaintAndre_1024.pth"
منتهي
يتكرر البرنامج النصي من خلال المكالمات إلى برنامجين:
يستمر تعلم اللعبة من قبل الوكيل من خلال دورة إنشاء المباريات والتدريب للتنبؤ بنتيجة المباراة من حالة اللعبة:
تبدأ الدورة بمحاكاة المباريات بين اللاعبين العشوائيين، أي اللاعبين الذين يختارون عشوائيًا من قائمة الإجراءات القانونية في حالة لعبة معينة.
لماذا نقوم بإنشاء مباريات يتم لعبها بشكل عشوائي؟
يدور هذا المشروع حول التعلم من خلال اللعب الذاتي، لذلك لا يمكننا إعطاء الوكيل أي معلومات مسبقة عنه كيف ألعب. في الدورة الأولى، نظرًا لأن العميل ليس لديه أدنى فكرة عن التحركات الجيدة أو السيئة، يجب أن يتم إنشاء المباريات عن طريق اللعب العشوائي.
يوضح الشكل 2 مثالاً للمطابقة بين اللاعبين العشوائيين:
ما الدرس الذي يمكن أن نتعلمه من خلال مراقبة هذه المباراة؟ من وجهة نظر اللاعب "X"، يمكننا أن نفترض أن هذا مثال على اللعب السيئ لأنه انتهى بالخسارة. لا نعرف أي حركة (حركات) هي المسؤولة عن الهزيمة، لذلك سنفترض ذلك جميع القرارات التي صنعها اللاعب "X" كانت سيئة. إذا كانت بعض القرارات جيدة، فإننا نراهن على الإحصائيات (قد تمر عمليات محاكاة أخرى بحالة مماثلة) لتصحيح قيمة حالتها المتوقعة.
يتم إعطاء الإجراء الأخير للاعب "X" قيمة -1. تتلقى الإجراءات الأخرى قيمة سلبية مخصومة تتحلل هندسيًا بعامل γ (جاما) ∈ [0, 1] عندما نعود للخلف نحو الحركة الأولى.
تحصل الولايات من المباريات التي أدت إلى الفوز على قيم مخفضة إيجابية مماثلة. يتم إعطاء الدول المأخوذة من السحوبات قيمة صفر. يأخذ الوكيل وجهة نظر كل من اللاعب الأول والثاني.
تنص اللعبة على أنها موترات
نحن بحاجة إلى تمثيل موتر لحالة اللعبة. سنستخدم موترًا [2x3x3] حيث يمثل البعد الأول القنوات (0 لـ 'X' و1 لـ 'O')، والبعدان الآخران هما الصفوف والأعمدة. يتم ترميز إشغال مربع (صف، عمود) بالرقم 1 في إدخال (القناة، الصف، العمود).
تشكل أزواج (موتر الحالة، القيمة المستهدفة) التي تم الحصول عليها عن طريق إنشاء التطابقات مجموعة البيانات التي ستتدرب عليها الشبكة العصبية في كل جولة. يتم إنشاء مجموعة البيانات في بداية الدورة، مع الاستفادة من التعلم الذي حدث في الجولات السابقة. في حين أن الجولة الأولى تولد لعبًا عشوائيًا بحتًا، فإن الجولات اللاحقة تولد تدريجيًا مباريات أكثر واقعية.
- إدخال العشوائية في المسرحية
الجولة الأولى من جيل المباراة تعارض اللاعبين العشوائيين. الجولات اللاحقة تعارض الوكيل مع نفسه (ومن هنا "اللعب الذاتي"). تم تجهيز الوكيل بشبكة عصبية انحدارية مدربة على التنبؤ بنتيجة المباراة، مما يسمح له باختيار الإجراء القانوني الذي يحقق أعلى قيمة متوقعة. لتعزيز التنوع، يختار الوكيل الإجراءات بناءً على خوارزمية إبسيلون الجشعة: مع الاحتمال (1-ε)، يتم اختيار الإجراء الأفضل؛ خلاف ذلك، يتم اختيار إجراء عشوائي.
يوضح الشكل 5 تطور خسائر التحقق على مدار خمس فترات بحد أقصى 17 جولة تدريبية:
يمكننا أن نرى أن الجولات التدريبية القليلة الأولى تظهر انخفاضًا سريعًا في خسارة التحقق من الصحة، وبعد ذلك يبدو أن هناك استقرارًا حول متوسط خسارة الخطأ المربع بمقدار 0.2. يوضح هذا الاتجاه أن الشبكة العصبية الانحدارية للوكيل تتحسن في التنبؤ بنتيجة المباراة التي يتم لعبها ضد نفسها، من حالة لعبة معينة. نظرًا لأن تصرفات كلا اللاعبين غير حتمية، فهناك حد لإمكانية التنبؤ بنتيجة المباراة. وهذا ما يفسر سبب توقف فقدان التحقق من التحسن بعد بعض الجولات.
التحسن من جولة إلى أخرى
مع اللعبة المبلغ100, يمكننا تمثيل الحالة على شبكة أحادية الأبعاد. ومع ذلك، مع لعبة tic-tac-toe، لا يمكننا عرض تطور قيمة الحالة بشكل مباشر. أحد الأشياء التي يمكننا القيام بها لقياس التحسن هو وضع الوكيل في مواجهة الإصدار السابق من نفسه وملاحظة الفرق بين المكاسب والخسائر.
باستخدام ε = 0.5 للإجراء الأول لكلا اللاعبين و ε = 0.1 لبقية المباراة، وإجراء 1000 مباراة لكل مقارنة، هذا ما نحصل عليه:
تجاوز عدد الانتصارات عدد الخسائر (مما يدل على تحسن) حتى 10 جولات تدريبية. بعد ذلك لم يتحسن الوكيل من جولة إلى أخرى.
حان الوقت لنرى كيف يلعب وكيلنا لعبة تيك تاك تو!
إحدى الميزات المفيدة لامتلاك شبكة عصبية انحدارية هي إمكانية عرض تقييم الوكيل لكل خطوة قانونية. هيا نلعب لعبة ضد الوكيل، لنوضح له كيف يحكم على خياراته.
اللعب اليدوي
يبدأ الوكيل بلعب "X":
هذه هي الطريقة التي يتم بها سحقك بوحشية بواسطة آلة تيك تاك تو التي لا روح لها!
بمجرد أن وضعت "O" في المربع (1، 0)، ارتفع العائد المتوقع من 0.142 إلى 0.419، وتم تحديد مصيري.
دعونا نرى كيف يحدث ذلك عندما يلعب الوكيل في المركز الثاني:
ولم يقع في الفخ، وكانت المباراة بالتعادل.
مباريات ضد لاعب عشوائي
اذا نحن محاكاة عدد كبير من المباريات ضد لاعب عشوائي، وهذا ما حصلنا عليه:
من أصل 1000 مباراة (لعب الوكيل المركز الأول في نصف المباريات)، فاز الوكيل في 950 مباراة، ولم يخسر أحداً، وكان هناك 50 تعادلاً. هذا ليس دليلاً على أن وكيلنا يلعب على النحو الأمثل، لكنه بالتأكيد وصل إلى مستوى لعب لائق.
على سبيل المتابعة تدريب أحد العملاء على إتقان لعبة بسيطة من خلال اللعب الذاتي حيث كانت اللعبة سهلة الاختراق وكانت مساحة الحالة صغيرة، استخدمنا نفس الأسلوب لإتقان لعبة tic-tac-toe. على الرغم من أن هذه لا تزال مشكلة لعبة، إلا أن مساحة حالة tic-tac-toe كبيرة بما يكفي بحيث تكون شبكة الانحدار العصبية للوكيل مطلوبة للعثور على أنماط في موترات الحالة. تسمح هذه الأنماط بتعميم موترات الحالة غير المرئية.
الرمز متاح في هذا المستودع. جربها وأخبرني برأيك!
اترك رد