神经网络:delta规则与广义delta规则以及利用SGD,Batch实现delta方法(python代码)

delta规则:

    如果一个输入节点导致一个输出临界点产生误差,则这两个节点之间的权重将根据输入值xj和输出偏差ei成比例地进行调整。该规则可以用公式表现为:

    wij = wij +a*ei*xj;

   其中:

    xj=输入节点的输出(j=1,2,3)

    ei=输出节点i的误差

    wij=输出节点i和输入节点j之间的权重

    a=学习率(0<=a<1)

    ei = di -yi      di表示的是标准输出,yi表示的是输出

使用delta规则训练过程概括如下:

    (1) 以合适的值初始化权值

    (2)从训练数据中获取“输入”,格式为{input,correct,output},并将其输入到神经网络。计算出输出yi与输入所对应的标准输出di的误差。

    (3)根据以下delta规则计算权重的更新:

             @wij = a*ei*xj;

      (4)  将权值调整为:

               wij = wij+a*ei*xj

      (5) 对所有训练数据执行步骤2~4

      (6) 重复步骤2~5直到误差达到可容忍的等级

广义delta规则:

    对于任何的激活函数,delta规则可用以下式子表示:

         wij = wij + a*bi*xj

         bi = z'(vi)*ei

### 使用PPO算法实现卫星博弈训练 #### 构建环境模型 为了应用PPO(Proximal Policy Optimization)算法进行卫星博弈的训练,构建一个精确反映实际操作条件的模拟环境至关重要。该环境中应包含所有可能影响决策的因素,例如不同轨道上的LEO卫星位置变化、信号强度波动以及地面站的需求动态等[^3]。 #### 定义智能体结构 智能体的设计需适应特定的应用场景,在此案例中即为卫星地面间的交互过程。考虑到卫星边缘网络的特点及其所承载的任务性质,采用深度神经网络来表示策略函数π(a|s),其中a代表动作而s则是观测到的状态向量;此外还需引入价估计V(s)以评估当前状态下采取任意行动所能获得预期回报总和的能力[^1]。 #### 经验池管理机制 定义经验池`replay_buffer`用于存储智能体在环境中的训练数据,包括但不限于奖励r、状态s及对应的动作a等信息。这一步骤对于后续利用历史样本优化参数更新具有重要意义。每次迭代过程中都会从这个集合里随机抽取一批次的数据来进行梯度下降法的学习过程[^2]: ```python class ReplayBuffer: def __init__(self, capacity): self.buffer = deque(maxlen=capacity) def push(self, state, action, reward, next_state, done): experience = (state, action, np.array([reward]), next_state, done) self.buffer.append(experience) def sample(self, batch_size): experiences = random.sample(self.buffer, batch_size) states, actions, rewards, next_states, dones = zip(*experiences) return np.array(states), actions, np.array(rewards), np.array(next_states), dones def __len__(self): return len(self.buffer) ``` #### PPO算法核心逻辑 基于上述准备工作之后,则可正式进入PPO算法的核心部分——通过交替执行采样阶段(收集轨迹片段并保存至缓冲区)、优化阶段(调整策略网络重直至收敛),从而逐步提升整体性能表现水平。具体来说就是重复如下循环直到满足终止条件为止: - **采样**: 让智能体按照现有行为准则探索未知领域,并记录下每一次尝试的结果; - **计算优势(GAE)**: 利用广义优势估计方法得到各时间步的优势得分A_t; - **损失函数构建**: 结合CLIP目标其他附加项共同构成最终待最小化的目标表达式L(θ)=E[-min(ratio·At , clip(ratio, 1−ε, 1+ε)·At)]; - **反向传播求解最优解**: 应用Adam/Stochastic Gradient Descent(SGD)等方式沿负梯度方向修改变量取范围内的数大小,使得期望收益最大化的同时保持新旧概率分布间差异不超过预设阈&delta;。 ```python import torch.optim as optim from torch.distributions import Categorical def compute_gae(next_value, rewards, masks, values, gamma=0.99, tau=0.95): values = values + [next_value] gae = 0 returns = [] for step in reversed(range(len(rewards))): delta = rewards[step] + gamma * values[step + 1] * masks[step] - values[step] gae = delta + gamma * tau * masks[step] * gae returns.insert(0, gae + values[step]) return returns def ppo_iter(mini_batch_size, states, actions, log_probs, returns, advantage): batch_size = states.size(0) for _ in range(batch_size // mini_batch_size): rand_ids = np.random.randint(0, batch_size, mini_batch_size) yield states[rand_ids, :], actions[rand_ids], log_probs[rand_ids], returns[rand_ids], advantage[rand_ids] def ppo_update(policy_net, value_net, optimizer_policy, optimizer_value, replay_buffer, n_updates, mini_batch_size, epsilon_clip=0.2): # Prepare data from buffer states, actions, old_logprobs, returns, advantages = map(torch.stack, zip(*replay_buffer)) # Normalize the advantages to reduce variance and improve stability. advantages = (advantages - advantages.mean()) / (advantages.std() + 1e-8) for update in range(n_updates): for state, action, old_logprob, ret, adv in ppo_iter(mini_batch_size, states, actions, old_logprobs, returns, advantages): dist = policy_net(state) entropy = dist.entropy().mean() new_logprob = dist.log_prob(action).sum(dim=-1) ratio = (new_logprob - old_logprob.detach()).exp() surr1 = ratio * adv surr2 = torch.clamp(ratio, 1.0 - epsilon_clip, 1.0 + epsilon_clip) * adv actor_loss = (-torch.min(surr1, surr2)).mean() critic_loss = F.mse_loss(value_net(state), ret.unsqueeze(-1)) total_loss = actor_loss + 0.5*critic_loss - 0.01*entropy optimizer_policy.zero_grad() optimizer_value.zero_grad() total_loss.backward(retain_graph=True) optimizer_policy.step() optimizer_value.step() policy_network = ... # Define your neural network architecture here value_network = ... # Similarly define another one or share parameters with policy net depending upon design choice. optimizer_actor = optim.Adam(policy_network.parameters(), lr=learning_rate) optimizer_critic = optim.Adam(value_network.parameters(), lr=learning_rate) for episode in episodes: ... replay_buffer.push(current_state, chosen_action, received_reward, next_observation, terminal_flag) if enough_samples_collected(): ppo_update(policy_network, value_network, optimizer_actor, optimizer_critic, replay_buffer.get_all_data(), num_epochs, minibatch_sz) ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值