万字长文!搞懂强化学习的基础知识!

作者:aicoting日期:2026/1/20

推荐直接网站在线阅读:aicoting.cn

强化学习是什么?

强化学习(Reinforcement Learning, RL)是一类通过与环境交互来学习最优决策策略的机器学习方法。与监督学习不同,强化学习没有直接提供的“正确答案”,而是通过奖励信号(reward)来评估行为的好坏。智能体(agent)在环境(environment)中执行动作(action),根据环境反馈获得奖励,并观察状态(state)变化。

强化学习的目标是学习一个策略,使得智能体在长期交互中获得累计奖励最大化。典型方法包括基于值函数的策略(如 Q-learning、SARSA)、基于策略优化的方法(如 Policy Gradient)、以及结合深度神经网络的深度强化学习(Deep RL)。如今,强化学习已经在机器人控制、游戏智能、资源调度和自动驾驶等领域逐步铺开。

马尔可夫决策过程

马尔可夫决策过程(MDP)是强化学习和决策理论中的核心数学框架,用于描述具有随机性和序列决策特征的环境。MDP 假设环境的状态随时间变化,并且未来状态的转移只依赖于当前状态和智能体的行为,而与过去状态无关,这就是经典的“马尔可夫性”假设。

马尔可夫决策过程(MDP)是一个四元组(S,A,P,R,γ)(S,A,P,R,γ)(S,A,P,R,γ),其中:

  1. 状态空间 SSS:表示环境可能处于的所有状态集合,每个状态 s∈Ss∈Ss∈S 描述了环境在某一时刻的情况。
  2. 动作空间 AAA:表示智能体在每个状态下可选择的所有动作集合,动作决定智能体对环境的干预。
  3. 状态转移概率 P(s′∣s,a)P(s′|s,a)P(s′∣s,a):描述在状态 sss采取动作 aaa后转移到状态 s′s′s′的概率分布,用于建模环境的随机性。
  4. 奖励函数 R(s,a,s′)R(s,a,s′)R(s,a,s′):表示智能体在状态 sss执行动作 aaa并转移到状态 s′s′s′时获得的即时反馈,指导智能体选择更优策略。
  5. 折扣因子 γ∈[0,1]γ∈[0,1]γ∈[0,1]:用于计算累计奖励的折扣,使得智能体在做决策时平衡短期奖励和长期收益。

MDP 的核心问题是找到一个最优策略 π∗\pi^*π∗,使智能体在环境中采取策略后获得的 期望累计奖励最大化。策略π(s) π(s)π(s)定义了在每个状态下选择动作的规则。

解决 MDP 的常用方法包括:

  1. 动态规划(Dynamic Programming, DP)

通过贝尔曼方程(Bellman Equation)迭代求解状态值函数 V(s) 或动作值函数 Q(s,a),逐步更新策略,直至收敛到最优策略。

  1. 值迭代(Value Iteration)与策略迭代(Policy Iteration)
  • 值迭代直接迭代更新值函数,最终根据值函数导出最优策略。
  • 策略迭代交替进行策略评估和策略改进,直到策略不再改变,得到最优策略。
  1. 强化学习方法

当环境的状态转移概率和奖励函数未知时,可通过交互式学习方法(如 Q-learning、SARSA)估计值函数,逐步逼近最优策略。

下面我们通过代码演示如何在一个小型 MDP 上使用 值迭代(Value Iteration) 求解最优策略,为了直观展示,我用一个简单的网格世界(Grid World)环境:

