【机器学习】机器学习重要分支——强化学习:从理论到实践

文章目录

    • 强化学习:从理论到实践
      • 引言
      • 第一章 强化学习的基本概念
        • 1.1 什么是强化学习
        • 1.2 强化学习的基本组成部分
        • 1.3 马尔可夫决策过程
      • 第二章 强化学习的核心算法
        • 2.1 Q学习
        • 2.2 深度Q网络(DQN)
        • 2.3 策略梯度方法
      • 第三章 强化学习的应用实例
        • 3.1 游戏AI
        • 3.2 机器人控制
        • 3.3 自动驾驶
      • 第四章 强化学习的未来发展与挑战
        • 4.1 样本效率与泛化能力
        • 4.2 安全性与可靠性
        • 4.3 解释性与透明性
        • 4.4 多智能体系统
      • 结论

强化学习:从理论到实践

引言

强化学习(Reinforcement Learning, RL)作为机器学习的重要分支之一,通过与环境交互、试错学习来优化决策策略,已在机器人控制、游戏AI、自动驾驶等领域展现出巨大的潜力。本文将深入探讨强化学习的基本原理、核心算法及其在实际中的应用,并提供代码示例和图表以帮助读者更好地理解和掌握这一技术。

第一章 强化学习的基本概念

1.1 什么是强化学习

强化学习是一种使智能体(agent)通过与环境(environment)交互,学习如何采取行动以最大化累积奖励(cumulative reward)的机器学习方法。与监督学习和无监督学习不同,强化学习更注重序列决策和长期回报的优化。

在强化学习中,智能体在每一步都要从环境中接收状态(state),选择动作(action),并根据环境的反馈更新策略。这个过程通常被建模为马尔可夫决策过程(Markov Decision Process, MDP)。

1.2 强化学习的基本组成部分

强化学习系统通常包括以下几个基本组成部分:

  • 智能体(Agent):执行动作的主体。
  • 环境(Environment):智能体交互的对象。
  • 状态(State):环境在某一时刻的具体情况。
  • 动作(Action):智能体在某一状态下可以执行的操作。
  • 奖励(Reward):环境对智能体动作的反馈。
  • 策略(Policy):智能体在每个状态下选择动作的规则。
  • 价值函数(Value Function):评估在某一状态下长期累积回报的期望值。
  • Q值(Q-Value):评估在某一状态下选择某一动作的长期累积回报的期望值。
1.3 马尔可夫决策过程

马尔可夫决策过程(MDP)是强化学习的数学框架。一个MDP通常由以下五元组(S, A, P, R, γ)组成:

  • S:状态空间,表示所有可能的状态。
  • A:动作空间,表示智能体在每个状态下可以执行的所有可能动作。
  • P:状态转移概率,P(s’|s, a)表示在状态s执行动作a后转移到状态s’的概率。
  • R:奖励函数,R(s, a)表示在状态s执行动作a获得的即时奖励。
  • γ:折扣因子,0 ≤ γ ≤ 1,用于权衡即时奖励和长期奖励。

在MDP中,智能体的目标是找到最优策略π,使得在每个状态下的累积奖励最大化。
在这里插入图片描述

第二章 强化学习的核心算法

2.1 Q学习

Q学习是一种无模型的强化学习算法,通过学习状态-动作对的Q值来选择最优动作。Q值表示在给定状态下采取某动作的预期回报。Q学习的更新公式如下:

[ Q(s, a) \leftarrow Q(s, a) + \alpha [r + \gamma \max_{a’} Q(s’, a’) - Q(s, a)] ]

其中:

  • ( s ) 和 ( a ) 分别表示当前状态和动作。
  • ( r ) 是在状态 ( s ) 执行动作 ( a ) 后获得的奖励。
  • ( s’ ) 是执行动作后的新状态。
  • ( \alpha ) 是学习率,控制更新的步长。
  • ( \gamma ) 是折扣因子,权衡即时奖励和长期奖励。

以下是Q学习的代码示例:

import numpy as np
import matplotlib.pyplot as plt# Q学习参数
gamma = 0.8   # 折扣因子
alpha = 0.1   # 学习率
epsilon = 0.1 # 探索概率# 环境参数
n_states = 6
n_actions = 2# 初始化Q表
Q = np.zeros((n_states, n_actions))# 训练过程
for episode in range(1000):state = np.random.randint(0, n_states)for step in range(100):if np.random.rand() < epsilon:action = np.random.randint(0, n_actions)else:action = np.argmax(Q[state, :])next_state = (state + 1) % n_statesreward = 1 if next_state == 0 else 0Q[state, action] = Q[state, action] + alpha * (reward + gamma * np.max(Q[next_state, :]) - Q[state, action])state = next_state# 绘制Q值
plt.imshow(Q, cmap='hot', interpolation='nearest')
plt.colorbar()
plt.xlabel('Actions')
plt.ylabel('States')
plt.title('Q-table Heatmap')
plt.show()

