TD (λ) في دلفي / باسكال (تعلم الفرق الزمني)
سؤال
لديّ شبكة عصبية اصطناعية تلعب دور Tic-Tac-Toe - لكنها لم تكتمل بعد.
ما لدي حتى الآن:
- مصفوفة المكافآت "R [t]" بقيم صحيحة لكل خطوة زمنية أو حركة "t" (1= يفوز اللاعب أ ، 0= تعادل ، -1= يفوز اللاعب ب)
- يتم نشر قيم الإدخال بشكل صحيح عبر الشبكة.
- معادلة ضبط الأوزان:
ما هو مفقود:
- تعلم TD: ما زلت بحاجة إلى إجراء "ينشر" أخطاء الشبكة باستخدام خوارزمية TD (λ).
لكنني لا أفهم هذه الخوارزمية حقًا.
نهجي حتى الآن ...
يجب أن تكون معلمة تحلل التتبع λ "0.1" حيث يجب ألا تحصل الحالات البعيدة على الكثير من المكافأة.
معدل التعلم هو "0.5" في كلا الطبقتين (الإدخال والمخفية).
إنها حالة تأخر المكافأة: تظل المكافأة "0" حتى تنتهي اللعبة. ثم تصبح المكافأة "1" لفوز اللاعب الأول ، و "-1" لفوز اللاعب الثاني أو "0" في حالة التعادل.
أسئلتي:
- كيف ومتى يتم حساب خطأ الشبكة (خطأ TD)؟
- كيف يمكنك تنفيذ "backpropagation" للخطأ؟
- كيف يتم ضبط الأوزان باستخدام TD (λ)؟
شكرًا جزيلاً مقدمًا :)
المحلول
إذا كنت جادًا في إنجاح هذا الأمر ، فسيكون فهم TD-lambda مفيدًا للغاية.يتوفر كتاب Sutton and Barto "Reinforcement Learning" مجانًا فيبتنسيق HTML ويغطي هذه الخوارزمية بالتفصيل.في الأساس ، ما تفعله TD-lambda هو إنشاء تعيين بين حالة اللعبة والمكافأة المتوقعة في نهاية اللعبة.أثناء ممارسة الألعاب ، تميل الدول التي يُرجح أن تؤدي إلى حالات الفوز إلى الحصول على قيم مكافآت متوقعة أعلى.
بالنسبة إلى لعبة بسيطة مثل tic-tac-toe ، من الأفضل أن تبدأ بتعيين جدول (ما عليك سوى تتبع قيمة المكافأة المتوقعة لكل حالة لعب ممكنة).ثم بمجرد الانتهاء من ذلك ، يمكنك محاولة استخدام NN لرسم الخرائط بدلاً من ذلك.لكني أقترح تجربة مشروع NN منفصل وأبسط أولاً ...
نصائح أخرى
لقد كنت مرتبكًا بشأن هذا أيضًا ، لكنني أعتقد أن هذه هي الطريقة التي يعمل بها:
بدءًا من العقدة النهائية ، تقوم بالتحقق من R و (استلام الإخراج) و E (توقع الإخراج).إذا كانت E= R ، فلا بأس ، وليس لديك أي تغييرات يجب إجراؤها.
إذا كانت E!= R ، سترى كم كانت بعيدة ، بناءً على العتبات وما إلى ذلك ، ثم قم بتحويل الأوزان أو العتبة لأعلى أو لأسفل قليلاً.بعد ذلك ، استنادًا إلى الأوزان الجديدة ، تعود إلى الداخل وتخمن ما إذا كانت مرتفعة جدًا أم منخفضة جدًا أم لا ، وتكرار ذلك بتأثير أضعف.
لم أجرب هذه الخوارزمية مطلقًا ، ولكن هذا هو في الأساس نسخة من الفكرة كما أفهمها.
بقدر ما أتذكر أنك تقوم بالتدريب باستخدام مجموعة نتائج معروفة - لذلك تحسب ناتج إدخال معروف وتطرح منه قيمة الإخراج المعروفة - وهذا هو الخطأ.
ثم تستخدم الخطأ لتصحيح الشبكة - بالنسبة لطبقة واحدة NN معدلة بقاعدة دلتا ، أعلم أن إبسيلون 0.5 مرتفع جدًا - شيء مثل 0.1 أفضل - أبطأ ولكنه أفضل.مع backpropagation ، يكون الأمر أكثر تقدمًا قليلاً - ولكن بقدر ما أتذكر ، فإن وصف المعادلة الرياضية لـ NN معقد ويصعب فهمه - إنه ليس بهذه التعقيد.
ألق نظرة على http://www.codeproject.com/KB/recipes/BP.aspx
أو google لـ "backpropagation c" - ربما يكون من الأسهل فهمه في الكود.