Policy Gradient算法实战

Policy-based方法是强化学习中与Value-based(比如Q-learning)相对的方法,主要是对一个回合(episode)的策略进行梯度下降,相关基础参考Datawhale-Policy Gradient
其中REINFORCE是一个最基本的Policy Gradient方法,主要解决策略梯度无法直接计算的问题,参考REINFORCE和Reparameterization Trick,其伪代码如下:
在这里插入图片描述
程序源码参考github,下面简要解释一下。
首先可以看REINFORCE和Reparameterization Trick的REINFORCE部分,

REINFORCE的基本流程如下:

# from torch.distributions import Bernoulli
from torch.distributions import Categorical
probs = policy_network(state)
# Note that this is equivalent to what used to be called multinomial
m = Categorical(probs)
action = m.sample()
next_state, reward = env.step(action)
loss = -m.log_prob(action) * reward
loss.backward()

所以这里需要定义一个policy_network(具体在model.py中),输入为state,输出为一个概率,用于action的采样,policy_network如下:

class FCN(nn.Module):
    ''' 全连接网络'''
    def __init__(self,state_dim):
        super(FCN, self).__init__()
        # 24和36为hidden layer的层数,可根据state_dim, n_actions的情况来改变
        self.fc1 = nn.Linear(state_dim, 36)
        self.fc2 = nn.Linear(36, 36)
        self.fc3 = nn.Linear(36, 1)  # Prob of Left

    def forward(self, x):
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = F.sigmoid(self.fc3(x))
        return x

然后它是需要一个trajectory的state,action和reward进行梯度下降的,所以在训练的过程中需要用一个pool来存储:

'''下面带pool都是存放的transition序列用于gradient'''
    state_pool = [] # 存放每batch_size个episode的state序列
    action_pool = []
    reward_pool = [] 

也可以存储不止一个episode的数据到pool中,可以设置程序中的batch_size每次对多个trajectory的数据进行梯度下降,实验表明batch_size=5的效果比较好。
然后定义一个类PolicyGradient,主要包括choose_action(选择动作)和update(更新网络或者说学习),具体见agent.py ,最后在main.py完善主程序接口就可以了,结果如下(可以使用tensorboard可视化):
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值