Skip to content

CS234 作業一:有效視野、reward hacking、Bellman residual 與 RiverSwim

2026年9月30日1 分鐘
TL;DRCS234 Winter 2026 的作業一共 68 分、四題:庫存 MDP 看視野與折扣怎麼改變最佳策略(8)、自駕車的 proxy reward 為什麼讓 AI 車乾脆不上匝道(5)、用 Bellman residual 界住貪婪策略的表現(30),以及在 RiverSwim 上親手寫 value iteration 與 policy iteration(25)。三題紙筆在練同一件事:你寫下的 reward、γ 與價值函數,不一定是你以為的那個目標。

🌏 English version

版本說明:本文依據 CS234 Winter 2026 的作業與投影片;公開錄影是 Spring 2024 版。所有事實都在 2026-09-30 打開 作業頁、A1 題目 PDF(7 頁)與 code.zip 核對。存取等級 A3(定義見 全球 AI/CS 課程地圖):題目、LaTeX 範本與起始碼都公開;拿不到的是 Gradescope 自動評分、隱藏測資與官方解答。

系列位置:上一篇 有模型時怎麼規劃:policy evaluation、PI、VI|下一篇 沒模型時怎麼評估:MC、TD(0)、certainty equivalence|系列總覽

上一篇講完已知模型時的規劃:policy evaluation、policy iteration、value iteration,以及 Bellman backup 為什麼是 contraction。作業一把這些東西拆成四題,逼你從兩個方向碰它:一邊用紙筆證明 Bellman operator 的性質,一邊在一個小環境上親手寫出 VI 與 PI。

依 2026 課表,作業一在 Week 1 發下,1 月 16 日下午 6 點(PST)截止,也就是跟 L3「Policy Evaluation」、L4「Q-learning and function approximation」同一週。所以校內學生是一邊學 model-free 方法、一邊交這份 model-based 作業。

本文只講每題在練什麼、需要哪些前一講的工具、做的時候容易卡在哪。不提供任何題目的解答。

繳交方式與配分

作業分三份交到 Gradescope:

  1. 紙筆部分的 PDF(用官方 LaTeX 範本 排版)
  2. 同一份的原始 .tex 檔
  3. 程式部分:在 code/ 目錄跑 make clean 再跑 make submit,產生 assignment1.zip
題目主題配分形式
Q1Effect of Effective Horizon8紙筆,四小題各 2 分
Q2Reward Hacking5紙筆,2+3 分
Q3Bellman Residuals and performance bounds30紙筆證明,(a)–(i) 計分,(j)(k) 是不計分的挑戰題
Q4RiverSwim MDP25程式 20 分+紙筆 5 分

合計 68 分。官網的成績比重分兩套:校內學生作業一佔 7%(另有佔 24% 的必修 tutorials),校外學生沒有 tutorials,作業一佔 15%。

Q1:同一個 MDP,視野一改,最佳策略就變

題目是一家店的庫存管理。狀態是庫存量 s(0 到 10),動作只有 sell 與 buy:

  • 賣:s > 0 時得 +1、庫存減一;s = 0 時什麼都不發生
  • 買:不得獎勵、庫存加一;從 9 買到 10 那一步得 +100
  • s = 10 是終止狀態;每天從 s = 3 開始

題目先給一個 H = 4 的例子:連賣三次拿 +3,第四步不管做什麼都是 0。四個小題接著問:

  • (a) 從 s = 3 出發,有沒有某個有限視野 H 會讓最佳策略又買又賣?
  • (b) 在無限視野、有折扣的設定下,有沒有某個 γ ∈ [0, 1) 讓最佳策略永遠不補滿庫存?只要說明推理,不用給數值。
  • (c) 無限視野+折扣 γ 的版本,跟有限視野 H、不折扣的版本,有沒有可能最佳策略相同?有的話要給一組具體的 γ 與 H。
  • (d) 延續 (c):是不是每一個 H 都找得到對應的 γ?用一兩句話說明。

這題在練的是上一篇的一個結論:reward 與 dynamics 完全一樣,γ 或 H 不同,最佳策略就可能完全不同。+1 是每步都拿得到的小獎勵,+100 要先忍六步沒獎勵才拿得到。你可以把 H 或 γ 看成「代理人願意等多久」,再去想這兩種「等待」的形狀是否一樣。

做 (c)(d) 前,先回去看 L2 投影片 的兩句話:無限視野折扣 MDP 的最佳策略是 stationary(不隨時間步改變);而 finite horizon 任務的最佳策略是否 stationary,投影片的答案是「In general no」。最佳策略能不能跟剩幾步有關,是想「兩種設定能不能一一對應」的起點。