在这里插入图片描述

2.2 深度Q网络(DQN)

深度Q网络(DQN)结合深度学习与Q学习,通过神经网络来近似Q值函数,能够处理高维状态空间的问题。DQN算法引入了经验回放(Experience Replay)和固定目标网络(Fixed Target Network)等技术来稳定训练过程。

DQN算法的主要步骤如下:

  1. 经验回放:存储智能体的经历(状态、动作、奖励、下一个状态)在一个回放缓冲区中,并从中随机采样小批量进行训练,以减少样本间的相关性。
  2. 固定目标网络:使用一个固定的目标Q网络来生成目标Q值,定期更新目标网络的参数以减少训练的不稳定性。

以下是DQN的代码示例:

import gym
import tensorflow as tf
from tensorflow.keras import layers
import numpy as np
from collections import deque
import random# 创建环境
env = gym.make('CartPole-v1')# Q网络
def build_model():model = tf.keras.Sequential([layers.Dense(24, activation='relu', input_shape=(env.observation_space.shape[0],)),layers.Dense(24, activation='relu'),layers.Dense(env.action_space.n, activation='linear')])model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.001), loss='mse')return model# 参数
gamma = 0.99
epsilon = 1.0
epsilon_min = 0.1
epsilon_decay = 0.995
batch_size = 32
memory = deque(maxlen=2000)# 初始化模型
model = build_model()
target_model = build_model()
target_model.set_weights(model.get_weights())# 训练DQN
for episode in range(500):state = env.reset()state = np.reshape(state, [1, env.observation_space.shape[0]])total_reward = 0for step in range(200):if np.random.rand() <= epsilon:action = np.random.randint(0, env.action_space.n)else:action = np.argmax(model.predict(state))next_state, reward, done, _ = env.step(action)next_state = np.reshape(next_state, [1, env.observation_space.shape[0]])memory.append((state, action, reward, next_state, done))state = next_statetotal_reward += rewardif done:print(f'Episode: {episode}, Total reward: {total_reward}, Epsilon: {epsilon:.2f}')breakif len(memory) > batch_size:batch = random.sample(memory, batch_size)for s, a, r, s_, d in batch:target = rif not d:target += gamma * np.amax(target_model.predict(s_))target_f = model.predict(s)target_f[0][a] = targetmodel.fit(s, target_f, epochs=1, verbose=0)if epsilon > epsilon_min:epsilon *= epsilon_decayif episode % 10 == 0:target_model.set_weights(model.get_weights())# 测试模型
obs = env.reset()
for _ in range(1000):action = np.argmax(model.predict(np.reshape(obs, [1, env.observation_space.shape[0]])))obs, reward, done, info = env.step(action)env.render()if done:obs = env.reset()
env.close()
2.3 策略梯度方法

策略梯度方法直接优化策略函数,通过采样动作来估计梯度,并利用梯度上升或下降算法来更新策略。与Q学习不同,策略梯度方法不需要存储和更新Q值,而是通过优化策略参数来直接学习最优策略。

策略梯度方法的更新公式为:

[ \nabla J(\theta) = \mathbb{E}{\pi\theta} \left[ \

nabla_\theta \log \pi_\theta(a|s) Q^{\pi_\theta}(s, a) \right] ]

其中:

  • ( J(\theta) ) 是策略的期望回报。
  • ( \pi_\theta ) 是参数化的策略。
  • ( Q^{\pi_\theta}(s, a) ) 是在状态 ( s ) 下采取动作 ( a ) 的Q值。

以下是一个简单的策略梯度方法(REINFORCE)的代码示例:

