【人工智能Ⅱ】实验9:强化学习Q-Learning算法

实验9:强化学习Q-Learning算法

一:实验目的

1:了解强化学习的基本概念。

2:学习强化学习经典算法——Q-Learing算法。

3:通过Q-Learing算法解决问题。

二:实验内容

2.1 强化学习

强化学习(Reinforcement learning, RL)是机器学习中的一个领域,强调如何基于环境而行动,以取得最大化的预期利益。

核心思想:智能体agent在环境environment中学习,根据环境的状态state(或观测到的observation),执行动作action,并根据环境的反馈reward(奖励)来指导更好的动作。强化学习通过不断的试错探索,吸取经验和教训,持续不断地优化策略,以从环境中拿到更好的反馈。

注意:从环境中获取的状态,有时候叫state,有时候叫observation,它们其实一个代表全局状态,一个代表局部观测值,在多智能体环境里会有差别,但在环境没有那么复杂时,可以先把这两个概念划上等号。

强化学习可以用于:

-       游戏(马里奥、Atari、Alpha Go、星际争霸等)

-       机器人控制(机械臂、机器人、自动驾驶、四轴飞行器等)

-       用户交互(推荐、广告、NLP等)

-       交通(拥堵管理等)

-       资源调度(物流、带宽、功率等)

-       金融(投资组合、股票买卖等)

2.2 GYM

GYM是强化学习中经典的环境库,它将环境交互接口规范化为:重置环境reset()、交互step()、渲染render()。

2.3 Q-Learing算法

Q-learning学习特定的state下,特定action的价值Q,采用Q表格的方式存储Q值(状态动作价值)。在训练中为了更好的探索环境,采用ε-greedy方式来训练,有一定概率随机选择动作输出。

Q-learning是离线(off-policy)的更新方式,更新learn()时无需获取下一步实际做出的动作next_action,并假设下一步动作是取最大Q值的动作。其具体更新公式如下:

三:实验资源

具体示例代码见百度AIStudio平台:强化学习Q-Learning算法。

四:实验要求

1、阅读示例代码,理解Q-Learning算法。

2、更换场景环境,测试算法结果。

五:实验环境

本实验所使用的环境条件如下表所示。

操作系统

Windows 10

程序语言

Python(3.11.4)

运行平台

Paddle notebook

第三方依赖

torch,numpy等

六:实验原理

强化学习是一种通过与环境进行交互来学习行为的学习方式。

在这个过程中,智能体(agent)通过执行动作(action)来改变环境的状态(state),并从环境中获得一个奖励(reward)。

智能体的目标是学习一个策略(policy),该策略能够指导智能体在给定状态下选择最优的动作,以最大化累积奖励。

Q-Learning使用一个Q值表来存储每个状态下执行每个动作所获得的预期累积奖励(Q值)。Q值表是一个二维表格,其中行代表不同的状态,列代表不同的动作。Q值表中的每个元素Q(s, a)表示在状态s下执行动作a所获得的预期累积奖励。

在训练过程中,智能体与环境进行交互,根据当前状态选择动作,并观察得到的奖励和新的状态。然后,智能体使用Bellman方程来更新Q值表中的Q值。更新过程不断迭代进行,直到Q值表收敛到一个稳定的状态,此时智能体就学习到了一个最优策略。

在训练完成后,智能体可以使用Q值表来选择动作。对于给定的状态s,智能体选择使Q值最大的动作作为当前的最优动作。由于Q值表已经收敛到最优值,因此这种策略选择方法能够保证智能体在大多数情况下都能获得较高的累积奖励。

七:算法流程

1:初始化Q值函数:对于每个状态-动作对(s,a),初始化其对应的Q值为一个较小的随机数,或者直接初始化为0。这通常构建为一个Q表,其中行代表不同的状态,列代表不同的动作,而表格中的每个元素代表在该状态下执行该动作的预期累积奖励(Q值)。