Q2:proxy reward 讓 AI 車乾脆不上匝道

題目直接接著 Q1 的結論:視野與折扣的選擇就可能讓策略偏離人的本意,這種現象叫 reward hacking。例子取自 Pan、Bhatia、Steinhardt 的 ICLR 2022 論文:

  • 真正的目標是讓所有車(人開的與 AI 開的)平均通勤時間最短,但這很難寫成 reward
  • 所以改用容易量的 proxy:最大化所有車的平均速度
  • 場景是一輛 AI 車在匝道口,高速公路上有很多人開的車
  • 在這個 proxy 下,AI 車的最佳策略是停著不併入

(a) 要你解釋為什麼不併入是最佳解(2 分);(b) 要你提出替代的 reward(不是直接最小化通勤時間),它仍然好最佳化,但不會讓 AI 車永遠不併入。這題寫 2 到 5 句、可以用式子,題目明說沒有唯一答案,合理就給滿分(3 分)。

想 (a) 時,把「平均」這個字拆開看:分母裡有誰、AI 車停著時分母與分子各自怎麼變。題目的註腳還補了一句:原論文發現,函數表示比較簡單的系統在這個例子裡反而比較不會 reward hack。這個觀察之後在系列的 價值對齊 一篇會再碰到。

Q3:從 Bellman residual 界住貪婪策略的表現

這是整份作業的重心,30 分,也是整門課前半段最密的一題證明。題目先強調一個區別:

  • V 是任意一個 |S| 維向量,不一定是哪個策略真的做得到的價值。題目舉例:一個只有負獎勵的 2 狀態 MDP,V = [1, 1] 可以當 V,但不可能是任何 V^π。
  • V^π 是某個策略 π 在這個 MDP 裡實際達到的價值。

範數一律是無窮範數 ‖v‖ = max_s |v(s)|。題目給兩個 operator:最佳化的 B(對動作取 max)與固定策略的 B^π,並提醒課堂上已經證過 ‖BV − BV′‖ ≤ γ‖V − V′‖。

小題可以分成三段看。

第一段:B^π 的基本性質(9 分)

小題要證的事分數
(a)B^π 也是 γ-contraction3
(b)B^π 的 fixed point 唯一(可以假設存在;提示用反證法)3
(c)單調性:V ≤ V′ 逐元素成立,則 B^π V ≤ B^π V′3

(a) 可以照著課堂上 B 的證明走一次,而且固定策略版本其實更簡單,因為少了 max。(b)(c) 是後面所有不等式的地基。

第二段:Bellman residual 與表現下界(16 分)

題目定義 Bellman residual 為 BV − V,Bellman error magnitude 為 ‖BV − V‖,並從任意 V 取出貪婪策略 π(s) = argmax_a [r(s,a) + γ Σ p(s′|s,a) V(s′)]。

小題內容分數
(d)什麼樣的 V 會讓 ‖BV − V‖ = 0?為什麼?2
(e)證明 ‖V − V^π‖ ≤ ‖V − B^π V‖ / (1 − γ) 與 ‖V − V*‖ ≤ ‖V − BV‖ / (1 − γ);提示:插入一個零項再用三角不等式5
(f)令 ε = ‖BV − V‖、π 是 V 的貪婪策略,證明 V^π(s) ≥ V*(s) − 2ε/(1 − γ)5
(g)舉一個「有 V^π 的下界會很有用」的真實應用2
(h)另一個 V′ 有相同的 ε,下界相同是否代表兩個貪婪策略的價值在每個狀態都相等?2

(e) 是整題的槓桿,(f) 是它的第一個應用。題目在 (i) 之後附了一段直覺:每步固定拿 r 的折扣總和是 r/(1 − γ),所以這個下界等於是說「貪婪策略平均每步比最佳策略少拿最多 2ε」。換句話說,只要演算法能把 Bellman residual 壓小,你就能保證取出的策略不會太差。

第三段:如果 V 高估了(5 分+挑戰題)

(i) 加一個條件 V* ≤ V(V 在每個狀態都不低於最佳價值),要你證明下界可以收緊成 ε/(1 − γ)。提示是:為什麼對所有 π 都有 V^π ≤ V*?

(j)(k) 不計分。(j) 處理一個實際問題:V* 通常不知道,V* ≤ V 很難檢查;它要你證明只要 BV ≤ V 就足以推出 V* ≤ V,提示是歸納法與 lim B^n V。(k) 要把 (f)(i) 的界再收緊成 2γε/(1 − γ) 與 γε/(1 − γ)。

