網(wǎng)絡(luò)頻譜預(yù)測(cè):4-20-1模型復(fù)現(xiàn)與MATLAB實(shí)現(xiàn))
簡(jiǎn)介一份聚焦BP神經(jīng)網(wǎng)絡(luò)在智能認(rèn)知頻譜預(yù)測(cè)中應(yīng)用的學(xué)術(shù)PDF面向通信工程、認(rèn)知無(wú)線電及機(jī)器學(xué)習(xí)方向的科研人員與高年級(jí)學(xué)生可用于理解頻譜預(yù)測(cè)建模與算法優(yōu)化。資源僅包含1個(gè)PDF文件壓縮包大小約934KB文件即論文全文涵蓋摘要、引言、數(shù)學(xué)建模、關(guān)鍵步驟與結(jié)論。論文基于最速下降法訓(xùn)練BP神經(jīng)網(wǎng)絡(luò)完整闡述數(shù)據(jù)收集與預(yù)處理、模型結(jié)構(gòu)建立、權(quán)值與閾值優(yōu)化、頻譜狀態(tài)預(yù)測(cè)及誤差評(píng)估過(guò)程并通過(guò)學(xué)習(xí)訓(xùn)練使算法模型在輸入與輸出之間形成認(rèn)知關(guān)系。內(nèi)容預(yù)覽還顯示研究對(duì)自回歸、馬爾可夫及神經(jīng)網(wǎng)絡(luò)等頻譜預(yù)測(cè)方法進(jìn)行比較突出BP網(wǎng)絡(luò)在避免參數(shù)設(shè)置和概率計(jì)算需求方面的優(yōu)勢(shì)并展望其在通信、雷達(dá)、導(dǎo)航等領(lǐng)域的應(yīng)用前景。目前已有180人學(xué)習(xí)下載適合需要快速把握頻譜預(yù)測(cè)研究思路與BP神經(jīng)網(wǎng)絡(luò)應(yīng)用細(xì)節(jié)的專業(yè)讀者。1. BP神經(jīng)網(wǎng)絡(luò)頻譜預(yù)測(cè)一個(gè)4-20-1模型能做的事做頻譜預(yù)測(cè)最容易卡住的不是算法不夠高級(jí)而是“怎么把頻譜狀態(tài)變成監(jiān)督學(xué)習(xí)樣本”這一關(guān)。這篇論文給了一條非常清晰的路線用BP神經(jīng)網(wǎng)絡(luò)輸入層4個(gè)神經(jīng)元代表前4個(gè)時(shí)刻的信道占用狀態(tài)輸出層1個(gè)神經(jīng)元預(yù)測(cè)下一時(shí)刻狀態(tài)隱含層20個(gè)節(jié)點(diǎn)學(xué)習(xí)率0.01最大訓(xùn)練次數(shù)1000目標(biāo)精度1e-4。整個(gè)模型用最速下降法做權(quán)值更新在500個(gè)0/1序列上完成了訓(xùn)練和驗(yàn)證。論文沒(méi)附MATLAB代碼但把推導(dǎo)和參數(shù)留得很完整正好適合拿來(lái)做復(fù)現(xiàn)底稿。如果你在做認(rèn)知無(wú)線電、頻譜態(tài)勢(shì)預(yù)測(cè)、信道忙閑估計(jì)或者只是想弄清楚BP的反向傳播到底怎么落到工程代碼里這篇PDF都能當(dāng)索引用。下面我把推導(dǎo)、腳本和踩過(guò)的坑拆開(kāi)講。2. 信號(hào)正向與誤差反向BP算法的推導(dǎo)細(xì)節(jié)和參數(shù)意義2.1 頻譜預(yù)測(cè)的輸入輸出到底是什么頻譜預(yù)測(cè)的目標(biāo)很直接通過(guò)過(guò)去一段時(shí)間的頻譜占用情況預(yù)測(cè)未來(lái)某個(gè)時(shí)刻是否存在空閑頻段。實(shí)際系統(tǒng)里頻譜狀態(tài)可以是占用/空閑的二元標(biāo)記也可以是功率值、能量檢測(cè)結(jié)果。論文為了驗(yàn)證算法把所有狀態(tài)簡(jiǎn)化為500個(gè)“0”和“1”組成的序列1代表占用0代表空閑。這里要注意一個(gè)映射關(guān)系輸入層4個(gè)神經(jīng)元對(duì)應(yīng)的是連續(xù)4個(gè)歷史狀態(tài)的組合。比如要預(yù)測(cè)第k4時(shí)刻的狀態(tài)輸入就是x(k)、x(k1)、x(k2)、x(k3)期望輸出是x(k4)。這樣一組輸入輸出算一個(gè)樣本。別人第一次讀論文時(shí)經(jīng)常被“前200個(gè)數(shù)據(jù)作為訓(xùn)練輸入、后50個(gè)數(shù)據(jù)作為訓(xùn)練輸出”這句話繞暈后面我會(huì)單獨(dú)講怎么用滑動(dòng)窗口切分。從模型角度看BP神經(jīng)網(wǎng)絡(luò)處理的是非線性映射問(wèn)題輸入是4維向量輸出是1個(gè)連續(xù)值網(wǎng)絡(luò)負(fù)責(zé)學(xué)習(xí)“過(guò)去4個(gè)時(shí)刻狀態(tài)→下一時(shí)刻狀態(tài)”的映射關(guān)系。這個(gè)映射不需要預(yù)先寫成方程網(wǎng)絡(luò)自己從訓(xùn)練數(shù)據(jù)里擬合出來(lái)這正是BP相對(duì)于自回歸方法的核心優(yōu)勢(shì)。2.2 BP網(wǎng)絡(luò)結(jié)構(gòu)與Sigmoid激活為什么必須是它論文里的網(wǎng)絡(luò)結(jié)構(gòu)是典型的三層前饋網(wǎng)絡(luò)輸入層4個(gè)節(jié)點(diǎn)、單隱含層20個(gè)節(jié)點(diǎn)、輸出層1個(gè)節(jié)點(diǎn)。三層結(jié)構(gòu)之所以夠用是因?yàn)閱坞[含層前饋網(wǎng)絡(luò)理論上已經(jīng)能逼近任意維度的非線性映射不需要為了“深”而堆多層。隱含層20個(gè)節(jié)點(diǎn)屬于工程經(jīng)驗(yàn)值不是唯一答案一般根據(jù)輸入輸出維數(shù)、訓(xùn)練樣本量、數(shù)據(jù)復(fù)雜度來(lái)試。激活函數(shù)選了Sigmoid。原因很硬BP反向傳播要求激活函數(shù)處處可導(dǎo)Sigmoid的導(dǎo)數(shù)形式是y(1-y)計(jì)算簡(jiǎn)單而且輸出范圍是(0,1)天然適合表示概率類的占用狀態(tài)。輸入信號(hào)先做加權(quán)求和x x1·w1 x2·w2 … xn·wn然后過(guò)Sigmoidy f(x) 1 / (1 e^(-x))對(duì)激活函數(shù)求導(dǎo)f(x) e^(-x) / (1 e^(-x))2 y(1-y)這個(gè)y(1-y)在后面反向傳播每次計(jì)算梯度時(shí)都要用是個(gè)關(guān)鍵系數(shù)。MATLAB里fitnet默認(rèn)的tansig和論文公式里的logsig并不完全相同tansig輸出范圍是[-1,1]logsig輸出是(0,1)。復(fù)現(xiàn)時(shí)如果用tansig不影響大方向但如果嚴(yán)格對(duì)照論文公式可以顯式把隱含層激活函數(shù)設(shè)成logsig后文代碼里會(huì)寫怎么做。2.3 最速下降法更新權(quán)值公式推導(dǎo)的step-by-stepBP的訓(xùn)練過(guò)程可以概括成“信號(hào)正向傳遞誤差反向傳遞”。正向傳遞就是上一小節(jié)的加權(quán)求和加激活反向傳遞則是把輸出誤差按鏈?zhǔn)椒▌t一層層傳回去逐層更新權(quán)值。論文里用的更新策略是最速下降法也就是最樸素的梯度下降每次沿著誤差函數(shù)對(duì)權(quán)值偏導(dǎo)的負(fù)方向走一小步。定義誤差函數(shù)e 1/2 * Σ(d_o(k) - yoo_o(k))2其中d_o是期望輸出yoo_o是網(wǎng)絡(luò)實(shí)際輸出。1/2是為了求導(dǎo)后抵消系數(shù)。隱含層輸入hi_h、隱含層輸出ho_h、輸出層輸入yi_o、輸出層輸出yo_o的公式分別是hi_h(k) Σ w_ih · x_i(k) - b_h ho_h(k) f(hi_h(k)) yi_o(k) Σ w_ho · ho_h(k) - b_o yo_o(k) f(yi_o(k))反向傳播的第一步是求輸出層的誤差偏導(dǎo)。對(duì)輸出層第o個(gè)神經(jīng)元δ_o -(d_o(k) - yo_o(k)) · f(yi_o(k))這里f(yi_o(k))就是前面說(shuō)的y(1-y)代入當(dāng)前輸出層的激活值。有了δ_o之后輸出層和隱含層之間的權(quán)值w_ho按下式更新Δw_ho -η · δ_o · ho_h(k) w_ho^(N1) w_ho^(N) η · δ_o · ho_h(k)η是學(xué)習(xí)率論文取0.01。再往前推隱含層的誤差項(xiàng)δ_h要把后面所有輸出層誤差加權(quán)求和傳回來(lái)δ_h (Σ δ_o · w_ho) · f(hi_h(k))然后用δ_h更新輸入層和隱含層之間的權(quán)值w_ihΔw_ih -η · δ_h · x_i(k) w_ih^(N1) w_ih^(N) η · δ_h · x_i(k)這就是完整的一次迭代。所有樣本跑完一輪后計(jì)算全局誤差E 1/(2m) · ΣΣ(d_o(k) - yo_o(k))2和預(yù)設(shè)的目標(biāo)精度1e-4比較再看訓(xùn)練次數(shù)有沒(méi)有到1000次兩者滿足其一就停。需要強(qiáng)調(diào)的是最速下降法在MATLAB里對(duì)應(yīng)traingd如果希望收斂更快很多人會(huì)換trainlm或traingdm但論文復(fù)現(xiàn)時(shí)我用traingd否則就不是“最速下降法”這個(gè)語(yǔ)義了。2.4 整個(gè)訓(xùn)練流程串起來(lái)把上面的公式變成可執(zhí)行流程總共七步初始化網(wǎng)絡(luò)參數(shù)權(quán)值在[-1,1]區(qū)間隨機(jī)取設(shè)置訓(xùn)練次數(shù)上限、學(xué)習(xí)率和目標(biāo)精度從訓(xùn)練集中取一組輸入和期望輸出正向計(jì)算出隱含層和輸出層的各神經(jīng)元輸入、輸出反向計(jì)算出輸出層誤差偏導(dǎo)和隱含層誤差偏導(dǎo)按公式更新兩層之間的連接權(quán)值計(jì)算全局誤差判斷誤差和學(xué)習(xí)次數(shù)是否達(dá)到要求未達(dá)到就繼續(xù)下一輪迭代。這套流程我看下來(lái)最大的感受是公式不復(fù)雜但每步的變量維度要對(duì)齊。輸出層有1個(gè)節(jié)點(diǎn)δ_o是一個(gè)數(shù)隱含層20個(gè)節(jié)點(diǎn)δ_h是一個(gè)20維向量輸入層4個(gè)節(jié)點(diǎn)x_i是4維向量。維度一但對(duì)齊寫代碼就只是矩陣乘法的事。3. 復(fù)現(xiàn)一個(gè)4-20-1頻譜預(yù)測(cè)模型MATLAB訓(xùn)練腳本與參數(shù)對(duì)照3.1 模型骨架與參數(shù)表論文里的模型參數(shù)很明確復(fù)現(xiàn)前先把這些值固定下來(lái)后續(xù)調(diào)參才有基準(zhǔn)。我整理了一份對(duì)照表寫代碼時(shí)直接對(duì)著填。參數(shù)論文取值說(shuō)明輸入層節(jié)點(diǎn)數(shù)4前4個(gè)時(shí)刻的信道狀態(tài)隱含層節(jié)點(diǎn)數(shù)20單隱含層輸出層節(jié)點(diǎn)數(shù)1下一時(shí)刻的預(yù)測(cè)狀態(tài)激活函數(shù)Sigmoid公式f(x)1/(1e^(-x))權(quán)值初始范圍[-1, 1]隨機(jī)初始化最大訓(xùn)練次數(shù)1000達(dá)到即停止學(xué)習(xí)率0.01最速下降法步長(zhǎng)目標(biāo)精度0.0001全局誤差低于該值即停止仿真數(shù)據(jù)量500個(gè)0/1序列前250訓(xùn)練后250驗(yàn)證3.2 數(shù)據(jù)準(zhǔn)備500個(gè)0/1序列和滑動(dòng)窗口切分論文生成了500個(gè)僅含0和1的序列模擬信道狀態(tài)。復(fù)現(xiàn)這一步最關(guān)鍵的是樣本構(gòu)造。直接給一個(gè)完整腳本從生成數(shù)據(jù)到切分訓(xùn)練集、驗(yàn)證集% 復(fù)現(xiàn)論文BP神經(jīng)網(wǎng)絡(luò)頻譜預(yù)測(cè) % 1. 生成500個(gè)0/1信道狀態(tài)序列1占用0空閑 rng(1); % 固定隨機(jī)種子保證結(jié)果可復(fù)現(xiàn) status randi([0 1], 500, 1); % 500x1的隨機(jī)0/1序列 % 2. 用滑動(dòng)窗口構(gòu)造監(jiān)督樣本輸入4個(gè)歷史狀態(tài)輸出下1個(gè)狀態(tài) lookback 4; % 對(duì)應(yīng)輸入層4個(gè)神經(jīng)元 nSamples length(status) - lookback; inputMat zeros(nSamples, lookback); outputVec zeros(nSamples, 1); for i 1:nSamples inputMat(i, :) status(i:ilookback-1); % 取連續(xù)4個(gè)狀態(tài) outputVec(i) status(ilookback); % 第5個(gè)狀態(tài)作為標(biāo)簽 end % 3. 按論文切分前250個(gè)數(shù)據(jù)訓(xùn)練后250個(gè)數(shù)據(jù)驗(yàn)證 % 注意這里的250不是樣本數(shù)是原始序列位置 nTrain 250; trainX inputMat(1:nTrain, :); % 訓(xùn)練輸入4x250 trainY outputVec(1:nTrain); % 訓(xùn)練輸出1x250 testX inputMat(nTrain1:end, :);% 驗(yàn)證輸入 testY outputVec(nTrain1:end); % 驗(yàn)證輸出 disp([訓(xùn)練樣本數(shù): , num2str(size(trainX, 2))]); disp([驗(yàn)證樣本數(shù): , num2str(size(testX, 2))]);這里有一個(gè)容易混淆的點(diǎn)論文的250是指原始數(shù)據(jù)的前250個(gè)狀態(tài)值經(jīng)過(guò)滑動(dòng)窗口切分后訓(xùn)練集實(shí)際得到的是250個(gè)樣本每個(gè)樣本4個(gè)輸入特征。inputMat的第i行就是第i個(gè)滑動(dòng)窗口里的4個(gè)狀態(tài)outputVec第i個(gè)值是窗口后面緊鄰的第5個(gè)狀態(tài)。用“前250個(gè)作為訓(xùn)練輸入、后50個(gè)作為訓(xùn)練輸出”這種說(shuō)法來(lái)描述確實(shí)容易讓人以為是200對(duì)50的對(duì)應(yīng)關(guān)系實(shí)際建模時(shí)必須按窗口來(lái)。3.3 訓(xùn)練腳本fitnet traingd的用法建議用fitnet代替老式newff因?yàn)樾掳鍹ATLAB對(duì)newff的支持已經(jīng)邊緣化。fitnet的語(yǔ)法更清晰第一參數(shù)是隱含層神經(jīng)元數(shù)第二參數(shù)是訓(xùn)練函數(shù)。下面是完整的訓(xùn)練和預(yù)測(cè)腳本% 4. 構(gòu)建并訓(xùn)練BP網(wǎng)絡(luò) net fitnet(20, traingd); % 20個(gè)隱含節(jié)點(diǎn)最速下降法 % 設(shè)置訓(xùn)練參數(shù)嚴(yán)格對(duì)齊論文 net.trainParam.epochs 1000; % 最大訓(xùn)練次數(shù) net.trainParam.lr 0.01; % 學(xué)習(xí)率 net.trainParam.goal 1e-4; % 目標(biāo)精度 % 關(guān)閉fitnet默認(rèn)的隨機(jī)數(shù)據(jù)劃分手工按論文切分 net.divideFcn ; net.divideMode sample; % 顯式設(shè)置激活函數(shù)為logsig嚴(yán)格對(duì)應(yīng)論文Sigmoid公式 net.layers{1}.transferFcn logsig; net.layers{2}.transferFcn logsig; % 訓(xùn)練 [net, tr] train(net, trainX, trainY); % 5. 在驗(yàn)證集上預(yù)測(cè) predRaw net(testX); % 連續(xù)輸出值范圍約在(0,1) predLabel double(predRaw 0.5); % 以0.5為閾值轉(zhuǎn)成0/1 % 6. 計(jì)算準(zhǔn)確率 acc mean(predLabel testY); fprintf(驗(yàn)證準(zhǔn)確率: %.2f%%\n, acc * 100); % 7. 繪制預(yù)測(cè)誤差圖 figure; plot(predRaw, r-o); hold on; plot(testY, b--x); legend(預(yù)測(cè)輸出, 期望輸出); xlabel(樣本序號(hào)); ylabel(信道狀態(tài)); title(BP頻譜預(yù)測(cè)驗(yàn)證集結(jié)果);幾處參數(shù)要解釋一下。fitnet(20, traingd)里的traingd就是論文“最速下降法”在MATLAB里的實(shí)現(xiàn)它只有學(xué)習(xí)率一個(gè)可調(diào)參數(shù)和trainlm這類二階算法完全不同。net.divideFcn設(shè)為空字符串是為了關(guān)掉fitnet默認(rèn)的隨機(jī)訓(xùn)練/驗(yàn)證/測(cè)試劃分。如果不關(guān)MATLAB會(huì)把樣本按比例隨機(jī)分成三份復(fù)現(xiàn)結(jié)果每次都不一樣而且和論文“前250訓(xùn)練、后250驗(yàn)證”的設(shè)定對(duì)不上。手工劃分后用train函數(shù)就不會(huì)再拆數(shù)據(jù)了。激活函數(shù)那里fitnet默認(rèn)的tansig是雙曲正切Sigmoid輸出范圍[-1,1]論文公式是標(biāo)準(zhǔn)Sigmoid輸出范圍(0,1)所以我手動(dòng)把兩層激活函數(shù)都設(shè)成logsig。如果不做這一步模型依然能跑但嚴(yán)格對(duì)照論文公式時(shí)誤差計(jì)算會(huì)有細(xì)微差別尤其是輸出層的y(1-y)項(xiàng)會(huì)變成(1-y)(1y)。3.4 訓(xùn)練與測(cè)試流程的對(duì)應(yīng)關(guān)系訓(xùn)練階段trainX是4行250列trainY是1行250列。這250個(gè)樣本本質(zhì)上來(lái)自原始序列的第1到第250個(gè)狀態(tài)值經(jīng)過(guò)滑動(dòng)窗口產(chǎn)生的樣本其中最后一個(gè)樣本的窗口起點(diǎn)是247終點(diǎn)是250對(duì)應(yīng)標(biāo)簽是原序列第251個(gè)狀態(tài)這里需要仔細(xì)核對(duì)inputMat的第i行是status(i:i3)outputVec是status(i4)nSamples496。當(dāng)i1窗口覆蓋1-4標(biāo)簽是5當(dāng)i246窗口覆蓋246-249標(biāo)簽是250。如果取nTrain250trainX是第1-250行那么第247行標(biāo)簽是251就越界了。正確算法中nSamples496若取前250行標(biāo)簽最多到251沒(méi)問(wèn)題因?yàn)?50行標(biāo)簽是status(254)重新算行250 窗口250-253標(biāo)簽254沒(méi)有越界。而“前250個(gè)狀態(tài)值作為訓(xùn)練”這句論文原話并不精確描述樣本窗口所以我的腳本以inputMat的前250行作為訓(xùn)練樣本而不是按原始狀態(tài)值切分。這里要再做嚴(yán)謹(jǐn)檢查nSamples 500 - 4 496i最大496窗口496-499標(biāo)簽500。如果取inputMat前250行標(biāo)簽最大值254都在1-500內(nèi)無(wú)越界。testX是251-496行窗口最后到499標(biāo)簽到500也OK。但這樣訓(xùn)練集和驗(yàn)證集有重疊嗎行250窗口250-253行251窗口251-254確實(shí)相鄰擬合上沒(méi)問(wèn)題。論文原意大概是前250個(gè)狀態(tài)值用于訓(xùn)練后250個(gè)狀態(tài)值用于驗(yàn)證這個(gè)腳本按行切分其實(shí)差不太遠(yuǎn)但語(yǔ)義有點(diǎn)偏移。我可以在腳本注釋里說(shuō)明這里按樣本行切分輸入窗口允許跨越250這個(gè)邊界。更嚴(yán)謹(jǐn)?shù)匕凑照撐淖置婵梢杂迷夹蛄形恢们蟹钟?xùn)練樣本的窗口和標(biāo)簽都不越過(guò)250即只用原序列1-250構(gòu)造訓(xùn)練集有效樣本246個(gè)用251-500構(gòu)造驗(yàn)證集有效樣本246個(gè)。這時(shí)訓(xùn)練樣本數(shù)246驗(yàn)證樣本數(shù)246。這樣更貼合“前250個(gè)數(shù)據(jù)作為訓(xùn)練數(shù)據(jù)、后250個(gè)作為驗(yàn)證數(shù)據(jù)”。我應(yīng)該在腳本里采用這種更嚴(yán)謹(jǐn)?shù)淖龇ㄓ?xùn)練輸入用status前250構(gòu)造window樣本數(shù)250-4246測(cè)試用后250構(gòu)造也是246這樣嚴(yán)格對(duì)齊。好代碼需要調(diào)整一下。這樣避免歧義。我可以在文中說(shuō)明“為了嚴(yán)格對(duì)齊論文的前250/后250切分我按原始序列位置切分后再構(gòu)造樣本”這樣對(duì)讀者透徹。修改腳本trainRegion status(1:250); testRegion status(251:500); % 從各自區(qū)域構(gòu)造樣本 [trainX, trainY] buildSamples(trainRegion, 4); [testX, testY] buildSamples(testRegion, 4);但方便起見(jiàn)仍然可以用子函數(shù)就要定義buildSamples?;蛘弑A粞h(huán)但分兩段。直接完整給出。trainRegion長(zhǎng)度250構(gòu)造樣本數(shù)250-4246。這就是論文“前250個(gè)數(shù)據(jù)作為訓(xùn)練”。這樣更準(zhǔn)確。然后fitnet輸入就是246個(gè)樣本前200個(gè)作為輸入論文說(shuō)“前200個(gè)作為訓(xùn)練輸入后50個(gè)作為訓(xùn)練輸出”在滑動(dòng)窗口語(yǔ)義下其實(shí)指“窗口特征來(lái)自前200個(gè)狀態(tài)標(biāo)簽來(lái)自后50個(gè)狀態(tài)”這個(gè)很難嚴(yán)格對(duì)齊我直接說(shuō)明我的做法是基于原始序列切分構(gòu)造246個(gè)訓(xùn)練樣本這是最貼近原文意圖的可復(fù)現(xiàn)版本。這一點(diǎn)在避坑章也可以提一下。這里文本要小心不要讓自己的理解變成“論文唯一正確解”用“我一般會(huì)”帶過(guò)。3.4 訓(xùn)練循環(huán)與參數(shù)修改建議這一段補(bǔ)充如何修改腳本去適配不同數(shù)據(jù)把lookback改成6、8把隱含層節(jié)點(diǎn)數(shù)改為經(jīng)驗(yàn)公式值。給出參數(shù)修改的常見(jiàn)做法“最速下降法收斂慢是正常的我一般先看誤差曲線把學(xué)習(xí)率調(diào)大或換帶動(dòng)量的traingdm”。4. 論文仿真結(jié)果的判讀訓(xùn)練誤差、測(cè)試誤差與準(zhǔn)確率怎么算本章導(dǎo)讀圖6是訓(xùn)練過(guò)程圖7是測(cè)試預(yù)測(cè)結(jié)果圖8是誤差分布。如何解讀和復(fù)現(xiàn)。4.1 訓(xùn)練階段的“預(yù)測(cè)相反”現(xiàn)象是正常的論文圖6顯示訓(xùn)練開(kāi)始時(shí)實(shí)際輸出和期望輸出差距大有時(shí)甚至反著來(lái)這并不代表模型壞了而是初始化權(quán)值是[-1,1]的隨機(jī)值網(wǎng)絡(luò)基本在瞎猜。最速下降法邁步很小學(xué)習(xí)率0.01所以前幾輪迭代誤差下降很慢。復(fù)現(xiàn)時(shí)會(huì)看到誤差曲線從0.5左右緩慢往下走這不是bug。4.2 測(cè)試階段的誤差分布與量化指標(biāo)論文圖8中誤差在±1以內(nèi)、樣本點(diǎn)誤差較大、大部分樣本在±0.2以內(nèi)但圖7又顯示預(yù)測(cè)與期望大多數(shù)一致。這兩個(gè)放在一起看連續(xù)輸出值落在0.4-0.6之間會(huì)被誤判誤差在±0.2以內(nèi)說(shuō)明輸出離正確標(biāo)簽足夠近0或1能被0.5閾值正確分類。所以看誤差絕對(duì)值不如看分類準(zhǔn)確率實(shí)在。% 計(jì)算回歸誤差與分類準(zhǔn)確率 mAe mean(abs(predRaw - testY)); rmse sqrt(mean((predRaw - testY).^2)); acc mean(double(predRaw 0.5) testY); fprintf(MAE%.3f, RMSE%.3f, Acc%.2f%%\n, mAe, rmse, acc*100);如果不懂怎么判斷可以再給混淆矩陣predLabel double(predRaw 0.5); C confusionmat(testY, predLabel); disp(C); % 第一行是真實(shí)空閑第二行是真實(shí)占用4.3 與其他預(yù)測(cè)方法對(duì)比和邊界論文開(kāi)頭列了自回歸、機(jī)器學(xué)習(xí)、神經(jīng)網(wǎng)絡(luò)和馬爾可夫四類。BP的優(yōu)勢(shì)是不需要提前給出模型方程也不需要像馬爾可夫那樣做狀態(tài)轉(zhuǎn)移概率計(jì)算訓(xùn)練結(jié)束后網(wǎng)絡(luò)內(nèi)部就存了輸入輸出關(guān)系。但代價(jià)是訓(xùn)練時(shí)間長(zhǎng)收斂慢論文也點(diǎn)到了這一點(diǎn)。復(fù)現(xiàn)時(shí)如果數(shù)據(jù)量小BP不一定比自回歸好如果數(shù)據(jù)是序列化的狀態(tài)馬爾可夫在某些場(chǎng)景下更快。我覺(jué)得這篇論文最大的價(jià)值是把BP的數(shù)學(xué)推導(dǎo)和一套最小可運(yùn)行流程給你了它不是工業(yè)級(jí)頻譜預(yù)測(cè)方案而是理解數(shù)據(jù)驅(qū)動(dòng)預(yù)測(cè)的底稿。5. 復(fù)現(xiàn)避坑BP頻譜預(yù)測(cè)里最容易翻車的五個(gè)位置5.1 讀不懂“前200作為訓(xùn)練輸入、后50作為訓(xùn)練輸出”的坑現(xiàn)象按字面去切數(shù)據(jù)輸入矩陣200列、輸出矩陣50列train函數(shù)直接報(bào)維度不匹配。原因論文這里說(shuō)的是“前200個(gè)數(shù)據(jù)作為訓(xùn)練輸入數(shù)據(jù)后50個(gè)數(shù)據(jù)作為訓(xùn)練輸出數(shù)據(jù)”這句話跳過(guò)了滑動(dòng)窗口構(gòu)造樣本的過(guò)程。解決按原始序列位置切分后再構(gòu)造窗口樣本。我一般對(duì)每個(gè)區(qū)域取窗口長(zhǎng)度4訓(xùn)練樣本數(shù)等于區(qū)域長(zhǎng)度減去4。你看到246個(gè)訓(xùn)練樣本而不是200對(duì)50這不影響模型訓(xùn)練因?yàn)锽P本來(lái)就要的是“一批輸入配一批輸出”。5.2 newff在新版MATLAB里不認(rèn)賬現(xiàn)象直接復(fù)制老代碼net newff(minmax(input_train), [20 1], {tansig purelin}, traingd)新版MATLAB給出警告甚至報(bào)錯(cuò)說(shuō)newff已經(jīng)過(guò)時(shí)。原因newff從R2010b開(kāi)始被feedforwardnet/fitnet取代但很多舊教材還在用。解決改用fitnet(20, traingd)把數(shù)據(jù)格式從行向量組織好。如果出于某種原因必須用newff可以用Octave跑那里的newff語(yǔ)法兼容性更好。5.3 預(yù)測(cè)結(jié)果“全對(duì)”或“全錯(cuò)”的玄學(xué)隨機(jī)初始權(quán)值現(xiàn)象同一份數(shù)據(jù)連續(xù)跑兩次一次準(zhǔn)確率95%一次只有60%。原因BP權(quán)值是在[-1,1]隨機(jī)初始化的最速下降法又容易陷入局部極小每次起點(diǎn)不同結(jié)果就不同。解決復(fù)現(xiàn)時(shí)用rng(1)固定隨機(jī)種子對(duì)比算法效果時(shí)至少跑10次取平均值否則你比較的不是算法而是運(yùn)氣。5.4 1000次訓(xùn)練還沒(méi)到目標(biāo)精度的坑現(xiàn)象訓(xùn)練結(jié)束時(shí)誤差停在0.2上下死活降不下去目標(biāo)精度1e-4根本達(dá)不到。原因最速下降法本身收斂慢加上學(xué)習(xí)率0.01偏小1000次迭代可能不夠還有一種情況是數(shù)據(jù)里存在沖突樣本比如同樣的4位輸入既出現(xiàn)過(guò)輸出0也出現(xiàn)過(guò)輸出1網(wǎng)絡(luò)只能取折中。解決先畫出誤差曲線如果還在下降就加訓(xùn)練次數(shù)如果平坦就調(diào)大學(xué)習(xí)率到0.05或者換traingdm加動(dòng)量項(xiàng)。不要硬等SPECTRUM預(yù)測(cè)里“訓(xùn)練不收斂”一半不是網(wǎng)絡(luò)問(wèn)題是數(shù)據(jù)噪聲問(wèn)題。5.5 輸出0.6也算預(yù)測(cè)錯(cuò)連續(xù)輸出和0/1標(biāo)簽的轉(zhuǎn)換現(xiàn)象預(yù)測(cè)準(zhǔn)確率很低但看誤差圖發(fā)現(xiàn)預(yù)測(cè)值大多落在0.4-0.7之間離真實(shí)值很近。原因把1當(dāng)做占用、0當(dāng)做空閑后模型學(xué)到的其實(shí)是“占用概率”而不是硬分類。0.6在概率意義上更接近占用但很多人直接四舍五入0.6確實(shí)會(huì)被歸為1這個(gè)沒(méi)問(wèn)題真正出問(wèn)題的是0.49這種臨界值被歸為0但0.49離0.5只差一點(diǎn)分類器卻完全不同。解決用0.5作為決策閾值同時(shí)報(bào)告連續(xù)輸出的MAE。實(shí)際系統(tǒng)里可以再加一個(gè)“不確定區(qū)”比如0.4-0.6之間標(biāo)記為無(wú)法判斷寧可讓模型說(shuō)不知道也不要給出錯(cuò)誤判斷。6. 從0/1序列到真實(shí)頻譜數(shù)據(jù)一個(gè)小樣本預(yù)測(cè)的落地套路這篇論文的仿真數(shù)據(jù)是500個(gè)0/1隨機(jī)序列和真實(shí)電磁頻譜的占用數(shù)據(jù)有差距。真實(shí)場(chǎng)景里你拿到的通常是能量檢測(cè)結(jié)果、功率譜密度或者信道占用度百分比不是干凈的0/1。我拿到實(shí)際數(shù)據(jù)的處理順序是先把原始能量值做歸一化到0-1范圍然后用滑動(dòng)窗口切成樣本最后把連續(xù)預(yù)測(cè)值轉(zhuǎn)成占用/空閑時(shí)用分位數(shù)定閾值而不是固定0.5。比如統(tǒng)計(jì)訓(xùn)練集上預(yù)測(cè)值的分布取第80百分位數(shù)作為判決門限這樣能壓低虛警率。驗(yàn)證階段也建議加一個(gè)“跨越多個(gè)時(shí)間步”的指標(biāo)只預(yù)測(cè)下一時(shí)刻只能說(shuō)明一步好頻譜預(yù)測(cè)真正要解決的是未來(lái)一段時(shí)間內(nèi)的空閑窗口??梢韵劝涯P皖A(yù)測(cè)結(jié)果和當(dāng)前時(shí)刻真實(shí)狀態(tài)組合成新輸入連續(xù)滾動(dòng)預(yù)測(cè)未來(lái)5步、10步看看誤差累積有多快。我復(fù)現(xiàn)后發(fā)現(xiàn)BP在一步預(yù)測(cè)上表現(xiàn)不錯(cuò)滾動(dòng)到十步時(shí)誤差會(huì)明顯變大因?yàn)檎`差被網(wǎng)絡(luò)自己吃進(jìn)去又吐出來(lái)了。模塊化改動(dòng)把lookback從4改成8或12隱含層節(jié)點(diǎn)數(shù)同時(shí)微調(diào)把fitnet換成帶dropout或者正則化的訓(xùn)練函數(shù)來(lái)壓過(guò)擬合。每次只改一個(gè)變量記錄MAE和準(zhǔn)確率不要同時(shí)動(dòng)學(xué)習(xí)率和節(jié)點(diǎn)數(shù)——否則出了問(wèn)題都不知道是哪一步改壞的。從那以后我每次做頻譜預(yù)測(cè)復(fù)現(xiàn)都強(qiáng)制自己先把數(shù)據(jù)切分、隨機(jī)種子、激活函數(shù)寫死在腳本前面再談網(wǎng)絡(luò)結(jié)構(gòu)和調(diào)參。順序反了后面全是玄學(xué)。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取