上个周末又看了下,机器学习的应用。对,就是用来打牌(21点)。虽然21点感觉并不是很难,但是如何让机器自己学会打牌呢?这个还是蛮有意思的。这个打牌的算法就是基础的强化学习算法Q-Learning
【算法介绍】
首先,机器学习学的是什么呢? 这个必须先明确,学的是决策机制
Q-Learning, 该算法属于强化学习基础算法。强化学习就是大名鼎鼎的阿法狗Zero的核心部分之一。一般新闻里面讲,强化学习通过试错来学习。那么具体是如何做到的呢? 反正我是很好奇。
Q-learning 就是基础的强化学习算法,接下来我将介绍该算法。
讲到学习,大家可能会想到吃一堑长一智之类的词。 一个地方摔倒了,下次不能再摔了, 这就是学习。抽象点讲,你为什么摔倒了呢。那是你在离水坑0.1米(状态1)的地方,采取了错误的动作(动作1),结果摔倒了。如果摔倒这个结果能打分的花,你可能会给-100分(Q值)
那么总结下,你的试错就是,在状态1(s1)采取了错误的动作(a1), 结果得分(r) = -100
那么你学到了什么呢? 很简单呀,你学到了这个教训呀。 你记忆中在这个位子,采取这个动作的Q值是-100,所以下次你就不会这么操作了
那如果把所有状态下,所有动作的的Q值算出来,那不就行了。
本质上真的真的就这么简单。
那我们让情况复杂点。
假设,现在的任务是一只小猴子(位子1),需要到位子6拿到香蕉。 拿到香蕉算100分。如何让他自己找到拿香蕉的路呢?并且学会找到拿香蕉的路呢。 当然啦,他肯定不能预知下一个位子哈。
【公式讲解】
接下来将解释核心公式:
此算法并不是等每一局结束后才学习。而是逐步学习。假设是位子5走到位子6,学习的机制如下:
s(位子5),a(动作向右),s_(位子6),r(奖励值=100)
以上公式可以拆分为三部分:
1)Q_目标(位子5,向右)= 位子5 奖励值r + Q(位子6).MAX * 折现率90%
2)Q_预测(位子5,向右) 是目前Q值表中 (位子5,向右)的Q值
3)Q(位子5,向右)+= 学习率*(Q_目标 - Q_预测)
通俗解释下该公式:
1)因为位子5本身奖励值是0(没有香蕉),那么相当于Q_预测= Q(位子6) *90%, 这样就完成了反向传递
2) 实际值就是该轮学习前,表格里的Q值
3) 将预测值与实际值的差*学习率 更新到Q值表中。
以实际数据为例子来看下,
以下为4轮完整结束后的Q值表,可以看出从第一轮随机要38步才能找到,到第四轮5步就能走到位子6.这就是他自我学习的过程。
第一轮:
第一个问题,为什么除了(5,右)其他都是0?
因为,Q-learning是逐步学习,当1走到2时,1向2学; 当4走到3时,4向3学。但是在第一轮初始Q值表都是0. 所以学习的结果也是0. 只有(5,右)的下一步是6,所以能学到。
9 = 100* 折现率90% * 学习率 10%
第二轮,大家看到第二轮的(4,右)也有值了。那是因为位子5 Q值的存在,使得他能够向下一步学习
第三轮,第四轮 从图能够看出,慢慢的Q值就会反向传递到每个位子。这样就计算了完整Q值表
简答的说,Q-Learning就是要做一张大表涵盖所有的状态和动作,然后将最终奖励通过逐步学习的方式,传导到之前每一个状态中去,然后用Q值表指导选择。
【代码讲解】
终于来到代码部分,还没搞清楚微信公众号如何上传代码或者说共享文件,所以这次先以截图的形式。 如果有会上传的朋友,请私信下我,谢谢!
注:此代码块是在周莫凡大神的基础上修改得来。
这部分是import必要的模块,定义参数(学习率,折现率,状态个数,动作类型等)
这部分是用Pandas模块,制作一个空的表格,行代表动作,列代表状态
这部分是如何决策。就算最初始状态也是有决策的(虽然是随机)
if 后面两行的意思是,如果 一个(0~1)的随机数 大于0.9 或者说Q值都为0, 那么随机选择动作
else 后面一行的意思是,如果不满足If条件,则选择当前状态下,Q值最大的动作
以下就是最关键的学习过程了:
第一行是,创建一个空的Q值表:
中间是参数设置,然后重点在While not is_terminated:下面
A=choose_action()的作用是用我们上面定义好的策略选择动作;
S_,R 就是选择动作后的环境的反馈。
接下来就是计算Q_目标值
q_target = R + GAMMA * q_table.iloc[S_, :].max()
和将目标值与目前Q值表里的值进行学习,Alpha是学习率
q_table.loc[S, A] += ALPHA * (q_target - q_predict)
领取专属 10元无门槛券
私享最新 技术干货