强化学习第1天:强化学习概述

简介: 强化学习第1天:强化学习概述



介绍

强化学习是机器学习中一种独特的存在,以其独特的思想逐渐发展为一门独立的学科,强化学习适用的场景是:一个学习主体根据环境做出不同的决策,得到相应的奖励与惩罚来改进决策

它既不是监督学习也不是无监督学习,从这段描述中也可以看出,它不适合用来进行回归或者聚类等任务


强化学习要素

强化学习中有一些重要的概念,我们接下来一一介绍他们,如果有些不理解不要着急,我们会举一个具体例子来解释

  • 智能体:智能体是强化学习中的主体,它能够观测环境,做出决策,这些概念我们也将在之后说明
  • 环境:环境是智能体所处的环境,能够根据智能体的状态变化给出反馈,使智能体改进策略
  • 状态:即环境中智能体当前的状态
  • 行动:智能体会根据当前状况做出行动
  • 奖励:智能体每做出一次行动会得到一个奖励值,这也是一个导致智能体调整策略的因素


强化学习任务示例

环境搭建:gym

gym是一个集成了一些常用环境的库,我们可以通过调用这个环境库来快速入门强化学习,在python命令行中执行命令安装

!pip install gym[toy_text,classic_control,atari,accept-rom-license,other]

基本用法

导入库后可以查看库中的所有环境和一些关于环境的说明

# 导入库
import gym
 
 
# 打印库中的所有环境和说明
print(gym.envs.registry)

我们使用小车上山任务来进行后续教学

import gym
import matplotlib.pyplot as plt
 
 
# 选择小车上山环境,并设置渲染方式,之后我们可以获取环境的图像数组
env = gym.make('MountainCar-v0', render_mode="rgb_array")
# 初始化环境
env.reset()
# 获取环境图片数组
image = env.render()
#显示环境图片
plt.imshow(image)
plt.show()

这段代码完成了一些初始设置,具体作用见代码注释,运行结果如下图

环境信息查看

我们导入环境后要查看一些环境的信息,还记得我们最开始说的强化学习要素吗,策略,行动等,我们要查看的就是这些

import gym
 
 
env = gym.make('MountainCar-v0', render_mode="rgb_array")
env.reset()
for key in vars(env.spec):
    print(key, vars(env.spec)[key])

这段代码打印了一些环境的基础信息,我们解释一些重要的

id—代表当前环境的名称

reward_threshold—代表奖励阈值,即当奖励大于-110时就算任务成功

max_episode_steps—表示最大回合数,到达这个数时任务就算没完成也会停止

import gym
 
 
env = gym.make('MountainCar-v0', render_mode="rgb_array")
env.reset()
for key in vars(env.unwrapped):
    print(key, vars(env.unwrapped)[key])

这段代码会打印一些环境具体信息,由于结果太长,请读者自行打印,这里同样解释一些重要信息

min_position: -1.2: 车辆位置的最小值。

max_position: 0.6: 车辆位置的最大值。

max_speed: 0.07: 车辆速度的最大值。

goal_position: 0.5: 车辆成功达到的目标位置。

goal_velocity: 0: 车辆成功达到的目标速度。

force: 0.001: 施加在车辆上的力的大小。

gravity: 0.0025: 重力的大小。

low: [-1.2 -0.07]: 观察空间的最小值。

high: [0.6 0.07]: 观察空间的最大值。

action_space: Discrete(3): 动作空间,表示可用的离散动作数量为 3。

observation_space: Box([-1.2 -0.07], [0.6 0.07], (2,), float32): 观察空间,表示观察的状态空间是一个2维的Box空间,范围在 [-1.2, -0.07] 到 [0.6, 0.07] 之间。

创建智能体

接下来我们将使用类定义一个智能体

