Q-Learning详解

前言:
本文算是个人笔记,如有不足或需要讨论的,欢迎交流,邮箱即QQ。
有大佬知道如何搭网络的(如多少层和每层多少个神经元等参数怎么调),求请教。。

照例顶封面:


new2.jpg

强化学习简介:
image.png

Q-Learning是强化学习方法的一种。要使用这种方法必须了解Q-table(Q表)。
Q表是 状态-动作 与 估计的未来奖励 之间的映射表,如下图所示。(谁会做个好图的求教=-=)


image.png

纵坐标为状态,横坐标为动作,值为估计的未来奖励。
每次处于某一确定状态的时候,从表中查找此状态下最高未来奖励值的动作作为接下来的动作,若存在多个相同的值,则随机选择其中一个。一直重复,直到终点。

Q表的作用可看出是至关重要的。那么关键就在于如何获取一个可用的Q表。一般来说,我们的RL任务的模型都是未知的,不可以采用动态规划的方法。两种基本方法--蒙特卡洛(MC)和时间差分法(TD)。

蒙特卡洛(MC):
找了许多资料都没找到使用这方法的代码,所以只能从其定义出发说明是如何工作的。(有错误请指正)

  • 1:随机选取一个状态S开始游戏
  • 2:直到游戏终或者行动步数到达最大时,将获得的未来奖励(以目前表以及游戏每个状态本身的反馈奖励获得)。
  • 3:重复2步骤N次,所获得奖励的平均值为目前此状态S的新的未来奖励值(注意,可以使用目前平均值为新的值,直接覆盖旧的值。也可以新值与旧值加权求合)。对于(s,a)的未来奖励同理。
  • 4:重复1步骤,但要求每个状态s都能够被选到。
    很明显这要的时间相当多,所以这也应该是没人用他写代码的原因吧。

时间差分法(TD):
这个能做到每一步都更新一次,同时可以异步跟新(不用每次都要求所有状态更新一次来轮转,选到谁就更新谁,所以也要求每个状态都能够选到)。一般说的TD都指的是TD(0) (ps:为啥不叫TD(1)啊),即每次只往后看一步,这是什么意思呢,看了接下来的流程估计就懂了。(使用的都是(s,a)值)

  • 1:随机选取一个状态S开始游戏
  • 2:此s状态下选取a(根据贪婪 或者 ε-贪婪),并在动作a的状态下获得s‘,即下一状态。
  • 3:使用s状态下的反馈奖励以及s’的未来奖励更新s的未来奖励。(一般这两者与目前s状态的未来奖励加权求和)(ps: 这里就是sarsar与Qlearning的区别,s'是指s中通过策略抵达的下一状态,但此状态下也有许多的(s,a)值,该以哪个来更新呢?Qlearning中,选取最大的(s,a)为更新值。sarsar中,对所有(s,a)值求平均,作为更新值。这也是所谓的Qlearning高风险高收益,sarsar比较保守的原因。)
  • 4:重复1步骤,(但要求每个状态s都能够被选到。)
#Initialize table with all zeros
Q = np.zeros([env.observation_space.n,env.action_space.n])
# Set learning parameters
lr = .8
y = .95
num_episodes = 2000
#create lists to contain total rewards and steps per episode
#jList = []
rList = []
for i in range(num_episodes):
    #Reset environment and get first new observation
    s = env.reset()
    rAll = 0
    d = False
    j = 0
    #The Q-Table learning algorithm
    while j < 99:
        j+=1
        #Choose an action by greedily (with noise) picking from Q table
        a = np.argmax(Q[s,:] + np.random.randn(1,env.action_space.n)*(1./(i+1)))
        #Get new state and reward from environment
        s1,r,d,_ = env.step(a)
        #Update Q-Table with new knowledge
        Q[s,a] = Q[s,a] + lr*(r + y*np.max(Q[s1,:]) - Q[s,a])
        rAll += r
        s = s1
        if d == True:
            break
    #jList.append(j)
    rList.append(rAll)

这是网上找到的一个代码,每个episode运行99次动作,s最开始都是同一个地方,在这99次动作中,每次s产生的下个s1状态作为下一次的s,然后每次进行TD(0)更新。
注意,这里所用的是上面提到的TD(0),若想要TD(n) ,n>1,
(以上面代码为例)

  • 则应该在每次j下,还要添加n次循环,
  • n次循环的每一次都要用Q表选择a然后获得s‘,对每次获得的(s,a)加权求合,然后以此加权值更新当前的(s,a)。
  • 当然下一状态应该是第一次选a时所获得的状态s’。
    如果还是不懂的话,建议参考David Silver关于TD的那节(没记错的话是第五节的课)。或者是看An Introduction to RL - SuttonBook这本书中关于TD的部分。

目前为止,Qlearning所要讲的都讲完了,应该没有落下的。接下来就是DQN,将DQN必须要理解Qlearning以及神经网络的一些基本原理。

如果对你有帮助,请点个感谢,如果有问题,请私信。
照常:


微信图片_20190513121459.jpg

你可能感兴趣的:(Q-Learning详解)