首页 > 编程语言 >Reinforcement Learning之Q-Learning - Python实现

Reinforcement Learning之Q-Learning - Python实现

时间:2023-06-03 22:13:29浏览次数:60  
标签:function begin end Python equation Reinforcement Learning pi

  • 算法特征
    ①. 以真实reward训练Q-function; ②. 从最大Q方向更新policy \(\pi\)

  • 算法推导
    Part Ⅰ: RL之原理
    整体交互流程如下,

    定义策略函数(policy)\(\pi\), 输入为状态(state)\(s\), 输出为动作(action)\(a\), 则,

    \[\begin{equation*} a = \pi(s) \end{equation*} \]

    令交互序列为\(\{\cdots, s_t, a_t, r_t, s_{t+1}, \cdots\}\). 定义状态值函数(state value function)\(V^{\pi}(s)\), 表示agent在当前状态\(s\)下采取策略\(\pi\)与environment持续交互所得累计奖励之期望(cumulated reward expectation), 则,

    \[\begin{equation*} V^{\pi}(s_t) = r_t + V^{\pi}(s_{t+1}) \end{equation*} \]

    定义状态动作值函数(state-action value function)\(Q^{\pi}(s, a)\), 表示agent在当前状态\(s\)下强制采取动作\(a\)接下来采取策略\(\pi\)与environment持续交互所得累计奖励之期望, 则,

    \[\begin{equation*} \begin{split} Q^{\pi}(s_t, a_t) &= r_t + Q^{\pi}(s_{t+1},\pi(s_{t+1})) \\ &= r_t + V^{\pi}(s_{t+1}) \end{split} \end{equation*} \]

    定义最优\(\pi^*\), 使状态值函数\(V^{\pi}\)最大化, 即,

    \[\begin{equation*} \begin{split} \pi^* &= \mathop{\arg\max}_{\pi}\ V^{\pi}(s) \\ &= \mathop{\arg\max}_{\pi}\ Q^{\pi}(s, \pi(s)) \end{split} \end{equation*} \]

    连续空间中, Q-function实现如下,

    离散空间中, Q-function实现如下,

    Part Ⅱ: RL之实现
    训练tips:
    ①. target network中Q-function在一定训练次数内可以保持不变
    ②. exploration使数据采集更加丰富

    • Epsilon Greedy

      \[\begin{equation*} a = \left\{ \begin{split} \mathop{\arg\max}_{a}\ Q(s, a), \quad & \text{with probability }1-\varepsilon\\ \text{random}, \quad\quad\quad & \text{with probability }\varepsilon \\ \end{split} \right. \end{equation*} \]

      \(\varepsilon\)取值在训练期间逐渐减小
    • Boltzmann Exploration

      \[P(a|s) = \frac{\exp(Q(s,a))}{\sum_a\exp(Q(s,a))} \]

    ③. Replay Buffer中以\((s_t, a_t, r_t, s_{t+1})\)为单位进行数据存储, 数据可以来源于不同的policy \(\pi\). buffer中保存新数据剔除旧数据, 每次迭代中随机抽取某个batch进行训练.
    算法流程如下,
    Initialize Q-function \(Q\), target Q-function \(\bar{Q} = Q\) (Note: target nework)
    for each episode
    \(\quad\) for each time step \(t\)
    \(\qquad\) Given state \(s_t\), take action \(a_t\) based on \(Q\) (Note: exploration)
    \(\qquad\) Obtain reward \(r_t\), and reach new state \(s_{t+1}\)
    \(\qquad\) Store \((s_t,a_t,r_t,s_{t+1})\) into buffer (Note: replay buffer)
    \(\qquad\) Sample \((s_i, a_i, r_i, s_{i+1})\) from buffer (usually a batch)
    \(\qquad\) Target \(\bar{y}=r_i + \max_a\ \bar{Q}(s_{i+1}, a)\)
    \(\qquad\) Update the parameters of \(Q\) to make \(Q(s_i, a_i)\) close to \(\bar{y}\) (regression)
    \(\qquad\) Every \(c\) steps reset \(\bar{Q}=Q\)

  • 代码实现
    本文以SnakeGame为例进行算法实施, 将游戏网格化, 并将输入feature分配在不同channel上, 最后利用卷积抽取并识别该feature. 具体实现如下,
    Q-Learning-for-SnakeGame

  • 结果展示

    可以看到, SnakeGame之训练效果符合预期.

  • 使用建议
    ①. Batch Normalization使特征分布在原点附近, 不容易数值溢出
    ②. 复杂特征可以由二元特征组成, 具体含义自定义

  • 参考文档
    ①. Q-Learning强化学习 - 李宏毅
    ②. Python + PyTorch + Pygame Reinforcement Learning – Train an AI to Play Snake

标签:function,begin,end,Python,equation,Reinforcement,Learning,pi
From: https://www.cnblogs.com/xxhbdk/p/17450089.html

相关文章

  • 【Python】如何在FastAPI中使用UUID标记日志,以跟踪一个请求的完整生命周期
    为什么要使用uuid标记日志?在分布式系统中,一个请求可能会经过多个服务,每个服务都会生成自己的日志。如果我们只使用普通的日志记录,那么很难将这些日志串联在一起,以至难以跟踪一个请求的完整生命周期。如果能够使用uuid标记日志,为每个请求生成一个唯一的uuid,且这个日志可以在不同......
  • python版本的“共轭梯度法”算法代码
    在看代码的过程中遇到了共轭梯度法这个概念,对这个算法的数学解释看过几遍,推导看过了,感觉懂了,然后过上一些日子就又忘记了,然后又看了一遍推导,然后过了一些日子也就又忘记了,最后想想这个算法的数学解释就不要再取深究了,毕竟平时也不太会用到,偶尔用到了只要保证代码会写也就OK了。  ......
  • VSCode 如何将已编辑好的python文件中的 tab 键缩进转换成4个空格键缩进
    事情起源:使用vscode维护一个7年前的python项目,发现编辑后运行报错,提示缩进错误,原因是当时的项目使用tab做缩进,而我正在用的vscode是使用4空格做缩进,因此造成了缩进不匹配的问题。  如何解决?把自己的vscode缩进从4空格改为tab貌似是最可行的,但是考虑其他项目的匹配问题又总不能老......
  • 【python基础】复杂数据类型-列表类型(排序/长度/遍历)
    1.列表数据元素排序在创建的列表中,数据元素的排列顺序常常是无法预测的。这虽然在大多数情况下都是不可避免的,但经常需要以特定的顺序呈现信息。有时候希望保留列表数据元素最初的排列顺序,而有时候又需要调整排列顺序。python提供了很多列表数据元素排序的方式,可根据情况选用。1......
  • [转] 十分钟掌握Seaborn,进阶Python数据可视化分析
      -为什么用Seaborn-Seaborn是基于Python且非常受欢迎的图形可视化库,在Matplotlib的基础上,进行了更高级的封装,使得作图更加方便快捷。即便是没有什么基础的人,也能通过极简的代码,做出具有分析价值而又十分美观的图形。Seaborn可以实现Python环境下的绝大部分探索......
  • 02 python爬虫-bs4
    目录步骤代码结果new.csv图片步骤爬取主页面中的文章详情的url和图片地址下载图片并请求加文章详情中的页面内容爬取文章详情中的标题、作者、发布时间代码importrequestsimportcsvfrombs4importBeautifulSoup#请求的一级页面的地址q_url='http://xinfadi.com.cn/new......
  • python 操作 xlsx
    目录读取/写入:openpyxldemo1读取/写入:openpyxldemo1importopenpyxlimportos#创建exceldefwrite_excel_xlsx(path,sheet_name,value):ifnotos.path.exists(path):write_new_excel_xlsx(path,sheet_name,value)else:append_write_excel_x......
  • Python潮流周刊#5:并发一百万个任务要用多少内存?
    你好,我是猫哥。这里记录每周值得分享的Python及通用技术内容,部分为英文,已在小标题注明。(标题取自其中一则分享,不代表全部内容都是该主题,特此声明。)博客原文:https://pythoncat.top/posts/2023-06-03-weekly5文章&教程1、并发一百万个任务要用多少内存?(英文)文中测试了主流的编......
  • python内置库-email
    email库简要介绍eamil库用来创建和解析电子邮件,这些电子邮件可结合smtp协议和pop协议来发送及收取位于email包的中心的类就是EmailMessage这个类,利用它可构造一个邮件对象,利用这个邮件对象可添加正文、添加附件、设置收发件人具体的官网文档不太好懂,下面给出几个示例实例......
  • 用chartGPT学习一门语言--python(提问示范)
    1. 2. 3. 4 5. 6. ......