当前位置: 首页 > news >正文

强化学习 - PPO控制无人机

PPO(Proximal Policy Optimization,近端策略优化)是一种强化学习算法,用于训练智能体(无人机)如何在环境中做出决策。它本质上是 策略梯度(Policy Gradient)方法 的一种改进,旨在提高训练稳定性,同时确保策略更新不过大。


PPO 训练过程概览

PPO 的核心目标是 找到一个最优策略,使得无人机能够在环境中获得最大累积奖励。它通过以下步骤进行学习:

1. 采样数据(Collect Data)

首先,我们使用当前的策略 π θ \pi_\theta πθ 控制无人机,在环境中进行一系列动作,收集数据:

  • 状态 s t s_t st(无人机的位置、姿态、速度)
  • 动作 a t a_t at(无人机的推力、角速度)
  • 奖励 r t r_t rt(基于任务目标计算)
  • 下一步状态 s t + 1 s_{t+1} st+1
  • Done 信号(是否到达终止状态)

这些数据构成了多个轨迹(trajectories),存入一个回放缓冲区。


2. 计算目标值(Compute Targets)

在强化学习中,我们希望策略 π θ \pi_\theta πθ 选择 未来回报最高的动作,因此需要估计:

  1. 回报(Return)
    R t = ∑ l = 0 T − t γ l r t + l R_t = \sum_{l=0}^{T-t} \gamma^l r_{t+l} Rt=l=0Ttγlrt+l
    其中 γ ∈ ( 0 , 1 ] \gamma \in (0,1] γ(0,1] 是折扣因子,表示未来奖励的重要性。

  2. 价值函数 V θ ( s t ) V_\theta(s_t) Vθ(st) 估计当前状态的总回报

    • 价值网络 V θ V_\theta Vθ 通过神经网络预测 R t R_t Rt
  3. 优势函数 A t A_t At(Advantage)
    A t = R t − V θ ( s t ) A_t = R_t - V_\theta(s_t) At=RtVθ(st)

    • 它衡量了 当前动作 a t a_t at 相对平均策略的好坏
      • 如果 A t > 0 A_t > 0 At>0,说明 a t a_t at 是好动作;
      • 如果 A t < 0 A_t < 0 At<0,说明 a t a_t at 是坏动作。

这里有个问题,为什么神经网络能够用来估计价值,也就是说如何让神经网络收敛到能够很好估计出真实的价值,什么引导神经网络的更新收敛到最优?
红色部分提出了一个关键问题:神经网络如何学会精确地估计价值函数,什么信号驱动其收敛到最优? 以下是详细解答:



3. 计算策略更新方向

(1) 概率比(Importance Sampling)

PPO 采用 策略梯度方法,通过最大化动作概率的对数乘以优势来更新策略:
∇ θ J ( θ ) ≈ E [ ∇ θ log ⁡ π θ ( a t ∣ s t ) ⋅ A t ] \nabla_\theta J(\theta) \approx \mathbb{E} \left[ \nabla_\theta \log \pi_\theta(a_t \mid s_t) \cdot A_t \right] θJ(θ)E[θlogπθ(atst)At]
但如果策略变化太大,更新会不稳定,因此我们计算:
ρ t ( θ ) = π θ ( a t ∣ s t ) π θ old ( a t ∣ s t ) \rho_t(\theta) = \frac{\pi_\theta(a_t \mid s_t)}{\pi_{\theta_{\text{old}}}(a_t \mid s_t)} ρt(θ)=πθold(atst)πθ(atst)
它衡量了 新策略 π θ \pi_\theta πθ 相较于旧策略 π old \pi_{\text{old}} πold 选择相同动作的变化比率

(2) 剪切损失(Clipped Surrogate Objective)

为了防止策略变化过大,PPO 采用了 剪切(Clipping)技巧
L CLIP ( θ ) = E t [ min ⁡ ( ρ t ( θ ) A t , clip ⁡ ( ρ t ( θ ) , 1 − ϵ , 1 + ϵ ) A t ) ] L^{\text{CLIP}}(\theta) = \mathbb{E}_t \left[ \min\left( \rho_t(\theta) A_t, \; \operatorname{clip}\big(\rho_t(\theta), 1-\epsilon, 1+\epsilon\big) A_t \right) \right] LCLIP(θ)=Et[min(ρt(θ)At,clip(ρt(θ),1ϵ,1+ϵ)At)]

  • 如果 ρ t ( θ ) \rho_t(\theta) ρt(θ) 变化太大(超出 [ 1 − ϵ , 1 + ϵ ] [1-\epsilon, 1+\epsilon] [1ϵ,1+ϵ]),则限制更新幅度,确保训练稳定。

4. 计算价值函数损失

PPO 同时更新 价值网络 V θ V_\theta Vθ,使得它更好地预测 R t R_t Rt
L VF ( θ ) = E t [ ( V θ ( s t ) − R t ) 2 ] L^{\text{VF}}(\theta) = \mathbb{E}_t \left[ \left( V_\theta(s_t) - R_t \right)^2 \right] LVF(θ)=Et[(Vθ(st)Rt)2]
这是一个 均方误差(MSE)损失,类似于监督学习中的回归任务。


5. 计算熵奖励🚀鼓励搜索

为了防止策略过于收敛到单一动作,PPO 还会鼓励策略保持一定的探索:
L entropy ( θ ) = E t [ S ( π θ ( ⋅ ∣ s t ) ) ] L^{\text{entropy}}(\theta) = \mathbb{E}_t \left[ S(\pi_\theta(\cdot \mid s_t)) \right] Lentropy(θ)=Et[S(πθ(st))]
其中 S ( π θ ) S(\pi_\theta) S(πθ) 是策略分布的熵(Entropy),它的作用是鼓励策略保持一定的不确定性,以避免早期陷入局部最优。


6. 计算最终损失函数