2:选择动作:从当前状态s开始,按照一种策略选择一个动作a。常用的策略是ε-greedy策略,即以1-ε的概率选择当前Q值最大的动作(即利用已知信息),以ε的概率随机选择一个动作(即探索未知信息)。


3:执行动作和更新Q值:执行选择的动作a,并观察环境反馈的下一个状态s'和奖励r。然后,根据Q值的更新规则更新Q值函数。

4:迭代训练:重复步骤2和步骤3,直到Q值表收敛到一个稳定的状态,或者达到预设的训练次数。在这个过程中,智能体会不断地探索环境,并根据环境反馈的奖励来更新Q值表,从而逐渐学习到最优的策略。

八:实验结果与分析

1:CliffWalking

CliffWalking-v0是一个经典的强化学习任务,模拟了一个人在网格上从一个起点走到一个终点,但有一个悬崖需要避免的场景。

【1】demo

首先执行预定义的动作,在本场景中是0, 1, 1, 2,即'up', 'right', 'right', 'down'。在示例中,CliffWalking-v0生成悬崖环境。

o代表正常可通行路径,x代表受控制的人物,C代表悬崖,T代表目标。如下图所示,在悬崖环境中,目的是寻找最快路径从左下角起点到右下角终点,跌落悬崖会返回起点。

【2】Agent定义

Agent是和环境environment交互的主体。

predict()方法:输入观察值observation(状态state),输出动作值。

sample()方法:在predict()方法基础上使用ε-greedy增加探索。

learn()方法:输入训练数据,完成一轮Q表格的更新。

【3】训练和测试定义

run_episode():agent在一个episode中训练的过程,使用agent.sample()与环境交互,使用agent.learn()训练Q表格。

test_episode():agent在一个episode中测试效果,评估目前的agent能在一个episode中拿到多少总reward。

【4】创建环境和Agent,启动训练

【5】测试算法结果


    输出test情况下的行走路径和reward。

路径如下表所示,依次为上——右——右——右——右——右——右——右——右——右——右——右——下。最终的test reward为-13。

o  o  o  o  o  o  o  o  o  o  o  o

o  o  o  o  o  o  o  o  o  o  o  o

x  o  o  o  o  o  o  o  o  o  o  o

o  C  C  C  C  C  C  C  C  C  C  T

o  o  o  o  o  o  o  o  o  o  o  o

o  o  o  o  o  o  o  o  o  o  o  o

o  x  o  o  o  o  o  o  o  o  o  o

o  C  C  C  C  C  C  C  C  C  C  T

o  o  o  o  o  o  o  o  o  o  o  o

o  o  o  o  o  o  o  o  o  o  o  o

o  o  x  o  o  o  o  o  o  o  o  o

o  C  C  C  C  C  C  C  C  C  C  T

o  o  o  o  o  o  o  o  o  o  o  o

o  o  o  o  o  o  o  o  o  o  o  o

o  o  o  x  o  o  o  o  o  o  o  o

o  C  C  C  C  C  C  C  C  C  C  T

o  o  o  o  o  o  o  o  o  o  o  o

o  o  o  o  o  o  o  o  o  o  o  o

o  o  o  o  x  o  o  o  o  o  o  o

o  C  C  C  C  C  C  C  C  C  C  T

o  o  o  o  o  o  o  o  o  o  o  o

o  o  o  o  o  o  o  o  o  o  o  o

o  o  o  o  o  x  o  o  o  o  o  o

o  C  C  C  C  C  C  C  C  C  C  T

o  o  o  o  o  o  o  o  o  o  o  o

o  o  o  o  o  o  o  o  o  o  o  o

o  o  o  o  o  o  x  o  o  o  o  o

o  C  C  C  C  C  C  C  C  C  C  T

o  o  o  o  o  o  o  o  o  o  o  o

o  o  o  o  o  o  o  o  o  o  o  o

o  o  o  o  o  o  o  x  o  o  o  o

o  C  C  C  C  C  C  C  C  C  C  T

