আমি পলিসি গ্রেডিয়েন্টের খুব সাধারণ উদাহরণটি পুনরায় তৈরি করার চেষ্টা করছি, এর উত্স উত্স আন্দ্রেজ কার্পাতি ব্লগ থেকে । সেই আর্টিকেলটিতে, আপনি ওজন এবং সফটম্যাক্স অ্যাক্টিভেশন তালিকা সহ কার্টপোল এবং নীতি গ্রেডিয়েন্টের সাথে উদাহরণ পাবেন। কার্টপোল নীতি গ্রেডিয়েন্টের এটি আমার পুনরায় তৈরি এবং খুব সাধারণ উদাহরণ, যা নিখুঁত কাজ করে ।
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)
।
।
প্রশ্ন
আমি চেষ্টা করছি, প্রায় একই উদাহরণ কিন্তু সিগময়েড অ্যাক্টিভেশন সহ (কেবল সরলতার জন্য)। আমার এটাই করা দরকার। থেকে মডেলে সক্রিয়করণ স্যুইচ softmax
করুন sigmoid
। যা নিশ্চিত হয়ে কাজ করা উচিত (নীচের ব্যাখ্যার ভিত্তিতে)। তবে আমার নীতি গ্রেডিয়েন্ট মডেল কিছুই শিখেন না এবং এলোমেলো করে রাখে। যেকোনো পরামর্শ?
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)
সমস্ত শিক্ষার চক্রান্ত এলোমেলো করে রাখে। হাইপার প্যারামিটারগুলি সুর করার ক্ষেত্রে কিছুই সহায়তা করে না। নমুনা চিত্রের নীচে।
তথ্যসূত্র :
1) গভীর শক্তিবৃদ্ধি শিক্ষা: পিক্সেল থেকে পং
2) কার্টপোল এবং ডুমের সাথে পলিসি গ্রেডিয়েন্টগুলির একটি ভূমিকা
3) ডেরাইভিং নীতি গ্রেডিয়েন্টস এবং কার্যকরকরণ পুনরায় কার্যকরকরণ
হালনাগাদ
নীচের উত্তরটি গ্রাফিক থেকে কিছু কাজ করতে পারে বলে মনে হচ্ছে। তবে এটি লগ সম্ভাবনা নয়, এবং নীতিটির গ্রেডিয়েন্টও নয়। এবং আরএল গ্রেডিয়েন্ট নীতি পুরো উদ্দেশ্য পরিবর্তন করে। উপরে রেফারেন্স চেক করুন। ইমেজ অনুসরণ করে আমরা পরবর্তী বিবৃতি।
আমার নীতিমালার লগ ফাংশনের গ্রেডিয়েন্ট নিতে হবে (যা কেবল ওজন এবং sigmoid
অ্যাক্টিভেশন।
softmax
করার signmoid
। উপরের উদাহরণে আমার কেবল এটি করা দরকার।
[0, 1]
যা ইতিবাচক কর্মের সম্ভাবনা হিসাবে ব্যাখ্যা করা যায় (উদাহরণস্বরূপ কার্টপোলের ডানদিকে ঘুরুন)। তারপরে নেতিবাচক কর্মের সম্ভাবনা (বাঁদিকে বাঁক) হয় 1 - sigmoid
। এই সম্ভাবনার যোগফল 1 হ্যাঁ, এটি স্ট্যান্ডার্ড মেরু কার্ডের পরিবেশ।