class CloseFormAgent:
    def __init__(self):
        pass
    def step(self, observation):
        position, velocity = observation
        lb = min(-0.09*(position+0.25)**2+0.03, 0.3*(position+0.9)**4-0.008)
        ub = -0.07*(position+0.38)**2+0.07
        if lb < velocity < ub:
            action = 2
        else:
            action = 0
        return action

这个类定义了一个step函数,代表智能体决策的部分,它输入一个观测环境,在这个任务中,可以观测到小车所处的位置和速度,接着,根据这两个值来做出行为,往右或者往左

我们再定义一个智能体与环境交互的函数

# 保存图片的列表
image = []
# 实例化智能体对象
agent = CloseFormAgent()
 
 
def play_episoe(env, agent, render=False):
    # 获取初始化环境状态
    observation, _ = env.reset()
    # 初始化奖励,同时设置回合数和是否完成为False
    reward, terminated, truncated = 0., False, False
    # 初始化奖励与行动次数
    episode_reward, elapsed_step = 0., 0
    # 循环进行任务
    while True:
        # 获取决策
        action = agent.step(observation)
        # 保存当前状态图片(之后可视化要用到)
        image.append(env.render())
        # 如果到达了最大回合数或者完成任务就退出
        if terminated or truncated:
            break
        # 记录做出行动后的数据
        observation, reward, terminated, truncated, _ = env.step(action)
        # 记录回合数与行动次数
        episode_reward += reward
        elapsed_step += 1
    return episode_reward, elapsed_step

这个函数实现了智能体与环境交互的过程,它接收行动,再返回状态,同时记录回合数,行动次数等信息,具体作用见代码注释

过程可视化

matplotlib库中有一个将图片组变成一组动画的库:FuncAnimation,我们保存每次智能体的状态图片后,用这个库就可以将整个过程显示出来了

import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
 
 
image = []
 
# 创建一个空白的图形窗口
fig, ax = plt.subplots()
 
# 定义更新函数,用于在每一帧中更新图像
def update(frame):
    ax.clear()  # 清空当前图轴
    ax.imshow(image[frame])
    ax.set_title(f'Frame {frame+1}/{len(image)}')
 
# 创建动画对象
animation = FuncAnimation(fig, update, frames=len(image), repeat=False)
# 显示动画
plt.show()

完整代码

import gym
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
 
 
env = gym.make('MountainCar-v0', render_mode="rgb_array")
env.reset()
 
image = []
 
 
class CloseFormAgent:
    def __init__(self):
        pass
    
    def step(self, observation):
        position, velocity = observation
        lb = min(-0.09*(position+0.25)**2+0.03, 0.3*(position+0.9)**4-0.008)
        ub = -0.07*(position+0.38)**2+0.07
        if lb < velocity < ub:
            action = 2
        else:
            action = 0
        return action
 
 
agent = CloseFormAgent()
 
 
def play_episoe(env, agent, render=False):
    observation, _ = env.reset()
    reward, terminated, truncated = 0., False, False
    episode_reward, elapsed_step = 0., 0
    while True:
        action = agent.step(observation)
        image.append(env.render())
        if terminated or truncated:
            break
        observation, reward, terminated, truncated, _ = env.step(action)
        episode_reward += reward
        elapsed_step += 1
    return episode_reward, elapsed_step
 
 
episode_reward, elapsed_steps = play_episoe(env, agent, render=True)
env.close()
print("奖励:", episode_reward, "行动次数:", elapsed_steps)
 
# 创建一个空白的图形窗口
fig, ax = plt.subplots()
 
 
# 定义更新函数,用于在每一帧中更新图像
def update(frame):
    ax.clear()  # 清空当前图轴
    ax.imshow(image[frame])
    ax.set_title(f'Frame {frame+1}/{len(image)}')
 
 
# 创建动画对象
animation = FuncAnimation(fig, update, frames=len(image), repeat=False)
# 显示动画
plt.show()

运行后代码将打印最终奖励与行动次数,以及显示一个智能体与环境交互的动画,效果如下


