强化学习——Q-Learning算法原理

一、Q-Learning :异策略时序差分控制

从决策方式来看,强化学习可以分为基于策略的方法(policy-based)和基于价值的方法(value-based)。基于策略的方法直接对策略进行优化,使制定的的策略能够获得最大的奖励。基于价值的强化学习方法中,智能体不需要制定显式的策略,它维护一个价值表格或价值函数,通过这个价值表格或价值函数来选取价值最大的动作。
Q-Learning 算法就是一种value-based的强化学习算法。

二、算法思想:

Q(s,a)是状态价值函数,表示在某一具体初始状态s和动作a的情况下,对未来收益的期望值。
Q-Learning算法维护一个Q-table,Q-table记录了不同状态下s(s∈S),采取不同动作a(a∈A)的所获得的Q值。

Q-tablea1a2a3
s1Q(s1,a1)Q(s1,a2)Q(s1,a3)
s2Q(s2,a1)Q(s2,a2)Q(s2,a3)
s3Q(s3,a1)Q(s3,a2)Q(s3,a3)

探索环境之前,初始化Q-table,当agent与环境交互的过程中,算法利用贝尔曼方程(ballman equation)来迭代更新Q(s,a),每一轮结束后就生成了一个新的Q-table。agent不断与环境进行交互,不断更新这个表格,使其最终能收敛。最终,agent就能通过表格判断在某个转态s下采取什么动作,才能获得最大的Q值。

三、更新过程

更新方法:
Q ( s t , a t ) ← Q ( s t , a t ) + α [ r t + 1 + γ max ⁡ a Q ( s t + 1 , a ) − Q ( s t , a t ) ] Q(s_t,a_t) \leftarrow Q(s_t,a_t) + \alpha [r_{t+1}+ \gamma \max_aQ(s_{t+1},a) - Q(s_t,a_t) ] Q(st,at)Q(st,at)+α[rt+1+γamaxQ(st+1,a)Q(st,at)]

Q ( s t , a t ) {\color{Red} Q(s_t,a_t)} Q(st,at) 是在状态 s t s_t st下采取动作 a t a_t at的长期回报,是一个估计Q值

r t + 1 {\color{Red} r_{t+1}} rt+1 是在状态 s t s_t st下执行动作 a t a_t at得到的回报reward

max ⁡ a Q ( s t + 1 , a ) {\color{Red} \max_aQ(s_{t+1},a)} maxaQ(st+1,a) 指的是在状态 s t + 1 s_{t+1} st+1下所获得的最大Q值,直接看Q-table,取它的最大化的值。 γ \gamma γ折扣因子,含义是看重近期收益,弱化远期收益,同时也保证Q函数收敛。

