当前位置: 首页 > article >正文

机器学习(李宏毅)——RL(强化学习)

一、前言

本文章作为学习2023年《李宏毅机器学习课程》的笔记,感谢台湾大学李宏毅教授的课程,respect!!!

二、大纲

  1. What is RL?
  2. Three steps in ML
  3. Policy Gradient
  4. Actor-Critic
  5. Reward Shaping

三、What is RL?

引例
RL(Reinforcement Learning),也就是强化学习或者称为增强式学习,学习之前先看一个例子:
在这里插入图片描述
说明上图例子:
5. supervised learning
我们都知道supervised learning(监督学习)就是输入的数据有与之对应的标签,举例而言在图像分类领域,输入一张猫咪图片,人类会有对应label是cat,然后收集一堆这样的数据,train下去就结束了。
6. reinforcement learning
那如果把环境互动这件事情纳入进来,例如是下围棋,你下一步棋子,轮到对方怎么下这就很难讲了。
有人说,那穷举呗,这就更恐怖了,围棋棋盘是19x19的,总共有361个交叉点。每个点可以有黑子、白子或者空着。所以,如果只考虑每个点的状态,可能的局面总数应该是3的361次方。不过,这个数字超级大,远远超过已知宇宙中的原子数了。
那能不能让机器看过很多的围棋高手对决的棋盘,用supervised learning的方式train下去呢?可以这么做,遇到普通对手也许能赢(比较常规吗),但可能是赢不过高手的,因为棋盘布局变化可以很大呀,要是监督学习没看过的棋盘风格,可能就傻眼了进行不下去了。
于是,就有了reinforcement learning(强化学习)的提出。

reinforcement learning(强化学习)?
那啥是reinforcement learning(强化学习),三个关键点:

  1. 环境互动。环境存在变化,机器与环境互动。
  2. 不定性。解释为人类无法计算正确答案或是无标准答案或者答案过去发散。
  3. 奖励机制。

一言以蔽之:强化学习是一种通过环境互动在不确定环境中基于奖励机制学习最优策略的机器学习方法。
在这里插入图片描述
说明:

  • step1:两个主体,Actor和Environment(机器和环境)
  • step2:Actor看到外界Environment的变化做出动作Action
  • step3:做出Action后,会收到来自外界Environment的Reward
  • step4:Actor做出动作也会改变环境,回到step2进行循环往复下去,直到满足结束条件。

历史发展

  • 2013: Deep Q-Network (DQN) 由 DeepMind 提出,结合深度学习(Deep Learning)和 Q-learning,在 Atari 游戏上实现突破。
  • 2016: AlphaGo 击败围棋世界冠军,采用 蒙特卡洛树搜索(MCTS)+ 深度强化学习,标志性突破。
  • 2017: A3C(Asynchronous Advantage Actor-Critic) 提出,提高训练效率。
  • 2018: AlphaZero 和 OpenAI Five 进一步推动强化学习在围棋、Dota2 等复杂环境中的应用。

实际例子

  1. 太空侵入者(space invader)
    在这里插入图片描述

【游戏说明】
依照上图自底向上介绍:
1、绿色的是太空船(操作是开火、左移、右移);
2、shield是防护罩,作用是防护太空船,但是被外星人击中会损坏一点儿;
3、黄色中间部分是外星人,会随机发射子弹;
4、顶部是得分score(reward)。
链接:https://freeinvaders.org/#google_vignette

【流程演示】
在这里插入图片描述
说明:第一次往右移动,没有得分。第二次开火得到5分。

2 阿法狗围棋(经典)
同样是观察对手棋盘的变化,但是reward不是实时的,而是等到对局结束之后才有,后续会补充Sparse Reward(稀疏奖励)。

【流程演示】
在这里插入图片描述

四、Three steps in ML

那怎么来做RL呢?
和机器学习一样,三步走策略:
在这里插入图片描述

  • Step1:function with unknown(找一个函数方法)
  • Step2:define loss from training data(定义损失函数)
  • Step3:optimization(最佳化)

具体细说:

Step1:function with unknown(找一个函数方法)
在这里插入图片描述
这个模型的定义可以是CNN或者是其他的神经网络,输入是环境信息,输出是动作(在这个游戏中就是left、right、fire)。

Step2:define loss from training data(定义损失函数)
对于该游戏而言,就是要当游戏结束时候得到的分数最高,而这个最终得分是由每次的动作共同决定的。

