强化学习基本概念

  • 状态(State, S S S :智能体当前所处的环境状态。
  • 动作(Action, A A A :智能体在某个状态下可以采取的决策或行为。
  • 奖励(Reward, R R R :智能体执行某个动作后得到的反馈信号,通常用于衡量该动作的好坏。
  • 策略(Policy, π \pi π :智能体依据当前状态选择下一步动作的行为准则。
  • 价值函数(Value Function, V ( s ) V(s) V(s) :用于评估某个状态的长期收益。
  • 动作-价值函数(Q-Value, Q ( s , a ) Q(s, a) Q(s,a) :用于评估在状态 s s s 下执行动作 a a a 的长期收益。

核心思想

  • 智能体在环境中不断尝试不同的动作,每次行动后,环境会给出一个奖励(reward)。
  • 目标是找到一条最优策略,使智能体在长期内获得的奖励最大化。
  • 通过反复试验(trial and error),智能体学会选择高分的行动,并避免低分的行动。

强化学习的方法

  • 基于值(Value-based)方法

    • 例如 Q-learning,使用 Q-值函数 来评估每个状态-动作对的长期回报,并通过迭代更新 Q 值来找到最优策略。

    • 公式:

      Q ( s , a ) ← Q ( s , a ) + α [ r + γ max ⁡ a ′ Q ( s ′ , a ′ ) − Q ( s , a ) ] Q(s, a) \leftarrow Q(s, a) + \alpha \left[ r + \gamma \max_{a'} Q(s', a') - Q(s, a) \right] Q(s,a)Q(s,a)+α[r+γamaxQ(s,a)Q(s,a)]

    • 其中:

      • α \alpha α 是学习率(learning rate)。
      • γ \gamma γ 是折扣因子(discount factor),衡量长期收益的重要性。
  • 基于策略(Policy-based)方法

    • 例如 REINFORCE 方法,直接优化策略 π ( a ∣ s ) \pi(a|s) π(as) 使其趋向最优。
    • 适用于高维、连续动作空间的问题。
  • 基于 Actor-Critic 方法

    • 结合了 Q-learning(基于值)和 REINFORCE(基于策略)。
    • Actor(执行动作)Critic(评估动作) 两部分组成,实现稳定高效的学习

Q-Learing

概述

Q-Learning 是一种基于值(Value-based)的强化学习算法,属于 无模型(Model-free)离线学习(Off-policy) 方法。

它通过学习 Q 值(Q-value) 来估计某个状态下执行特定动作的长期收益,并利用贪心策略(greedy policy)选择收益最大的动作,从而逐步优化智能体的行为。

核心思想

智能体通过与环境交互,更新状态-动作值(Q 值),最终找到最优策略,使得长期累积奖励最大化。

关键概念

  1. 状态(State, S S S :智能体当前所处的环境状态。

  2. 动作(Action, A A A :智能体在某个状态下可以执行的行为。

  3. 奖励(Reward, R R R :执行动作后环境给出的反馈,用于衡量该动作的好坏。

  4. 状态转移(Transition) :智能体执行某个动作后,环境从当前状态 s s s 变为下一个状态 s ′ s' s

  5. Q 值(Q-value, Q ( s , a ) Q(s, a) Q(s,a)

    • 代表在状态 s s s 下执行动作 a a a 所能获得的长期累积奖励
    • Q 值的更新规则基于 贝尔曼方程(Bellman Equation)

Q-Learning 算法原理

Q-Learning 通过以下 Q 值更新公式 逐步优化 Q 值:

Q ( s , a ) ← Q ( s , a ) + α [ r + γ max ⁡ a ′ Q ( s ′ , a ′ ) − Q ( s , a ) ] Q(s, a) \leftarrow Q(s, a) + \alpha \left[ r + \gamma \max_{a'} Q(s', a') - Q(s, a) \right] Q(s,a)Q(s,a)+α[r+γamaxQ(s,a)Q(s,a)]

其中:

  • Q ( s , a ) Q(s, a) Q(s,a) 是状态 s s s 下执行动作 a a a 的 Q 值。
  • α \alpha α(学习率,learning rate):控制新旧 Q 值的更新比例,取值范围 ( 0 , 1 ] (0,1] (0,1]
  • r r r(即时奖励):执行动作 a a a 后得到的奖励。
  • γ \gamma γ(折扣因子,discount factor):衡量未来奖励的重要性,取值范围 ( 0 , 1 ] (0,1] (0,1]
  • max ⁡ a ′ Q ( s ′ , a ′ ) \max_{a'} Q(s', a') maxaQ(s,a) 是下一个状态 s ′ s' s 可执行的所有动作中Q 值最大的动作。

更新过程

  • 在状态 s s s 选择一个动作 a a a

  • 执行动作 a a a,观察 奖励 r r r下一个状态 s ′ s' s

  • s ′ s' s 不执行新的动作,而是直接选择 Q 值最大的动作(贪婪策略),即:

    Q target = r + γ max ⁡ a ′ Q ( s ′ , a ′ ) Q_{\text{target}} = r + \gamma \max_{a'} Q(s', a') Qtarget=r+γamaxQ(s,a)

  • 使用 TD(时序差分)误差 更新 Q 值:

    Q ( s , a ) ← Q ( s , a ) + α ( Q target − Q ( s , a ) ) Q(s, a) \leftarrow Q(s, a) + \alpha \left( Q_{\text{target}} - Q(s, a) \right) Q(s,a)Q(s,a)+α(QtargetQ(s,a))

算法拆解

目标 Q 值(Target Q-value)

r + γ max ⁡ a ′ Q ( s ′ , a ′ ) r + \gamma \max_{a'} Q(s', a') r+γamaxQ(s,a)

  • 其中 r r r即时奖励(reward),表示当前执行动作 a a a 后立即获得的奖励。
  • γ max ⁡ a ′ Q ( s ′ , a ′ ) \gamma \max_{a'} Q(s', a') γmaxaQ(s,a) 代表下一个状态 s ′ s' s 所能获得的最大未来回报,即长期收益

当前 Q 值(Current Q-value)

Q ( s , a ) Q(s, a) Q(s,a)

Q 值更新的误差项

δ = r + γ max ⁡ a ′ Q ( s ′ , a ′ ) − Q ( s , a ) \delta = r + \gamma \max_{a'} Q(s', a') - Q(s, a) δ=r+γamaxQ(s,a)Q(s,a)

  • 这个部分被称为TD 误差(Temporal Difference Error) ,它衡量的是当前 Q 值目标 Q 值之间的差距。
  • 如果当前 Q 值低于目标 Q 值,意味着需要增加 Q 值;
  • 如果当前 Q 值高于目标 Q 值,意味着需要减少 Q 值。

更新方式(梯度下降方向)

Q ( s , a ) ← Q ( s , a ) + α δ Q(s, a) \leftarrow Q(s, a) + \alpha \delta Q(s,a)Q(s,a)+αδ

  • 其中 α \alpha α 是学习率(learning rate),控制更新的幅度。

    如果 Q ( s , a ) Q(s, a) Q(s,a) 过低(低估了未来回报),则误差项为正数,更新后 Q 值增加:

    Q ( s , a ) ← Q ( s , a ) + α ⋅ 正误差 Q(s, a) \leftarrow Q(s, a) + \alpha \cdot \text{正误差} Q(s,a)Q(s,a)+α正误差

    如果 Q ( s , a ) Q(s, a) Q(s,a) 过高(高估了未来回报),则误差项为负数,更新后 Q 值减少:

    Q ( s , a ) ← Q ( s , a ) − α ⋅ 负误差 Q(s, a) \leftarrow Q(s, a) - \alpha \cdot \text{负误差} Q(s,a)Q(s,a)α负误差

重要技巧

1. ϵ \epsilon ϵ -贪心策略(**** ϵ \epsilon ϵ -Greedy Policy)
  • 纯粹使用贪心策略(总是选 Q 值最大的动作)可能导致智能体陷入局部最优解。

  • 采用 ϵ \epsilon ϵ-贪心策略,在学习过程中保留一定的探索性:

    以概率 1 − ϵ 1 - \epsilon 1ϵ 选择当前 Q 值最大的动作(利用 Exploitation)

    a = arg ⁡ max ⁡ a Q ( s , a ) a = \arg\max_{a} Q(s, a) a=argamaxQ(s,a)

    以概率 ϵ \epsilon ϵ 选择随机动作(探索 Exploration)

    a = random action a = \text{random action} a=random action

    其中, ϵ \epsilon ϵ(探索率)是一个超参数,控制探索和利用的比例:

    • ϵ \epsilon ϵ 较大(如 0.5) :更多探索(适合初始阶段)。
    • ϵ \epsilon ϵ 较小(如 0.01) :更多利用(适合收敛后)。
    • 以概率 ϵ \epsilon ϵ 选择随机动作(探索)。
    • 以概率 1 − ϵ 1 - \epsilon 1ϵ 选择当前最优动作(利用)。
  • ϵ \epsilon ϵ(探索率)是一个超参数,控制探索和利用的比例:

    • ϵ \epsilon ϵ 较大(如 0.5) :更多探索(适合初始阶段)。
    • ϵ \epsilon ϵ 较小(如 0.01) :更多利用(适合收敛后)。
2. 学习率 α \alpha α
  • 控制 Q 值更新的步长。
  • 过大可能导致震荡,过小可能收敛太慢。
3. 折扣因子 γ \gamma γ
  • 反映未来奖励的重要性:

    • γ \gamma γ 近 0:关注短期奖励(贪心)。
    • γ \gamma γ 近 1:关注长期收益。

Q-Learning具体算法流程

假设智能体在一个迷宫里,需要找到一条最短路径从起点走到终点。

初始化

  • 创建 Q 表

    • Q 表的行:所有可能的状态 s s s(比如迷宫中的所有位置)
    • Q 表的列:所有可能的动作 a a a(比如上下左右移动)
    • 初始值设为 0(表示一开始不知道哪个动作更好)
  • 设置超参数

    • 学习率 α \alpha α):控制学习速度(一般 0.1~0.5)
    • 折扣因子 γ \gamma γ):控制对未来奖励的关注度(一般 0.9~0.99)
    • 探索率 ϵ \epsilon ϵ):决定是否探索新动作(一般从 1 开始,逐渐减少)

智能体开始游戏,重复以下步骤

  1. 观察当前状态 s t s_t st(比如迷宫里的位置)。

  2. 选择一个动作 a t a_t at

    • 探索(Exploration) :有一定概率( ϵ \epsilon ϵ)随机选一个动作,尝试新路线。
    • 利用(Exploitation) :有一定概率( 1 − ϵ 1 - \epsilon 1ϵ)选择 Q 表中当前状态最优的动作(即 Q 值最大的)。
  3. 执行动作 a t a_t at ,获得奖励 r t r_t rt ,进入新状态 s t + 1 s_{t+1} st+1

    • 如果走了一步离终点更近,给正奖励(比如 +10)。
    • 如果撞墙,给负奖励(比如 -10)。
    • 其他情况给小的负奖励(比如 -1),鼓励智能体尽快找到出口。
  4. 更新 Q 值(Q-Learning 关键公式)

    Q ( s t , a t ) ← Q ( s t , a t ) + α ( r t + γ max ⁡ a Q ( s t + 1 , a ) − Q ( s t , a t ) ) Q(s_t, a_t) \leftarrow Q(s_t, a_t) + \alpha \left( r_t + \gamma \max_{a} Q(s_{t+1}, a) - Q(s_t, a_t) \right) Q(st,at)Q(st,at)+α(rt+γamaxQ(st+1,a)Q(st,at))

    • Q ( s t , a t ) Q(s_t, a_t) Q(st,at) 是当前状态下选定动作的 Q 值
    • r t r_t rt 是当前奖励
    • γ max ⁡ a Q ( s t + 1 , a ) \gamma \max_{a} Q(s_{t+1}, a) γmaxaQ(st+1,a) 是下一步能获得的最大价值
    • 意思是:让 Q 值向“实际奖励 + 未来可能的最大奖励”靠拢
  5. 减小探索率 ϵ \epsilon ϵ(逐渐减少随机探索,更多依赖 Q 表)。

  6. 进入下一个状态 s t + 1 s_{t+1} st+1 ,重复以上步骤,直到游戏结束。


什么时候结束?

  • 经过大量训练后,Q 表会收敛(不再剧烈变化)。
  • 这时,智能体就学会了最优策略,可以用 Q 表直接决策。

Sarsa(State-Action-Reward-State-Action, 在线更新)

Sarsa 是 同策略(on-policy) 方法,更新公式如下:

Q ( s , a ) ← Q ( s , a ) + α [ r + γ Q ( s ′ , a ′ ) − Q ( s , a ) ] Q(s, a) \leftarrow Q(s, a) + \alpha \left[ r + \gamma Q(s', a') - Q(s, a) \right] Q(s,a)Q(s,a)+α[r+γQ(s,a)Q(s,a)]

其中:

  • s s s :当前状态
  • a a a :当前动作
  • r r r :执行动作后获得的奖励
  • s ′ s' s :下一状态
  • a ′ a' a :下一状态下根据当前策略选取的动作
  • α \alpha α :学习率
  • γ \gamma γ :折扣因子

Sarsa 更新过程

  1. 选择动作 : 在当前状态 s s s 下,使用 ϵ-贪婪策略选择一个动作 a a a

  2. 执行动作 a a a,观察 奖励 r r r下一个状态 s ′ s' s

  3. 下一个状态 s ′ s' s 选择下一个动作 a ′ a' a(仍然按照 ϵ-贪婪策略 选择)。

  4. 使用 新的状态和动作值 更新 Q 值:

    Q target = r + γ Q ( s ′ , a ′ ) Q_{\text{target}} = r + \gamma Q(s', a') Qtarget=r+γQ(s,a)

  5. 更新 Q 值:

    Q ( s , a ) ← Q ( s , a ) + α ( Q target − Q ( s , a ) ) Q(s, a) \leftarrow Q(s, a) + \alpha \left( Q_{\text{target}} - Q(s, a) \right) Q(s,a)Q(s,a)+α(QtargetQ(s,a))

Sarsa具体算法流程

假设智能体在一个迷宫里,需要找到一条最短路径从起点走到终点。

初始化

  • 创建 Q 表

    • 行:所有可能的状态 s s s(比如迷宫里的所有位置)。
    • 列:所有可能的动作 a a a(比如“上下左右移动”)。
    • 初始值设为 0(表示一开始不知道哪个动作更好)。
  • 设置超参数

    • 学习率 α \alpha α):控制学习速度(一般 0.1~0.5)。
    • 折扣因子 γ \gamma γ):控制对未来奖励的关注度(一般 0.9~0.99)。
    • 探索率 ϵ \epsilon ϵ):决定是否探索新动作(一般从 1 开始,逐渐减少)。

智能体开始游戏,重复以下步骤

  1. 观察当前状态 s t s_t st(比如迷宫里的位置)。

  2. 按照当前策略选择一个动作 a t a_t at

    • 探索(Exploration) :有一定概率( ϵ \epsilon ϵ)随机选一个动作,尝试新路线。
    • 利用(Exploitation) :有一定概率( 1 − ϵ 1 - \epsilon 1ϵ)选择当前状态 Q 表中最优的动作。
  3. 执行动作 a t a_t at ,获得奖励 r t r_t rt ,进入新状态 s t + 1 s_{t+1} st+1

  4. 在新状态 s t + 1 s_{t+1} st+1 再选择下一个动作 a t + 1 a_{t+1} at+1

    • 这个动作不是假设的最优动作,而是按照当前策略选的(可能是探索或利用)!
  5. 更新 Q 值(Sarsa 关键公式)

    Q ( s t , a t ) ← Q ( s t , a t ) + α ( r t + γ Q ( s t + 1 , a t + 1 ) − Q ( s t , a t ) ) Q(s_t, a_t) \leftarrow Q(s_t, a_t) + \alpha \left( r_t + \gamma Q(s_{t+1}, a_{t+1}) - Q(s_t, a_t) \right) Q(st,at)Q(st,at)+α(rt+γQ(st+1,at+1)Q(st,at))

    • Q ( s t , a t ) Q(s_t, a_t) Q(st,at) 是当前状态下选定动作的 Q 值。
    • r t r_t rt 是当前奖励。
    • Q ( s t + 1 , a t + 1 ) Q(s_{t+1}, a_{t+1}) Q(st+1,at+1)按照策略真实执行的下一个动作的 Q 值(和 Q-Learning 不同,Q-Learning 这里用的是最大 Q 值)。
    • 意思是:让 Q 值向“实际奖励 + 未来真实策略下的奖励”靠拢。
  6. 进入下一个状态 s t + 1 s_{t+1} st+1 ,重复以上步骤,直到游戏结束。


什么时候结束?

  • 经过多次训练后,Q 表会收敛(不再剧烈变化)。
  • 这时,智能体就学会了稳定的最优策略,可以用 Q 表直接决策。

Sarsa 特点

  • 使用实际选择的动作 a ′ a' a 来更新,不使用贪婪策略,因此是 同策略(on-policy)
  • 由于遵循当前策略,学习过程更 稳定,但可能 收敛较慢
  • 更倾向于“保守”策略,避免极端情况(如陷阱)。

Q-Learning vs. Sarsa 区别总结

Q-Learning Sarsa
策略 异策略(off-policy) 同策略(on-policy)
下一步动作选择 采用贪婪策略选择最大Q值的动作(不一定是执行的动作) 采用当前策略选择的动作
学习特点 更新速度快,容易找到最优策略,但可能较不稳定 学习速度较慢,但策略更稳定,适合高风险环境
适合场景 适用于探索较多、风险较低的场景 适用于高风险、需更稳健决策的环境
数学公式 Q ( s , a ) ← Q ( s , a ) + α [ r + γ max ⁡ a ′ Q ( s ′ , a ′ ) − Q ( s , a ) ] Q(s, a) \leftarrow Q(s, a) + \alpha \left[ r + \gamma \max_{a'} Q(s', a') - Q(s, a) \right] Q(s,a)Q(s,a)+α[r+γmaxaQ(s,a)Q(s,a)] Q ( s , a ) ← Q ( s , a ) + α [ r + γ Q ( s ′ , a ′ ) − Q ( s , a ) ] Q(s, a) \leftarrow Q(s, a) + \alpha \left[ r + \gamma Q(s', a') - Q(s, a) \right] Q(s,a)Q(s,a)+α[r+γQ(s,a)Q(s,a)]

Sarsa(λ) 算法(Eligibility Traces)

【莫烦PYTHON 强化学习】 3 Sarsa - 知乎

Sarsa(λ) 是 Sarsa 算法的改进版本,它结合了 时间差分学习(TD Learning)资格迹(Eligibility Traces) ,用于 加快学习速度,特别是在稀疏奖励环境中效果更好。

资格迹(Eligibility Traces)

核心思想

  • 在标准的 Sarsa 中,只更新当前状态-动作对的 Q 值,但 Sarsa(λ) 通过 资格迹 让之前访问过的状态也能更新 Q 值,使得信息传播更快。
  • 资格迹用于记录每个状态-动作对的重要性,类似“记忆衰减”的概念。

资格迹的计算

每个状态-动作对 ( s , a ) (s, a) (s,a) 维护一个 资格迹值 E ( s , a ) E(s, a) E(s,a),当执行 ( s t , a t ) (s_t, a_t) (st,at) 时:

E ( s t , a t ) ← 1 + γ λ E ( s t − 1 , a t − 1 ) E(s_t, a_t) \leftarrow 1 + \gamma \lambda E(s_{t-1}, a_{t-1}) E(st,at)1+γλE(st1,at1)

其中:

  • λ \lambda λ(lambda)是衰减因子,控制过去状态的重要性。
  • γ \gamma γ 是折扣因子,衡量未来奖励的重要性。
  • E ( s t − 1 , a t − 1 ) E(s_{t-1}, a_{t-1}) E(st1,at1):资格迹值,代表过去状态-动作对的更新重要性。

Sarsa(λ) 与 λ 值的影响

  • Sarsa(0) :λ = 0,仅更新最近的一步(TD(0))。
  • Sarsa(1) :λ = 1,直到回合结束后再进行更新(蒙特卡洛方法)。
  • Sarsa(λ) 0 0 0 < λ < λ <λ < 1 < 1 <1,结合短期和长期信息,加快收敛速度。取值越大, 离宝藏越近的步更新力度越大

Sarsa(λ) 更新公式

Sarsa(λ) 的 Q 值更新公式:

Q ( s , a ) ← Q ( s , a ) + α δ E ( s , a ) Q(s, a) \leftarrow Q(s, a) + \alpha \delta E(s, a) Q(s,a)Q(s,a)+αδE(s,a)

其中:

  • TD 误差(Temporal Difference Error):

    δ = r + γ Q ( s ′ , a ′ ) − Q ( s , a ) \delta = r + \gamma Q(s', a') - Q(s, a) δ=r+γQ(s,a)Q(s,a)

  • 资格迹更新

    E ( s , a ) ← γ λ E ( s , a ) E(s, a) \leftarrow \gamma \lambda E(s, a) E(s,a)γλE(s,a)

  • 更高效的资格迹更新

    self.eligibility_trace.loc[s, :] *= 0  # 先将该状态的资格迹清零
    self.eligibility_trace.loc[s, a] = 1  # 只对当前执行的动作置 1
    

    好处

    • 减少累积误差:每次新访问状态 (s, a),都直接把资格迹设为 1,而不是累加,避免历史误差。
    • 提高计算稳定性:对于 Sarsa(λ),资格迹的影响应该是随着 λ 的衰减而传播的,而不是一直累积。

Sarsa(λ) 具体流程

假设智能体在一个迷宫里,需要找到最短路径从起点走到终点。

初始化

  • 创建 Q 表

    • 行:所有可能的状态 s s s(比如迷宫里的所有位置)。
    • 列:所有可能的动作 a a a(比如“上下左右移动”)。
    • 初始值设为 0(表示一开始不知道哪个动作更好)。
  • 创建“资格迹”表(Eligibility Traces):

    • 和 Q 表大小相同,记录每个状态-动作对的“记忆值” ,初始设为 0。
  • 设置超参数

    • 学习率 α \alpha α):控制学习速度(一般 0.1~0.5)。
    • 折扣因子 γ \gamma γ):控制对未来奖励的关注度(一般 0.9~0.99)。
    • 探索率 ϵ \epsilon ϵ):决定是否探索新动作(一般从 1 开始,逐渐减少)。
    • 资格迹衰减率 λ \lambda λ):控制记忆的长短(一般 0.7~0.9,值越大记忆越久)。

智能体开始游戏,重复以下步骤

  1. 观察当前状态 s t s_t st(比如迷宫里的位置)。

  2. 按照当前策略选择一个动作 a t a_t at

    • 探索(Exploration) :有一定概率( ϵ \epsilon ϵ)随机选一个动作,尝试新路线。
    • 利用(Exploitation) :有一定概率( 1 − ϵ 1 - \epsilon 1ϵ)选择当前状态 Q 表中最优的动作。
  3. 执行动作 a t a_t at ,获得奖励 r t r_t rt ,进入新状态 s t + 1 s_{t+1} st+1

  4. 在新状态 s t + 1 s_{t+1} st+1 再选择下一个动作 a t + 1 a_{t+1} at+1(按当前策略选)。

  5. 计算 TD 误差(时间差分误差)

    δ = r t + γ Q ( s t + 1 , a t + 1 ) − Q ( s t , a t ) \delta = r_t + \gamma Q(s_{t+1}, a_{t+1}) - Q(s_t, a_t) δ=rt+γQ(st+1,at+1)Q(st,at)

    • 这个值表示当前 Q 值与实际奖励的误差。
  6. 更新“资格迹”表

    e ( s t , a t ) ← e ( s t , a t ) + 1 e(s_t, a_t) \leftarrow e(s_t, a_t) + 1 e(st,at)e(st,at)+1

  • 当前执行的状态-动作对“记忆值”增加(相当于标记最近走过的路径)。
  1. 对所有状态-动作对,按照资格迹更新 Q 值

    Q ( s , a ) ← Q ( s , a ) + α δ e ( s , a ) Q(s, a) \leftarrow Q(s, a) + \alpha \delta e(s, a) Q(s,a)Q(s,a)+αδe(s,a)

  • 资格迹值越大,影响越大,表示这个状态-动作对在最近的路径中起到了更大作用。
  1. 衰减资格迹值

    e ( s , a ) ← γ λ e ( s , a ) e(s, a) \leftarrow \gamma \lambda e(s, a) e(s,a)γλe(s,a)

  • 记忆随着时间推移会逐渐减弱,保证最新的经验影响最大。
  1. 进入下一个状态 s t + 1 s_{t+1} st+1 ,重复以上步骤,直到游戏结束。

什么时候结束?

  • 经过大量训练后,Q 表会收敛(不再剧烈变化)。
  • 这时,智能体就学会了最优策略,可以用 Q 表直接决策。

Sarsa vs Sarsa(λ) vs Q-Learning

Q-Learning Sarsa Sarsa(λ)
学习策略 贪心,假设未来总是选最优动作 谨慎,按实际策略更新 谨慎 + 记忆多步经验
Q 值更新 只更新当前状态和下一步的最大 Q 值 只更新当前状态和下一步的实际 Q 值 更新当前状态 + 过去多步经验
记忆能力 没有记忆,只考虑当前 只记住最近一步 能记住多步经验,更快收敛
适用场景 适合离线学习,比如游戏 AI 适合在线学习,比如机器人导航 适合复杂环境,比如动态规划问题

神经网络

神经网络(Neural Network, NN) 是一种 模拟人脑神经元结构 的数学模型,它可以通过训练 自动学习数据中的模式,并用于分类、回归、图像识别、自然语言处理等任务。

神经网络的基本结构

一个典型的 人工神经网络(Artificial Neural Network, ANN)输入层、隐藏层、输出层 组成:

输入层 → 隐藏层(多个) → 输出层

输入层(Input Layer)

  • 负责接收外部数据,每个神经元代表一个特征(如图片的像素值)。
  • 例如,在手写数字识别任务中,输入层的神经元数等于图像的像素数(如 28×28 = 784 个神经元)。

隐藏层(Hidden Layers)

  • 连接方式: 隐藏层与输入层、输出层之间通过 全连接 进行信息传递。每个神经元都与前一层的每个神经元相连。

  • 负责提取特征和学习数据的复杂映射关系

  • 作用

    • 增加非线性能力:隐藏层通过激活函数(ReLU、Sigmoid、Tanh) 引入非线性,使网络能学习复杂的模式。

    • 提取特征:隐藏层的神经元能自动学习数据的特征表示,从简单到复杂逐级提取信息。

      隐藏层提取的是从原始数据到最终决策过程中,不同层级的关键信息

      任务 低层特征 中层特征 高层特征
      图像分类 边缘、纹理 局部形状 物体类别
      NLP(文本理解) 词向量、语法 句子结构 语义信息
      自动驾驶 车辆状态 场景模式 路径规划
      金融预测 K 线趋势 交易量变化 买卖策略

      隐藏层的作用: 让神经网络逐步从“数据”学习到“知识”! 🚀

    • 提高表达能力:多层隐藏层组成的深度神经网络(DNN) 可以逼近任何复杂函数(通用逼近定理

  • 多个神经元(Neuron)组成,每个神经元都与上一层所有神经元全连接(Fully Connected)

    一个简单的三层神经网络

    输入层 (Input)   →   隐藏层 (Hidden Layer)   →   输出层 (Output)
         X1   ───┐      H1     ───┐     Y1
         X2   ───┼──▶   H2     ───┼──▶  Y2
         X3   ───┘      H3     ───┘     Y3
    
    • 输入层(X1, X2, X3):接收原始数据。
    • 隐藏层(H1, H2, H3):通过权重(W)和激活函数计算特征。
    • 输出层(Y1, Y2, Y3):输出最终的预测结果。
  • 每个神经元 通过 加权求和 + 激活函数 计算输出:

    h = f ( W x + b ) h = f(Wx + b) h=f(Wx+b)

    其中:

    • x x x 是输入数据
    • W W W 是权重(Weight)
    • b b b 是偏置(Bias)
    • f f f 是激活函数(如 ReLU、Sigmoid)
    • h h h:隐藏层输出(提取的特征)

    隐藏层不断调整权重 W W W偏置 b b b,使得神经网络能提取数据中的关键特征

隐藏层与卷积层、池化层、全连接层的关系

在深度神经网络中,“隐藏层”是一个总称,指的是除了输入层和输出层以外的所有层。卷积层、池化层和全连接层 都可以视为不同形式的隐藏层,它们分别执行不同类型的计算任务:

  • 卷积层 主要负责提取输入数据的局部特征

  • 池化层 用来减少数据的维度提高计算效率,同时增强模型的平移不变性

  • 全连接层 负责将卷积和池化层提取的特征整合并进行最终的决策。

  • 隐藏层 是网络中所有中间层的总称,包括卷积层、池化层和全连接层等。

卷积层(Convolutional Layer)
  • 作用: 卷积层通过卷积核(Filter)对输入数据进行卷积操作,提取局部特征(如图像中的边缘、纹理)。卷积层具有局部连接权重共享的特点,能够减少参数数量,提高计算效率。

  • 计算过程:

    • 输入:接受来自上一层(通常是输入层或另一卷积层)的数据。
    • 输出:生成一个新的特征图(feature map),表示输入数据的特定特征。
    • 卷积操作是通过滑动卷积核对输入图像进行局部加权求和。
    • 每个卷积核负责提取一种特定的特征(如图像中的某个边缘),并生成相应的特征图(Feature Map)。
  • 位置: 卷积层一般位于神经网络的前面,尤其是在卷积神经网络(CNN)中,通常用于输入数据的特征提取。它在神经网络的 前几层 负责提取低级特征(如边缘、角点、纹理),并随着层次的增加提取更高级的特征。

  • 公式:

    输出高度 = ( 输入高度 − 卷积核高度 + 2 × 填充 ) 步长 + 1 \text{输出高度} = \frac{(\text{输入高度} - \text{卷积核高度} + 2 \times \text{填充})}{\text{步长}} + 1 输出高度=步长(输入高度卷积核高度+2×填充)+1

    输出宽度 = ( 输入宽度 − 卷积核宽度 + 2 × 填充 ) 步长 + 1 \text{输出宽度} = \frac{(\text{输入宽度} - \text{卷积核宽度} + 2 \times \text{填充})}{\text{步长}} + 1 输出宽度=步长(输入宽度卷积核宽度+2×填充)+1

    输出深度 = 卷积核数量 \text{输出深度} = \text{卷积核数量} 输出深度=卷积核数量

    参数说明:

    • 输入高度和宽度:输入图像的尺寸(例如 H × W H \times W H×W)。

    • 卷积核高度和宽度:卷积核的尺寸(例如 3 × 3 3 \times 3 3×3 5 × 5 5 \times 5 5×5)。

    • 步长(stride) :卷积核每次滑动的步数(通常为 1 或 2)。

    • 填充(padding)

      • 无填充(Valid Padding) :即没有额外的填充,填充为 0。
      • 填充(Same Padding) :使得输出尺寸与输入尺寸相同,填充足够的 0。
    • 输出深度:卷积核的数量,通常代表输出特征图的通道数。

    • 举例:

      • 输入图像: 32 × 32 × 3 32 \times 32 \times 3 32×32×3
      • 卷积核: 5 × 5 × 3 5 \times 5 \times 3 5×5×3,步长 1 1 1,无填充
      • 输出特征图尺寸: ( 32 − 5 ) / 1 + 1 = 28 (32-5)/1 + 1 = 28 (325)/1+1=28
池化层(Pooling Layer)
  • 功能:池化层通过对卷积层的输出特征图进行下采样,减少空间维度,降低计算量,避免过拟合,并提高模型的平移不变性。

  • 输入:池化层的输入通常来自卷积层的输出特征图。

  • 输出:池化层输出的特征图尺寸较小,但保留了最重要的特征信息。

  • 两种常见池化方式:

    • 最大池化(Max Pooling) :选取窗口内最大值,如 2 × 2 2 \times 2 2×2 窗口,步长 2。

      • 优点:最大池化能有效保留特征图中的关键细节信息。

      • 使用 2 × 2 2 \times 2 2×2 的最大池化窗口,步长为 2:

        窗口 1: [1, 3]
                 [5, 6] → 最大值为 6
        
        窗口 2: [2, 4]
                 [7, 8] → 最大值为 8
        
        窗口 3: [9, 0]
                 [4, 5] → 最大值为 9
        
        窗口 4: [1, 2]
                 [3, 0] → 最大值为 3
        

        池化后的输出:

        [6, 8]
        [9, 3]
        
    • 平均池化(Average Pooling) :计算窗口内均值,适用于平滑特征。

      • 优点:适合保留更平滑的特征,减少噪声影响。

      • 例子:使用同样的输入特征图,应用 2 × 2 2 \times 2 2×2 平均池化,步长为 2:

        窗口 1: [1, 3]
                 [5, 6] → 平均值为 (1+3+5+6)/4 = 3.75
        
        窗口 2: [2, 4]
                 [7, 8] → 平均值为 (2+4+7+8)/4 = 5.25
        
        窗口 3: [9, 0]
                 [4, 5] → 平均值为 (9+0+4+5)/4 = 4.5
        
        窗口 4: [1, 2]
                 [3, 0] → 平均值为 (1+2+3+0)/4 = 1.5
        

        池化后的输出:

        [3.75, 5.25]
        [4.5, 1.5]
        
    • 公式:

      输出高度 = ( 输入高度 − 池化窗口高度 ) 步长 + 1 \text{输出高度} = \frac{(\text{输入高度} - \text{池化窗口高度})}{\text{步长}} + 1 输出高度=步长(输入高度池化窗口高度)+1

      输出宽度 = ( 输入宽度 − 池化窗口宽度 ) 步长 + 1 \text{输出宽度} = \frac{(\text{输入宽度} - \text{池化窗口宽度})}{\text{步长}} + 1 输出宽度=步长(输入宽度池化窗口宽度)+1

      输出深度 = 输入深度 ( 因为池化层只在空间维度下进行操作 ) \text{输出深度} = \text{输入深度} \quad (\text{因为池化层只在空间维度下进行操作}) 输出深度=输入深度(因为池化层只在空间维度下进行操作)

      示例:

      假设输入尺寸为 28 × 28 × 16 28 \times 28 \times 16 28×28×16,池化窗口大小为 2 × 2 2 \times 2 2×2,步长为 2:

      输出高度 = ( 28 − 2 ) 2 + 1 = 14 \text{输出高度} = \frac{(28 - 2)}{2} + 1 = 14 输出高度=2(282)+1=14

      输出宽度 = ( 28 − 2 ) 2 + 1 = 14 \text{输出宽度} = \frac{(28 - 2)}{2} + 1 = 14 输出宽度=2(282)+1=14

      输出深度 = 16 ( 池化层不改变深度 ) \text{输出深度} = 16 \quad (\text{池化层不改变深度}) 输出深度=16(池化层不改变深度)

      因此,池化层的输出尺寸为 14 × 14 × 16 14 \times 14 \times 16 14×14×16

全连接层(Fully Connected Layer
  • 作用: 全连接层是网络的最后一部分,通常用于将前面卷积层提取到的特征映射到最终的输出结果(例如分类概率或回归值)。它通过 加权和 + 激活函数 将所有输入特征映射到输出。
  • 连接方式: 在全连接层中,输入的每一个神经元都与该层中的每一个神经元相连接,形成一个完全连接的网络。全连接层的神经元对前一层所有神经元的输出进行加权求和。
  • 位置:卷积神经网络(CNN) 中,全连接层通常位于卷积层之后。卷积层提取图像的低级特征,池化层减少维度,然后通过全连接层进行最终的决策。
  • 输入:全连接层的输入来自前一层(通常是卷积层或池化层)的输出,需要将其展平(flatten)成一维向量。
  • 输出:通过激活函数(如 Softmax)将特征映射到最终的类别或预测值。

输出层(Output Layer)

  • 负责输出最终结果(如分类结果或预测值)。

  • 神经元个数 取决于任务类型:

    • 回归任务:一个神经元(预测一个连续值)。
    • 分类任务:类别数个神经元(使用 Softmax 激活函数)。

神经网络的核心原理

神经网络的核心是 前向传播(Forward Propagation)反向传播(Backpropagation)

  • 前向传播(Forward Propagation)——计算预测结果
  • 反向传播(Backward Propagation)——调整参数,使误差最小

通俗理解

想象你是一个厨师,正在尝试做一碗汤。你的目标是做出最好喝的汤,但你还不知道正确的配方,所以你需要不断尝试和调整

  • 前向传播:你先按照某个配方(当前的参数)放入食材,煮出一碗汤(计算预测值)。
  • 计算误差:你尝了一口汤(计算损失函数),发现味道和理想的味道有些偏差(计算误差)。
  • 反向传播:你分析问题,调整调料比例(更新神经网络的参数)。
  • 重复训练:不断尝试、调整,直到汤的味道最接近你的理想味道(损失最小)。

前向传播

前向传播的主要作用是计算神经网络的输出

作用:

  1. 让数据从输入层经过隐藏层传递到输出层。

  2. 通过激活函数引入非线性,学习复杂数据模式。

    非线性变换的作用

    • 引入复杂关系(如分类任务中的曲面决策边界)。
    • 提高神经网络的表达能力(能拟合更复杂的函数)。
    • 避免整个神经网络退化为简单的线性回归
  3. 计算输出结果,与真实值进行比较,计算误差(损失)。

基本步骤
  1. 输入层 :输入数据 x x x
  2. 隐藏层:通过权重 W W W 和激活函数计算输出
  3. 输出层:计算最终的预测结果

数学步骤

  1. 每一层的神经元 计算加权和:

    z = W ⋅ x + b z = W \cdot x + b z=Wx+b

    其中:

    • x x x 是上一层的输出(输入层的 x x x 是原始数据)。
    • W W W 是权重(Weight)。
    • b b b 是偏置(Bias)。
  2. 激活函数(非线性变换)

    a = f ( z ) a = f(z) a=f(z)

    其中 f ( z ) f(z) f(z) 是激活函数(如 ReLU、Sigmoid、Tanh)。

  3. 输出层 给出最终的结果

计算损失

使用 损失函数(Loss Function) 计算预测值与真实值的误差

任务类型 损失函数 适用情况
回归 MSE(均方误差) 误差较小但需要平方放大
回归 MAE(平均绝对误差) 误差较大、对异常值鲁棒
分类 交叉熵(Cross-Entropy) 多分类问题
概率匹配 KL 散度 计算概率分布的差异
  • 均方误差(MSE) (回归任务)

    回归任务是预测连续数值,如房价、气温等。

    MSE 计算预测值与真实值的平方误差的均值,表达式如下:

    M S E = 1 n ∑ i = 1 n ( y i − y ^ i ) 2 MSE = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2 MSE=n1i=1n(yiy^i)2

    • y i y_i yi 是真实值
    • y ^ i \hat{y}_i y^i 是预测值
    • n n n 是样本数

    特点

    ✅ 适用于误差较小且稳定的情况
    ✅ 对较大误差敏感(因为平方放大了误差)

    import torch.nn as nn
    
    mse_loss = nn.MSELoss()
    y_true = torch.tensor([3.0, 5.0, 7.0])
    y_pred = torch.tensor([2.5, 5.5, 6.5])
    loss = mse_loss(y_pred, y_true)
    print(loss.item())  # 输出 MSE 值
    
  • 交叉熵损失(Cross-Entropy) (分类任务)

    分类任务是预测离散类别,如识别猫狗、垃圾邮件检测等。

    用于多分类问题,计算预测类别概率分布与真实分布的相似度:

    L = − ∑ i = 1 n y i log ⁡ ( y ^ i ) L = -\sum_{i=1}^{n} y_i \log(\hat{y}_i) L=i=1nyilog(y^i)

    • y i y_i yi 是真实标签(One-hot 编码)
    • y ^ i \hat{y}_i y^i 是预测概率

    特点

    ✅ 适用于分类问题(如猫、狗、鸟)
    ✅ 结合 Softmax,将输出转换成概率

反向传播(Backpropagation)

反向传播(Backpropagation, BP) 是神经网络的训练过程,它的作用是计算误差对每个参数的影响,并调整参数,使误差变小

目标

让神经网络不断调整参数,使误差最小!
核心方法是 梯度下降(Gradient Descent) ,计算每个参数的梯度,并朝着降低损失的方向更新它。

  • 通过 链式法则(Chain Rule) 计算每个权重的梯度(导数)。

  • 使用 梯度下降(Gradient Descent)Adam 优化器 进行参数更新。

    梯度下降

    梯度下降通过计算损失函数对参数的梯度,然后沿着梯度的反方向更新参数,使损失最小化。

    更新公式

    W = W − η ⋅ ∂ L o s s ∂ W W = W - \eta \cdot \frac{\partial Loss}{\partial W} W=WηWLoss

    b = b − η ⋅ ∂ L o s s ∂ b b = b - \eta \cdot \frac{\partial Loss}{\partial b} b=bηbLoss

    其中:

    • η \eta η 是学习率(Learning Rate),控制更新步长。
    • ∂ L o s s ∂ W \frac{\partial Loss}{\partial W} WLoss 是权重的梯度。
    • ∂ L o s s ∂ b \frac{\partial Loss}{\partial b} bLoss 是偏置的梯度。

    梯度下降的三种变体

    1. 批量梯度下降(Batch Gradient Descent, BGD)

      • 计算所有样本的平均梯度,然后更新参数。
      • 优点:收敛稳定。
      • 缺点:计算慢,适用于小规模数据。
    2. 随机梯度下降(Stochastic Gradient Descent, SGD)

      • 每次更新使用一个样本
      • 优点:速度快,适用于大数据集。
      • 缺点:参数更新有较大波动。
    3. 小批量梯度下降(Mini-Batch Gradient Descent, MBGD)

      • 每次更新使用一小批样本(如 32 或 64 个)
      • 优点:平衡计算效率和稳定性,实际应用最广泛。

激活函数(Activation Function)

决定了神经元的输出如何传递到下一层

激活函数用于引入非线性,使神经网络可以学习复杂模式。

为什么需要激活函数?

在没有激活函数的情况下,每一层的输出都是上一层的线性变换:

y = W x + b y = W x + b y=Wx+b

多个这样的线性层堆叠仍然是一个线性变换,无法学习复杂的非线性特征。而激活函数可以引入非线性,使得神经网络可以逼近任意复杂的函数加快收敛

为什么输出层不使用激活函数?
  • Q 值可以是正数或负数,使用非线性激活(如 ReLU)会截断负值,影响学习效果。
  • 直接输出 Q 值,使得优化更加稳定。
激活函数 公式 特点 输出
Sigmoid σ ( x ) = 1 1 + e − x \sigma(x) = \frac{1}{1 + e^{-x}} σ(x)=1+ex1 适用于二分类,但易梯度消失 输出范围: ( 0 , 1 ) (0,1) (0,1)
Tanh tanh ⁡ ( x ) = e x − e − x e x + e − x \tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} tanh(x)=ex+exexex 归一化到 (-1,1),但仍可能梯度消失 输出范围: ( − 1 , 1 ) (-1,1) (1,1)
ReLU f ( x ) = max ⁡ ( 0 , x ) f(x) = \max(0, x) f(x)=max(0,x) 计算简单,能缓解梯度消失,常用于深度网络 大于 0 时输出本身,小于 0 时输出 0
Leaky ReLU f ( x ) = x f(x) = x f(x)=x(若 x > 0), 0.01 x 0.01x 0.01x(若 x < 0) 改进 ReLU,允许负值信息通过
Softmax e x i ∑ e x j \frac{e^{x_i}}{\sum e^{x_j}} exjexi 多分类任务的概率输出 所有输出加起来等于 1,表示“概率分布”

神经网络的训练过程

  1. 初始化参数(随机初始化权重 W 和偏置 b)。
  2. 前向传播(计算输出)。
  3. 计算损失(计算误差,如交叉熵)。
  4. 反向传播(计算梯度)。
  5. 更新参数(使用梯度下降算法)。
  6. 重复步骤 2-5,直到收敛

深度神经网络 (Deep Neural Network, DNN)

深度神经网络(DNN)是由 多层神经元 组成的 人工神经网络(ANN) ,用于建模复杂的非线性关系。

深度神经网络的基本结构

DNN 由 输入层(Input Layer)、多个隐藏层(Hidden Layers)和输出层(Output Layer) 组成:

输入层  →  隐藏层  →  隐藏层  →  ... →  隐藏层  →  输出层

输入层

  • 负责接收数据(如图像、文本、传感器数据)。

  • 每个神经元对应一个输入特征,例如:

    • 图像数据:每个像素值作为一个输入特征。
    • 强化学习:状态向量的每个维度作为输入特征。

隐藏层

  • 作用:

    • 低层隐藏层 负责提取基础特征(如边缘、纹理)。
    • 高层隐藏层 负责学习更抽象的概念(如物体、行为模式)。

输出层

  • 计算最终结果:

    • 分类任务:使用 Softmax 计算类别概率。
    • 回归任务:直接输出一个数值。
    • 强化学习(DQN) :输出每个动作的 Q 值。

深度神经网络的计算过程

初始化参数

  • 设定神经网络的结构(输入层、隐藏层、输出层的神经元数量)。

  • 随机初始化每层的权重(Weights)和偏置(Biases) ,确保网络具有一定的初始多样性。

    • 参数 作用 直观解释
      权重(Weight) 调整输入对输出的影响大小 课堂作业占 60%,家庭作业占 40%,决定你的最终成绩
      偏置(Bias) 调整整体输出,使网络更灵活 额外加分,即使作业分低,也能保证一定成绩

      💡 一句话总结
      权重决定输入的影响力,偏置帮助调整整体输出,使模型更加灵活和准确

💡 通俗理解
想象 DNN 是一个“考试系统”,权重就是评分标准,我们最开始不清楚如何评分,所以先随机设置一个标准。

前向传播(Forward Propagation)

前向传播的目标是计算预测值( y pred y_{\text{pred}} ypred),主要包括:

  1. 计算每层的线性变换

    Z = W ⋅ X + B Z = W \cdot X + B Z=WX+B

    其中:

    • X X X 是输入数据(或上一层的输出)。
    • W W W 是权重矩阵。
    • B B B 是偏置项。
  2. 应用激活函数

    • ReLU(用于隐藏层): A = max ⁡ ( 0 , Z ) A = \max(0, Z) A=max(0,Z)
    • Sigmoid / Softmax(用于输出层):将结果转换为概率。

💡 通俗理解
想象我们在烤披萨:

  • 原料(输入数据)经过厨师(神经元)处理,每个厨师都有自己的配方(权重和偏置)。
  • 处理后得到半成品(线性变换)。
  • 最后通过调味(激活函数)让披萨更加美味(可解释性强)。

计算损失(Loss Function)

  • 预测值( y pred y_{\text{pred}} ypred)和真实值( y true y_{\text{true}} ytrue)进行比较,计算误差(损失)。

  • 常见损失函数

    • 均方误差(MSE) :用于回归任务

      L = 1 n ∑ ( y pred − y true ) 2 L = \frac{1}{n} \sum (y_{\text{pred}} - y_{\text{true}})^2 L=n1(ypredytrue)2

    • 交叉熵(Cross Entropy) :用于分类任务

      L = − ∑ y true log ⁡ ( y pred ) L = -\sum y_{\text{true}} \log(y_{\text{pred}}) L=ytruelog(ypred)

💡 通俗理解
相当于“考试批改分数”:

  • 如果预测分数和标准答案差距大,说明误差大,需要修改评分标准(调整权重)。
  • 目标是让误差尽可能小。

反向传播(Backpropagation)

反向传播的目标是通过**梯度下降(Gradient Descent)**调整权重,使预测误差最小化。

  1. 计算损失对权重的梯度(偏导数)

    • 通过链式法则计算每个权重对损失的影响:

      ∂ L ∂ W \frac{\partial L}{\partial W} WL

    • 反向逐层传播,计算每层的梯度。

  2. 更新权重和偏置

    • 使用梯度下降Adam优化器等方法,更新网络参数:

      W = W − α ∂ L ∂ W W = W - \alpha \frac{\partial L}{\partial W} W=WαWL

      B = B − α ∂ L ∂ B B = B - \alpha \frac{\partial L}{\partial B} B=BαBL

    • α \alpha α 是学习率,控制每次更新的步长。

💡 通俗理解
相当于“学生复习”:

  • 发现考试成绩不好(损失较大)。
  • 通过老师(梯度计算)找到哪些知识点薄弱(哪一层的权重导致错误)。
  • 重点复习(更新参数),提高成绩。

重复训练,直到收敛

  • 反复执行前向传播 → 计算损失 → 反向传播 → 更新权重,直到损失函数趋于稳定,达到最优状态。
  • 设定训练轮数(Epochs),比如 1000 次,每次都让网络调整得更好。

💡 通俗理解
就像练习投篮:

  • 一开始投得不准(误差大)。
  • 通过反复练习(训练),不断调整手感(优化权重)。
  • 最终稳定命中目标(收敛)。

卷积神经网络(Convolutional Neural Network, CNN)

卷积神经网络(CNN)是一种专门用于处理 图像数据时空相关数据 的深度学习模型。

它利用 局部感受野权重共享 机制,大幅减少参数数量,提高计算效率,同时保留数据的局部特征。

CNN 的基本结构

CNN 由多个 卷积层、池化层、全连接层 组成,典型结构如下:

输入层 → 卷积层 → ReLU → 池化层 → 卷积层 → ReLU → 池化层 → 全连接层 → 输出层

CNN 的完整算法流程

用一个识别猫和狗的例子来说明 CNN 的工作流程。

输入层(Input Layer):加载图片数据

首先,把一张猫的图片输入到 CNN 中。例如,这是一张 32×32 像素的彩色图片

🐱

因为彩色图片有红(R)、绿(G)、蓝(B)三个通道(Channel),所以输入的数据是一个 32×32×3 的矩阵。


卷积层(Convolutional Layer)

作用: 识别图片中的特征,比如边缘、线条、颜色块等。

计算方法:

  1. CNN 使用 滤波器(卷积核, Kernel) 进行扫描,提取特征。

  2. 例如,使用 3×3 卷积核,在图片上滑动(步长 1),计算新像素值:

    • 计算公式:

      输出 = 输入区域 × 卷积核 + 偏置 输出 = 输入区域 \times 卷积核 + 偏置 输出=输入区域×卷积核+偏置

    • 如果有多个卷积核,可以提取多个特征(比如边缘、纹理等)。

  3. 这样,我们从 32×32×3 的输入图片,得到了一个 30×30×8 的特征图(假设 8 个卷积核)

📌 通俗理解:
想象你用一个小窗口(3×3 的滤波器)去观察猫的图片:

  • 第一个滤波器 只关注边缘(比如猫的耳朵)。
  • 第二个滤波器 可能关注颜色对比(比如猫的毛色)。
  • 第三个滤波器 可能检测曲线(比如猫的胡须)。

最终,我们得到了多个特征图,这些图比原图更有信息量。


激活函数(Activation Function, ReLU)

作用: 增强模型的非线性表达能力,使 CNN 能够学习复杂的特征。

  1. ReLU(Rectified Linear Unit) 是最常用的激活函数:

    f ( x ) = m a x ( 0 , x ) f(x) = max(0, x) f(x)=max(0,x)

  2. 它的作用是把所有 负数变成 0,只保留 正数,让模型更具判别能力。

📌 通俗理解:
假设你的 CNN 学到了一些模糊的、无用的特征(比如背景的噪声),ReLU 就会把它们“关掉”(变成 0),只保留有用的信息(比如猫的形状)。


池化层(Pooling Layer)

作用: 降维,减少计算量,同时保留重要特征。

  1. 采用 最大池化(Max Pooling) ,用 2×2 过滤器,步长为 2。

  2. 只取 2×2 区域中的 最大值,这样图像尺寸缩小了一半:

    • 输入:30×30×8
    • 经过池化后,输出变为 15×15×8

📌 通俗理解:

  • 你拍了一张猫的照片,但不想存 4K 超清版,所以你压缩图片,让它变小,但仍然保留猫的主要轮廓。

  • 例如:

    🐱🐱🐱🐱  → 🐱🐱
    🐱🐱🐱🐱  → 🐱🐱
    

    这样,数据量减少了一半,但关键信息仍然存在。


重复多个卷积层和池化层

为了提取更深层次的特征,我们可以 叠加多层卷积层和池化层

  • 第一层可能提取 边缘
  • 第二层可能提取 眼睛、鼻子
  • 第三层可能识别 完整的猫脸

最终,我们得到一个小尺寸的特征图(如 7×7×16)。


全连接层(Fully Connected Layer, FC)

作用: 把 2D 特征图展开为 1D 向量,然后用于分类。

  1. 把池化后的特征图(7×7×16)展平成一个 1D 向量(长度 784)。

  2. 连接到 隐藏层(Hidden Layer) ,使用 全连接神经元 进行学习。

  3. 使用 Softmax 函数 计算最终分类概率:

    • 猫 🐱:85%
    • 狗 🐶:15%

📌 通俗理解:
想象你在考试,每道题都是关于猫或狗的特征:

  • 这只动物有胡须吗?✅
  • 这只动物有长耳朵吗?❌
  • 这只动物喜欢爬树吗?✅

你回答了所有问题后,神经网络根据你的回答计算出:

  • 85% 可能是猫
  • 15% 可能是狗

最终 CNN 选择 猫!🐱✅


CNN 运行流程总结

步骤 作用 结果
1. 输入层 读取图片(如 32×32×3) 3D 矩阵
2. 卷积层 提取局部特征(边缘、纹理) 30×30×8
3. ReLU 激活 去掉负值,提高非线性能力 30×30×8
4. 池化层 降维,保留重要特征 15×15×8
5. 叠加多个卷积-池化层 提取更高级特征 7×7×16
6. 全连接层 把特征转换成分类 1D 向量
7. Softmax 输出层 计算类别概率 猫 85%,狗 15%

结论

  • CNN 通过 卷积层 提取特征,池化层 降低数据维度,全连接层 进行分类。
  • CNN 的特点是自动学习特征,比传统方法更高效。
  • 适用于 图像分类、目标检测、语音识别等 任务。

DNN 与 CNN 的比较

  • 使用 DNN:当数据是 结构化数据一维数据,如表格数据、金融数据、时间序列数据时,DNN 适合解决传统的回归或分类问题。
  • 使用 CNN:当数据是 图像、视频 等具有 空间或时序结构 的数据时,CNN 是处理这些数据的首选。CNN 能够有效提取局部特征并通过共享权重提升计算效率,广泛应用于计算机视觉、语音识别、NLP 等任务
特性 DNN (深度神经网络) CNN (卷积神经网络)
数据类型 适用于一维数据、结构化数据、表格数据 适用于具有空间结构的数据,如图像、视频
任务 适合回归、分类任务(例如金融、医疗预测) 适合图像分类、物体检测、视频处理、NLP
层结构 全连接层(每个节点与上一层的所有节点相连) 卷积层、池化层和全连接层
局部特征学习 无特殊机制,学习全局特征 通过卷积层自动提取局部特征
计算效率 参数多,计算量大 参数少,计算高效
平移不变性 不具备平移不变性 卷积层通过共享参数具有平移不变性

深度 Q 网络(DQN)

  • DQN(Deep Q-Network)是 强化学习(RL)深度学习(DL) 结合的算法。

  • DQN 解决了传统 Q-learning 的问题,即在高维状态空间中无法存储巨大的 Q 表格。因此,它采用 神经网络 来近似 Q 值,突破了 Q-learning 的局限。

  • 目标: 让智能体学会 在不同的状态下选择最优的动作,以最大化长期奖励。例如,假设你在玩贪吃蛇,DQN 会帮助你学会如何躲避障碍物、吃到更多的食物,并存活更久。

DQN 与 Q-learning 的区别

Q-learning DQN
Q 值存储 Q 表格(查表方式) 深度神经网络(函数逼近)
适用范围 低维状态空间 高维状态空间(如图像)
经验回放 ❌ 没有 ✅ 采用 Replay Buffer
目标 Q 值 ✅ 直接更新 ✅ 采用目标网络防止震荡

DQN 的核心技术

经验回放(Experience Replay)
  • 传统 Q-learning 直接用新数据更新 Q 值,容易受最新样本影响,导致训练不稳定。
  • DQN 采用 Replay Buffer 存储过去经验(状态、动作、奖励、下一状态) ,然后 随机抽样 进行训练,提高数据利用率并减少数据相关性。
目标网络(Target Network)
  • 直接用当前 Q 网络计算目标 Q 值可能导致目标值变化过快,训练不稳定。
  • DQN 两个独立的网络(在线 网络-Q值更新和目标网络-计算目标Q值) ,每隔一段时间复制主 Q 网络参数,使目标 Q 值变化更平稳。
误差裁剪(Clipping the Error)
  • 误差过大会导致梯度爆炸,影响训练稳定性。
  • DQN 限制 TD 误差( δ \delta δ)在一个范围内,使梯度下降更稳定。

DQN 算法流程

一个小机器人学走迷宫的例子来讲解 DQN 的完整算法流程。

环境设置

首先,定义迷宫:

  • 机器人(Agent)在一个 5×5 的迷宫 里。
  • 它可以执行 4 种动作:上(↑)、下(↓)、左(←)、右(→)
  • 它的目标是走到终点(🏆) ,到达终点后获得奖励 +100。
  • 每走一步消耗 1 分(-1),撞墙没有奖励(0)。

初始化

  • 建立 Q 网络(Q-Network) :用 神经网络 近似 Q 值函数 Q ( s , a ) Q(s, a) Q(s,a),即估算 在状态 s s s 下执行动作 a a a 能获得的总奖励
  • 复制目标 Q 网络(Target Q-Network) ,它和 Q 网络结构相同,但用于计算稳定的目标 Q 值。
  • 初始化经验回放池(Replay Memory) ,用来存储智能体的经历,避免训练时的相关性问题。

🔹 通俗理解:
就像一个新手在玩游戏时,他会先看高手怎么玩(Q 网络学习历史经验),然后自己尝试,并从经验中改进策略。


交互(智能体在环境中探索)

智能体会不断尝试不同的动作,并观察环境的反馈:

  1. 在当前状态 s s s 下,基于 Q 值选择动作 a a a,决定走哪一个方向

    • 以概率 ϵ \epsilon ϵ 探索(Exploration,随机尝试) :比如 10% 的概率,机器人随便选一个方向。

    • 以概率 1 − ϵ 1-\epsilon 1ϵ 利用(Exploitation,使用已有经验) :比如 90% 的概率,选择当前 Q 值最高的动作

      👉 通俗理解
      如果你第一次去一个新的商场,你可能会到处走走看看(探索) ,等你熟悉了路线,你就会选择最短的路(利用)

  2. 执行动作 a a a (比如“向右走”),并观察新的状态 s ′ s' s 和奖励 r r r

    • 如果撞墙了,奖励 0;
    • 如果走到正确的路径,奖励 -1(因为消耗了一步);
    • 如果到达终点🏆,奖励 +100。
  3. 存储经历 ( s , a , r , s ′ ) (s, a, r, s') (s,a,r,s) 到经验回放池中。

    • 机器人把这一步的经历 (状态、动作、奖励、下一个状态) 存入经验池(Replay Buffer)
    • 经验池会定期取出一些数据,训练神经网络。

🔹 通俗理解:
DQN 在游戏中不断尝试新的策略,就像一个玩家刚开始玩游戏时,会随机尝试按键,但随着经验积累,他会越来越聪明,知道什么时候该跳,什么时候该继续跑。


经验回放(Replay Memory)

智能体不会直接用最新的经历训练,而是从经验回放池随机抽取一批数据 进行训练。这样可以:

  • 避免训练数据相关性过高(减少过拟合)。
  • 让智能体更稳定地学习策略。

B = { ( s i , a i , r i , s i ′ } i = 1 N \mathcal{B} = \{(s_i, a_i, r_i, s'_i\}_{i=1}^{N} B={(si,ai,ri,si}i=1N

🔹 通俗理解:
如果一个玩家玩游戏时 只记得最近几秒的经历,他可能做出不理智的决策。而经验回放相当于回顾整个游戏的经历,从过去的错误中学习,提高游戏技巧。


计算目标 Q 值(Target Q-Value)

使用目标 Q 网络(Target Q-Network) 计算 Q 值的更新目标:

Q target = r + γ max ⁡ a ′ Q target ( s ′ , a ′ ) Q_{\text{target}} = r + \gamma \max_{a'} Q_{\text{target}}(s', a') Qtarget=r+γamaxQtarget(s,a)

  • r r r:当前动作的奖励。

  • γ \gamma γ (折扣因子) :衡量未来奖励的重要性,取值一般在 0.9 左右。

  • max ⁡ a ′ Q target ( s ′ , a ′ ) \max_{a'} Q_{\text{target}}(s', a') maxaQtarget(s,a):目标 Q 网络估算下一个状态的最大 Q 值。

  • 如果游戏结束,则:

    Q target = r Q_{\text{target}} = r Qtarget=r

    因为没有下一个状态。

🔹 通俗理解:
DQN 预测 未来的最佳得分,然后调整当前的策略,以获得更高的总奖励。就像一个玩家预测下一步的得分,并优化自己的游戏策略。

计算示例

假设经验池中抽取了一个样本:

( s = 1 , a = "跳" , r = + 1 , s ′ = 2 ) ( s = 1, a = \text{"跳"}, r = +1, s' = 2) (s=1,a="",r=+1,s=2)

并且 目标 Q 网络 计算出的 下一个状态 s ′ = 2 s' = 2 s=2 的 Q 值如下:

Q target ( s ′ = 2 , a ′ ) = [ 5.0 , 3.2 , 4.1 ] Q_{\text{target}}(s' = 2, a') = [5.0, 3.2, 4.1] Qtarget(s=2,a)=[5.0,3.2,4.1]

其中:

  • “跳跃” 对应的 Q 值是 5.0
  • “蹲下” 对应的 Q 值是 3.2
  • “加速” 对应的 Q 值是 4.1

则:

Q target = r + γ max ⁡ a ′ Q target ( s ′ , a ′ ) Q_{\text{target}} = r + \gamma \max_{a'} Q_{\text{target}}(s', a') Qtarget=r+γamaxQtarget(s,a)

= 1 + 0.99 × 5.0 = 5.95 = 1 + 0.99 \times 5.0 = 5.95 =1+0.99×5.0=5.95


训练 Q 网络(更新策略)

使用均方误差(MSE)损失函数来更新 Q 网络,

计算损失:

L = 1 N ∑ i = 1 N ( Q ( s i , a i ) − Q target , i ) 2 \mathcal{L} = \frac{1}{N} \sum_{i=1}^{N} \big(Q(s_i, a_i) - Q_{\text{target}, i}\big)^2 L=N1i=1N(Q(si,ai)Qtarget,i)2

其中:

  • Q ( s i , a i ) Q(s_i, a_i) Q(si,ai) 是当前 Q 网络预测的 Q 值
  • Q target , i Q_{\text{target}, i} Qtarget,i 是目标 Q 值

计算示例: 如果当前 Q 网络计算出的 Q 值为:

Q ( s = 1 , a = "跳" ) = 5.2 Q(s = 1, a = \text{"跳"}) = 5.2 Q(s=1,a="")=5.2

那么损失:

L = ( 5.2 − 5.95 ) 2 = 0.5625 \mathcal{L} = (5.2 - 5.95)^2 = 0.5625 L=(5.25.95)2=0.5625

🔹 通俗理解:
就像玩家在游戏中不断调整策略,以减少失误,提高分数。


更新目标 Q 网络

  • 每隔一定步数 复制 Q 网络的参数目标 Q 网络 中,以保持稳定性。
  • 这样可以避免训练时 Q 值的剧烈波动,提高学习效果。

使用**梯度下降(如 Adam 优化器)**更新 Q 网络参数,使其更好地预测 Q 值:

θ = θ − α ∇ θ L \theta = \theta - \alpha \nabla_{\theta} \mathcal{L} θ=θαθL

其中:

  • θ \theta θ:Q 网络的参数
  • α \alpha α:学习率

🔹 通俗理解:
这一步就像一个玩家在反复练习游戏,不断修正错误,提高自己的决策水平。


DQN 运行流程总结

步骤 作用
1. 初始化 Q 网络 用神经网络存储 Q 值
2. 选择动作 90% 选择最优,10% 选择随机
3. 执行动作 获取奖励,观察环境
4. 记录经验 存入经验池
5. 计算目标 Q 值 使用 Q-learning 公式
6. 训练神经网络 用梯度下降优化 Q 值
7. 更新目标网络 提高训练稳定性
8. 继续训练 直到找到最优策略

结论

  • DQN 结合 Q-Learning 和深度神经网络,能在复杂环境下学习最优策略。
  • 经验回放 让智能体避免过拟合,提高泛化能力。
  • 目标 Q 网络 使训练更稳定,避免 Q 值波动。
  • 适用于 游戏 AI、机器人控制、自动驾驶等场景

Actor-Critic

Actor-Critic(AC)算法是一种结合了策略梯度方法(Policy Gradient)和值函数方法(Value Function Method) 的强化学习算法。

它同时利用了 策略网络(Actor) 来选择动作,以及 价值网络(Critic) 来评估动作的好坏,从而提高训练稳定性和样本效率。

核心在于:

  1. Actor 负责动作选择,通过策略梯度更新
  2. Critic 负责动作评估,通过 TD 误差更新

🔹 通俗理解

  • Actor(行动者):它就像一个“冒险家”,负责决定下一步往哪里走(比如往左一步还是往右一步)。但它并不总是很聪明,可能会选错方向。
  • Critic(评论者):它就像一个“导师”,站在一旁,评价冒险家的表现。它会告诉Actor:“这一步走得好,接近山顶了”或者“走错了,离山顶更远了”。
  • Actor的目标:学习一个好的策略,尽可能选择能达到山顶的动作。
  • Critic的目标:准确地评估每一步的表现,帮助Actor改进。

强化学习的目标是找到最优策略 π ∗ \pi^* π,使得智能体在环境中获得最大累积奖励期望:

J ( θ ) = E [ ∑ t = 0 ∞ R t ] J(\theta) = \mathbb{E} \left[ \sum_{t=0}^{\infty} R_t \right] J(θ)=E[t=0Rt]

其中:

  • θ \theta θ 是 Actor 网络的参数。
  • R t R_t Rt 是从 t t t 时刻开始的总回报。

计算策略对数的梯度

需要计算策略对数的梯度 ∇ θ log ⁡ π θ ( a t ∣ s t ) \nabla_\theta \log \pi_\theta (a_t | s_t) θlogπθ(atst),用于更新 Actor 网络。
这个梯度的求解取决于策略的参数化方式,通常有两种情况:

  • 离散动作空间(Softmax 策略)

    • 在离散动作情况下,我们可以使用 Softmax 作为策略:

      π θ ( a ∣ s ) = e f θ ( s , a ) ∑ a ′ e f θ ( s , a ′ ) \pi_\theta (a | s) = \frac{e^{f_\theta(s, a)}}{\sum_{a'} e^{f_\theta(s, a')}} πθ(as)=aefθ(s,a)efθ(s,a)

      其中:

      • f θ ( s , a ) f_\theta(s, a) fθ(s,a)神经网络输出的标量值,表示在状态 s s s 下选择动作 a a a 的偏好值(logits)。
      • Softmax 确保所有动作的概率之和为 1。

      求导过程

      ∇ θ log ⁡ π θ ( a t ∣ s t ) = ∇ θ f θ ( s t , a t ) − ∑ a ′ π θ ( a ′ ∣ s t ) ∇ θ f θ ( s t , a ′ ) \nabla_\theta \log \pi_\theta (a_t | s_t) = \nabla_\theta f_\theta(s_t, a_t) - \sum_{a'} \pi_\theta (a' | s_t) \nabla_\theta f_\theta(s_t, a') θlogπθ(atst)=θfθ(st,at)aπθ(ast)θfθ(st,a)

      解释

      1. 第一项 ∇ θ f θ ( s t , a t ) \nabla_\theta f_\theta(s_t, a_t) θfθ(st,at) :提升选择 a t a_t at 的概率。
      2. 第二项 ∑ a ′ π θ ( a ′ ∣ s t ) ∇ θ f θ ( s t , a ′ ) \sum_{a'} \pi_\theta (a' | s_t) \nabla_\theta f_\theta(s_t, a') aπθ(ast)θfθ(st,a) :保持总概率归一性,避免影响其他动作的分布。
  • 连续动作空间(高斯策略)

    • 如果动作是连续的,我们通常假设策略 π θ ( a ∣ s ) \pi_\theta(a | s) πθ(as) 服从 高斯分布

      π θ ( a ∣ s ) = 1 2 π σ 2 exp ⁡ ( − ( a − μ θ ( s ) ) 2 2 σ 2 ) \pi_\theta (a | s) = \frac{1}{\sqrt{2\pi\sigma^2}} \exp\left(-\frac{(a - \mu_\theta(s))^2}{2\sigma^2}\right) πθ(as)=2πσ2 1exp(2σ2(aμθ(s))2)

      其中:

      • μ θ ( s ) \mu_\theta(s) μθ(s) 是 Actor 网络输出的均值(可训练)。
      • σ 2 \sigma^2 σ2 是固定的方差(或者也是可训练的)。

      求导过程

      ∇ θ log ⁡ π θ ( a t ∣ s t ) = ( a t − μ θ ( s t ) ) σ 2 ∇ θ μ θ ( s t ) \nabla_\theta \log \pi_\theta (a_t | s_t) = \frac{(a_t - \mu_\theta(s_t))}{\sigma^2} \nabla_\theta \mu_\theta(s_t) θlogπθ(atst)=σ2(atμθ(st))θμθ(st)

      • 这里的梯度仅涉及均值 μ θ ( s ) \mu_\theta(s) μθ(s) 的梯度,因为在大多数实现中,方差 σ 2 \sigma^2 σ2 是固定的(或单独训练)。
      • 这个梯度可以直观理解为:如果动作 a t a_t at 偏离均值 μ θ ( s t ) \mu_\theta(s_t) μθ(st) ,则调整均值,使其更接近有利的方向

更新策略的梯度

更新策略的梯度可以表示为:

∇ θ J ( θ ) = E [ δ t ∇ θ log ⁡ π θ ( a t ∣ s t ) ] \nabla_\theta J(\theta) = \mathbb{E} \left[ \delta_t \nabla_\theta \log \pi_\theta (a_t | s_t) \right] θJ(θ)=E[δtθlogπθ(atst)]

其中:

  • δ t \delta_t δt 是 Critic 提供的 TD 误差

    δ t = r t + γ V w ( s t + 1 ) − V w ( s t ) \delta_t = r_t + \gamma V_w(s_{t+1}) - V_w(s_t) δt=rt+γVw(st+1)Vw(st)

  • ∇ θ log ⁡ π θ ( a t ∣ s t ) \nabla_\theta \log \pi_\theta (a_t | s_t) θlogπθ(atst) 是策略对数的梯度,表示策略随参数的变化率。

具体算法流程

初始化网络

  • 创建Actor 网络,参数 θ \theta θ,用于选择动作 a a a

    π θ ( a ∣ s ) = P ( a ∣ s ) \pi_{\theta}(a|s) = P(a|s) πθ(as)=P(as)

    (即:在状态 s s s 下执行动作 a a a 的概率)

  • 创建Critic 网络,参数 w w w,用于评估状态值 V ( s ) V(s) V(s)

    V w ( s ) V_w(s) Vw(s)

    (即:状态 s s s 的长期收益估计)

  • 设定学习率 α , β \alpha, \beta α,β折扣因子 γ \gamma γ

🔹 通俗理解

  • Actor 负责决策(就像玩家)。
  • Critic 负责评价(就像教练)。
  • 两个网络相互配合,不断改进策略。

交互环境,获取经验

  1. 在当前状态 s t s_t st,Actor 通过策略 π θ ( a ∣ s ) \pi_{\theta}(a|s) πθ(as) 选择一个动作:

    a t ∼ π θ ( a t ∣ s t ) a_t \sim \pi_{\theta}(a_t | s_t) atπθ(atst)

  2. 执行动作 a t a_t at,观察新状态 s t + 1 s_{t+1} st+1 和奖励 r t r_t rt

    ( s t , a t , r t , s t + 1 ) (s_t, a_t, r_t, s_{t+1}) (st,at,rt,st+1)

🔹 通俗理解

  • Actor 就像一个玩家,根据策略选择动作
  • 游戏环境反馈新的状态和得分

计算 TD 误差(Temporal Difference Error)

Critic 用 TD 误差来评估当前状态的收益是否比预期好

δ t = r t + γ V w ( s t + 1 ) − V w ( s t ) \delta_t = r_t + \gamma V_w(s_{t+1}) - V_w(s_t) δt=rt+γVw(st+1)Vw(st)

其中:

  • r t r_t rt 是当前奖励(Agent 执行动作后环境返回的分数)
  • γ \gamma γ折扣因子(用于衡量未来奖励的重要性,一般设定为 0.9 或 0.99)
  • γ V w ( s t + 1 ) \gamma V_w(s_{t+1}) γVw(st+1) 代表下一个状态的预期收益
  • V w ( s t ) V_w(s_t) Vw(st) 代表当前状态的预期收益

解释

  • 如果 δ t > 0 \delta_t > 0 δt>0,说明这个动作比预期好,应该鼓励
  • 如果 δ t < 0 \delta_t < 0 δt<0,说明这个动作比预期差,应该减少执行的可能性

🔹 通俗理解

  • Critic 就像一个教练,他预测了一名球员的表现,但比赛结果可能比预测的好(或差)。
  • 通过比较预期值和实际表现的差异,教练可以修正自己未来的评估。

更新 Critic 网络

计算Critic 网络的梯度

Critic 通过最小化 TD 误差来优化自己的评估能力,通常使用 均方误差(MSE) 来衡量 TD 误差

计算损失函数 L ( w ) L(w) L(w)

L ( w ) = 1 2 ( δ t ) 2 L(w) = \frac{1}{2} ( \delta_t )^2 L(w)=21(δt)2

然后计算损失函数 L ( w ) L(w) L(w) 对 Critic 网络参数 w w w梯度

对损失函数 L ( w ) L(w) L(w) 求参数 w w w 的梯度:

∇ w L ( w ) = 损失函数  L ( w )  对  w  的梯度 \nabla_w L(w) = \text{损失函数 } L(w) \text{ 对 } w \text{ 的梯度} wL(w)=损失函数 L(w)  w 的梯度

表示:

∇ w L ( w ) = ∇ w 1 2 ( δ t ) 2 \nabla_w L(w) = \nabla_w \frac{1}{2} ( \delta_t )^2 wL(w)=w21(δt)2

使用幂函数求导公式 ∇ x 1 2 x 2 = x ⋅ ∇ x x \nabla_x \frac{1}{2} x^2 = x \cdot \nabla_x x x21x2=xxx,得到:

∇ w L ( w ) = δ t ⋅ ∇ w δ t \nabla_w L(w) = \delta_t \cdot \nabla_w \delta_t wL(w)=δtwδt

由于:

δ t = r t + γ V w ( s t + 1 ) − V w ( s t ) \delta_t = r_t + \gamma V_w(s_{t+1}) - V_w(s_t) δt=rt+γVw(st+1)Vw(st)

奖励 r t r_t rt 是常数,对 w w w 的梯度为 0,所以:

∇ w δ t = ∇ w ( γ V w ( s t + 1 ) − V w ( s t ) ) \nabla_w \delta_t = \nabla_w (\gamma V_w(s_{t+1}) - V_w(s_t)) wδt=w(γVw(st+1)Vw(st))

对参数 w w w 求梯度:

∇ w δ t = − ∇ w V w ( s t ) \nabla_w \delta_t = -\nabla_w V_w(s_t) wδt=wVw(st)

假设我们使用的是 TD(0) 方法(即不对未来状态 s t + 1 s_{t+1} st+1 的值函数求梯度

因为:

  • V w ( s t ) V_w(s_t) Vw(st) 是 Critic 网络的输出,依赖于参数 w w w
  • 不对 V w ( s t + 1 ) V_w(s_{t+1}) Vw(st+1) 求梯度,因为它是对未来的估计,通常被视为常数(类似目标值的作用)。

那么:

∇ w L ( w ) = δ t ⋅ ( − ∇ w V w ( s t ) ) \nabla_w L(w) = \delta_t \cdot (-\nabla_w V_w(s_t)) wL(w)=δt(wVw(st))

去掉负号:

∇ w L ( w ) = δ t ∇ w V w ( s t ) \nabla_w L(w) = \delta_t \nabla_w V_w(s_t) wL(w)=δtwVw(st)

🔹通俗理解

  • Critic 的目标是让自己的预测更准确,所以它用梯度下降来调整自己的参数。
更新 Critic 网络参数

Critic 梯度下降法(Gradient Descent) ,参数 w w w 的更新规则是:

w ← w − β ∇ w L ( w ) w \leftarrow w - \beta \nabla_w L(w) wwβwL(w)

其中:

  • β \beta β 是学习率,控制更新步长。
  • ∇ w L ( w ) \nabla_w L(w) wL(w) 是损失函数的梯度

∇ w L ( w ) = − δ t ∇ w V w ( s t ) \nabla_w L(w) = -\delta_t \nabla_w V_w(s_t) wL(w)=δtwVw(st) 代入:

w ← w − β ( − δ t ∇ w V w ( s t ) ) w \leftarrow w - \beta (-\delta_t \nabla_w V_w(s_t)) wwβ(δtwVw(st))

化简得到:

w ← w + β δ t ∇ w V w ( s t ) w \leftarrow w + \beta \delta_t \nabla_w V_w(s_t) ww+βδtwVw(st)

  • w w w 是 Critic 网络的参数
  • β \beta β 是 Critic 的学习率(通常取 0.01 ∼ 0.001 0.01 \sim 0.001 0.010.001)。
  • δ t \delta_t δt 是 TD 误差,指导 Critic 如何调整自己的估计值。
  • ∇ w V w ( s t ) \nabla_w V_w(s_t) wVw(st) 是 Critic 价值函数的梯度(衡量 w w w 变化对状态值的影响)
返回

更新后的 Critic 网络 V w ( s ) V_w(s) Vw(s)

🔹 通俗理解

  • Critic 根据误差的大小调整参数,如果误差大,它就会做大调整;如果误差小,它就做小调整。

更新 Actor 网络

  • 计算 策略对数梯度

    ∇ θ log ⁡ π θ ( a t ∣ s t ) \nabla_\theta \log \pi_\theta (a_t | s_t) θlogπθ(atst)

  • 计算 Actor 更新方向:

    δ t ∇ θ log ⁡ π θ ( a t ∣ s t ) \delta_t \nabla_\theta \log \pi_\theta (a_t | s_t) δtθlogπθ(atst)

Actor 根据 Critic 计算的 TD 误差调整策略

θ ← θ + α δ t ∇ θ log ⁡ π θ ( a t ∣ s t ) \theta \leftarrow \theta + \alpha \delta_t \nabla_{\theta} \log \pi_{\theta}(a_t | s_t) θθ+αδtθlogπθ(atst)

其中:

  • α \alpha α 是学习率,控制 Actor 更新的步长。
  • δ t \delta_t δt 指导 Actor 增加选择更优动作的概率

直观理解:

  • 如果 Critic 认为这个动作是好的(**** δ t > 0 \delta_t > 0 δt>0 ,Actor 就会增加选择这个动作的概率。
  • 如果 Critic 认为这个动作是不好的(**** δ t < 0 \delta_t < 0 δt<0 ,Actor 就会减少选择这个动作的概率。

🔹 通俗理解

  • 如果玩家做对了,教练就会鼓励他多做类似的决策;
  • 如果玩家做错了,教练会建议他少做类似的决策。

继续循环,直到收敛

重复步骤 2-5,不断优化策略,直到智能体的表现稳定。


📌 总结

步骤 主要任务 作用
1. 初始化网络 创建 Actor 和 Critic 网络 Actor 负责决策,Critic 负责评价
2. 交互环境 Actor 选择动作,执行并获取奖励 采集经验数据
3. 计算 TD 误差 计算 δ t = r + γ V ( s ′ ) − V ( s ) \delta_t = r + \gamma V(s') - V(s) δt=r+γV(s)V(s) 评估动作是否优秀
4. 更新 Critic 让 Critic 学习更准确地估计价值 提高评价能力
5. 更新 Actor 让 Actor 调整策略,提高优秀动作的概率 让智能体学到最优策略
6. 继续循环 持续优化策略,直到收敛 让 AI 变得更强

深度确定性策略梯度(DDPG)

在这里插入图片描述

DDPG 关键思想

  1. Actor 网络 μ θ ( s ) \mu_\theta(s) μθ(s)

    • 输入状态 s s s,输出确定性的动作 a a a
    • 目标:找到最优策略,使得累积奖励最大化。
  2. Critic 网络 Q w ( s , a ) Q_w(s, a) Qw(s,a)

    • 输入状态 s s s动作 a a a,输出该动作的 Q 值(即未来可能获得的奖励)。
    • 目标:评估 Actor 选择的动作是否优越。
  3. 经验回放(Replay Buffer)

    • 采样经验数据 ( s , a , r , s ′ ) (s, a, r, s') (s,a,r,s) 来训练网络,避免样本相关性,提高训练稳定性。
  4. 目标网络(Target Network)

    • 维护两个目标网络 Q w ′ Q'_w Qw μ θ ′ \mu'_\theta μθ 来缓慢跟随主网络更新,防止训练不稳定。

DDPG 详细算法流程

初始化

  • 初始化 Actor 网络 μ θ ( s ) \mu_\theta(s) μθ(s)(策略网络)
  • 初始化 Critic 网络 Q w ( s , a ) Q_w(s, a) Qw(s,a)(价值网络)
  • 复制主网络参数,创建目标网络 Q w ′ Q'_w Qw μ θ ′ \mu'_\theta μθ,初始参数相同
  • 初始化经验回放池 D D D
  • 初始化噪声 N N N (如 OU 过程) 用于探索

训练循环(每一轮训练时执行)

(1)与环境交互,收集数据

  • 使用 Actor 网络基于当前状态 s t s_t st 生成确定性动作 a t a_t at

    a t = μ θ ( s t ) a_t = \mu_\theta(s_t) at=μθ(st)

  • 加入 Ornstein-Uhlenbeck (OU) 噪声 N t N_t Nt 进行探索(避免策略收敛到局部最优):

    a t = μ θ ( s t ) + N t a_t = \mu_\theta(s_t) + N_t at=μθ(st)+Nt

    物理解释

    • 现实世界中的智能体不能总是采取相同的动作,否则容易陷入局部最优解。因此,需要加入噪声 N t N_t Nt 进行探索。
    • 这里使用的是Ornstein-Uhlenbeck (OU) 噪声,它能够模拟带惯性的随机过程,更适用于控制任务,例如机器人运动。
  • 执行动作 ** a t a_t at**并与环境交互,获取奖励 r t r_t rt 和下一个状态 s t + 1 s_{t+1} st+1

  • 存储经验 ( s t , a t , r t , s t + 1 ) (s_t, a_t, r_t, s_{t+1}) (st,at,rt,st+1) 到经验回放池 D D D

(2)从经验池中随机采样 N N N 个样本

  • 采用随机采样方式,避免数据相关性,从 D D D 中随机抽取一个 batch: ( s , a , r , s ′ ) (s, a, r, s') (s,a,r,s)

(3)更新 Critic 网络(Q 网络)

  • 计算目标 Q 值(目标网络计算)

    y t = r t + γ Q w ′ ( s t + 1 , μ θ ′ ( s t + 1 ) ) y_t = r_t + \gamma Q'_w(s_{t+1}, \mu'_\theta(s_{t+1})) yt=rt+γQw(st+1,μθ(st+1))

    其中:

    • **$y_t $**是目标 Q 值,它表示从 s t s_t st 执行 a t a_t at 后,未来的累积回报。
    • Q w ′ ( s t + 1 , μ θ ′ ( s t + 1 ) Q'_w(s_{t+1}, \mu'_\theta(s_{t+1}) Qw(st+1,μθ(st+1) 是目标 Critic 网络的 Q 值,未来的折扣回报
    • γ \gamma γ 是折扣因子,用于平衡短期奖励和长期奖励,通常取 0.9 0.9 0.9 这样较高的值
  • 最小化 Critic 网络损失

    L ( w ) = 1 N ∑ ( y t − Q w ( s , a ) ) 2 L(w) = \frac{1}{N} \sum (y_t - Q_w(s, a))^2 L(w)=N1(ytQw(s,a))2

    使用梯度下降(Adam 优化器) 更新 Critic 参数 w w w

    w ← w − α ∇ w L ( w ) w \leftarrow w - \alpha \nabla_w L(w) wwαwL(w)

    物理解释

    • L ( w ) L(w) L(w) 是 Q 网络的损失函数,用于衡量 Critic 网络的预测误差。

    • 目标 Q 值 y t y_t yt 和当前 Q 值 Q w ( s , a ) Q_w(s, a) Qw(s,a) 之间的均方误差(MSE)

      • 如果误差很大,说明 Critic 预测得不准,需要调整参数 w w w
      • 通过梯度下降(SGD)或 Adam 优化器更新 Q 网络的参数

(4)更新 Actor 网络(基于策略梯度)

  • 计算 Actor 网络的梯度:

    ∇ θ J ≈ 1 N ∑ ∇ θ μ θ ( s ) ∇ a Q w ( s , a ) ∣ a = μ θ ( s ) \nabla_\theta J \approx \frac{1}{N} \sum \nabla_\theta \mu_\theta(s) \nabla_a Q_w(s, a) \Big|_{a = \mu_\theta(s)} θJN1θμθ(s)aQw(s,a) a=μθ(s)

    直观理解:

    • Actor 通过 Critic 提供的 Q 值信息,更新策略,使未来的 Q 值更大!
  • 使用梯度上升法更新 Actor 网络参数 θ \theta θ

    θ ← θ + β ∇ θ J \theta \leftarrow \theta + \beta \nabla_\theta J θθ+βθJ

(5)软更新目标网络

  • 目标网络参数缓慢更新

w ′ ← τ w + ( 1 − τ ) w ′ w' \leftarrow \tau w + (1 - \tau) w' wτw+(1τ)w

θ ′ ← τ θ + ( 1 − τ ) θ ′ \theta' \leftarrow \tau \theta + (1 - \tau) \theta' θτθ+(1τ)θ

其中 τ \tau τ 是目标网络的更新率,确保目标网络缓慢变化,稳定训练。

  • 目的是提高训练稳定性,避免剧烈参数波动

重复步骤(2),直到收敛

  • 训练过程中,Agent 逐步学习到更好的策略,使得累积奖励最大化。
  • 目标网络稳定策略更新,经验回放减少样本相关性,使训练更加稳定。

通俗易懂的解释

DDPG 就像一个聪明的机器人司机,它使用两个大脑来学习如何驾驶:

  1. Actor(决策者) 负责选择驾驶策略(比如油门、刹车)。
  2. Critic(评价者) 负责判断决策的好坏(当前决策会不会带来更高的未来奖励)。

学习过程如下:

  • Actor 试着开车(选择动作) ,但最开始并不熟练,所以会加入一点随机性来探索不同的驾驶方式。
  • Critic 观察驾驶情况并评分,告诉 Actor 哪种驾驶方式更好。
  • Actor 听取 Critic 的建议,并调整驾驶方式,使未来的评分更高。
  • 经验回放池 像是驾驶记录本,记录下之前的驾驶情况,帮助 Critic 记住哪些驾驶方式更安全有效。
  • 目标网络 像是一个稳定的老司机,确保 Critic 不会突然改变评分标准,使 Actor 训练更加稳定。

DDPG vs 其他 RL 算法

算法 是否支持连续动作 是否使用 Actor-Critic 是否使用经验回放 是否有目标网络
DQN ❌ 只能离散 ❌ 不是 Actor-Critic ✅ 使用经验回放 ✅ 有目标网络
A3C ✅ 支持连续 ✅ 是 Actor-Critic ❌ 不使用经验回放 ❌ 无目标网络
PPO ✅ 支持连续 ✅ 是 Actor-Critic ❌ 不使用经验回放 ❌ 无目标网络
DDPG ✅ 支持连续 ✅ 是 Actor-Critic ✅ 使用经验回放 ✅ 有目标网络

🔹 DDPG 适用于高维、连续控制任务(如机器人控制) ,但训练不稳定,容易陷入局部最优。

PPO(Proximal Policy Optimization) 近端策略优化

  • PPO(近端策略优化)是强化学习(RL)中最流行的策略梯度方法之一,由 OpenAI 在 2017 年提出。
  • 它在稳定性、训练效率收敛速度方面优于 TRPO(Trust Region Policy Optimization),被广泛应用于机器人控制、游戏 AI、自动驾驶等任务
  • 特点 解释
    裁剪目标函数 限制策略变化幅度,防止训练崩溃
    优势估计** A t A_t At** 让学习更加稳定
    Actor-Critic 结构 结合策略梯度 + 价值估计,提高学习效率
    无二阶优化 计算简单,适用于大规模任务

核心思想

PPO 属于 Actor-Critic 方法,核心目标是提高智能体选择好动作的概率,同时避免策略参数更新过大,保证训练的稳定性。

通俗理解
就像教小孩学骑自行车,不能一下子让他从不会直接骑到飞快,否则容易摔倒。PPO 通过“小步改进”来保证 AI 稳定学习

📌 主要特性

  1. 基于策略梯度:直接优化策略,适用于连续和离散动作空间。

  2. 克服 TRPO 复杂性:相比 TRPO 的二阶优化,PPO 采用简单的一阶优化,计算成本低。

  3. 采用 Clipped Objective

    • 控制策略更新幅度,避免策略剧烈变化,保证训练稳定。

PPO 算法流程

输入:环境状态 s t s_t st
输出:最优动作 a t a_t at

📝 主要步骤

  1. 初始化 Actor-Critic 网络

    • Actor 网络 π θ ( s ) \pi_\theta(s) πθ(s) :用于决策,负责输出动作的概率分布 π θ ( a ∣ s ) \pi_\theta(a | s) πθ(as)
    • Critic 网络 V ϕ ( s ) V_\phi(s) Vϕ(s) :用于评估状态的好坏,负责评估状态的价值 V ϕ ( s ) V_\phi(s) Vϕ(s)
    • 初始化策略参数 θ \theta θ 和值函数参数 ϕ \phi ϕ
  2. 与环境交互,收集经验

    • 在环境中运行策略 π θ \pi_\theta πθ收集数据

      • 在时间步 t t tActor 根据当前策略选择动作:

        a t ∼ π θ ( a t ∣ s t ) a_t \sim \pi_{\theta}(a_t | s_t) atπθ(atst)

      • 执行动作 a t a_t at,环境返回奖励 r t r_t rt 和新状态 s t + 1 s_{t+1} st+1

      • 记录状态、动作、奖励、下一状态 ( s t , a t , r t , s t + 1 ) (s_t, a_t, r_t, s_{t+1}) (st,at,rt,st+1)

      • 持续收集多个时间步的数据,直到一个完整的时间片(batch)或一个回合结束

  3. 计算优势函数(Advantage Estimation)

    • 计算状态价值

      V ϕ ( s t ) V_{\phi}(s_t) Vϕ(st)

    • 计算TD 目标(目标值函数)

      R t = r t + γ V ϕ ( s t + 1 ) R_t = r_t + \gamma V_{\phi}(s_{t+1}) Rt=rt+γVϕ(st+1)

    • 计算优势函数 A t A_t At

A t = R t − V ϕ ( s t ) A_t = R_t - V_{\phi}(s_t) At=RtVϕ(st)

  1. 计算 PPO 目标函数
  • 计算旧策略的动作概率:

    π θ old ( a t ∣ s t ) \pi_{\theta_{\text{old}}}(a_t | s_t) πθold(atst)

  • 计算新旧策略概率比值

    r t ( θ ) = π θ ( a t ∣ s t ) π θ o l d ( a t ∣ s t ) r_t(\theta) = \frac{\pi_{\theta}(a_t | s_t)}{\pi_{\theta_{old}}(a_t | s_t)} rt(θ)=πθold(atst)πθ(atst)

    • 如果 r t ( θ ) > 1 r_t(\theta) > 1 rt(θ)>1,说明新策略更倾向于选择该动作,更新过大可能导致策略崩溃。
    • 如果 r t ( θ ) < 1 r_t(\theta) < 1 rt(θ)<1,说明新策略不太愿意选择该动作,可能过度惩罚了好策略。
  • 计算裁剪(Clipped) 策略更新目标

    L clip ( θ ) = min ⁡ [ r t ( θ ) A t , clip ( r t ( θ ) , 1 − ϵ , 1 + ϵ ) A t ] L^{\text{clip}}(\theta) = \min \left[ r_t(\theta) A_t, \text{clip}(r_t(\theta), 1-\epsilon, 1+\epsilon) A_t \right] Lclip(θ)=min[rt(θ)At,clip(rt(θ),1ϵ,1+ϵ)At]

    • 这里 ϵ \epsilon ϵ 是一个小数(一般设为 0.2),用于限制策略的变化幅度。
    • 如果比值 r t ( θ ) r_t(\theta) rt(θ) 变化太大,就进行裁剪,防止训练不稳定。
  • 控制策略变化范围, ϵ \epsilon ϵ 通常设为 0.2

  • 如果更新太大,则裁剪,防止训练不稳定

  1. 更新 Actor(策略网络)
  • 计算梯度:

    ∇ θ L clip ( θ ) \nabla_{\theta} L^{\text{clip}}(\theta) θLclip(θ)

  • 使用梯度上升(最大化 L clip L^{\text{clip}} Lclip)优化策略网络:

    θ ← θ + β ∇ θ L clip ( θ ) \theta \leftarrow \theta + \beta \nabla_{\theta} L^{\text{clip}}(\theta) θθ+βθLclip(θ)

  1. 更新 Critic(值函数网络)
  • 使用 MSE 损失更新 Critic 网络:

    L ( V ) = ( V ϕ ( s t ) − R t ) 2 L(V) = (V_{\phi}(s_t) - R_t)^2 L(V)=(Vϕ(st)Rt)2

  • 采用梯度下降优化 Critic:

    ϕ ← ϕ − α ∇ ϕ L ( V ) \phi \leftarrow \phi - \alpha \nabla_{\phi} L(V) ϕϕαϕL(V)

  1. 重复步骤 2-6,直到收敛

    • 让智能体不断学习最优策略,最大化累积奖励。
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