import gym
import numpy as np
import tensorflow as tf
from tensorflow.keras import layers# 创建环境
env = gym.make('CartPole-v1')# 策略网络
def build_policy():model = tf.keras.Sequential([layers.Dense(24, activation='relu', input_shape=(env.observation_space.shape[0],)),layers.Dense(24, activation='relu'),layers.Dense(env.action_space.n, activation='softmax')])return model# 损失函数和优化器
def compute_loss(probabilities, actions, rewards):neg_log_prob = tf.reduce_sum(-tf.math.log(probabilities) * tf.one_hot(actions, env.action_space.n), axis=1)loss = tf.reduce_mean(neg_log_prob * rewards)return lossoptimizer = tf.keras.optimizers.Adam(learning_rate=0.01)# 参数
gamma = 0.99
policy = build_policy()# 训练策略梯度方法
for episode in range(500):state = env.reset()state = np.reshape(state, [1, env.observation_space.shape[0]])states, actions, rewards = [], [], []total_reward = 0while True:probabilities = policy(state)action = np.random.choice(env.action_space.n, p=probabilities.numpy()[0])next_state, reward, done, _ = env.step(action)states.append(state)actions.append(action)rewards.append(reward)state = np.reshape(next_state, [1, env.observation_space.shape[0]])total_reward += rewardif done:print(f'Episode: {episode}, Total reward: {total_reward}')break# 计算折扣奖励discounted_rewards = []cumulative = 0for r in rewards[::-1]:cumulative = cumulative * gamma + rdiscounted_rewards.insert(0, cumulative)discounted_rewards = np.array(discounted_rewards)discounted_rewards = (discounted_rewards - np.mean(discounted_rewards)) / (np.std(discounted_rewards) + 1e-8)# 更新策略with tf.GradientTape() as tape:loss = compute_loss(policy(np.vstack(states)), actions, discounted_rewards)grads = tape.gradient(loss, policy.trainable_variables)optimizer.apply_gradients(zip(grads, policy.trainable_variables))# 测试策略
obs = env.reset()
for _ in range(1000):action = np.argmax(policy(np.reshape(obs, [1, env.observation_space.shape[0]])))obs, reward, done, info = env.step(action)env.render()if done:obs = env.reset()
env.close()

在这里插入图片描述

第三章 强化学习的应用实例

3.1 游戏AI

强化学习在游戏AI中的应用广泛且效果显著,特别是在策略游戏和实时对战游戏中,RL算法通过与游戏环境的不断交互,学习出最优策略。例如,AlphaGo利用深度强化学习技术击败了世界顶尖的围棋选手,展示了RL在复杂策略游戏中的强大能力。

以下是一个在OpenAI Gym环境中使用DQN进行CartPole游戏的示例:

import gym
from stable_baselines3 import DQN# 创建环境
env = gym.make('CartPole-v1')# 训练DQN模型
model = DQN('MlpPolicy', env, verbose=1)
model.learn(total_timesteps=10000)# 测试模型
obs = env.reset()
for _ in range(1000):action = model.predict(obs, deterministic=True)[0]obs, reward, done, info = env.step(action)env.render()if done:obs = env.reset()
env.close()
3.2 机器人控制

在机器人控制领域,强化学习算法被广泛应用于自动化任务、路径规划和多机器人协作等方面。通过RL,机器人可以学习复杂的运动控制策略,实现从简单的抓取到复杂的多机器人协作任务。

以下是一个在PyBullet环境中使用PPO进行Ant机器人控制的示例:

import pybullet_envs
from stable_baselines3 import PPO# 创建机器人控制环境
env = gym.make('AntBulletEnv-v0')# 训练PPO模型
model = PPO('MlpPolicy', env, verbose=1)
model.learn(total_timesteps=100000)# 测试模型
obs = env.reset()
for _ in range(1000):action = model.predict(obs, deterministic=True)[0]obs, reward, done, info = env.step(action)env.render()if done:obs = env.reset()
env.close()
3.3 自动驾驶

自动驾驶是强化学习的一个重要应用领域。通过RL,自动驾驶系统可以在复杂的道路环境中学习安全有效的驾驶策略,包括避障、变道、停车等操作。

以下是一个在模拟环境中使用RL进行自动驾驶的示例(此示例假设有一个模拟自动驾驶环境):

import gym
from stable_baselines3 import SAC# 创建自动驾驶环境
env = gym.make('CarRacing-v0')# 训练SAC模型
model = SAC('MlpPolicy', env, verbose=1)
model.learn(total_timesteps=100000)# 测试模型
obs = env.reset()
for _ in range(1000):action = model.predict(obs, deterministic=True)[0]obs, reward, done, info = env.step(action)env.render()if done:obs = env.reset()
env.close()

第四章 强化学习的未来发展与挑战

4.1 样本效率与泛化能力

强化学习模型通常需要大量的训练样本,这在实际应用中往往不可行。提高样本效率和模型的泛化能力是一个重要的研究方向。研究人员正在探索利用迁移学习、多任务学习和模型简化等方法来提高样本效率和泛化能力。

4.2 安全性与可靠性

在实际应用中,强化学习模型的决策需要保证安全性和可靠性,这对于自动驾驶、医疗等高风险领域尤为重要。研究人员正在开发鲁棒性和安全性增强的RL算法,以确保在面对不确定性和噪声时,系统仍能做出安全可靠的决策。

