2019-09-02 11:22:23 wangwei19871103 阅读数 123
  • 深度学习基础与TensorFlow实践教程

    本课程主要介绍了深度学习的基础原理和TensorFlow系统基本使用方法。TensorFlow是目前机器学习、深度学习领域优秀的计算系统之一,本课程将结合实例介绍使用TensorFlow开发机器学习应用的详细方法和步骤,着重讲解了用于图像识别的卷积神经网络和用于自然语言处理的循环神经网络的理论知识及其TensorFlow实现方法,并结合实际场景和例子描述了深度学习技术的应用范围与效果。 所有案例均来自讲师团队工作中的亲身实践,所选案例均是深度学习的经典应用,非常具有代表性。

    21447 人正在学习 去看看 AI100讲师

深度强化学习

深度强化学习可以理解为深度学习和强化学习的结合体,有个大神说AI=RL+DL,就是这个意思,Deep Mind用这个技术玩游戏,下围棋,一时间引领了AI的潮流。
在这里插入图片描述

强化学习

先说说强化学习,简单来说就是你有一个智能体,他会观察环境,然后做出相应的行为,然后环境反馈给他一个奖励,环境随之也会发生变化,然后智能体继续观察环境做出行为,继续这个循环,如果环境反馈的奖励是好的,那智能体就知道刚才的行为是对的,以后要多这样做,如果反馈的奖励是不好的,那就说明刚才的行为不好,以后要少做,举个例子,如果机器看到桌子上有水杯,然后采取了打翻水杯的行为,然后地球爷爷说你这样做不好,浪费水源,于是机器就知道了,刚才的行为是不好的,以后不能做了,于是他下次看到水杯就不会这样了。:
在这里插入图片描述
如果他发现地上有水,他采取了拖地的动作,把水拖干净了,然后地球爷爷说他真好,谢谢,于是下次他再看到地上有水,就会去拖地,因此他可能就学会看到地上有水就去拖地了。总结来说就是我们的智能体会希望去得到最大的奖励:
在这里插入图片描述
再举个下围棋的例子,机器看到的是棋谱,然后做出下一步棋:
在这里插入图片描述
然后人类选手继续走:
在这里插入图片描述
大多数情况下其实没有奖励,落子下去什么都没发生,只有当棋下完了,赢或者输才有奖励,这个奖励是很稀疏的,那到底每一步要怎么下棋才算好呢,是个值得讨论的问题,或许我们应该把一局当整体来看:
在这里插入图片描述

与监督学习的区别

监督学习来下围棋就是你看到什么情况,下什么棋,但是情况太多了,我们并不能知道所有情况该怎么下棋比较好,这样的下棋就好像有个老师在教你一样,看到什么做什么。

强化学习就不一样了,他下围棋只看整一局最后是输了还是赢了,来决定遇到什么样的情况应该做什么,是自己根据经验来学习的,当然在训练的时候不可能人去陪着下,会训练两个智能体相互下棋。AlphaGo其实是监督学习和强化学习的结合体:
在这里插入图片描述

训练语音对话机器人

举一个语音对话的机器人的例子,如果我们用监督学习,那就是让机器看到什么,就说什么,都是有标准答案的。如果是强化学习的话就是跟机器对话,然后根据机器的回答,来告诉他这个回答好不好,好的话就给他正奖励,不好的就负奖励,他为了让奖励越大,会学着用好的回答来进行对话:
在这里插入图片描述
当然用人工的方法去跟机器对话来训练他是不太现实的,那得训练多久啊,所以一般都是训练两个代理,让他们相互对话,但是这样可能会出现最后两个人就一直说同一句话的情况,因为双方给相互的奖励都比较大,所以就这么无限循环了:
在这里插入图片描述
所以传统的做法就是预先定义一些规则,什么样的是好的,什么样的是不好的对话:
在这里插入图片描述

更多的应用

比如交互式搜索的例子,可以用强化学习来训练,比如人说一个词让机器来搜索,如果机器不确定是什么,就会反问人,这样就可以给他低分,如果机器直接把结果给他,他觉得这个结果又多好,就给多高的分:
在这里插入图片描述
当然还有其他的应用,比如开直升机,自动驾驶,给谷歌机房节电,文子生成等等:
在这里插入图片描述