PPO 的最终损失函数是:
L ( θ ) = L CLIP ( θ ) − c 1 L VF ( θ ) + c 2 L entropy ( θ ) L(\theta) = L^{\text{CLIP}}(\theta) - c_1 L^{\text{VF}}(\theta) + c_2 L^{\text{entropy}}(\theta) L(θ)=LCLIP(θ)c1LVF(θ)+c2Lentropy(θ)

  • c 1 , c 2 c_1, c_2 c1,c2 是超参数,决定价值网络损失和熵奖励的权重。

7. 更新策略

最后,我们对策略网络和价值网络进行 梯度下降(使用 Adam 优化器):
θ ← θ + α ∇ θ L ( θ ) \theta \leftarrow \theta + \alpha \nabla_\theta L(\theta) θθ+αθL(θ)

  • α \alpha α 是学习率(通常为 1 e − 4 1e^{-4} 1e4)。
  • 由于 PPO 是 on-policy 算法,每次更新后,必须丢弃旧数据并重新采样。

PPO 训练全流程总结

  1. 使用当前策略 π θ old \pi_{\theta_{\text{old}}} πθold 采样多个轨迹数据 { s t , a t , r t , s t + 1 , … } \{s_t, a_t, r_t, s_{t+1}, \dots\} {st,at,rt,st+1,}
  2. 计算回报 R t R_t Rt、优势 A t A_t At,并更新价值网络 V θ ( s t ) V_\theta(s_t) Vθ(st)
  3. 计算策略概率比 ρ t ( θ ) \rho_t(\theta) ρt(θ),并使用剪切损失 L CLIP L^{\text{CLIP}} LCLIP 限制策略更新幅度
  4. 计算价值网络的损失 L VF L^{\text{VF}} LVF
  5. 计算熵奖励 L entropy L^{\text{entropy}} Lentropy,鼓励探索
  6. 更新神经网络参数 θ \theta θ,优化 L ( θ ) L(\theta) L(θ)
  7. 丢弃旧数据,使用新策略重新采样,重复以上过程

PPO 代码示例

下面是 PPO 的一个简单代码框架(PyTorch):

import torch
import torch.nn as nn
import torch.optim as optim
import numpy as npclass PolicyNetwork(nn.Module):def __init__(self, state_dim, action_dim):super().__init__()self.fc = nn.Sequential(nn.Linear(state_dim, 64),nn.ReLU(),nn.Linear(64, 64),nn.ReLU(),nn.Linear(64, action_dim),nn.Softmax(dim=-1))def forward(self, x):return self.fc(x)class ValueNetwork(nn.Module):def __init__(self, state_dim):super().__init__()self.fc = nn.Sequential(nn.Linear(state_dim, 64),nn.ReLU(),nn.Linear(64, 64),nn.ReLU(),nn.Linear(64, 1))def forward(self, x):return self.fc(x)# 初始化网络
policy_net = PolicyNetwork(state_dim=3, action_dim=4)  # 例如:状态是(x, y, z),动作是推力 + 角速度
value_net = ValueNetwork(state_dim=3)
optimizer = optim.Adam(list(policy_net.parameters()) + list(value_net.parameters()), lr=3e-4)

你可以在这个基础上,进一步 加入轨迹采样、计算 Advantage、PPO 损失等 来实现完整的 PPO 训练。


总结

PPO 的训练过程可以简化为:

  1. 采样轨迹数据 { s t , a t , r t } \{s_t, a_t, r_t\} {st,at,rt}
  2. 计算 Advantage A t = R t − V θ ( s t ) A_t = R_t - V_\theta(s_t) At=RtVθ(st)
  3. 计算 PPO 剪切目标 L CLIP ( θ ) L^{\text{CLIP}}(\theta) LCLIP(θ)
  4. 计算价值函数损失 L VF L^{\text{VF}} LVF
  5. 计算熵奖励 L entropy L^{\text{entropy}} Lentropy
  6. 更新神经网络参数 θ \theta θ
  7. 重复以上步骤,直到无人机学会任务

🚀🚀🚀🚀🚀🚀🚀

回报(Return)的计算具体,数据需要保持时序吗?

是的,回报(Return)计算必须保持时序,因为强化学习是一个 时间序列问题,奖励是根据过去的状态和动作累积而来的。我们不能随机打乱数据,而是必须保持数据的时间顺序,以确保策略能够正确学习到长期累积回报的趋势。


1. 回报(Return)计算

回报(Return)是指从某个时刻 t t t 开始的累积奖励,计算方式如下:
R t = r t + γ r t + 1 + γ 2 r t + 2 + ⋯ + γ T − t r T R_t = r_t + \gamma r_{t+1} + \gamma^2 r_{t+2} + \dots + \gamma^{T-t} r_T Rt=rt+γrt+1+γ2rt+2++γTtrT
其中:

  • r t r_t rt 是当前时刻的奖励。
  • γ ∈ ( 0 , 1 ] \gamma \in (0,1] γ(0,1]折扣因子,用于平衡短期奖励和长期奖励。
  • T T T 是轨迹的终点(episode 结束时刻)。

示例

假设无人机在某个轨迹中经历了 4 个时间步:

时间步 t t t奖励 r t r_t rt
01.0
10.8
20.5
30.2

如果 γ = 0.9 \gamma = 0.9 γ=0.9,那么:
R 3 = r 3 = 0.2 R_3 = r_3 = 0.2 R3=r3=0.2
R 2 = r 2 + γ R 3 = 0.5 + 0.9 × 0.2 = 0.68 R_2 = r_2 + \gamma R_3 = 0.5 + 0.9 \times 0.2 = 0.68 R2=r2+γR3=0.5+0.9×0.2=0.68
R 1 = r 1 + γ R 2 = 0.8 + 0.9 × 0.68 = 1.41 R_1 = r_1 + \gamma R_2 = 0.8 + 0.9 \times 0.68 = 1.41 R1=r1+γR2=0.8+0.9×0.68=1.41
R 0 = r 0 + γ R 1 = 1.0 + 0.9 × 1.41 = 2.27 R_0 = r_0 + \gamma R_1 = 1.0 + 0.9 \times 1.41 = 2.27 R0=r0+γR1=1.0+0.9×1.41=2.27