1import numpy as np
2import matplotlib.pyplot as plt
3
4# 1. 网格世界参数
5n_rows, n_cols = 4, 4
6n_states = n_rows * n_cols
7n_actions = 4  # 上,下,左,右
8
9action_offsets = [(-1,0),(1,0),(0,-1),(0,1)]
10action_symbols = ['↑','↓','←','→']
11
12start_state = 0       # 左上角 S
13terminal_state = n_states - 1  # 右下角 T
14reward_step = -1
15reward_terminal = 0
16
17# 状态转移函数
18def next_state_reward(s, a):
19    row, col = divmod(s, n_cols)
20    if s == terminal_state:
21        return s, reward_terminal
22    dr, dc = action_offsets[a]
23    new_row = min(max(row+dr,0), n_rows-1)
24    new_col = min(max(col+dc,0), n_cols-1)
25    s_next = new_row * n_cols + new_col
26    return s_next, reward_step
27
28# 2. 值迭代
29gamma = 0.9
30theta = 1e-4
31V = np.zeros(n_states)
32
33while True:
34    delta = 0
35    for s in range(n_states):
36        if s == terminal_state:
37            continue
38        v = V[s]
39        V[s] = max([next_state_reward(s,a)[1] + gamma*V[next_state_reward(s,a)[0]] for a in range(n_actions)])
40        delta = max(delta, abs(v-V[s]))
41    if delta < theta:
42        break
43
44# 3. 求最优策略
45policy = np.full(n_states,'',dtype=object)
46for s in range(n_states):
47    if s == start_state:
48        policy[s] = 'S'
49    elif s == terminal_state:
50        policy[s] = 'T'
51    else:
52        q_values = [next_state_reward(s,a)[1] + gamma*V[next_state_reward(s,a)[0]] for a in range(n_actions)]
53        policy[s] = action_symbols[np.argmax(q_values)]
54
55grid_policy = policy.reshape(n_rows, n_cols)
56print("最优策略:")
57print(grid_policy)
58
59# 4. 可视化值函数和策略
60plt.figure(figsize=(6,6))
61plt.imshow(V.reshape(n_rows, n_cols), cmap='cool', interpolation='nearest')
62for i in range(n_rows):
63    for j in range(n_cols):
64        plt.text(j,i,f"{V[i*n_cols+j]:.1f}\n{grid_policy[i,j]}",ha='center',va='center',color='black')
65plt.title("Grid World: State Values and Optimal Policy")
66plt.colorbar(label="Value")
67plt.show()
68

运行结果如下图,其中输出网格中每个状态对应的最优动作(↑↓←→),终点用 T 标记。颜色越深表示状态价值越高,图上同时标出最优策略,可以直观看到智能体如何从左上角走向右下角终点。

MDP 在强化学习和决策问题中应用广泛。例如,机器人控制任务中,状态表示机器人的位置和姿态,动作表示可执行的控制命令;在资源调度问题中,状态表示系统资源使用情况,动作表示任务分配策略;在游戏 AI 中,状态表示游戏棋盘或场景信息,动作表示玩家可能采取的操作。通过将这些问题建模为 MDP,可以系统性地求解最优策略,实现智能体自主决策和长期收益最大化。

马尔可夫决策过程提供了一个结构化的数学框架,将序列决策问题形式化为状态、动作、奖励和转移概率的组合。通过动态规划、值迭代、策略迭代以及强化学习方法,MDP 可以帮助智能体在不确定环境中学习最优策略。作为强化学习的理论基础,MDP 不仅在学术研究中具有重要意义,也在机器人、游戏、调度和自动驾驶等实际应用中展现出强大的价值。

动态规划与值迭代

在强化学习中,动态规划(Dynamic Programming, DP) 是求解决策问题的一种经典方法,它假设环境的状态转移概率和奖励函数已知,通过系统地分解问题、利用最优子结构特性求解最优策略。

值迭代(Value Iteration)是动态规划中最常用的一种算法,能够高效地计算马尔可夫决策过程(MDP)中的最优状态价值函数,从而导出最优策略。

动态规划的核心思想是 将复杂的决策问题拆解成子问题,并通过已解决的子问题结果来求解整体问题。对于强化学习中的 MDP(Markov Decision Process),动态规划的目标是计算每个状态的最优价值函数V∗(s)V^*(s)V∗(s)。

