本文已参与「新人创作礼」活动,一起开启掘金创作之路。
一、monta carlo
迭代时间:一个回合结束后, 对每个动作进行迭代
回合内行动策略:探索+利用
迭代公式:当前状态行动带来的收益()加一定比例的行动收益();行动收益等于后续所有动作的奖励乘折扣系数()之和减去当前状态行动带来的收益()
脚本实现:
s = env.reset()
done = False
# 进行游戏,直到回合结束
experience = []
while not done:
if render:
env.render()
a = self.policy(s, actions)
n_state, reward, done, info = env.step(a)
experience.append({"state": s, "action": a, "reward": reward})
s = n_state
else:
self.log(reward)
# 估计各种状态、行动
for i, x in enumerate(experience):
s, a = x["state"], x["action"]
# 计算状态s对应的折现值
G, t = 0, 0
for j in range(i, len(experience)):
G += math.pow(gamma, t) * experience[j]["reward"]
t += 1
N[s][a] += 1 # s, a 对的数量
alpha = 1 / N[s][a]
self.Q[s][a] += alpha * (G - self.Q[s][a])
monte calo每次都是针对行动轨迹进行迭代学习,为同策略学习。反应会相对较慢,相对保守。
二、Qlearning
迭代时间:每个动作之后就进行迭代
回合内行动策略:探索+利用
迭代公式:当前状态行动带来的收益()加一定比例的行动收益();
行动收益等于当前行动奖励()加折扣系数()乘以下一状态最大行动价值()减去当前状态行动带来的收益()
脚本实现:
s = env.reset()
done = False
while not done:
if render:
env.render()
a = self.policy(s, actions)
n_state, reward, done, info = env.step(a)
gain = reward + gamma * max(self.Q[n_state])
estimated = self.Q[s][a]
self.Q[s][a] += learning_rate * (gain - estimated)
s = n_state
else:
self.log(reward)
Q学习每次都用改状态下个最大奖励动作(不一定是当前动作)来进行更新,是异策略。表现的会更加的莽撞、激进。
三、SARSA
迭代时间:每个动作之后就进行迭代
回合内行动策略:探索+利用
迭代公式:当前状态行动带来的收益()加一定比例的行动收益();
行动收益等于当前行动奖励()加折扣系数()乘以下一状态行动价值()减去当前状态行动带来的收益()
和Qlearn的唯一区别就是学习的是下一状态的行动价值,是同策略的迭代学习
四、ActorCritic
迭代时间:每个动作之后就进行迭代
回合内行动策略:探索+利用
特殊构造:Actor负责探索(), Critic负责评估状态价值()。
迭代公式:
当前状态行动带来的收益()加一定比例的行动收益(td_t);
行为收益等于当前行动奖励()加上一定比例()的下一状态的价值()减去当前状态的价值()
脚本实现:
s = env.reset()
done = False
while not done:
if render:
env.render()
a = actor.policy(s)
n_state, reward, done, info = env.step(a)
gain = reward + gamma * critic.V[n_state]
estimated = critic.V[s]
td = gain - estimated
actor.Q[s][a] += learning_rate * td
critic.V[s] += learning_rate * td
s = n_state
else:
actor.log(reward)