Phase 09: Reinforcement Learning

شبكات Q العميقة (DQN)

2013: تدرب Mnih شبكة Q-تعلم على البيكسل الخام، هزمت كل وكيل RL كلاسيكي على سبعة ألعاب Atari. 2015: تمتد إلى 49 لعبة، نشرت في الطبيعة، أطلقت عصر العميقة RL. DQN هو Q-تعلم بالإضافة إلى ثلاث حيل تجعل التقريب الوظيفي مستقرة.

Type: Build

Languages: Python

Prerequisites: Phase 3 · 03 (Backpropagation), Phase 9 · 04 (Q-learning, SARSA)

Time: ~75 minutes

المشكلة

يتطلب تعلم Q الجدولي قيمة Q منفصلة لكل زوج (حالة ، عمل). لوح الشطرنج لديه ~ 1043 حالة. إطار Atari هو 210 × 160 × 3 = 100,800 ميزة. يموت RL الجدولي في آلاف الحالات ، ناهيك عن المليارات.

والإصلاح واضح في الماضي: استبدال جدول Q بشبكة عصبية،Q(s, a; θ)لكن عملية التعرف على الوظائف الواضحة في الخلف استغرق عقود. يختلف التقريب المميز مع تعلم Q تحت "ثلاثة مميتة" التقريب الوظائف + التشغيل + التعلم خارج السياسة. حدد Mnih et al. (2013, 2015) ثلاثة حيل هندسية تحافظ على التعلم:

  1. Experience replayيُفصل بين الانتقالات.
  2. Target networkيجمد الهدف من إطلاق القيادة
  3. Reward clippingيُعادِلُ أحجام التراجع.

كانت DQN على Atari هي المرة الأولى التي تحل فيها بنية واحدة مع مجموعة مفاتيح خارقة واحدة عشرات المشاكل التحكمية من البيكسلات الخام. كل شيء "عميق-RL" تم بناؤه منذ DDQN ، Rainbow ، Dueling ، Distribution ، R2D2 ، Agent57 يتم تجميعه فوق هذه القاعدة الثلاثية.

المفهوم

!DQN training loop: env, replay buffer, online net, target net, Bellman TD loss

The objective.DQN يقلل من خسارة TD خطوة واحدة على وظيفة Q العصبية:

L(θ) = E_{(s,a,r,s')~D} [ (r + γ max_{a'} Q(s', a'; θ^-) - Q(s, a; θ))² ]

θ= شبكة الإنترنت، تحديث كل خطوة بالتراجع. θ^-= شبكة المستهدفة، يتم نسخها بشكل دوري من θ(كل 10000 خطوة)D= تعيد تعزيز الانتقالات الماضية.

The three tricks, in order of importance:

Experience replay.حلقة عازلة من~10⁶التحولات. كل خطوة تدريبية تعرض مجموعة صغيرة بشكل متساوي عشوائي. هذا يكسر التواصل الزمني (الإطارات المتتالية متطابقة تقريبًا) ، ويسمح للشبكة بالتعلم من التحولات النادرة المثمرة عدة مرات ، ويقوم بتحديثات التراجع المتتالية. بدون ذلك ، تختلف التد في السياسة مع شبكة عصبية على أتاري.

Target network.باستخدام نفس الشبكةQ(·; θ)على جانبي معادلة بيلمان يجعل الهدف يتحرك كل تحديث "المتابعة ذيلك".Q(·; θ^-)مع الأوزان المجمدة.Cخطوات، نسخة θ → θ^-هذا يُثبت هدف التراجعة لآلاف الخطوات المرتفعة في وقت واحدθ^- ← τ θ + (1-τ) θ^-(مستخدم في DDPG، SAC) هي نوع أكثر سلاسة.

Reward clipping.مقياس مكافأة أتاري يختلف من 1 إلى 1000 +.{-1, 0, +1}يمنع أي لعبة واحدة من السيطرة على المرجع خطأ عندما تكون حجم الجائزة مهمة، جيد لـ Atari حيث فقط التوقيع مهمة.

Double DQN.Hasselt (2016) تصحيح تحيز القياس القصوى: استخدام الشبكة على الإنترنت لـ اختيار الإجراء ، والشبكة المستهدفة لـ تقييم له.

target = r + γ Q(s', argmax_{a'} Q(s', a'; θ); θ^-)

استبدال التسجيل، أفضل بشكل ثابت، استخدميه بشكل افتراضي