在代码中,我们通常 从后向前 计算 Return:

def compute_returns(rewards, gamma=0.99):returns = []R = 0  # 轨迹终点 Return 设为 0for r in reversed(rewards):  # 逆序遍历R = r + gamma * Rreturns.insert(0, R)  # 插入到前面,保持时序return returns# 示例
rewards = [1.0, 0.8, 0.5, 0.2]
returns = compute_returns(rewards, gamma=0.9)
print(returns)  # 输出: [2.27, 1.41, 0.68, 0.2]

注意:必须保持时序,否则 Return 计算会混乱!


2. 保持时序的重要性

强化学习中的数据是 时间序列数据,不能像监督学习那样随机打乱,否则:

  1. Return 计算会出错:Return 依赖于未来的奖励,如果打乱顺序,Return 就变成了随机数,没有意义。
  2. 策略学习会失败:智能体需要学习 动作 a t a_t at 会如何影响未来状态 s t + 1 s_{t+1} st+1,如果数据顺序混乱,策略无法正确学习因果关系。
  3. 优势估计 A t A_t At 会混乱:PPO 需要计算优势 A t = R t − V ( s t ) A_t = R_t - V(s_t) At=RtV(st),如果时序错乱, V ( s t ) V(s_t) V(st) 预测的值就会与 R t R_t Rt 对不上。

解决方案

  • 轨迹必须按时间顺序存储(FIFO 队列)。
  • 计算 Return 时不能打乱顺序
  • 在训练时,允许 mini-batch 采样,但 batch 采样仍需保证数据连续性(可以分片)

3. GAE(广义优势估计)与时序关系

在 PPO 中,通常不直接使用 R t R_t Rt,而是使用 广义优势估计(GAE) 来减少方差:
A t = ∑ l = 0 T − t ( γ λ ) l δ t + l A_t = \sum_{l=0}^{T-t} (\gamma \lambda)^l \delta_{t+l} At=l=0Tt(γλ)lδt+l
其中
δ t = r t + γ V ( s t + 1 ) − V ( s t ) \delta_t = r_t + \gamma V(s_{t+1}) - V(s_t) δt=rt+γV(st+1)V(st)
GAE 也是从后向前计算

def compute_gae(rewards, values, gamma=0.99, lam=0.95):advantages = []A = 0  # 终点 Advantage 设为 0for t in reversed(range(len(rewards))):  # 逆序计算delta = rewards[t] + gamma * values[t+1] - values[t]A = delta + gamma * lam * Aadvantages.insert(0, A)return advantages

这里 λ \lambda λ 控制 bias-variance trade-off,较小的 λ \lambda λ 使 Advantage 计算更稳定。


4. PPO 训练时如何保证时序

在训练 PPO 时,我们通常:

  1. 按时间顺序收集多个完整轨迹
    • 让策略 π θ \pi_\theta πθ 运行一段时间,收集 ( s t , a t , r t , s t + 1 ) (s_t, a_t, r_t, s_{t+1}) (st,at,rt,st+1)
  2. 从后向前计算 Return 和 Advantage
    • 确保 R t R_t Rt A t A_t At 计算正确。
  3. 使用 mini-batch 训练(可随机采样,但不能打乱时序计算)
    • 训练时可以随机打乱 mini-batch,但整个 R t R_t Rt A t A_t At 计算过程必须在打乱前完成。

5. PPO 代码中的时序处理

一个完整的 PPO 采样和训练过程(简化版):

import numpy as np# 假设环境返回的数据
states = np.array([[0,0,3], [0,0,2.9], [0,0,2.8], [0,0,2.7]])  # 无人机的位置
actions = np.array([0, 1, 1, 0])  # 0 = 减小推力, 1 = 增加推力
rewards = np.array([1.0, 0.8, 0.5, 0.2])
values = np.array([2.0, 1.8, 1.3, 0.9, 0.0])  # 价值网络预测的V值# 计算 Return
returns = compute_returns(rewards, gamma=0.99)
print("Returns:", returns)# 计算 GAE Advantage
advantages = compute_gae(rewards, values, gamma=0.99, lam=0.95)
print("Advantages:", advantages)

运行结果:

Returns: [2.27, 1.41, 0.68, 0.2]
Advantages: [0.91, 0.64, 0.38, 0.2]

这个代码确保了 Return 和 Advantage 按时序 计算,并且不会因为 batch 训练而打乱数据


6. 结论

  1. Return( R t R_t Rt)的计算必须保持时序,因为它是未来奖励的加权和,打乱顺序会破坏强化学习的目标。
  2. Return 计算要从后向前遍历,以正确累积未来奖励。
  3. 训练时可以打乱 mini-batch,但计算 Return 和 Advantage 必须在打乱前完成
  4. GAE 也需要按时序计算,确保 Advantage 估计稳定。

如果你对某个部分有疑问,可以进一步深入讨论! 🚀

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

PPO 是一种强化学习算法,用于训练智能体(如无人机)在环境中进行决策。它是策略梯度方法的改进,旨在提高训练稳定性,同时确保策略更新不过大。


PPO 训练过程概览

PPO 旨在找到最优策略,使无人机获得最大累积奖励。其学习过程如下:

1. 采样数据(Collect Data)

策略 π θ \pi_\theta πθ 控制无人机,在环境中执行动作,收集数据:

  • 状态 s t s_t st:位置、姿态、速度
  • 动作 a t a_t at:推力、角速度
  • 奖励 r t r_t rt:基于任务目标计算
  • 下一步状态 s t + 1 s_{t+1} st+1
  • 终止信号(是否结束)