结语

  • 了解了什么是强化学习
  • 学习了强化学习的基本概念
  • 通过一个简单示例直观感受了强化学习的基本流程
  • 学习了将图片动画化的技术

感谢阅读,觉得有用的话就订阅下本专栏吧,有错误也欢迎指出

相关文章
|
机器学习/深度学习 人工智能 项目管理
【机器学习】集成学习——Stacking模型融合(理论+图解)
【机器学习】集成学习——Stacking模型融合(理论+图解)
8120 1
【机器学习】集成学习——Stacking模型融合(理论+图解)
|
JavaScript
Vue Antdv 列表(table、list)自定义空数据状态UI
Vue Antdv 列表(table、list)自定义空数据状态UI
1512 0
|
机器学习/深度学习 监控
数据漂移、概念漂移以及如何监控它们(mona)
在机器学习模型监控的上下文中经常提到数据和概念漂移,但它们到底是什么以及如何检测到它们?此外,考虑到围绕它们的常见误解,是不惜一切代价避免数据和概念漂移的事情,还是在生产中训练模型的自然和可接受的后果?请仔细阅读,找出答案。在本文中,我们将提供模型漂移的细粒度细分,以及检测它们的方法以及处理它们时的最佳实践。
|
弹性计算 搜索推荐 异构计算
阿里云服务器多少钱一年?亲自整理ECS、轻量和GPU服务器租赁价格表
2025年阿里云服务器优惠汇总:轻量应用服务器2核2G 38元/年起,ECS 2核2G 99元/年,2核4G 199元/年,4核16G 89元/月,8核32G 160元/月,香港轻量25元/月起,新老用户同享,续费同价。
2531 158
|
机器学习/深度学习 数据采集 人工智能
深度学习实战指南:从神经网络基础到模型优化的完整攻略
🌟 蒋星熠Jaxonic,AI探索者。深耕深度学习,从神经网络到Transformer,用代码践行智能革命。分享实战经验,助你构建CV、NLP模型,共赴二进制星辰大海。
|
机器学习/深度学习 测试技术
先SFT后RL但是效果不佳?你可能没用好“离线专家数据”!
通义实验室Trinity-RFT团队提出CHORD框架,通过动态融合SFT与RL,解决大模型训练中“越学越差”“顾此失彼”等问题。该框架引入细粒度Token级权重与软过渡机制,实现从模仿到超越的高效学习,在数学推理与通用任务上均显著提升性能,相关代码已开源。
1339 0
|
机器学习/深度学习 算法 机器人
强化学习:时间差分(TD)(SARSA算法和Q-Learning算法)(看不懂算我输专栏)——手把手教你入门强化学习(六)
本文介绍了时间差分法(TD)中的两种经典算法:SARSA和Q-Learning。二者均为无模型强化学习方法,通过与环境交互估算动作价值函数。SARSA是On-Policy算法,采用ε-greedy策略进行动作选择和评估;而Q-Learning为Off-Policy算法,评估时选取下一状态中估值最大的动作。相比动态规划和蒙特卡洛方法,TD算法结合了自举更新与样本更新的优势,实现边行动边学习。文章通过生动的例子解释了两者的差异,并提供了伪代码帮助理解。
1374 2
|
消息中间件 分布式计算 架构师
CAP定理一文带你速解(通俗易懂,图文并茂)
CAP定理一文带你速解(通俗易懂,图文并茂)
|
人工智能 自然语言处理 数据可视化
通义灵码上新功能:用代码画流程图
不想读前人“骨灰级”代码,不想当“牛马”程序员,想像看图片一样快速读复杂代码和架构。通义灵码刚刚支持代码逻辑可视化,可以把你的每段代码画成流程图。像个脑图工具一样帮你图文并茂画出代码逻辑和框架,再也不用迷失在代码迷宫啦!
|
机器学习/深度学习 人工智能 算法
探索人工智能中的强化学习:原理、算法及应用
探索人工智能中的强化学习:原理、算法及应用