( r t + 1 + γ max ⁡ a Q ( s t + 1 , a ) {\color{Red} (r_{t+1}+ \gamma \max_aQ(s_{t+1},a)} (rt+1+γmaxaQ(st+1,a) 即为目标值,就是时序差分目标,是 Q ( s t , a t ) Q(s_t,a_t) Q(st,at) 想要逼近的目标。 α \alpha α学习率,衡量更新的幅度。

当目标值和估计值的差值趋于0的时候,Q(s,a)就不再继续变化,Q 表趋于稳定,说明得到了一个收敛的结果。这就是算法想要达到的效果。

注意: max ⁡ a Q ( s t + 1 , a ) {\color{Red} \max_aQ(s_{t+1},a)} maxaQ(st+1,a)所对应的动作不一定是下一步会执行的实际动作!
这里引出 ε − g r e e d y {\color{Red} \varepsilon-greedy} εgreedy,即 ε − \varepsilon- ε贪心算法。
在智能体探索过程中,执行的动作采用 ε − g r e e d y {\color{Red} \varepsilon-greedy} εgreedy策略,是权衡exploitation-exploration(利用和探索)的超参数。

  • exploration:探索环境,通过尝试不同的动作来得到最佳策略(带来最大奖励的策略)
  • exploitation:不去尝试新的动作,利用已知的可以带来很大奖励的动作。Q-Learning算法中,就是根据Q-table选择当前状态下能使Q值最大的动作。

在刚开始的时候,智能体不知道采取某个动作后会发生什么,所以只能通过试错去探索。利用是指直接采取已知的可以带来很好奖励的动作。这里面临一个权衡问题,即怎么通过牺牲一些短期的奖励来理解动作,从而学习到更好的策略。因此,提出 ε − g r e e d y \varepsilon-greedy εgreedy ε \varepsilon ε就是权衡这两方面的超参数。

这篇博客https://blog.csdn.net/zhm2229/article/details/99351831对这部分的理解讲的很好,在此引用一下:

做exploitation和exploration的目的是获得一种长期收益最高的策略,这个过程可能对short-term reward有损失。如果exploitation太多,那么模型比较容易陷入局部最优,但是exploration太多,模型收敛速度太慢。这就是exploitation-exploration权衡。

比如我们设 ε \varepsilon ε=0.9,随机化一个[0,1]的值,如果它小于 ε \varepsilon ε,则进行exploration,随机选择动作;如果它大于 ε \varepsilon ε,则进行exploitation,选择Q value最大的动作。
在训练过程中, ε \varepsilon ε在刚开始的时候会被设得比较大,让agent充分探索,然后 ε \varepsilon ε逐步减少,agent会开始慢慢选择Q value最大的动作

三、伪代码

在这里插入图片描述
图源于:百度飞桨AlStudio


参考:
[1] 王琦.强化学习教程[M]
[2] https://blog.csdn.net/zhm2229/article/details/99351831

### Q-learning算法详解 #### 原理 Q-learning属于基于值的强化学习方法,目标是在给定状态下找到使累积奖励最大化的行动策略。该算法通过迭代更新Q函数(即状态-动作价值函数),从而逐渐逼近最优解[^1]。 对于每一个可能的状态\(s\)和动作\(a\), Q-learning维护一个表格形式的价值评估表——Q-table,其中存储着对应于每一对(s,a)组合下的预期未来回报量级。随着时间推移以及更多经验积累,Q-learning会不断调整这个表格内的数值直到它们稳定下来表示长期平均收益的最佳预测[^2]。 更新规则如下所示: \[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)]\] 这里,\(\alpha\)代表学习率;\(r_{t+1}\)是即时奖励;而\(\gamma\)则用来折现未来的奖励影响程度。\(\max _{a'} Q(s_{t+1}, a')\)选取下一个时刻所能达到的最大期望回报作为当前决策依据的一部分[^3]。 ```python import numpy as np class QLearningAgent(object): def __init__(self, alpha=0.5, gamma=0.9, epsilon=0.1): self.q_table = {} self.alpha = alpha # 学习速率 self.gamma = gamma # 折扣因子 self.epsilon = epsilon # 探索概率 def choose_action(self, state, actions): """根据epsilon-greedy策略选择行为""" if np.random.rand() < self.epsilon: action = np.random.choice(actions) else: q_values_of_state = self.get_q_values(state) max_q_value = max(q_values_of_state.values()) best_actions = [action for action, value in zip( list(q_values_of_state.keys()), list(q_values_of_state.values())) if value==max_q_value] action = np.random.choice(best_actions) return action def get_q_values(self,state): """获取指定状态对应的q-value字典""" if str(state) not in self.q_table: self.q_table[str(state)]={} return self.q_table[str(state)] def learn(self, s, a, r, next_s,next_a=None): """执行一次学习过程""" old_q=self.get_q_values(s).get(a,0.) future_max_q=max([v for k,v in self.get_q_values(next_s).items()] or [None]) new_q=(1-self.alpha)*old_q+self.alpha*(r+(future_max_q if future_max_q is not None else 0)) self.get_q_values(s)[a]=new_q if __name__=='__main__': agent=QLearningAgent() ``` #### 应用场景 Q-learning已被成功应用于多种领域内复杂问题求解之中: - **游戏**: 如Atari视频游戏操作优化; - **机器人技术**: 自动驾驶车辆路径规划、机械臂抓取物体等任务自动化处理; - **资源分配**: 能源管理系统中电力调度方案设计; - **金融投资**: 组合构建与风险管理等领域也可见到其身影.
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值