2. 计算目标值(Compute Targets)

  • 回报(Return):
    R t = ∑ l = 0 T − t γ l r t + l R_t = \sum_{l=0}^{T-t} \gamma^l r_{t+l} Rt=l=0Ttγlrt+l
    作用:衡量从时刻 t t t 开始智能体所能获得的未来累积奖励。

  • 价值函数 V θ ( s t ) V_\theta(s_t) Vθ(st) 预测状态的总回报。
    作用:估计在状态 s t s_t st 下的预期累积奖励,辅助策略更新。

  • 优势函数 A t A_t At 衡量动作 a t a_t at 的相对优势:
    A t = R t − V θ ( s t ) A_t = R_t - V_\theta(s_t) At=RtVθ(st)
    作用:评估动作 a t a_t at 相较于均值策略的优劣,决定策略梯度方向。

3. 计算策略更新方向

(1) 概率比(Importance Sampling)

ρ t ( θ ) = π θ ( a t ∣ s t ) π θ old ( a t ∣ s t ) \rho_t(\theta) = \frac{\pi_\theta(a_t \mid s_t)}{\pi_{\theta_{\text{old}}}(a_t \mid s_t)} ρt(θ)=πθold(atst)πθ(atst)
作用:衡量新策略与旧策略对相同动作的选择变化,控制更新幅度。

(2) 剪切损失(Clipped Surrogate Objective)

L CLIP ( θ ) = E t [ min ⁡ ( ρ t ( θ ) A t , clip ⁡ ( ρ t ( θ ) , 1 − ϵ , 1 + ϵ ) A t ) ] L^{\text{CLIP}}(\theta) = \mathbb{E}_t \left[ \min\left( \rho_t(\theta) A_t, \operatorname{clip}\big(\rho_t(\theta), 1-\epsilon, 1+\epsilon\big) A_t \right) \right] LCLIP(θ)=Et[min(ρt(θ)At,clip(ρt(θ),1ϵ,1+ϵ)At)]
作用:限制策略更新幅度,防止剧烈更新导致训练不稳定。

4. 计算价值函数损失

L VF ( θ ) = E t [ ( V θ ( s t ) − R t ) 2 ] L^{\text{VF}}(\theta) = \mathbb{E}_t \left[ \left( V_\theta(s_t) - R_t \right)^2 \right] LVF(θ)=Et[(Vθ(st)Rt)2]
作用:优化价值网络,使其更准确地预测未来累积回报。

5. 计算熵奖励

L entropy ( θ ) = E t [ S ( π θ ( ⋅ ∣ s t ) ) ] L^{\text{entropy}}(\theta) = \mathbb{E}_t \left[ S(\pi_\theta(\cdot \mid s_t)) \right] Lentropy(θ)=Et[S(πθ(st))]
作用:鼓励探索,防止策略过早收敛到次优解。

6. 计算最终损失函数

L ( θ ) = L CLIP ( θ ) − c 1 L VF ( θ ) + c 2 L entropy ( θ ) L(\theta) = L^{\text{CLIP}}(\theta) - c_1 L^{\text{VF}}(\theta) + c_2 L^{\text{entropy}}(\theta) L(θ)=LCLIP(θ)c1LVF(θ)+c2Lentropy(θ)
作用:综合考虑策略优化、价值估计和探索平衡,使训练更加稳定。

7. 神经网络的更新与收敛性

PPO 使用两个神经网络:

  • 策略网络(Policy Network):用于生成动作分布 π θ ( a t ∣ s t ) \pi_\theta(a_t \mid s_t) πθ(atst)
  • 价值网络(Value Network):估计状态 s t s_t st 的价值 V θ ( s t ) V_\theta(s_t) Vθ(st)

更新过程如下:

  1. 计算梯度 ∇ θ L ( θ ) \nabla_\theta L(\theta) θL(θ)
  2. 使用 Adam 优化器进行梯度更新
    θ ← θ + α ∇ θ L ( θ ) \theta \leftarrow \theta + \alpha \nabla_\theta L(\theta) θθ+αθL(θ)
  3. 丢弃旧数据,使用新策略进行下一轮采样

神经网络能够收敛到最优策略的原因

  • 梯度下降法:通过反向传播优化损失函数,使策略不断调整,趋近最优策略。
  • 策略梯度引导:策略更新方向由优势函数 A t A_t At 决定,确保更新是朝着更优的方向。
  • 剪切更新:通过 L CLIP ( θ ) L^{\text{CLIP}}(\theta) LCLIP(θ) 限制更新幅度,确保训练稳定性。
  • 价值函数指导 V θ ( s t ) V_\theta(s_t) Vθ(st) 估计未来回报,引导策略收敛到最优解。
  • 熵正则化:防止早期收敛到次优解,提高策略的探索能力。

结论

  1. Return 必须保持时序,计算时从后向前遍历
  2. GAE 计算也需要时序保证,避免优势估计错误。
  3. PPO 通过剪切策略更新,保持训练稳定
  4. 策略网络和价值网络协同优化,确保学习高效稳定
  5. 策略更新由优势函数、价值函数、熵正则项共同指导,使神经网络能够收敛到最优策略。

如果你对某个部分有疑问,欢迎进一步讨论!🚀


如何让神经网络收敛到能够很好估计出真实的价值?

这里有个问题,为什么神经网络能够用来估计价值,也就是说如何让神经网络收敛到能够很好估计出真实的价值,什么引导神经网络的更新收敛到最优?
红色部分提出了一个关键问题:神经网络如何学会精确地估计价值函数,什么信号驱动其收敛到最优? 以下是详细解答:


1. 有监督学习的回归任务

