首页 > 其他分享 >无模型的强化学习方法

无模型的强化学习方法

时间:2024-03-09 13:45:44浏览次数:40  
标签:状态 动作 模型 差分 时序 学习 算法 Sarsa 强化

无模型的强化学习算法

学习「强化学习」(基于这本教材,强烈推荐)时的一些总结,在此记录一下。

动态规划算法需要马尔可夫决策过程是已知的(状态转移函数、奖励函数已知),智能体不用真正地与环境互动也能在「理性」世界里求得最优策略。

现实通常并非如此,环境已知恰恰是很少见的。所以这里来看看「无模型的强化学习方法」,主要介绍:基于 「时序差分」 的Sarsa 和 Q-learning。

时序差分方法

时序差分结合了「蒙特卡洛方法」和「动态规划」。在「蒙特卡洛方法」中我们知道,要想估计一个状态的价值,可以以该状态出发,模拟出大量状态转移序列再求得这些序列的期望回报:

\[ \begin{aligned} V{(s_t)} &= \frac{1}{k}\sum_{t=0}^k G_t\\ & = V{(s_t)} + \frac{1}{k}(G_t - V{(s_t)})--增量式\\ \end{aligned} \]

我们将 \(\frac{1}{k}\) 换成一个可任意设置的常数 \(\alpha\),表示对价值估计更新的步长;再将 \(G_t = E[R_t + \gamma V{(s_{t+1})}]\) 换成单步状态转移时的回报 \(r_t + \gamma V{(s_{t+1})}\),表示只需要当前步状态转移结束即可进行计算回报。可得到时序差分算法:

\[V(s_t) = V(s_t) + \alpha[r_t + \gamma V(s_{t+1}) - V(s_t)] \]

其中 \(r_t + \gamma V(s_{t+1}) - V(s_t)\) 被称为 「时序差分误差」

Sarsa算法

我们同样可以用时序差分算法来更新动作价值函数Q(s, a):

\[Q(s_t, a_t) = Q(s_t, a_t) + \alpha[r_t + \gamma Q(s_{t+1}, a_{t+1}) - Q(s_t, a_t)] \]

这样一来,在不知道「奖励函数 \(R\)」和「状态转移函数 \(P\)」的情况下,我们也可以通过执行动作来和环境交互得到反馈的数据(执行动作的奖励和下一个状态),再根据得到的数据用时序差分算法更新动作价值估计。

那该根据什么选取动作呢?可以使用 「\(\epsilon\)-贪心算法」 选取:每个状态都有 \((1-\epsilon)\) 的概率选取具有最大估计价值的动作,也有\(\epsilon\) 的概率随机选取一个动作,其中 \(\epsilon\) 是个很小的值。也就是说,采用这个算法有很大概率选「最好」的动作(跟普通贪心算法一样),也有小概率盲选(用于探索其它动作):

image

结合上面两个做法,我们可以制定这么一个强化学习流程:从初始状态出发,通过 \(\epsilon\)-贪心算法选择一个动作来执行,执行后通过环境得知奖励和新的状态,再在新的状态中通过 \(\epsilon\)-贪心算法选取动作与环境交互……重复这个过程直到到达目标状态。之后再从初始状态开始重复这个流程,多重复几次后,再贪心地在每一个状态选择动作价值最大的动作(即 \(\pi(s) = max{Q^\pi(s, a)}\))就可以得到满意的策略了。

这样,我们已经可以得到一个完整的强化学习算法了(教材中的图):

image

可以看到,这个算法的动作状态更新用到了当前状态s、当前选择动作a、执行动作获取的奖励r、执行动作后进入的下一个状态s'以及s'下选择的下一个动作a',故得名 「Sarsa算法」

多步Sarsa算法

蒙特卡洛方法会求整个序列的回报并取多个序列的回报期望用于评估状态价值,这是十分合理的,只是需要算很多序列后再进行策略提升,显得比较慢;时序差分法则比较快,但只用了一个奖励和下一状态的价值估计,这个估计终究不是真实的价值,显得不是很「准」。而 「多步Sarsa算法」 则综合二者,主要是将「时序差分误差」进行了调整:

image

它不像蒙特卡洛方法那样「全走完」,也不像Sarsa那样「走一步」,而是选择了「走n步」。也就是说靠近现在的一部分状态它会正常计算,离得比较远的则采取估计。算法的其它部分都与常规的Sarsa一样,只不过要注意有时可能还没走够n步就已经到达目标状态了,这时的估计部分就相当于0。