o  o  o  o  o  o  o  o  o  o  o  o

o  o  o  o  o  o  o  o  o  o  o  o

o  o  o  o  o  o  o  o  x  o  o  o

o  C  C  C  C  C  C  C  C  C  C  T

o  o  o  o  o  o  o  o  o  o  o  o

o  o  o  o  o  o  o  o  o  o  o  o

o  o  o  o  o  o  o  o  o  x  o  o

o  C  C  C  C  C  C  C  C  C  C  T

o  o  o  o  o  o  o  o  o  o  o  o

o  o  o  o  o  o  o  o  o  o  o  o

o  o  o  o  o  o  o  o  o  o  x  o

o  C  C  C  C  C  C  C  C  C  C  T

o  o  o  o  o  o  o  o  o  o  o  o

o  o  o  o  o  o  o  o  o  o  o  o

o  o  o  o  o  o  o  o  o  o  o  x

o  C  C  C  C  C  C  C  C  C  C  T

o  o  o  o  o  o  o  o  o  o  o  o

o  o  o  o  o  o  o  o  o  o  o  o

o  o  o  o  o  o  o  o  o  o  o  o

o  C  C  C  C  C  C  C  C  C  C  x

 
test reward = -13.0

2:FrozenLake-v0

FrozenLake-v0是一个经典的强化学习任务,模拟了一个冰湖环境。智能体需要从起始位置出发,通过冰面上的不同格子,最终到达目标位置。冰面上有安全的格子和危险的格子,智能体需要避开危险格子以避免失败。

【1】demo


首先执行预定义的动作,获得如下结果。

【2】Agent定义

【3】训练和测试定义

【4】创建环境和Agent,启动训练

【5】测试算法结果

路径如下表所示,依次为下——上——不动——不动——不动——下——下——不动——不动——上——上——不动——下——上——下——不动——下——上——下——右——下——不动——右——右。最终的test reward为1。

  (Left)
SFFF
FHFH
FFFH
HFFG
  (Left)
SFFF
FHFH
FFFH
HFFG
  (Left)
SFFF
FHFH
FFFH
HFFG
  (Left)
SFFF
FHFH
FFFH
HFFG
  (Left)
SFFF
FHFH
FFFH
HFFG
  (Left)
SFFF
FHFH
FFFH
HFFG
  (Left)
SFFF
FHFH
FFFH
HFFG
  (Up)
SFFF
FHFH
FFFH
HFFG
  (Up)
SFFF
FHFH
FFFH
HFFG
  (Up)
SFFF
FHFH
FFFH
HFFG
  (Left)
SFFF
FHFH
FFFH
HFFG
  (Left)
SFFF
FHFH
FFFH
HFFG
  (Left)
SFFF
FHFH
FFFH
HFFG
  (Left)
SFFF
FHFH
FFFH
HFFG
  (Left)
SFFF
FHFH
FFFH
HFFG
  (Left)
SFFF
FHFH
FFFH
HFFG
  (Left)
SFFF
FHFH
FFFH
HFFG
  (Up)
SFFF
FHFH
FFFH
HFFG
  (Left)
SFFF
FHFH
FFFH
HFFG
  (Up)
SFFF
FHFH
FFFH
HFFG
  (Down)
SFFF
FHFH
FFFH
HFFG
  (Down)
SFFF
FHFH
FFFH
HFFG
  (Down)
SFFF
FHFH
FFFH
HFFG
  (Down)
SFFF
FHFH
FFFH
HFFG
 
test reward = 1.0

九:实验结论和心得

1:Q-Learning是一种无模型(model-free)的学习方法,不需要知道环境的状态转移概率和奖励函数的具体形式。

2:Q-Learning可以应用于许多实际问题中,例如环境模型难以获取或建模的问题。

3:在FrozenLake实例中,e_greed初始为0.1,则智能体无法到达终点。当调到0.3之后,智能体才能到达终点。

