Q学习(Q-learning)是一种价值迭代算法,它通过采样来学习动作价值函数Q,从而获得最优策略。
Q学习的主要思想是:
agents以ε-greedy策略选择动作,在环境中采样。
根据采样结果更新Q表中的 Q(s,a)值,使用下面的更新规则:
Q(s,a) = Q(s,a) + α * (r + γ * maxQ(s’,a’) – Q(s,a))
其中,α为学习率,γ为衰减因子,r为采样得到的immediate reward,maxQ(s’,a’)为下一状态s’下的最优动作值。
通过持续采样和更新,Q表逐渐逼近最优,最终得到最优策略。
Q学习的主要优点是:
可以直接应用到连续或高维状态空间,因采用采样的方法。
易于实现并且收敛快。
Q学习也存在一定的缺点:
学习过程容易受到噪声的影响,收敛于次优。
难以并行,因需要记忆过去状态。
需要大量采样,时间和空间复杂度较高。
代码示例:
python
import numpy as np
# 构建Cliff Walking环境
class CliffWalkingEnv():
def __init__(self):
self.x = 0 # 当前位置x坐标
self.y = 0 # 当前位置y坐标
def step(self, action):
# 左移
if action == 0:
self.x -= 1
# 右移
elif action == 1:
self.x += 1
# 下移
elif action == 2:
self.y -= 1
# 转移概率和奖励
if self.x < 0 or self.x > 11 or self.y < 0:
reward = -100
done = True
elif (self.x, self.y) == (0, 0) or (self.x, self.y) == (11, 0):
reward = 100
done = True
elif self.y == -1:
reward = -100
self.x, self.y = 0, 0 # 回到起点
done = False
else:
reward = -1
done = False
return self.x, self.y, reward, done
# Q学习算法
def q_learning(env, episodes=500, learning_rate=0.1, gamma=0.9, epsilon=0.1):
# 构建Q表
Q = np.zeros((12, 1))
# 采样episodes轮
for episode in range(episodes):
state = env.reset()
while True:
# ε-greedy策略选择动作
if np.random.uniform(0, 1) < epsilon:
action = np.random.choice(3)
else:
action = np.argmax(Q[state, :])
# 执行动作,获得反馈
next_state, next_y, reward, done = env.step(action)
# Q表更新
Q[state, action] += learning_rate * (reward + gamma *
np.max(Q[next_state, :]) - Q[state, action])
state = next_state
if done:
break
return Q
在这个示例中,我们构建了Cliff Walking环境,并实现了Q学习算法。通过在环境中采样和更新Q表,最终学习到最优的动作价值函数,得到最优策略。
Q学习作为一种重要的强化学习方法,它采用价值迭代的思想但通过采样来更新Q表,适用于连续状态空间的学习任务。