简介
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()
变种
- Deep Q-learning
- Double Q-learning
- Double Deep Q-learning
- Delayed Q-learning
- Greedly GQ