当前位置: 首页 > 科技观察

从强化学习的基本概念到Q-learning的实现,打造自己的迷宫agent

时间:2023-03-19 18:39:32 科技观察

近年来,强化学习在人工智能中的作用越来越重要。许多研究机构和大学将强化学习和深度学习相结合,打造出高性能的系统。因此,本文着重描述强化学习的基本概念和实现,希望向读者介绍机器学习这一分支的巨大魅力。强化学习其实是机器学习的一个分支,但是和我们常见的监督学习、无监督学习又不太一样。强化学习旨在选择最佳决策。它注重在一系列情况下通过多步骤的适当决策来实现一个目标。这是一个连续的多步决策问题。学习算法可以帮助我们制定生物体的奖励动机行为。例如,要让一个孩子为了考试而坐下来安静学习是非常困难的,但是如果他每完成一章你就奖励他一块巧克力,那么他就会明白奖励只是为了继续学习,这样您就可以了解更多信息。为考试而学习的动力。而现在,如果孩子在备考的时候没有一个明确的方法,他可能会花很多时间学习一个章节,而不能及时完成课程。所以我们需要孩子高效的学习,所以如果孩子在一个小时内完成了某个章节,那么就奖励一大块巧克力,如果超过一个小时,就只奖励一小块巧克力。现在他不仅会学习,同时,他的大脑会思考和设计更快完成章节学习的方法。在这个例子中,孩子代表训练实体(代理:与环境交互的对象)。奖励制度和考试代表环境。章节可以比作强化学习的状态。所以孩子们需要决定哪些章节更重要(即计算每一章的价值),这就是Value-Function所做的。并且孩子每次从一个状态进入另一个状态都可以获得奖励,而他随着时间的推移完成章节的方式就是政策。强化学习和其他机器学习范式有什么区别:没有大量的标记数据进行监督,所以样本数据无法告诉系统什么是最有可能的动作,训练对象只能从每个动作中获得奖励.因此,系统不能立即标记,只能得到一个反馈。也可以说强化学习是一种有标记延迟的监督学习。时间序列的重要性。与其他接受随机输入的学习方法不同,强化学习更注重时序数据,下一步的输入往往取决于前一状态的输入。延迟奖励的概念,系统可能不会在每一步都获得奖励,只有在整个任务完成时才会奖励。训练实体的动作影响下一个输入。如果你可以选择向左或向右,那么当你选择的方向不同时,下一个时间步的输入也会不同。即选择不同的动作进入不同的状态后,当前可用的动作是不同的。一般来说,强化学习的目标是找到一种策略,让我们获得最大的累积奖励。因此,强化学习实际上类似于我们人类与环境的交互方式。它是一个非常通用的框架,可以用来解决各种人工智能问题。如上所示,在任何时间步长(t),训练实体都会获得环境的观察(实例)。然后它采取所有可能的行动之一,并获得环境的奖励和下一次观察。因此,我们需要为训练实体提供算法,这些实体的决策应该旨在最大化提升结束时的全部奖励。1.历史和状态历史(History)是描述环境和训练实体之间发生的所有事件的变量集合。训练实体必须将历史映射到一个准确的动作中。对于环境,它必须将历史记录映射到需要发送的下一组观察结果。因此,训练实体必须不断地维护和存储大量的信息,占用大量的存储空间和处理时间。所以,我们想创建一个历史的抽象表示,它可以存储足够的信息,以便我们可以选择下一步的动作,这就是状态的概念。所以基本上系统的输出取决于我们如何定义状态。在上面的公式中,S表示状态,f表示对时间步长“t”的历史求和的函数。在上面的表达式中,前者表示训练实体的内部表示,它可以总结历史并允许以后采取行动。后者代表环境的内部表示,它允许发送下一个观察结果。1、马尔可夫状态(MarkovState)马尔可夫状态以一种抽象的形式存储了所有过去的信息。因此,如果一个实体被训练来预测未来的行为,它不会使用整个历史,但马尔可夫说。本质上,马尔可夫状态存储的信息不亚于历史。因此,给定状态St找到未来状态St+1的概率与给定所有先前状态找到St+1的概率相同。这是因为状态St已经嵌入了所有先前状态的信息。2.游戏顺序现在假设一个游戏发生在一家餐厅,餐厅提供三种食物:甜甜圈、饮料和三明治。现在顾客让服务员拿来五种食物,服务员会依次提供这五种食物。如果顾客喜欢点这些食物,那么服务员就会得到奖励,否则就会受到惩罚。现在S1中显示了服务员第一次上菜的顺序,他得到了奖励。然而,下次服务员在另一份订单中多带五种食物时,他会受到惩罚(S2)。那么现在第三个序列S3的输出是什么,奖励还是惩罚?这里的解决方案取决于先前状态的定义。如果状态的定义只是食物序列中第三项的顺序,那么可以根据S1中第三项的结果,对S3序列进行奖励。但是,如果按照每种食物出现的次数来定义,那么S3最有可能受到惩罚,因为S2和S3中每种食物的出现次数相同。所以本质上系统的输出取决于状态的定义。2.环境如果你在电脑上下过你写的棋,那么你就很清楚电脑是如何分析下棋的。所以基本上你知道计算机决定为给定的动作采取哪一步。这是一个完全可观察的环境(FullyObservableEnvironment)。现在如果你正在玩别人写的国际象棋游戏,你不知道计算机下一步要做什么。所以现在你所能做的就是看电脑下棋。这是一个部分可观察的环境(PartiallyObservableEnvironment)。在这种情况下,你所能做的就是预测游戏的内部动态,并希望对其内部状态得到足够好的预测。另外,按照周志华的《机器学习》,我们需要注意“机器”和“环境”的界限。例如,在种植西瓜的任务中,环境是西瓜生长的自然界;在下棋中,环境就是棋盘和对手;在机器人控制中,环境是机器人的身体和物理世界。简而言之,环境中状态的转移和奖励的返回不受机器控制。机器只能通过选择要执行的动作来影响环境,并且只能通过观察转移的状态和返回的奖励来感知环境。***总结一下强化学习的概念,强化学习的输入是:状态(States)=环境,比如迷宫的每个格子就是一个状态动作(Actions)=在每个状态下,允许做什么动作奖励(Rewards)=进入每个状态时,可以带来正值或负值(效用),输出为:策略(Policy)=在每个状态下,你会选择哪个动作?如上图所示,强化学习的主要思想:即训练实体(Agent)不断采取动作(action),然后进入下一个状态(State),并获得奖励(reward),从而进一步更新培训实体。了解了强化学习的基本概念后,我们可以进一步了解Q-learning的原理和实现。下面我们将从迷宫寻宝开始,了解Q-learning的基本概念。游戏规则如下:游戏从给定的位置开始,即起始状态。在每个状态下,训练实体可以留在原地或选择上下左右移动,但不能跨越迷宫的边界。每个动作都会使训练实体进入不同的单元格(即不同的状态)。现在某个单元格(即目标状态)中有一个宝箱。此外,迷宫的某些位置/状态有蛇。所以训练实体的目标是通过找到一条无蛇路径从起始状态到目标状态。现在,当我们将训练实体放置在网格中(即在环境中)时,它会首先开始探索。它一开始并不知道什么是蛇,也不知道什么是宝箱,不知道它在什么地方。所以我们需要给出训练主蛇和宝箱的概念,每走一步就给予一定的奖励。对于每个有蛇的单元格(状态),我们给予-10加值,对于宝藏,我们给予+10加值。现在我们希望训练实体尽快完成任务(走最短路径),所以我们给其他状态-1的奖励。***我们对给定培训实体的目标是***最大化***累积分数。当实体被训练去探索时,它会知道蛇是坏的,宝物是好的,它需要尽快得到宝箱。上图中的“-”表示从初始状态到目标状态的最短路径。Q-Learning试图学习给定状态下的当前值并采取特定的行动。现在我们设计一个表格,每一行是训练实体的状态,每一列是训练实体可能采取的行动。所以上面的例子有16×5个可能的状态-动作对,其中每个状态都是迷宫中的一个单元格。首先我们将矩阵(上面的16×5表)初始化为零,然后根据不同动作获得的奖励更新矩阵的元素。当然更新这个矩阵的方式是计算贝尔曼方程:“S”代表当前状态,“a”代表训练实体在当前状态下采取的动作,“S'”代表结果采取行动状态,“r'”是采取行动的奖励。折扣因子(discountfactor)“γ”决定了训练实体对未来奖励的重视程度。γ越大,训练实体越会关注过去的经验,γ越小,训练实体只会关注眼前的收益。如果训练实体移动到远离目标状态的状态,并且在该状态下遇到蛇的概率降低,则实时奖励减少,未来奖励增加,训练实体会更加关注到未来的奖赏。我们将每次迭代(训练代理的尝试动作)视为一个片段。对于每一集,训练代理将尝试达到目标状态,并且对于每一个动作,Q矩阵元素将被更新一次。现在看看Q-matrix是怎么计算的(为了简洁,我们用一个更小的2×2迷宫):Q-matrix的初始状态如下(每一行代表一个状态,每一列代表一个动作):U—向上走,D—向下走,L—向左走,R—向右走奖励矩阵如下:其中E代表一个空值(NULL,训练对象不能采取这个动作)集合“γ”值来完成奖励矩阵。对于每一集,选择一个随机的起始状态(在这种情况下,我们将起始状态严格限制为-1)。为当前状态(S)选择所有可能的操作之一。作为此操作(a)的结果,训练对象移动到下一个状态(S')。从状态(S')产生的所有可能动作中,选择具有最高Q值的动作。使用贝尔曼方程更新Q矩阵。将下一个状态设置为当前状态。如果达到目标状态,则算法结束。我们可以从下面一段伪代码进一步理解它:现在假设训练agent从状态1开始,它可以采取动作D或R。如果采取动作D,那么agent被训练到状态3(蛇)并且可以采取行动U或R。现在取值γ=0.8,则方程为:Q(1,D)=R(1,D)+γ*[max(Q(3,U)&Q(3,R))]Q(1,D)=-10+0.8*0=-10其中,由于Q矩阵尚未更新,max(Q(3,U)&Q(3,R))=0。将踩蛇的奖励设置为-10。现在新的Q矩阵的值如下:现在,状态3是当前状态,动作R是从状态3开始的。训练代理到达状态4,它可以采取动作U或L。Q(3,R)=R(3,R)+0.8*[max(Q(4,U)&Q(4,L))]Q(3,R)=10+0.8*0=10再次更新值Q矩阵的:因此,代理现在经过训练以达到目标状态4。然后终止该过程并执行更多训练,直到训练代理理解所有状态和动作并且所有Q矩阵元素变为常量。这意味着训练代理已经尝试了所有状态-动作对。这个过程的Python实现:***Q矩阵的输出:原文:https://medium.com/becoming-human/the-very-basics-of-reinforcement-learning-154f28a79071【本文为专栏机器之心微信公众号原译《机器之心(id:almosthuman2014)》】点此查看作者更多好文