一、开篇:智能决策的科学与艺术

在前九天的学习中,我们掌握了处理各种数据类型的深度学习方法,但这些都属于"被动学习"——模型从静态数据中学习模式。今天,我们将进入一个全新的领域:强化学习(Reinforcement Learning, RL)。这是一种让智能体通过与环境交互来学习最优决策的范式,更接近人类和动物的自然学习方式。

从AlphaGo战胜世界冠军到自动驾驶汽车的决策系统,从游戏AI到机器人控制,强化学习正在创造着一个又一个突破。

二、强化学习基础:理解MDP框架

2.1 什么是马尔可夫决策过程(MDP)?

马尔可夫决策过程是强化学习的数学基础,它描述了一个智能体在环境中做决策的完整框架。MDP包含五个核心要素:

1. 状态(State):环境当前情况的描述
2. 动作(Action):智能体可以执行的操作
3. 奖励(Reward):环境对智能体动作的反馈
4. 状态转移概率:执行动作后状态转换的规律
5. 折扣因子(γ):权衡即时奖励与未来奖励的重要性

马尔可夫性质:当前状态包含所有历史信息,未来只依赖于当前状态而不依赖于过去的状态序列。这是MDP的核心假设。

2.2 关键概念详解

价值函数(Value Function):衡量在某个状态(或状态-动作对)下,智能体能够获得的期望累积奖励。分为状态价值函数V(s)和动作价值函数Q(s,a)。

贝尔曼方程:价值函数的递归定义,表达了当前价值与后续状态价值之间的关系。这是强化学习算法的理论基础。

探索与利用的权衡:智能体需要平衡尝试新动作(探索)和选择已知好动作(利用)之间的矛盾。这是强化学习独有的挑战。

三、深度Q学习:价值学习的革命

3.1 从Q-Learning到Deep Q-Network

Q-Learning是一种传统的强化学习算法,它通过维护一个Q表格(状态-动作值表)来学习最优策略。但在复杂环境中,状态空间可能非常大,表格方法不再可行。

Deep Q-Network (DQN):2015年DeepMind提出的革命性算法,用神经网络近似Q函数,解决了高维状态空间的问题。DQN的核心创新:

1. 经验回放(Experience Replay):存储转移样本并在训练时随机采样,打破数据间的相关性
2. 目标网络(Target Network):使用独立的网络计算目标Q值,提高训练稳定性

3.2 DQN实现详解

神经网络架构:

import torch
import torch.nn as nn
import torch.nn.functional as Fclass DQN(nn.Module):def __init__(self, state_size, action_size):super(DQN, self).__init__()# 输入层:状态维度,输出层:动作维度self.fc1 = nn.Linear(state_size, 64)  # 第一全连接层self.fc2 = nn.Linear(64, 64)          # 第二全连接层self.fc3 = nn.Linear(64, action_size) # 输出每个动作的Q值def forward(self, x):# 前向传播过程x = F.relu(self.fc1(x))  # 第一层+ReLU激活x = F.relu(self.fc2(x))  # 第二层+ReLU激活return self.fc3(x)       # 输出Q值,不需要激活函数

经验回放缓冲区:

from collections import deque
import randomclass ReplayBuffer:def __init__(self, capacity=10000):self.buffer = deque(maxlen=capacity)  # 固定大小的循环队列def push(self, state, action, reward, next_state, done):# 存储转移样本:(s, a, r, s', done)self.buffer.append((state, action, reward, next_state, done))def sample(self, batch_size):# 随机采样一批经验return random.sample(self.buffer, batch_size)def __len__(self):return len(self.buffer)

目的:解决数据相关性数据效率问题

  • 打破相关性:在在线学习中,相邻的经验样本(s_t, a_t, r_t, s_{t+1})是高度相关的。直接用它们顺序训练网络会导致训练不稳定且容易陷入局部最优。通过随机采样一批过去的经验,可以打破这种相关性,使训练过程更加平滑稳定。
  • 提高数据效率:每一个经验样本都可以被多次使用,而不是用一次就丢弃,极大地提高了数据的利用效率。

