强化学习 - 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 πθ 选择 未来回报最高的动作,因此需要估计:
-
回报(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=0∑T−tγlrt+l
其中 γ ∈ ( 0 , 1 ] \gamma \in (0,1] γ∈(0,1] 是折扣因子,表示未来奖励的重要性。 -
价值函数 V θ ( s t ) V_\theta(s_t) Vθ(st) 估计当前状态的总回报
- 价值网络 V θ V_\theta Vθ 通过神经网络预测 R t R_t Rt。
-
优势函数 A t A_t At(Advantage):
A t = R t − V θ ( s t ) A_t = R_t - V_\theta(s_t) At=Rt−Vθ(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 是坏动作。
- 它衡量了 当前动作 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πθ(at∣st)⋅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(at∣st)πθ(at∣st)
它衡量了 新策略 π θ \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} 1e−4)。
- 由于 PPO 是 on-policy 算法,每次更新后,必须丢弃旧数据并重新采样。
PPO 训练全流程总结
- 使用当前策略 π θ 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,…}。
- 计算回报 R t R_t Rt、优势 A t A_t At,并更新价值网络 V θ ( s t ) V_\theta(s_t) Vθ(st)。
- 计算策略概率比 ρ t ( θ ) \rho_t(\theta) ρt(θ),并使用剪切损失 L CLIP L^{\text{CLIP}} LCLIP 限制策略更新幅度。
- 计算价值网络的损失 L VF L^{\text{VF}} LVF。
- 计算熵奖励 L entropy L^{\text{entropy}} Lentropy,鼓励探索。
- 更新神经网络参数 θ \theta θ,优化 L ( θ ) L(\theta) L(θ)。
- 丢弃旧数据,使用新策略重新采样,重复以上过程。
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 的训练过程可以简化为:
- 采样轨迹数据 { s t , a t , r t } \{s_t, a_t, r_t\} {st,at,rt}。
- 计算 Advantage: A t = R t − V θ ( s t ) A_t = R_t - V_\theta(s_t) At=Rt−Vθ(st)。
- 计算 PPO 剪切目标 L CLIP ( θ ) L^{\text{CLIP}}(\theta) LCLIP(θ)。
- 计算价值函数损失 L VF L^{\text{VF}} LVF。
- 计算熵奖励 L entropy L^{\text{entropy}} Lentropy。
- 更新神经网络参数 θ \theta θ。
- 重复以上步骤,直到无人机学会任务。
🚀🚀🚀🚀🚀🚀🚀
回报(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+⋯+γT−trT
其中:
- 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 |
|---|---|
| 0 | 1.0 |
| 1 | 0.8 |
| 2 | 0.5 |
| 3 | 0.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. 保持时序的重要性
强化学习中的数据是 时间序列数据,不能像监督学习那样随机打乱,否则:
- Return 计算会出错:Return 依赖于未来的奖励,如果打乱顺序,Return 就变成了随机数,没有意义。
- 策略学习会失败:智能体需要学习 动作 a t a_t at 会如何影响未来状态 s t + 1 s_{t+1} st+1,如果数据顺序混乱,策略无法正确学习因果关系。
- 优势估计 A t A_t At 会混乱:PPO 需要计算优势 A t = R t − V ( s t ) A_t = R_t - V(s_t) At=Rt−V(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=0∑T−t(γλ)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 时,我们通常:
- 按时间顺序收集多个完整轨迹:
- 让策略 π θ \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)。
- 从后向前计算 Return 和 Advantage:
- 确保 R t R_t Rt 和 A t A_t At 计算正确。
- 使用 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. 结论
- Return( R t R_t Rt)的计算必须保持时序,因为它是未来奖励的加权和,打乱顺序会破坏强化学习的目标。
- Return 计算要从后向前遍历,以正确累积未来奖励。
- 训练时可以打乱 mini-batch,但计算 Return 和 Advantage 必须在打乱前完成。
- 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=0∑T−tγ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=Rt−Vθ(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(at∣st)πθ(at∣st)
作用:衡量新策略与旧策略对相同动作的选择变化,控制更新幅度。
(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) πθ(at∣st)。
- 价值网络(Value Network):估计状态 s t s_t st 的价值 V θ ( s t ) V_\theta(s_t) Vθ(st)。
更新过程如下:
- 计算梯度 ∇ θ L ( θ ) \nabla_\theta L(\theta) ∇θL(θ)。
- 使用 Adam 优化器进行梯度更新:
θ ← θ + α ∇ θ L ( θ ) \theta \leftarrow \theta + \alpha \nabla_\theta L(\theta) θ←θ+α∇θL(θ) - 丢弃旧数据,使用新策略进行下一轮采样。
神经网络能够收敛到最优策略的原因:
- 梯度下降法:通过反向传播优化损失函数,使策略不断调整,趋近最优策略。
- 策略梯度引导:策略更新方向由优势函数 A t A_t At 决定,确保更新是朝着更优的方向。
- 剪切更新:通过 L CLIP ( θ ) L^{\text{CLIP}}(\theta) LCLIP(θ) 限制更新幅度,确保训练稳定性。
- 价值函数指导: V θ ( s t ) V_\theta(s_t) Vθ(st) 估计未来回报,引导策略收敛到最优解。
- 熵正则化:防止早期收敛到次优解,提高策略的探索能力。
结论
- Return 必须保持时序,计算时从后向前遍历。
- GAE 计算也需要时序保证,避免优势估计错误。
- PPO 通过剪切策略更新,保持训练稳定。
- 策略网络和价值网络协同优化,确保学习高效稳定。
- 策略更新由优势函数、价值函数、熵正则项共同指导,使神经网络能够收敛到最优策略。
如果你对某个部分有疑问,欢迎进一步讨论!🚀
如何让神经网络收敛到能够很好估计出真实的价值?
这里有个问题,为什么神经网络能够用来估计价值,也就是说如何让神经网络收敛到能够很好估计出真实的价值,什么引导神经网络的更新收敛到最优?
红色部分提出了一个关键问题:神经网络如何学会精确地估计价值函数,什么信号驱动其收敛到最优? 以下是详细解答:
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(Proximal Policy Optimization,近端策略优化)是一种强化学习算法,用于训练智能体(无人机)如何在环境中做出决策。它本质上是 策略梯度(Policy Gradient)方法 的一种改进…...
QT 磁盘文件 教程03-创建、删除、复制文件
【1】新建文件 bool CreateFile(QString name){QString fileName name ; //"文件绝对路径名"QFile file(fileName);QFileInfo fileInfo(file);QString fileExtension fileInfo.suffix();if(fileExtension.isEmpty()) {fileName".txt";}file.setFileName…...
Netty基础—NIO的使用简介
1.Buffer缓冲区 (1)Buffer缓冲区的作用 在NIO中,所有的数据都是通过使用Buffer缓冲区来处理的。如果要通过NIO,将数据写到文件和网络或从文件和网络中读取数据,那么就需要使用Buffer缓冲区来进行处理。 (2)Buffer缓冲区的4个核心概念 Buffer缓…...
Matlab 汽车ABS实现模糊pid和pid控制
1、内容简介 Matlab 181-汽车ABS实现模糊pid和pid控制 可以交流、咨询、答疑 2、内容说明 略 实现汽车防抱死制动系统(ABS)的控制算法,通常涉及到传统的PID控制和模糊PID控制两种方法。下面将分别介绍这两种控制策略的基本概念以及如何在M…...
驾驭数据洪流:实时数据分析与流处理技术的革命
驾驭数据洪流:实时数据分析与流处理技术的革命 在现代社会,数据不再是冷冰冰的存储单位,而是实时运转的“生命体”。从电商交易监控、社交媒体互动,到自动驾驶决策,我们正被无数实时数据所包围。与此同时,实时数据分析和流处理技术应运而生,成为解决这一时代难题的关键…...
Muon: An optimizer for hidden layers in neural networks
引言 在深度学习领域,优化算法对模型训练效率和性能起着关键作用。从经典的随机梯度下降 (SGD) 及其动量法,到自适应优化方法 Adam/AdamW 等,一系列优化器大大加速了神经网络的收敛。然而,随着模型规模和数据量的爆炸式增长&…...
网络安全运维应急响应与溯源分析实战案例
在日常运维过程中,网络安全事件时有发生,快速响应和精准溯源是保障业务稳定运行的关键。本文将通过一个实际案例,详细解析从发现问题到溯源定位,再到最终解决的完整流程。 目录 一、事件背景 二、事件发现 1. 监控告警触发 2…...
【VSCODE 插件 可视化】:SVG 编辑插件 SVG Editor
插件下载 svgeditor 创建文件 Windows/Linux 快捷键 Ctrl Shift P 打开VSCODE 命令面板查找 New File With Svg Editor 编辑文件 保存文件 打开文件以继续编辑 CG 选中多个:shift单击没找到横向分布功能无法用键盘微调位置...
Cursor插件市场打不开解决
问题现象: cursor搜索插件的时候提示错误,无法搜索安装插件 error while fetching extensions.failed to fetch 问题原因 cursor默认安装使用的并不是vs code的插件市场,国内网络有时候打不开 解决 修改插件市场地址并重启cursor 打开cur…...
嵌入式开发之STM32学习笔记day06
基于STM32F103C8T6的开发实践——从入门到精通01 1. 引言 STM32系列微控制器是STMicroelectronics推出的一款高性能、低功耗的32位微控制器,广泛应用于嵌入式系统中。STM32F103C8T6是其中非常受欢迎的一款,凭借其强大的性能、丰富的外设接口和低廉的价格…...
K8S学习之基础三十五:k8s之Prometheus部署模式
Prometheus 有多种部署模式,适用于不同的场景和需求。以下是几种常见的部署模式: 1. 单节点部署 这是最简单的部署模式,适用于小型环境或测试环境。 特点: 单个 Prometheus 实例负责所有的数据采集、存储和查询。配置简单&…...
AI驱动的视频字幕提取与翻译工具
青梧字幕是一款基于Whisper技术的AI字幕提取工具,专为视频制作者、翻译人员和自媒体创作者设计。它通过先进的语音识别算法,能够自动从视频文件中提取字幕内容,并支持多种语言和字幕格式,极大地简化了字幕制作流程。 目前暂支持 …...
Android ARouter的详细使用指南
Android ARouter的详细使用指南。我需要先确定用户的基础,可能他们已经有Android开发经验,但对ARouter不太熟悉。首先,我应该介绍ARouter是什么,解决什么问题,比如模块化中的页面跳转问题。然后,需要分步骤…...
【MySQL】MySQL审计工具Audit Plugin安装使用
MySQL审计工具Audit Plugin安装使用 https://www.cnblogs.com/waynechou/p/mysql_audit.html MySQL 5.6 开启审计功能 https://blog.51cto.com/u_15127556/4344503 MySQL之添加日志审计功能 https://blog.csdn.net/weixin_43279032/article/details/105507170 MySQL开启日志记录…...
游戏引擎学习第163天
我们可以在资源处理器中使用库 因为我们的资源处理器并不是游戏的一部分,所以它可以使用库。我说过我不介意让它使用库,而我提到这个的原因是,今天我们确实有一个选择——可以使用库。 生成字体位图的两种方式:求助于 Windows 或…...
JVM常用概念之锁省略
问题 synchronized(同步-重量级锁)会解除所有编译器优化吗? 基础知识 使用当前的 Java 内存模型,未观察到的锁不一定会产生任何内存效应。除其他情况外,这意味着对非共享对象进行同步是徒劳的,因此运行时不必在那里做任何事情。这给编译优…...
用python代码将excel中的数据批量写入Json中的某个字段,生成新的Json文件
需求 需求: 1.将execl文件中的A列赋值给json中的TrackId,B列赋值给json中的OId 要求 execl的每一行,对应json中的每一个OId json 如下: {"List": [{"BatchNumber": "181-{{var}}",// "Bat…...
《我的Python觉醒之路》之转型Python(十五)——控制流
[今天是2025年3月17日,继续复习第一章节、第二章节的内容 ] 《我的Python觉醒之路》之转型Python(十四)——控制流...
路由器与防火墙配置命令
路由器与防火墙配置命令 小明啊,你不是学计算机的嘛,叔叔家的路由器坏了,可以过来帮叔叔看看吗 命令可以用缩写,造就一堆容易造成歧义的缩写,比如add是address的缩写,sh是shutdown的缩写。 默认为Cisco路…...
PosterRender 实现微信下程序 分享商品生成海报
PosterRender 是什么 PosterRender 是一种专注于生成高质量海报图像的技术或工具,常用于生成静态图片,特别是适合用于营销、宣传和展示的图形设计。它通常用于在服务端或客户端渲染复杂的图像,包括文字、图形、图标、背景等,生成…...
C语言及内核开发中的回调机制与设计模式分析
在C语言以及操作系统内核开发中,回调机制是一种至关重要的编程模式。它通过注册框架和定义回调函数,实现了模块间的解耦和灵活交互,为系统的扩展性和可维护性提供了有力支持。本文将深入探讨这种机制的工作原理、应用场景以及与设计模式的关联。 一、回调机制的核心概念 (…...
第27周JavaSpringboot git初识
Git 课程笔记 一、Git 的介绍 1. Git 的诞生背景 Git 是 Linux 内核的作者 Linus Torvalds 为了更好地管理 Linux 内核开发而创建的版本控制系统。在 Linux 内核开发初期,由于开发者众多,协作成本很高,后来使用了 BitKeeper 工具来辅助协作…...
代码随想录算法训练营第34天 | 62.不同路径 63. 不同路径 II 整数拆分 不同的二叉搜索树 (跳过)
62.不同路径 62. 不同路径 - 力扣(LeetCode) 本题大家掌握动态规划的方法就可以。 数论方法 有点非主流,很难想到。 代码随想录 视频讲解:动态规划中如何初始化很重要!| LeetCode:62.不同路径_哔哩哔哩_b…...
Java使用JDBC连接操作Sqlite 笔记250314
Java使用JDBC连接操作Sqlite 以下是使用 Java JDBC 连接和操作 SQLite 数据库的详细步骤: 1. 添加 SQLite JDBC 驱动 在项目中引入 SQLite JDBC 驱动依赖。 Maven 项目在 pom.xml 中添加:<dependency><groupId>org.xerial</groupId>…...
消息队列导致数据库数据读取不一致解决方案
我使用的是在数据库添加一个版本字段,记录版本,保证版本一致性,就能保证每次读取的是需要的内容。 具体问题:使用消息队列时,发送方给接收方发送消息,接收方修改了数据库的同时发送方查询数据库࿰…...
如何利用 Zeabur 实现 OceanBase 的一键部署
引言 Zeabur 是一个功能强大且即开即用的自动化部署平台,它不仅能迅速部署多种应用,还支持一键安装 MySQL、PostgreSQL 等数据库服务。 Zeabur 拥有众多国内外用户,如 AFFiNE、Bytebase 等企业客户,以及大量全栈和独立开发者。将…...
计算机网络进化论:从比特流到量子通信的深层解构
第一章 物理媒介与链路层(1960-1970) 1.1 比特流物理编码 // 曼彻斯特编码实现 vector<bool> manchester_encode(uint8_t byte) {vector<bool> bits;for(int i=7; i>=0; --i) {bool bit = (byte >> i) & 1;bits.push_back(bit); // 前半周期bits…...
超参数优化算法:scikit-opt库、Scikit-Optimize库
1 scikit-opt库:https://www.cnblogs.com/luohenyueji/p/18333387 https://blog.csdn.net/weixin_45750972/article/details/124683402 a 差分进化算法 (Differential Evolution):一种基于群体搜索的优化算法,通过模拟生物进化的过程来寻找最…...
go语言学习教程推荐,零基础到做项目
一、基础入门阶段 官方教程(免费) • A Tour of Go:交互式入门教程,边学边练 • Go by Example:通过300代码片段学习语法 入门书籍 • 📘《Go语言圣经》中文版(免费在线阅读)&#…...
【商城实战(30)】从0到1搭建商城数据分析功能,开启数据驱动增长引擎
【商城实战】专栏重磅来袭!这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建,运用 uniapp、Element Plus、SpringBoot 搭建商城框架,到用户、商品、订单等核心模块开发,再到性能优化、安全加固、多端适配…...
