【学习笔记】Lesson4-基于策略梯度求解RL(强化学习7日打卡营-世界冠军带你从零实践)

4.1 随机策略与策略梯度

4.1.1 Value-based & Policy-based

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gEJ2WUNj-1593166266004)(/home/kevinpang/Documents/强化学习——学习笔记/Lesson4/image-20200623122051595.png)]

常见的确定性策略有:Sarsa, Q-learning, DQN
常见的随机性策略有:Policy gradient

n

确定性策略优先优化Q网络,输出的是确定性的策略(结果)。
随机性策略输出的是不同动作的概率,在随机性的场景较为适用,比如小游戏剪刀石头布。

4.1.2 Softmax函数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LgS9MGaL-1593166266008)(/home/kevinpang/Documents/强化学习——学习笔记/Lesson4/image-20200623145804421.png)]

4.1.3 随机性策略举例

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zo4HzecE-1593166266009)(/home/kevinpang/Documents/强化学习——学习笔记/Lesson4/image-20200623150042897.png)]
> Episode(一轮)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vfGVOOtF-1593166266010)(/home/kevinpang/Documents/强化学习——学习笔记/Lesson4/image-20200623150424414.png)]

4.1.4 轨迹Trajectory——每个episode都有一条轨迹

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rgpjhbeK-1593166266011)(/home/kevinpang/Documents/强化学习——学习笔记/Lesson4/image-20200623150658182.png)]

Tip: 我们可以优化agent的选择,但不能控制环境的随机性。

4.1.5 期望回报——可通过采样n个episode来计算

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e8kQrQOc-1593166266012)(/home/kevinpang/Documents/强化学习——学习笔记/Lesson4/image-20200623155947688.png)]

4.1.6 优化策略函数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-97SZeqc9-1593166266013)(/home/kevinpang/Documents/强化学习——学习笔记/Lesson4/image-20200623154859057.png)]

4.1.7 策略梯度——增大高分数的概率

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-irhrUfqq-1593166266013)(/home/kevinpang/Documents/强化学习——学习笔记/Lesson4/image-20200623155219378.png)]

4.2 Policy Gradient算法

4.2.1 蒙特卡洛MC与时序差分TD

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-utSC8SQb-1593166266014)(/home/kevinpang/Documents/强化学习——学习笔记/Lesson4/image-20200623155706748.png)]

Gt 未来总收益之和

4.2.2 REINFORCE

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Uw9KgS05-1593166266015)(/home/kevinpang/Documents/强化学习——学习笔记/Lesson4/image-20200623160110376.png)]

公式推导补充
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mXW4tswc-1593166266027)(/home/kevinpang/Documents/强化学习——学习笔记/Lesson4/image-20200623165515419.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AniqvEuT-1593166266016)(/home/kevinpang/Documents/强化学习——学习笔记/Lesson4/image-20200623160547132.png)]

4.2.3 交叉熵——类比监督学习来理解Policy Gradient

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GwwWGqD7-1593166266017)(/home/kevinpang/Documents/强化学习——学习笔记/Lesson4/image-20200623160956093.png)]

4.2.4 Policy Gradient

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vcFIJN3j-1593166266017)(/home/kevinpang/Documents/强化学习——学习笔记/Lesson4/image-20200623161246038.png)]

Loss构造分析

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T2nyvk27-1593166266018)(/home/kevinpang/Documents/强化学习——学习笔记/Lesson4/image-20200623162141285.png)]

4.2.5 REINFORCE流程图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ESdguRXI-1593166266019)(/home/kevinpang/Documents/强化学习——学习笔记/Lesson4/image-20200623162453378.png)]

4.3 PARL Policy Gradient

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-79xXOYJQ-1593166266020)(/home/kevinpang/Documents/强化学习——学习笔记/Lesson4/image-20200623162722790.png)]

4.3.1 PARL Policy Gradient——model

import parl
from parl import layers


class Model(parl.Model):
    def __init__(self, act_dim):
        act_dim = act_dim
        hid1_size = act_dim * 10

        self.fc1 = layers.fc(size=hid1_size, act='tanh')
        self.fc2 = layers.fc(size=act_dim, act='softmax')

    def forward(self, obs):  # 可直接用 model = Model(5); model(obs)调用
        out = self.fc1(obs)
        out = self.fc2(out)
        return out

4.3.2 PARL Policy Gradient——algorithm

import paddle.fluid as fluid
import parl
from parl import layers


