policy gradient可以直接输出action的概率来进行离散动作的选择,而对于连续动作空间,则需要直接输出动作的值,需要想办法将其转换为概率,方法就是输出一个action的分布(例如输出正态分布,就让模型输出 均值 和 方差 两个值即可),然后从该分布中采样一个action,进而计算该action在该分布中的概率,使用模型提高这个概率即可。
以下为连续动作空间的代码示例:
mean, std = actor(states)
action_distribution = torch.distributions.normal.Normal(mean, std)
action = action_distribution.sample() # 采样action
prob = action_distribution.log_prob(action) # 获取该action在输出分布中的概率,后面就是和离散型的一样了
_, reward, _, _, _env.step(action)
loss = reward * prob
loss.backward()
...
作为对比,以下为离散动作空间的代码:
action_probs = actor(states)
torch.distributions.Categorical(action_probs).sample()
action = torch.distributions.Categorical(action_probs).sample() # 采样action
_, reward, _, _, _env.step(action)
loss = reward * torch.log(action_probs)
loss.backward()
...