实现细节

  • 使用 deque 并设置 maxlen 实现了一个固定大小的循环队列(FIFO)。当缓冲区满时,最旧的经验会被自动移除。

  • sample(batch_size) 方法是我们从缓冲区中随机抽取一个小批量经验用于训练的关键。

3.3 完整训练算法

def train_dqn(env, agent, target_net, optimizer, episodes=1000, batch_size=64, gamma=0.99,update_target_every=100):"""DQN训练循环env: Gym环境agent: 在线Q网络target_net: 目标Q网络"""replay_buffer = ReplayBuffer()epsilon = 1.0  # 初始探索率eps_min = 0.01  # 最小探索率eps_decay = 0.995  # 探索率衰减for episode in range(episodes):state = env.reset()total_reward = 0done = Falsewhile not done:# ε-greedy探索策略if random.random() < epsilon:action = env.action_space.sample()  # 随机探索else:with torch.no_grad():state_tensor = torch.FloatTensor(state).unsqueeze(0)q_values = agent(state_tensor)action = q_values.argmax().item()  # 选择最优动作# 执行动作并观察结果next_state, reward, done, _ = env.step(action)replay_buffer.push(state, action, reward, next_state, done)total_reward += rewardstate = next_state# 经验回放更新if len(replay_buffer) >= batch_size:batch = replay_buffer.sample(batch_size)states, actions, rewards, next_states, dones = zip(*batch)# 转换为张量states = torch.FloatTensor(states)actions = torch.LongTensor(actions).unsqueeze(1)rewards = torch.FloatTensor(rewards)next_states = torch.FloatTensor(next_states)dones = torch.BoolTensor(dones)# 计算当前Q值current_q = agent(states).gather(1, actions)# 计算目标Q值(使用目标网络)with torch.no_grad():next_q = target_net(next_states).max(1)[0]target_q = rewards + gamma * next_q * (~dones)# 计算损失并更新loss = F.mse_loss(current_q.squeeze(), target_q)optimizer.zero_grad()loss.backward()optimizer.step()# 更新目标网络if episode % update_target_every == 0:target_net.load_state_dict(agent.state_dict())# 衰减探索率epsilon = max(eps_min, epsilon * eps_decay)print(f"Episode {episode}, Reward: {total_reward}, Epsilon: {epsilon:.3f}")

四、策略梯度方法:直接优化策略

4.1 从价值学习到策略学习

与DQN等价值学习方法不同,策略梯度方法直接学习策略函数π(a|s),即状态到动作的映射。这类方法的优势:

1. 更适合连续动作空间
2. 能学习随机策略
3. 更好的收敛特性

4.2 REINFORCE算法

REINFORCE是最基础的策略梯度算法,使用蒙特卡洛方法估计梯度:

class PolicyNetwork(nn.Module):def __init__(self, state_size, action_size):super(PolicyNetwork, self).__init__()self.fc1 = nn.Linear(state_size, 64)self.fc2 = nn.Linear(64, 64)self.fc3 = nn.Linear(64, action_size)def forward(self, x):x = F.relu(self.fc1(x))x = F.relu(self.fc2(x))return F.softmax(self.fc3(x), dim=-1)  # 输出动作概率def compute_returns(rewards, gamma=0.99):"""计算累积回报"""returns = []G = 0for r in reversed(rewards):G = r + gamma * Greturns.insert(0, G)return returns

4.3 演员-评论家架构

演员-评论家(Actor-Critic)方法结合了策略梯度和价值学习的优点:
- 演员(Actor):学习策略函数,决定执行什么动作
- 评论家(Critic):学习价值函数,评估动作的好坏

class ActorCritic(nn.Module):def __init__(self, state_size, action_size):super(ActorCritic, self).__init__()# 共享特征提取层self.fc1 = nn.Linear(state_size, 64)self.fc2 = nn.Linear(64, 64)# 演员网络(策略)self.actor = nn.Linear(64, action_size)# 评论家网络(价值)self.critic = nn.Linear(64, 1)def forward(self, x):x = F.relu(self.fc1(x))x = F.relu(self.fc2(x))policy = F.softmax(self.actor(x), dim=-1)value = self.critic(x)return policy, value

