惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

量子位
Recent Announcements
Recent Announcements
D
Docker
V
V2EX
阮一峰的网络日志
阮一峰的网络日志
Vercel News
Vercel News
Microsoft Security Blog
Microsoft Security Blog
The GitHub Blog
The GitHub Blog
U
Unit 42
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
月光博客
月光博客
腾讯CDC
B
Blog
博客园_首页
罗磊的独立博客
D
DataBreaches.Net
IT之家
IT之家
酷 壳 – CoolShell
酷 壳 – CoolShell
L
LangChain Blog
aimingoo的专栏
aimingoo的专栏
MongoDB | Blog
MongoDB | Blog
GbyAI
GbyAI
Stack Overflow Blog
Stack Overflow Blog
M
MIT News - Artificial intelligence

博客园 - Angry_Panda

军事防务 —— 城市反无 —— 无线电侦测设备需要进行攻击目标分配吗?无线电侦测设备的调度在应用中是需要在部署时进行考虑还是在攻击时进行考虑 从一张AI合成的无人机救援图说起 —— 多人机协作的可行性 985大学不相信眼泪,信奉丛林法则;211大学更讲人情味 军事防务 —— 反无激光武器攻后的冷却和充能时间与其攻击的持续时长是否有关系 军事防务 —— 北京顺义李桥镇 (AI大模型生成答案)—— 反无激光武器攻后的冷却和充能时间与其攻击的持续时长是否有关系 军事防务:激光武器的参数 武器装备参数介绍 军事防务:城市反无 —— 无线电干扰设备的攻击范围 百家讲坛 —— 再度翻红 —— 长大后才发现最好的教育早已播下种子,只等阅历浇灌才真正发芽 军事防务 —— AFSim雷达传感器仿真技术 防务 —— 军事建模AFSIM —— 电磁波 为什么倒卖 军火最赚钱 —— 从防务公司的业务发展来看待军费问题 防务:防务业务 —— 武器开火后的返回结果 —— 武器结果:0=开火, 1=命中, 2=未命中 豆包AI回答 —— 为什么城市反无场景下无线电干扰设备即使击中目标也会一直攻击呢 防务:雷达和光电探测设备 —— 无人机的轨迹信息与真实位置信息的差异性,是根据随机函数来实现的吗,比如在真实位置上加一点的随机扰动吗 —— AFsim的手册 北京市顺义区李桥镇 —— 中科星图公司 —— 出行路线交通 —— “东方通勤车”(误区,“东方通勤车”的站点根本就找不到,如果不坐地铁,那么就坐850号公交) 北京市顺义区李桥镇(首都机场附件)—— 中科星图(星图防务) 公司宿舍 【转载】cessium python部署离线版本 ———— 如何使用Python操作三维地图 cessium —— cessium python部署离线版本 如何使用uv安装pytorch 基于GA-BP神经网络的防空导弹实时目标分配方法 【人生哲理】【视频】为什么说该花的钱不花,就会变成灾难呢? 随身移动WiFi ——50元级别的(三网 4G移动网络)—— 网速测试 豆包AI —— 为什么不把离散的状态空间属性用one-shot方式编码而是直接归一化为0到1范围的属性值 dogfight问题中(UAV 无人机空战——狗斗)—— 状态空间设计 为ubuntu系统安装samba网络磁盘,实现局域网中的共享网络磁盘 —— 跨系统文件共享的完整方案 sudo fwupdmgr get-upgrades —— 在 Linux 系统中,用 fwupd 工具查看当前机器所有可升级固件(BIOS/UEFI、SSD、雷电、外设等) git免密认证同步仓库代码报错——git@github.com: Permission denied (publickey) —— 所需的ssh-add加载加密私钥 —— 指定加密私钥存储位置 【转载】 执行 ssh-add 报错 Could not open a connection to your authentication agent —— git免密认证同步仓库代码,所需的ssh-add加载加密私钥 uv python环境管理工具 ubuntu系统python安装pycairo报错:Run-time dependency python found: NO (tried pkgconfig and sysconfig)
强化学习算法 —— 带自适应步长的策略梯度算法(PG算法、Adapt...
Angry_Panda · 2026-05-09 · via 博客园 - Angry_Panda

Adaptive step size for Adam optimizer

Adam stepsize was adjusted based on the target value of the KL divergence

vanilla policy gradient with adaptive stepsize3, After each batch of data, the Adam stepsize is adjusted based on the KL divergence of the original and updated
policy, using a rule similar to the one shown in Section 4. An implementation is available at https://github.com/berkeleydeeprlcourse/homework/tree/master/hw4.

中文精准翻译

带自适应步长的原始策略梯度算法:每收集完一批数据后,依据旧策略与更新后策略之间的 KL 散度,对 Adam 优化器的步长进行自适应调整,所采用的调整规则与第 4 节给出的规则类似。相关实现代码可在以下 GitHub 仓库获取:
https://github.com/berkeleydeeprlcourse/homework/tree/master/hw4

自适应步长策略梯度(Vanilla PG + KL 控制学习率)完整实现
这就是伯克利深度强化学习课程 HW4 的核心算法:
基于策略 KL 散度自动调学习率,策略更新太大就缩小 lr,太小就放大 lr,完美稳定训练。
我直接给你可运行、极简、注释完整的实现。
核心思想(一句话)
用普通策略梯度(REINFORCE)更新策略
计算更新前 vs 更新后策略的 KL 散度
根据 KL 大小自动调整 Adam 学习率:
KL > 目标 → 学习率太大,缩小
KL < 目标 → 学习率太小,放大
KL 正常 → 不动

image

豆包AI生成下面代码:

import torch
import torch.nn as nn
import torch.optim as optim
from torch.distributions import Categorical
import numpy as np

# ==============================
# 1. 策略网络(最简单的线性/MLP)
# ==============================
class PolicyNet(nn.Module):
    def __init__(self, obs_dim, act_dim):
        super().__init__
        self.fc = nn.Sequential(
            nn.Linear(obs_dim, 64),
            nn.Tanh(),
            nn.Linear(64, act_dim)
        )

    def forward(self, x):
        logits = self.fc(x)
        return logits

# ==============================
# 2. 自适应步长策略梯度(核心)
# ==============================
class AdaptiveStepPG:
    def __init__(
        self,
        obs_dim,
        act_dim,
        lr=1e-2,         # 初始学习率
        target_kl=0.01,  # KL 目标值(最重要超参)
        kl_coeff=1.5     # 学习率缩放系数
    ):
        self.policy = PolicyNet(obs_dim, act_dim)
        self.target_kl = target_kl
        self.kl_coeff = kl_coeff

        # 使用 Adam,**手动控制 lr**
        self.optimizer = optim.Adam(self.policy.parameters(), lr=lr)
        self.lr = lr

    # --------------------------
    # 策略更新 + KL 计算 + 自适应调 lr
    # --------------------------
    def update(self, obs, acts, advs):
        obs = torch.FloatTensor(obs)
        acts = torch.LongTensor(acts)
        advs = torch.FloatTensor(advs)

        # 1. 保存【更新前】的策略分布
        with torch.no_grad():
            old_logits = self.policy(obs)
            old_dist = Categorical(logits=old_logits)

        # 2. 策略梯度损失
        logits = self.policy(obs)
        dist = Categorical(logits=logits)
        log_prob = dist.log_prob(acts)
        loss = -(log_prob * advs).mean()

        # 3. 梯度下降
        self.optimizer.zero_grad()
        loss.backward()
        self.optimizer.step()

        # ======================
        # 核心:计算 KL 散度
        # ======================
        with torch.no_grad():
            new_logits = self.policy(obs)
            new_dist = Categorical(logits=new_logits)

            # 计算 KL(old || new)
            kl = torch.mean(
                old_dist.log_prob(acts) - new_dist.log_prob(acts)
            ).item()

        # ======================
        # 自适应调整学习率
        # ======================
        if kl > self.target_kl * 1.5:
            # 更新太大 → 缩小学习率
            self.lr /= self.kl_coeff
            print(f"KL 太大 ({kl:.4f}) → 缩小 LR: {self.lr:.6f}")

        elif kl < self.target_kl / 1.5:
            # 更新太小 → 放大学习率
            self.lr *= self.kl_coeff
            print(f"KL 太小 ({kl:.4f}) → 放大 LR: {self.lr:.6f}")

        # 把新学习率写回优化器
        for param_group in self.optimizer.param_groups:
            param_group['lr'] = self.lr

        return loss.item(), kl

超参数(官方推荐)

target_kl = 0.01 # KL 目标
lr = 0.01 # 初始学习率
kl_coeff = 1.5 # 学习率缩放倍数

image

训练逻辑(每一批数据调用一次)

# 每一批数据执行一次
loss, kl = agent.update(obs_batch, act_batch, adv_batch)

agent为AdaptiveStepPG类的实例,以上代码为伪代码,示意之用,不能真正运行。

本博客是博主个人学习时的一些记录,不保证是为原创,个别文章加入了转载的源地址,还有个别文章是汇总网上多份资料所成,在这之中也必有疏漏未加标注处,如有侵权请与博主联系。 如果未特殊标注则为原创,遵循 CC 4.0 BY-SA 版权协议。