Q-learning
- Makine Öğrenmesi kursu
- Uzman
- Ders 39/44
- 5 dk
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 = yeniBü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
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
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.
hedef = odul + gamma * Q[yeni].____() * (not bitti)
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 |