化研究)
簡(jiǎn)介MATLAB中基于DDQN算法的深淺基坑優(yōu)化開挖順序研究資源包面向土木工程施工管理人員、AI開發(fā)者及具備MATLAB與數(shù)學(xué)建模基礎(chǔ)的工程師。內(nèi)容聚焦兩個(gè)基坑深27米分八次開挖、淺12米分四次開挖在特定地質(zhì)與地下水條件下的開挖順序優(yōu)化以控制地連墻位移和地表沉降并縮短工期。資源系統(tǒng)展示了從環(huán)境定義、智能體創(chuàng)建、訓(xùn)練配置到測(cè)試評(píng)估的完整DDQN建模流程并給出簡(jiǎn)化但可擴(kuò)展的代碼示例同時(shí)針對(duì)實(shí)際項(xiàng)目中的地下水變化、獎(jiǎng)勵(lì)機(jī)制設(shè)計(jì)、歷史實(shí)測(cè)數(shù)據(jù)校準(zhǔn)等關(guān)鍵問題提供了注意事項(xiàng)與調(diào)整思路便于將算法遷移到類似工程決策場(chǎng)景。全包共1個(gè)文件格式為docx壓縮包大小357KB內(nèi)容集中便于按章節(jié)閱讀和對(duì)照實(shí)踐。目前已有133人學(xué)習(xí)下載適合希望用深度強(qiáng)化學(xué)習(xí)解決傳統(tǒng)工程問題的技術(shù)人員作為入門參考。1. 深淺基坑開挖順序優(yōu)化為什么最后要交給DDQN來算今天拆一個(gè)偏研究的題目MATLAB中基于DDQN算法的深淺基坑優(yōu)化開挖順序研究。把這個(gè)名字翻譯成人話就是用強(qiáng)化學(xué)習(xí)里的DDQN算法幫工程決策回答一個(gè)問題——同一片基坑里深坑區(qū)淺坑區(qū)交錯(cuò)著開挖先動(dòng)哪里、后動(dòng)哪里圍護(hù)結(jié)構(gòu)位移和支撐軸力才最小。這個(gè)問題的難點(diǎn)在于組合爆炸分區(qū)分得越細(xì)可行順序越多靠試算和經(jīng)驗(yàn)根本覆蓋不完。DDQN算法剛好擅長(zhǎng)這種時(shí)序決策任務(wù)MATLAB里又能把深度學(xué)習(xí)、數(shù)值計(jì)算和簡(jiǎn)單的平面應(yīng)變模型串在一起所以我們能在PC上把優(yōu)化流程跑通再把最優(yōu)順序交給專業(yè)有限元復(fù)核。這篇筆記適合兩類人做土木加算法交叉課題的研究生和想給基坑方案比選加一點(diǎn)自動(dòng)化判斷的現(xiàn)場(chǎng)工程師。2. 把開挖順序變成強(qiáng)化學(xué)習(xí)問題狀態(tài)、動(dòng)作與獎(jiǎng)勵(lì)建模要讓DDQN跑起來第一步不是寫網(wǎng)絡(luò)而是把施工過程改寫成馬爾可夫決策過程?;娱_挖順序優(yōu)化本質(zhì)上是一個(gè)序列決策問題站在智能體的視角它每次只需要回答當(dāng)前狀態(tài)下下一步開挖哪個(gè)區(qū)域。2.1 深淺基坑的交錯(cuò)開挖為什么是一個(gè)序列決策問題施工順序在巖土工程里一向靠經(jīng)驗(yàn)法則?!跋壬詈鬁\”是教科書和現(xiàn)場(chǎng)都愛掛在嘴邊的原則這句話在不少工況下成立但不是定理。深淺基坑交錯(cuò)布置時(shí)深區(qū)開挖卸載量大坑底隆起和墻后土壓力傳遞都更劇烈如果淺區(qū)還沒形成支撐深區(qū)的變形會(huì)順著圍護(hù)結(jié)構(gòu)往淺區(qū)傳。反過來先挖淺區(qū)、先加支撐對(duì)深區(qū)是個(gè)約束但深區(qū)最后開挖時(shí)淺區(qū)支撐軸力可能被頂?shù)胶芨呱踔脸?。所以“先深后淺”和“先淺后深”各有代價(jià)最優(yōu)解取決于土層參數(shù)、支護(hù)剛度和開挖深度差。再從組合角度看。一個(gè)中等基坑如果施工組織上允許不同分區(qū)獨(dú)立開挖現(xiàn)場(chǎng)通常分成6個(gè)甚至更多個(gè)開挖段。6個(gè)段全排列只有720種但10個(gè)段就是360萬種以上。如果每一步還要考慮“一次挖多少深度”這種粒度可行方案的量級(jí)會(huì)繼續(xù)爆炸。人工枚舉不現(xiàn)實(shí)直接有限元試算更不現(xiàn)實(shí)——單次開挖仿真按分鐘級(jí)別算360萬種方案幾乎沒有工程可接受的時(shí)間窗口。所以這類問題天生適合用替代模型加序列決策算法來逼近這就是把開挖順序建模成強(qiáng)化學(xué)習(xí)問題的動(dòng)機(jī)。2.2 狀態(tài)空間用“進(jìn)度響應(yīng)”描述每個(gè)開挖階段MDP狀態(tài)怎么定關(guān)鍵看決策信息夠不夠。只記錄“誰挖完誰沒挖完”是不夠的。兩個(gè)狀態(tài)可能都有三個(gè)區(qū)挖完但一個(gè)最大位移15mm另一個(gè)已經(jīng)28mm后續(xù)動(dòng)作的風(fēng)險(xiǎn)完全不同。狀態(tài)至少分兩塊進(jìn)度變量和響應(yīng)變量。進(jìn)度變量描述每個(gè)分區(qū)當(dāng)前已開挖深度比例、是否已經(jīng)封閉響應(yīng)變量描述當(dāng)前圍護(hù)結(jié)構(gòu)最大側(cè)移、最大支撐軸力和坑底隆起指標(biāo)。% 狀態(tài)編碼6個(gè)分區(qū)每個(gè)區(qū)用2個(gè)進(jìn)度量整體再加3個(gè)全局響應(yīng)量 numRegions 6; progressDepthRatio zeros(1, numRegions); % 已開挖深度 / 總開挖深度 progressFinished zeros(1, numRegions); % 是否開挖完成0或1 uMaxNorm 0; % 當(dāng)前最大側(cè)移 / 容許側(cè)移 nMaxNorm 0; % 當(dāng)前最大支撐軸力 / 支撐承載力 heaveNorm 0; % 當(dāng)前坑底隆起指標(biāo)歸一化值 state [progressDepthRatio, progressFinished, uMaxNorm, nMaxNorm, heaveNorm];這段代碼定義了送入Q網(wǎng)絡(luò)的狀態(tài)向量維度是2 * numRegions 3。注意所有物理量都做了歸一化位移不要直接用毫米軸力不要直接用千牛否則數(shù)值范圍差幾個(gè)量級(jí)梯度會(huì)被大數(shù)值特征帶走。第一版我沒歸一化把原始毫米值和千牛值直接拼進(jìn)狀態(tài)訓(xùn)練時(shí)loss一直抖后來全部除以各自的容許值之后問題才消失。2.3 動(dòng)作空間與不可行行為從全排列變成逐區(qū)域決策動(dòng)作定義為“下一步開挖哪個(gè)分區(qū)”動(dòng)作數(shù)量等于分區(qū)數(shù)。已經(jīng)挖完的區(qū)域在決策時(shí)要屏蔽不能讓智能體反復(fù)選同一個(gè)區(qū)域。屏蔽有兩種做法硬屏蔽和軟懲罰。硬屏蔽更直接在探索和利用階段都從合法動(dòng)作里采樣% 只在未開挖完成的區(qū)域里選動(dòng)作 legalActions find(progressFinished 0); action legalActions(randi(length(legalActions)));如果你的工況要求“一次挖一個(gè)整區(qū)”粒度太粗可以把每個(gè)區(qū)按深度分成淺層段和深層段動(dòng)作變成“區(qū)域編號(hào)段號(hào)”這樣DDQN能一步?jīng)Q策挖哪個(gè)區(qū)的哪一段。代價(jià)是動(dòng)作數(shù)量變多訓(xùn)練難度非線性上升。常見做法是先用整區(qū)粒度跑通確認(rèn)獎(jiǎng)勵(lì)和網(wǎng)絡(luò)結(jié)構(gòu)沒問題再細(xì)化分段。這里還有一個(gè)仿真耦合層面的布局問題。訓(xùn)練一個(gè)episode要跑6到15步仿真2000個(gè)episode就是上萬次調(diào)用如果每一步都調(diào)ABAQUS或PLAXIS時(shí)間完全不可接受。我一般會(huì)在訓(xùn)練階段用簡(jiǎn)化平面應(yīng)變模型或代理模型逼近響應(yīng)的相對(duì)趨勢(shì)把完整土體本構(gòu)留給最后的驗(yàn)證階段。簡(jiǎn)化模型不求絕對(duì)值準(zhǔn)確只求“不同開挖順序之間的優(yōu)劣排序”和真實(shí)有限元一致這個(gè)問題第5章還會(huì)遇到。3. MATLAB中DDQN的實(shí)現(xiàn)網(wǎng)絡(luò)結(jié)構(gòu)、目標(biāo)網(wǎng)絡(luò)與訓(xùn)練主循環(huán)MATLAB里做這個(gè)小課題只需要深度學(xué)習(xí)工具箱不需要專門裝強(qiáng)化學(xué)習(xí)工具箱。手寫訓(xùn)練主循環(huán)反而有個(gè)好處每一步在算什么、梯度往哪傳你都看得見后面改損失函數(shù)、加約束都方便。3.1 為什么用DDQN而不是DQNQ值過估計(jì)與決策偏差DDQN和DQN的區(qū)別只有一行公式但這一行很關(guān)鍵。標(biāo)準(zhǔn)DQN的目標(biāo)值寫作y r γ * max(Q_target(s, a))問題出在max操作上只要Q估計(jì)帶噪聲max就會(huì)傾向于選中被高估的動(dòng)作。基坑場(chǎng)景里獎(jiǎng)勵(lì)函數(shù)稀疏、量綱敏感這種過估計(jì)會(huì)被放大策略容易偏向一些“看起來劃算”實(shí)則位移超限的動(dòng)作。DDQN把動(dòng)作選擇和價(jià)值估計(jì)拆開y r γ * Q_target(s, argmax(Q_online(s)))在線網(wǎng)絡(luò)負(fù)責(zé)選動(dòng)作目標(biāo)網(wǎng)絡(luò)負(fù)責(zé)給這個(gè)動(dòng)作估值。兩個(gè)網(wǎng)絡(luò)各管一段過估計(jì)明顯緩解。很多人直接把DQN代碼搬過來換成自己的環(huán)境結(jié)果訓(xùn)練曲線一直抖大概率就是沒做這一步拆解。3.2 MATLAB中的網(wǎng)絡(luò)搭建與目標(biāo)網(wǎng)絡(luò)同步網(wǎng)絡(luò)結(jié)構(gòu)不需要太深基坑開挖的狀態(tài)維度不高兩層全連接加ReLU足夠。隱藏層寬度取128如果分區(qū)多、狀態(tài)維度高再考慮加寬到256不要一開始就上三層以上的深度網(wǎng)絡(luò)深度增加對(duì)RL訓(xùn)練穩(wěn)定性是負(fù)貢獻(xiàn)。% 狀態(tài)維度6分區(qū)每區(qū)2個(gè)進(jìn)度量加3個(gè)全局響應(yīng)量 numRegions 6; stateDim numRegions * 2 3; numActions numRegions; net [ featureInputLayer(stateDim, Normalization, none) fullyConnectedLayer(128) reluLayer fullyConnectedLayer(128) reluLayer fullyConnectedLayer(numActions) ]; qNetwork dlnetwork(net); targetNetwork qNetwork; % 初始時(shí)目標(biāo)網(wǎng)絡(luò)復(fù)制在線網(wǎng)絡(luò)注意featureInputLayer的歸一化我設(shè)成none原因是在狀態(tài)編碼階段已經(jīng)歸一化過網(wǎng)絡(luò)里不需要再做一次。目標(biāo)網(wǎng)絡(luò)這里采用硬拷貝每隔固定步數(shù)把在線網(wǎng)絡(luò)的參數(shù)整體復(fù)制過去這種簡(jiǎn)單做法在開挖順序這類中小規(guī)模問題上比軟更新更穩(wěn)。3.3 訓(xùn)練主循環(huán)經(jīng)驗(yàn)回放、DDQN目標(biāo)值與梯度更新訓(xùn)練循環(huán)分三段探索與經(jīng)驗(yàn)存儲(chǔ)、小批量采樣與目標(biāo)值計(jì)算、參數(shù)更新。我先把框架寫出來再單獨(dú)解釋模型損失函數(shù)。bufferSize 50000; buffer cell(bufferSize, 5); bufferCount 0; ptr 1; epsilon 1.0; epsilonMin 0.05; epsilonDecay 0.995; gamma 0.95; lr 1e-3; batchSize 64; targetUpdateFreq 300; iter 0; avg1 []; avg2 []; for episode 1:2000 state resetEnv(); % 見2.2返回行向量狀態(tài) done false; while ~done % epsilon-貪心探索還是利用 if rand() epsilon action randi(numActions); else qv predict(qNetwork, dlarray(state, CB)); [~, action] max(qv); end [nextState, reward, done] stepEnv(state, action); bufferCount min(bufferCount 1, bufferSize); buffer(ptr, :) {state, action, reward, nextState, done}; ptr mod(ptr, bufferSize) 1; state nextState; iter iter 1; % 攢夠一批才訓(xùn)練避免早期樣本太稀疏 if bufferCount batchSize idx randperm(bufferCount, batchSize); mb buffer(idx, :); states cat(2, mb{:, 1}); actions cell2mat(mb(:, 2)); rewards cell2mat(mb(:, 3)); nextStates cat(2, mb{:, 4}); dones cell2mat(mb(:, 5)); [loss, grads] dlfeval(modelLoss, qNetwork, targetNetwork, ... states, actions, nextStates, rewards, dones, gamma); [qNetwork, avg1, avg2] adamupdate(qNetwork, grads, avg1, avg2, iter, lr); % 每隔固定步數(shù)同步一次目標(biāo)網(wǎng)絡(luò) if mod(iter, targetUpdateFreq) 0 targetNetwork qNetwork; end end end epsilon max(epsilonMin, epsilon * epsilonDecay); end這里有個(gè)工程細(xì)節(jié)要注意randi(numActions)探索時(shí)可能選到已完成區(qū)域。嚴(yán)格做法是像2.3那樣先從legalActions里采樣這段簡(jiǎn)化代碼只是展示訓(xùn)練框架落地時(shí)一定要把合法動(dòng)作過濾加上否則學(xué)習(xí)過程會(huì)被大量無效動(dòng)作干擾。模型的損失函數(shù)單獨(dú)寫成一個(gè)函數(shù)用dlfeval包住因?yàn)镸ATLAB的自動(dòng)微分要求梯度計(jì)算發(fā)生在可追蹤的環(huán)境中function [loss, grads] modelLoss(qNet, targetNet, states, actions, nextStates, rewards, dones, gamma) states dlarray(states, CB); nextStates dlarray(nextStates, CB); % 在線網(wǎng)絡(luò)預(yù)測(cè)當(dāng)前狀態(tài)所有動(dòng)作的Q值 qAll forward(qNet, states); batchSize size(qAll, 2); qPred qAll(sub2ind(size(qAll), actions, 1:batchSize)); % DDQN關(guān)鍵在線網(wǎng)絡(luò)選下一個(gè)動(dòng)作 qNextAll forward(qNet, nextStates); [~, nextActions] max(qNextAll, [], 1); % 目標(biāo)網(wǎng)絡(luò)給這個(gè)動(dòng)作估值 qTargetAll forward(targetNet, nextStates); qTarget qTargetAll(sub2ind(size(qTargetAll), nextActions, 1:batchSize)); % 目標(biāo)Q值done為真時(shí)不留未來獎(jiǎng)勵(lì) y rewards gamma .* (1 - dones) .* qTarget; loss mean((qPred - y) .^ 2); grads dlgradient(loss, qNet.Learnables); end幾個(gè)參數(shù)說明gamma0.95意味著滯后10步的獎(jiǎng)勵(lì)價(jià)值會(huì)衰減到原來的0.6左右適合開挖步數(shù)在10到20步的短決策序列如果分區(qū)更多、序列更長(zhǎng)再往0.99調(diào)。targetUpdateFreq300是全局步數(shù)不是episode數(shù)這是最容易寫錯(cuò)的地方。還有一個(gè)MATLAB專屬的坑在dlfeval里不能調(diào)用predict要求梯度的前向計(jì)算必須用forward否則會(huì)報(bào)錯(cuò)。提示如果你用強(qiáng)化學(xué)習(xí)工具箱里的rlDQNAgent這些細(xì)節(jié)都被封裝掉了調(diào)參數(shù)方便但一旦訓(xùn)練不收斂你連從哪里排查都不知道。自己寫訓(xùn)練循環(huán)雖然多花半天時(shí)間但能讓你清楚每一步在算什么。4. 獎(jiǎng)勵(lì)函數(shù)與三個(gè)關(guān)鍵參數(shù)調(diào)參順序比想象中更敏感基坑開挖順序優(yōu)化的獎(jiǎng)勵(lì)函數(shù)直接決定策略最后長(zhǎng)什么樣。同一個(gè)環(huán)境獎(jiǎng)勵(lì)權(quán)重變一下最優(yōu)順序可能就從“先淺后深”變成“先深后淺”。這一章把獎(jiǎng)勵(lì)設(shè)計(jì)方法和參數(shù)調(diào)整順序講透。4.1 獎(jiǎng)勵(lì)函數(shù)設(shè)計(jì)分階段獎(jiǎng)勵(lì)與稀疏獎(jiǎng)勵(lì)的權(quán)衡很多人第一次寫這個(gè)課題會(huì)在整個(gè)序列結(jié)束時(shí)才給獎(jiǎng)勵(lì)位移達(dá)標(biāo)給正分超限給負(fù)分。這是典型的稀疏獎(jiǎng)勵(lì)對(duì)DDQN來說學(xué)習(xí)效率極低。開挖步數(shù)只有10多步終局獎(jiǎng)勵(lì)要回傳給前面的每一步信號(hào)衰減嚴(yán)重智能體很難判斷哪一步導(dǎo)致了最終超限。常見做法是每一步都給即時(shí)懲罰把巖土響應(yīng)拆成增量r_t -α * Δu / uAllow - β * ΔN / NAllow - γΔu是當(dāng)前步最大側(cè)移增量ΔN是當(dāng)前步支撐軸力增量γ是每步時(shí)間成本。把響應(yīng)增量除以容許值保證每項(xiàng)在0到1量級(jí)α和β才好調(diào)。最后終局再給一次性獎(jiǎng)勵(lì)如果最大位移和軸力都在控制值以內(nèi)加100否則減100。這個(gè)設(shè)計(jì)里最容易被忽略的是α和β的比值。我第一版把α設(shè)成10、β設(shè)成1結(jié)果智能體學(xué)會(huì)了一味避開位移大的分區(qū)支撐軸力項(xiàng)幾乎不起作用。后來改成α和β同量級(jí)甚至讓?duì)律源笠稽c(diǎn)策略才平衡。如果兩個(gè)指標(biāo)重要性不同用比值表達(dá)不要讓數(shù)值范圍替你決定。4.2 三個(gè)關(guān)鍵參數(shù)學(xué)習(xí)率、折扣因子與探索率衰減學(xué)習(xí)率在RL里比在監(jiān)督學(xué)習(xí)里更嬌氣?;迎h(huán)境的狀態(tài)轉(zhuǎn)移沒有分類任務(wù)那么平穩(wěn)梯度方向方差大學(xué)習(xí)率太高Q值會(huì)震蕩。我習(xí)慣從1e-3起步如果loss發(fā)散立即降到3e-4一般都能穩(wěn)住。折扣因子gamma控制的是“遠(yuǎn)期代價(jià)”的權(quán)重。開挖順序這個(gè)任務(wù)有個(gè)特點(diǎn)第1步的選擇會(huì)通過圍護(hù)結(jié)構(gòu)受力路徑影響后面所有步但強(qiáng)化學(xué)習(xí)每一步只獎(jiǎng)勵(lì)當(dāng)前增量。gamma太小智能體只看眼前幾步學(xué)不到全局最優(yōu)gamma太大目標(biāo)值的方差被放大訓(xùn)練不穩(wěn)。10到20步的決策序列0.95是比較舒服的中間值分區(qū)超過8個(gè)、序列變長(zhǎng)再考慮0.99但目標(biāo)網(wǎng)絡(luò)更新頻率要同步降下來否則TD誤差會(huì)累積爆炸。這塊調(diào)參多少有點(diǎn)玄學(xué)但總的方向是先定gamma再動(dòng)學(xué)習(xí)率最后動(dòng)網(wǎng)絡(luò)結(jié)構(gòu)順序反了你會(huì)同時(shí)面對(duì)兩個(gè)變量在打架。探索率epsilon從1.0開始逐漸衰減到0.05。注意不要從0.1開始前期探索不足策略很容易陷進(jìn)“先深后淺”這種局部最優(yōu)。epsilonDecay要按總episode數(shù)反推2000個(gè)episode、衰減系數(shù)0.995最終探索率接近下限如果你把episode數(shù)加到5000衰減系數(shù)要改成0.999否則后半程幾乎沒有探索、只有利用。4.3 一套可復(fù)現(xiàn)的初始參數(shù)配置下面的參數(shù)是我把上述思路落到代碼里的起點(diǎn)適合6分區(qū)、10到15步以內(nèi)的開挖決策問題。按這套起步曲線有問題的可能性最小。參數(shù)推薦起點(diǎn)調(diào)整方向備注學(xué)習(xí)率 lr1e-3loss發(fā)散發(fā)散降3e-4收斂過慢再回1e-3優(yōu)先固定這個(gè)參數(shù)折扣因子 gamma0.95分區(qū)多、序列長(zhǎng)調(diào)0.99序列短調(diào)0.9決定遠(yuǎn)期代價(jià)權(quán)重探索率衰減1.0到0.05decay0.995策略停滯時(shí)把epsilonMin抬到0.1過早收斂容易鎖死在局部最優(yōu)回放緩沖區(qū)5e4條樣本多樣性不夠就增大內(nèi)存受限降到2e4太小訓(xùn)練震蕩明顯目標(biāo)網(wǎng)絡(luò)同步頻率300步Q值發(fā)散調(diào)500策略保守調(diào)100硬拷貝頻率不要過高批大小64不穩(wěn)定調(diào)128訓(xùn)練慢調(diào)32不建議小于32調(diào)參順序比參數(shù)本身更重要。我一般先固定gamma和緩沖區(qū)大小只動(dòng)學(xué)習(xí)率loss穩(wěn)定之后再觀察策略行為如果策略總是同一個(gè)順序去動(dòng)獎(jiǎng)勵(lì)函數(shù)的α、β權(quán)重而不是盲目加訓(xùn)練輪數(shù)。最后才調(diào)整gamma。這套順序幫我省掉大量無效實(shí)驗(yàn)。5. 訓(xùn)練路上的五個(gè)典型翻車現(xiàn)場(chǎng)與排查清單這節(jié)寫幾條血淚經(jīng)驗(yàn)全是踩過之后才明白的。每條都按“現(xiàn)象、原因、解決”展開訓(xùn)練里遇到類似情況可以直接對(duì)照排查。5.1 Loss振蕩不降獎(jiǎng)勵(lì)沒歸一化現(xiàn)象訓(xùn)練前200個(gè)episode還像個(gè)樣子后面loss在0.05到0.5之間來回跳獎(jiǎng)勵(lì)曲線沒有任何上升趨勢(shì)。原因第一版代碼里把位移增量單位mm和軸力增量單位kN直接拼進(jìn)獎(jiǎng)勵(lì)數(shù)值范圍差幾個(gè)數(shù)量級(jí)TD目標(biāo)的尺度本身就在漂移。再疊加1e-3的學(xué)習(xí)率梯度更新方向被大數(shù)值項(xiàng)主導(dǎo)小數(shù)值項(xiàng)完全學(xué)不到。解決把位移增量除以容許位移軸力增量除以支撐承載力保證每一項(xiàng)都在0到1量級(jí)學(xué)習(xí)率降到3e-4。如果還有波動(dòng)給梯度做裁剪對(duì)grads里的每一個(gè)值做閾值截?cái)啾热缦拗圃赱-1, 1]區(qū)間。裁剪之后loss的穩(wěn)定性會(huì)明顯改善。5.2 策略鎖死在“先深后淺”局部最優(yōu)與獎(jiǎng)勵(lì)權(quán)重失衡現(xiàn)象不管怎么初始化環(huán)境智能體永遠(yuǎn)把深區(qū)放在第一、二步后面淺區(qū)隨便排訓(xùn)練到后期也沒有變化。原因這不是算法沒學(xué)會(huì)而是獎(jiǎng)勵(lì)函數(shù)把“深區(qū)后挖”路徑上的懲罰設(shè)得太高。深區(qū)開挖的卸載量大位移增量自然偏大如果α權(quán)重過高智能體找到一個(gè)能規(guī)避高懲罰的路徑就會(huì)死守不再探索其他順序。解決降低α和β之間的差距把絕對(duì)懲罰改成相對(duì)獎(jiǎng)勵(lì)。具體做法是每一步只比較“當(dāng)前響應(yīng)增量”與“相同開挖比例下的歷史平均響應(yīng)增量”的差差為負(fù)說明這一步優(yōu)于平均水平給正獎(jiǎng)勵(lì)。這種相對(duì)化處理能顯著緩解局部收斂策略會(huì)更愿意嘗試非直覺順序。5.3 Q值中段發(fā)散目標(biāo)網(wǎng)絡(luò)更新過頻或γ偏大現(xiàn)象訓(xùn)練到800個(gè)episode附近loss突然從0.08跳成NaN或者1e10Q值越來越大完全不可控。原因DDQN雖然緩解了過估計(jì)但目標(biāo)網(wǎng)絡(luò)更新太頻繁時(shí)在線網(wǎng)絡(luò)剛學(xué)到的波動(dòng)會(huì)很快被復(fù)制到目標(biāo)網(wǎng)絡(luò)TD目標(biāo)里帶上了當(dāng)前網(wǎng)絡(luò)的誤差。另一個(gè)推手是gamma設(shè)成0.99但episode長(zhǎng)度超過20步遠(yuǎn)期獎(jiǎng)勵(lì)的指數(shù)累積被放大最終發(fā)散。解決把目標(biāo)網(wǎng)絡(luò)硬拷貝頻率從100步改成300到500步gamma降到0.93到0.95。改完先檢查Q值量級(jí)正常應(yīng)該在±10以內(nèi)再繼續(xù)訓(xùn)練。如果已經(jīng)發(fā)散到NaN最穩(wěn)的辦法是從checkpoint回退到500個(gè)episode時(shí)的模型再調(diào)參。我給每個(gè)項(xiàng)目都留了checkpoint這就是后悔藥比重新訓(xùn)練便宜太多。5.4 內(nèi)存增長(zhǎng)與訓(xùn)練變慢回放池和臨時(shí)變量的管理現(xiàn)象訓(xùn)練到1000個(gè)episode之后每步耗時(shí)從0.05秒漲到1秒多內(nèi)存占用一路漲到幾十個(gè)GB電腦風(fēng)扇開始狂轉(zhuǎn)。原因經(jīng)驗(yàn)回放buffer用了動(dòng)態(tài)增長(zhǎng)寫法比如buffer(end1,:) {...}MATLAB會(huì)在每步復(fù)制整個(gè)cell數(shù)組幾萬步之后這個(gè)復(fù)制成本非??植?。另一個(gè)嫌疑是dlarray的中間結(jié)果被留在工作區(qū)導(dǎo)致內(nèi)存只增不減。解決提前分配cell(bufferSize, 5)并循環(huán)覆蓋這是標(biāo)準(zhǔn)做法minibatch采樣之后立刻clear臨時(shí)變量把modelLoss寫成獨(dú)立函數(shù)讓臨時(shí)變量在函數(shù)棧上釋放而不是堆積在主腳本里。如果內(nèi)存仍然緊張把buffer從5萬條降到2萬條訓(xùn)練速度會(huì)立刻恢復(fù)正常。5.5 訓(xùn)練收斂但有限元復(fù)核超限代理模型偏差現(xiàn)象訓(xùn)練出來的最優(yōu)順序在簡(jiǎn)化環(huán)境里最大位移40mm但放到ABAQUS復(fù)核變成55mm超過控制值方案不敢用。原因訓(xùn)練階段用的簡(jiǎn)化模型只抓住了響應(yīng)的相對(duì)趨勢(shì)沒抓住深層開挖的坑底隆起和時(shí)空效應(yīng)。這不是RL算法的問題是訓(xùn)練環(huán)境保真度不夠。簡(jiǎn)化模型對(duì)“順序A優(yōu)于順序B”的排序可能正確但對(duì)絕對(duì)位移的預(yù)測(cè)會(huì)整體偏小。解決不要試圖在訓(xùn)練階段做高保真有限元這會(huì)拖垮訓(xùn)練速度。正確做法是先在簡(jiǎn)化模型里收斂策略再用專業(yè)有限元復(fù)核如果復(fù)核超限把獎(jiǎng)勵(lì)函數(shù)里的容許值按仿真偏差打折比如把uAllow設(shè)為設(shè)計(jì)值的0.8倍再重新訓(xùn)練一輪。這樣得到的順序在真實(shí)模型里更穩(wěn)。6. 把訓(xùn)練結(jié)果落成施工方案驗(yàn)證與順序表導(dǎo)出的技巧訓(xùn)練完成只是第一步。我最后習(xí)慣做兩件事把策略導(dǎo)出成一張可打印的開挖順序表再用有限元和敏感性分析做一次交叉驗(yàn)證。6.1 用貪婪策略生成開挖順序決策表評(píng)估模式下探索率為零每一步都選Q值最大的動(dòng)作這樣生成的就是確定性的施工順序% 評(píng)估模式epsilon歸零直接選最大Q state resetEnv(); done false; schedule []; predictedReward []; while ~done qv predict(qNetwork, dlarray(state, CB)); [~, action] max(qv); schedule [schedule; action]; [state, reward, done] stepEnv(state, action); predictedReward [predictedReward; reward]; end for k 1:length(schedule) fprintf(開挖步 %d - 分區(qū) %d\n, k, schedule(k)); end這里有個(gè)驗(yàn)證小技巧在同一初始狀態(tài)下重復(fù)5次貪婪決策看是否生成同一順序。如果每次都不一樣說明策略沒有充分收斂回去加訓(xùn)練輪次不要拿著不穩(wěn)定的輸出寫方案。我還會(huì)做一次敏感性測(cè)試人為把順序里第2步和第3步對(duì)調(diào)壓在簡(jiǎn)化環(huán)境里觀察響應(yīng)增量變化。對(duì)調(diào)后位移猛增說明最優(yōu)順序在“谷底”方案可靠對(duì)調(diào)后變化很小說明順序選擇不敏感現(xiàn)場(chǎng)施工時(shí)可以根據(jù)機(jī)械調(diào)度靈活調(diào)整。6.2 與有限元數(shù)值模擬做交叉驗(yàn)證交叉驗(yàn)證的流程我已經(jīng)固定下來第一步把決策表翻譯成有限元模型的施工階段順序第二步按步激活或鈍化土體單元、添加或拆除支撐第三步提取每一步的圍護(hù)結(jié)構(gòu)側(cè)移、支撐軸力和坑底隆起曲線第四步和訓(xùn)練時(shí)預(yù)測(cè)的響應(yīng)做對(duì)比。如果兩條曲線的最大位移誤差超過15%不要急著去調(diào)RL超參問題幾乎可以肯定出在簡(jiǎn)化環(huán)境上。我會(huì)回源頭修正仿真校準(zhǔn)讓簡(jiǎn)化模型的關(guān)鍵響應(yīng)和有限元在幾個(gè)基準(zhǔn)順序下對(duì)齊再重新訓(xùn)練。這些年跑下來我養(yǎng)成一個(gè)習(xí)慣強(qiáng)化學(xué)習(xí)優(yōu)化出的順序永遠(yuǎn)只當(dāng)候選方案必須經(jīng)過專業(yè)有限元復(fù)核才敢寫進(jìn)方案里。算法在找趨勢(shì)上比人快但基坑的最終判定還是要交給力學(xué)。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取