그라디언트 정책 파생 이해


19

출처 리소스 Andrej Karpathy 블로그 에서 Policy Gradient의 매우 간단한 예를 재현하려고합니다 . 이 articale에서는 무게 및 Softmax 활성화 목록이있는 CartPole 및 Policy Gradient의 예제를 찾을 수 있습니다. 다음은 완벽하게 작동하는 CartPole 정책 그라디언트의 재현 된 매우 간단한 예입니다 .

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)

여기에 이미지 설명을 입력하십시오

.

.

질문

거의 동일한 예이지만 Sigmoid 활성화 (단순화를 위해)하려고합니다. 그것이 내가해야 할 전부입니다. 모델의 활성화를에서로 전환 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) Cartpole 및 Doom을 사용한 정책 그라디언트 소개

3) 정책 그라디언트 도출 및 REINFORCE 구현

4) 오늘의 기계 학습 트릭 (5) : 로그 파생 트릭 12


최신 정보

아래 답변이 그래픽에서 일부 작업을 수행 할 수있는 것 같습니다. 그러나 그것은 로그 확률이 ​​아니며 정책의 기울기가 아닙니다. 그리고 RL 그라디언트 정책의 전체 목적을 변경합니다. 위의 참조를 확인하십시오. 이미지를 따라 다음 진술.

여기에 이미지 설명을 입력하십시오

내가 취할 필요 내 정책의 로그 기능의 그라데이션 (단순히 무게와이다 sigmoid활성화).


4
이 질문은 Data Science Stack Exchange 에 게시하는 것이 좋습니다. 주로 이론적 인 질문이므로 (스택 오버플로는 주로 코딩 질문에 사용됩니다). 또한이 영역에 대해 잘 알고있는 더 많은 사람들에게 다가 갈 것입니다.
Gilles-Philippe Paillé

@ Gilles-PhilippePaillé 문제를 나타내는 코드를 추가했습니다. 내가해야 할 일은 활성화로 일부 부품을 수정하는 것입니다. 업데이트 된 답변을 확인하십시오.
GensaGames 2016

1
파생 정책 그라디언트에, 여기에 희망이 자세히 배울 수, 배열의 동일한 유형의 예를 작업하는 참조 기사입니다 : medium.com/@thechrisyoon/... .
Muhammad Usman

@MuhammadUsman. 정보 주셔서 감사합니다. 나는 그 소스를 붉게했다. 지금은 명확하고 위의 예제이며 활성화를에서 softmax로 변경하려고 합니다 signmoid. 그것은 위의 예에서해야 할 한 가지 일입니다.
GensaGames

2
@JasonChia sigmoid [0, 1]는 긍정적 행동의 가능성으로 해석 될 수있는 범위의 실수를 출력 합니다 (예 : CartPole에서 우회전). 그런 다음 부정적인 행동의 가능성 (왼쪽으로 돌림)은 1 - sigmoid입니다. 이 확률의 합은 1입니다. 예, 이것은 표준 폴 카드 환경입니다.
Pavel Tyshevskyi

답변:


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

원래 코드에서 SoftMax는 CrossEntropy loss 함수와 함께 사용되었습니다. 활성화를 Sigmoid로 전환하면 적절한 손실 함수가 Binary CrossEntropy가됩니다. 이제 grad방법 의 목적은 손실 함수 wrt의 기울기를 계산 하는 것입니다 . 무게. 스페어 링 세부 사항을 적절한 기울기에 의해 주어진다 (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

수행 된 작업에 대한 정보는 포함하지 않습니다. Policy Gradients (슬라이드 13) 에 대한 이 강의에 따르면 업데이트는 다음과 같아야 (action - probs) * sigmoid_grad(probs)하지만 sigmoid_grad시그 모이 드 그라디언트의 사라지는 문제 때문에 생략했습니다 .
Pavel Tyshevskyi

여기서 핵심은 가중치를 변경하려는 방향을 나타내는 것입니다. 경우 action = 1, 우리는 원하는 probs가까이로 1가중치 (양의 기울기) 증가. 이면 action=0probs더 가까워 지도록 0가중치가 감소합니다 (음의 기울기).
Pavel Tyshevskyi

1
어쨌든 위의 변경 사항이 전혀 작동하지 않습니다. 전체 파일을 공유 할 수 있습니까? 동시에 명확한 샘플을 만들고 싶습니다.이 경우 사라지는 문제는 신경 쓰지 않습니다. 그리고 (action - probs)그것은 같은 와이트를 바꾸는 또 다른 방법 일뿐입니다.
GensaGames
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.