本文将带你了解经典的强化学习算法Q-learning。在本文中,您将学习到:(1)Q-learning概念解释和算法细节;(2)通过Numpy实现Q-learning。故事范例:骑士与公主假设你是一名骑士,你需要解救被困在上图中城堡中的公主。您一次可以移动一个方块。敌人不能移动,但如果你和敌人落在同一个方格,你就会死。您的目标是尽可能快地到达城堡。这可以使用“逐点”系统进行评估。你在每一步失去1分(每一步失去点数有助于代理更快地训练)如果你击中敌人,你将失去100分并且训练情节结束。如果您进入城堡,您将获胜并获得100分。那么问题来了:如何创建这样的代理?下面我将介绍第一种策略。假设代理试图遍历每个方块并为其着色。绿色表示“安全”,红色表示“不安全”。相同的地图,但颜色显示哪些街区可以安全访问。接下来,我们告诉代理只选择绿色方块。问题是,这个策略不是很有用。当绿色方块挨在一起的时候,我们不知道选择哪个方块最好。因此,agent在寻找城堡的过程中可能会陷入死循环。Q-Table简介接下来介绍第二种策略:创建表。通过它,我们可以计算出对每个状态(state)执行的每个动作(action)的最大未来奖励(reward)期望。多亏了这张表,我们才能知道对每个州采取的最佳行动。每个状态(块)允许四种可能的动作:向左移动、向右移动、向上移动、向下移动。“0”表示不可能移动(如果你在左上角,就不能向左移动,也不能向上移动!)在计算的时候,我们可以把这个格子转换成表格。该表称为Q表(“Q”代表动作的“质量”)。每列代表四个动作(左、右、上、下),行代表状态。每个单元格的值代表给定状态和相应动作的最大预期未来奖励。每个Q表的分数将代表在给定最优策略状态下采取相应行动的最大预期未来奖励。为什么我们说“给定的策略”?这是因为我们没有实施它们。相反,我们只需要改进Q表就可以始终选择最佳动作。将此Q表视为“便利贴”游戏。多亏了这一点,我们通过找到每一行中的最高分,知道每个状态(Q表中的每一行)的最佳可能行动是什么。伟大的!我解决了城堡问题!但是等一下……我们如何计算Q表中每个元素的值呢?为了学习Q表中的每个值,我们将使用Q学习算法。Q-learning算法:学习动作价值函数(actionvaluefunction)动作价值函数(或“Q函数”)有两个输入:“state”和“action”。它将返回在该状态下执行该操作的预期未来奖励。我们可以将Q函数视为滚动Q表的阅读器,查找与当前状态关联的行和与操作关联的列。它返回匹配单元格的Q值。这是对未来回报的期望。在我们探索环境之前,Q表会给出相同的任意设置值(大多数情况下为0)。随着环境的不断探索,这个Q表将通过使用贝尔曼方程(动态规划方程)迭代更新Q(s,a)来提供越来越好的近似值。Q-learningAlgorithmProcessQ-learningAlgorithm的伪代码步骤1:初始化Q值。我们构建一个有m列(m=动作数)、n行(n=状态数)的Q-table,并将其中的值初始化为0。第2步:贯穿整个生命周期(或直到训练完成中止),重复步骤3至5,直到达到最大训练次数(由用户指定)或手动中止训练。第3步:选择一个操作。根据当前Q值估计选择状态s中的动作a。但是……如果每个Q值都等于0,我们首先应该选择什么动作呢?在这里我们可以看到探索/开发权衡的重要性。这个想法是,在开始时,我们将使用epsilon贪婪策略:我们指定探索率“epsilon”,并将其初始设置为1。这是我们将随机采用的步长。一开始,这个速率应该是最大值,因为我们不知道Q表中的任何值。这意味着我们需要通过随机选择动作来进行大量探索。生成一个随机数。如果这个数字大于epsilon,那么我们将“利用”(意味着我们在每一步使用我们已知的信息选择动作)。否则,我们将继续探索。在开始训练Q函数时,我们必须有一个大的epsilon。随着代理对估计的Q值更有信心,我们逐渐减少epsilon。第4-5步:评估!采取行动a并观察输出状态s'和奖励r。现在我们更新函数Q(s,a)。我们采取步骤3中选择的动作a,执行该动作会返回新的状态s'和奖励r。然后我们用贝尔曼方程更新Q(s,a):如下代码所示,更新Q(state,action):NewQvalue=CurrentQvalue+lr*[Reward+discount_rate*(highestQvaluebetweenpossibleactionsfromthenewstates')—CurrentQvalue]举个例子例子:一块奶酪=+1两块奶酪=+2很多奶酪=+10(训练结束)老鼠药=-10(训练结束)第一步:初始化Q-table初始化后的Q-table步骤2:选择一个动作。从起点开始,您可以选择向右走还是向下走。由于epsilon比率很大(因为到目前为止我们对环境一无所知),我们随机选择一个。例如向右走。我们随机移动(例如向右走),我们找到了一块奶酪(+1),现在我们可以通过贝尔曼方程更新开始时的Q值并向右走。步骤4-5:更新Q函数首先,我们计算Q值的变化ΔQ(start,right)。接下来我们将初始Q值添加到ΔQ(start,right)和学习率的乘积。将学习率视为网络丢弃旧值并生成新值的速度的度量。如果学习率为1,则新的估计成为新的Q值,而旧值被完全丢弃。更新后的Q表很棒!我们刚刚更新了第一个Q值。现在我们所要做的就是一次又一次地做这项工作,直到研究结束。实施Q-learning算法现在我们知道它是如何工作的,我们将逐步实施Q-learning算法。下面的Jupyternotebook中直接解释了代码的每一部分。你可以在我的深度强化学习课程repo中获取代码。项目地址:https://github.com/simoninitithomas/Deep_reinforcement_learning_Course/blob/master/Q%20learning/Q%20Learning%20with%20FrozenLake.ipynbReviewQ-learning是一种基于价值的强化学习算法,利用Q函数来找到最优秀的“行动选择”策略。它根据动作价值函数来评估应该选择哪种动作,它决定了处于某种状态并在该状态下采取某种动作的奖励的期望值。目的:最大化Q函数的值(给定状态和动作的预期未来奖励)。Q-table帮助我们找到每个状态的最佳动作。通过选择所有可能行动中的最佳行动来最大化预期回报。Q作为在特定状态下采取特定动作的质量的度量。函数Q(state,action)→返回在当前状态下采取该动作的预期未来奖励。这个函数可以通过Q-learning算法来估计,在我们探索环境之前使用贝尔曼方程迭代更新Q(s,a):Q-table给出相同的任意设定值→但随着环境的不断变化探索→Q给出了越来越好的近似值。就是这样!不要忘记自己实现代码的每一部分——尝试修改现有代码非常重要。尝试增加迭代次数、改变学习率并使用更复杂的环境(例如8*8网格Frozen-lake)。祝您玩得开心!原文链接:https://medium.freecodecamp.org/diving-deeper-into-reinforcement-learning-with-q-learning-c18d0db58efe【本文为机器之心专栏原文翻译,微信公众号《机器之心(id:almosthuman2014)》】点此查看该作者更多好文
