Q-learning

简介

Q-leaning是一种model-free(不需要对环境建立模型)的强化学习方法。Q-leaning的目标是学习一个策略(policy),用于指导代理(agent)对不同环境采取对应的行动。对任何有限阶段的马尔科夫决策过程,Q-learning可以找到最优策略以最大化总报酬的期望。

预备知识

强化学习涉及一个代理(agent),一个状态集合$S$,一个动作集合$A$。观测到某个状态$s_t\in S$后,agent选择一个动作$a_t\in A$,会得到环境的一个反馈报酬$r_t$,并且进入下一个状态$s_{t+1}$。

我们的目标是最大化未来总报酬,也就是在给定当前状态的条件下,未来报酬之和的期望。在实际应用中,常使用加权和,例如折扣准则,来计算未来总报酬。

Q-learning就是要学习函数$Q:S\times A\mapsto \mathbb{R}$,在某个状态$s_t$时,agent可以选择动作$a_t$使得$Q(s_t,a_t)$的值最大。

算法

Q-learning涉及的问题是如何学习$Q$函数,最简答的方法是维护一个大小为$|S|\times |A|$的表格,利用值迭代更新Q-table。具体的更新公式为:

每一次更新需要利用到$s_t$、$r_t$与$s_{t+1}$。

代码实现

import gym
import numpy as np 
# 1. Load Environment and Q-table structure
env = gym.make('FrozenLake8x8-v0')
Q = np.zeros([env.observation_space.n,env.action_space.n])
# env.obeservation.n, env.action_space.n gives number of states and action in env loaded

# 2. Parameters of Q-leanring
eta = .628
gma = .9
epis = 100
rev_list = [] # rewards per episode calculate

# 3. Q-learning Algorithm
for i in range(epis):
    # Reset environment
    s = env.reset()
    rAll = 0
    d = False
    j = 0

    # The Q-Table learning algorithm
    while j < 99:
        env.render()
        j+=1
        # Choose action from Q table
        a = np.argmax(Q[s,:] + np.random.randn(1,env.action_space.n)*(1./(i+1)))
        # Get new state & reward from environment
        s1,r,d,_ = env.step(a)
        # Update Q-Table with new knowledge
        Q[s,a] = Q[s,a] + eta*(r + gma*np.max(Q[s1,:]) - Q[s,a])
        rAll += r
        s = s1
        if d == True:
            break
    rev_list.append(rAll)
    env.render()

变种

  1. Deep Q-learning
  2. Double Q-learning
  3. Double Deep Q-learning
  4. Delayed Q-learning
  5. Greedly GQ
Your support will encourage me to continue to create.