做 Q3 前先確認手上有哪些工具
  • 上一篇的 value iteration contraction 證明:‖BV − BV′‖ ≤ γ‖V − V′‖ 怎麼從 max 的性質推出來
  • 三角不等式在無窮範數下成立
  • 「逐元素不等式」與「範數不等式」是兩件事:(c)(i)(j) 是前者,(a)(e) 是後者,混用是最常見的失誤來源
  • V^π 是 B^π 的 fixed point,V* 是 B 的 fixed point
  • 貪婪策略的定義本身就說明了 B^π V 與 BV 在這個 π 下的關係

Q4:在 RiverSwim 上寫 VI 與 PI

程式題用 Strehl & Littman(2008) 的 RiverSwim,只需要 Python 3 與 numpy(requirements.txt 只有 numpy 一行)。code.zip 解開是:

檔案用途
riverswim.py環境:RiverSwim(current, seed),get_model() 回傳 reward 表 R 與轉移張量 T
vi_and_pi.py要填的五個函式,__main__ 會在 WEAK 水流、γ = 0.99 下跑 PI 與 VI
Makefile、collect_submission.shmake submit 只把 vi_and_pi.py 打包成 assignment1.zip
requirements.txtnumpy

環境長什麼樣

讀 riverswim.py 可以直接看到環境參數(這是題目設定,不是解答):

  • 6 個狀態、2 個動作:0 是 LEFT、1 是 RIGHT;永遠從最左邊的狀態 0 出發
  • reward 是 R[s, a] 的表:只有兩格非零,最左邊往左是 0.005,最右邊往右是 1
  • 往左一定成功
  • 中間狀態往右:0.6 機率留在原地,0.09 × 水流強度 機率被推回一格,剩下的機率前進一格
  • 水流強度 WEAK、MEDIUM、STRONG 分別對應 1、2、3,所以往右前進的機率依序是 0.31、0.22、0.13

這就是 RiverSwim 的張力:往左是一個幾乎零風險但很小的獎勵,往右要逆流游好幾格,才碰得到大 200 倍的獎勵。

四個小題

小題內容分數
(a)實作 bellman_backup(state, action, R, T, gamma, V):回傳單一 state-action 做一次 Bellman backup 的值4
(b)實作 policy_evaluation、policy_improvement、policy_iteration,回傳最佳價值函數與最佳策略8
(c)實作 value_iteration8
(d)紙筆:在 WEAK 水流下,找出讓「從最左邊出發的最佳代理人不往上游游」的最大 γ(取到小數點後兩位),解釋為什麼合理;再對 MEDIUM、STRONG 重做,從數值與定性兩方面說明最佳價值與 γ 怎麼變5

題目給了一組 sanity check:WEAK 水流、γ = 0.99、容差 0.001 時,最左與最右兩個狀態的價值應該是 30.328 與 36.859,VI 與 PI 的結果都要落在 0.001 之內。評分另外會用隱藏測資。

幾個實作上值得先想清楚的地方:

  • bellman_backup 是後面三個函式共用的積木。它只處理一個 (s, a),不做 max;max 與 argmax 留給呼叫它的地方。
  • policy_evaluation 的簽名帶 tol=1e-3,意思是它要做迭代式評估直到變化小於容差,而不是直接解線性方程。
  • policy_iteration 的 docstring 要求你呼叫前兩個函式;停止條件想一下:策略不再變,還是價值不再變?
  • 起始碼的策略用 np.zeros(num_states, dtype=int) 初始化,也就是一開始全部往左。
  • (d) 的「最大 γ」要用程式掃出來。這一小題其實是 Q1 在更真實環境裡的重演:γ 決定代理人願不願意為了遠方的大獎勵先付出代價。

自學怎麼做

  1. 先確定上一篇的兩個證明你能自己重寫一次:policy improvement 的單調性,與 Bellman backup 的 contraction。Q3 幾乎每一小題都是它們的變形。
  2. Q1、Q2 先做,不用太久,但把答案寫成「因為 H/γ 改變了什麼,所以策略改變了什麼」的句型。這個句型在 Q4 (d) 還會用到。
  3. Q3 照 (a)→(c)、(d)→(f)、(i) 的順序做,每段做完再往下;(j)(k) 留到整份寫完有餘力再挑戰。
  4. Q4 先寫 bellman_backup,用 sanity check 的兩個數字對 VI 與 PI,對得上再去掃 (d) 的 γ。
  5. 沒有 autograder:你能自己驗的只有 sanity check 那兩個數字,以及 VI 與 PI 彼此是否一致。

今晚可以做的一件事:打開 riverswim.py,在紙上畫出 6 個狀態與兩個動作的箭頭,把 WEAK 水流下的每個轉移機率寫上去。畫完之後,你對 Q4 (d) 的答案大概會有一個直覺,再用程式去驗。

延伸閱讀

參考資料