PrefPPO 首次(?)出現在 PEBBLE,作為 pebble 的一個 baseline,是用 PPO 復現 Christiano et al. (2017) 的 PbRL 演算法。
For evaluation, we compare to Christiano et al. (2017), which is the current state-of-the-art approach using the same type of feedback. The primary differences in our method are (1) the introduction of unsupervised pre-training, (2) the accommodation of off-policy RL, and (3) entropy-based sampling. We re-implemented Christiano et al. (2017) using the state-of-the-art on-policy RL algorithm: PPO (Schulman et al., 2017). We use the same reward learning framework and ensemble disagreement-based sampling as they proposed. We refer to this baseline as Preference PPO.
Christiano et al. (2017) 這篇文章的題目是 Deep reinforcement learning from human preferences,發表在 NeurIPS 2017;arxiv:https://arxiv.org/abs/1706.03741 ,GitHub:https://github.com/mrahtz/learning-from-human-preferences(用 TensorFlow 實現的)。
01 論文閱讀:Deep reinforcement learning from human preferences
1.1 intro
intro:
- 大規模應用 RL 的限制是,許多工涉及複雜、定義不明確或難以指定的目標。(舉了一些例子)
- 如果有人類 demo(專家資料),可以 inverse RL 或 behavior cloning,但是很多工難以給出人類 demo,比如控制奇形怪狀的 跟人類很不像的機器人。
- 我們的 PbRL 思路:從 human feedback 中學習 reward model,當作 RL 中的獎勵函式。這可以解決上面的兩個問題,允許 non-expert user 來給 feedback,並且(據論文說)可以節省一個數量級的 feedback 數量。
- human feedback 的形式:讓 human 看兩段 video,指出哪一段更好(即 preference)。
Related Work:
- 列舉了很多從 human 打分或排序中學 RL 的工作。還有一些工作在 RL 之外的 setting 使用 preference。
- Akrour 2012 和 2014 年的工作,貌似也算是 PbRL,但他們的方法是在整個 trajectory 上打 preference,不像我們只需要比較兩個較短的 video segment。
- Akrour 2012:April: Active preference learning-based reinforcement learning. Joint European Conference on Machine Learning and Knowledge Discovery in Databases(好像是 ECML PKDD,不知道是什麼概念)2012。
- Akrour 2014:Programming by feedback. ICML 2014。
- 從 feedback 裡學 reward model 的方法,貌似跟 Wilson et al. (2012)工作比較像。
- Wilson et al. (2012):A Bayesian approach for policy learning from trajectory preference queries. NeurIPS 2012。
1.2 Method
首先介紹了一下 PbRL 的 setting:
- 定義 segment \(\sigma = ((s_0, a_0), ... (s_{k-1}, a_{k-1}))\) ,是長為 k 的軌跡段。
- 定義 preference \(\sigma_0\succ\sigma_1\) 表示軌跡段 σ0 比 σ1 更好。接下來,我們用這些 preference 資料學出 reward model。
然後是 method:(發現這篇文章好像沒給虛擬碼)
- 我們要維護一個 reward model \(\hat r\),和一個 policy \(\pi\) 。
- 大概重複這樣的過程:
- 用目前的 policy \(\pi\) 生成 query \((\sigma_0,\sigma_1)\) ;
- 把 query 給 human 比較得到 preference 資料;
- 用新 preference 資料學 reward model;
- 把 reward model 當作獎勵函式,去學 RL、更新 policy \(\pi\) 。
① 把 reward model 當作獎勵函式,去學 RL、更新 policy \(\pi\) :
- 論文聲稱 \(\hat r\) 可能是非平穩的(因為 reward model 一直在更新),所以他們想用 policy gradient 方法,因為 policy gradient 方法對獎勵函式具有魯棒性。
- 他們用 A2C(advantage actor-critic)做 Atari,用 TRPO 做 MuJoco。調整了 TRPO 的 entropy bonus,MuJoCo 的 swimmer 任務使用 0.001 的 entropy bonus,其他任務使用 0.01 的 entropy bonus。
- 把 reward model 產生的 \(\hat r\) 歸一化到 0 均值 1 標準差。
② 用目前的 policy \(\pi\) 生成 query \((\sigma_0,\sigma_1)\):
- preference 資料的形式是 \((\sigma_0,\sigma_1, p)\),其中 p 是一個 {0,1} 上的分佈。
- 如果 human 能打出 preference,那麼 p = 0 或 1。如果 human 分不出來,則 p 是 01 上的均勻分佈。如果 human 感覺 query 是不可比的,那麼不會使用這個 query 學 reward model。
③ 用新 preference 資料學 reward model:
-
我們使用 Bradley-Terry model 來建模 \(\hat r\) 和 preference 之間的關係:
-
\[\hat P[\sigma_0\succ \sigma_1] = \frac{\exp\sum\hat r(s_t^0,a_t^0)} {\exp\sum\hat r(s_t^0,a_t^0) + \exp\sum\hat r(s_t^1,a_t^1)} ~~. \tag{1} \]
-
然後,我們去最佳化 cross-entropy loss:
-
\[L(\hat r) = -\sum_{(\sigma_0,\sigma_1,p)} \left( p(0)\log \hat P[\sigma_0\succ \sigma_1] + p(1)\hat P[\sigma_1\succ \sigma_0]\right) \tag{2} \]
-
(以上流程已經變成經典的 PbRL 做法)
-
他們還加了三個小 trick:
- 對 reward model 進行 ensemble,學 n 個獨立的 reward model,用它們每個人單獨歸一化後的值 取平均 作為 \(\hat r\) 的值。
- 把一部分 preference 資料拿出來做驗證集,以調整神秘的 L2 正則化的權重引數,並新增神秘 dropout,以避免 reward model 過擬合(?)
- label smoothing(?)貌似是當 human 打出 p = 0 的時候,認為 p = 0 的機率是 0.95,p = 1 的機率是 0.05。
query selection:
- 即,我們現在有很多 trajectory,要從裡面截出 segment、組成 segment pair,作為 query 送給人去比較。應該如何選取 segment pair 作為 query?
- 這裡使用了基於 disagreement 的 query selection,貌似是讓每個 reward model 給出 \(\hat P[\sigma_0\succ \sigma_1]\) 的值,計算這些值的方差,然後選一個方差最大的 query。
1.3 實驗結果
演算法是在 TensorFlow 中寫的。Github:https://github.com/mrahtz/learning-from-human-preferences(貌似不是官方程式碼…)
- preference 一些是人類打的,另一些是 scripted teacher 打的。
- Appendix B 中有讓人類打 preference 的一些 prompt,感覺很有趣。
- scripted teacher:上面公式 (1) 中用任務的真 reward 替換 \(\hat r\),反向生成 preference。
- MuJoCo 實驗中,分別使用真 reward、1400 700 350 個 scripted teacher queries、和 750 個 human queries。
- (個人理解,這裡的 750 human queries 包含的 label 少於 750 個,因為人類認為不可比的 query 應該會直接扔掉)
- MuJoCo 實驗中,很多 task 都做了 1e7 步,相比 pebble 來說學的很慢;pebble 1e6 步就能學出來。
- Atari 實驗中,分別使用真 reward、10k 5.6k 3.3k 個 scripted teacher queries、和 5.5k 個 human queries。(好多 human label…… 這要打好久好久;如此充足的實驗,真是 solid work 呀)
- 這些實驗沒有得出 human label 比 scripted teacher 好用的結論,論文說,可能是因為 human 犯錯、不同 human 的打標籤準則不一樣等原因。
- 一些 Appendix A 裡的實驗細節:
- 有些環境會提前結束 episode,比如當 agent 倒下、死亡或到達目的地(?)他們聲稱這種 done 訊號可能會提供 task 資訊,因此魔改了環境,規避掉了 episode 長度可變的情況(?)使得 agent 死亡時得到一個大懲罰,或者 agent 到達目的地的時候直接 reset env 而不 done(?)
- 在 MuJoCo 中,在實驗開始前直接用隨機 policy 打 25% 的 queries,然後以一個隨時間遞減的 rate 來打 preference;segment length = 15 - 60,取決於具體 task。
- 在 Atari 中,reward model 和 policy 的輸入是一樣的,都是一個處理影像的卷積網路(無端聯想,聽說 DPO 的主要貢獻是可以省掉 LLM RLHF 的 reward model,因為 reward model 應該跟 policy 一樣大,所以省掉它可以節約很多視訊記憶體)。
- Atari 其實跑的是 A3C,在實驗開始前打 500 個 query,segment length = 25。
- 3.2 節還在 MuJoCo 裡學習了 hopper 後空翻的 novel behavior,據文章說,可以保證後空翻後 hopper 腳著地。使用 900 個 human query 學習的。3.2 節還有其他的 novel behavior。
- 3.3 節做了非常充分的 ablation study。發現 segment 長度 = 1 貌似會效能變差,reward model 不加正則化影響不大,把 query selection 改成隨機好像也影響不大,以及,最好邊更新 policy 邊拿最新軌跡打 preference。
02 PEBBLE 中的 PrefPPO 實現
PEBBLE 中的 PrefPPO 實現,直接魔改了 stable_baselines3 的 PPO 模型;他們寫了一個叫做 PPO_REWARD 的新類,把所有跟 reward model 的互動都封裝到 model.learn() 函式里了。
2.1 reward model 如何構建
跟 pebble 的 reward model 一樣。
如果 state 和 action 都是了連續的(比如普通的 cheetah walker),那麼就把 state 和 action concat 起來,作為 reward model 的輸入。
如果 state 是影像,action 是離散的(比如 Christiano 2017 論文中的 Pong 環境),那麼(按照 Christiano 2017 復現程式碼),…… 好像直接拿 state 影像來算 reward 了,沒有 concat 一個 one-hot action 或者數值 action。
2.2 PPO_REWARD 的 model.learn()
PPO 的大概流程:收集 rollout → 計算 rollout 的 advantage 之類 → 計算 loss 並 backward → 收集新 rollout…
在收集 rollout 的過程中,PrefPPO 把要收集的真實 task reward 替換成了 \(\hat r\) ,並把 rollout 資料都新增到 query 的備選中。
在收集 rollout 前後,貌似都有呼叫 learn_reward() 函式來訓練 reward model,這個函式首先收集 query,然後拿收集的 query 學習 reward model。跟 pebble 基本一樣。