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

初探Reforcement Learning强化学习【QLearning/Sarsa/DQN】

文章目录

      • 一、Q-learning
        • 现实理解:
        • 举例:
        • 回顾:
      • 二、Sarsa
        • 和Q-learning的区别
      • 三、Deep Q-Network
        • Deep Q-Network是如何工作的?
          • 前处理:
          • Convolution Networks
          • Experience Replay

一、Q-learning

是RL中model-free、value-based算法,Q即为Q(s,a)就是在某一时刻s (s∈S)状态下采取动作a (a∈A) 能够获得收益的期望,环境根据Agent的动作反馈相应的回报reward。将State与Action构建成一张Q-table来存储Q值,然后根据Q值来选取能够获得最大的收益的动作。

Q-Tablea1a2
s1q(s1,a1)q(s1,a2)
s2q(s2,a1)q(s2,a2)
s3q(s3,a1)q(s3,a2)

也就是马尔科夫决策过程:每个格子都是一个状态 s t s_t st, π ( a ∣ s ) \pi(a|s) π(as)在s状态下选择动作a的策略。 P ( s ’ ∣ s , a ) P(s’|s,a) P(s’∣s,a) ,也可以写做 P s s ′ a P^a_{ss'} Pssa为s状态下选择动作a转换到下一状态 s ′ s' s的概率。 R ( s ’ ∣ s , a ) R(s’|s,a) R(s’∣s,a)表示这一Action转移的奖励。

在这里插入图片描述

我们的目标是最大累计奖励的策略期望:

m a x π E [ ∑ t = 0 H γ t R ( S t , A t , S t + 1 ) ∣ π ] max_π E [ ∑ _{t = 0} ^H γ^ t R ( S_t , A_t , S_t + 1 )∣π] maxπE[t=0HγtR(St,At,St+1)π]

使用了时间差分法TD能够离线学习,使用bellman方程对马尔科夫过程求最优解。

在我们探索环境(environment)之前,Q-table 会给出相同的任意的设定值(大多数情况下是 0)。随着对环境的持续探索,这个 Q-table 会通过迭代地使用Bellman方程(动态规划方程)更新 Q(s,a) 来给出越来越好的近似。

在这里插入图片描述

算法是基于贪婪的策略进行选择:

在这里插入图片描述

S t e p 4 Step 4 Step4中选择动作a并且执行动作并返回一个新的状态 s ’ s’ s和奖励r,使用Bellman方程更新 Q ( s , a ) Q(s,a) Q(s,a):

在这里插入图片描述

新 Q ( s , a ) = 老 Q ( s , a ) + α ∗ ( 现实 − 估计 ) 新Q(s,a)=老Q(s,a)+\alpha*(现实-估计) Q(s,a)=Q(s,a)+α(现实估计)

现实理解:

在状态s采取行动a到达 s ′ s' s,但是我们用于决策的Q表并没有实际采取任何行为,所以我们只能使用期望值进行下一个状态 s ′ s' s各个动作的潜在奖励评估:

  • Q-Learning的做法是看看那种行为的Q值大,把最大的 Q ( s ′ , a ′ ) Q(s', a') Q(s,a) 乘上一个衰减值 γ \gamma γ (比如是0.9) 并加上到达 s ′ s' s时所获取的奖励 R(真真实实存在的)
  • 这个值更新为现实中的新Q值
举例:
  • 一块奶酪 = +1
  • 两块奶酪 = +2
  • 一大堆奶酪 = +10(训练结束)
  • 吃到了鼠药 = -10(训练结束)

img

S t e p 1 Step 1 Step1 初始化Q表都是0(所有状态下的所有动作)

S t e p 2 Step2 Step2 重复 S t e p 3 − 5 Step3-5 Step35

S t e p 3 Step 3 Step3 选择一个动作:向右走(随机)

img

S t e p 4 Step 4 Step4 更新Q函数

在这里插入图片描述

  • 首先,我们计算 Q 值的改变量 ΔQ(start, right)。
  • 接着我们将初始的 Q 值与 ΔQ(start, right) 和学习率的积相加。
回顾:
  • Function Q(state, action) → returns expected future reward of that action at that state.
  • Before we explore the environment: Q table gives the same arbitrary fixed value → but as we explore the environment → Q gives us a better and better approximation.

二、Sarsa

State-Action-Reward-State-Action,清楚反应了学习更新函数依赖的5个值,分别是当前状态S1,当前状态选中的动作A1,获得的奖励Reward,S1状态下执行A1后取得的状态S2及S2状态下将会执行的动作A2

img

和Q-learning的区别
  • Q_learing下一步q表最大值 γ ∗ m a x a ′ Q ( s ′ , a ′ ) + r γ*max_{a'}Q(s^′,a')+r γmaxaQ(s,a)+r
  • Sarsa:具体的某一步估计q值 γ ∗ Q ( s ′ , a ′ ) + r γ*Q(s^′,a^′)+r γQ(s,a)+r

img

Q-learning更激进,当前的Q值和以后的Q都有关系,越近影响越大

  • Q_learning:取max,也就是不考虑最终走到很大负奖励的值,只考虑会不会最终获得最大奖励,如果获得了,那这条路就牛逼,所以么Q-learning更勇猛,不害怕错,更激进
  • Sarsa :是取某具体的一步,只要周围有错(很大的负奖励),那么就有机会获得这个不好的奖励,那么整条路反馈都会评分很差。之后会尽量避开。那么最终导致Sarsa会对犯错更敏感,会远离犯错的点,更保守

三、Deep Q-Network

成千上万的状态和动作,Q-Table显然不现实。使用Q-Network网络将在给定状态的情况下近似每个动作的不同 Q 值。

Image

Deep Q-Network是如何工作的?

Image

  • input: 一组 4 帧
  • 为给定状态下每个可能的动作输出一个 Q 值向量
  • output:取这个向量中最大的 Q 值来找到我们的最佳行动
前处理:

Image

  1. 对每个状态进行灰度化,降低state复杂度
  2. 裁剪帧
  3. 减小帧的大小,将四个帧堆叠在一起。堆叠?因为它可以帮助我们处理时间限制问题,产生运动的概念
Convolution Networks

使用一个具有 ELU 激活函数的全连接层和一个输出层(具有线性激活函数的全连接层),为每个动作生成 Q 值估计。

Experience Replay

problem1:

  • 权重的可变性,因为动作和状态之间存在高度相关性。
  • 将与环境交互的顺序样本提供给我们的神经网络。它往往会忘记以前的体验,因为它会被新的体验覆盖。

solution:

  • create a “replay buffer.” This stores experience tuples while interacting with the environment, and then we sample a small batch of tuple to feed our neural network.
  • 重播缓冲区视为一个文件夹,其中每个工作表都是一个体验元组。您可以通过与环境交互来喂养它。然后你随机获取一些工作表来馈送神经网络

Image

problem2:

  • 每个 action 都会影响下一个 state。这将输出一系列可以高度相关的体验元组。按顺序训练网络,我们的Agent可能会受到这种相关性的影响。

从 replay buffer中随机采样,我们可以打破这种相关性。这可以防止作值发生振荡或发散。

solution:

  • 停止学习,同时与环境互动。我们应该尝试不同的东西,随机玩一点来探索状态空间。我们可以将这些体验保存在replay buffer中
  • 回忆这些经历并从中学习。之后,返回 Play with updated value function。
http://www.xdnf.cn/news/6984.html

相关文章:

  • docker-compose——安装mongo
  • C++文件操作--2 二进制文件操作
  • Java零基础学习Day15——面向对象进阶
  • 基于Fashion-MNIST的softmax回归-直接运行
  • dagster的etl实现
  • 硬件工程师笔记——二极管Multisim电路仿真实验汇总
  • 一分钟用 MCP 上线一个 2048 小游戏(CodeBuddy版)
  • 84.评论日记
  • Level2.8蛇与海龟(游戏)
  • 在WSL中的Ubuntu发行版上安装Anaconda、CUDA、CUDNN和TensorRT
  • 校平机:金属板料处理的核心工艺装备​
  • 【软件测试】性能测试 —— 工具篇 LoadRunner 介绍与使用
  • 【HCIA】MUX VLAN
  • 【原创】基于视觉大模型gemma-3-4b实现短视频自动识别内容并生成解说文案
  • 从零开发 1688 数据接口:商品详情页实时采集 API 接入详解
  • facebook的Open Molecules 2025 (OMol25) 数据集、评估与模型开源速读
  • Mysql数据库之集群进阶
  • 从ThreadLocal到Scoped Values:Java高效数据共享机制的革命性演进
  • 代码随想录算法训练营第四十二四十三天
  • (保姆级)Win10 安装Oracle Developer Suite教程
  • OpenCV 特征检测全面解析与实战应用
  • C++学习:六个月从基础到就业——C++11/14:auto类型推导
  • 解读 TypeScript 枚举Enum
  • 深入理解 Java 字节码操作码
  • 数据存储与容灾:构建企业级数据安全的全栈解决方案
  • Springboot构建项目时lombok不生效
  • 【鸿蒙开发避坑】使用全局状态变量控制动画时,动画异常甚至动画方向与预期相反的原因分析以及解决方案
  • 新的节能技术和一体化解决方案,推动工厂智能升级和产业转型
  • BG开发者日志517:demo数据分析与修改方向
  • 【SpringBoot】关于MP使用中配置了数据库表前缀的问题