Other improvements (Rainbow, 2017):إعادة التمثيل ذات الأولوية (مثل عدة عمليات انتقالية عالية التلفزيون) ، معمارة المواجهة (فصل V(s)و الرؤوس المفيدة) ، الشبكات الضوضاء (التنقيب المتعلم) ، عائدات خطوة n، Q التوزيعي (C51/QR-DQN) ، التشغيل متعدد الخطوات. كل واحد يضيف بضع في المئة؛ والمكاسب تقريبا إضافية.

بناءها

الرمز هنا هو stdlib فقط خالية من النمبي نستخدم MLP المتحركة اليدوية ذات الطبقة الواحدة المخفية على شبكة الإنترنت المستمرة الصغيرة، لذلك كل خطوة تدريبية تعمل في ميكروثانية. الخوارزمية هي نفس Atari DQN على النطاق.

الخطوة 1: تعبئة إعادة

pythonclass ReplayBuffer:
    def __init__(self, capacity):
        self.buf = []
        self.capacity = capacity
    def push(self, s, a, r, s_next, done):
        if len(self.buf) == self.capacity:
            self.buf.pop(0)
        self.buf.append((s, a, r, s_next, done))
    def sample(self, batch, rng):
        return rng.sample(self.buf, batch)

~ 50,000 قدرة ل Atari؛ 5000 يكفي لتجارة ألعابنا.

الخطوة الثانية: شبكة Q الصغيرة (MLP اليدوية)

pythonclass QNet:
    def __init__(self, n_in, n_hidden, n_actions, rng):
        self.W1 = [[rng.gauss(0, 0.3) for _ in range(n_in)] for _ in range(n_hidden)]
        self.b1 = [0.0] * n_hidden
        self.W2 = [[rng.gauss(0, 0.3) for _ in range(n_hidden)] for _ in range(n_actions)]
        self.b2 = [0.0] * n_actions
    def forward(self, x):
        h = [max(0.0, sum(w * xi for w, xi in zip(row, x)) + b) for row, b in zip(self.W1, self.b1)]
        q = [sum(w * hi for w, hi in zip(row, h)) + b for row, b in zip(self.W2, self.b2)]
        return q, h

الممر الأمامي: خطي → ريلو → خطي. هذا هو الشبكة بأكملها.

الخطوة الثالثة: تحديث DQN

pythondef train_step(online, target, batch, gamma, lr):
    grads = zeros_like(online)
    for s, a, r, s_next, done in batch:
        q, h = online.forward(s)
        if done:
            y = r
        else:
            q_next, _ = target.forward(s_next)
            y = r + gamma * max(q_next)
        td_error = q[a] - y
        accumulate_grads(grads, online, s, h, a, td_error)
    apply_sgd(online, grads, lr / len(batch))

الشكل هو Q-التعلم من الدروس 04 مع اختلافين: (أ) نحن نراجع من خلال التفريق Q(·; θ)بدلاً من تحديد جدول، (ب) استخدامات الهدف Q(·; θ^-). . .

الخطوة الرابعة: الحلقة الخارجية

لكل حلقة، تصرف بـ "الجشع"Q(·; θ)، دفع الانتقالات إلى العازلة، عينة مجموعة صغيرة، اتخاذ خطوة تراجعة، التزام المزامنة بشكل دوري θ^- ← θالنمط:

pythonfor episode in range(N):
    s = env.reset()
    while not done:
        a = epsilon_greedy(online, s, epsilon)
        s_next, r, done = env.step(s, a)
        buffer.push(s, a, r, s_next, done)
        if len(buffer) >= batch:
            train_step(online, target, buffer.sample(batch), gamma, lr)
        if steps % sync_every == 0:
            target = copy(online)
        s = s_next

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

الفخاخ

  • Deadly triad.يمكن أن تختلف تقارب الوظيفة + خارج السياسة + إطلاق التشغيل. DQN تخفيف مع شبكة الهدف + إعادة تشغيل؛ لا تُزيل أي منها.
  • Exploration.يجب أن يتحلل ε، عادةً من 1.0 إلى 0.01 خلال أول ~ 10% من التدريب. دون استكشاف مبكر كاف يتقارب شبكة Q إلى حوض محلي.
  • Overestimation. maxعلى Q الضوضاء هي التحيز الصعودي دائما استخدام DQN المزدوج في الإنتاج.
  • Reward scale.كليف أو تعاديل المكافآت؛ حجم التراجع متناسب مع حجم المكافأة.
  • Replay buffer coldstart.لا تتدرب حتى يكون لدى المضخّم بضعة آلاف من الانتقالات
  • Target sync frequency.متكرر جدا ≈ لا شبكة هدف ؛ نادر جدا ≈ أهداف قديمة. Atari DQN يستخدم 10,000 خطوات env. قاعدة عامة: مزامنة كل ~1/100 من آفاق التدريب.
  • Observation preprocessing.تقوم شركة Atari DQN بتجميع 4 إطارات لتكون حالة Markov. أي بيئة مع معلومات السرعة تحتاج إلى إطارات أو حالة متكررة.

