গ্রেডিয়েন্ট পলিসি ডেরাইভিং বোঝা


19

আমি পলিসি গ্রেডিয়েন্টের খুব সাধারণ উদাহরণটি পুনরায় তৈরি করার চেষ্টা করছি, এর উত্স উত্স আন্দ্রেজ কার্পাতি ব্লগ থেকে । সেই আর্টিকেলটিতে, আপনি ওজন এবং সফটম্যাক্স অ্যাক্টিভেশন তালিকা সহ কার্টপোল এবং নীতি গ্রেডিয়েন্টের সাথে উদাহরণ পাবেন। কার্টপোল নীতি গ্রেডিয়েন্টের এটি আমার পুনরায় তৈরি এবং খুব সাধারণ উদাহরণ, যা নিখুঁত কাজ করে

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) ডেরাইভিং নীতি গ্রেডিয়েন্টস এবং কার্যকরকরণ পুনরায় কার্যকরকরণ

4) দিনের মেশিন লার্নিং ট্রিক (5): লগ ডেরিভেটিভ ট্রিক 12


হালনাগাদ

নীচের উত্তরটি গ্রাফিক থেকে কিছু কাজ করতে পারে বলে মনে হচ্ছে। তবে এটি লগ সম্ভাবনা নয়, এবং নীতিটির গ্রেডিয়েন্টও নয়। এবং আরএল গ্রেডিয়েন্ট নীতি পুরো উদ্দেশ্য পরিবর্তন করে। উপরে রেফারেন্স চেক করুন। ইমেজ অনুসরণ করে আমরা পরবর্তী বিবৃতি।

এখানে চিত্র বর্ণনা লিখুন

আমার নীতিমালার লগ ফাংশনের গ্রেডিয়েন্ট নিতে হবে (যা কেবল ওজন এবং sigmoidঅ্যাক্টিভেশন।


4
আমি আপনাকে এই প্রশ্নটি ডেটা সায়েন্স স্ট্যাক এক্সচেঞ্জে পোস্ট করার পরামর্শ দিচ্ছি কারণ এটি বেশিরভাগই তাত্ত্বিক প্রশ্ন (স্ট্যাক ওভারফ্লো মূলত কোডিং প্রশ্নগুলির জন্য)। আপনি এই ডোমেনে জ্ঞানসম্পন্ন আরও বেশি লোকের কাছেও পৌঁছে যাবেন।
গিলস-ফিলিপ পায়েল

@ গিলস-ফিলিপেইলé আমি কোড যুক্ত করেছি, যা সমস্যার প্রতিনিধিত্ব করে। আমার যা করা দরকার তা কেবল অ্যাক্টিভেশন সহ কিছু অংশ ঠিক করা fix দয়া করে আপডেট করা উত্তরটি পরীক্ষা করুন।
জেনেসগেমস

1
নীতিমালা গ্রেডিয়েন্টস ডাইরাইভ করার জন্য, এখানে একই ধরণের ব্যবস্থাপনার কার্যকারী উদাহরণ সহ রেফারেন্স নিবন্ধটি রয়েছে, আশা করি আপনি বিস্তারিতভাবে শিখবেন: मध्यम . com/@thechrisyoon/… ।
মুহাম্মদ উসমান

@ মুহাম্মাদউসমান। তথ্যের জন্য ধন্যবাদ। আমি সেই উত্স লাল। ঠিক এখন উপরে স্পষ্ট এবং ফর্ম উদাহরণ, আমি থেকে পরিবর্তন সক্রিয়করণ করার চেষ্টা করছি softmaxকরার signmoid। উপরের উদাহরণে আমার কেবল এটি করা দরকার।
জেনসগেমস

2
@ জেসনচিয়া সিগময়েড আসল সংখ্যার আউটপুট দেয় [0, 1]যা ইতিবাচক কর্মের সম্ভাবনা হিসাবে ব্যাখ্যা করা যায় (উদাহরণস্বরূপ কার্টপোলের ডানদিকে ঘুরুন)। তারপরে নেতিবাচক কর্মের সম্ভাবনা (বাঁদিকে বাঁক) হয় 1 - sigmoid। এই সম্ভাবনার যোগফল 1 হ্যাঁ, এটি স্ট্যান্ডার্ড মেরু কার্ডের পরিবেশ।
পাভেল তিশেভস্কিই

উত্তর:


8

সমস্যাটি gradপদ্ধতিটি নিয়ে।

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

মূল কোডে সফটম্যাক্স ক্রসএন্ট্রপি ক্ষতি ফাংশনের পাশাপাশি ব্যবহৃত হয়েছিল। আপনি যখন সিগময়েডে অ্যাক্টিভেশন স্যুইচ করেন, সঠিক ক্ষতি ফাংশনটি বাইনারি ক্রসএনট্রপি হয়। এখন, gradপদ্ধতির উদ্দেশ্য হ'ল লোকসান ফাংশন গ্রেটের গ্রেডিয়েন্ট গণনা করা t ওজন। বিশদটি বাদ দিয়ে, (probs - action) * stateআপনার প্রোগ্রামের পরিভাষায় যথাযথ গ্রেডিয়েন্ট দেওয়া হয় । সর্বশেষ জিনিসটি বিয়োগ চিহ্নটি যুক্ত করা - আমরা ক্ষতির ক্রিয়াকলাপটিকে সর্বাধিক করতে চাই।

সঠিক gradপদ্ধতি এইভাবে:

def grad(self, probs, action, state):
    grad = state.T.dot(probs - action)
    return -grad

আরেকটি পরিবর্তন যা আপনি যুক্ত করতে চাইতে পারেন তা হল শিক্ষার হার বাড়ানো। LEARNING_RATE = 0.0001এবং NUM_EPISODES = 5000নিম্নলিখিত প্লট উত্পাদন করবে:

পর্বের সংখ্যার তুলনায় সঠিক গড় পুরষ্কার

শূন্য গড় এবং ছোট বৈকল্পিকের সাথে গাওসিয়ান বিতরণ ব্যবহার করে ওজন শুরু করা হলে এই রূপান্তরটি আরও দ্রুত হবে:

def __init__(self):
    self.poly = PolynomialFeatures(1)
    self.w = np.random.randn(5, 1) * 0.01

এখানে চিত্র বর্ণনা লিখুন

হালনাগাদ

ফলাফল পুনরুত্পাদন করতে সম্পূর্ণ কোড যুক্ত করা হয়েছে:

import gym
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import PolynomialFeatures

NUM_EPISODES = 5000
LEARNING_RATE = 0.0001
GAMMA = 0.99


# noinspection PyMethodMayBeStatic
class Agent:
    def __init__(self):
        self.poly = PolynomialFeatures(1)
        self.w = np.random.randn(5, 1) * 0.01

    # 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):
        grad = state.T.dot(probs - action)
        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)