假设每次的执行动作的得分是reward(记为r),时间记为t,那最终的得分就应该是 R = ∑ t = 1 T r t R = \sum_{t=1}^T r_t R=t=1Trt
我们期望R越大越好,其实也就是 -R越小越好。

注:一局游戏称为一个episode,一局游戏里面的最后分数称为return。

Step3:optimization(最佳化)
损失函数有了,那不就是Gradient decent下去求不就好了?
非也非也,为啥呢?
让我们来看看输入是什么,是环境(Environment)和做出的动作(Action)呀,这两玩意儿可不是神经网络,就像黑盒子一样,里面有随机性,是不能直接用梯度下降算法的,这也是RL的难点所在。

所以这里有种叫做Policy Gradient的方法出现了!

五、Policy Gradient

5.1 概念

那何为Policy Gradient?
答:policy的字面意思就是策略,Policy Gradient翻译过来就是梯度策略,原来就是要找一个策略来训练RL中的Actor。

啥策略呢?
答:引导策略,也是一种奖惩机制。

形象例子(chatgpt给出来的):
可以用下面这个具体的例子来说明 Policy Gradient 在屌丝追求女生中的应用:

假设屌丝小明有三种搭讪策略(即行动选择):

1、赞美——直接夸女生漂亮。
2、讲笑话——尝试用幽默打破僵局。
3、请喝咖啡——邀请女生共度轻松时光。

初始状态:

  • 小明一开始没有特别偏好,每种方法的选择概率都是相等的(比如各 33%)。

每次尝试(Episode):

1、小明在某个场合遇到了女生,他随机选择了一种方法。
2、根据女生的反应,他会得到一个“奖励”:

  • 如果女生反应热烈(比如露出笑容、愿意多聊),奖励为 +1。
  • 如果女生反应平淡,奖励为 0。
  • 如果女生反应冷淡或不悦,奖励为 -1。

实际情况:

  • 第一次尝试:
    小明选择了赞美。
    女生听了之后觉得有点受宠若惊,给了他 +1 奖励。

  • 第二次尝试:
    小明又遇到不同的女生,这次选择了讲笑话。
    女生觉得笑话有点冷场,结果奖励为 -1。

  • 第三次尝试:
    小明选择了请喝咖啡。
    女生觉得这个提议不错,奖励为 +1。

策略梯度更新:
根据这几次尝试,小明会用 Policy Gradient 算法调整自己的“搭讪策略”参数:

  • 对于得到正奖励的行为(赞美、请喝咖啡),他会增加它们在未来被选择的概率。
  • 对于得到负奖励的行为(讲笑话),他会减少选择的概率。

经过不断试错和调整后,小明的策略会逐渐偏向于那些能带来正面反馈的方法,从而整体提高他追求女生的成功率。

这就是policy gradient的精髓了。

5.2 原理

回归到space invader游戏中,设环境变量为s,模型执行的动作为a,â为训练数据的真值,倾向程度为A(正数表示奖励,负数表示惩罚)。
在这里插入图片描述
这里还是用Cross-entropy(交叉熵)来衡量模型输出的action和训练数据实际执行行动的â概率分布接近情况,不想做的行动action给个负号(也就是惩罚),求和起来进行Loss,可进行gradient decent求解。
在这里插入图片描述
那训练数据哪里来呢?
就是直接玩很多局的游戏,把每局游戏的各个动作、环境、得分记录下来。

但是有以下疑问:
1、比如向左、向右这种动作,reward是零,但是就一定是不重要的吗?
2、比较早的动作和比较晚的动作对游戏终局的影响是不一样的吧?
3、每次动作得分reward的好坏是相对的吧,标准是人定的才对吧?

回答:是的,有些动作reward是零但并不代表其不重要,另外比较早的动作往往是比比较晚的动作来得重要(和人生一样,等到要结束人生时才想起要好好学习李宏毅老师的课那也没啥意义了)。每次动作得分reward的好坏确实是相对,标准可以自定义。下图直观回答了以上3个问题:
在这里插入图片描述
用伪代码表示如下:
在这里插入图片描述
重要点
有个很重要的点,就是一局游戏的训练数据只能用来更新一次模型参数,这样也是合理的,因为这些训练数据的产生是通过机器与环境交互的,机器的参数都变了,上一世代机器产生的数据当然就不适用了呢。
在这里插入图片描述
On-policy v.s. Off-policy

  • On-policy:在线策略就是上述很慢的那种,一批数据更新一次参数,更新完的模型再收集一次数据,再更新一下。用两个字来形容就是等待,通俗解释就是行为和学习过程是一体的。
  • Off-policy:离线策略就比较快,形象地说就是懂得从别人的经验中找差距,通过回顾历史数据或者从其他策略学习,能利用更多样本,适合需要更高效率或者快速学习的任务。

