完整代码:https://github.com/Connor666/flappy_bird-RL
首先,如果你是为了追求一个非常高的强化学习效果,也就是flappy bird的分数,那么建议出门右拐选择DQN,但是如果你是为了通过一个项目,想详细了解Qleaning的原理,以及如何建立一个强化学习的模型,那么你来对地方了。
本文的代码可在我个人的gitHub上找到完整版,由于代码较长文件较多,我这边这讲解跟算法相关的关键代码。完整代码请看:https://github.com/Connor666/flappy_bird-RL
首先感谢,flappy bird游戏Python代码制作人sourabhv本游戏的代码是基于这个代码而修改的,以及我老师Dr Luke Dickens提供的一些建议。
1.什么是Q learning
强化学习是机器学习中的一个领域,强调如何基于环境而行动,以取得最大化的预期利益。其灵感来源于心理学中的行为主义理论,即有机体如何在环境给予的奖励或惩罚的刺激下,逐步形成对刺激的预期,产生能获得最大利益的习惯性行为.而为了实现强化学习,Qlearning是其中的一个主要算法。
作为一个强化学习问题,有几个要素时必须的:状态(state),奖励(reward)以及动作(action) 具体如何定义和制定这三个要素我们再后面会讲到。
对于Qlearning而言:
上图中的s,a,r分别为状态,动作与奖励。
每次采取一个动作时,会产生一个新的状态以及奖励,根据以上公式来更新Q表(Q-table),进而在下一次根据这个更新后的Q表来选取动作,在Qlearning中每次选取动作是根据一个叫贪心算法(greedy policy) 而选取行动的,贪心算法会在下一个部分提到。可以注意到,每次更新Q表的时候,是根据下一个状态选取了Q表最大的更新的,这一点与SARSA不同,也因此被叫做off-policy。
用代码表示如下:
def q_learning(
env, gamma, alpha, epsilon, num_episodes,Qtable, max_steps=np.inf):
num_states = env.num_states
num_actions = env.num_actions
policy = get_soft_greedy_policy(epsilon, Qtable)
for _ in range(num_episodes):
# initialise state
s = env.reset()
steps = 0
done = False
while not env.is_terminal() and steps < max_steps:
# choose the action
a = choose_from_policy(policy, s)
next_s, r = env.next(a)
# update the Q function estimate
Qtable[s, a] += alpha * (r + gamma * np.max(Qtable[next_s, :]) - Qtable[s, a])
# update the policy (only need to do so for current state)
policy[s, :] = get_soft_greedy_policy(
epsilon, Qtable[s, :].reshape(1,num_actions))
s = next_s
steps += 1
# return the policy
return Qtable
2. Greedy policy
贪婪算法,举个直观的例子,加入开左边门你可以获得10元,开右边你会获得1元,你会怎么选?你肯定会选择开左边的门,因此greedy policy的逻辑就是每次选取的时候都会选取能获利最大的地方。
但是这样并不一定有利于机器学习,因为这样会让机器无论在任何情况下都去开左边的门,这样右边门的情况完全不了解,或许在右边门开了100此后收益增加到了50元呢。因此就有了ε-Soft Policies:
有ε概率,会在每一次采取动作的时候随机采取动作:
用代码写出来:
def get_soft_greedy_policy