玩游戏的例子

强化学习最多的应用是在让机器玩游戏,我们知道现在围棋,星际,dota,德扑都已经被机器给玩爆了,我们来看看一般的强化学习是怎么做的,其实OpenAI已经开源了很多强化学习玩游戏的环境和框架,可以用来学习。其实机器玩游戏跟人是一样的,他也是看画面,也就是一堆像素点,然后来学习要用什么动作来获得最高分数:
在这里插入图片描述
我们来看这个太空入侵的例子,这个游戏技术的条件就是所有外星人被消灭,或者自己的飞船被外星人消灭,机器看到的跟我们看到的一样,都是这么一副图,左上角的是分数,中间的是外心人,下面的是掩体和自己的飞船:
在这里插入图片描述
强化学习的过程应该是这样的,首先机器看到s1s_1这个状态,然后他采取动作a1a_1右移,得到的奖励r1r_1是0,状态变为了s2s_2,然后他采取动作a2a_2射击,得到的奖励r2r_2是5,状态变为了s3s_3,通常游戏也包含很多随机元素,或许你消灭一个外星人得到的分数可能是4,也可能是3:
在这里插入图片描述如此反复下去直到最后一次采取aTa_T,获得的奖励是rTr_T,游戏结束,这个整个过程我们叫做一个episode,也就是一个开始到结束的一个过程。我们希望最大化机器每次游戏的过程的累计奖励:
在这里插入图片描述

强化学习的难点:

第一,可能有奖励的延迟,因为我们每次只是射击之后才能会获得奖励,然后会认为射击这个动作是好的,然后可能一直采取射击了,但是其实射击之前的一系列移动对射击是有帮助的。我们希望机器能有一点未来的眼光,有些动作或许现在没奖励,但是对未来的奖励有所帮助。同样在下围棋也是一样,短期的牺牲可能会换来更多长期的奖励。

第二,如果没有进行射击动作而得到奖励,机器可能只会左右移动了,永远都不会去射击,这个就是个问题,我们希望机器能够去探索未知的世界,希望他有有好奇心,那样才可以学到更多的东西。
在这里插入图片描述

强化学习比较新的方法

强化学习一般分为基于策略的和基于价值的,具体本篇先介绍下基于策略的,当时比较好的方法是A3C,就是一个分布式结合策略和价值的改进版,听说很厉害:
在这里插入图片描述
一些相关文章:
在这里插入图片描述

强化学习基于策略的方法

