【强化学习】Q-Learning


强化学习笔记,内容来自 刘建平老师的博客

Q-Learning(off-policy)

概述

关键词: 时序差分、model-free、off-policy、ϵ-greedy、价值迭代

​ 给定强化学习的5个要素:状态集S, 动作集A, 即时奖励R,衰减因子γ, 探索率ϵ, 求解最优的动作价值函数q∗和最优策略π∗

​ 通过价值函数的更新,来更新策略,通过策略来产生新的状态和即时奖励,进而更新价值函数。一直进行下去,直到价值函数和策略都收敛。

​ 首基于状态S,用ϵ−greedy策略选择到动作A,然后执行动作A,得到奖励R,并进入状态S′,此时如果是Sarsa,会继续基于状态S′,用ϵ−greedy策略选择A′,然后来更新价值函数。但是Q-Learning则不同。对于Q-Learning,它基于状态S′,没有使用ϵ−greedy策略而是使用贪婪策略选择A′,也就是说,选择使Q(S′,a)最大的a作为A′来更新价值函数而不存在探索的可能:
image-20210716184143826

off-policy:

​ 价值函数的更新和新动作的选择使用两个不同的策略policy,Q-learning按照ε-greedy策略选择动作、按照贪婪greedy策略更新 价值函数,即更新价值函数的公式中用的A‘ 是贪婪策略选择的而不是ε-greedy。这是Q-learning与Sarsa的本质区别。

 

算法流程

输入:迭代轮数T、状态集S、动作集A、步长α、衰减因子γ、探索率ϵ

输出:所有的状态和动作对应的价值Q

​ 1. 随机初始化所有的状态和动作对应的价值Q,终止状态的Q初始化为0

​ 2. for i in [ 1, T ]:

​ a)初始化S为当前序列的第一个状态

​ b)用ε-greedy策略在当前状态S选择出动作A

​ c)执行动作A,由环境得到新状态S’ 和奖励R

​ d)按公式更新价值函数

​ e)前进一步:S = S’

​ f)if S’是终止状态,break;else 跳回步骤b

 

Q-Learning vs Sarsa

​ Q-Learning直接学习的是最优策略,而Sarsa在学习最优策略的同时还在做探索。这导致在学习最优策略的时候,如果用Sarsa,为了保证收敛,需要制定一个策略,使ϵ−greedy策略的超参数ϵ在迭代的过程中逐渐变小。Q-Learning没有这个烦恼。

另外一个就是Q-Learning直接学习最优策略,但是最优策略会依赖于训练中产生的一系列数据,所以受样本数据的影响较大,因此受到训练数据方差的影响很大,甚至会影响Q函数的收敛。Q-Learning的深度强化学习版Deep Q-Learning也有这个问题。

在学习过程中,Sarsa在收敛的过程中鼓励探索,这样学习过程会比较平滑,不至于过于激进,导致出现像Q-Learning可能遇到一些特殊的最优“陷阱”。比如经典的强化学习问题"Cliff Walk"。

在实际应用中,如果是在模拟环境中训练强化学习模型,推荐使用Q-Learning,如果是在线生产环境中训练模型,则推荐使用SARSA。

 

小结

​ 对于Q-Learning和Sarsa这样的时序差分算法,对于小型的强化学习问题是非常灵活有效的,但是在大数据时代,异常复杂的状态和可选动作,使Q-Learning和Sarsa要维护的Q表异常的大,甚至远远超出内存,这限制了时序差分算法的应用场景。在深度学习兴起后,基于深度学习的强化学习开始占主导地位。

### Q-learning 强化学习算法原理 Q-learning 属于基于值函数的强化学习算法,主要目的是学习一个最优的行为价值函数(Q 函数)。该函数表示在给定状态下采取特定动作所能获得的最大预期回报。此方法允许智能体无需事先知道环境模型即可做出决策[^1]。 #### 行动价值函数更新规则 核心在于利用贝尔曼方程迭代地调整 Q 值: \[ Q(s_t, a_t) \leftarrow Q(s_t, a_t) + \alpha [r_{t+1}+\gamma\max_a Q(s_{t+1},a)-Q(s_t,a_t)] \] 其中 \( s_t \) 和 \( a_t \) 分别代表当前的状态和所选的动作;\( r_{t+1} \) 是执行动作后的即时奖励;而参数 \( \alpha \in (0, 1] \) 控制新旧信息融合的程度,即学习率;折扣因子 \( \gamma \in [0, 1] \) 则用于平衡短期收益长期利益之间的关系[^3]。 ### 面向对象实现方式 下面是一个简单的 Python 类定义来模拟 Q-learning 过程: ```python import numpy as np class QLearningAgent: def __init__(self, actions, learning_rate=0.01, discount_factor=0.9, epsilon=0.1): self.actions = actions self.q_table = {} self.learning_rate = learning_rate self.discount_factor = discount_factor self.epsilon = epsilon def choose_action(self, state): if np.random.rand() < self.epsilon: action = np.random.choice(self.actions) else: q_values_of_state = self.get_q_values(state) max_q_value = max(q_values_of_state.values()) actions_with_max_q_value = [ k for k, v in q_values_of_state.items() if v == max_q_value] action = np.random.choice(actions_with_max_q_value) return action def learn(self, state, action, reward, next_state): current_q_value = self.get_q_value(state, action) future_optimal_reward = max( list(self.get_q_values(next_state).values()) or [0]) new_q_value = current_q_value + \ self.learning_rate * \ (reward + self.discount_factor * future_optimal_reward - current_q_value) self.set_q_value(state, action, new_q_value) def get_q_values(self, state): return self.q_table.setdefault(str(state), {action: 0.0 for action in self.actions}) def set_q_value(self, state, action, value): self.get_q_values(state)[str(action)] = value def get_q_value(self, state, action): return self.get_q_values(state).get(str(action)) ``` 这段代码展示了如何创建一个可以进行自我训练并不断优化其行为模式的学习代理程序。 ### 应用实例分析 为了更好地理解 Q-learning 的应用场景,考虑一个迷宫逃脱的例子。在这个例子中,有一个由墙壁围成的空间网格图作为环境设定,存在起点位置以及终点位置。智能体会尝试找到从起始点到终止点的最佳路径,在这个过程中会遇到障碍物和其他挑战。每当到达新的格子时就会得到相应的分数反馈,直到最终成功抵达目的地为止[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值