V∗(s)=max⁡a∑s′P(s′∣s,a)[R(s,a,s′)+γV∗(s′)]V^*(s) = \max_a \sum_{s'} P(s'|s,a) \big[ R(s,a,s') + \gamma V^*(s') \big]V∗(s)=maxa​∑s′​P(s′∣s,a)[R(s,a,s′)+γV∗(s′)]

其中:

  • sss表示当前状态
  • aaa表示动作
  • s′s′s′表示下一状态
  • P(s′∣s,a)P(s′∣s,a)P(s′∣s,a)为状态转移概率
  • R(s,a,s′)R(s,a,s′)R(s,a,s′)为奖励函数
  • γγγ为折扣因子,控制未来奖励的重要性

一旦求得最优状态价值函数 V∗(s)V^*(s)V∗(s),最优策略 π∗(s)π^∗(s)π∗(s)可以通过选择在当前状态下能获得最大期望收益的动作得到:

π∗(s)=arg⁡max⁡a∑s′P(s′∣s,a)[R(s,a,s′)+γV∗(s′)]\pi^*(s) = \arg\max_a \sum_{s'} P(s'|s,a) \big[ R(s,a,s') + \gamma V^*(s') \big]π∗(s)=argmaxa​∑s′​P(s′∣s,a)[R(s,a,s′)+γV∗(s′)]

值迭代(Value Iteration) 是一种基于动态规划的迭代方法,用于求解 MDP 的最优状态价值函数和策略。它的主要步骤如下:

  1. 初始化:将每个状态的价值函数 V(s)V(s)V(s)初始化为 0 或任意值。
  2. 迭代更新:对于每个状态 sss,更新其价值: V(s)←max⁡a∑s′P(s′∣s,a)[R(s,a,s′)+γV(s′)]V(s) \leftarrow \max_a \sum_{s'} P(s'|s,a) \big[ R(s,a,s') + \gamma V(s') \big]V(s)←maxa​∑s′​P(s′∣s,a)[R(s,a,s′)+γV(s′)]
  3. 收敛判定:当所有状态价值更新变化量 Δ小于阈值 θ时,迭代停止。
  4. 导出最优策略:根据收敛后的价值函数,选择使期望收益最大的动作作为最优策略。

相比策略迭代,值迭代每一步只更新价值函数,不需要显式地保存和更新策略,因此实现更简单且计算效率高。

下面通过一个 4×4 网格世界示例展示值迭代的实现:

1import numpy as np
2import matplotlib.pyplot as plt
3
4# 网格世界参数
5n_rows, n_cols = 4, 4
6n_states = n_rows * n_cols
7n_actions = 4  # 上,下,左,右
8action_offsets = [(-1,0),(1,0),(0,-1),(0,1)]
9action_symbols = ['↑','↓','←','→']
10
11start_state = 0
12terminal_state = n_states-1
13reward_step = -1
14reward_terminal = 0
15gamma = 0.9
16theta = 1e-4
17
18def next_state_reward(s,a):
19    row,col = divmod(s,n_cols)
20    if s==terminal_state:
21        return s, reward_terminal
22    dr,dc = action_offsets[a]
23    new_row = min(max(row+dr,0),n_rows-1)
24    new_col = min(max(col+dc,0),n_cols-1)
25    s_next = new_row*n_cols+new_col
26    return s_next, reward_step
27
28# 值迭代
29V = np.zeros(n_states)
30while True:
31    delta = 0
32    for s in range(n_states):
33        if s==terminal_state:
34            continue
35        v = V[s]
36        V[s] = max([next_state_reward(s,a)[1]+gamma*V[next_state_reward(s,a)[0]] for a in range(n_actions)])
37        delta = max(delta, abs(v-V[s]))
38    if delta<theta:
39        break
40
41# 导出最优策略
42policy = np.full(n_states,'',dtype=object)
43for s in range(n_states):
44    if s==start_state:
45        policy[s]='S'
46    elif s==terminal_state:
47        policy[s]='T'
48    else:
49        q_values = [next_state_reward(s,a)[1]+gamma*V[next_state_reward(s,a)[0]] for a in range(n_actions)]
50        policy[s]=action_symbols[np.argmax(q_values)]
51
52grid_policy = policy.reshape(n_rows,n_cols)
53print("最优策略:")
54print(grid_policy)
55
56# 可视化值函数和策略
57plt.figure(figsize=(6,6))
58plt.imshow(V.reshape(n_rows,n_cols), cmap='cool', interpolation='nearest')
59for i in range(n_rows):
60    for j in range(n_cols):
61        plt.text(j,i,f"{V[i*n_cols+j]:.1f}\n{grid_policy[i,j]}",ha='center',va='center',color='black')
62plt.title("Grid World: State Values and Optimal Policy")
63plt.colorbar(label="Value")
64plt.show()
65

