我是靠谱客的博主 仁爱人生,最近开发中收集的这篇文章主要介绍qlearning算法_强化学习系列Q Learning,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

上一篇介绍了强化学习的一些基本概念强化学习系列--概念介绍(Introduction to Reinforcement Learning),今天我们讲解一个简单且经典的强化学习算法:Q-Learning。

背景

按照不同分类标准,Q Learning可以被分为:model-free,off-policy,value-based,TD等类别。

Q Learning算法思想主要是去学习一个纵坐标为状态(state)、横坐标是动作(action)、取值为当前状态下执行对应action时所获得的奖励(短期激励+长期收益)的Q-table矩阵。我们通过大量试错获取经验(reward)来更新Q-table,最终通过Q-table中记录的奖励情况来指导某个state执行哪个action可以获取最大收益。

举个例子: 一个小朋友(agent)假设无任何历史奖惩经验,那么Q-table中每个元素初使值都为0。

当小朋友还没做完作业状态时(state1),去学习(action1)还是去看电视(action2)得到父母的奖励是不一样的,学习的奖励会是一个棒棒糖(+2),看电视的奖励将会是挨揍一顿(-2)。

当小朋友已经做完作业时(state2),去学习(action 1)还是去看电视得到的奖励又会和state1的情况有所不同,此时学习的奖励为+1,看电视奖励会是-1。

...

多次经验总结后,Q-table的取值更新如下:

94ec929567bf2838a15aebb1728fae4c.png

要特别说明的是,Q(s, a)除了代表本次(s, a)操作获得的reward外,还考虑未来的收益。即:Q(s, a) = reward(本次s-a操作) + Q(未来奖励)。

算法思想

bfab650b63375a5f4aa25a2b17bbea0f.png

Q-Learning的逻辑如上图,大致流程为:

1)随机选取一个状态S

2)在此S状态下,根据贪婪( 或者 ε-贪婪)选取动作 A

3)执行动作A,并根据enviroment的反馈获取reward R和下一状态S'

4)根据贪心算法,选取S’状态下reward最大的action a’。然后,使用(S,A)状态下的反馈奖励R以及(s',a')的未来奖励(Q值)采用时序差分方法(TD)更新Q(s,a)的状态奖励值

5)更新状态S

6)重复1步骤,直至Q-table内取值均收敛

代码逻辑

针对上面算法思想,我们看看代码是如何执行的,代码非常简单,就选action和更新Q-table两个主要function。备注:代码摘自莫烦github。

class QLearningTable:    def __init__(self, actions, learning_rate=0.01, reward_decay=0.9, e_greedy=0.9):        self.actions = actions  # action 列表        self.lr = learning_rate  # step4中alpha        self.gamma = reward_decay  # step4中gamma        self.epsilon = e_greedy  # step2中e-greedy概率        self.q_table = pd.DataFrame(columns=self.actions, dtype=np.float64)    def choose_action(self, observation):   # step 2        # action selection        if np.random.uniform()             # 选取Q最大的action            state_action = self.q_table.loc[observation, :]            # 存在Q值相同的多个action,随机选取一个            action = np.random.choice(state_action[state_action == np.max(state_action)].index)        else:  # 命中exploration,随机选取action            # 随机选action            action = np.random.choice(self.actions)        return action    def learn(self, s, a, r, s_):        self.check_state_exist(s_)  # 确认s是否是有效状态        q_predict = self.q_table.loc[s, a]  # 从Q-table中获取预估值Q(s, a)        if s_ != 'terminal’:              q_target = r + self.gamma * self.q_table.loc[s_, :].max()  # 实际的Q(s, a) = 短期环境奖励r + 长期激励Q(s',max_a)        else:            q_target = r # 如果下一状态游戏结束,Q(s, a)便只有当前奖励,没有未来奖励(游戏已结束,没有未来的操作)        self.q_table.loc[s, a] += self.lr * (q_target - q_predict) # update

实例介绍

介绍完代码思想,我再介绍一个Q-Learning的实际例子,供大家熟悉:

假设一栋建筑里有5个房间(已编号0-4),房间之间通过门相连,如下图(左图)所示。我们的目标是要走出房间,走出房间(室外编号为5)则可获得奖励100。我们对房间的连通情况进行抽象,如下图右图。

d9d1ba639c4e81e25f805cf26ba36839.png  856a940e19704f8da249cbfdbd154a38.png

针对上述状态转移过程,我们可以以状态为行,动作为列,构建一个关于(s,a)的reward值的矩阵R如下图,其中-1表示空值。

fdc5191559abe31e2e7f454c91f42b91.png

算法转移规则:47b5296a8fcf269970fa1d8d0bff79a9.png,其中s,a表示当前的状态和动作, s',a' 表示下一个状态及行为,折扣系数 617c79a880b420a026a9fb56de0d9151.png

ok,前期背景已经介绍妥当,我们手撕Q-learning。

首先,令折扣系数为 0.8 ,初始状态为房间1,并将Q初始化全零矩阵。初始化Q-table矩阵,全部置为0,如下:

cb3c9ff957e2826198e1d95ef789096a.png

假设,我们随机选取state为房间1(state1),那么根据reward矩阵R可得:

Q(1, 5) = R(1, 5) + 0.8 * Max[Q(5, 1), Q(5, 4), Q(5, 5)] = 100 + 0.8 * 0 = 100

到达目标状态,一次episode完成,Q表更新为:

2df41a62c5465ad3c5510990551a7193.png

重新开始一次episod,本次我们随机选取房间为3(state3),那么根据reward矩阵R可得:

Q(3, 1) = R(3, 1) + 0.8 * Max[Q(1, 3), Q(1, 5)] = 0 + 0.8 * Max(0, 100) = 80

Q表更新为,

0556b21764ad47bb61ea877f2b595a00.png

经过多个episode的多轮迭代,矩阵Q最终收敛成:

e988d2d6dd328a5c825e219ee9e941a8.png

归一化后为:

b65e8ad286077861bc81735c460ef1fb.png

Q-Learning收敛后,Q-table中的Q值,便可以做为状态转移的最佳路径,如下图。

2b2a59e4ea70cd480007c562f16ea0eb.png

总结

综上,Q-Learning是一个基于时序差分(TD)的off-policy强化学习算法,本质就是这个公式3436d4e3010f7f83eddbf17825af502c.png

Q-Learning算法,简单容易理解,但它只能学习到样本中已有的(s, a)状态转移价值,也正是这个缺陷导致它无法在复杂空间下进行直接使用。所以,才有了大名鼎鼎的DQN,我们后续再逐步进行讲解。

据笔者了解,oCPX智能出价场景中,有些公司就曾采用了Q-Learning进行出价反馈的调节优化,感兴趣的话,大家可以想想如何去做。欢迎留言交流讨论。

References

1.强化学习(七)--Q-Learning和Sarsa https://zhuanlan.zhihu.com/p/46850008

2.http://mnemstudio.org/path-finding-q-learning-tutorial.htm

3.什么是Q-Learning https://zhuanlan.zhihu.com/p/24808797

最后

以上就是仁爱人生为你收集整理的qlearning算法_强化学习系列Q Learning的全部内容,希望文章能够帮你解决qlearning算法_强化学习系列Q Learning所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部