4.3 解释性与透明性

强化学习模型,特别是深度RL模型,往往是黑箱模型,难以解释其决策过程。提高RL模型的解释性和透明性有助于增加用户的信任,并在关键任务中应用。研究方向包括开发可解释的RL算法和可视化工具,以帮助理解和解释RL模型的行为。

4.4 多智能体系统

多智能体强化学习(Multi-Agent Reinforcement Learning, MARL)研究多个智能体在共享环境中的协作与竞争问题。多智能体系统在交通管理、资源分配和多机器人系统等领域有广泛应用,但其复杂性也带来了新的挑战,包括智能体间的协调与通信。

结论

强化学习作为一种强大的机器学习方法,具有广泛的应用前景和研究价值。通过不断优化算法和扩展应用领域,强化学习将在未来的智能系统中发挥更加重要的作用。希望本文的详细介绍、算法实现和实际应用示例能帮助读者更好地理解和掌握强化学习技术。


以上扩展的文章从理论介绍、算法实现到实际应用,全面展示了强化学习的各个方面,并通过具体的代码示例和图表帮助读者深入理解和掌握这一技术。希望能对您进一步探索和应用强化学习有所帮助。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C语言】解决C语言报错:Format String Vulnerability

文章目录 简介什么是Format String VulnerabilityFormat String Vulnerability的常见原因如何检测和调试Format String Vulnerability解决Format String Vulnerability的最佳实践详细实例解析示例1&#xff1a;直接使用不受信任的输入作为格式化字符串示例2&#xff1a;未验证格…

1949年到2021年中国历年稻谷产量统计报告

数据介绍 数据来源于国家统计局&#xff0c;为1949年到2021年我国每年的稻谷产量数据。 2021年&#xff0c;我国稻谷产量为21284.24万吨&#xff0c;比上年增长0.5%。 数据统计单位为&#xff1a;万吨 我国稻谷产量有多少&#xff1f; 2021年&#xff0c;我国稻谷产量为2128…

springboot与flowable(12):网关服务(包容网关)

一、绘制流程图 包容网关可以看作是排他网关和并行网关的结合体。和排他网关一样&#xff0c;可以在外出顺序流上定义条件&#xff0c;包容网关会解析它们。但是主要的区别是包容网关可以选择多余一条顺序流&#xff0c;这和并行网关一样。包容网关的功能是基于进入和外出顺序流…

3d渲染的类型,渲染100邀请码1a12

3D渲染有不同的类型和方法&#xff0c;它们各有各的优缺点和适用场景&#xff0c;这里我们简单介绍下。 1、离线渲染 离线渲染也被称作预渲染&#xff0c;是指在不考虑时间限制的情况下&#xff0c;生成高质量二维图像或视频的方法。离线渲染通常用于电影、广告、设计等非交互…

回归预测 | Matlab实现NGO-HKELM北方苍鹰算法优化混合核极限学习机多变量回归预测

回归预测 | Matlab实现NGO-HKELM北方苍鹰算法优化混合核极限学习机多变量回归预测 目录 回归预测 | Matlab实现NGO-HKELM北方苍鹰算法优化混合核极限学习机多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现NGO-HKELM北方苍鹰算法优化混合核极限…

ubuntu第三方库离线安装包(.deb离线安装方法;apt离线安装;离线安装deb)(docker离线安装、安装docker安装)

文章目录 方法1&#xff1a;Ubuntu Packages 网站下载离线包&#xff08;失败了&#xff0c;找不到包的可下载源&#xff0c;有的包有&#xff0c;有的包没有&#xff0c;不知道怎么回事&#xff09;操作步骤1. 在有网络的环境中&#xff0c;打开浏览器并访问 Ubuntu Packages …

使用kettle做的数据同步案例

1 mongo同步数据到mysql中 我想把51万8400的计算出来的八字信息&#xff0c;从mongo同步到mysql&#xff0c;看看在mysql中运行会怎么样。 选择mongodb input&#xff0c;这个是在Big Data中。 填写数据库和表 获取到mongodb的字段,获取到mongo的字段&#xff0c;如果某个字段…

已解决:Vector析构异常Opencv Assert _CrtIsValidHeapPointer

已解决&#xff1a;Vector析构异常Opencv Assert _CrtIsValidHeapPointer 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于医疗科技公司&#xff0c;热衷分享知识&#xff0c;武汉…

手写MyBatis 重要基本原理框架

