CodeBlanks Logo Icon CodeBlanks

Q-learning

Q-learning, durum-eylem değerlerini öğrenen bir RL algoritmasıdır.

Q-learning

Q-learning, her (durum, eylem) çiftinin değerini Q(s, a) bir tabloda tutar ve her adımdan sonra Bellman hedefine doğru günceller:

hedef = odul + gamma * Q[yeni].max() * (not bitti)
Q[durum, eylem] += alfa * (hedef - Q[durum, eylem])

Güncellemede sonraki durumun en iyi eylemi kullanılır; ajanın gerçekte ne yaptığından bağımsızdır (politika-dışı, off-policy). Bu sayede ε-açgözlü keşfederken bile en iyi politikayı öğrenir.

Eğitim döngüsü

Q tablosu sıfırla başlar; ε-açgözlü bölümler oynanır ve her adımda tek bir hücre güncellenir. Yeterli bölümden sonra açgözlü politika (Q.argmax(axis=1)) en iyi politikaya yakınsar:

Q = np.zeros((N, 2))
for b in range(300):
    durum, bitti = 0, False
    while not bitti:
        eylem = eps_acgozlu(Q, durum, eps=0.2)
        yeni, odul, bitti = adim(durum, eylem)
        hedef = odul + gamma * Q[yeni].max() * (not bitti)
        Q[durum, eylem] += alfa * (hedef - Q[durum, eylem])
        durum = yeni

Büyük durum uzaylarında tablo yerine bir sinir ağı kullanılır: DQN (2015) Atari oyunlarını bu şekilde öğrendi.

Uygulama Koridorda Q-learning

Verilen ortam ve eps_acgozlu ile Q-learning'i alfa=0.5, gamma=0.9, eps=0.2 ile 300 bölüm eğit. Hedef dışındaki durumların açgözlü politikasını (Q[:N-1].argmax(axis=1)), ardından Q tablosunun SAG sütununu np.round(..., 3) ile alt alta yazdır.

Başlangıç kodu

model.py
import numpy as np

N = 5            # durumlar 0..4, hedef 4
SOL, SAG = 0, 1

def adim(durum, eylem):
    yeni = max(0, durum - 1) if eylem == SOL else durum + 1
    if yeni == N - 1:
        return yeni, 1.0, True
    return yeni, -0.1, False

rng = np.random.default_rng(0)

def eps_acgozlu(Q, durum, eps):
    if rng.random() < eps:
        return int(rng.integers(2))
    return int(np.argmax(Q[durum]))

alfa, gamma = 0.5, 0.9

# buraya yaz

Örnek çözüm

model.py
import numpy as np

N = 5            # durumlar 0..4, hedef 4
SOL, SAG = 0, 1

def adim(durum, eylem):
    yeni = max(0, durum - 1) if eylem == SOL else durum + 1
    if yeni == N - 1:
        return yeni, 1.0, True
    return yeni, -0.1, False

rng = np.random.default_rng(0)

def eps_acgozlu(Q, durum, eps):
    if rng.random() < eps:
        return int(rng.integers(2))
    return int(np.argmax(Q[durum]))

alfa, gamma = 0.5, 0.9

Q = np.zeros((N, 2))
for b in range(300):
    durum, bitti = 0, False
    while not bitti:
        eylem = eps_acgozlu(Q, durum, 0.2)
        yeni, odul, bitti = adim(durum, eylem)
        hedef = odul + gamma * Q[yeni].max() * (not bitti)
        Q[durum, eylem] += alfa * (hedef - Q[durum, eylem])
        durum = yeni
print(Q[:N - 1].argmax(axis=1))
print(np.round(Q[:, SAG], 3))

Beklenen çıktı

[1 1 1 1]
[0.458 0.62  0.8   1.    0.   ]

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Bölüm bittiğinde hedefte neden Q[yeni].max() kullanılmaz?

  • Ödül negatiftir
  • Bitiş durumundan sonra gelecek ödül yoktur Doğru cevap
  • Q tablosu silinir
  • γ sıfır olur

Açıklama: Hedef yalnızca son ödüldür.

2 Bellman hedefine sonraki durumun en iyi değerini koy.

Soru
hedef = odul + gamma * Q[yeni].____() * (not bitti)
Cevap
hedef = odul + gamma * Q[yeni].max() * (not bitti)

Açıklama: Q-learning en iyi eylemin değerini kullanır.

3 Eşleştir.

Kavram Anlamı
alfa Öğrenme oranı
gamma İndirim oranı
hedef − Q Zamansal fark hatası
DQN Sinir ağlı Q-learning

Uzman bölümündeki tüm dersler