五、实战应用:OpenAI Gym环境

5.1 CartPole平衡任务

CartPole是一个经典的强化学习测试环境:控制小车保持杆子平衡。

import gymdef run_cartpole():env = gym.make('CartPole-v1')state_size = env.observation_space.shape[0]action_size = env.action_space.n# 初始化网络agent = DQN(state_size, action_size)target_net = DQN(state_size, action_size)target_net.load_state_dict(agent.state_dict())optimizer = torch.optim.Adam(agent.parameters(), lr=1e-3)# 开始训练train_dqn(env, agent, target_net, optimizer, episodes=500)# 测试训练效果test_agent(env, agent)def test_agent(env, agent):state = env.reset()total_reward = 0while True:env.render()  # 显示环境with torch.no_grad():state_tensor = torch.FloatTensor(state).unsqueeze(0)action = agent(state_tensor).argmax().item()state, reward, done, _ = env.step(action)total_reward += rewardif done:breakprint(f"测试得分: {total_reward}")env.close()

5.2 训练效果分析

在CartPole环境中,成功标准通常是连续100回合平均得分达到195以上。通过调整超参数和训练策略,我们可以观察到:

1. 探索率衰减:初期高探索率帮助发现好策略,后期低探索率稳定性能
2. 目标网络更新频率:影响训练稳定性的关键参数
3. 批大小和学习率:需要仔细调优以获得最佳性能

六、学习总结与明日计划

6.1 今日核心成果

✅ 理解马尔可夫决策过程的基本概念  
✅ 掌握价值函数、贝尔曼方程等理论基础  
✅ 实现深度Q网络及其关键组件(经验回放、目标网络)  
✅ 了解策略梯度方法和演员-评论家架构  
✅ 在CartPole环境中成功训练智能体  

6.2 关键问题记录

❓ 如何设计合适的奖励函数引导智能体学习  
❓ 超参数调优的系统性方法  
❓ 从仿真环境到真实应用的迁移挑战  

6.3 明日学习重点

- 元学习基础概念与算法框架
- 模型无关元学习(MAML)原理与实现
- 少样本学习在实际任务中的应用
- 快速适应新任务的能力构建

七、资源推荐与延伸阅读

1. OpenAI Spinning Up:最好的强化学习入门教程,包含理论解释和代码实现
2. 强化学习导论:Richard Sutton的经典教材,被誉为"强化学习圣经"
3. DeepMind强化学习课程:DeepMind研究人员的视频讲解
4. Stable Baselines3:基于PyTorch的强化学习算法库,包含多种先进算法实现

八、工程实践建议

1. 奖励设计原则:
- 奖励应该与最终目标一致
- 避免稀疏奖励问题(提供中间奖励)
- 适当缩放奖励数值范围

2. 超参数调优指南:

参数推荐范围作用
学习率1e-4 ~ 1e-3控制参数更新步长
折扣因子γ0.9 ~ 0.99未来奖励的重要性
回放缓冲区大小1e4 ~ 1e6经验存储容量
目标网络更新频率100 ~ 1000步控制训练稳定性

3. 调试与监控指标:
# 关键监控指标
- 回合奖励(Episode Reward)
- Q值损失(Q-value Loss)
- 探索率(Epsilon)
- 平均Q值(Average Q-value)
- 策略熵(Policy Entropy)- 对于策略梯度方法

下篇预告:《Day11:元学习入门—让模型学会如何学习》  
将探索如何让机器学习模型具备快速适应新任务的能力,实现真正的"学会学习"!我们将学习MAML等元学习算法,并实现少样本学习系统。

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

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

相关文章

Jenkins Pipeline(二)-设置Docker Agent

设计流水线的目的是更方便地使用 Docker镜像作为单个 Stage或整个流水线的执行环境。 1.安装必要插件 在Jenkins服务器上已经安装了插件。 Docker PipelinePipeline Maven IntegrationPipeline Maven Plugin API 如果插件缺少什么&#xff0c;再次检查并安装即可。 2. 配…