神经网络估计价值函数主要通过回归任务来实现,也就是说,它需要预测一个连续值(在这里是状态 (s_t) 的总回报 (R_t)),这一过程与传统的监督学习任务类似。具体来说,我们定义了一个均方误差(MSE)损失函数:
L VF ( θ ) = E t [ ( V θ ( s t ) − R t ) 2 ] L^{\text{VF}}(\theta) = \mathbb{E}_t \left[ \left( V_\theta(s_t) - R_t \right)^2 \right] LVF(θ)=Et[(Vθ(st)Rt)2]
在训练过程中,神经网络的输出 (V_\theta(s_t)) 会与从实际采样轨迹中计算出的目标值 (R_t)(或经过TD方法修正的目标值)进行比较,并计算误差。这个误差反过来通过反向传播算法(Backpropagation)传递给网络的各个权重,指导它们调整以最小化误差。


2. 目标值的来源:实际回报 (R_t) 和优势函数

  • 回报 (R_t):由实际采样的奖励序列计算得到,通常使用未来奖励的折扣累积和表示。这种目标值是真实环境反馈的直接体现。
  • 优势函数 (A_t):衡量某个动作相对于当前策略的平均表现。虽然优势函数在更新策略时使用,但它也间接帮助价值函数更精确地衡量不同状态下动作的“好坏”。

这些目标值为神经网络提供了明确的监督信号,使其不断调整预测,使得预测值 (V_\theta(s_t)) 更贴近实际的累积回报。


3. 优化算法和收敛保证

神经网络的参数更新一般使用如 Adam 等优化算法。这些优化算法在不断迭代中,通过梯度下降不断减少损失函数的值,从而使得神经网络输出的预测逐步逼近目标值。只要:

  • 网络容量足够(有足够的参数和非线性表达能力),
  • 学习率及其他超参数调节合理,
  • 数据采样能覆盖环境的多样性,

神经网络就有可能收敛到一个较优的近似值函数。


4. 理论基础:泛化和逼近能力

神经网络具有通用逼近定理的特性,也就是说,只要网络结构足够复杂,就能逼近任意连续函数。在强化学习中,这意味着只要我们有足够的数据和合适的训练机制,神经网络理论上能够学到真实的价值函数映射。


总结

神经网络之所以能够用来估计价值,主要依赖于以下几点:

  • 监督信号(目标值):通过采样得到实际回报 (R_t) 提供明确的训练目标。
  • 损失函数:均方误差损失(MSE)将预测值与目标值之间的误差量化,作为训练信号。
  • 反向传播和梯度下降:利用这些算法对网络参数进行更新,不断减小误差。
  • 网络结构与优化算法:足够的模型容量和适当的优化策略保证了最终网络能逼近真实的价值函数。

因此,正是通过上述机制,神经网络能够逐步调整其参数,从而收敛到一个能够很好估计真实价值的近似解。

相关文章:

强化学习 - PPO控制无人机

PPO&#xff08;Proximal Policy Optimization&#xff0c;近端策略优化&#xff09;是一种强化学习算法&#xff0c;用于训练智能体&#xff08;无人机&#xff09;如何在环境中做出决策。它本质上是 策略梯度&#xff08;Policy Gradient&#xff09;方法 的一种改进&#xf…...

【AHE数据集】 NCAR Anthropogenic Heat Flux (AHF) 数据集

数据概述 数据集由 美国国家大气研究中心(NCAR, National Center for Atmospheric Research) 的 气候与全球动力学实验室(CGD, Climate & Global Dynamics Laboratory) 提供。NCAR 由 美国国家科学基金会(NSF, National Science Foundation) 资助,并由 大学大气研究…...

Part1:基于国内源完成Kubernetes集群部署

集群规划 操作系统&#xff1a;CentOS7 内核版本&#xff1a;5.4&#xff08;需升级&#xff09; 组件版本说明操作系统内核5.4RPM方式升级docker26.1.4yum安装cri-docker0.3.16二进制安装kubeadm1.30.11yum安装kubealet1.30.11yum安装kubectl1.30.11yum安装kubectl1.30.11yu…...

强化学习的一些概念

目录 强化学习 打个比方 核心要素 State Action Reward 几个代码demo 学习目标 强化学习 强化学习&#xff08;Reinforcement Learning, RL&#xff09;是机器学习的一个分支&#xff0c;旨在让智能体&#xff08;Agent&#xff09;通过与环境的交互学习最优策略&#xff0c;以…...

花生好车:重构汽车新零售生态的破局者

在传统汽车零售行业面临消费升级与渠道变革的双重压力下&#xff0c;花生好车以颠覆性的商业模式在短短九年内崛起为行业独角兽。这家成立于2015年的汽车新零售平台&#xff0c;通过重构供应链体系、创新融资租赁模式、深耕下沉市场三大战略维度&#xff0c;正在重塑中国汽车消…...

K8S下nodelocaldns crash问题导致域名请求响应缓慢

前言 最近做项目&#xff0c;有业务出现偶发的部署导致响应很慢的情况&#xff0c;据了解&#xff0c;业务使用域名访问&#xff0c;相同的nginx代理&#xff0c;唯一的区别就是K8S重新部署了。那么问题大概率出现在容器平台&#xff0c;毕竟业务是重启几次正常&#xff0c;偶…...

实现悬浮按钮拖动,兼容h5和微信小程序

h5用js写&#xff0c;微信小程序用 代码里面没有完全实现吸附边缘的功能&#xff0c;需要吸附边缘的话还得自己再完善下&#xff08;h5的吸附边缘是可以的&#xff0c;小程序的还有点问题&#xff09; 主要功能是&#xff1a;图片上写文字的悬浮按钮&#xff0c;文字使用的是…...

SLC跨头协作机制