结果如下,左上角为起点 S,右下角为终点 T。每个格子显示对应的最优动作方向(↑↓←→),智能体能够顺利从起点到达终点,颜色越深表示状态价值越高,显示状态越接近终点的累计收益越大。值迭代通过迭代更新状态价值函数,最终收敛到最优值函数,从而导出全局最优策略。

总结一下就是动态规划提供了求解马尔可夫决策过程的一般框架,而值迭代则是最常用的实现方式之一。通过迭代更新状态价值函数,值迭代能够高效求得最优策略。

Q-learning

Q-Learning 是强化学习中最经典的基于值函数的无模型方法(model-free method)之一,用于求解马尔可夫决策过程(MDP)中的最优策略。它不依赖于已知的环境状态转移概率,只需通过智能体与环境的交互经验就能学习最优策略,因此在实际强化学习任务中应用广泛。

Q-Learning 的核心是学习每个状态-动作对的价值函数(Q 函数):

在状态下选择动作的期望累积回报Q(s,a)=在状态 s下选择动作 a的期望累积回报Q(s,a)=在状态 s下选择动作 a的期望累积回报Q(s,a)=在状态 s下选择动作 a的期望累积回报

最优 Q 函数满足贝尔曼最优方程:

Q∗(s,a)=E[Rt+1+γmax⁡a′Q∗(st+1,a′) ∣ st=s,at=a]Q^*(s,a) = \mathbb{E}\big[ R_{t+1} + \gamma \max_{a'} Q^*(s_{t+1},a') \,|\, s_t=s, a_t=a \big]Q∗(s,a)=E[Rt+1​+γmaxa′​Q∗(st+1​,a′)∣st​=s,at​=a]

其中:

  • sss为当前状态
  • aaa为当前动作
  • s′s′s′为下一个状态
  • Rt+1R_{t+1}Rt+1​为即时奖励
  • γγγ为折扣因子

通过不断更新 Q 值,Q-Learning 能收敛到最优 Q 函数 Q∗Q^*Q∗,从而导出最优策略:

π∗(s)=arg⁡max⁡aQ∗(s,a)\pi^*(s) = \arg\max_a Q^*(s,a)π∗(s)=argmaxa​Q∗(s,a)

Q-Learning 算法的步骤如下:

  1. 初始化:对每个状态-动作对Q(s,a)Q(s,a)Q(s,a)初始化为 0 或小随机数。
  2. 交互学习:在每个时间步 ttt,智能体从状态 sss 选择动作 a(通常采用 ϵ-贪心策略)。
  3. 执行动作:智能体执行动作 a,观察奖励Rt+1 和下一个状态 s’。
  4. 更新 Q 值: Q(s,a)←Q(s,a)+α[Rt+1+γmaxa′Q(s′,a′)−Q(s,a)]其中 α为学习率。
  5. 迭代直到收敛:重复步骤 2-4,直至 Q 值收敛或达到最大迭代次数。