神经网络|(十六)概率论基础知识-伽马函数·中

【1】引言 前序学习进程中&#xff0c;已经初步了解了伽马函数&#xff0c;认识到nnn的阶乘计算可以转化为&#xff1a; n!n!⋅limk→∞kn⋅k!(nk)!limk→∞kn⋅k!⋅n!(nk)!limk→∞kn⋅k!(n1)(n2)...(nk)n!n! \cdot lim_{k\rightarrow\infty}\frac{k^n\cdot k!}{(nk)!}\\lim_…

设计模式Books Reading

文章目录 设计模式 创建型设计模式 工厂方法 示例说明 工厂方法模式结构 案例伪代码 工厂方法模式适合应用 实现方式 工厂方法模式优缺点 与其他模式的关系 概念示例 抽象工厂 抽象工厂模式结构 抽象工厂模式适合应用场景 实现方式 抽象工厂模式优缺点 与其他模式的关系 代码示…

接吻数问题:从球体堆叠到高维空间的数学奥秘

本文由「大千AI助手」原创发布&#xff0c;专注用真话讲AI&#xff0c;回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关注我&#xff0c;一起撕掉过度包装&#xff0c;学习真实的AI技术&#xff01; 1 接吻数问题概述 接吻数问题&#xff08;Kissing Number Problem&am…

深度学习③【卷积神经网络(CNN)详解:从卷积核到特征提取的视觉革命(概念篇)】

文章目录先言1. 卷积核&#xff1a;特征检测的魔法窗口1.1什么是卷积核&#xff1a;可学习的特征检测器1.2可视化理解&#xff1a;边缘检测、纹理提取、特征发现1.3代码实现&#xff1a;使用PyTorch定义和初始化卷积层2. 卷积运算的数学原理2.1.离散卷积计算&#xff1a;滑动窗…

当不想安装telnet或nc时,可使用 Linux 系统默认自带的bash原生网络功能或ping(辅助判断)测试连通性

1. 用bash原生/dev/tcp测试端口&#xff08;无需任何工具&#xff09;bashshell 内置了/dev/tcp虚拟设备&#xff0c;可直接通过脚本测试端口是否能连接&#xff0c;执行以下命令&#xff08;替换数据库 IP 和端口&#xff09;&#xff1a;# 格式&#xff1a;echo > /dev/tc…

【STM32外设】ADC

声明&#xff1a;上图是STM32产品型号各字段含义&#xff0c;本文基于STM32F103 1、ADC的一些概念 常规通道(常规组)和注入通道(注入组)&#xff08;regular channels and injected channels&#xff09;ADC支持的外部通道总共16个&#xff08;且被3个ADC共享&#xff0c;ADC12…

Aha Moment——啊哈时刻!

1. 理解面试官的意图面试官问你“Aha moment”&#xff0c;其实是想知道&#xff1a;你是否真正理解这个概念&#xff1a;不只是背定义&#xff0c;而是理解其为什么重要。你如何发现它&#xff1a;考察你的数据分析方法论和技术能力&#xff08;用了哪些数据、指标、模型&…

RAG教程5:多表示索引和ColBERT

文章目录 导入依赖包 多表示索引 ColBERT 导入依赖包 %pip install youtube-transcript-api pytube多表示索引 from langchain_community.document_loaders import WebBaseLoader from langchain_text_splitters import RecursiveCharacterTextSplitterloader = WebBaseL

来自火山引擎的 MCP 安全授权新范式

资料来源&#xff1a;火山引擎-开发者社区 本文旨在深入剖析火山引擎 Model Context Protocol (MCP) 开放生态下的 OAuth 授权安全挑战&#xff0c;并系统阐述火山引擎为此构建的多层次、纵深防御安全方案。面对由 OAuth 2.0 动态客户端注册带来的灵活性与潜在风险&#xff0c;…

瑞芯微RK3506开发板PWM输入捕获驱动调试记录