SLC跨头协作机制 SLC(Self-attention with Local Communication,或类似跨头协作机制)在Transformer架构中通过以下逻辑帮助注意力头优化分布: 1. 多头注意力的「独立-协作」平衡 传统多头注意力中,每个头独立计算注意力(如Query/Key/Value的线性变换),捕捉不同语义模…...

全国医院数据可视化分析系统

【大数据】全国医院数据可视化分析系统 &#xff08;完整系统源码开发笔记详细部署教程&#xff09;✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 &#x1f3e5; 项目名&#xff1a;医疗导航神器&#xff01;——《基于大数据的微医挂号网医院数据可视…...

Flash Attention原理讲解

目录 前言0. 简述1. self-attention2. roofline model3. 矩阵分块4. softmax分块5. FlashAttention结语参考 前言 看了几个视频和几篇文章学习了下 Flash Attention&#xff0c;记录下个人学习笔记&#xff0c;仅供自己参考&#x1f604; refer1&#xff1a;Flash Attention 为…...

python二级复习(1)

临近计算机二级考试了,开始python的复习 python语言基础: 1.用缩进表示代码块:一般用四个空格或者一个tab 2.代码的注释方法: 单行注释用“#”表示注释开始&#xff1b;多行注释是用三个英文的单引号“‘’”或双引号““”"”作为注释的开始和结束符号。 03. 标识符命…...

基于cat1的贵重物品的状态和位置小型监控系统特色解析

一 项目需求 团队研发出来一款搭载多传感器的无线cat1定位和状态监控的设备。该设备主要面对的贵重物品运输过程中的状态监控&#xff0c;比如&#xff0c;是否被打开过&#xff0c;有没有激烈碰撞&#xff0c;位置信息等。主要应用场景是医疗&#xff0c;安防等贵重物品的状态…...

Python 魔法方法介绍

在 Python 中,魔法方法(Magic Methods)是一类特殊的内置方法,它们通常以双下划线开头和结尾(例如 __init__、__str__、__add__ 等)。这些方法通常用于实现特定的语法或操作符行为,或者用于定义对象的行为。它们是 Python 面向对象编程中的一个重要特性,可以让类的行为更…...

golang time包和日期函数

1.简介 在程序中日期和时间是我们经常会用到的&#xff0c;在go中time包提供了时间的显示和测量函数。 2.获取当前时间 通过time.Now()函数获取当前时间对象&#xff0c;然后获取时间对象的年月日时分秒等值。 now : time.Now()fmt.Printf("now%v type%T\n", now…...

第7章 站在对象模型的尖端2: 异常处理

1.异常处理(Exception Handling) C的异常处理由三个主要组成部分构成&#xff1a;throw表达式、catch子句和try块。当异常被抛出时&#xff0c;程序控制权会转移&#xff0c;并且会沿着调用堆栈回溯&#xff0c;直到找到匹配的catch子句。在此过程中&#xff0c;局部对象的析构…...

不同路径——2

给定一个 m x n 的整数数组 grid。一个机器人初始位于 左上角&#xff08;即 grid[0][0]&#xff09;。机器人尝试移动到 右下角&#xff08;即 grid[m - 1][n - 1]&#xff09;。机器人每次只能向下或者向右移动一步。 网格中的障碍物和空位置分别用 1 和 0 来表示。机器人的…...

电子招采软件系统,如何实现10年可追溯审计

一、在当前经济环境下&#xff0c;中小企业面临着巨大的生存压力&#xff0c;传统产业的数字化转型迫在眉睫。AI技术为企业的低成本高效发展提供了新机会&#xff0c;混合办公成为新常态&#xff0c;数据安全法的深入落实则进一步推动企业重视数据安全。区块链存证技术凭借独特…...

TS常见内置映射类型的实现及应用场景

以下是 TypeScript 在前端项目中 常用的映射类型&#xff08;Mapped Types&#xff09;&#xff0c;结合具体场景和代码示例&#xff0c;帮助开发者高效处理复杂类型&#xff1a; 一、基础映射类型 1. Partial<T> 作用&#xff1a;将对象类型 T 的所有属性变为可选。 实…...

本地部署Deep Seek-R1,搭建个人知识库——笔记

目录 一、本地部署 DeepSeek - R1 1&#xff1a;安装Ollama 2&#xff1a;部署DeepSeek - R1模型 3&#xff1a;安装Cherry Studio 二、构建私有知识库 一、本地部署 DeepSeek - R1 1&#xff1a;安装Ollama 1.打开Ollama下载安装 未科学上网&#xff0c;I 先打开迅雷再下…...

东芝2323AMW复印机安装纸盒单元后如何添加配件选项

如何添加请看下面图示&#xff1a; 找到设备和打印机里找到打印机图标&#xff0c;右键打印机属性&#xff0c;找到配置&#xff0c;添加相应配置功能&#xff1b;打印机属性&#xff0c;加上双面或者2纸盒配件选项&#xff1b; Word打印时&#xff0c;打印机名称&#xff0c;后…...

EasyExcel动态拆分非固定列Excel表格

使用EasyExcel动态拆分非固定列Excel表格 在Excel数据解析场景中&#xff0c;​动态列结构拆分是典型挑战&#xff08;如供应链系统中不同品类的属性字段差异较大&#xff09;。传统基于POJO映射的方案无法应对列数量不固定的场景。本方案采用EasyExcel的动态模型解析和Map数据…...

开源WAF雷池本地化部署与远程查看网站安全防护的详细操作指南

文章目录 前言1.关于SafeLine2.安装Docker3.本地部署SafeLine4.使用SafeLine5.cpolar内网穿透工具安装6.创建远程连接公网地址7.固定Uptime Kuma公网地址 前言 各位建站小能手们&#xff0c;无论是想搭建个人博客、企业官网还是各种应用平台来推广自己的内容或产品&#xff0c…...

由一个话题进入DFMEA(设计失效模式及影响分析)