class PolicyGradient(parl.Algorithm):
    def __init__(self, model, lr=None):
        """ Policy Gradient algorithm
        
        Args:
            model (parl.Model): policy的前向网络.
            lr (float): 学习率.
        """

        self.model = model
        assert isinstance(lr, float)
        self.lr = lr

    def predict(self, obs):
        """ 使用policy model预测输出的动作概率
        """
        return self.model(obs)

    def learn(self, obs, action, reward):
        """ 用policy gradient 算法更新policy model
        """
        act_prob = self.model(obs)  # 获取输出动作概率
        # log_prob = layers.cross_entropy(act_prob, action) # 交叉熵
        log_prob = layers.reduce_sum(
            -1.0 * layers.log(act_prob) * layers.one_hot(
                action, act_prob.shape[1]),
            dim=1)
        cost = log_prob * reward
        cost = layers.reduce_mean(cost)

        optimizer = fluid.optimizer.Adam(self.lr)
        optimizer.minimize(cost)
        return cost

4.3.3 PARL Policy Gradient——agent

import numpy as np
import paddle.fluid as fluid
import parl
from parl import layers


class Agent(parl.Agent):
    def __init__(self, algorithm, obs_dim, act_dim):
        self.obs_dim = obs_dim
        self.act_dim = act_dim
        super(Agent, self).__init__(algorithm)

    def build_program(self):
        self.pred_program = fluid.Program()
        self.learn_program = fluid.Program()

        with fluid.program_guard(self.pred_program):  # 搭建计算图用于 预测动作,定义输入输出变量
            obs = layers.data(
                name='obs', shape=[self.obs_dim], dtype='float32')
            self.act_prob = self.alg.predict(obs)

        with fluid.program_guard(
                self.learn_program):  # 搭建计算图用于 更新policy网络,定义输入输出变量
            obs = layers.data(
                name='obs', shape=[self.obs_dim], dtype='float32')
            act = layers.data(name='act', shape=[1], dtype='int64')
            reward = layers.data(name='reward', shape=[], dtype='float32')
            self.cost = self.alg.learn(obs, act, reward)

    def sample(self, obs):
        obs = np.expand_dims(obs, axis=0)  # 增加一维维度
        act_prob = self.fluid_executor.run(
            self.pred_program,
            feed={'obs': obs.astype('float32')},
            fetch_list=[self.act_prob])[0]
        act_prob = np.squeeze(act_prob, axis=0)  # 减少一维维度
        act = np.random.choice(range(self.act_dim), p=act_prob)  # 根据动作概率选取动作
        return act

    def predict(self, obs):
        obs = np.expand_dims(obs, axis=0)
        act_prob = self.fluid_executor.run(
            self.pred_program,
            feed={'obs': obs.astype('float32')},
            fetch_list=[self.act_prob])[0]
        act_prob = np.squeeze(act_prob, axis=0)
        act = np.argmax(act_prob)  # 根据动作概率选择概率最高的动作
        return act

    def learn(self, obs, act, reward):
        act = np.expand_dims(act, axis=-1)
        feed = {
            'obs': obs.astype('float32'),
            'act': act.astype('int64'),
            'reward': reward.astype('float32')
        }
        cost = self.fluid_executor.run(
            self.learn_program, feed=feed, fetch_list=[self.cost])[0]
        return cost

4.3.4 PARL Policy Gradient——train

def main():
    env = gym.make('CartPole-v0')
    # env = env.unwrapped # Cancel the minimum score limit
    obs_dim = env.observation_space.shape[0]
    act_dim = env.action_space.n
    logger.info('obs_dim {}, act_dim {}'.format(obs_dim, act_dim))

    # 根据parl框架构建agent
    model = Model(act_dim=act_dim)
    alg = PolicyGradient(model, lr=LEARNING_RATE)
    agent = Agent(alg, obs_dim=obs_dim, act_dim=act_dim)

    # 加载模型
    # if os.path.exists('./model.ckpt'):
    #     agent.restore('./model.ckpt')
    #     run_episode(env, agent, train_or_test='test', render=True)
    #     exit()

    for i in range(1000):
        obs_list, action_list, reward_list = run_episode(env, agent)
        if i % 10 == 0:
            logger.info("Episode {}, Reward Sum {}.".format(
                i, sum(reward_list)))

        batch_obs = np.array(obs_list)
        batch_action = np.array(action_list)
        batch_reward = calc_reward_to_go(reward_list) # 计算未来总收益

        agent.learn(batch_obs, batch_action, batch_reward)
        if (i + 1) % 100 == 0:
            total_reward = evaluate(env, agent, render=True)
            logger.info('Test reward: {}'.format(total_reward))

Lesson4 小结

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1Afma58F-1593166266024)(/home/kevinpang/Documents/强化学习——学习笔记/Lesson4/image-20200623164448914.png)]

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值