多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

无蜂窝大规模MIMO与无人机辅助通信的深度强化学习资源调度

无蜂窝大规模MIMO与无人机辅助通信的深度强化学习资源调度 简介一份关于无蜂窝大规模MIMO网络中无人机辅助通信与资源调度的技术文档基于深度强化学习DRL解决偏远地区覆盖不足的问题。文档面向通信工程、无线网络优化及智能决策研究人员系统介绍了利用分布式MIMO与大规模MIMO的接入点架构结合无人机中继实现用户可达速率与总吞吐量最大化的方案。内容涵盖两跳协作机制、双动作马尔可夫决策过程建模、DQN/DDPG与多智能体强化学习在轨迹规划和频带分配中的应用并考虑有限状态马尔可夫信道与时变无线环境对理解DRL在动态通信系统落地的技术挑战很有帮助。压缩包内仅含1个docx文档大小409KB文件结构完整包含引言与系统模型等核心章节便于直接阅读和引用。资源已有228人学习适合作为相关课题的入门参考或技术调研资料。1. 无蜂窝大规模MIMO与无人机辅助通信的深度强化学习资源调度为什么这三件事必须放在一起做无蜂窝大规模MIMO把传统蜂窝的边界打散让几十个分布式接入点AP在同一个时频资源块上服务所有用户再把无人机塞进这张网里当空中接入点拓扑从静态变成动态资源调度就从固定公式变成了实时决策问题。深度强化学习DRL正好擅长这类高动态、难精确建模的决策无人机往哪飞、各AP功率给多少、用户关联到哪个AP一次训练、在线推理。这篇笔记把整条链路从系统建模、MDP设计、算法实现到训练排查完整走一遍适合做无线通信物理层与网络层交叉研究的工程师和研究生也适合想给传统优化方案找替代路线的系统设计者。2. 先把系统模型立住无蜂窝网里无人机中继的接入方式与MDP翻译2.1 无蜂窝大规模MIMO的传输模型AP协作、fronthaul约束与无人机接入方式无蜂窝大规模MIMO的核心思想是去掉小区边界L个分布式AP通过fronthaul链路连到中央处理器CPU在同一个时频资源块上协作服务K个用户UE。上行先做导频信道估计每个UE分配一条导频序列各AP本地估计出CSI后上报CPU下行用共轭波束成形或ZF预编码。用户k接收到的SINR可以写成SINR_k |h_k^H w_k|^2 / (Σ_{j≠k} |h_k^H w_j|^2 σ²)其中h_k是各AP到用户k的级联信道w_k是预编码向量σ²是噪声功率。由于每个用户同时被多个AP覆盖这种架构的5%边缘速率远高于传统蜂窝代价是fronthaul开销和CSI获取复杂度随L和K线性上涨。资源调度的本质就是在fronthaul容量、每AP功率上限和用户QoS三条约束下决定每个时隙的预编码、功率和用户关联。把无人机加进来接入方式常见有三种无人机作为移动AP通过无线fronthaul回传无人机作为解码转发中继把边缘用户数据转发给地面AP无人机只当缓存或数据收集节点。我一般建议从第二种起步理由是它最容易和现有无蜂窝架构融合中继不需要分配新的导频资源DRL只需要决策无人机的悬停位置、转发功率和中继选择动作空间小一个数量级收敛压力小得多。空地信道是最容易让传统优化翻车的地方。无人机到地面用户的传播通常用3GPP TR 36.777的拟合式描述LoS概率P_LoS 1 / (1 a·exp(-b·(θ - a)))其中θ是仰角a、b是环境系数郊区取a≈0.6、b≈5.5密集城区a≈1.2、b≈4.5。LoS路径的衰减近似自由空间NLoS路径要额外加上10到20dB穿透损耗。目标函数里揉进这种与位置强相关、非凸的LoS切换传统凸优化只能把整片区域按统计平均值处理丢掉的恰恰是无人机机动最值钱的那部分增益——这也是后文非要用深度强化学习的原因它不要求目标函数凸只需要一个能采样的环境。2.2 状态、动作、奖励把资源调度问题改写成深度强化学习能啃的MDPMDP设计决定DRL策略的上限网络结构和超参只决定能不能到上限。我的经验是状态宁全勿漏但别堆原始量动作宁连续勿离散奖励务必按分量归一化再加权。状态s_t的最小集合我一般这样配各UE到各AP的信道增益矩阵L×K取对数并做z-score归一化、各UE到无人机的信道增益K维、无人机当前三维坐标、剩余电量、各UE的队列积压量。原始CSI矩阵直接进网络会让输入层很大常见做法是只取每个用户最强的M个AP信道增益并排序既压缩输入又保留无蜂窝的核心特征——协作AP集合。动作a_t分两块连续动作是无人机水平位移Δx、Δy和发射功率受最大速度和P_max约束离散动作是用户关联K个用户各选一个服务节点。离散动作维度小的时候可以用DQN但无蜂窝场景我更推荐把离散关联也放宽成连续softmax权重统一用PPO训练避免DQN对动作值的高估问题。奖励r_t建议写成加权和每一项单独缩放import numpy as np def compute_reward(rate_k, qos_k, p_tx, p_drone, rate_ub, p_tx_max, p_drone_max): # rate_k: K个用户当前可达速率(bps/Hz), qos_k: QoS门限 # 总速率项用理想上界归一化避免量级随K变化 r_rate np.mean(rate_k) / rate_ub # 公平性项Jain指数范围(0,1]边缘用户越多该值越低 r_fair (np.sum(rate_k) ** 2) / (len(rate_k) * np.sum(rate_k ** 2) 1e-8) # 能耗项发射功率与无人机推进功率各自归一化后取平均 e_energy (p_tx / p_tx_max p_drone / p_drone_max) / 2 # QoS违约项低于门限的用户占比而不是违约次数 c_vio np.mean((rate_k qos_k).astype(float)) # 权重分配alphabeta1, gamma前期放小, delta视QoS严格程度 return (0.6 * r_rate 0.4 * r_fair - 0.01 * e_energy - 0.5 * c_vio)这段代码的逻辑总速率和公平性是一对矛盾目标alpha和beta分别设为0.6和0.4边缘用户多的场景可以往0.5/0.5调。能耗项gamma前几万步保持0.01等速率策略成型再逐步放大到0.05防止训练早期智能体为了省电而躺平。QoS违约用占比而不用次数是为了避免K变化时这个分量的量级漂移。权重这里有个血泪经验不要直接加不同量纲的项速率、公平性、能耗三个分量的方差可能差两个数量级梯度会被方差最大的项牵着走先跑一次随机策略统计每个分量的均值和方差并各自归一化再进加权重训练会稳很多。3. 从DQN到PPO深度强化学习算法选型与可复现的训练实现3.1 为什么放弃凸优化和贪婪启发式三个理由与选型结论无蜂窝加无人机的资源调度传统解法分两类。一类是定点的凸优化比如WMMSE类算法做功率分配另一类是贪婪或启发式比如按信噪比贪心做用户关联。这两个办法在静态拓扑下都表现不错但放到本场景里有三个硬伤。第一无人机位置和功率是强耦合的连续决策凸优化对非凸的LoS切换无能为力只能退化成把LoS概率当平均值的一阶近似。第二信道和用户位置实时变化传统算法每个时隙都要重新迭代求解WMMSE在几十个AP、几十个用户的规模下单次迭代就要毫秒级跟不上无人机的机动速度。第三公平性、能耗、QoS违约这些目标互相冲突加权系数一变就要重新求解整个优化问题没有跨场景迁移的能力。深度强化学习的思路是把决策过程变成一个策略网络输入状态、输出动作策略通过与环境交互的奖励信号学习。它不要求目标函数凸推理时只需要一次前向传播而且通过把UE分布、信道实现随机化训练策略能泛化到没有见过的拓扑。选型上动作空间如果只有离散关联DQN够用功率和位置是连续变量DDPG和TD3容易受超参影响PPO在无线通信场景里更稳对奖励尺度变化的容忍度高——这也是我推荐PPO的原因。虽然PPO是on-policy、采样效率不高但仿真环境便宜多跑几个rollout就能补回来。DRL训练过程像黑匣子但选型逻辑不需要黑匣子上述理由足够支撑从传统优化转向PPO的决策。3.2 用Python搭一个可复现的PPO训练环境状态归一化与动作映射训练环境我习惯用NumPy实现信道和速率计算不引入重型信道仿真库这样能快速迭代。状态归一化是第一个关键点信道增益的路径损耗可能从10⁻⁶到10⁻²跨度巨大直接丢进网络会让早期梯度被大值样本主导。标准化做法是取log后做z-score运行期用滑动均值方差持续更新。# cellfree_env.py —— 无蜂窝无人机环境的最小骨架 import numpy as np class CellFreeEnv: def __init__(self, n_ap8, n_ue4, n_ant2, p_max1.0): self.n_ap, self.n_ue, self.p_max n_ap, n_ue, p_max self.ap_pos np.random.uniform(0, 500, (n_ap, 2)) # AP坐标(m) self.ue_pos self._sample_ue() # 用户随机分布 self.drone_pos np.array([250.0, 250.0, 100.0]) # 无人机起点 def _sample_ue(self): # 簇状分布模拟热点场景比均匀分布更能考验调度的公平性 centers np.random.uniform(50, 450, (2, 2)) n1 self.n_ue // 2 return np.vstack([ centers[0] np.random.randn(n1, 2) * 30, centers[1] np.random.randn(self.n_ue - n1, 2) * 30 ]) def step(self, action): # action: dx, dy(归一化到[-1,1]), 无人机功率权重p_rel, 关联softmax权重 speed 10.0 # m/s无人机最大水平速度 self.drone_pos[:2] action[:2] * speed self.drone_pos np.clip(self.drone_pos, [0, 0, 50], [500, 500, 150]) p_drone (action[2] 1) / 2 * self.p_max # tanh输出映射到[0,p_max] # 后续计算空地信道、SINR、速率再调compute_reward return self._get_state(), reward, done, info这段代码的三个要点一是用户用簇状分布采样而不是均匀分布均匀分布会让各AP负载天然均衡测不出调度的价值二是无人机位移动作从tanh输出映射成实际位移时要除以速度上限做归一化否则动作空间的有效范围随步长变化训练会不稳定三是无人机功率用tanh映射到有效区间而不是让网络自己学约束这个设计思路会在第5章展开。3.3 PPO核心训练循环代码与关键超参说明PPO训练循环分三块采样rollout、用GAE算优势、更新策略。下面这个更新函数是核心把策略网络和值网络的损失写在一起一次反向传播同时更新。def ppo_update(ac, optimizer, batch, clip_eps0.2, epochs10): # batch包含state, action, old_logp, advantage, ret(GAE target) s, a, old_logp, adv (batch[k] for k in (state, action, logp, advantage)) # 优势归一化消除量级差异PPO对尺度不敏感但归一化能加快收敛 adv (adv - adv.mean()) / (adv.std() 1e-8) for _ in range(epochs): logp, entropy, value ac.evaluate(s, a) ratio (logp - old_logp).exp() # clipped surrogate: 把单步更新幅度限制在[1-clip, 1clip] surr1 ratio * adv surr2 torch.clamp(ratio, 1 - clip_eps, 1 clip_eps) * adv # actor loss 熵正则 critic的value loss(ret是GAE回归目标) loss (-torch.min(surr1, surr2).mean() - 0.01 * entropy.mean() 0.5 * (value - batch[ret]).pow(2).mean()) optimizer.zero_grad() loss.backward() nn.utils.clip_grad_norm_(ac.parameters(), 0.5) # 梯度裁剪 optimizer.step()参数说明clip_eps取0.2是默认值奖励跨度大、单步优势波动明显的时候降到0.1防止策略更新幅度过大epochs取10如果发现同一批数据上过拟合更新到第8轮loss开始回升降到5。熵正则系数0.01是为了防止策略过早坍缩成确定性策略——无人机场景里如果早期就确定化后续UE移走了策略完全没有探索能力去发现新的悬停位置。梯度裁剪0.5是我所有RL训练里都保留的习惯它只防止异常梯度不干扰正常收敛。4. 深度强化学习资源调度训练排查5条踩坑记录与解决4.1 奖励曲线过山车reward normalization没做好现象训练前几千步奖励从-50跳到200又跌回0滑动平均曲线大幅震荡看不出上升趋势。原因速率、公平性、能耗三个奖励分量虽然各自做了归一化但加权求和后整体奖励的均值和方差仍随UE位置分布变化。critic的回归目标一直在变优势估计的方差被放大策略在探索和保守之间反复横跳。解决对整体奖励做滑动窗口归一化r_normalized (r - running_mean) / (running_std 1e-8)再乘一个固定缩放因子。我观察到的效果震荡幅度通常能降一半以上奖励趋势在第5000步左右就清晰可见。注意归一化统计量要用训练全过程的滑动窗口不能用当前episode的统计量否则单episode内的大奖励会把尺度拉歪。4.2 训练不收敛状态尺度与学习率不匹配现象loss下降但平均奖励原地不动或者动作分布的标准差退化到接近零、策略完全确定化UE一移动就崩。原因信道增益没归一化时输入里10⁻⁶和1的量级差让网络第一层权重对小数特征几乎不敏感等效于把关键信息丢了。另一部分原因是学习率偏高PPO的on-policy更新对学习率比DQN敏感得多3e-4以上很容易把策略推离当前分布的支撑集。解决先对状态做log加z-score归一化断言输入每一维的标准差落在(0.5, 1.5)区间再开始训练学习率从3e-4往下试1e-4最稳。检查方法很简单每500步打印一次动作分布的均值和标准差如果std掉到初始值的五分之一以下且奖励没涨基本就是学习率或熵正则的问题。4.3 换场景就失效过拟合与动态拓扑的适配现象在8个AP、4个UE的场景训练得很好换成10个AP、6个UE或者UE分布从两簇变成三簇性能立刻打回原形。原因最常见的是输入维度写死了AP数和UE数网络全连接层的输入维度与拓扑规模绑定换了网络规模就根本无法前向传播其次是训练时UE分布固定策略把悬停位置过拟合到了那两簇热点的中心坐标。解决输入层用固定维度设计——每个UE取最强的M个AP信道增益排序后拼接M固定为5或6UE数量变化时用0补齐或只输入前M个训练时每个episode重新随机UE位置、随机AP子集激活相当于domain randomization。这是我认为这个方向里最重要的一条经验无蜂窝网络的价值就在于异构性不能让策略只认识一张固定的网。4.4 功率约束被突破罚函数系数与可行域映射现象训练中无人机发射功率偶尔超过P_max部署到真实设备时会触发硬件保护或者明明罚了分功率还是往边界顶。原因罚函数系数太小违约带来的速率收益大于罚的代价策略学会了钻空子更本质的原因是网络输出层直接输出功率值没有任何机制保证它落在可行域内罚函数只能诱导不能硬约束。解决两层一起做。动作网络输出经过tanh再乘P_max确定功率一定在[0, P_max]内罚函数作为第二道保险系数从0.1、0.5、1.0三档试观察违约率降到1%以下才算合格。如果罚函数加上去导致奖励曲线整体下滑说明系数太大压制了正常探索要回到动作映射上找问题而不是继续调罚。4.5 训练速度慢到怀疑人生向量化与并行采样现象一个rollout要跑几十秒PPO采样效率本来就低一晚上训练跑不到10万步实验排期直接被拖垮。原因环境的信道计算是逐UE、逐AP的Python循环每次step重新生成信道矩阵PPO又是on-policy每一步采样出来的数据只能用来更新一次采样效率天然比off-policy低。解决第一把信道计算向量化用np.where配合LoS概率一次性生成L×K信道矩阵不要写for循环第二并行开8到16个环境实例各自独立采样凑够一个batch再统一更新PyTorch的tensor操作会自动并上GPU第三LoS信道系数的随机种子在同一个episode内固定保证同一轨迹内部信道连续避免每步独立抽样造成的信道抖动被策略误认为环境变化。5. 资源调度的约束处理与参数配置让DRL策略真正可部署的关键细节5.1 功率与用户关联的约束进奖励函数还是进动作空间约束处理是DRL落地最绕不开的问题常见做法有三条路线把约束写进奖励函数做罚函数、把动作映射进可行域、训练后再投影修正。我的选择是组合拳物理上能直接映射的约束功率上限、无人机位置边界一律在动作空间解决用tanh乘上界统计上的约束QoS违约率、fronthaul容量用奖励罚函数。原因很直接罚函数让策略自己去权衡违约代价训练初期免不了大量违约探索而动作映射从第一步开始就保证物理可行训练稳定很多。fronthaul容量约束是个容易忽略的细节每个时隙从AP回传到CPU的数据量有限制用户关联到太多AP时就会超限。这个约束很难映射进动作空间只能进奖励。我一般用软约束加硬计数奖励里加一个超出容量时的惩罚项同时每次rollout结束时统计超限时隙占比超过5%就认为策略不合格需要调大罚函数系数。有预算的话拉格朗日乘子法比固定罚系数更理想但实现复杂度和调参成本会翻倍项目周期紧时不建议一上来就上。5.2 单智能体与多智能体取舍无蜂窝加无人机的规模扩展L增长到几十、K增长到几十之后单智能体输出一个L×K维的动作向量actor网络最后一个全连接层的参数量会巨大训练变慢且容易陷入维度灾难。常见做法是多智能体架构每个AP一个agent所有agent共享网络参数parameter sharing各自只用局部观测输出本AP的功率和关联权重无人机单独一个agent负责位置和回传功率。训练时用CTDE模式critic共享全局信息actor只用局部观测这样既处理了规模扩展又避免了通信开销巨大的完全分布式训练。如果项目周期紧我的建议是先跑单智能体验证效果确认MDP设计和奖励函数没问题后再换多智能体。直接上多智能体出了问题很难分辨是MDP的问题、还是通信问题、还是信用分配问题等于一次性踩三个坑。多智能体之间的关联决策需要通讯协议设计时可以考虑MAPPO这类中心化训练框架但那是另一个量级的工程投入。5.3 核心超参参考表与调试顺序下面这张表是我在类似场景里反复用过的起点值不是最优值但是稳定的收敛区间超参起点值方向说明学习率2e-4震荡就降到1e-4收敛过慢再回到3e-4clip_eps0.2奖励跨度大用0.1GAE lambda0.95无人机续航决策依赖长期回报时调到0.99折扣因子gamma0.99关注长期能耗与轨迹规划时必须高于0.95每轮轨迹长度4096状态空间大、动作维度高就翻倍到8192更新epochs10同一批数据过拟合就降到5熵正则系数0.01策略过早确定化就提高到0.02并行环境数8以CPU核数和显存容量为上限调试顺序我固定为四步第一步只调状态归一化和奖励归一化确保训练曲线有上升趋势第二步固定学习率和batch大小观察动作分布是否合理第三步加入约束罚函数看约束违约率最后一步才调gamma和lambda这类长期回报参数。跳步调试最容易出现的情况是前面没归一化后面怎么调超参奖励曲线都是一团糟白耗一个晚上。6. 从仿真报告到可信结论策略验证的三个硬要求训练收敛不等于结论可信。我见过太多项目在一条奖励曲线上画个上升就收工换个随机种子立刻现原形。我的验证流程有三条硬要求。第一完整的baseline对比。至少要跑三个对照max-SINR用户关联加均匀功率、WMMSE定点迭代功率分配、去掉无人机的地面无蜂窝基线。报告指标别只写平均速率要画速率CDF曲线重点看5%分位的边缘用户速率——无蜂窝加无人机的卖点恰恰是提升边缘平均速率好但边缘差说明无人机把功率都喂给了好用户。第二多随机种子统计。同一套超参至少跑5个种子奖励曲线画均值加减置信带不贴最好的一条。换种子性能波动超过15%就说明训练不稳定要从归一化和熵正则上找原因而不是靠换个好种子糊弄过去。第三鲁棒性测试。分别做信道估计误差测试CSI加5%到10%乘性噪声、无人机电量衰减测试续航缩短20%看策略如何调整、UE移动测试让UE离开训练分布。三个测试只要有任何一个让QoS违约率翻倍策略就不能说落地。我自己的习惯是每次训练结束固定保存三样东西网络权重、训练曲线数据、测试集rollout原始数据。训练曲线只用来判断收敛报告里只放测试集上的统计结果。有一次图省事只跑了两个种子换第三个种子奖励掉了20%多从此再不敢省这一步。验证没有捷径做扎实了这份深度强化学习资源调度方案才能从仿真走向真正可以投入的方向。希望帮到你。本文还有配套的精品资源点击获取
返回列表