前言 最近看到了知乎的一个话题“为啥撞车后总是看到雨刮器在摆动&#xff1f;”&#xff0c;联想到产品设计中的一些功能安全设计&#xff0c;也借此机会学习DFMEA&#xff0c;讨论一下我个人对于DFMEA的理解。 有纰漏请指出&#xff0c;转载请说明。 学习交流请发邮件 128…...

Redisson 实现分布式锁源码浅析

大家好&#xff0c;我是此林。 今天来分享Redisson分布式锁源码。还是一样&#xff0c;我们用 问题驱动 的方式展开讲述。 1. redis 中如何使用 lua 脚本&#xff1f; Redis内置了lua解释器&#xff0c;lua脚本有两个好处&#xff1a; 1. 减少多次Redis命令的网络传输开销。…...

机试准备第17天

今天进入图论的学习。图论只考察初试学过的算法&#xff0c;一般都是模版题。常见考点有图相关的数据结构——邻接表法&#xff0c;图的遍历 BFS DFS 并查集&#xff0c;单源最短路径迪杰斯特拉。图由顶点和边构成&#xff0c;度用来说明该顶点邻接边的数量情况。权值说明了边的…...

ABAP语言的动态编程(4) - 综合案例:管理费用明细表

本篇来实现一个综合案例&#xff1a;管理费用明细表。报表在实际项目中&#xff0c;也有一定的参考意义&#xff0c;一方面展示类似的报表&#xff0c;比如管理费用、研发费用等费用的明细&#xff0c;使用业务比较习惯的展示格式&#xff1b;另一方面正好综合运用前面学习的动…...

不像人做的题————十四届蓝桥杯省赛真题解析(上)A,B,C,D题解析

题目A&#xff1a;日期统计 思路分析&#xff1a; 本题的题目比较繁琐&#xff0c;我们采用暴力加DFS剪枝的方式去做&#xff0c;我们在DFS中按照8位日期的每一个位的要求进行初步剪枝找出所有的八位子串&#xff0c;但是还是会存在19月的情况&#xff0c;为此还需要在CHECK函数…...

R语言零基础系列教程-01-R语言初识与学习路线

代码、讲义、软件回复【R语言01】获取。 R语言初识 R是一个开放的统计编程环境&#xff0c;是一门用于统计计算和作图的语言。“一切皆是对象”&#xff0c;数据、函数、运算符、环境等等都是对象。易学&#xff0c;代码像伪代码一样简洁&#xff0c;可读性高强大的统计和可视…...

即时通讯平台测试报告

1.项目概述 项目名称&#xff1a;即时通讯平台 版本号&#xff1a;V1.0.0 测试周期&#xff1a;2025年2月25日--2025年3月15日 测试目标&#xff1a;验证核心功能&#xff08;登录、注册、消息收发、用户管理、群组功能等&#xff09;的稳定性和性能指标。 2. 测试范围 功…...

蓝桥杯单片机内存爆了怎么办

蓝桥杯单片机内存爆了怎么办 文章目录 蓝桥杯单片机内存爆了怎么办一、参考文章二、内存区3、keil中的体现4、分配原则5、使用示例 一、参考文章 文章1 文章2 文章3 文章4 二、内存区 1 KB(千字节) 1024 B(字节) B代表Byte&#xff0c;1Byte8bit&#xff0c;一个字节8位 …...

一周热点:微软攻克语音输入、文本输出难题-Phi-4-multimodal

微软Phi-4-multimodal模型是人工智能领域的一个重要进展,它标志着微软在多模态人工智能技术上的突破。以下是对该模型的详细解释: 模型概述 微软Phi-4-multimodal是一个能够同时处理文本、图像和语音的多模态大型语言模型。它通过创新的架构和训练方法,实现了在不同模态之间…...

量化交易学习笔记02:双均线策略

双均线策略示例 个股&#xff1a;中国平安 回测日期&#xff1a;2022-5-1至2023-5-1 短均线&#xff1a;5天 长无线&#xff1a;10天 代码&#xff1a; def initialize(context):# 初始化此策略# 设置我们要操作的股票池, 这里我们只操作一支股票# """标的&qu…...

【WRF-Urban】使用 CGLC-MODIS-LCZ_100m 数据集运行 WRF 时的城市参数化问题

在 WRF 中,LCZ 通过 URBPARM_LCZ.TBL 进行配置,但如果 FRC_URB2D 变量缺失,WRF 会回退到默认的 URBPARM.TBL。 主要问题概述 WRF-Model-cglc-modis-lcz_100m dataset " WARNING, THE URBAN FRACTION WILL BE READ FROM URBPARM.TBL USING DEFAULT URBAN MORPHOLOGY&q…...

Selenium 自动化测试学习总结

大概了解一下即可&#xff0c;现在主要用的自动化工具是 playWright&#xff0c;它可以录制操作。 selenium是老款自动化测试工具&#xff0c;仍有很多可取之处。 安装&#xff1a; pip install selenium即可。然后下载浏览器的驱动包&#xff0c;注意不是浏览器&#xff01;…...

开源通义万相本地部署方案,文生视频、图生视频、视频生成大模型,支持消费级显卡!

开源通义万相本地部署方案&#xff0c;文生视频、图生视频、视频生成大模型&#xff0c;支持消费级显卡&#xff01; 万相2.1开源 近日&#xff0c;大模型万相2.1&#xff08;Wan&#xff09;重磅开源&#xff0c;此次开源采用Apache2.0协议&#xff0c;14B和1.3B两个参数规格…...

Suno的对手Luno:AI音乐开发「上传参考音频 - 方式一:通过二进制流的方式」 —— 「Luno Api系列|AI音乐API」第11篇