六、Actor-Critic

Critic 翻译为裁判之意,Actor-Critic也就是模型裁判

那什么是Actor-Critic呢?
通俗来讲就是在玩游戏过程中,执行某个action之前,对游戏终局得分的预判。精髓就是“未卜先知”,当然我们游戏玩完之后,discounted cumulated reward肯定就知道了,所以这里就是预判的模型。

方法
设评估方法为 Vθ(s),其中输入s为当前环境观察,θ则是当前Actor的参数,然后模型V要给出预判的得分,而我们期望与最后的discounted cumulated reward越接近越好。
在这里插入图片描述

那怎么训练出Actor-Critic呢?
有两种方法:

  • Monte-Carlo (MC) based approach
  • Temporal-difference (TD) approach

1、Monte-Carlo (MC) based approach
基本思想:先拿需要评估的actor和环境互动很多轮,我们就有了看到环境s获得的discounted cumulated reward。再训练Vθ(s)使用其输出和discounted cumulated reward越接近越好。
缺点:得玩完整场游戏才有训练资料,万一游戏时间很长,那就比较耗费时间。于是有了Temporal-difference (TD) approach。
在这里插入图片描述

2、Temporal-difference (TD) approach
万一游戏很长,相当耗费时间,还得玩完了才有训练资料,那能不能看局部就行呢?
TD的基本思想就是只看相邻的情况。

假设时间 t 时刻,观察为 s t s_t st,采取的行动为 a t a_t at,得分为 r t r_t rt,γ是衰减系数,写成Vθ( s t s_t st)如下:

Vθ( s t s_t st) = r t r_t rt + γ r t + 1 r_{t+1} rt+1 + + γ² r t + 2 r_{t+2} rt+2 + …

那么时间 t+1 时刻,观察为 s t + 1 s_{t+1} st+1,采取的行动为 a t + 1 a_{t+1} at+1,累计的得分为 r t + 1 r_{t+1} rt+1,γ是衰减系数,写成Vθ( s t + 1 s_{t+1} st+1)如下:

Vθ( s t + 1 s_{t+1} st+1) = r t + 1 r_{t+1} rt+1 + γ r t + 2 r_{t+2} rt+2 + + γ² r t + 3 r_{t+3} rt+3 + …

联立起来发现两者之间的关系:
在这里插入图片描述
那critic怎么用在训练actor上面呢?
使用Advantage Actor-Critic:
在这里插入图片描述

七、Reward Shaping

如果多数的reward都是零的时候怎么办呢?就比如下围棋。
应该要想办法提供额外的reward以供机器学习,并且加上好奇心也是有用的,这就是reward shaping。
像绝地求生、王者荣耀的游戏NPC会用得到。
有用到再深入研究吧~


http://www.kler.cn/a/558118.html

相关文章:

  • Moving Assets/KrishnaPalacio to Assets/Resources: 拒绝访问。
  • Selenium+OpenCV处理滑块验证问题
  • 大数据组件(四)快速入门实时数据湖存储系统Apache Paimon(2)
  • MySQL日志undo log、redo log和binlog详解
  • 【用deepseek和chatgpt做算法竞赛】——还得DeepSeek来 -Minimum Cost Trees_5
  • Linux 驱动入门(5)—— DHT11(温湿度传感器)驱动
  • 【p-camera-h5】 一款开箱即用的H5相机插件,支持拍照、录像、动态水印与样式高度定制化。
  • 微服务环境搭建架构介绍(附超清图解源代码)
  • Ubuntu 下 nginx-1.24.0 源码分析 - ngx_os_specific_init函数
  • Unity游戏制作中的C#基础(1)界面操作基础
  • leetcode 2506. 统计相似字符串对的数目 简单
  • Spring Boot(十六):使用 Jenkins 部署 Spring Boot
  • 优艾智合获批广东省复合协作机器人工程技术研究中心
  • 力扣——跳跃游戏 II
  • 前端开发常见问题与面试-02
  • Linux--进程(进程虚拟地址空间、页表、进程控制、实现简易shell)
  • ubuntu部署小笔记-采坑
  • C++ ——继承
  • Linux C 静态库如何生成并使用
  • Leetcode K个一组翻转链表