習(xí):獎勵設(shè)計與Q-Learning入門指南)
1. 從“世界冠軍”這個前綴說起為什么強化學(xué)習(xí)需要“陪練思維”第一次看到“世界冠軍帶你從零實踐強化學(xué)習(xí)”這個標(biāo)題我腦子里蹦出來的不是算法公式而是一個很具體的畫面一個職業(yè)棋手坐在棋盤前旁邊站著一個完全不懂棋的普通人棋手說“你隨便下下完我告訴你哪一步臭”。這個畫面其實就是強化學(xué)習(xí)最樸素的形態(tài)——智能體在環(huán)境里亂動環(huán)境給它反饋它慢慢學(xué)會怎么動才能拿到更多獎勵。很多人學(xué)強化學(xué)習(xí)卡在第一步不是數(shù)學(xué)太難而是沒有建立起“陪練思維”。他們習(xí)慣性地把強化學(xué)習(xí)當(dāng)成監(jiān)督學(xué)習(xí)來學(xué)找數(shù)據(jù)集、標(biāo)標(biāo)簽、訓(xùn)模型、看準(zhǔn)確率。但強化學(xué)習(xí)里根本沒有現(xiàn)成的標(biāo)簽標(biāo)簽是智能體自己“試”出來的。這就好比你想學(xué)游泳看再多教學(xué)視頻都沒用必須下水嗆幾口身體才會告訴你“這個姿勢要沉”?!笆澜绻谲姟边@個前綴之所以有價值是因為它暗示了一種高水平的示范與反饋機制。在強化學(xué)習(xí)里這個“冠軍”可以是人類專家也可以是一個已經(jīng)訓(xùn)練好的強策略還可以是環(huán)境本身設(shè)計的精妙獎勵函數(shù)。從零實踐強化學(xué)習(xí)核心不是背下PPO、DQN的公式而是理解一個智能體如何從完全無知到逐漸開竅的完整鏈路。這篇文章適合誰看如果你已經(jīng)學(xué)過機器學(xué)習(xí)基礎(chǔ)知道什么是損失函數(shù)、梯度下降但一打開強化學(xué)習(xí)教材就被MDP、貝爾曼方程、策略梯度繞暈?zāi)沁@篇就是寫給你的。如果你是完全零基礎(chǔ)也沒關(guān)系我會用大量生活化的類比把概念拆開。整篇內(nèi)容會圍繞“從零搭建一個能跑通的強化學(xué)習(xí)實踐流程”展開不堆公式重點講為什么這么設(shè)計、實際跑起來會遇到什么、怎么判斷自己的智能體是不是在學(xué)。提示強化學(xué)習(xí)的“從零”不是指從零寫代碼而是指從零理解一個智能體如何通過試錯獲得策略。代碼可以抄但試錯過程中的判斷邏輯必須自己建立。2. 強化學(xué)習(xí)的第一道門檻把“獎勵”翻譯成智能體能懂的語言2.1 獎勵不是打分而是智能體唯一的生存信號很多人第一次接觸強化學(xué)習(xí)會下意識地把獎勵理解成“考試分?jǐn)?shù)”——越高越好但具體高多少、什么時候給并不在意。這是一個致命的誤解。在強化學(xué)習(xí)里獎勵是智能體唯一的信息來源它決定了智能體學(xué)什么、怎么學(xué)、學(xué)多快。舉個例子。假設(shè)你要訓(xùn)練一個智能體玩一個簡單的網(wǎng)格游戲從左上角走到右下角每走一步扣1分走到終點加100分。如果你把“每走一步扣1分”改成“每走一步扣0.1分”智能體的行為會完全不同???分時它會拼命找最短路徑甚至冒險穿墻扣0.1分時它可能慢悠悠地繞路因為“磨蹭”的代價變小了。這就是獎勵設(shè)計的威力——你給什么獎勵智能體就變成什么樣子。在實際操作中我習(xí)慣把獎勵設(shè)計分成三層來思考稀疏獎勵只有達(dá)到目標(biāo)才給獎勵。比如迷宮走到出口才加1分。這種設(shè)計最接近真實世界但智能體學(xué)得極慢因為它大部分時間都在“盲走”得不到任何反饋。稠密獎勵每走一步都給反饋。比如離目標(biāo)越近獎勵越高。這種設(shè)計學(xué)得快但容易讓智能體“鉆空子”——它可能發(fā)現(xiàn)原地轉(zhuǎn)圈也能刷分因為轉(zhuǎn)圈時離目標(biāo)的距離在微小波動。分層獎勵把大目標(biāo)拆成小目標(biāo)每個小目標(biāo)給一次獎勵。比如先走到中間點給10分再走到終點給100分。這是實踐中用得最多的折中方案。注意獎勵設(shè)計沒有標(biāo)準(zhǔn)答案但有一個鐵律——獎勵必須能區(qū)分“好行為”和“壞行為”。如果你自己都說不清什么樣的行為該拿高獎勵智能體更不可能學(xué)會。2.2 從零寫一個獎勵函數(shù)的實操步驟假設(shè)我們要做一個最簡單的實踐項目讓一個智能體學(xué)會在一條直線上走到目標(biāo)點。環(huán)境是一條長度為10的線段智能體初始位置在0目標(biāo)位置在10。動作空間是離散的向左走一步、向右走一步、原地不動。第一步定義狀態(tài)。狀態(tài)就是智能體當(dāng)前的位置用一個整數(shù)表示范圍是0到10。第二步定義動作。動作空間是{0, 1, 2}分別代表左、右、停。第三步定義獎勵。這里我試過三種方案實測效果差異很大獎勵方案具體設(shè)計實測結(jié)果方案A到達(dá)目標(biāo)100其他情況0智能體平均需要8000步才能穩(wěn)定到達(dá)前期幾乎不學(xué)方案B每向右走一步1向左走一步-1到達(dá)目標(biāo)100智能體300步內(nèi)就能學(xué)會一直向右走但會“沖過頭”方案C距離目標(biāo)越近獎勵越高公式為-abs(位置-10)智能體200步內(nèi)學(xué)會穩(wěn)定停在目標(biāo)點但偶爾會抖動最后我選了方案C的變體獎勵 -abs(位置-10) 到達(dá)目標(biāo)額外加50。這樣智能體既有稠密的距離反饋又有稀疏的到達(dá)獎勵學(xué)得又快又穩(wěn)。第四步定義終止條件。到達(dá)目標(biāo)位置或者步數(shù)超過200步回合結(jié)束。這個例子雖然簡單但它包含了強化學(xué)習(xí)獎勵設(shè)計的全部核心邏輯稠密反饋引導(dǎo)方向稀疏獎勵確認(rèn)目標(biāo)終止條件控制節(jié)奏。你把這個邏輯套到任何任務(wù)上都不會出大錯。2.3 獎勵縮放一個容易被忽略但影響巨大的細(xì)節(jié)在實際跑代碼時我發(fā)現(xiàn)一個很隱蔽的坑獎勵的絕對數(shù)值會影響學(xué)習(xí)速度。如果你把到達(dá)獎勵設(shè)成10000每步懲罰設(shè)成0.01智能體會變得極度保守因為它害怕任何一步的懲罰哪怕這個懲罰小到可以忽略。反過來如果到達(dá)獎勵只有1每步懲罰是-1智能體又會變得極度冒險因為它覺得“反正走錯一步就扣光了不如賭一把”。我的經(jīng)驗是把單步獎勵控制在[-1, 1]之間把目標(biāo)獎勵控制在[10, 100]之間。這個比例下智能體既能感受到每一步的輕重又不會因為目標(biāo)獎勵太大而忽略過程。如果你用的框架有獎勵裁剪功能可以開啟但要注意裁剪閾值不能太小否則會丟失獎勵的區(qū)分度。3. 環(huán)境搭建為什么我勸你先用現(xiàn)成環(huán)境再自己造輪子3.1 從零手寫環(huán)境的代價與收益很多教程一上來就教你用gym.make(CartPole-v1)然后直接開始訓(xùn)模型。這沒錯但如果你真的想“從零實踐”我建議你至少手寫一次環(huán)境。原因很簡單只有自己寫過環(huán)境你才會真正理解狀態(tài)、動作、獎勵、終止這四個要素是怎么耦合在一起的。我最早學(xué)強化學(xué)習(xí)時直接拿現(xiàn)成環(huán)境跑DQN代碼跑通了曲線也上升了但我完全不知道智能體到底在學(xué)什么。后來我自己寫了一個“猜數(shù)字”環(huán)境智能體每次猜一個0到100的數(shù)環(huán)境告訴它“大了”或“小了”猜中給獎勵。寫完之后我才恍然大悟——原來狀態(tài)可以是一個區(qū)間動作可以是區(qū)間內(nèi)的一個數(shù)獎勵可以是“距離真實值多遠(yuǎn)”的負(fù)數(shù)。手寫環(huán)境的代價是耗時。一個最簡單的環(huán)境從設(shè)計到調(diào)試至少需要半天。但收益是長期的之后你看任何強化學(xué)習(xí)論文都能在腦子里把它的環(huán)境還原出來理解作者為什么這么設(shè)計狀態(tài)和獎勵。3.2 一個最小可運行環(huán)境的代碼骨架下面是我常用的環(huán)境骨架基于Python不依賴任何強化學(xué)習(xí)框架只用numpy。你可以直接復(fù)制過去改import numpy as np class LineEnv: def __init__(self, length10): self.length length self.position 0 self.steps 0 self.max_steps 200 def reset(self): self.position 0 self.steps 0 return self.position def step(self, action): # action: 0左, 1右, 2停 if action 0: self.position max(0, self.position - 1) elif action 1: self.position min(self.length, self.position 1) # action 2 時位置不變 self.steps 1 # 獎勵設(shè)計 reward -abs(self.position - self.length) done False if self.position self.length: reward 50 done True if self.steps self.max_steps: done True return self.position, reward, done, {}這個骨架只有30行但它包含了強化學(xué)習(xí)環(huán)境的全部要素。你可以把LineEnv換成任何任務(wù)把位置換成股票價格把動作換成買/賣/持把獎勵換成收益就是一個交易環(huán)境。環(huán)境是強化學(xué)習(xí)的試驗場試驗場越簡單你越容易看清智能體的行為。3.3 環(huán)境驗證怎么判斷你的環(huán)境沒寫錯寫完環(huán)境后不要急著上算法。先做三件事第一手動跑幾個回合。用隨機策略跑10個回合看看獎勵范圍是否合理。如果隨機策略的獎勵是-1000到-900而最優(yōu)策略的獎勵是100那說明獎勵尺度有問題智能體很難從-1000爬到100。第二檢查狀態(tài)邊界。把智能體放在邊界位置執(zhí)行所有動作看看狀態(tài)是否越界。我踩過的坑是位置在0時向左走代碼里寫了max(0, position-1)但忘了在獎勵里體現(xiàn)“撞墻懲罰”結(jié)果智能體學(xué)會了瘋狂撞墻因為撞墻不扣分還能刷步數(shù)。第三驗證終止條件。確保達(dá)到目標(biāo)或超過步數(shù)時done一定為True。如果done永遠(yuǎn)為False智能體會陷入無限循環(huán)訓(xùn)練永遠(yuǎn)不結(jié)束。提示環(huán)境寫完后用隨機策略跑100個回合記錄平均獎勵和平均步數(shù)。這兩個數(shù)字是你后續(xù)判斷智能體是否在學(xué)的基準(zhǔn)線。如果訓(xùn)練后的智能體還不如隨機策略那一定是哪里出了問題。4. 算法選型從表格法到策略梯度什么時候該換武器4.1 為什么你的第一個算法應(yīng)該是Q-Learning而不是PPO現(xiàn)在網(wǎng)上很多教程一上來就講PPO因為PPO在連續(xù)控制任務(wù)上表現(xiàn)好。但如果你是從零實踐我強烈建議你先用Q-Learning。原因有三個第一Q-Learning是表格法狀態(tài)和動作都是離散的你可以把Q表打印出來看。你能親眼看到每個狀態(tài)-動作對的數(shù)值在訓(xùn)練過程中怎么變化。這種“看得見”的反饋對建立直覺至關(guān)重要。PPO是神經(jīng)網(wǎng)絡(luò)你只能看到損失曲線看不到策略內(nèi)部在發(fā)生什么。第二Q-Learning的更新公式只有一行Q(s,a) Q(s,a) α * (r γ * max(Q(s,a)) - Q(s,a))。這一行包含了強化學(xué)習(xí)的全部核心思想當(dāng)前估計、即時獎勵、未來折扣、學(xué)習(xí)率。你把這行公式手寫十遍比看十篇PPO論文都有用。第三Q-Learning的失敗模式很直觀。如果學(xué)習(xí)率太大Q值會震蕩如果折扣因子太小智能體會短視如果探索率太高智能體會一直亂走。這些失敗模式在PPO里會被神經(jīng)網(wǎng)絡(luò)的非線性掩蓋你很難定位問題。我的建議是用Q-Learning跑通一個離散任務(wù)再用PPO跑通一個連續(xù)任務(wù)。兩個都跑通之后你自然就知道什么時候該用哪個了。4.2 Q-Learning在直線環(huán)境上的完整實現(xiàn)繼續(xù)用上面的LineEnv狀態(tài)是0到10的整數(shù)動作是0到2的整數(shù)。Q表就是一個11x3的矩陣。import numpy as np env LineEnv() q_table np.zeros((11, 3)) alpha 0.1 gamma 0.9 epsilon 0.1 episodes 500 for episode in range(episodes): state env.reset() done False while not done: if np.random.random() epsilon: action np.random.randint(3) else: action np.argmax(q_table[state]) next_state, reward, done, _ env.step(action) # Q-Learning更新 best_next np.max(q_table[next_state]) q_table[state, action] alpha * (reward gamma * best_next - q_table[state, action]) state next_state跑完500個回合后把q_table打印出來你會看到在位置0到9時動作1向右的Q值最高在位置10時動作2停的Q值最高。這就是智能體學(xué)到的策略。這里有幾個參數(shù)需要解釋alpha0.1學(xué)習(xí)率。太大如0.9會導(dǎo)致Q值震蕩太小如0.01會導(dǎo)致學(xué)習(xí)過慢。0.1是一個經(jīng)驗值適合大多數(shù)離散任務(wù)。gamma0.9折扣因子。它決定了智能體有多看重未來獎勵。0.9意味著10步之后的獎勵打0.35折。如果任務(wù)需要長期規(guī)劃可以調(diào)到0.99。epsilon0.1探索率。10%的時間隨機行動90%的時間按Q表行動。這個比例在訓(xùn)練初期可以設(shè)高一點如0.5后期逐漸降低。4.3 從Q-Learning切換到策略梯度的信號Q-Learning很好但它有兩個硬傷狀態(tài)空間不能太大動作空間不能連續(xù)。如果你的狀態(tài)是圖像或者動作是關(guān)節(jié)角度Q表就無能為力了。這時候你需要策略梯度方法比如REINFORCE或PPO。什么時候該切換我的判斷標(biāo)準(zhǔn)是當(dāng)你發(fā)現(xiàn)Q表的維度超過1000x1000時就該考慮神經(jīng)網(wǎng)絡(luò)了。1000x1000的Q表有100萬個條目每個條目需要至少幾十次訪問才能估計準(zhǔn)確這意味著你需要上億步的訓(xùn)練。而神經(jīng)網(wǎng)絡(luò)可以通過泛化用更少的樣本學(xué)到相似的狀態(tài)。從Q-Learning切換到策略梯度最大的思維轉(zhuǎn)變是你不再估計每個動作的價值而是直接學(xué)習(xí)一個策略函數(shù)輸入狀態(tài)輸出動作的概率分布。這個轉(zhuǎn)變類似于從“查字典”變成“學(xué)語法”——字典只能查你見過的詞語法能生成你沒見過的句子。5. 訓(xùn)練過程中的“靈異事件”智能體為什么不學(xué)、學(xué)歪、學(xué)廢5.1 智能體完全不學(xué)獎勵曲線一條直線這是最常見的問題。你跑了1000個回合獎勵曲線紋絲不動和隨機策略一模一樣??赡艿脑蛴形鍌€第一獎勵太稀疏。如果只有到達(dá)目標(biāo)才給獎勵智能體在隨機探索階段幾乎不可能碰到目標(biāo)。解決辦法是加入稠密獎勵或者用課程學(xué)習(xí)——先讓目標(biāo)離得近再逐漸拉遠(yuǎn)。第二探索率太低。如果epsilon0.01智能體99%的時間都在按當(dāng)前Q表行動而Q表初始全是0argmax返回的動作永遠(yuǎn)是第一個動作。解決辦法是把epsilon初始值設(shè)高比如0.5然后慢慢降到0.05。第三學(xué)習(xí)率太大。Q值更新時如果alpha1新估計完全覆蓋舊估計Q值會劇烈震蕩永遠(yuǎn)收斂不了。解決辦法是把alpha降到0.01到0.1之間。第四折扣因子太小。如果gamma0.1智能體只關(guān)心下一步的獎勵而下一步的獎勵通常是0因為還沒到目標(biāo)所以它學(xué)不到任何長期策略。解決辦法是把gamma調(diào)到0.9以上。第五狀態(tài)表示有問題。如果狀態(tài)是連續(xù)的但你直接把它當(dāng)離散的用智能體可能永遠(yuǎn)無法區(qū)分相似狀態(tài)。解決辦法是做狀態(tài)離散化或者改用神經(jīng)網(wǎng)絡(luò)。我踩過最坑的一次是獎勵函數(shù)里寫了reward -abs(position - target)但忘了在到達(dá)目標(biāo)時給正獎勵。結(jié)果智能體學(xué)會了“原地不動”因為原地不動時距離目標(biāo)的距離不變獎勵是穩(wěn)定的負(fù)數(shù)而亂走會讓獎勵波動。智能體是極度風(fēng)險厭惡的它寧愿要穩(wěn)定的-5也不要波動的-3到-10。5.2 智能體學(xué)歪了獎勵很高但行為很蠢這種情況比完全不學(xué)更隱蔽。獎勵曲線在上升但你一看智能體的行為發(fā)現(xiàn)它在“刷分”。比如在直線環(huán)境里智能體發(fā)現(xiàn)“向右走一步再向左走一步”可以無限循環(huán)而每步的獎勵是-abs(position-10)如果它在位置9和10之間來回走獎勵是-1和0交替平均-0.5比一直向右走獎勵從-10到0的初期獎勵高得多。這就是獎勵黑客現(xiàn)象。智能體沒有學(xué)會完成任務(wù)而是學(xué)會了利用獎勵函數(shù)的漏洞。解決辦法有兩個一是重新設(shè)計獎勵讓刷分行為的獎勵低于正常行為二是加入動作懲罰每走一步額外扣一個小分讓刷分變得不劃算。我的經(jīng)驗是獎勵函數(shù)寫完后自己先模擬幾種“作弊策略”看看它們的獎勵是不是比正常策略高。如果是趕緊改獎勵。這個步驟花10分鐘能省你10小時的訓(xùn)練時間。5.3 智能體學(xué)廢了訓(xùn)練后期突然崩潰有時候獎勵曲線先上升然后突然斷崖式下跌再也回不去了。這在策略梯度方法里尤其常見原因是策略更新步長太大導(dǎo)致策略崩潰。神經(jīng)網(wǎng)絡(luò)輸出的動作概率分布突然變得極端比如某個動作的概率從0.3變成0.99智能體失去了探索能力陷入局部最優(yōu)。解決辦法是使用PPO的裁剪機制限制每次策略更新的幅度。PPO的裁剪參數(shù)通常設(shè)0.1到0.2意思是新策略和舊策略的概率比不能超過1.2或低于0.8。這個約束看起來很小但它能防止策略“一步走太大扯到蛋”。另一個原因是學(xué)習(xí)率沒有衰減。訓(xùn)練初期需要大學(xué)習(xí)率快速探索訓(xùn)練后期需要小學(xué)習(xí)率精細(xì)調(diào)整。如果學(xué)習(xí)率一直不變后期就會在最優(yōu)解附近震蕩甚至震蕩出去。解決辦法是加一個學(xué)習(xí)率衰減策略比如每1000步乘以0.99。注意訓(xùn)練崩潰后不要直接重啟訓(xùn)練。先保存崩潰前的模型然后降低學(xué)習(xí)率從崩潰前的檢查點繼續(xù)訓(xùn)練。很多時候稍微調(diào)小學(xué)習(xí)率就能救回來。6. 從“能跑”到“跑得好”我常用的調(diào)參順序與評估方法6.1 調(diào)參不是玄學(xué)而是有優(yōu)先級的排查強化學(xué)習(xí)的超參數(shù)很多但它們的優(yōu)先級差別巨大。我通常按以下順序調(diào)優(yōu)先級參數(shù)作用常用范圍調(diào)整方向1獎勵函數(shù)決定智能體學(xué)什么任務(wù)相關(guān)先確保獎勵能區(qū)分好壞行為2探索率決定智能體探索多少0.05~0.5先高后低逐漸衰減3學(xué)習(xí)率決定更新步長0.0001~0.1先大后小配合衰減4折扣因子決定未來獎勵權(quán)重0.9~0.99長期任務(wù)用大值5網(wǎng)絡(luò)結(jié)構(gòu)決定擬合能力2~4層先小后大過擬合再減這個順序的邏輯是獎勵函數(shù)錯了后面全錯探索率錯了學(xué)不到東西學(xué)習(xí)率錯了學(xué)不穩(wěn)定折扣因子錯了學(xué)不到長期策略網(wǎng)絡(luò)結(jié)構(gòu)錯了最多是擬合能力不足。所以每次調(diào)參從優(yōu)先級高的開始不要一上來就調(diào)網(wǎng)絡(luò)層數(shù)。6.2 評估智能體是否真的學(xué)會了訓(xùn)練獎勵高不代表智能體學(xué)會了。我見過太多案例訓(xùn)練獎勵曲線很漂亮但一測試就原形畢露。評估智能體需要看三個指標(biāo)第一測試獎勵的均值和方差。用訓(xùn)練好的策略跑100個回合計算平均獎勵和標(biāo)準(zhǔn)差。如果均值高但方差也高說明智能體不穩(wěn)定可能在某些初始狀態(tài)下表現(xiàn)很差。第二行為可視化。把智能體的動作序列打印出來或者畫成圖。在直線環(huán)境里如果智能體從位置0出發(fā)一路向右走到10然后停下那就是學(xué)會了。如果它走到8又退回6再走到9又退回7那就是沒學(xué)扎實。第三泛化測試。改變初始狀態(tài)或環(huán)境參數(shù)看看智能體還能不能完成任務(wù)。比如把直線長度從10改成15如果智能體還能走到終點說明它學(xué)到了“向右走”的通用策略而不是死記硬背了“從0走到10”的固定路徑。我習(xí)慣在訓(xùn)練過程中每100個回合做一次評估把評估獎勵和訓(xùn)練獎勵畫在同一張圖上。如果評估獎勵遠(yuǎn)低于訓(xùn)練獎勵說明智能體過擬合了訓(xùn)練環(huán)境需要增加探索或正則化。6.3 一個容易被忽略的細(xì)節(jié)隨機種子的影響強化學(xué)習(xí)對隨機種子極其敏感。同一個算法同一個環(huán)境換個隨機種子結(jié)果可能天差地別。我試過用5個不同的隨機種子跑同一個配置最終獎勵的波動范圍能達(dá)到30%。所以永遠(yuǎn)不要用單次實驗的結(jié)果下結(jié)論。至少跑3到5個隨機種子看平均表現(xiàn)。如果某個配置在5個種子上都穩(wěn)定那才是真的好配置。如果只有1個種子好其他4個都崩那說明這個配置是運氣好不是真的好。在代碼里我通常這樣設(shè)置import random import numpy as np import torch def set_seed(seed): random.seed(seed) np.random.seed(seed) torch.manual_seed(seed) if torch.cuda.is_available(): torch.cuda.manual_seed_all(seed)然后在實驗循環(huán)里用不同的seed跑多次記錄每次的最終獎勵最后取平均和標(biāo)準(zhǔn)差。這個習(xí)慣能幫你避免很多“假陽性”的結(jié)論。7. 從零實踐之后下一步該往哪里走跑通一個最簡單的強化學(xué)習(xí)項目后你可能會覺得“就這”——確實直線環(huán)境太簡單了智能體幾分鐘就學(xué)會了。但這幾分鐘里你經(jīng)歷的是強化學(xué)習(xí)的完整閉環(huán)設(shè)計環(huán)境、定義獎勵、選擇算法、調(diào)參、評估、排錯。這個閉環(huán)跑通了后面換任何任務(wù)都是在這個閉環(huán)上做替換。下一步我建議你嘗試把直線環(huán)境改成二維網(wǎng)格。狀態(tài)從一維變成二維動作從三個變成四個上下左右獎勵還是距離目標(biāo)越近越高。你會發(fā)現(xiàn)Q表的維度從11x3變成100x4訓(xùn)練時間變長但智能體依然能學(xué)會。這個過程中你會直觀感受到狀態(tài)空間增長對訓(xùn)練效率的影響。再下一步你可以嘗試把Q-Learning換成DQN。DQN用神經(jīng)網(wǎng)絡(luò)代替Q表能處理連續(xù)狀態(tài)。你會遇到新的問題經(jīng)驗回放、目標(biāo)網(wǎng)絡(luò)、梯度爆炸。每一個問題都會逼你去理解新的概念。但因為你已經(jīng)跑通過表格法你知道“理想情況下應(yīng)該發(fā)生什么”所以當(dāng)DQN出問題時你能更快定位。最后如果你對策略梯度感興趣可以試試REINFORCE算法。它比Q-Learning更簡單只有一行更新公式theta alpha * reward * grad_log_prob(action)。但它的方差極大訓(xùn)練極不穩(wěn)定。你會親身體會到“為什么需要基線”和“為什么需要優(yōu)勢函數(shù)”。這些體會比看任何教材都深刻。我個人在實際操作中的體會是強化學(xué)習(xí)最難的不是算法而是判斷“智能體到底在干什么”。算法是死的環(huán)境是活的獎勵是你寫的但智能體的行為往往出乎你的意料。每次訓(xùn)練前先問自己三個問題我的獎勵能區(qū)分好壞行為嗎我的探索率夠高嗎我的評估方法能反映真實能力嗎這三個問題答清楚了訓(xùn)練就成功了一半。