資源分配與深度強化學習:從MDP建模到工程避坑)
簡介這是一份來自《通信學報》2019年2月第40卷第2期的學術論文PDF適合無線通信、深度學習及智能資源管理方向的科研人員和研究生研讀。論文針對蜂窩網(wǎng)資源分配中的多目標優(yōu)化問題提出了一種基于深度強化學習的完整算法框架一方面構建深度神經(jīng)網(wǎng)絡DNN優(yōu)化蜂窩系統(tǒng)傳輸速率實現(xiàn)前向傳輸另一方面將能量效率作為獎懲值引入Q-learning機制構造誤差函數(shù)并通過梯度下降法迭代更新DNN權值形成閉環(huán)訓練流程。仿真實驗表明該算法可自主設定資源分配方案的偏重程度收斂快速在傳輸速率和系統(tǒng)能耗方面均優(yōu)于傳統(tǒng)博弈論、圖論著色等方案。資源共1個PDF文件大小1.09MB內含完整摘要、正文、數(shù)學公式、仿真圖表及參考文獻可幫助讀者系統(tǒng)掌握深度強化學習在蜂窩網(wǎng)絡資源分配中的建模思路、實現(xiàn)細節(jié)與性能評估方法也可作為相關課題的參考文獻。目前該資源已有315人學習適合需要快速深入了解該算法或用于論文寫作參考的研究者。1. 蜂窩網(wǎng)資源分配遇上深度強化學習先想清楚再動手無線接入網(wǎng)里的資源分配過去靠比例公平、注水算法這類顯式優(yōu)化場景一變就要重新推導目標函數(shù)和約束。深度強化學習的思路是把它當成序貫決策問題讓智能體通過和仿真環(huán)境大量交互自己學出一套功率和頻譜分配策略。這篇筆記不推公式講怎么把深度強化學習落到蜂窩網(wǎng)資源分配這個具體場景問題建模、平臺搭建、參數(shù)調優(yōu)以及在真實部署前最容易踩的坑。適合做接入網(wǎng)算法預研的工程師也適合想從單智能體往多小區(qū)擴展的研究生。先給結論跑通 demo 不難難在獎勵設計和環(huán)境仿真這兩件事占掉一個項目至少一半時間。2. 把蜂窩網(wǎng)資源分配寫成 MDP狀態(tài)、動作與獎勵設計的三個決定深度強化學習在蜂窩網(wǎng)里落地第一個攔路虎不是模型而是問題建模。資源分配在無線網(wǎng)絡里天然是序貫決策問題信道隨時間變化用戶隊列長度和業(yè)務到達也隨時間變化上一時刻的功率分配還會影響下一時刻的干擾水平。把這段交互過程抽象成馬爾可夫決策過程是整個方向從論文走向代碼的第一道工序。很多實現(xiàn)跑不動、學不會回看根因往往不是神經(jīng)網(wǎng)絡寫錯了而是 MDP 元素定義得含糊。2.1 從優(yōu)化問題到 MDP為什么時序決策是更好的描述傳統(tǒng)資源分配算法的套路是給定當前信道矩陣、用戶速率需求和功率上限建模成一個帶約束的優(yōu)化問題用凸優(yōu)化或啟發(fā)式算法求解。這個思路在靜態(tài)場景下很有效但蜂窩網(wǎng)是動態(tài)的——用戶移動、業(yè)務突發(fā)、干擾耦合每一時刻的決策都會影響后續(xù)時隙的信道狀態(tài)和隊列積壓。深度強化學習的優(yōu)勢在于它不需要顯式建模狀態(tài)轉移概率而是用仿真環(huán)境充當轉移概率讓智能體在試錯中逼近最優(yōu)策略。MDP 四元組在蜂窩網(wǎng)資源分配問題里可以這樣映射MDP 元素蜂窩網(wǎng)資源分配中的對應物狀態(tài) s信道狀態(tài)信息CSI、用戶隊列長度、歷史平均吞吐、干擾測量值動作 a功率分配矢量、物理資源塊PRB調度結果、用戶配對方式轉移概率 P信道衰落演進、用戶移動軌跡、業(yè)務到達過程獎勵 r系統(tǒng)效用加權吞吐、時延懲罰、能效指標、公平性指標這里最容易被忽略的一點是轉移概率不需要寫成解析式。環(huán)境仿真就是轉移概率的實現(xiàn)智能體的每一次 step 都在環(huán)境里往前走一個時隙拿到新的觀測。這也意味著環(huán)境仿真的逼真程度直接決定了訓練出來的策略在真實系統(tǒng)里是否可用——這一點后面講仿真平臺時還會展開。2.2 狀態(tài)空間和動作空間怎么切離散與連續(xù)的選擇狀態(tài)空間的設計決定了智能體“看得到什么”。常見做法是把三個向量拼進狀態(tài)歸一化信道增益、歸一化隊列長度、歷史平均吞吐。全量 CSI 矩陣維度太大訓練時容易過擬合到特定信道布局所以一般會對信道增益做降采樣或者只保留每個用戶在自己占用 PRB 上的信道增益。動作空間的選擇更容易翻車。PRB 調度是組合問題天然是離散動作功率分配是連續(xù)值習慣用連續(xù)動作。兩者混在一起時不要直接枚舉聯(lián)合動作因為用戶數(shù)和 PRB 數(shù)稍漲動作空間就會爆炸。我一般會采用分層決策上層用決策網(wǎng)絡輸出功率控制系數(shù)下層用一個獨立規(guī)則模塊做 PRB 指派或者反過來。下面是最小環(huán)境接口的示例class CellularResourceAllocEnv: def __init__(self, n_ues8, n_prbs10, max_steps200): self.n_ues n_ues self.n_prbs n_prbs self.max_steps max_steps self.time_slot 0 self.channel None self.queue None self.history_throughput None def reset(self): self.time_slot 0 self.channel generate_fading_channel(self.n_ues, self.n_prbs) self.queue np.random.randint(0, 100, sizeself.n_ues) self.history_throughput np.ones(self.n_ues) return self._build_obs() def step(self, action): power_vector, prb_assignment action rate compute_rate(self.channel, power_vector, prb_assignment) reward self._compute_reward(rate, power_vector) self.time_slot 1 self.channel evolve_channel(self.channel) self.queue update_queue(self.queue, rate) done self.time_slot self.max_steps return self._build_obs(), reward, done, {} def _build_obs(self): return np.concatenate([ normalize(self.channel), self.queue / 100.0, self.history_throughput / np.max(self.history_throughput 1e-6) ])這個接口遵守 reset 和 step 協(xié)議可以和 DQN、PPO、MADDPG 任意一種算法對接。_build_obs里把隊列長度除以 100、歷史吞吐做最大值歸一化是為了讓各維度的量級一致否則神經(jīng)網(wǎng)絡前向計算時數(shù)值會被某一維特征主導。generate_fading_channel和evolve_channel是信道模型函數(shù)后面仿真平臺部分會給出具體實現(xiàn)。2.3 獎勵函數(shù)是第一行代碼先讓智能體知道什么是“好”獎勵函數(shù)是整個方案里最值得先寫、也最值得反復改的地方。蜂窩網(wǎng)資源分配最常見的獎勵是系統(tǒng)效用的加權組合比如吞吐、公平性和時延。直接用和速率做獎勵訓練出來的策略會偏向信道條件好的用戶犧牲邊緣用戶體驗只用時延做懲罰又可能讓智能體通過降低功率來逃避切換開銷。因此我習慣用對數(shù)速率作為公平性項再疊加隊列懲罰和功率懲罰def _compute_reward(self, rate, power_vector): fairness np.sum(np.log(rate 1e-6)) / self.n_ues queue_penalty -0.05 * np.mean(self.queue) power_penalty -0.02 * np.mean(np.square(power_vector)) return fairness queue_penalty power_penalty對數(shù)速率來自于比例公平調度的經(jīng)典結論最大化所有用戶對數(shù)吞吐之和能夠同時兼顧系統(tǒng)吞吐和公平性。加1e-6是為了避免速率為 0 時對數(shù)取無窮。隊列懲罰項讓智能體主動規(guī)避積壓過重的用戶功率懲罰項防止它毫無節(jié)制地加大發(fā)射功率。三個系數(shù)的量級很關鍵如果獎勵絕對值動輒幾十Q 值估計會很難收斂一般先讓主項對數(shù)速率的量級在 1 左右其他項作為微調系數(shù)訓練過程中再逐步調整。3. DQN、PPO 還是 MADDPG算法選型與仿真平臺搭建MDP 定義清楚之后緊接著就是選算法和搭環(huán)境。很多教程上來直接給你一段 DQN 代碼容易造成錯覺好像任何場景都能套同一個算法。實際上算法選型要看動作空間和智能體數(shù)量平臺搭建要看仿真速度和可復現(xiàn)性。這三件事沒想明白后面調參全是血淚。3.1 三種算法怎么分工按狀態(tài)維度和動作類型選DQN 系列包括 Double DQN、Dueling DQN適合動作空間離散且有限的場景典型應用是 PRB 調度。動作是選哪幾個資源塊分給哪些用戶動作空間不大時效果穩(wěn)定實現(xiàn)也簡單。PPO 適合連續(xù)動作空間比如功率分配它通過截斷的代理目標函數(shù)限制每次更新的步長訓練穩(wěn)定性和樣本效率在資源分配任務里表現(xiàn)都不錯。MADDPG 適合多小區(qū)多智能體場景每個小區(qū)獨立決策但通過中心化評論家共享全局信息收斂難度更高實現(xiàn)也更復雜。經(jīng)常有人問多小區(qū)場景是不是直接用 MAPPO多智能體 PPO 的思路確實在不少論文里跑出了比 MADDPG 更好的穩(wěn)定性但代價是智能體之間需要通信或全局狀態(tài)做價值評估工程復雜度和訓練開銷都會上一個臺階。我的選型經(jīng)驗是這樣算法動作類型適用規(guī)模訓練穩(wěn)定性實現(xiàn)難度DQN 系列離散單小區(qū)、動作空間有限中等低PPO連續(xù)單小區(qū)或多小區(qū)集中式?jīng)Q策高中MADDPG連續(xù)/離散多小區(qū)分布式?jīng)Q策低高這里給一個非常主觀但實用的判斷標準如果你的環(huán)境單步交互時間超過 1 毫秒先別想著上 MADDPG優(yōu)先把 DQN 或 PPO 跑通。多智能體算法的調試成本是單智能體的幾倍問題疊加時很難定位到底是哪路梯度在崩。3.2 用 Python 搭一個最小蜂窩網(wǎng)仿真環(huán)境信道與速率計算仿真環(huán)境是深度強化學習里最被低估的部分。訓練過程中 90% 的時間花在智能體和環(huán)境的交互上環(huán)境計算一次觀測和獎勵如果耗時太高GPU 再好也等你不動。常見的做法是用 Python 加 NumPy 做一個輕量級仿真環(huán)境把信道生成和速率計算向量化不要用 Python 循環(huán)去逐用戶、逐 PRB 計算。def generate_fading_channel(n_ues, n_prbs, seed42): rng np.random.default_rng(seed) path_loss 128.1 37.6 * rng.uniform(0.1, 0.5, size(n_ues, 1)) shadow rng.normal(0, 8, size(n_ues, n_prbs)) return 10 ** (-(path_loss shadow) / 10) def compute_rate(channel, power_vector, prb_assignment): snr channel * power_vector.reshape(-1, 1) snr snr / (1e-9 1.0) # 簡化噪聲功率單位線性 rate np.log2(1 snr) return rate * prb_assignment這個信道模型把路徑損耗和陰影衰落都折算成線性增益compute_rate用香農公式近似估算每用戶在每個 PRB 上的可達速率。prb_assignment如果是 0/1 掩碼矩陣點乘之后只會保留被分配到的資源塊。注意隨機數(shù)生成要用default_rng并傳入 seed這是可復現(xiàn)實驗的第一步。如果你想要更貼近真實系統(tǒng)可以在evolve_channel里加入快衰落系數(shù)例如做一階 AR 模型模擬時變信道但初始版本建議先跑靜態(tài)信道把問題鏈路確認好再增加復雜度。3.3 最小訓練回路DQN 主循環(huán)加經(jīng)驗回放環(huán)境搭好之后訓練回路可以寫得很短。下面是一段 DQN 主循環(huán)的骨架它完成四件事與環(huán)境交互采樣、往經(jīng)驗回放緩沖區(qū)寫數(shù)據(jù)、隨機采樣小批量更新 Q 網(wǎng)絡、周期性同步目標網(wǎng)絡。from collections import deque buffer deque(maxlen50000) q_net build_dqn(env) target_net build_dqn(env) target_net.load_state_dict(q_net.state_dict()) optimizer torch.optim.Adam(q_net.parameters(), lr3e-4) epsilon 1.0 for episode in range(2000): obs env.reset() total_reward 0.0 for step in range(env.max_steps): if np.random.random() epsilon: action random_action() else: action q_net.select_action(obs) next_obs, reward, done, _ env.step(action) buffer.append((obs, action, reward, next_obs, done)) obs next_obs total_reward reward if len(buffer) 256: batch random.sample(buffer, 256) loss update_q_net(batch, q_net, target_net, optimizer) if step % 200 0: target_net.load_state_dict(q_net.state_dict()) epsilon max(0.02, epsilon * 0.995)代碼里的關鍵點在update_q_net它對每個樣本計算target reward gamma * max_target(next_obs)再用當前 Q 網(wǎng)絡的預測值和 target 做 MSE 損失。經(jīng)驗回放的deque(maxlen50000)限制了緩沖區(qū)上限避免舊經(jīng)驗過多污染新策略的學習目標網(wǎng)絡每 200 步同步一次是為了減少自舉帶來的震蕩。epsilon從 1.0 衰減到 0.02前期的隨機探索讓智能體有機會發(fā)現(xiàn)有效動作后期更多依賴學到的策略。這個主循環(huán)可以直接跑也適合替換成 PPO 的 rollout 邏輯——換算法時環(huán)境接口完全不用改。4. 訓練參數(shù)怎么設六個必調參數(shù)與訓練曲線判讀算法代碼寫通之后調參才是真正花時間的地方。深度強化學習算法的超參數(shù)不像普通監(jiān)督學習那樣有成熟的自動搜索方案很多時候得靠經(jīng)驗和運氣。下面六個參數(shù)是我在蜂窩網(wǎng)資源分配任務里最先調的也是影響訓練結果最明顯的變量。每次只改一個參數(shù)記錄曲線再動下一個這是最合理的調參節(jié)奏。4.1 六個必調參數(shù)從學習率到目標網(wǎng)絡更新間隔學習率是最敏感、最玄學的一個參數(shù)。DQN 和 PPO 都盡量從3e-4起步過大會導致?lián)p失震蕩過小則收斂慢到讓人懷疑代碼寫錯了。折扣因子gamma在資源分配任務里要格外小心信道和業(yè)務都是緩變的gamma0.99代表智能體會考慮未來約 100 步的收益如果業(yè)務時延要求高gamma0.9可能更合適但代價是策略會變得短視。探索率衰減速度影響最終性能衰減太快會收斂到次優(yōu)策略太慢會浪費大量訓練時間。參數(shù)常見取值范圍調整方向learning_rate3e-4 ~ 1e-3損失震蕩則減半gamma0.9 ~ 0.99時延敏感場景調低epsilon_decay0.99 ~ 0.999收斂慢則調小buffer_size2萬 ~ 10萬環(huán)境隨機性強則調大batch_size32 ~ 256顯存允許則調大target_update_interval100 ~ 1000 步訓練不穩(wěn)則調小批大小和回放緩沖區(qū)大小是硬件約束最強的兩個參數(shù)。緩沖區(qū)大能提供更獨立的樣本但也會讓策略更新反映的是很久之前的狀態(tài)分布新舊策略差異過大時訓練不穩(wěn)定批大小大能降低梯度方差但每步更新更慢。我在單小區(qū)場景從256起步多小區(qū)場景會降到128。這些經(jīng)驗值不是鐵律但適合作為第一組嘗試的組合。4.2 通過損失、獎勵和動作熵判斷訓練狀態(tài)訓練曲線要學會分開看。損失下降不代表策略變好因為 Q 網(wǎng)絡的損失是向著不斷更新的 target 回歸的target 本身也在變化。我更關注三個量每個 episode 的平均獎勵、Q 值的量級、動作熵如果用 PPO。平均獎勵上升說明策略效果在改善Q 值量級和實際獎勵量級偏離過大說明獎勵尺度過大或學習率異常動作熵在不收斂時往往先飆升再塌縮這是策略陷入局部最優(yōu)的常見信號。遇到曲線鋸齒非常劇烈時先別急著改網(wǎng)絡結構。檢查獎勵函數(shù)是不是出現(xiàn)了極端值比如某用戶速率為 0 導致對數(shù)項爆炸檢查compute_rate是不是產(chǎn)生了 NaN 或無窮大。多數(shù)“莫名其妙不收斂”的問題最后都能在環(huán)境代碼里找到根源而不是算法層。4.3 GPU 計算資源分配在這類任務里為什么不是第一瓶頸訓練深度強化學習跑蜂窩網(wǎng)資源分配你會很快發(fā)現(xiàn) GPU 利用率上不去。原因在于訓練是串行交互的環(huán)境必須等待智能體給出動作智能體必須等待環(huán)境返回下一個狀態(tài)GPU 在大部分時間里處于等待狀態(tài)。所以這類任務的瓶頸不是 GPU 計算資源不夠而是環(huán)境交互太慢。常見的加速手段有三種開多個環(huán)境進程并行采樣提高 GPU 利用率把信道生成和速率計算向量化成矩陣運算避免 Python 循環(huán)預先離線生成一批信道軌跡訓練時直接回放。這些都是工程上被驗證過的做法比換一塊顯卡有效得多。5. 蜂窩網(wǎng)資源分配訓練避坑五個親眼見過的翻車現(xiàn)場這一章寫的是訓練過程中最常遇到的五個問題。每一條都是我親眼在項目里見過的翻車現(xiàn)場現(xiàn)象、原因、解決方式都按實際排查順序記錄。排錯時建議按順序逐條對照能少走很多彎路。5.1 收斂很好但效果不如最大信噪比獎勵信號指錯了方向現(xiàn)象獎勵曲線穩(wěn)定上升Loss 曲線也收斂了但把學到的策略拿去和最大信噪比調度做對比系統(tǒng)吞吐反而更低。原因獎勵函數(shù)把“模型認為的好”和“系統(tǒng)真正的好”搞混了。比如只將瞬時吞吐作為獎勵智能體學會的是把所有資源押給信道最好的用戶犧牲了所有邊緣用戶和速率反而因為缺乏用戶分集增益而下降。解決改用對數(shù)速率作為獎勵主項并在評估指標里同時記錄系統(tǒng)吞吐和 Jain’s fairness index確保策略沒有在原問題上跑偏。這是一個非常容易犯的錯因為訓練過程“看起來正?!鼻∏∽钗kU。5.2 損失值像心電圖獎勵尺度與回放數(shù)據(jù)在搗亂現(xiàn)象Q 網(wǎng)絡損失在幾百到幾萬之間劇烈跳動每 10 步一個尖峰平均獎勵曲線也是上躥下跳。原因最常見的是獎勵尺度過大Q 值目標高達幾千網(wǎng)絡每次更新都在追趕一個劇烈變化的目標其次是回放緩沖區(qū)中混入了大量探索早期生成的糟糕樣本它們在后期仍然被反復采樣拖慢策略更新。解決先把獎勵壓縮到[-1, 1]左右量級觀察 Loss 是否穩(wěn)定再把緩沖區(qū)里早期低獎勵樣本的采樣權重降低或者干脆縮小緩沖區(qū)容量。實測中 70% 的震蕩問題出在獎勵尺度而不是網(wǎng)絡結構。5.3 換一個用戶數(shù)性能立刻崩狀態(tài)歸一化沒做好現(xiàn)象訓練時用 8 個用戶遷移到 12 個用戶場景策略表現(xiàn)還不如隨機調度。原因神經(jīng)網(wǎng)絡輸入層的特征分布發(fā)生了偏移。8 用戶時的歸一化參數(shù)是在 8 用戶的數(shù)據(jù)上統(tǒng)計的換到 12 用戶后隊列長度、信道增益的取值分布全變了網(wǎng)絡的隱層輸出也跟著失真。解決狀態(tài)歸一化不要用訓練集的離線統(tǒng)計量而是使用逐時刻的在線歸一化比如隊列長度除以當前時隙的最大隊列長度信道增益做按行的最大值歸一化。這樣用戶數(shù)變化時輸入特征的數(shù)值范圍基本保持一致。5.4 動作空間枚舉爆炸把聯(lián)合動作拆成分層決策現(xiàn)象動作定義為“哪些用戶占用哪些 PRB”的聯(lián)合枚舉用戶數(shù)超過 10、PRB 數(shù)超過 10 后動作空間達到幾十萬維DQN 的 Q 網(wǎng)絡輸出層大到無法訓練訓練時間成倍增長。原因聯(lián)合動作的排列組合是組合爆炸的DQN 這類基于價值的方法要求每個動作有一個輸出頭動作越多輸出維度越大探索效率也越低。解決改成兩層策略第一層用策略網(wǎng)絡輸出每個用戶的優(yōu)先級權值第二層用傳統(tǒng)的貪心算法按權值把 PRB 逐個分配給用戶。這樣既保留了學習能力又把動作空間壓縮到用戶數(shù)規(guī)模。PPO 這類基于策略梯度的算法對連續(xù)動作空間更友好但分層決策的結構仍然值得保留。5.5 換了隨機種子結果天差地別固定種子是工程紀律現(xiàn)象代碼完全一樣只改了隨機種子訓練之后性能從 Top 10% 掉到 Bottom 20%。原因深度強化學習對環(huán)境初始化、網(wǎng)絡初始化和經(jīng)驗采樣順序都高度敏感。蜂窩網(wǎng)場景里信道生成的隨機性尤其大一個極端信道布局可能讓整輪訓練報廢。解決固定每一個可能影響隨機性的入口——環(huán)境生成器的 seed、網(wǎng)絡初始化的 seed、PyTorch 和 NumPy 的全局 seed、動作探索的 seed。訓練評估時跑 5 到 10 個不同種子取均值不要拿單次結果當結論。隨機種子結果是玄學但固定種子是工程紀律兩者不矛盾。6. 進階驗證從單小區(qū)收斂到多小區(qū)分布式單小區(qū)訓練穩(wěn)定之后下一步大多是把方案擴展到多小區(qū)場景。注意不要直接拿單小區(qū)的策略網(wǎng)絡去跑多小區(qū)因為小區(qū)間的干擾耦合會讓狀態(tài)分布完全不同。常見的路徑是集中式訓練、分布式執(zhí)行訓練時用一個中心化評論家查看所有小區(qū)的全局狀態(tài)執(zhí)行時每個小區(qū)只用自己的局部觀測做決策。這個思路在 MADDPG 和 MAPPO 里都有成熟實現(xiàn)核心手段是讓執(zhí)行網(wǎng)絡只接收局部觀測評估網(wǎng)絡把所有小區(qū)信息拼接起來。驗證一個資源分配算法是否值得投入不能只看平均吞吐。我每次實驗會同時記錄三個指標小區(qū)平均吞吐、Jain’s fairness index、時延 P95/P99 尾部分位數(shù)。公平性不足時平均吞吐再高也不可信時延尾部則直接反映業(yè)務體驗。這三個指標固定后在相同隨機種子下對比 DRL 策略和最大信噪比調度、比例公平調度的差距比單看一條 reward 曲線可靠得多。如果 DRL 策略只在和速率上領先但公平性明顯劣化說明獎勵設計還需要回頭調。我現(xiàn)在的習慣是先寫獎勵函數(shù)再寫環(huán)境最后才寫智能體先跑固定信道確認梯度通路再跑時變信道驗證泛化能力每次改參數(shù)只動一項所有實驗結果按 seed 存檔。這套流程救過我很多次希望幫到你。本文還有配套的精品資源點擊獲取