本文演示PWM输入信号采集&#xff0c;基于触觉智能RK3506开发板。配置为&#xff1a; 3核Cortex-A7Cortex-M0多核异构处理器 主要接口&#xff1a;2路CAN FD&#xff0c;5路串口&#xff0c;RGB、MIPI、音频、USB2.0 OTG等、板载双百兆网口4G星闪SLEWiFi6BLE5.2。 PWM信号简…

PHP的header()函数分析

PHP的header()函数是HTTP协议交互的核心工具&#xff0c;它通过直接操纵响应头实现服务器与客户端之间的元数据通信。作为PHP原生函数&#xff0c;其设计初衷是处理HTTP协议层的关键操作&#xff0c;包括状态码设置、内容类型声明和缓存控制等基础功能。在Web开发中&#xff0c…

根据并发和响应延迟,实现语音识别接口自动切换需求

根据并发和响应延迟&#xff0c;语音识别接口自动 切换需求 需求描述&#xff1a; 当请求的语音识别的请求数量大于3或者请求语音识别接口3秒不可达无响应&#xff0c;切换备用语音识别接口 科大讯飞语音识别作为备用接口 科大讯飞的API文档: 进入讯飞开放平台的网页&#…

程序员之电工基础-CV程序解决目标检测

一、背景 兴趣爱好来了&#xff0c;决定研发一个产品。涉及到电工和机械等知识&#xff0c;所以记录一下相关的基础知识。今天的内容又回到了我的主营板块&#xff01;&#xff01;哈哈&#xff01;&#xff01;为后续整体集成做准备&#xff0c;先测试目标检测部分的能力。 二…

B树的概述以及插入逻辑

一&#xff0c;B树的概述1.B树(B-树)又称多路平衡查找树&#xff0c;B树所有节点中孩子数量的最大值n称为B树的阶&#xff0c;通常用m表示比如当m为2就是常见的二叉树一颗m阶的B树定义如下&#xff1a;1)每个结点最多有m-1个关键字&#xff1b;2)根节点最少可以只有1个关键字;3…

如何用 Kotlin 在 Android 手机开发一个小闹钟、计时器、秒表

以下是在 Android 上用 Kotlin 开发小闹钟、计时器和秒表的方法&#xff0c;分为核心功能实现和界面设计两部分&#xff1a; 闹钟功能实现 AlarmManager 和 BroadcastReceiver // 设置闹钟 val alarmManager getSystemService(Context.ALARM_SERVICE) as AlarmManager val i…

LeetCode Hot 100 第8天

1. 73 矩阵置零&#xff08;记录标识&#xff09; 链接&#xff1a;题目链接 题解&#xff1a; 题解 时间复杂度O(n*m)&#xff1a; 方案1(空间复杂度O(n m))&#xff1a;matrix[i][j] 0&#xff0c;意味着 第i行、第j列所有元素都要置为0&#xff1b;维护能置为0行、列的集…

Python OpenCV图像处理与深度学习:Python OpenCV开发环境搭建与入门

Python OpenCV入门&#xff1a;环境设置 学习目标 通过本课程&#xff0c;学员们将学习在Windows、macOS和Linux操作系统上安装Python和OpenCV&#xff0c;配置开发环境&#xff0c;以及如何使用Jupyter Notebook和PyCharm等集成开发环境&#xff08;IDE&#xff09;进行基本操…

【论文阅读】SegCLIP:用于高分辨率遥感图像语义分割的多模态视觉语言和快速学习

【论文阅读】SegCLIP&#xff1a;用于高分辨率遥感图像语义分割的多模态视觉语言和快速学习 文章目录【论文阅读】SegCLIP&#xff1a;用于高分辨率遥感图像语义分割的多模态视觉语言和快速学习一、介绍二、联系工作三、方法四、实验结果**数据集**SegCLIP: Multimodal Visual-…

Anaconda、OpenCV安装配置方法

目录 1.Anaconda安装 1.1 国内镜像软件下载 1.2 点击exe&#xff0c;一路下一步安装 1.3 检查安装情况 1.3.1 安装前后系统环境变量变化对比 1.3.2 查看安装路径和版本 1.4 Anaconda自带的python版本查看命令如下&#xff1a; 1.5 修改镜像地址&#xff0c;加快下载包的…