强化学习(四)--DDPG算法

本文介绍了DDPG算法,包括其工作原理、Actor和Critic网络的职责,以及如何通过损失函数进行网络优化。此外,文章还提供了DDPG算法的代码实现,并展示了在‘Pendulum-v0’环境中的应用效果,验证了算法的有效性。


上一篇文章介绍了PG算法大类的Reinforce算法,它是一种基于MC更新方式的算法,而它的另一大类是基于Actor-Critic算法,它是一种基于TD更新方式的算法。这一篇文章就来介绍AC算法中应用最多的DDPG算法,它可以直接输出确定性的连续形动作。

1. DDPG算法

详细的算法介绍还是推荐科老师的课程(公开课地址),TD更新方式是指每一个episode的每一个step都进行算法的更新。

DDPG算法有Actor网络和Critic网络,Actor网络输出浮点数,表示确定性的策略,Critic网络则是负责对Actor网络输出的动作进行评价(也就是我们常用的Q值),它的结构图如下图:

  • Actor网络: 根据Critic网络的评分来更新策略网络;
  • Critic网络: 在每一个step对Actor网络输出的动作评分,根据与环境的reward来调整网络的评估策略,最大化未来总收益。
    在这里插入图片描述
    因此,可以得出优化Actor网络、Critic网络的Loss函数为:
    - Actor网络:Loss = -Q;
    - Critic网络:Loss = MSE(Q估计,Qtarget).

要注意的是,也可以将DQN中的Target NetworkReplay Memory引入到DDPG中,因此需要建立四个神经网络:Critic网络、Target_Critic网络、Actor网络、Target_Actror网络。因此,整个DDPG的框架如下图:
在这里插入图片描述

这个框架很清晰的讲解了DDPG算法的核心,可以多看几遍深入了解。

2. DDPG算法代码

如果搞懂了DDPG算法的核心内容,要实现它还是挺容易的,参考前几节的DQN算法,这里直接上完整代码,结合注释很清晰的能看懂:

import torch
import torch.nn as nn
import torch.nn.functional as F
import numpy as np
import gym



#####################  hyper parameters  ####################
EPISODES = 1000    # 进行多少个Episode
STEPS = 200        # 每个Episode进行多少step
TEST = 5           # 测试时进行多少个Episode
LR_ACTOR = 0.001   # Actor和Critic的学习率
LR_CRITIC = 0.002
GAMMA = 0.9
MEMORY_CAPACITY = 10000  # 经验池的大小
BATCH_SIZE = 32       # 从经验池中取出每个bath的数量
ENV_NAME = 'Pendulum-v0'
env = gym.make(ENV_NAME)
env = env.unwrapped   # 用env.unwrapped可以得到原始的类,原始类想step多久就多久,不会200步后失败:
env.seed(1)           # 随机种子
s_dim = env.observation_space.shape[0]   # 状态的个数
a_dim = env.action_space.shape[0]        # 动作的个数
a_bound = env.action_space.high          # 动作的上下限
a_low_bound = env.action_space.low
TAU = 0.01            # 用于target网络软更新的参数
########################## DDPG Framework ######################
# # # # Actor策略网络的模型,2层全连接层 # # # #
class ActorNet(nn.Module):
    def __init__(self, s_dim, a_dim):
        super(ActorNet, self).__init__()
        self.fc1 = nn.Linear(s_dim, 30)
        self.fc1.weight.data.normal_(0, 0.1)  # initialization of FC1
        self.out = nn.Linear(30, a_dim)
        self.out.weight.data.normal_(0, 0.1)  # initilizaiton of OUT

    def 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值