下面我们通过 4×4 网格世界演示 Q-Learning 学习最优策略,

1import numpy as np
2import matplotlib.pyplot as plt
3
4# 网格世界参数
5n_rows, n_cols = 4, 4
6n_states = n_rows * n_cols
7n_actions = 4  # 上,下,左,右
8action_offsets = [(-1,0),(1,0),(0,-1),(0,1)]
9action_symbols = ['↑','↓','←','→']
10
11start_state = 0
12terminal_state = n_states-1
13reward_step = -1
14reward_terminal = 0
15
16gamma = 0.9
17alpha = 0.1
18epsilon = 0.1
19n_episodes = 5000
20
21# 状态转移
22def next_state_reward(s,a):
23    row,col = divmod(s,n_cols)
24    if s==terminal_state:
25        return s,reward_terminal
26    dr,dc = action_offsets[a]
27    new_row = min(max(row+dr,0),n_rows-1)
28    new_col = min(max(col+dc,0),n_cols-1)
29    s_next = new_row*n_cols+new_col
30    return s_next,reward_step
31
32# 初始化 Q 
33Q = np.zeros((n_states,n_actions))
34
35# Q-Learning 主循环
36for episode in range(n_episodes):
37    s = start_state
38    while s != terminal_state:
39        # epsilon-greedy 选择动作
40        if np.random.rand() < epsilon:
41            a = np.random.randint(n_actions)
42        else:
43            a = np.argmax(Q[s])
44        s_next, r = next_state_reward(s,a)
45        Q[s,a] += alpha*(r + gamma*np.max(Q[s_next]) - Q[s])
46        s = s_next
47
48# 导出最优策略
49policy = np.full(n_states,'',dtype=object)
50for s in range(n_states):
51    if s==start_state:
52        policy[s]='S'
53    elif s==terminal_state:
54        policy[s]='T'
55    else:
56        policy[s] = action_symbols[np.argmax(Q[s])]
57
58grid_policy = policy.reshape(n_rows,n_cols)
59print("最优策略:")
60print(grid_policy)
61
62# 可视化
63plt.figure(figsize=(6,6))
64plt.imshow(np.max(Q,axis=1).reshape(n_rows,n_cols), cmap='cool', interpolation='nearest')
65for i in range(n_rows):
66    for j in range(n_cols):
67        plt.text(j,i,f"{grid_policy[i*n_cols+j]}",ha='center',va='center',color='black')
68plt.title("Grid World: Optimal Policy via Q-Learning")
69plt.colorbar(label="Max Q-Value")
70plt.show()
71

结果如下图,同样,起点 S 到终点 T 的路径由策略指示,方向箭头指明智能体应该采取的动作,颜色深表示该状态下最大 Q 值较高,说明靠近终点或通往终点的动作更优。

添加图片注释,不超过 140 字(可选)

简单总结一下,Q-Learning 是强化学习中基础而重要的算法,通过不断更新状态-动作价值函数,智能体可以在未知环境中学习最优策略。其优点是无模型、简单易实现、收敛性良好,缺点是状态空间和动作空间过大时需要采用函数逼近(如深度 Q 网络)。

最新的文章都在公众号aicoting更新,别忘记关注哦!!!

📚 推荐阅读

机器学习之数据预处理篇!

机器学习特征工程中的特征选择

机器学习中的特征构造

机器学习之特征降维

一文搞懂层次聚类和密度聚类方法!

一文搞懂机器学习中的PCA主成分分析!

机器学习中独立成分分析ICA和主成分分析PCA有什么区别?

一文搞懂t-SNE和UMAP降维方法!

万字长文!搞懂机器学习中的概率图模型

万字长文!搞懂机器学习中半监督学习的经典方法!

作者:aicoting

分享是一种信仰,连接让成长更有温度。

我们下次不见不散!