我们说机器学习其实就是在找一个方法,有个输入,有个输出,强化学习也一样,我们要找到一个方法π\pi,你把环境当做输入,然后行动当做输出,至于要怎么样的输出才是好的,就看环境给予你的奖励:
在这里插入图片描述
我们知道深度学习的基本步骤,我们可以把要找的方法用神经网络来学出来,我们可以记这个方法叫Actor,暂时叫演员吧:
在这里插入图片描述
我们可以把所观察的到环境用向量表示,然后输入到一个神经网络,输出希望就是不同动作的概率,然后我们选择概率最大的那个来行动,比如太空入侵的例子,我们可以把看到的像素画面当做一个向量或者矩阵作为输入,经过神经网络训练后输出应该采取的行为的分布,选择可能性最大的那个,我们之用神经网络来训练出这个Actor也是因为神经网络的泛化能力强:
在这里插入图片描述
然后我们进行第二步,找出最好的那个方法:
在这里插入图片描述
那怎么来衡量一个Actor的好坏呢,我们用目标函数,就像我们在监督学习的时候一样,我们希望输出的分布和真实的分布越接近越好,希望损失越小越好:
在这里插入图片描述
我们先用参数θ\theta初始化这个神经网络actor,然后用这个actor去玩游戏,在s1s_1的时候采取了a1a_1获得的奖励reward是r1r_1,环境变成了s2s_2,然后采取a2a_2获得的奖励reward是r2r_2,环境变成了s3s_3,以此类推,直到游戏结束,我们把功总得奖励记作RθR_\theta。因为游戏具有随机性,这个是设计游戏的时候做的,所以或许同样的actor也会得到不同的RθR_\theta,所以我们取RθR_\theta的期望,记作Rθ\overline R_\theta,我们可以用Rθ\overline R_\theta来衡量actor的好坏,这个很好理解,即游戏中采取的行为直接影响游戏得分好坏:
在这里插入图片描述
我们定义每一局游戏即从游戏开始到结束,为τ={s1,a1,r1,s2,a2,r2,...,sT,aT,rT}\tau=\{s_1,a_1,r_1,s_2,a_2,r_2,...,s_T,a_T,r_T\},也就是一局游戏过程的序列,因为τ\tau是基于参数为θ\theta的神经网络的输出,每个τ\tau出现的概率就是P(τθ)P(\tau|\theta),所以我们的期望Rθ\overline R_\theta就是:
在这里插入图片描述
但是我们没办法穷举每一局游戏,我们只能进行采样,我们用actor去玩N局游戏,然后进行采样:
在这里插入图片描述
然后我们可以将期望近似为采样的均值,也就是将所有采样到的N局游戏奖励求和再取平均:
在这里插入图片描述
接下来我们就是要找出最好的actor:
在这里插入图片描述
我们要优化的就是期望,我们希望期望越大越好,我们可以用梯度上升法更新参数,其实原理跟梯度下降类似,只是一个是越大越好,一个是越小越好,具体可以看下图,还是比较好理解的:
在这里插入图片描述
我们前面定义了期望:
在这里插入图片描述
因为奖励是游戏本身设定的,我们可能是不知道的,所以梯度只作用于概率上那部分上:
在这里插入图片描述
因为要log,所以进行变换:
在这里插入图片描述
因为我们知道:
在这里插入图片描述
所以期望就是:
在这里插入图片描述
然后近似于N次采样:
在这里插入图片描述

那接下来怎么求这个梯度呢,我们知道P(τθ)P(\tau|\theta)是怎么来的:
在这里插入图片描述
在这里插入图片描述
我们看到跟θ\theta相关的就是中间连乘的那部分,因为你每次在某个时间t状态下采取的行动,是基于你的actor πθ\pi _\theta的,比如下面的例子,某个时刻t的状态下,要开火的概率是0.7:
在这里插入图片描述
因为有连乘,所以我们取log,得到:
在这里插入图片描述
所以梯度就跟中间累加项有关:
在这里插入图片描述
于是:
在这里插入图片描述
在这里插入图片描述
R(τn)R(\tau^n)作用于每一个梯度,所以可以乘进去,得:
在这里插入图片描述
我们的梯度上升是这样:
在这里插入图片描述
因此我们希望奖励的期望梯度越大越好,当R(τn)R(\tau^n)是正的时候,我们希望提高p(atnstn,θ)p(a_t ^n|s_t ^n,\theta),反之当R(τn)R(\tau^n)是负的时候,我们希望减小p(atnstn,θ)p(a_t ^n|s_t ^n,\theta),这样就才可以使得奖励的期望梯度尽可能的大:
在这里插入图片描述
这边为什么是考虑某一局游戏的奖励R(τn)R(\tau^n),而不是某个时间点的奖励呢τtn\tau_t ^n,因为如果仅仅考虑某个时间点,比如开火的时候,得到了奖励,那他就越提高开火的概率,训练之后可能会一直乱开火。

我们来看这个式子,为什么最后要是取log,其实我们把他还原回去,可以看到其实是除以了概率:
在这里插入图片描述
为什么要做这件事呢,因为加入某个状态在很多局游戏里出现,采取a的奖励是2,采取b的奖励1,但是会采取b的次数多,因为我们的梯度是会进行求和,所以算出来最后可能他会选择b,但是事实a应该是更好的,所以我们要把这个次数的影响给消除点,我们除以概率就可以了,比如下图a出现的概率是1/4,b出现的概率是3/4,把奖励除以对应的概率,最后算出来会提升a的概率从,所以可能选择a的概率大:
在这里插入图片描述
其实还有个问题,我们的R(τn)R(\tau^n)一直是正的,理论上好像没问题,比如下图的a,b,c三个概率,如果都是正的,假设a,c的奖励大,b的小,那三个概率都应该增加,但是概率大的其实反而概率是会减少的,因为概率的和是1,其他增加了多少了,增加少的就会减少:
在这里插入图片描述
但是实际上你可能没采样的a,然后导致a的概率降低了:
在这里插入图片描述
这个其实是有问题的,或许a是更好的选择,那怎么避免这种情况呢,我们可以设定一个门槛,一个基线b,超过他的我们才会把概率提高,这样b,c的概率也就不一定提高,a也不一定降低了:
在这里插入图片描述

