Q-learning(强化学习)

什么是强化学习

举一个很简单的例子,如果你养了一只宠物—旺财,旺财是一只刚出生的宠物(不一定是狗),啥也不知道,纯洁的像一张白纸。现在你想训练它达到一个目的,例如你想让旺财学猫叫。那么如果旺财“喵”了一声,你就给它最喜欢吃的骨头。如果它“旺”了一声,不仅没有骨头吃,还要严厉的惩罚。久而久之,旺财知道了,喵=骨头,汪=惩罚。

我们作为主人来模仿环境,例如以命令的形式给我们的旺财一个状态St。我们的旺财是接收状态的对象,随即采取类似喵或者汪的动作。旺财选择任一种动作的过程叫做决策。我们对旺财进行奖励或者惩罚称为赏罚(reward有好有坏),如此循环。

什么是Q-learning

Q-learning其实就是把上述那些过程用一个Q表的形式表示出来而已。

在了解什么是Q表之前,我们先说明一下简称,S,R,A分别表示当前的状态,奖励,动作;S_,R_,A_分别表示下一状态,奖励,动作

首先对一个Q表进行初始化(这里面的值可以全为0,或者随机)

(空)a1a2
s1-21
s2-41

Q-learning举例分析

假设我们当前状态S = s1,此时我们需要作出动作A,可以选择的动作有a1和a2,现在我们有一个Q值表(这个只是一个大概的,并不是最终的Q值,我们的目的就是修改这一个Q值表,得到一个准确的数据),如果作出a1动作,我们内心大概估计得到的Q值为-2,如果作出a2动作,会得到Q值为1(这里我们认为Q值越大,代表的结果越好)。

那么我们果断作出a2的动作(注意,有时候尽管某一个Q值很大,但是有些人会存在逆反心理,就是要选择小的,所以这里存在一定的概念选择a1)。我们假设选择了a2动作,碰巧我们的s1做完a2动作后进入s2的状态,只有我们进入s2状态后才知道到底是奖励还是惩罚,设为R。
刚刚这样的一轮操作已经完成了一次强化学习的过程,那么学习体现在哪呢?

之前我们提到过,我们的目的是对Q值表进行更新,对Q表的更新就是一次学习的过程,我们在s1状态下作出了a1的动作,就能学习到这一次过程的好坏,为了以后我们在所有状态都能作出最好的动作而得到奖励。

Q-learning 更新

接下来是真正的重点

Q更新

前面提到了,我们在s1状态下作出了a1的动作,就能学习到这一次过程的好坏,那么我们就应该更新Q表中(s1,a2)的Q值。设当前表格中的Q(s1,a1)=1表示为Q_eval(我们叫它Q估计,因为这是我们在经过一次学习过程之前的Q值,可能是对的也可能是错的,所以叫它Q估计),而经过一次学习之后,我们有了这次动作得到的奖励R,以及下一个状态s2,如何利用好这两个条件来估计得到对于(s1,a2)这个动作的Q呢。毋庸置疑R越大,肯定Q越大,所以R肯定独占一项;那S2状态就一点用都没有吗,答案肯定是否认的。我们可以利用Q表中s2的关于所有的动作的值,选择其中最大的那个(也就是表中的(s2,a2)),乘上一个衰减系数gamma(这里我的理解是,虽然Q并不是奖励R,但是在我们心中,认为Q值越大那么和大的奖励值相关性越强,也更能说明我们在s1作出a2动作的好处,加上一个系数更方便我们调节),这也就是我们的第二项。

我们将上述两项加在一起,称为Q_target(Q目标值)。有了Q_eval和Q_target,将两者做差值,再乘上一个学习率alpha,最后加上原来的Q(也就是Q_eval),就算更新完了一次Q表中的Q(s1,a2)。

之后的过程就是循环多次学习,更新整个Q值表,使其更加贴切现实环境,能够更快的拿到想要的奖励。

Q-learning决策

在Q-learning中我们忽略一个重要的内容,就是决策(如何选择动作a)。

之前可能提过Q值越大间接表示了可能离奖励越近,但是Q并不等于R。如果我们在s1状态的时候选择大Q值得动作,如果a2真的能将我们更好的得到奖励,那肯定是很好的;但是我们要知道,最开始的时候,我们对于这个环境是一点都不了解的,初始的Q值表是随机生成的(也可能全是0),所以不能完全用最大Q值来决定我们的下一步动作,也需要留一点余地,给出一个小概率,让模型选择一个非常之路,没准非常之路更好更快。

Qlearning算法

因为在初始阶段, 随机的探索环境, 往往比固定的行为模式要好, 所以这也是累积经验的阶段, 我们希望探索者不会那么贪婪(greedy). 所以 EPSILON 就是用来控制贪婪程度的值. EPSILON 可以随着探索时间不断提升(越来越贪婪)。

`python编码
'# 在某个 state 地点, 选择行为
def choose_action(state, q_table):`
	state_actions = q_table.iloc[state, :]  # 选出这个 state 的所有 action 值
	if (np.random.uniform() > EPSILON) or (state_actions.all() == 0):  # 非贪婪 or 或者这个 state 还没有探索过
    	action_name = np.random.choice(ACTIONS)
	else:
    	action_name = state_actions.argmax()    # 贪婪模式
	return action_name`
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值