万字长文!搞懂强化学习的基础知识!》 是转载文章,点击查看原文


相关推荐


从零构建 Vue 弹窗组件
yyt_2026/1/12

整体学习路线:简易弹窗 → 完善基础功能 → 组件内部状态管理 → 父→子传值 → 子→父传值 → 跨组件传值(最终目标) 步骤 1:搭建最基础的弹窗(静态结构,无交互) 目标:实现一个固定显示在页面中的弹窗,包含标题、内容、关闭按钮,掌握 Vue 组件的基本结构。 组件文件:BasicPopup.vue <template> <!-- 弹窗外层容器(遮罩层) --> <div class="popup-mask"> <!-- 弹窗主体 --> <div class="


深入UDP与sk_buff:掌握Linux网络协议栈的核心机制
咸鱼_要_翻身2026/1/3

目录 一、UDP 在网络协议栈中的位置 二、UDP 报文格式(RFC 768) 字段详解 三、UDP 如何解析报文?——定长头部分离机制 1、理解UDP报头 说明 注意事项 2、UDP数据封装流程:(自上而下) 3、UDP数据分用流程:(自下往上) 四、UDP 如何将数据交付给正确的应用进程?——端口分用(Demultiplexing) 工作流程 服务端 vs 客户端 五、UDP 的核心特性 1、无连接(Connectionless) 2、不可靠(Unrelia


iOS开发必备的HTTP网络基础概览
sweet丶2025/12/25

一、从一次HTTP请求说起 以下是一个大体过程,不包含DNS缓存等等细节: sequenceDiagram participant C as 客户端(iOS App) participant D as DNS服务器 participant S as 目标服务器 participant T as TLS/SSL层 Note over C,S: 1. DNS解析阶段 C->>D: 查询域名对应IP D-->>C: 返回IP地址


🚀你以为你在写 React?其实你在“搭一套前端操作系统”
白兰地空瓶2025/12/17

——从 Vite + React 架构出发,对照 Vue,彻底看懂现代前端工程化 👉 “现代前端不是写页面,而是在设计一套「运行在浏览器里的应用架构」。” 一、先说结论:React / Vue 早就不只是“框架”了 很多人学 React / Vue 的路径是这样的: JSX / template → 组件 → 状态 → 路由 → API 请求 ✋ 到此为止 但面试官想听的不是这个。 他们更关心的是: 你知不知道项目是怎么被“跑起来”的 dev / test / production


别让页面 “鬼畜跳”!Google 钦点的 3 个性能指标,治好了我 80% 的用户投诉
PineappleCoder2025/12/9

💥告别卡顿!前端性能优化第一课:Google钦点的三大核心指标,你真的懂吗? 欢迎来到前端性能优化专栏的第一课!在这个“用户体验至上”的时代,一个卡顿、缓慢、乱跳的网站,就像一辆抛锚在高速公路上的跑车,再酷炫也只会让人抓狂。别担心,Google已经为你准备好了一份“体检报告”——核心Web指标(Core Web Vitals) 。 今天,我们就来揭开这份报告的神秘面纱,用最通俗易懂的方式,让你彻底搞懂这三大指标,迈出性能优化的第一步! ✨ LCP(Largest Contentful Pa


用户数据报协议(UDP)详解
CodePracticer2025/11/28

一、传输层协议UDP 1. 理解UDP协议 我们以前说过,0-1023端口号是知名端口号,它们是与指定的协议进行关联的,那么我们如何证明呢? 在指定目录下就可以查找到这些协议的端口号了(/etc/services)。 这里以两个例子来说明情况。 前面我们也说过协议就是一种约定,本质就是结构体。今天我们来正式认识一下UDP协议。 可以看到UDP协议的宽度是32位,源端口号和目的端口号分别占16位,UDP协议的报头是8字节。 前面我们说过,源主机的数据发送给目标主机需要先经历封装在解包的过程,

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2026 XYZ博客