总结

本篇主要介绍强化学习的基本概念和基于策略的方法,还有一些要注意的地方,其实挺值得我们思考的,也是我们今后可以优化的地方,其他的方法再后面会介绍。

好了,今天就到这里了,希望对学习理解有帮助,大神看见勿喷,仅为自己的学习理解,能力有限,请多包涵,图片来自李宏毅课件,侵删。

2017-09-30 17:22:05 jason_cuijiahui 阅读数 613
  • 深度学习基础与TensorFlow实践教程

    本课程主要介绍了深度学习的基础原理和TensorFlow系统基本使用方法。TensorFlow是目前机器学习、深度学习领域优秀的计算系统之一,本课程将结合实例介绍使用TensorFlow开发机器学习应用的详细方法和步骤,着重讲解了用于图像识别的卷积神经网络和用于自然语言处理的循环神经网络的理论知识及其TensorFlow实现方法,并结合实际场景和例子描述了深度学习技术的应用范围与效果。 所有案例均来自讲师团队工作中的亲身实践,所选案例均是深度学习的经典应用,非常具有代表性。

    21447 人正在学习 去看看 AI100讲师

可以分为两方面看:

种西瓜的例子

强化学习是一个多次决策的过程,可以形成一个决策链,即西瓜书上种西瓜的例子;监督学习只是一个一次决策的过程。

摇杠赌博机的例子

强化学习:赌徒没有初始数据集,只能通过用某种策略取测试摇杠,期望能在整个测试过程得到最好的收益;

监督学习:赌徒一开始就统计了所有用户在赌博机上的收益情况,然后进行监督学习得到模型。等赌徒操作摇杠赌博机时直接利用模型得到该摇哪个摇杠。

这里面也隐含着:强化学习在测试收集数据的过程中是有代价的,而监督学习是一开始就给定了数据集,收集数据集的代价是其他人所承担的,所以监督学习不用考虑这部分的代价。

2018-09-30 16:25:03 weixin_43092451 阅读数 241
  • 深度学习基础与TensorFlow实践教程

    本课程主要介绍了深度学习的基础原理和TensorFlow系统基本使用方法。TensorFlow是目前机器学习、深度学习领域优秀的计算系统之一,本课程将结合实例介绍使用TensorFlow开发机器学习应用的详细方法和步骤,着重讲解了用于图像识别的卷积神经网络和用于自然语言处理的循环神经网络的理论知识及其TensorFlow实现方法,并结合实际场景和例子描述了深度学习技术的应用范围与效果。 所有案例均来自讲师团队工作中的亲身实践,所选案例均是深度学习的经典应用,非常具有代表性。

    21447 人正在学习 去看看 AI100讲师

强化学习是人工智能中讨论最多、关注最多和考虑最多的话题之一,因为它有潜力改变大多数行业。在这篇文章中,将会提供简单的解释什么是强化学习,并提供一些实际的例子来说明它是如何使用的。
在这里插入图片描述
什么是强化学习?

强化学习的核心是通过积极奖励(强化信号)来强化最佳行为或行动的概念。
机器和软件代理使用强化学习算法,根据环境的反馈来确定理想的行为。它是机器学习的一种形式,因此也是人工智能的一个分支。

根据问题的复杂性,如果需要,强化学习算法可以随着时间的推移不断适应环境,从而在长期内获得最大的回报。所以,就像蹒跚学步的孩子一样,一个正在学习强化学习的机器人会尝试不同的方法来达到目标,获得有关这些方式成功的反馈,然后调整直到目标达到。向前迈一大步,机器人就会倒下,所以它会调整自己的步伐,以看看这是不是保持直立的秘诀。它通过不同的变化继续学习,最终能够行走。在这个例子中,奖励是直立的,而惩罚是下降的。基于机器人对其动作的反馈,优化动作得到强化。