4:在强化学习中,智能体必须能够处理不确定性。因此,需要设计能够鲁棒地应对不确定性的强化学习算法和策略。

5:合适的奖励机制能够引导智能体朝着正确的方向学习。

6:在强化学习中,智能体需要在探索新环境和利用已知信息之间做出权衡。过度的探索可能导致效率低下,而过度的利用则可能导致智能体陷入局部最优解。

十:主要代码

import gym

import numpy as np

env = gym.make("CliffWalking-v0")

env.reset()

actiondict = {0'up'1'right'2'down'3'left'}

for step, action in enumerate((0112)):

    obs, reward, done, info = env.step(action)

    print('step {}: action {}, obs {}, reward {}, done {}, info {}'.format(\

    step, actiondict.get(action), obs, reward, done, info))

    env.render()

import gym

import numpy as np 

class QLearningAgent(object):

    def __init__(self, obs_n, act_n, learning_rate=0.01, gamma=0.9, e_greed=0.1):

        self.act_n = act_n      动作维度,有几个动作可选

        self.lr = learning_rate 学习率

        self.gamma = gamma      # reward的衰减率

        self.epsilon = e_greed  按一定概率随机选动作

        self.Q = np.zeros((obs_n, act_n))

    根据输入观察值,采样输出的动作值,带探索

    def sample(self, obs):

        if np.random.uniform(01) < (1.0 - self.epsilon): #根据tableQ值选动作

            action = self.predict(obs)

        else:

            action = np.random.choice(self.act_n) #有一定概率随机探索选取一个动作

        return action

    根据输入观察值,预测输出的动作值

    def predict(self, obs):

        Q_list = self.Q[obs, :]

        maxQ = np.max(Q_list)

        action_list = np.where(Q_list == maxQ)[0]  # maxQ可能对应多个action

        action = np.random.choice(action_list)

        return action

    学习方法,也就是更新Q-table的方法

    def learn(self, obs, action, reward, next_obs, done):

        """ off-policy

            obs: 交互前的obs, s_t

            action: 本次交互选择的action, a_t

            reward: 本次动作获得的奖励r

            next_obs: 本次交互后的obs, s_t+1

            done: episode是否结束

        """

        predict_Q = self.Q[obs, action]

        if done:

            target_Q = reward 没有下一个状态了

        else:

            target_Q = reward + self.gamma * np.max(self.Q[next_obs, :]) # Q-learning

        self.Q[obs, action] += self.lr * (target_Q - predict_Q) 修正q

     Q表格 的数据保存到文件中

    def save(self):

        npy_file = './q_table.npy'

        np.save(npy_file, self.Q)

        print(npy_file + ' saved.')

    

    从文件中读取数据到 Q表格

    def restore(self, npy_file='./q_table.npy'):

        self.Q = np.load(npy_file)

        print(npy_file + ' loaded.')

