無線資源分配:Matlab仿真實現(xiàn)與調(diào)參實踐)
上一周我做室內(nèi)無線網(wǎng)絡(luò)的資源分配仿真時遇到一個很典型的困惑在靜態(tài)拓撲下傳統(tǒng)注水算法和輪詢方案表現(xiàn)都還可以可一旦把用戶終端位置變化、突發(fā)業(yè)務(wù)和信道波動放進去固定策略的效果就會迅速劣化。折騰了一陣子后我徹底轉(zhuǎn)向了深度Qlearning強化學習方案——把功率分配看作一個序貫決策問題讓智能體在仿真環(huán)境里反復試錯學出一套“狀態(tài)到動作”的映射策略。這篇文章就把我踩過的坑和最終跑通的Matlab仿真實現(xiàn)完整記錄下來內(nèi)容包括室內(nèi)無線資源分配問題的建模思路、深度Q網(wǎng)絡(luò)DQN各核心組件的落地細節(jié)、Matlab環(huán)境搭建到訓練主循環(huán)的完整鏈路以及收斂性分析和調(diào)參心得。適合通信工程相關(guān)專業(yè)的研究生、剛接觸強化學習但想盡快上手仿真驗證的工程師以及所有準備在無線網(wǎng)絡(luò)領(lǐng)域引入智能決策方案的朋友參考。1. 問題建模把室內(nèi)無線資源分配寫成一個強化學習能理解的決策過程任何強化學習項目的第一步都不是敲代碼而是想清楚“智能體到底在做什么決策”。這一步?jīng)]有處理好后面網(wǎng)絡(luò)結(jié)構(gòu)再漂亮、調(diào)參再努力訓練出來的策略也大概率是廢的。我自己的習慣是先花大量時間定義狀態(tài)、動作、獎勵并且用最樸素的語言把問題描述一遍確認這個MDP馬爾可夫決策過程閉環(huán)是合理的再開始寫Matlab代碼。1.1 為什么室內(nèi)場景比室外場景更需要動態(tài)分配策略室內(nèi)無線網(wǎng)絡(luò)和室外宏基站覆蓋有一個很大的不同點信道狀態(tài)受環(huán)境結(jié)構(gòu)影響極其顯著。穿墻損耗、人員走動遮擋、家具擺設(shè)反射、多徑衰落混疊在一起信號強度的空間變化非常劇烈。加上用戶終端往往是手機或筆記本電腦移動性雖然不如車載場景那么夸張但在辦公室、商場、實驗室這樣的環(huán)境里用戶隨時可能在幾個AP的覆蓋范圍內(nèi)切換。在這種條件下如果使用固定資源分配策略最直觀的問題就是信道質(zhì)量好的用戶可能被分配了過高的功率造成對相鄰信道用戶的額外干擾而信道質(zhì)量差的邊緣用戶又沒有得到足夠資源吞吐量被壓得很低。傳統(tǒng)做法一般有兩種思路應(yīng)對一種是通過信道狀態(tài)信息CSI的實時測量做集中式調(diào)度另一種是采用自適應(yīng)功率控制。集中式調(diào)度在用戶數(shù)少、拓撲穩(wěn)定時算力開銷還能接受但一旦用戶規(guī)模上來每時隙的優(yōu)化問題復雜度會快速提升現(xiàn)實場景中很難做到毫秒級響應(yīng)。強化學習的思路則完全不同。它把資源分配策略隱含在一個神經(jīng)網(wǎng)絡(luò)里通過智能體與仿真環(huán)境的持續(xù)交互逐步逼近最優(yōu)策略。每次決策只需要一次前向傳播推理速度非常快而且它不需要精確知道信道模型的數(shù)學表達式是典型的“數(shù)據(jù)驅(qū)動”方法。這正是它在室內(nèi)動態(tài)場景下的核心價值所在。1.2 馬爾可夫決策過程的四項要素如何落到無線資源分配上將一個物理問題轉(zhuǎn)化為MDP最常見的困惑就是“我的狀態(tài)空間到底要包含哪些信息”。我的經(jīng)驗是遵循一個原則只放那些對當前決策有直接影響、且智能體能夠觀測到的信息。在室內(nèi)無線資源分配這個場景中我的狀態(tài)設(shè)計如下信道狀態(tài)信息所有用戶到各接入點的信道增益矩陣。因為室內(nèi)信道有快衰落分量實際仿真中一般取瞬時CSI或者經(jīng)過平滑后的有效SNR。用戶業(yè)務(wù)需求每個用戶當前時隙的需求速率或緩存隊列長度。這決定了資源分配的優(yōu)先級。歷史資源分配結(jié)果上一時隙各用戶獲得的功率或資源塊數(shù)量。加入這個狀態(tài)可以讓智能體感知到“上一輪我給了誰多少資源”有利于策略的平穩(wěn)性。干擾水平各接收端當前受到的鄰區(qū)干擾功率。在室內(nèi)多AP場景中這個量對吞吐量影響很大。動作空間是強化學習建模中最需要謹慎設(shè)計的部分。連續(xù)功率分配可以用連續(xù)動作空間的DDPG等算法來做但Matlab仿真調(diào)試成本相對較高。我的做法是做離散化處理將每個用戶的發(fā)射功率劃分為若干等級。假設(shè)一個AP給它的關(guān)聯(lián)用戶分配下行功率功率范圍為0到20dBm以2dBm為步長就是11個等級有N個關(guān)聯(lián)用戶時聯(lián)合動作空間就是11的N次方這個復雜度顯然不可接受。所以更合理的做法是每次只為某個特定的用戶分配功率或者將用戶按優(yōu)先級排序后逐個決策。我在仿真中采用了“逐用戶決策”的方式每次智能體選擇一個用戶的功率等級然后環(huán)境返回對應(yīng)的瞬時吞吐量反饋更新狀態(tài)后繼續(xù)為下一個用戶決策。這樣動作空間就是11個離散等級網(wǎng)絡(luò)輸出維度完全可控。獎勵函數(shù)的設(shè)計直接決定了算法最終學出來的策略長什么樣。我的獎勵項拆成三部分吞吐量獎勵當前用戶獲得的吞吐量這是核心目標公平性懲罰用Jain公平性指數(shù)作為正則項如果某一輪資源分配導致用戶間速率差距過大就給予懲罰功率代價發(fā)射功率本身有能耗代價同時過大的發(fā)射功率會加劇干擾所以對高功率等級施加輕微懲罰。將三者按權(quán)重相加得到最終的獎勵值。這里有一個關(guān)鍵經(jīng)驗獎勵的數(shù)值尺度要保持在合理范圍如果獎勵值動輒上千神經(jīng)網(wǎng)絡(luò)訓練的穩(wěn)定性會非常差。我通常將吞吐量歸一化處理讓單位時隙獎勵落在0到5之間。生活化一點去理解這個建模過程智能體就像一位外賣調(diào)度員不能只知道哪個餐館訂單多就往哪里安排騎手還要知道每個騎手的位置、路況、訂單時效要求和超時懲罰才能做出合理派單。強化學習要做的就是讓調(diào)度員在大量派單-反饋循環(huán)中逐漸積累經(jīng)驗。1.3 狀態(tài)空間維度與動作離散化粒度的權(quán)衡在定義MDP時很多人會犯一個錯誤把能觀測到的信息統(tǒng)統(tǒng)塞進狀態(tài)向量。我剛開始做的時候也是這樣結(jié)果網(wǎng)絡(luò)參數(shù)量驟增樣本效率急劇下降訓練幾百輪都不見收斂。一個比較穩(wěn)妥的做法是控制狀態(tài)向量維度在幾十以下。在8個用戶、4個AP的室內(nèi)場景中狀態(tài)向量可以設(shè)計成狀態(tài)項維度說明用戶信道增益8×432展平為向量歸一化業(yè)務(wù)需求8每個用戶需求速率上一輪功率等級8上一時隙各用戶功率當前干擾水平8各接收端的干擾功率合計56維屬于全連接網(wǎng)絡(luò)能夠處理的范疇。如果用戶數(shù)量繼續(xù)增加比如到32個用戶就需要考慮用降維處理比如只取Top K個干擾源的信息或者對CSI做特征提取否則網(wǎng)絡(luò)訓練難度會顯著上升。動作離散化粒度方面2dBm步長通常是一個不錯的起點。如果步長太細動作數(shù)量增多每個動作被探索到的概率下降訓練時間增加如果太粗功率控制精度不夠算法的性能上限會受影響。實際仿真中可以先粗后細先用較大步長驗證整體框架能收斂再逐步細化功率等級。2. 深度Q網(wǎng)絡(luò)與表格Q學習的本質(zhì)差異為什么無線資源分配必須上神經(jīng)網(wǎng)絡(luò)這一節(jié)我想重點聊一聊DQN這個方法本身因為很多初學者把DQN當成一個通用黑盒工具直接調(diào)用不理解它內(nèi)部三個關(guān)鍵機制的設(shè)計動機一旦仿真不收斂就完全不知道從哪里排查。2.1 表格Q-Learning在連續(xù)狀態(tài)空間下的致命缺陷Q-Learning的核心是維護一張Q值表 (Q(s,a))記錄每個狀態(tài)-動作對的價值估計。算法每次與環(huán)境交互后根據(jù)獲得的獎勵和下一狀態(tài)的最大Q值來更新當前Q值[ Q(s,a) \leftarrow Q(s,a) \alpha [r \gamma \max_{a} Q(s, a) - Q(s,a)] ]這個公式理解起來并不困難真正的問題在于表格的規(guī)模。如果狀態(tài)向量是56維就算每個維度只做二值化處理狀態(tài)總數(shù)也有 (2^{56})這個數(shù)量的Q值表不要說存儲就是遍歷一遍都不可想象。更何況信道增益、業(yè)務(wù)需求這些變量本質(zhì)上都是連續(xù)值簡單量化會丟失信息。更關(guān)鍵的一點是泛化能力完全喪失。無線信道狀態(tài)幾乎不會和歷史狀態(tài)完全一致表格方法遇到一個沒見過的狀態(tài)就無從決策只能重新隨機探索。這使得表格Q-Learning在真正意義上的無線資源分配場景里完全不可行。而DQN用神經(jīng)網(wǎng)絡(luò)擬合Q函數(shù)輸入是連續(xù)狀態(tài)向量輸出是每個動作的Q值估計天然具備泛化能力相似的輸入會得到相似的決策輸出。2.2 經(jīng)驗回放與目標網(wǎng)絡(luò)讓神經(jīng)網(wǎng)絡(luò)訓練穩(wěn)定下來的兩個關(guān)鍵機制神經(jīng)網(wǎng)絡(luò)訓練的基本前提是樣本獨立同分布。但在強化學習中數(shù)據(jù)是智能體與環(huán)境交互產(chǎn)生的時序數(shù)據(jù)相鄰時隙的狀態(tài)、動作、獎勵高度相關(guān)直接用這些時序數(shù)據(jù)做梯度下降訓練過程會劇烈震蕩甚至發(fā)散。經(jīng)驗回放機制就是針對這個問題設(shè)計的。實現(xiàn)上很簡單在Matlab中維護一個經(jīng)驗緩沖區(qū)每輪交互產(chǎn)生的四元組狀態(tài)、動作、獎勵、下一狀態(tài)存入緩沖區(qū)訓練時隨機從緩沖區(qū)中采樣一個小批量進行網(wǎng)絡(luò)更新。隨機采樣打破了樣本之間的時間相關(guān)性同時多條歷史經(jīng)驗可以被反復使用提高了數(shù)據(jù)利用效率。我的經(jīng)驗是緩沖區(qū)容量不要設(shè)得太小至少2萬條起步否則隨機采樣的效果不明顯。目標網(wǎng)絡(luò)機制解決的是另一個問題自舉偏差。Q值更新的目標中包含當前網(wǎng)絡(luò)本身的輸出 ( \max_{a} Q(s,a) )這意味著網(wǎng)絡(luò)在更新時是在“用自己當前的價值判斷去指導自己更新”。如果當前估計已經(jīng)偏差很大更新方向也會被帶偏形成惡性循環(huán)。DQN的做法是維護一份延遲更新的目標網(wǎng)絡(luò)每隔固定步數(shù)才從在線網(wǎng)絡(luò)復制參數(shù)。更新目標網(wǎng)絡(luò)時使用目標網(wǎng)絡(luò)輸出的是Q值而不是當前正在訓練的網(wǎng)絡(luò)輸出[ y_i r_i \gamma \max_{a} Q_{\text{target}}(s_i, a) ]再結(jié)合經(jīng)驗回放訓練穩(wěn)定性會有質(zhì)的提升。我從實測中的感受是目標網(wǎng)絡(luò)更新周期設(shè)置在400到1000步之間效果較好更新太頻繁目標網(wǎng)絡(luò)和在線網(wǎng)絡(luò)過于接近容易恢復震蕩更新太慢價值估計收斂變慢。2.3 網(wǎng)絡(luò)結(jié)構(gòu)選擇與Double DQN的必要性對于室內(nèi)無線資源分配這種規(guī)模的問題網(wǎng)絡(luò)結(jié)構(gòu)不需要太復雜。我在Matlab中使用的網(wǎng)絡(luò)結(jié)構(gòu)如下% 狀態(tài)維度56維動作數(shù)量11個 % 使用Deep Learning Toolbox構(gòu)建網(wǎng)絡(luò) statePath [ featureInputLayer(56, Normalization, none, Name, state) fullyConnectedLayer(128, Name, fc1) reluLayer(Name, relu1) fullyConnectedLayer(128, Name, fc2) reluLayer(Name, relu2) ]; qNetwork [ statePath fullyConnectedLayer(11, Name, output) ];兩個隱藏層、每層128個單元這個規(guī)模對56維輸入、11個動作的輸出空間已經(jīng)完全夠用。更深的網(wǎng)絡(luò)結(jié)構(gòu)在復雜視覺任務(wù)中有效但在無線資源分配這類狀態(tài)維度并不太高的場景中過度加深網(wǎng)絡(luò)只會增加過擬合風險和訓練時間。Double DQN是針對Q值過估計問題的改進。傳統(tǒng)的DQN在計算目標值時要取 ( \max_{a} Q(s,a) )由于函數(shù)逼近存在誤差取最大值操作會系統(tǒng)性高估動作價值而且這種高估在訓練后期會越來越明顯導致策略變得過于激進。Double DQN的思路很簡單用在線網(wǎng)絡(luò)選擇最優(yōu)動作用目標網(wǎng)絡(luò)評估該動作的Q值[ a^* \arg\max_{a} Q_{\text{online}}(s, a) ] [ y_i r_i \gamma Q_{\text{target}}(s_i, a^*) ]在Matlab中實現(xiàn)這個邏輯時最關(guān)鍵的技術(shù)點在于如何在不打斷自動微分鏈路的情況下只使用在線網(wǎng)絡(luò)做動作選擇。具體做法是先用predict(onlineNet, nextState)得到在線網(wǎng)絡(luò)的所有動作Q值找到最大值對應(yīng)的動作索引然后用predict(targetNet, nextState)取出該索引對應(yīng)的值作為目標Q值。這兩個操作都只做前向傳播不參與梯度計算。我的實際經(jīng)驗是Double DQN幾乎不會比原始DQN差在多數(shù)情況下能明顯改善訓練的穩(wěn)定性屬于性價比極高的改進。如果你已經(jīng)決定做這個仿真項目建議直接從Double DQN起步不要先用標準DQN跑通了再改省掉一次重復調(diào)試的時間。3. Matlab仿真實現(xiàn)全流程從場景參數(shù)配置到訓練主循環(huán)Matlab做強化學習仿真有兩個路線一是使用自帶的Reinforcement Learning Toolbox它提供了rlQAgent等現(xiàn)成接口缺點是自定義環(huán)境相對繁瑣而且工具箱版本差異較大二是完全手寫訓練流程靈活度高適合做研究驗證。我個人傾向后者因為要觀察每一步的中間結(jié)果、修改獎勵函數(shù)、打印調(diào)試信息手寫代碼更直觀可控。3.1 室內(nèi)場景參數(shù)配置與信道模型選擇仿真場景我設(shè)置為一個20米×30米的室內(nèi)空間部署4個接入點用戶數(shù)量根據(jù)實驗需求調(diào)整默認8個用戶。AP位置固定在四個角落附近用戶在場景內(nèi)隨機分布并關(guān)聯(lián)到距離最近且信號強度最佳的AP。核心參數(shù)如下參數(shù)數(shù)值說明場景尺寸20m × 30m模擬中型辦公環(huán)境AP數(shù)量4位于固定位置用戶數(shù)量8可在4到20之間調(diào)整載波頻率2.4 GHz室內(nèi)WiFi典型頻段發(fā)射功率范圍0 ~ 20 dBm按2dBm步長離散化噪聲功率-90 dBm接收機底噪路徑損耗指數(shù)2.8室內(nèi)視距與非視距混合穿墻損耗8 dB/堵墻隔斷墻體損耗陰影衰落標準差4 dB對數(shù)正態(tài)陰影業(yè)務(wù)需求速率1 ~ 10 Mbps按均勻分布生成信道模型方面我采用的是經(jīng)典的路徑損耗加陰影衰落模型再加上一階自回歸模型模擬時間相關(guān)性。這樣做比每時隙完全獨立生成信道要更貼近真實場景。Matlab中可以用如下方式生成% 生成室內(nèi)路徑損耗 function pl pathLoss(d, fc, n) % d: 距離(m), fc: 載波頻率(Hz), n: 路徑損耗指數(shù) pl 20*log10(4*pi*d*fc/3e8) 10*n*log10(d); end % 加入陰影衰落和穿墻損耗 shadowStd 4; wallLoss 8; pl_total pathLoss(distance, 2.4e9, 2.8) ... shadowStd*randn wallLoss * numWalls;需要特別提醒的是穿墻損耗的加入對算法性能影響非常大。如果沒有穿墻損耗用戶只需選擇最近的AP就能獲得不錯性能問題過于簡單體現(xiàn)不出智能算法的優(yōu)勢加入墻體阻隔后用戶可能距離某個AP很近但隔了兩堵墻此時選擇另一個AP反而更好這種非直觀關(guān)聯(lián)正是強化學習能夠?qū)W習的價值所在。3.2 經(jīng)驗回放緩沖區(qū)與目標網(wǎng)絡(luò)更新實現(xiàn)經(jīng)驗回放緩沖區(qū)在Matlab中可以用簡單的結(jié)構(gòu)體數(shù)組實現(xiàn)。為了效率我預先分配了固定大小的矩陣并用環(huán)形緩沖的方式覆蓋舊經(jīng)驗。這一點非常重要——很多人在Matlab仿真中發(fā)現(xiàn)越跑越慢問題就出在反復動態(tài)擴容數(shù)組上。% 經(jīng)驗回放緩沖區(qū)初始化 bufferSize 50000; stateBuffer zeros(56, bufferSize); actionBuffer zeros(1, bufferSize); rewardBuffer zeros(1, bufferSize); nextStateBuffer zeros(56, bufferSize); doneBuffer zeros(1, bufferSize); bufferPtr 1; bufferCount 0; % 存儲一條經(jīng)驗 function storeExperience(state, action, reward, nextState, done) stateBuffer(:, bufferPtr) state; actionBuffer(bufferPtr) action; rewardBuffer(bufferPtr) reward; nextStateBuffer(:, bufferPtr) nextState; doneBuffer(bufferPtr) done; bufferPtr mod(bufferPtr, bufferSize) 1; bufferCount min(bufferCount 1, bufferSize); end % 隨機采樣一個小批量 batchSize 64; idx randi(bufferCount, batchSize, 1); batchStates stateBuffer(:, idx); batchActions actionBuffer(:, idx); batchRewards rewardBuffer(:, idx); batchNextStates nextStateBuffer(:, idx); batchDones doneBuffer(:, idx);目標網(wǎng)絡(luò)的更新不采用軟更新而是硬復制每訓練500步將在線網(wǎng)絡(luò)參數(shù)整體賦值給目標網(wǎng)絡(luò)。在Matlab中可以用dlupdate配合自定義函數(shù)實現(xiàn)更簡單的方式是直接保存網(wǎng)絡(luò)結(jié)構(gòu)體再載入% 每500步更新一次目標網(wǎng)絡(luò) if mod(totalStep, 500) 0 targetNet onlineNet; % 直接賦值 end這里有一個性能優(yōu)化的細節(jié)在線網(wǎng)絡(luò)和目標網(wǎng)絡(luò)都使用dlnetwork類型訓練時要把輸入狀態(tài)轉(zhuǎn)換為dlarray指定數(shù)據(jù)格式。建議把整個訓練過程用“白箱”方式編寫每100步輸出一次當前損失和平均獎勵方便實時觀察訓練狀態(tài)。3.3 主訓練循環(huán)中容易出錯的關(guān)鍵代碼段訓練主循環(huán)是DQN的核心邏輯本身不復雜但有幾個細節(jié)容易出錯我逐個說明。第一個細節(jié)是狀態(tài)歸一化。信道增益數(shù)值范圍可能在1e-8到1e-4之間跳躍業(yè)務(wù)需求在1到10Mbps之間量綱不同會導致網(wǎng)絡(luò)輸入分布差異過大。我在生成狀態(tài)向量時將信道增益除以參考值業(yè)務(wù)需求除以最大需求功率等級減去平均值再除以標準差讓所有輸入落在相對一致的數(shù)值范圍內(nèi)。這一步對收斂速度的影響是決定性的。第二個細節(jié)是ε-greedy探索策略的設(shè)計。探索率從1.0線性衰減到0.05衰減步數(shù)一般是總訓練步數(shù)的一半epsilon max(1.0 - totalStep / decaySteps, 0.05); if rand epsilon action randi(numActions); else qValues predict(onlineNet, dlarray(state, CB)); [~, actionIdx] max(extractdata(qValues)); action actionIdx; end第三個細節(jié)是在計算目標Q值時對終止狀態(tài)的處理。如果下一狀態(tài)是終止狀態(tài)那么目標Q值就等于獎勵本身不再加折扣的未來價值for i 1:batchSize if batchDones(i) targetQ(i) batchRewards(i); else % Double DQN: 在線網(wǎng)絡(luò)選動作目標網(wǎng)絡(luò)給價值 nextQOnline predict(onlineNet, dlarray(batchNextStates(:,i), CB)); [~, aBest] max(extractdata(nextQOnline)); nextQTarget predict(targetNet, dlarray(batchNextStates(:,i), CB)); targetQ(i) batchRewards(i) gamma * extractdata(nextQTarget(aBest)); end end很多初學者在Matlab代碼里會遺漏extractdata導致數(shù)值類型錯誤或者無法計算梯度這個坑我在調(diào)試時踩了不止一次。確認清楚當前數(shù)據(jù)是dlarray還是普通數(shù)值數(shù)組訓練過程的絕大多數(shù)報錯都能避掉。訓練主循環(huán)整體流程如下先隨機重置一次室內(nèi)場景智能體在當前狀態(tài)下對每個用戶依次執(zhí)行功率決策環(huán)境根據(jù)決策計算吞吐量、干擾和滿意度得到獎勵并轉(zhuǎn)移到下一狀態(tài)。當一個時隙內(nèi)所有用戶的決策都完成后為一個完整回合episode然后重新隨機生成用戶位置和業(yè)務(wù)需求開始下一回合。4. 收斂性分析、傳統(tǒng)方案對比與常見異常排查訓練完成后最關(guān)心的就是策略是否真正提升了資源分配性能。這一部分我拿實際仿真結(jié)果說話同時給出調(diào)試中經(jīng)常遇見的異常情況及對應(yīng)的排查思路。4.1 訓練收斂曲線如何解讀獎勵曲線與損失曲線的配合判斷一個常見的誤區(qū)是只盯著獎勵曲線看不下降就認為算法有問題。獎勵曲線本身噪聲很大尤其在前幾百回合波動甚至可能看起來是負優(yōu)化。真正可靠的判斷指標是滑動平均獎勵曲線以及損失曲線的整體趨勢。我在8用戶場景下用如下參數(shù)訓練了2000個回合每個回合執(zhí)行8次決策對應(yīng)8個用戶的功率分配超參數(shù)數(shù)值學習率1e-4折扣因子gamma0.95經(jīng)驗池容量50000批量大小64探索衰減步數(shù)30000目標網(wǎng)絡(luò)更新頻率500步訓練回合數(shù)2000訓練結(jié)果呈現(xiàn)典型的三個階段第一階段前200回合獎勵值在1.0到2.0之間波動基本沒有上升趨勢此時智能體主要靠隨機探索積累經(jīng)驗第二階段200到1000回合獎勵穩(wěn)步上升從2.0附近逐漸攀升到3.5左右說明網(wǎng)絡(luò)已經(jīng)開始學到有效的功率分配策略損失曲線同步下降第三階段1000回合之后獎勵曲線增幅放緩在3.5附近波動并趨于平穩(wěn)損失趨近于小范圍內(nèi)震蕩此時可以認為策略基本收斂。值得注意的是損失曲線并不一定完全平滑下降偶爾出現(xiàn)突然上升的尖峰是正常的。如果尖峰頻率過高且獎勵曲線同步驟降大概率是學習率過大可以把學習率從1e-4降到5e-5重新訓練。4.2 與輪詢分配和最大信噪比分配的性能對比單看DQN自己的訓練曲線無法說明算法好在哪里。我在相同場景下對比了三種方案輪詢RR平均分配、最大信噪比Max-SNR分配和DQN學習到的分配策略。每個方案運行100個獨立仿真時隙取平均結(jié)果方案平均系統(tǒng)吞吐量(Mbps)公平性指數(shù)平均功率(dBm)輪詢分配41.60.8410.0最大信噪比分配46.20.6212.4DQN策略52.80.8710.8從這個結(jié)果可以明顯看出DQN在系統(tǒng)總吞吐量上比傳統(tǒng)方案提升約14%到27%同時維持了較好的公平性。有意思的是Max-SNR方案雖然用更大的平均發(fā)射功率換來一定的吞吐量但用戶間速率差距被拉大公平性跌到0.62這種結(jié)果在真實業(yè)務(wù)中其實是不可接受的——邊緣用戶可能長期得不到服務(wù)用戶體驗非常差。從我個人實驗的角度來看DQN策略最大的價值不是簡簡單單提高吞吐量而是學會了“看人下菜碟”的分配邏輯對信道質(zhì)量好、業(yè)務(wù)需求大的用戶多給功率對信道質(zhì)量差、本身也沒有太多業(yè)務(wù)需求的用戶少給功率甚至不給功率。這種分配方式既保證了總體收益又兼顧了用戶間的平衡。4.3 訓練不收斂與訓練崩潰的排查路徑訓練過程出現(xiàn)異常時不要盲目改參數(shù)先按下面幾個維度逐步排查。獎勵函數(shù)尺度問題如果獎勵值的絕對數(shù)值過大比如幾十上百神經(jīng)網(wǎng)絡(luò)梯度會異常大更新一步就足以讓參數(shù)面目全非。解決辦法是把獎勵值壓縮到一個合適的尺度我的做法是除以一個參考吞吐量常量把獎勵控制在0到5之間。鄰居信道的干擾建模出錯仿真中最隱蔽的錯誤是把所有用戶的信道增益統(tǒng)一用同一隨機種子生成導致用戶間的信道狀態(tài)高度相關(guān)算法學不到有效區(qū)分用戶差異的模式。檢查方法是輸出幾個用戶狀態(tài)向量看看數(shù)值分布是否明顯不同。梯度爆炸導致的NaN崩潰訓練到一半損失突然出現(xiàn)NaN最常見的原因是梯度累積過大。此時需要檢查網(wǎng)絡(luò)層是否使用了合適的初始化或者在損失計算后添加梯度裁剪。在Matlab中可以手動裁剪梯度gradients dlgradient(loss, dlnet.Learnables); % 梯度裁剪閾值設(shè)為1 gradients dlupdate((g) max(min(g, 1), -1), gradients);“損失不降但獎勵在升”這類情況往往不是bug而是因為ε在衰減策略逐漸從隨機探索轉(zhuǎn)向利用已學知識Q值的估計誤差在合理范圍??梢圆榭匆幌掠柧毜幕瑒悠骄剟钍欠癯掷m(xù)走高如果是就繼續(xù)訓練觀察不用擔心損失不降。5. 從單時隙決策到實際場景落地我實踐中的幾個心得體會與可擴展方向完成基礎(chǔ)DQN仿真之后如果想往深水區(qū)走有幾個方向值得繼續(xù)探索。第一階段可以先從算法改進入手——在同一個仿真框架上嘗試Dueling DQN或優(yōu)先經(jīng)驗回放。Dueling DQN將Q值拆分為狀態(tài)價值和動作優(yōu)勢兩部分在有大量相似狀態(tài)但不同動作的無線場景中這種結(jié)構(gòu)能讓網(wǎng)絡(luò)更快學習狀態(tài)價值函數(shù)從而提升收斂速度。優(yōu)先經(jīng)驗回放則重點關(guān)注那些TD誤差較大的歷史樣本讓網(wǎng)絡(luò)優(yōu)先學習“難樣本”在非平穩(wěn)信道場景下效果很明顯。第二階段是向多智能體方向拓展。單智能體DQN在做多AP協(xié)同資源分配時本質(zhì)上把全局觀測都集中到一個智能體上做決策。這種集中式做法在小區(qū)數(shù)量增大后狀態(tài)維度會迅速膨脹。更合理的思路是為每個AP部署一個智能體采用集中式訓練、分布式執(zhí)行的架構(gòu)訓練時每個智能體共享全局Q值信息執(zhí)行時只依賴局部觀測。以VDN或QMIX為代表的合作多智能體強化學習算法值得在室內(nèi)多AP場景中試一把。這里還想分享一個很實用的工程經(jīng)驗Matlab內(nèi)手寫的DQN代碼調(diào)通之后如果追求更快的訓練速度可以用Matlab的Parallel Computing Toolbox并行跑多個環(huán)境的采樣。因為經(jīng)驗回放機制本來就能容忍不同環(huán)境產(chǎn)生的混合數(shù)據(jù)并行采樣可以有效打散樣本間的時序相關(guān)性一舉兩得。我在實驗里用4個并行工作器采樣訓練時間大致縮短了50%以上收斂性能還略有改善。最后做一個邊界問題的提醒仿真環(huán)境畢竟是真實世界的近似DQN策略在仿真中訓練到收斂并不等于部署到現(xiàn)網(wǎng)就能直接照搬。真實環(huán)境中存在信道估計誤差、反饋時延、信令開銷等問題這些都是仿真很難完美復現(xiàn)的。如果你的目標是學術(shù)驗證或算法對比當前這套仿真框架已經(jīng)足夠扎實如果你希望走向?qū)嶋H部署更穩(wěn)妥的思路是首先在仿真中加入一個CSI估計誤差模型觀察策略的魯棒性變化再逐步引入更多非理想因素。這一步做扎實了算法從仿真到真實場景的距離才會真正縮小。