莫烦强化学习笔记整理(六) Policy Gradients
实现代码链接: 7_Policy_gradient_softmax.
1、Policy Gradients基本算法
(1)与Value-based 方法的区别
Policy Gradients区别于Value-based 方法(Q-learning和Sarsa等)最大的不同是:输出的不是 action 的 value, 而是具体的 action。
Policy Gradients最大的一个优势是: 输出的这个 action 是一个连续的值, 可以在一个连续分布上选取 action。
Policy Gradients的核心思想:
假设现在状态为state,可选行为有A,B两种,通过现有的神经网络分析,选择了A行为,直接进行反向传递增加下次A行为被选的几率,此时reward反馈A行为不好,那么动作可能性增加的幅度随之被减低;同理如果选择了B行为,直接进行反向传递增加下次B行为被选的几率,此时reward反馈B行为很好,那么动作可能性增加的幅度随之被提高。
(2)REINFORCE 基本算法
REINFORCE是一种基于整条回合数据的更新
delta(log(Policy(s,a))*V) 表示在 状态 s 对所选动作 a 的吃惊度, Policy(s,a) 概率越小, 反向的 log(Policy(s,a)) (即 -log(p)) 越大. 如果 Policy(s,a) 很小的情况下, V很大, 那 -delta(log(Policy(s, a))*V) 就更大, 表示更吃惊。
Policy(s,a) 概率小表示选了一个不常选的动作, V大指的是得到了一个好的 reward, 此时需要对参数进行大幅修改。
(3)主要更新循环代码
Policy Gradients是计算机跑完一整个回合才更新一次, 之前的 Qleanring 等是在回合中每一步都可以更新参数。
for i_episode in range(3000):
observation = env.reset()
while True:
if RENDER: env.render()
action = RL.choose_action(observation)
observation_, reward, done, info = env.step(action)
RL.store_transition(observation, action, reward) # 存储这一回合的 transition
if done:
ep_rs_sum = sum(RL.ep_rs)
if 'running_reward' not in globals():
running_reward = ep_rs_sum
else:
running_reward = running_reward * 0.99 + ep_rs_sum * 0.01
if running_reward > DISPLAY_REWARD_THRESHOLD: RENDER = True # 判断是否显示模拟
print("episode:", i_episode, " reward:", int(running_reward))
vt = RL.learn() # 学习, 输出 vt
if i_episode == 0:
plt.plot(vt) # plot 这个回合的 vt
plt.xlabel('episode steps')
plt.ylabel('normalized state-action value')
plt.show()
break
observation = observation_
2、思维决策
(1)Policy Gradients代码主结构
class PolicyGradient:
# 初始化 (有改变)
def __init__(self, n_actions, n_features, learning_rate=0.01, reward_decay=0.95, output_graph=False):
# 建立 policy gradient 神经网络 (有改变)
def _build_net(self):
# 选行为 (有改变