Makine Öğrenmesi
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.
Örnek çözümü göster
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))
Kendini test et
-
Bölüm bittiğinde hedefte neden Q[yeni].max() kullanılmaz?
- Ödül negatiftir
- Bitiş durumundan sonra gelecek ödül yoktur
- Q tablosu silinir
- γ sıfır olur
Cevabı göster
Bitiş durumundan sonra gelecek ödül yoktur — Hedef yalnızca son ödüldür.
-
Bellman hedefine sonraki durumun en iyi değerini koy.
hedef = odul + gamma * Q[yeni].____() * (not bitti)
Cevabı göster
hedef = odul + gamma * Q[yeni].max() * (not bitti)
-
Eşleştir.
- alfa
- Öğrenme oranı
- gamma
- İndirim oranı
- hedef − Q
- Zamansal fark hatası
- DQN
- Sinir ağlı Q-learning
Sıradaki ders: Özet - RL