1. 手写MyBatis 重要基本原理框架 文章目录 1. 手写MyBatis 重要基本原理框架1.1 第一步&#xff1a;IDEA中创建模块1.2 第二步&#xff1a;资源工具类&#xff0c;方便获取指向配置文件的输入流1.3 第三步&#xff1a;定义SqlSessionFactoryBuilder类1.4 第四步&#xff1a;分…

记录一次root过程

设备: Redmi k40s 第一步&#xff0c; 解锁BL&#xff08;会重置手机系统&#xff01;&#xff01;&#xff01;所有数据都会没有&#xff01;&#xff01;&#xff01;&#xff09; 由于更新了澎湃OS系统, 解锁BL很麻烦, 需要社区5级以上还要答题。 但是&#xff0c;这个手机…

T113 Tina5.0 添加板级支持包

文章目录 环境介绍添加板级支持包修改板级文件验证总结 环境介绍 硬件&#xff1a;韦东山T113工业板 软件&#xff1a;全志Tina 5.0 添加板级支持包 进入源码目录<SDK>/device/config/chips/t113/configs&#xff0c;可以看到有如下文件夹&#xff1a; 复制一份evb1_…

React基础教程(07):条件渲染

1 条件渲染 使用条件渲染&#xff0c;结合TodoList案例&#xff0c;进行完善&#xff0c;实现以下功能&#xff1a; 当列表中的数据为空的时候&#xff0c;现实提示信息暂无待办事项当列表中存在数据的时候&#xff0c;提示信息消失 这里介绍三种实现方式。 注意这里的Empty是…

react-day1

1.react是什么呢&#xff1f; react是由Meta公司开发&#xff0c;是一个用于构建web和原生交互界面的库 2.react 项目修改文件保存后 &#xff0c;不能实时更新&#xff0c;需要&#xff1a; 在和package.json文件同目录的地方&#xff0c;新建.env文件&#xff1a;里面加入…

【vue】终端 常用代码 和其他注意

&#x1f951;这里目录 一、【安装】1. 搜版本2.卸载3.安装 带版本4. 纯安装&#xff08;自动最新&#xff09; 二、【官网】官网源码及用法讲解1.【npm】2.【printjs】打印 一、【安装】 以下全拿 qrcode.vue 举例 1. 搜版本 例子&#xff1a;搜 qrcode.vue的版本代码&…

SPI总线协议

目录 一、简介 二、接口 三、传输模式 ​四、数据交换 五、多从机配置 1、常规SPI模式 2、菊花链模式 一、简介 串行外设接口&#xff08;SPI&#xff09;是微控制器和外围IC&#xff08;如传感器、ADC、DAC、移位寄存器、SRAM等&#xff09;之间使用最广泛的接口之一。…

SpringBoot【2】集成 MyBatis Plus

SpringBoot 集成 MyBatis Plus 前言修改 pom.xml修改配置文件添加 实体类添加 持久层接口添加 持久层 XxxMapper.xml 文件添加 业务接口层添加 业务接口实现类添加 控制层添加 MyBatis 配置AutoFillMetaObjectHandlerMyBatisPlusConfig 验证 前言 由于 MySQL 备份/恢复测试&am…

Spring-JdbcTemplate

了解知道即可 JdbcTemplate环境配置 先加入依赖&#xff1a; 在pom.xml中要引入spring和mysql的依赖&#xff1a; <!--仓库和依赖--><repositories><repository><id>spring-milestones</id><name>Spring Milestones</name><ur…

Java阻塞队列:ArrayBlockingQueue

Java阻塞队列&#xff1a;ArrayBlockingQueue ArrayBlockingQueue是Java中的一个阻塞队列&#xff08;Blocking Queue&#xff09;实现&#xff0c;它是线程安全的&#xff0c;并且基于数组实现。ArrayBlockingQueue常用于生产者-消费者模型&#xff0c;在这种模型中&#xff…

某集团数字化转型蓝图规划项目案例(94页PPT)

案例介绍&#xff1a; 本集团数字化转型蓝图规划项目通过确定目标&#xff0c;如制定集团数字化转型的整体战略和规划&#xff0c;明确转型方向和目标。构建数字化业务体系&#xff0c;实现业务流程数字化、智能化。搭建数字化管理平台&#xff0c;提升集团内部的管理效率和决…

Pyshark——安装、解析pcap文件

1、简介 PyShark是一个用于网络数据包捕获和分析的Python库&#xff0c;基于著名的网络协议分析工具Wireshark和其背后的libpcap/tshark库。它提供了一种便捷的方式来处理网络流量&#xff0c;适用于需要进行网络监控、调试和研究的场景。以下是PyShark的一些关键特性和使用方…