强化学习例子

1、机器人

强化学习为机器人学提供了一个“框架和一套工具”,用于处理难以设计的行为。由于强化学习可以在没有监督的情况下进行,这可以帮助机器人成倍增长。

2、工业自动化

得益于DeepMind的强化学习功能,谷歌能够大幅降低数据中心的能耗。 最近被微软收购的Bonsai提供了一种强化学习解决方案,可以在能源,HVAC,制造,汽车和供应链中实现自动化和将智能构建到复杂和动态系统中。

3、加强预测性维护

机器学习已经在制造业中使用了一段时间,但强化学习可以使预测性维护比现在做的更好。

4、游戏

事实上,强化学习获得声望的第一个应用是机器学习算法AlphaGo在围棋中赢得了世界上最好的人类玩家之一,现在强化学习被用于各种游戏的竞争。
人工智能交流群 862729908

2018-08-08 17:32:07 hzq20081121107 阅读数 267
  • 深度学习基础与TensorFlow实践教程

    本课程主要介绍了深度学习的基础原理和TensorFlow系统基本使用方法。TensorFlow是目前机器学习、深度学习领域优秀的计算系统之一,本课程将结合实例介绍使用TensorFlow开发机器学习应用的详细方法和步骤,着重讲解了用于图像识别的卷积神经网络和用于自然语言处理的循环神经网络的理论知识及其TensorFlow实现方法,并结合实际场景和例子描述了深度学习技术的应用范围与效果。 所有案例均来自讲师团队工作中的亲身实践,所选案例均是深度学习的经典应用,非常具有代表性。

    21447 人正在学习 去看看 AI100讲师

flappy bird 为例子来讲

看完这个我好像脑子里有个程序了 :

https://www.zhihu.com/question/26408259

 

小鸟飞例子-建模关键点:

增强学习有三个要素:状态S,动作A,奖惩R的策略Q

S:

d(x,y)表示小鸟离下一根柱子的距离和高度差

A:

飞一下 或者 不飞,两种可选动作

Q(S+A->R):

为一个策略表,也称之为Q,其实就是我们最终想学到的东西。就是在某状态S下采用不同动作A 可以得到的奖惩R。

 

如何训练:

 