Q-learning算法

Q-learning算法也是基于「时序差分算法」实现的,与「Sarsa算法」最大的不同在于,它不是通过 \(\epsilon\)-贪心算法,而是通过 直接贪心 来获取下一个动作的(这与「贝尔曼最优方程」思想是一致的):

image

总结

采样数据的策略称为「行为策略」,用这些数据来更新的策略称为「目标策略」。如果一个算法中的行为策略和目标策略相同,那这个算法就是 「在线策略算法」;反之称为 「离线策略算法」

image

Sarsa 是在线策略算法,而 Q-learning 是离线策略算法。离线策略算法可以重用旧的策略产生的轨迹,可以节省资源,也更受欢迎。

标签:状态,动作,模型,差分,时序,学习,算法,Sarsa,强化
From: https://www.cnblogs.com/OwlCat/p/18062594

相关文章

  • 统计语言模型
    2024.3.8统计语言模型统计语言模型1.语言模型语言(人说的话)+模型(表示某个东西,完成某个任务)P1(“判断这个词的词性”),P2(“判断这个词的磁性”)**“判断这个词的"**2.统计语言模型用统计的方法去解决上述两个问题“判断这个词的词性”="判断","这个",”词“,”的......
  • Java学习笔记——第十天
    面向对象高级(一)staticstatic是一个关键字,义为静态,可以修饰成员变量和成员方法。static修饰成员变量成员变量的分类类变量(静态成员变量):有static修饰的成员变量,它们属于类,在计算机里只有一份,会被类的全部对象共享。实例变量(对象成员变量):无static修饰的成员变量,属于每个对象,每......
  • 苹果AppleMacOs系统Sonoma本地部署无内容审查(NSFW)大语言量化模型Causallm
    最近Mac系统在运行大语言模型(LLMs)方面的性能已经得到了显著提升,尤其是随着苹果M系列芯片的不断迭代,本次我们在最新的MacOs系统Sonoma中本地部署无内容审查大语言量化模型Causallm。这里推荐使用koboldcpp项目,它是由c++编写的kobold项目,而MacOS又是典型的Unix操作系统,自带clang编......
  • 学习unigui【23】uniDBGrid的使用摘要
    Unidbgrid自动调整列宽UniDBGrid1->ClientEvents->ExtEvents[Ext.data.Store[store]]addstore.loadfn:functionstore.load(sender,records,successful,eOpts){sender.grid.columnManager.columns.forEach(function(col){col.autoSize()})}UniDBGrid1.......
  • MYSQl学习笔记19: 外键约束
    外键约束用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性具有外键的表(emp)称为子表外键关联的表(dept)称为父表外键约束创建表时添加createtable表名(字段名数据类型,[constrain][外键名称]foreignkey(外键字段名)references主表(主表......
  • MYSQL学习笔记20: 外键约束(删除/更新行为)
    外键约束删除/更新行为setdefault在mysql的默认引擎innodb中不支持CASCADEaltertable表名addconstraint外键名称foreignkey(外键字段)references主表名(主表字段名)onupdatecascadeondeletecascade;建立外键约束#如果父表和子表建立外键的字段有不同的......
  • MYSQL学习笔记17: 流程控制函数(IF, CASE)
    流程控制函数(IF,CASE)ifselectif(true,'ok','error');selectif(false,'ok','error');/*相当于iftrue:ok;else:error;*/ifnullselectifnull('ok','default');selectifnull(......
  • MYSQL学习笔记18: 约束
    约束约束是作用于表中字段上的规则,用于限制存储在表中的数据.保证表中的正确性,有效性和完整性约束作用于表中字段上,可以在建表和修改表时为表添加约束按照需求创建表,并创建约束createtableusers(idintprimarykeyauto_incrementcomment'主键',n......
  • MYSQL学习笔记15: 数值函数
    数值函数ceil向上取整(并不是四舍五入)selectceil(1.5);selectceil(2.1);floor向下取整selectfloor(3.9);selectfloor(2.0);mod取模(余数)selectmod(7,4);rand0-1的随机小数,不包括0和1selectrand();round四舍五入#参数2:保留的......
  • MYSQL学习笔记16: 日期函数
    日期函数返回当前日期selectcurdate();返回当前时间(24小时制)selectcurtime();返回当前日期+时间selectnow();YEAR,MONTH,DAY获取当前时间对应的年月日selectyear(now());selectmonth(now());selectday(now());在制定日期上增加时间后的日期......