আপনাকে অনেক ধন্যবাদ. আমি পরে এই সমাধান চেষ্টা করব।
GensaGames

আমি নিশ্চিত নই, আপনি আমার কাজের জন্য যেখানে এইরকম বিকাশ নিয়েছেন। আপনি উপরের চিত্রটি পরীক্ষা করতে পারেন। আমার নীতিমালার লগের গ্রেডিয়েন্ট নেওয়া দরকার । যেখানে আমার ক্ষেত্রে নীতিমালা সহজভাবে ওজন করে sigmoid। তবে উত্তরে আপনার গ্রেডিয়েন্টের সাথে আমার গ্রেডিয়েন্টের কিছু করা উচিত নয়। রাইট?
GensaGames

লক্ষ্য করুন যে কী পদক্ষেপ নেওয়া হয়েছিল সে সম্পর্কে আপনি কোনও তথ্য অন্তর্ভুক্ত করবেন না। পলিসি গ্রেডিয়েন্টস (স্লাইড 13) সম্পর্কিত এই বক্তৃতা অনুসারে আপডেটটি দেখতে হওয়া উচিত (action - probs) * sigmoid_grad(probs), তবে sigmoid_gradসিগময়েড গ্রেডিয়েন্টের সাথে বিলুপ্ত হওয়া সমস্যার কারণে আমি বাদ পড়েছি ।
পাভেল তিশেভস্কিই

এখানে ক্রুक्सটি সেই দিকটি নির্দেশ করে যা আমরা ওজন পরিবর্তন করতে চাই। যদি action = 1, আমরা ওজন বাড়িয়ে (ধনাত্মক গ্রেডিয়েন্ট) এর probsআরও কাছে যেতে চাই 1। যদি action=0, আমরা probsআরও কাছে যেতে চাই 0, সুতরাং ওজন হ্রাস (নেতিবাচক গ্রেডিয়েন্ট)।
পাভেল তিশেভস্কিই

1
যাই হোক না কেন, উপরের পরিবর্তনগুলি মোটেও কাজ করে না, আপনি কি পুরো ফাইলটি ভাগ করতে পারবেন? একই সময়ে, আমি স্পষ্ট নমুনা তৈরি করতে চাই, এবং এই ক্ষেত্রে সমস্যাটি বিলুপ্ত করার বিষয়ে চিন্তা করবেন না। এবং (action - probs)এটি একই যুদ্ধগুলি পরিবর্তনের অন্য একটি উপায়।
GensaGames
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.