استخدمها

في عام 2026، نادرا ما تكون DQN حديثة، ولكنها تظل خوارزمية مرجعية خارج السياسة:

TaskMethod of choiceWhy not DQN?
Discrete-action Atari-likeRainbow DQN or MuesliSame framework, more tricks.
Continuous controlSAC / TD3 (Phase 9 · 07)DQN has no policy network.
On-policy / high-throughputPPO (Phase 9 · 08)No replay buffer; easier to scale.
Offline RLCQL / IQL / Decision TransformerConservative Q targets, no bootstrapping blowups.
Large discrete action spaces (recommender)DQN with action embedding, or IMPALAFine; decoration matters.
LLM RLPPO / GRPOSequence-level, not step-level; different loss.

لا تزال الدروس في السفر. تظهر إعادة التشغيل والشبكات المستهدفة في SAC ، TD3 ، DDPG ، SAC-X ، حافظة لعب الذاتية في AlphaZero ، وجميع أساليب RL غير متصلة بالإنترنت. تعيش قصف الجوائز كطبيعية فائدة في PPO. الهندسة المعمارية هي الخطوط المخططة.

أرسله

إبقواoutputs/skill-dqn-trainer.md:

markdown---
name: dqn-trainer
description: Produce a DQN training config (buffer, target sync, ε schedule, reward clipping) for a discrete-action RL task.
version: 1.0.0
phase: 9
lesson: 5
tags: [rl, dqn, deep-rl]
---

Given a discrete-action environment (observation shape, action count, horizon, reward scale), output:

1. Network. Architecture (MLP / CNN / Transformer), feature dim, depth.
2. Replay buffer. Capacity, minibatch size, warmup size.
3. Target network. Sync strategy (hard every C steps or soft τ).
4. Exploration. ε start / end / schedule length.
5. Loss. Huber vs MSE, gradient clip value, reward clipping rule.
6. Double DQN. On by default unless explicit reason to disable.

Refuse to ship a DQN with no target network, no replay buffer, or ε held at 1. Refuse continuous-action tasks (route to SAC / TD3). Flag any reward range > 10× per-step mean as needing clipping or scale normalization.

التمارين

  1. Easy.أركضcode/main.py-سحب منحنى العودة لكل حلقة كم حلقة حتى تتجاوز المتوسط المتجاري -10؟
  2. Medium.تعطيل شبكة الهدف (استخدم شبكة الإنترنت على جانبي هدف بيلمان). قياس عدم استقرار التدريب هل تتذبذب العودة أو تختلف؟
  3. Hard.إضافة DQN مزدوج: استخدم الشبكة على الانترنت لتحديد argmax a'، والهدف الشبكة لتقييم. مقارنة التحيز منQ(s_0, best_a)مقابل الحقيقةV*(s_0)بعد 1000 حلقة مع مقابل دون DQN المزدوج على جريد ورلد مكافأة ضوضاء.

الشروط الرئيسية

TermWhat people sayWhat it actually means
DQN"Deep Q-learning"Q-learning with a neural Q-function, replay buffer, and target network.
Experience replay"Shuffled transitions"Ring buffer sampled uniformly each gradient step; decorrelates data.
Target network"Frozen bootstrap"Periodic copy of Q used in the Bellman target; stabilizes training.
Deadly triad"Why RL diverges"Function approximation + bootstrapping + off-policy = no convergence guarantee.
Double DQN"Fix for maximization bias"Online net selects action, target net evaluates it.
Dueling DQN"V and A heads"Decompose Q = V + A - mean(A); same output, better gradient flow.
Rainbow"All the tricks"DDQN + PER + dueling + n-step + noisy + distributional in one.
PER"Prioritized Replay"Sample transitions proportional to TD-error magnitude.

المزيد من القراءة

This free lesson is part of the AI Engineering from Scratch curriculum. Read the full explanation, run the lesson code, and verify the result in the interactive reader or from the repository source.

Browse the complete course catalog or open this lesson on GitHub.