导读 今天来看下Luno Api的上传参考音频 - 方式一&#xff1a;通过二进制流的方式。 参考文件&#xff0c;主要是用于在创作的过程中&#xff0c;希望AI参考这个音乐的曲风和声音来进行创作&#xff0c;那么可以通过上传参考音乐来进行实现。 申请和使用 「已经有API的&…...

微信小程序刷题逻辑实现:技术揭秘与实践分享

页面展示&#xff1a; 概述 在当今数字化学习的浪潮中&#xff0c;微信小程序以其便捷性和实用性&#xff0c;成为了众多学习者刷题备考的得力工具。今天&#xff0c;我们就来深入剖析一个微信小程序刷题功能的实现逻辑&#xff0c;从代码层面揭开其神秘面纱。 小程序界面布局…...

巴耶赫利专业俄语外贸网站建设

巴耶赫利是专业俄语外贸网站建设与俄语搜索引擎Yandex SEO优化服务商。巴耶赫利致力于帮助中国品牌出海俄罗斯&#xff0c;打开俄罗斯市场&#xff0c;提升品牌在俄罗斯的知名度和美誉度。 以下是对巴耶赫利相关服务的详细介绍&#xff1a; 一、巴耶赫利专业俄语外贸网站建设…...

每日Attention学习25——Multi-Scale Attention Fusion

模块出处 [TCSVT 24] [link] [code] DSNet: A Novel Way to Use Atrous Convolutions in Semantic Segmentation 模块名称 Multi-Scale Attention Fusion (MSAF) 模块作用 双级特征融合 模块结构 模块思想 MSAF的主要思想是让网络根据损失学习特征权重&#xff0c;允许模型…...

前端学习记录:解决路由缓存问题

问题描述&#xff1a;响应路由参数的变化&#xff0c;使用带有参数的路由时需要注意的是&#xff0c;当用户从 /users/johnoy 导航到 /users/jolyne 时&#xff0c;相同的组件实例将会被重复使用。因为两个路由都渲染同个组件&#xff0c;比起销毁再创建&#xff0c;复用则显得…...

VSTO(C#)Excel开发10:启动和卸载顺序 事件处理 监视变化

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…...

代码随想录Day16

Day16 二叉树part06 LeetCode 530.二叉搜索树的最小绝对差 题目描述 给你一个二叉搜索树的根节点 root &#xff0c;返回 树中任意两不同节点值之间的最小差值 。 差值是一个正数&#xff0c;其数值等于两值之差的绝对值。 示例 输入&#xff1a;root [4,2,6,1,3] 输出&…...

第15章:ConvNeXt图像分类实战:遥感场景分类【包含本地网页部署、迁移学习】

目录 1. ConvNeXt 模型 2. 遥感场景建筑识别 2.1 数据集 2.2 训练参数 2.3 训练结果 2.4 本地部署推理 3. 下载 1. ConvNeXt 模型 ConvNeXt是一种基于卷积神经网络&#xff08;CNN&#xff09;的现代架构&#xff0c;由Facebook AI Research (FAIR) 团队在2022年提出。…...

LinuX---Shell脚本创建和执行

概述&#xff1a; 它是一个命令行解释器&#xff0c;接收应用程序/用户命令&#xff0c;然后调用操作系统内核。 Shell还是一个功能强大的编程语言&#xff0c;易编写、易调试、灵活性强。 Linux提供的Shell解析器有 atguiguubuntu:~$ cat /etc/shells # /etc/shells: valid …...

django+vue3实现前后端大文件分片下载

效果&#xff1a; 大文件分片下载支持的功能&#xff1a; 展示目标文件信息提高下载速度&#xff1a;通过并发请求多个块&#xff0c;可以更有效地利用网络带宽断点续传&#xff1a;支持暂停后从已下载部分继续&#xff0c;无需重新开始错误恢复&#xff1a;单个块下载失败只…...

KY-038 声音传感器如何工作以及如何将其与 ESP32 连接

想为您的项目赋予声音感!然后跟着做,因为在这个项目中,我们将连接一个声音传感器,用它构建一些有趣的项目。我们使用的 KY-038 声音传感器使用电容式麦克风来检测声波,这为我们提供了稳定性和可靠性的完美平衡。因此,在本文中,我们决定将 KY-038 传感器与 ESP32 连接,并…...

深入剖析二分查找的延伸:在排序数组中查找元素的第一个和最后一个位置

深入剖析二分查找的延伸&#xff1a;在排序数组中查找元素的第一个和最后一个位置 引言 二分查找&#xff0c;作为算法界的“常青树”&#xff0c;以其高效性和简洁性备受青睐。然而&#xff0c;许多初学者仅限于使用它查找单个元素&#xff0c;而对其进阶应用知之甚少。今天…...

UE5中 Character、PlayerController、PlayerState、GameMode和GameState核心类之间的联动和分工·

1. GameMode 与 GameState 关系描述 GameMode&#xff1a;定义游戏规则和逻辑&#xff0c;控制游戏的开始、进行和结束。GameState&#xff1a;存储和同步全局游戏状态&#xff0c;如得分、时间、胜利条件等。 联动方式 GameMode初始化GameState&#xff1a;GameMode在游戏…...

使用Python获取并操作1688自定义API接口

在电子商务领域&#xff0c;1688作为国内领先的B2B平台&#xff0c;提供了丰富的API接口&#xff0c;允许开发者获取商品信息、店铺信息等。其中&#xff0c;custom接口允许开发者进行自定义操作&#xff0c;获取特定的数据。本文将详细介绍如何使用Python调用1688的custom接口…...

【AI】现代人工智能技术的应用与发展

引言 人工智能&#xff08;AI&#xff09;已经深入到我们生活的各个方面&#xff0c;涉及医疗、教育、交通、金融等众多领域。随着技术的不断发展&#xff0c;AI的应用和潜力也变得愈加广泛。本文将详细介绍人工智能的应用领域&#xff0c;探讨未来的发展趋势&#xff0c;并通…...