Kökeni kaynak Andrej Karpathy blogundan , Politika Gradyanının çok basit bir örneğini yeniden oluşturmaya çalışıyorum . Bu makalede, ağırlık listesi ve Softmax aktivasyonu içeren CartPole ve Politika Gradyanı ile örnek bulacaksınız. İşte mükemmel çalışan CartPole politika gradyanının yeniden oluşturulmuş ve çok basit bir örneği .
import gym
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import PolynomialFeatures
import copy
NUM_EPISODES = 4000
LEARNING_RATE = 0.000025
GAMMA = 0.99
# noinspection PyMethodMayBeStatic
class Agent:
def __init__(self):
self.poly = PolynomialFeatures(1)
self.w = np.random.rand(5, 2)
def policy(self, state):
z = state.dot(self.w)
exp = np.exp(z)
return exp/np.sum(exp)
def __softmax_grad(self, softmax):
s = softmax.reshape(-1,1)
return np.diagflat(s) - np.dot(s, s.T)
def grad(self, probs, action, state):
dsoftmax = self.__softmax_grad(probs)[action,:]
dlog = dsoftmax / probs[0,action]
grad = state.T.dot(dlog[None,:])
return grad
def update_with(self, grads, rewards):
for i in range(len(grads)):
# Loop through everything that happend in the episode
# and update towards the log policy gradient times **FUTURE** reward
total_grad_effect = 0
for t, r in enumerate(rewards[i:]):
total_grad_effect += r * (GAMMA ** r)
self.w += LEARNING_RATE * grads[i] * total_grad_effect
print("Grads update: " + str(np.sum(grads[i])))
def main(argv):
env = gym.make('CartPole-v0')
np.random.seed(1)
agent = Agent()
complete_scores = []
for e in range(NUM_EPISODES):
state = env.reset()[None, :]
state = agent.poly.fit_transform(state)
rewards = []
grads = []
score = 0
while True:
probs = agent.policy(state)
action_space = env.action_space.n
action = np.random.choice(action_space, p=probs[0])
next_state, reward, done,_ = env.step(action)
next_state = next_state[None,:]
next_state = agent.poly.fit_transform(next_state.reshape(1, 4))
grad = agent.grad(probs, action, state)
grads.append(grad)
rewards.append(reward)
score += reward
state = next_state
if done:
break
agent.update_with(grads, rewards)
complete_scores.append(score)
env.close()
plt.plot(np.arange(NUM_EPISODES),
complete_scores)
plt.savefig('image1.png')
if __name__ == '__main__':
main(None)
.
.
Soru
Yapmaya çalışıyorum, neredeyse aynı örnek ama Sigmoid aktivasyonu ile (sadece basitlik için). Tüm yapmam gereken bu. Modeldeki aktivasyonu 'den' softmax
e değiştirin sigmoid
. Hangi kesin olarak çalışmalıdır (aşağıdaki açıklamaya göre). Ancak Politika Degrade modelim hiçbir şey öğrenmiyor ve rastgele duruyor. Herhangi bir öneri?
import gym
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import PolynomialFeatures
NUM_EPISODES = 4000
LEARNING_RATE = 0.000025
GAMMA = 0.99
# noinspection PyMethodMayBeStatic
class Agent:
def __init__(self):
self.poly = PolynomialFeatures(1)
self.w = np.random.rand(5, 1) - 0.5
# Our policy that maps state to action parameterized by w
# noinspection PyShadowingNames
def policy(self, state):
z = np.sum(state.dot(self.w))
return self.sigmoid(z)
def sigmoid(self, x):
s = 1 / (1 + np.exp(-x))
return s
def sigmoid_grad(self, sig_x):
return sig_x * (1 - sig_x)
def grad(self, probs, action, state):
dsoftmax = self.sigmoid_grad(probs)
dlog = dsoftmax / probs
grad = state.T.dot(dlog)
grad = grad.reshape(5, 1)
return grad
def update_with(self, grads, rewards):
if len(grads) < 50:
return
for i in range(len(grads)):
# Loop through everything that happened in the episode
# and update towards the log policy gradient times **FUTURE** reward
total_grad_effect = 0
for t, r in enumerate(rewards[i:]):
total_grad_effect += r * (GAMMA ** r)
self.w += LEARNING_RATE * grads[i] * total_grad_effect
def main(argv):
env = gym.make('CartPole-v0')
np.random.seed(1)
agent = Agent()
complete_scores = []
for e in range(NUM_EPISODES):
state = env.reset()[None, :]
state = agent.poly.fit_transform(state)
rewards = []
grads = []
score = 0
while True:
probs = agent.policy(state)
action_space = env.action_space.n
action = np.random.choice(action_space, p=[1 - probs, probs])
next_state, reward, done, _ = env.step(action)
next_state = next_state[None, :]
next_state = agent.poly.fit_transform(next_state.reshape(1, 4))
grad = agent.grad(probs, action, state)
grads.append(grad)
rewards.append(reward)
score += reward
state = next_state
if done:
break
agent.update_with(grads, rewards)
complete_scores.append(score)
env.close()
plt.plot(np.arange(NUM_EPISODES),
complete_scores)
plt.savefig('image1.png')
if __name__ == '__main__':
main(None)
Tüm öğrenmeyi planlamak rastgele kalır. Hiçbir şey hiper parametreleri ayarlamaya yardımcı olmaz. Örnek görüntünün altında.
Kaynaklar :
1) Derin Takviye Öğrenme: Piksel Pong
2) Cartpole ve Doom ile Politika Degradelerine Giriş
3) Politika Degradelerinin Türetilmesi ve REINFORCE Uygulanması
GÜNCELLEME
Aşağıdaki cevap grafikten biraz iş yapabilir gibi görünüyor. Ancak bu günlük olasılığı değil ve politikanın gradyanı bile değil. Ve RL Gradyan Politikası'nın tüm amacını değiştirir. Lütfen yukarıdaki referansları kontrol edin. Resmin ardından bir sonraki ifademiz.
Politikamın (yalnızca ağırlık ve sigmoid
etkinleştirme) Günlük işlevinin Gradyanını almam gerekiyor .
softmax
için signmoid
. Yukarıdaki örnekte yapmam gereken tek şey bu.
[0, 1]
, pozitif eylem olasılığı olarak yorumlanabilecek gerçek aralıkta gerçek sayı üretir (örneğin, CartPole'de sağa dönün). Daha sonra negatif etki olasılığı (sola dönün) olur 1 - sigmoid
. Bu olasılıkların toplamı 1'dir. Evet, bu standart bir kutuplu kart ortamıdır.