对Q-learing算法的见解
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对Q-learing算法的见解相关的知识,希望对你有一定的参考价值。
参考技术A 姓名:周弘毅学号:17020120012
对Q-learing算法的见解
一、 核心算法概述
a) Q 表的构建
此程序所用到的强化学习算法为经典的q-learning算法,我认为,q-learning算法的核心步骤为构建出一张q表,因为这张q表是智能体处于不同状态所采取相应策略的依据,只有q表构建的合理有效,才能保证智能体在各个状态中选择最优策略,从而完成给定目标。我将在第二部分—— 核心算法构建 中详细讲述我的构建思路
b) Q 表的更新
构建出q表后,下一个需要解决的问题是如何对Q表不断更新,依据我们自身的学习经验,我们多数的学习过程就是一个“试错”的过程,即通过不断的尝试,在重复的试验中归纳经验,不断学习,不断增强对事物的认知,将这个思想运用在程序的设计中,可以将其抽象为我们对q表的更新,我将q表当作是智能体的大脑(因为智能体依据q表采取策略,这与人类采取行动之前大脑先进行思考类似),而q表的更新就相当于是人类不断学习的过程,按照之前对人类学习行为的表述,q表的更新依据就是智能体重复执行给定任务过程中所获得的“奖励”或“惩罚”。由此我们对q表的更新方式有了一个具体的要求:q表的更新方式应为可以通过不断重复某个任务且根据任务执行结果自动进行更新的一种方式。
在解决q表的构建和q表的更新问题之后,我们就成功的为智能体获取“智能“找到了方法。接下来,我将介绍我对q表进行构建的所采用的数学模型以及对其进行更新的具体方案。
二、 核心算法构建
a) Q 表的构建过程
i. Q表的数学模型
对于我对Q表的认识——智能体处于不同状态所采取相应策略的依据,我采用了动态二维矩阵对Q表进行建模,这个二维矩阵有m行,n列。
ii. Q表的构建方法
Q表是一个m×n的二维矩阵,其中m的实际意义为智能体所有可能状态的数量,n的实际意义为在某个状态下所有可能执行动作的数量,之所以才用动态矩阵,是因为智能体出生时对环境时陌生的,通过不断的试验,智能体会遇到越来越多的状态,此时增加一个判断,若是之前未遇见的状态,则需要对Q表进行扩充。矩阵中的任意一个元素[if !msEquation] [endif]表示智能体处于状态i执行动作j的 “价值“
b ) Q 表的更新过程
Q表的更新依据是重复执行给定任务的结果,拿我的程序作为例子,我需要它执行的任务在迷宫中寻找金币,但由于迷宫中还有陷阱存在,所以对于智能体每次执行任务,只会产生两种结果,找到金币或掉入陷阱。此时就可以引入奖励机制——如果他在一次任务中成功的获得金币,那么就给他一个奖励分,否则就给他一个负的奖励分。我们将这个奖励分与智能体在某个状态采取某个动作的 “价值“ 联系起来,这个价值就是Q表中某个元素的值。
算法的灵魂(对q-learning的认识):
假设我已按上述过程构建了q表,我们要解决这样一个问题——依旧用我的迷宫为例子,智能体在某个状态(假设为S)执行某个动作A之后,会进行一次状态的转移,到下一个状态NS,此时若NS并不是吃到金币或掉入陷阱,那就不会产生奖励分,那么这次行为是不是就没有意义了呢?
当然不是!为了解决这个问题,我们要认清出“奖励”与“价值”的区别,我的理解是,奖励是实实在在的,是真实存在的,拿到了金币,是确实得到了这个金币,然而”价值“是一个抽象的概念,它的内涵是你执行这个动作之后,虽然没有实实在在的获得金币,但是依旧是有意义的,就好像修《人工智能》这门课,你平时去主动学习人工智能的知识,虽然不能保证你一定能通过这门课的考试,获得实实在在的分数,但是确可以增加你通过考试的期望。再具体一点就是,只有考试才能获得分数(也就是真实的奖励),但你平时的学习并不能让你获得分数,只能让你有更多的知识储备,使得考试获得高分的概率大大增加(也就是价值),所以说,虽然平时学习是没有”奖励“,但是有”价值“。
明白了这两者的区别,这个问题就很好解决了,当智能体到达状态NS后,虽然没有获得奖励,但是我们可以给出这次行为(即在S状态选择动作A)的价值,如此一来,我们就可以对Q表中的这个值Q(S,A)进行迭代了,我用Qreal表示这次行为所真实获得的价值,它的计算过程是此次行为所获得的奖励加上下个状态最可能做出的行为的价值乘以一个衰减因子η:
Qreal=reward+Q(NS,AMAX)*η
再用Qpre表示这次行为所预计获得的价值
Qpre=Q(S,A)
现在我们有了真实值和估计值,就可以用两者的差来更新Q表了。
Q(S,A)=Q(S,A)+α*(Qreal-Qpre)
对敏捷开发的见解
敏捷开发的原则是:
(1)尽早并持续地交付有价值的软件以满足顾客的需求;
(2)敏捷流程欢迎需求的变化,并利用这种变化来提高用户的竞争优势;
(3)经常发布可用的软件,发布间隔可以从几周到几个月,能短则短;
(4)业务人员和开发人员在项目开发过程中应该每天共同工作;
(5)以有进取心的人为项目核心,充分支持信任他们;
(6)无论团队内外,面对面的交流始终是最有效的沟通方式;
(7)可用的软件是衡量项目进展的主要指标;
(8)敏捷流程应能保持可持续的发展。 领导, 团队和用户应该能按照目前步调持续合作下去;
(9)只有不断关注技术和设计才能越来越敏捷;
(10)保持简明 - 尽可能简化工作量的技艺 - 极为重要;
(11)只有能自我管理的团队才能创造优秀的架构, 需求和设计;
(12)时时总结如何提高团队效率, 并付诸行动。
敏捷开发是一种以人为核心、迭代、循序渐进的开发方法。在敏捷开发中,软件项目的构建被切分成多个子项目,各个子项目的成果都经过测试,具备集成和可运行的特征。其本质就是一个合作和改进的过程。只有不断的改进,才能避免模式的照搬照抄,做出符合需求的,健壮的系统。
敏捷开发方法是“适应性”(Adaptive)而非“预设性” (Predictive)。敏捷开发方法是“面向人” (people oriented)而非“面向过程”(process oriented)。
敏捷开发团队中客户是最重要的角色,即系统的最终使用者。因为客户是需求的真正来源
以上是关于对Q-learing算法的见解的主要内容,如果未能解决你的问题,请参考以下文章
投稿Machine Learing With Spark Note 3:构建分类器
投稿Machine Learing With Spark Note 3:构建分类器
Coursera公开课-Machine_learing:编程作业7