Initialize Q arbitrarily //随机初始化Q值 (撞地上或者柱子上初始化为负值)

    Repeat (for each episode): //每一次游戏,从小鸟出生到死亡是一个episode

        Initialize S //小鸟刚开始飞,S为初始位置的状态

        Repeat (for each step of episode):

        。。。根据当前Q和位置S,使用一种策略,得到动作A //这个策略可以是ε-greedy等

        做了动作A,小鸟到达新的位置S',并获得奖励R //奖励可以是1,50或者-1000

        Q(S,A) ← (1-α)*Q(S,A) + α*[R + γ*maxQ(S',a)] //在Q中更新S

        S ← S'

    until S is terminal //即到 小鸟死亡为止

 

关键的这一步怎么理解呢?

Q(S,A) ← (1-α)*Q(S,A) + α*[R + γ*maxQ(S',a)]

1 当处于S状态采取A策略后,根据S'我们可以得到R, 那么这个R应该跟新到Q(S,A)中,我们可能会这样做:

Q(S,A) ← (1-α)*Q(S,A) + α*R

其中α是0~1之间的一个数,我们称之为学习率。

2 上面的公式太短视,我们更新Q(S,A) 时是不是要考虑一下,通过步骤A走到下一个状态S'的收益呢?

Q(S,A) ← (1-α)*Q(S,A) + α*[R + γ*Q(S',?)]

其中γ是一个0~1的小数,表示我们关注长期(下一步)收益的程度,代表对历史经验的重视程度。

3 Q(S',?)表示状态S'的收益,Q(S',?)有飞和不飞2个值,我们既然知道奖惩,肯定是采用Q(S',?)中最大的那一种操作于是我们得到

Q(S,A) ← (1-α)*Q(S,A) + α*[R + γ*maxQ(S',a)]

 

根据以上信息就可以写代码啦!

 

现在用走房子的例子来写一个程序:

题目参考:http://blog.csdn.net/itplus/article/details/9361915#0-qzone-1-29435-d020d2d2a4e8d1a374a433f596ad1440

我们需要尽快从当前房子走到目的房子:

代码:

#include<iostream>
#include<sstream>
#include<string>
#include<algorithm>
#include <stdlib.h> 
#include <time.h>  
#include<map>
using namespace std;
#define N 6
int pass[N][N];
float Q[N][N];
int dest;

void input()
{
	int n,m,a,b,i,j;
	//srand((unsigned)time(NULL));  
	for (i=0; i<N; i++)
	{
		for (j=0; j<N; j++){
			pass[i][j] = 0;
			Q[i][j] = 0;//(rand()%100)/100.0;//0;
		}
	}
	cin>>n;//一共有n扇门
	printf("%d doors\n",n);
	while(n--){
		cin>>a>>b;//房间a和b之间有互通
		pass[a][b] = pass[b][a] = 1;
		Q[a][b] = (rand()%100)/1000.0;//0;
		Q[b][a] = (rand()%100)/1000.0;//0;
	}
	printf("input done\n");
	//输入目标房间
	cin>>m;//m为目的房间号
	Q[m][m] = 1;//目标房间号的收益是最高的,为1
	dest = m;
}

void displayQ(){
	printf("\n");
	int i,j;
	for (i = 0; i < N; i++){
		for (j = 0; j < N; j++){
			printf("%.3f ",Q[i][j]);
		}
		printf("\n");
	}
}
//从pqm中随机选出一个元素
int select_rand_ele(map <int, float> pqm){
	int n = rand()%(pqm.size());
	map<int, float>::iterator it = pqm.begin();
	while(n--){
		it ++;
	}
	return it->first;
}

//从一个矩阵的第pos行找出最大值,返回其位置
int find_max_Q(int pos, float &chosen_q){
	int i;
	int chosen_p = -1;
	for (i=0; i<N; i++){
		if (pass[pos][i] != 0){
			if (chosen_p == -1 || Q[pos][i] > chosen_q)
			{
				chosen_q = Q[pos][i];
				chosen_p = i;
			}
		}
	}
	return chosen_p;
}

//起始位置在序号为pos的房间,以0.3的概率走随机门
void train(int pos, float rr = 0.3){
	printf("%d ", pos);
	int i,j,k;
	if (pos == dest){
		return;
	}
	//action choice,开门换房
	map <int, float> pqm;
	float chosen_q; 
	int chosen_p = -1;
	for (i=0; i<N; i++){
		if (pass[pos][i] != 0){
			pqm[i] = Q[pos][i];
			if (chosen_p == -1 || Q[pos][i] > chosen_q)
			{
				chosen_q = Q[pos][i];
				chosen_p = i;
			}
		}
	}
	if (chosen_p == -1){//这是一个没有门的房间
	    return;
	}
	//以一定概率走随机门
	if ((rand()%100)/100.0 < rr){
		chosen_p = select_rand_ele(pqm);
		chosen_q = pqm[chosen_p];
	}
	// 更新Q
	float lr = 0.5;// 学习率
	float next_q_max_value = 0;
	find_max_Q(chosen_p, next_q_max_value);
	Q[pos][chosen_p] = lr * Q[pos][chosen_p] + (1-lr) *(next_q_max_value - 0.1);//走一扇门的代价是-0.1
	//下一个位置
	train(chosen_p, 0.3);
}

/*
输入
6
4 5
4 3
3 2
1 3
0 4
1 5
5

6
4 5
4 3
3 2
1 3
0 4
1 5
2
*/
int main()
{
	input();
	displayQ();
	int n = 1000;
	while(n--){
		train(rand()%N, 0.5);//从随机的一个房间开始走
		displayQ();
	}
	system("pause");
}

 

2018-11-03 20:44:46 xckkcxxck 阅读数 503
  • 深度学习基础与TensorFlow实践教程

    本课程主要介绍了深度学习的基础原理和TensorFlow系统基本使用方法。TensorFlow是目前机器学习、深度学习领域优秀的计算系统之一,本课程将结合实例介绍使用TensorFlow开发机器学习应用的详细方法和步骤,着重讲解了用于图像识别的卷积神经网络和用于自然语言处理的循环神经网络的理论知识及其TensorFlow实现方法,并结合实际场景和例子描述了深度学习技术的应用范围与效果。 所有案例均来自讲师团队工作中的亲身实践,所选案例均是深度学习的经典应用,非常具有代表性。

    21447 人正在学习 去看看 AI100讲师

开始入门强化学习,最先看了莫凡大佬的视频,讲解Q-learning算法不得不说真的是通俗易懂。这里是视频地址:https://morvanzhou.github.io/tutorials/machine-learning/reinforcement-learning/2-1-general-rl/#│ᆭチ￧ツᄍ

然后贴一下大神写的代码,以后多多学习。这个小例子对学习理解Q-learning算法十分有用!!!

# -*- coding: utf-8 -*-
"""
Created on Mon Oct  1 22:20:10 2018

@author:
"""

import numpy as np
import pandas as pd
import time

np.random.seed(2)  # reproducible

N_STATES = 6   # 1维世界的宽度
ACTIONS = ['left', 'right']     # 探索者的可用动作
EPSILON = 0.9   # 贪婪度 greedy
ALPHA = 0.1     # 学习率
GAMMA = 0.9    # 奖励递减值
MAX_EPISODES = 13   # 最大回合数
FRESH_TIME = 0.3    # 移动间隔时间

#Q表:
def build_q_table(n_states, actions):
    table = pd.DataFrame(
        np.zeros((n_states, len(actions))),     # q_table 全 0 初始
        columns=actions,    # columns 对应的是行为名称
    )
    return table

# 在某个 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
    

#环境反馈S_,R
def get_env_feedback(S, A):
    # This is how agent will interact with the environment
    if A == 'right':    # move right
        if S == N_STATES - 2:   # terminate
            S_ = 'terminal'
            R = 1
        else:
            S_ = S + 1  #右移
            R = 0
    else:   # move left
        R = 0
        if S == 0:
            S_ = S  # reach the wall
        else:
            S_ = S - 1 #左移
    return S_, R

#环境更新
def update_env(S, episode, step_counter):
    # This is how environment be updated
    env_list = ['-']*(N_STATES-1) + ['T']   # '---------T' our environment
    if S == 'terminal':
        interaction = 'Episode %s: total_steps = %s' % (episode+1, step_counter)
        print('\r{}'.format(interaction))
        time.sleep(2)
        print('\r                                ', end='')
    else:
        env_list[S] = 'o'
        interaction = ''.join(env_list)
        print('\r{}'.format(interaction), end='')
        time.sleep(FRESH_TIME)
        
#强化学习主循环
def rl():
    q_table = build_q_table(N_STATES, ACTIONS)  # 初始 q table
    for episode in range(MAX_EPISODES):     # 回合
        step_counter = 0
        S = 0   # 回合初始位置
        is_terminated = False   # 是否回合结束
        update_env(S, episode, step_counter)    # 环境更新
        while not is_terminated:

            A = choose_action(S, q_table)   # 选行为
            S_, R = get_env_feedback(S, A)  # 实施行为并得到环境的反馈
            q_predict = q_table.loc[S, A]    # 估算的(状态-行为)值
            if S_ != 'terminal':
                q_target = R + GAMMA * q_table.iloc[S_, :].max()   #  实际的(状态-行为)值 (回合没结束)
            else:
                q_target = R     #  实际的(状态-行为)值 (回合结束)
                is_terminated = True    # terminate this episode

            q_table.loc[S, A] += ALPHA * (q_target - q_predict)  #  q_table 更新
            S = S_  # 探索者移动到下一个 state
            
            update_env(S, episode, step_counter+1)  # 环境更新
            
            step_counter += 1
    return q_table      

if __name__ == "__main__":
    q_table = rl()
    print('\r\nQ-table:\n')
    print(q_table)     

 

强化学习例子

阅读数 44

强化学习

阅读数 654

没有更多推荐了,返回首页