简介:一份关于无蜂窝大规模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 状态、动作、奖励:把资源调度问题改写成深度强化学习能啃的MDP
MDP设计决定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)) # 权重分配:alpha+beta=1, 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_ap=8, n_ue=4, n_ant=2, p_max=1.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_eps=0.2, epochs=10): # 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, 1+clip] 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或6,UE数量变化时用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-4 |
| clip_eps | 0.2 | 奖励跨度大用0.1 |
| GAE lambda | 0.95 | 无人机续航决策依赖长期回报时调到0.99 |
| 折扣因子gamma | 0.99 | 关注长期能耗与轨迹规划时必须高于0.95 |
| 每轮轨迹长度 | 4096 | 状态空间大、动作维度高就翻倍到8192 |
| 更新epochs | 10 | 同一批数据过拟合就降到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%多,从此再不敢省这一步。验证没有捷径,做扎实了,这份深度强化学习资源调度方案才能从仿真走向真正可以投入的方向。希望帮到你。
本文还有配套的精品资源,点击获取