def run_episode(env, agent, render=False):

    total_steps = 0 记录每个episode走了多少step

    total_reward = 0

    obs = env.reset() 重置环境重新开一局(即开始新的一个episode

    while True:

        action = agent.sample(obs) 根据算法选择一个动作

        next_obs, reward, done, _ = env.step(action) 与环境进行一个交互

        训练 Q-learning算法

        agent.learn(obs, action, reward, next_obs, done)

        obs = next_obs  存储上一个观察值

        total_reward += reward

        total_steps += 1 计算step

        if render:

            env.render() #渲染新的一帧图形

        if done:

            break

    return total_reward, total_steps

def test_episode(env, agent, render=False):

    total_reward = 0

    obs = env.reset()

    while True:

        action = agent.predict(obs) # greedy

        next_obs, reward, done, _ = env.step(action)

        total_reward += reward

        obs = next_obs

        if render:

            env.render()

        if done:

            break

    return total_reward

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/675737.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Pinia的介绍、使用及持久化

Pinia介绍 什么是Pinia&#xff1f; Pinia 是 Vue 的最新 状态管理工具&#xff0c;状态就是数据。 通俗地讲&#xff1a;Pinia 是一个插件&#xff0c;可以帮我们管理 vue 通用的数据 (多组件共享的数据)。 比如一份数据有多个组件需要使用&#xff0c;在学Pinia之前我们需…

nginx 中文文档

nginx 中文文档 中文文档

单枪匹马月入17万美元:数字游民Pieter Levels如何成就商业传奇

了解数字游民的应该都听说过 Pieter Levels&#xff0c;可以说他是数字游民的先驱人物。 他在推特上拥有超过43万的粉丝&#xff0c;仅凭一台笔记本电脑就连续建立了多个高盈利网站&#xff0c;光是推特主页上展示的比较新的几个网站&#xff0c;每月收入加起来就高达 17.6 万…

【机器学习】机器学习与大模型在人工智能领域的融合应用与性能优化新探索

文章目录 引言机器学习与大模型的基本概念机器学习概述监督学习无监督学习强化学习 大模型概述GPT-3BERTResNetTransformer 机器学习与大模型的融合应用自然语言处理文本生成文本分类机器翻译 图像识别自动驾驶医学影像分析 语音识别智能助手语音转文字 大模型性能优化的新探索…

解读信创产业根基,操作系统发展历程

信创产业根基之一操作系统 操作系统是一个关键的控制程序&#xff0c;负责协调、管理和控制计算机硬件和软件资源。作为硬件的首要软件扩展&#xff0c;它位于裸机与用户之间&#xff0c;充当了两者之间的桥梁。通过其核心程序&#xff0c;操作系统高效地管理着系统中的各类资源…

开山之作!Python数据与算法分析手册,登顶GitHub!

若把编写代码比作行军打仗&#xff0c;那么要想称霸沙场&#xff0c;不能仅靠手中的利刃&#xff0c;还需深谙兵法。 Python是一把利刃&#xff0c;数据结构与算法则是兵法。只有熟读兵法&#xff0c;才能使利刃所向披靡。只有洞彻数据结构与算法&#xff0c;才能真正精通Pyth…

营销方案撰写秘籍:包含内容全解析,让你的方案脱颖而出

做了十几年品牌&#xff0c;策划出身&#xff0c;混迹过几个知名广告公司&#xff0c;个人经验供楼主参考。 只要掌握以下这些营销策划案的要点&#xff0c;你就能制作出既全面又专业的策划案&#xff0c;让你的工作成果不仅得到同事的认可&#xff0c;更能赢得老板的赏识&…

Transgaga——人脸与猫脸之间互相转换算法解析

1. 概述 虽然pix2pix作为风格转换模型被提出&#xff0c;但它依赖于成对的数据集。与之相比&#xff0c;CycleGAN通过引入循环损失&#xff0c;实现了无需配对数据的风格转换。不过&#xff0c;CycleGAN在处理需要大幅几何变化的风格转换时表现不佳&#xff0c;仅在如马和斑马…

JAVA流程控制--增强for循环

1.JAVA5引入了一种主要用于数组或集合的增强型for循环 2.JAVA增强for循环语法格式如下&#xff1a; for(声明语句&#xff1a;表达式&#xff09; { //代码句子 } 3.声明语句&#xff1a;声明新的局部变量&#xff0c;该变量的类型必须和数组元素的类型匹配。其作用域限定在循…

最新鸿蒙南北开发学习路线+学习资料分享

前言 5月29日&#xff0c;“千帆竞发启航 共筑鸿蒙生态”鸿蒙原生应用合作仪式在北京成功举办&#xff0c;近40个应用现场官宣启动鸿蒙原生应用开发。此次官宣启动开发的鸿蒙原生应用不仅包括教育、母婴、出行、医疗健康等多领域的知名应用&#xff0c;还有十多家企业内部办公应…

【C语言】位段(结构体实现位段)

目录 一、位段的定义 二、位段的声明 三、位段的内存分配 四、位段在内存中的存储方式 五、位段的优点 六、位段的跨平台问题 七、位段的应用 八、位段使用的注意事项 一、位段的定义 信息的存取一般以字节为单位。实际上&#xff0c;有时存储一个信息不必用一个或多个字…

参数高效微调PEFT(四)快速入门(IA)3

参数高效微调PEFT(四)快速入门(IA)3 我们已经了解了HuggingFace中peft库的几种高效微调方法。 参数高效微调PEFT(一)快速入门BitFit、Prompt Tuning、Prefix Tuning 参数高效微调PEFT(二)快速入门P-Tuning、P-Tuning V2 参数高效微调PEFT(三)快速入门LoRA、AdaLoRA 今天我…

Linux基础命令[28]-chmod

文章目录 1. chmod 命令说明2. chmod 命令语法3. chmod 命令示例3.1 使用数字赋权3.2 使用字母赋权3.3 -R&#xff08;一起修改子目录&#xff09; 4. 总结 1. chmod 命令说明 chmod&#xff1a;为文件或文件夹赋予权限。Linux-文件或目录权限。基本信息如下&#xff1a; Usa…

目标2亿欧元!四年两次募资,全球最早专注于量子投资的Quantonation再次加码

Quantonation Ventures 是全球第一家专注于深度物理和量子技术的早期风险投资公司。4月10日&#xff0c;该公司宣布其第二只专门用于量子技术的早期基金 Quantonation II 首次募资完成&#xff0c;目前已募资 7000 万欧元&#xff0c;而目标为 2 亿欧元。 首次募资就募到了将…

redis之发布与订阅

华子目录 什么是发布与订阅&#xff1f;常用命令psubscribe pattern1 [pattern2...]subscribe channel1 [channel2...]publish channel messagepunsubscribe pattern1 [pattern2...]unsubscribe [channel1 [channel2...]]pubsub subcommand argument1 [argument2...] 示例1示例…

C/C++动态内存管理(new与delete)

目录 1. 一图搞懂C/C的内存分布 2. 存在动态内存分配的原因 3. C语言中的动态内存管理方式 4. C内存管理方式 4.1 new/delete操作内置类型 4.2 new/delete操作自定义类型 1. 一图搞懂C/C的内存分布 说明&#xff1a; 1. 栈区&#xff08;stack&#xff09;&#xff1a;在…

微信视频号上是怎么开店铺的?从入驻到发货,具体流程来了!

这两年&#xff0c;视频号逐渐走入大家视野 单价高&#xff0c;商家又少&#xff0c;很多类目都属于空白无商家入驻阶段&#xff0c;于是好多商家&#xff0c;都准备去视频号小店这个新“黑马”发展发展 那视频号是怎么开店卖东西的&#xff1f;今天我就来给大家分享一下&…

list~模拟实现

目录 list的介绍及使用 list的底层结构 节点类的实现 list的实现 构造函数 拷贝构造 方法一&#xff1a;方法二&#xff1a; 析构函数 赋值重载 insert / erase push_/pop_(尾插/尾删/头插/头删) begin和end&#xff08;在已建立迭代器的基础上&#xff09; 迭代…

“神经网络之父”和“深度学习鼻祖”Geoffrey Hinton

“神经网络之父”和“深度学习鼻祖”Geoffrey Hinton在神经网络领域数十年如一日的研究&#xff0c;对深度学习的推动和贡献显著。 一、早期贡献与突破 反向传播算法的引入&#xff1a;Hinton是将反向传播&#xff08;Backpropagation&#xff09;算法引入多层神经网络训练的…

客观评价一下GPT-4o

评价GPT-4o&#xff08;即OpenAI发布的升级版语言模型&#xff09;&#xff0c;以下是上大学网&#xff08;www.sdaxue.com&#xff09;从技术能力与创新性、性能与效率、功能实用性与用户体验等几个维度进行评价&#xff0c;不周之出&#xff0c;请大家指正。 技术能力与创新性…